diff --git a/apps/docs/package.json b/apps/docs/package.json index c7a5705c1..05ae171e7 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -36,10 +36,10 @@ "@testing-library/react": "^16.1.0", "@types/react": "^19.1.11", "@types/react-dom": "^19.1.6", - "@vitest/coverage-v8": "^3.2.4", + "@vitest/coverage-v8": "catalog:", "jsdom": "^26.1.0", - "typescript": "~5.6.2", - "vitest": "^3.2.4" + "typescript": "^5.8.3", + "vitest": "catalog:" }, "browserslist": { "production": [ diff --git a/apps/ui-sharethrift/package.json b/apps/ui-sharethrift/package.json index a2f77dae6..f91951742 100644 --- a/apps/ui-sharethrift/package.json +++ b/apps/ui-sharethrift/package.json @@ -12,7 +12,7 @@ "storybook": "storybook dev -p 6006", "build-storybook": "storybook build", "test": "vitest run", - "test:coverage": "vitest run --coverage", + "test:coverage:ui": "vitest run --coverage", "test:watch": "vitest" }, "dependencies": { @@ -47,8 +47,7 @@ "@types/react": "^19.1.9", "@types/react-dom": "^19.1.7", "@vitejs/plugin-react": "^4.7.0", - "@vitest/browser": "3.2.4", - "@vitest/coverage-v8": "^3.2.4", + "@vitest/coverage-v8": "catalog:", "eslint": "^9.30.1", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.20", @@ -56,8 +55,8 @@ "storybook": "catalog:", "typescript": "~5.8.3", "typescript-eslint": "^8.35.1", - "vite": "^7.1.2", - "vitest": "^3.2.4" + "vite": "catalog:", + "vitest": "catalog:" }, "license": "MIT" } diff --git a/apps/ui-sharethrift/src/App.container.stories.tsx b/apps/ui-sharethrift/src/App.container.stories.tsx index 4c2dace79..673da5413 100644 --- a/apps/ui-sharethrift/src/App.container.stories.tsx +++ b/apps/ui-sharethrift/src/App.container.stories.tsx @@ -45,7 +45,7 @@ const mockAuthenticatedNotCompletedOnboarding = { }, result: { data: { - currentUser: { + currentUserAndCreateIfNotExists: { __typename: 'PersonalUser' as const, id: 'user-456', userType: 'personal-user', diff --git a/apps/ui-sharethrift/src/components/layouts/home/account/profile/stories/ProfilePage.stories.tsx b/apps/ui-sharethrift/src/components/layouts/home/account/profile/stories/ProfilePage.stories.tsx index c3dc00e4c..769fddddb 100644 --- a/apps/ui-sharethrift/src/components/layouts/home/account/profile/stories/ProfilePage.stories.tsx +++ b/apps/ui-sharethrift/src/components/layouts/home/account/profile/stories/ProfilePage.stories.tsx @@ -7,6 +7,7 @@ import { import { HomeAccountProfileViewContainerCurrentUserDocument, HomeAccountProfileViewContainerUserListingsDocument, + UseUserIsAdminDocument, type ItemListing, type PersonalUser, } from '../../../../../../generated.tsx'; @@ -86,6 +87,19 @@ const mockTwoListings: ItemListing[] = [ }, ]; +const userIsAdminMockRequest = (userId: string) => { + return { + request: { + query: UseUserIsAdminDocument, + }, + result: { + data: { + currentUser: {id: userId, userIsAdmin: false }, + }, + }, + }; +}; + const meta: Meta = { title: 'Pages/Account/Profile', component: HomeRoutes, @@ -113,7 +127,7 @@ export const DefaultView: Story = { }, result: { data: { - currentPersonalUserAndCreateIfNotExists: mockUserSarah, + currentUser: mockUserSarah, }, }, }, @@ -121,13 +135,20 @@ export const DefaultView: Story = { { request: { query: HomeAccountProfileViewContainerUserListingsDocument, + variables: { page: 1, pageSize: 100 }, }, result: { data: { - itemListings: mockTwoListings, + myListingsAll: { + items: mockTwoListings, + total: 2, + page: 1, + pageSize: 100, + }, }, }, }, + userIsAdminMockRequest(mockUserSarah.id), ], }, }, @@ -143,20 +164,22 @@ export const NoListings: Story = { }, result: { data: { - currentPersonalUserAndCreateIfNotExists: mockUserAlex, + currentUser: mockUserAlex, }, }, }, { request: { query: HomeAccountProfileViewContainerUserListingsDocument, + variables: { page: 1, pageSize: 100 }, }, result: { data: { - itemListings: [], + myListingsAll: { items: [], total: 0, page: 1, pageSize: 100 }, }, }, }, + userIsAdminMockRequest(mockUserAlex.id), ], }, }, diff --git a/build-pipeline/core/monorepo-build-stage.yml b/build-pipeline/core/monorepo-build-stage.yml index 9524da048..f7f181454 100644 --- a/build-pipeline/core/monorepo-build-stage.yml +++ b/build-pipeline/core/monorepo-build-stage.yml @@ -224,6 +224,7 @@ stages: targetType: 'inline' script: | set -euo pipefail + echo "Open file limit (ulimit -n): $(ulimit -n)" export NODE_OPTIONS=--max_old_space_size=16384 export PLAYWRIGHT_BROWSERS_PATH="$(PLAYWRIGHT_BROWSERS_PATH)" @@ -238,10 +239,15 @@ stages: pnpm audit --audit-level=high --prod # Use Turbo's built-in --affected flag for accurate change detection + # Split coverage collection: Node tests first, then Storybook tests separately + # to reduce race conditions and memory pressure in CI if [ "$(Build.Reason)" = "PullRequest" ] || [ "$(Build.SourceBranch)" != "refs/heads/main" ]; then echo "Testing affected packages only (PR/branch build)..." export TURBO_SCM_BASE="origin/$(System.PullRequest.TargetBranch)" - pnpm run test:coverage --affected + echo "Running Node unit tests with coverage..." + pnpm run test:coverage:node --affected + echo "Running Storybook/Playwright tests with coverage..." + pnpm run test:coverage:ui --affected pnpm run merge-lcov-reports else echo "Testing all packages (main branch build)..." diff --git a/package.json b/package.json index 7a792219e..a730e69c7 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,9 @@ "start-emulator:payment-server": "pnpm run start --workspace=@cellix/mock-payment-server", "start-emulator:messaging-server": "pnpm run start --workspace=@sthrift/mock-messaging-server", "test:all": "turbo run test:all", - "test:coverage": "turbo run test:coverage", + "test:coverage": "turbo run test:coverage:ui && turbo run test:coverage:node", + "test:coverage:node": "turbo run test:coverage:node", + "test:coverage:ui": "turbo run test:coverage:ui", "test:coverage:merge": "pnpm run test:coverage && pnpm run merge-lcov-reports", "merge-lcov-reports": "node build-pipeline/scripts/merge-coverage.js", "test:integration": "turbo run test:integration", @@ -56,7 +58,7 @@ } }, "devDependencies": { - "@amiceli/vitest-cucumber": "^5.1.2", + "@amiceli/vitest-cucumber": "^6.1.0", "@biomejs/biome": "2.0.0", "@graphql-codegen/cli": "^5.0.7", "@graphql-codegen/introspection": "^4.0.3", @@ -68,7 +70,8 @@ "@playwright/test": "^1.55.1", "@sonar/scan": "^4.3.0", "@types/node": "^24.7.2", - "@vitest/coverage-v8": "^3.2.4", + "@vitest/browser-playwright": "catalog:", + "@vitest/coverage-v8": "catalog:", "azurite": "^3.35.0", "concurrently": "^9.1.2", "cpx2": "^3.0.2", @@ -79,7 +82,7 @@ "tsx": "^4.20.3", "turbo": "^2.5.8", "typescript": "^5.8.3", - "vite": "^7.0.4", - "vitest": "^3.2.4" + "vite": "catalog:", + "vitest": "catalog:" } } \ No newline at end of file diff --git a/packages/cellix/domain-seedwork/package.json b/packages/cellix/domain-seedwork/package.json index 8c685280b..7f257d221 100644 --- a/packages/cellix/domain-seedwork/package.json +++ b/packages/cellix/domain-seedwork/package.json @@ -17,7 +17,7 @@ "build": "tsc --build", "watch": "tsc --watch", "test": "vitest run", - "test:coverage": "vitest run --coverage", + "test:coverage:node": "vitest run --coverage", "test:watch": "vitest", "lint": "biome lint", "clean": "rimraf dist" diff --git a/packages/cellix/domain-seedwork/src/domain-seedwork/handle-event.test.ts b/packages/cellix/domain-seedwork/src/domain-seedwork/handle-event.test.ts index c36f3b590..b6b6728fd 100644 --- a/packages/cellix/domain-seedwork/src/domain-seedwork/handle-event.test.ts +++ b/packages/cellix/domain-seedwork/src/domain-seedwork/handle-event.test.ts @@ -15,7 +15,7 @@ const feature = await loadFeature( class TestEvent extends DomainEventBase {} test.for(feature, ({ Scenario }) => { - let handlerFn: ReturnType; + let handlerFn: (event: TestEvent) => void; let handler: HandleEventImpl; let event: TestEvent; @@ -40,7 +40,7 @@ test.for(feature, ({ Scenario }) => { event = new TestEvent('agg-2'); }); When('I register the function using the static register method', () => { - handler = HandleEventImpl.register(handlerFn) as HandleEventImpl; + handler = HandleEventImpl.register(handlerFn as (event: TestEvent) => void) as HandleEventImpl; }); Then('I should get a handler that calls the function when handling an event', () => { handler.handle(event); @@ -59,8 +59,8 @@ test.for(feature, ({ Scenario }) => { Given('multiple handlers for a domain event', () => { handlerFn1 = vi.fn(); handlerFn2 = vi.fn(); - handler1 = new HandleEventImpl(handlerFn1); - handler2 = new HandleEventImpl(handlerFn2); + handler1 = new HandleEventImpl(handlerFn1 as (event: TestEvent) => void); + handler2 = new HandleEventImpl(handlerFn2 as (event: TestEvent) => void); event = new TestEvent('agg-3'); }); When('I register them all using registerAll', () => { diff --git a/packages/cellix/event-bus-seedwork-node/package.json b/packages/cellix/event-bus-seedwork-node/package.json index 009235196..9ab7319ed 100644 --- a/packages/cellix/event-bus-seedwork-node/package.json +++ b/packages/cellix/event-bus-seedwork-node/package.json @@ -17,7 +17,7 @@ "build": "tsc --build", "watch": "tsc --watch", "test": "vitest run", - "test:coverage": "vitest run --coverage", + "test:coverage:node": "vitest run --coverage", "test:watch": "vitest", "lint": "biome lint", "clean": "rimraf dist" diff --git a/packages/cellix/event-bus-seedwork-node/src/in-proc-event-bus.test.ts b/packages/cellix/event-bus-seedwork-node/src/in-proc-event-bus.test.ts index 88ad226a3..27898b298 100644 --- a/packages/cellix/event-bus-seedwork-node/src/in-proc-event-bus.test.ts +++ b/packages/cellix/event-bus-seedwork-node/src/in-proc-event-bus.test.ts @@ -18,11 +18,11 @@ class TestEventA extends DomainSeedwork.CustomDomainEventImpl<{ testA: string }> class TestEventB extends DomainSeedwork.CustomDomainEventImpl<{ testB: string }> {} test.for(feature, ({ Scenario, BeforeEachScenario }) => { - let handler: ReturnType; - let handler1: ReturnType; - let handler2: ReturnType; - let handlerA: ReturnType; - let handlerB: ReturnType; + let handler: (payload: { test: string }) => Promise; + let handler1: (payload: { test: string }) => Promise; + let handler2: (payload: { test: string }) => Promise; + let handlerA: (payload: { testA: string }) => Promise; + let handlerB: (payload: { testB: string }) => Promise; let error: unknown; // Reset the singleton's subscribers for isolation before each scenario diff --git a/packages/cellix/event-bus-seedwork-node/src/node-event-bus.test.ts b/packages/cellix/event-bus-seedwork-node/src/node-event-bus.test.ts index fd981ac0c..865299751 100644 --- a/packages/cellix/event-bus-seedwork-node/src/node-event-bus.test.ts +++ b/packages/cellix/event-bus-seedwork-node/src/node-event-bus.test.ts @@ -50,11 +50,11 @@ class EventA extends DomainSeedwork.CustomDomainEventImpl<{ a: string }> {} class EventB extends DomainSeedwork.CustomDomainEventImpl<{ b: string }> {} test.for(feature, ({ Scenario, Background, BeforeEachScenario }) => { - let handler: ReturnType; - let handler1: ReturnType; - let handler2: ReturnType; - let handlerA: ReturnType; - let handlerB: ReturnType; + let handler: (payload: { test: string }) => Promise; + let handler1: (payload: { test: string }) => Promise; + let handler2: (payload: { test: string }) => Promise; + let handlerA: (payload: { a: string }) => Promise; + let handlerB: (payload: { b: string }) => Promise; BeforeEachScenario(() => { handler = vi.fn().mockResolvedValue(undefined); @@ -135,8 +135,8 @@ test.for(feature, ({ Scenario, Background, BeforeEachScenario }) => { // handlerA, handlerB, EventA, EventB are already defined }); When('each handler is registered for a different event', () => { - NodeEventBusInstance.register(EventA, handlerA); - NodeEventBusInstance.register(EventB, handlerB); + NodeEventBusInstance.register(EventA, handlerA as (payload: { a: string }) => Promise); + NodeEventBusInstance.register(EventB, handlerB as (payload: { b: string }) => Promise); }); And('each event is dispatched', async () => { await NodeEventBusInstance.dispatch(EventA, { a: 'A' }); @@ -287,8 +287,14 @@ test.for(feature, ({ Scenario, Background, BeforeEachScenario }) => { let callOrder: string[]; Given('multiple handlers for the same event class', () => { callOrder = []; - handler1 = vi.fn(() => callOrder.push('handler1')); - handler2 = vi.fn(() => callOrder.push('handler2')); + handler1 = vi.fn(() => { + callOrder.push('handler1'); + return Promise.resolve(); + }); + handler2 = vi.fn(() => { + callOrder.push('handler2'); + return Promise.resolve(); + }); }); When('all handlers are registered', () => { NodeEventBusInstance.register(TestEvent, handler1); @@ -341,7 +347,7 @@ test.for(feature, ({ Scenario, Background, BeforeEachScenario }) => { Scenario('Dispatch does not wait for handler completion', ({ Given, When, And, Then }) => { let handlerStarted = false; let handlerCompleted = false; - let asyncHandler: ReturnType; + let asyncHandler: (payload: { test: string }) => Promise; Given('a handler for an event that is asynchronous', () => { asyncHandler = vi.fn(async () => { handlerStarted = true; diff --git a/packages/cellix/mongoose-seedwork/package.json b/packages/cellix/mongoose-seedwork/package.json index d1440783f..597f448e4 100644 --- a/packages/cellix/mongoose-seedwork/package.json +++ b/packages/cellix/mongoose-seedwork/package.json @@ -17,7 +17,7 @@ "build": "tsc --build", "watch": "tsc --watch", "test": "vitest run", - "test:coverage": "vitest run --coverage", + "test:coverage:node": "vitest run --coverage", "test:integration": "vitest run integration.test.ts", "test:unit": "vitest run --exclude tests/integration/**/*.test.ts", "test:watch": "vitest", diff --git a/packages/cellix/mongoose-seedwork/src/mongoose-seedwork/mongo-unit-of-work.test.ts b/packages/cellix/mongoose-seedwork/src/mongoose-seedwork/mongo-unit-of-work.test.ts index def317660..6250a49f6 100644 --- a/packages/cellix/mongoose-seedwork/src/mongoose-seedwork/mongo-unit-of-work.test.ts +++ b/packages/cellix/mongoose-seedwork/src/mongoose-seedwork/mongo-unit-of-work.test.ts @@ -1,13 +1,13 @@ -import { describeFeature, loadFeature } from '@amiceli/vitest-cucumber'; -import { expect, vi, type Mock} from 'vitest'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; +import { describeFeature, loadFeature } from '@amiceli/vitest-cucumber'; +import { DomainSeedwork } from '@cellix/domain-seedwork'; import type { ClientSession, Model } from 'mongoose'; import mongoose from 'mongoose'; -import { DomainSeedwork } from '@cellix/domain-seedwork'; +import { expect, vi, type Mock } from 'vitest'; import type { Base } from './index.ts'; -import { MongoUnitOfWork } from './mongo-unit-of-work.ts'; import { MongoRepositoryBase } from './mongo-repository.ts'; +import { MongoUnitOfWork } from './mongo-unit-of-work.ts'; const test = { for: describeFeature }; @@ -17,7 +17,6 @@ const feature = await loadFeature( ); class AggregateRootMock extends DomainSeedwork.AggregateRoot { - override getIntegrationEvents = vi.fn(() => []); get foo(): string { return this.props.foo; } set foo(foo: string) { this.props.foo = foo; } get createdAt(): Date { return this.props.createdAt; } @@ -29,9 +28,7 @@ type PropType = DomainSeedwork.DomainEntityProps & { readonly updatedAt: Date; readonly schemaVersion: string; }; -class RepoMock extends MongoRepositoryBase { - override getIntegrationEvents = vi.fn(() => []); -} +class RepoMock extends MongoRepositoryBase {} class TestEvent extends DomainSeedwork.CustomDomainEventImpl<{ foo: string }> {} @@ -47,18 +44,28 @@ vi.mock('mongoose', async () => { test.for(feature, ({ Scenario, BeforeEachScenario }) => { let unitOfWork: MongoUnitOfWork; - let repoInstance: RepoMock; let eventBus: DomainSeedwork.EventBus; let integrationEventBus: DomainSeedwork.EventBus; - let session: ClientSession; let mockModel: Model; let typeConverter: DomainSeedwork.TypeConverter; + const Passport = {}; - const mockRepoClass = vi.fn((_passport, _model, _typeConverter, _bus, _session): RepoMock => repoInstance); - let domainOperation: ReturnType; + + const makeDomainOperation = (options?: { + events?: Array<{ ctor: typeof TestEvent; payload: { foo: string } }>; + }): Mock<(repo: RepoMock) => Promise> => + vi.fn(async (repo: RepoMock) => { + const aggregate = await repo.get('agg-1'); + aggregate.foo = 'new-foo'; + + for (const event of options?.events ?? []) { + aggregate.addIntegrationEvent(event.ctor, event.payload); + } + + await repo.save(aggregate); + }); BeforeEachScenario(() => { - session = {} as ClientSession; mockModel = { findById: vi.fn().mockReturnValue({ exec: vi.fn().mockResolvedValue({ @@ -91,28 +98,16 @@ test.for(feature, ({ Scenario, BeforeEachScenario }) => { dispatch: vi.fn(), register: vi.fn(), }) as DomainSeedwork.EventBus; - repoInstance = new RepoMock( - vi.mocked({}), - mockModel, - typeConverter, - eventBus, - session, - ); unitOfWork = new MongoUnitOfWork( eventBus, integrationEventBus, mockModel, typeConverter, - mockRepoClass, + RepoMock, ); - domainOperation = vi.fn(async (repo: RepoMock) => { - const aggregate = await repo.get('agg-1'); - aggregate.foo = 'new-foo'; - await repo.save(aggregate); - }); vi.spyOn(mongoose.connection, 'transaction').mockImplementation( async (cb: (session: ClientSession) => Promise) => { - await cb({} as ClientSession); + return await cb({} as ClientSession); }, ); }); @@ -129,27 +124,30 @@ test.for(feature, ({ Scenario, BeforeEachScenario }) => { expect(unitOfWork.typeConverter).toBe(typeConverter); expect(unitOfWork.bus).toBe(eventBus); expect(unitOfWork.integrationEventBus).toBe(integrationEventBus); - expect(unitOfWork.repoClass).toBe(mockRepoClass); + expect(unitOfWork.repoClass).toBe(RepoMock); }); }); Scenario('Domain operation with no events, completes successfully', ({ Given, When, Then }) => { + let domainOperation: Mock<(repo: RepoMock) => Promise>; + Given('a domain operation that emits no domain or integration events', () => { - repoInstance.getIntegrationEvents = vi.fn(() => []); + domainOperation = makeDomainOperation(); }); When('the operation completes successfully', async () => { await unitOfWork.withTransaction(Passport, domainOperation); }); Then('the transaction is committed and no events are dispatched', () => { - expect(domainOperation).toHaveBeenCalledWith(repoInstance); - expect(integrationEventBus.dispatch).not.toHaveBeenCalled(); + const dispatchMock = integrationEventBus.dispatch as Mock; + expect(domainOperation).toHaveBeenCalledWith(expect.any(RepoMock)); + expect(dispatchMock).not.toHaveBeenCalled(); }); }); Scenario('Domain operation with no events, throws error', ({ Given, When, Then }) => { let domainError: Error; + Given('a domain operation that emits no domain or integration events', () => { - repoInstance.getIntegrationEvents = vi.fn(() => []); domainError = new Error('Domain failure'); }); When('the operation throws an error', async () => { @@ -161,82 +159,93 @@ test.for(feature, ({ Scenario, BeforeEachScenario }) => { ).rejects.toThrow(domainError); }); Then('the transaction is rolled back and no events are dispatched', () => { - expect(integrationEventBus.dispatch).not.toHaveBeenCalled(); + const dispatchMock = integrationEventBus.dispatch as Mock; + expect(dispatchMock).not.toHaveBeenCalled(); }); }); Scenario('Domain operation emits integration events, all dispatch succeed', ({ Given, When, Then }) => { let event1: TestEvent; let event2: TestEvent; + let domainOperation: Mock<(repo: RepoMock) => Promise>; Given('integration events are emitted during the domain operation', () => { event1 = new TestEvent('id'); event1.payload = { foo: 'bar1' }; event2 = new TestEvent('id'); event2.payload = { foo: 'bar2' }; - repoInstance.getIntegrationEvents = vi.fn(() => [event1, event2]); + domainOperation = makeDomainOperation({ + events: [ + { ctor: TestEvent, payload: event1.payload }, + { ctor: TestEvent, payload: event2.payload }, + ], + }); }); When('the transaction completes successfully', async () => { - (integrationEventBus.dispatch as Mock) - .mockResolvedValueOnce(undefined) - .mockResolvedValueOnce(undefined); + const dispatchMock = integrationEventBus.dispatch as Mock; + dispatchMock.mockResolvedValueOnce(undefined); + dispatchMock.mockResolvedValueOnce(undefined); await unitOfWork.withTransaction(Passport, domainOperation); }); Then('all integration events are dispatched after the transaction commits', () => { - expect(integrationEventBus.dispatch).toHaveBeenCalledTimes(2); - expect(integrationEventBus.dispatch).toHaveBeenNthCalledWith( - 1, - event1.constructor, - event1.payload, - ); - expect(integrationEventBus.dispatch).toHaveBeenNthCalledWith( - 2, - event2.constructor, - event2.payload, - ); + const dispatchMock = integrationEventBus.dispatch as Mock; + expect(dispatchMock).toHaveBeenCalledTimes(2); + expect(dispatchMock).toHaveBeenNthCalledWith(1, event1.constructor, event1.payload); + expect(dispatchMock).toHaveBeenNthCalledWith(2, event2.constructor, event2.payload); }); }); Scenario('Integration event dispatch fails', ({ Given, When, Then }) => { let event1: TestEvent; let event2: TestEvent; + let domainOperation: Mock<(repo: RepoMock) => Promise>; Given('integration events are emitted during the domain operation', () => { event1 = new TestEvent('id'); event1.payload = { foo: 'bar1' }; event2 = new TestEvent('id'); event2.payload = { foo: 'bar2' }; - repoInstance.getIntegrationEvents = vi.fn(() => [event1, event2]); + domainOperation = makeDomainOperation({ + events: [ + { ctor: TestEvent, payload: event1.payload }, + { ctor: TestEvent, payload: event2.payload }, + ], + }); }); When('integration event dispatch fails', async () => { - (integrationEventBus.dispatch as Mock) - .mockRejectedValueOnce(new Error('fail1')) - .mockResolvedValueOnce(undefined); - await expect( - unitOfWork.withTransaction(Passport, domainOperation), - ).rejects.toThrow('fail1'); + const dispatchMock = integrationEventBus.dispatch as Mock; + dispatchMock.mockRejectedValueOnce(new Error('rejected promise')); + await expect(unitOfWork.withTransaction(Passport, domainOperation)).rejects.toThrow('rejected promise'); }); Then('the error from dispatch is propagated and the transaction is not rolled back by the unit of work', () => { - expect(integrationEventBus.dispatch).toHaveBeenCalledTimes(1); + const dispatchMock = integrationEventBus.dispatch as Mock; + expect(dispatchMock).toHaveBeenCalledTimes(1); }); }); Scenario('Multiple integration events are emitted and all succeed', ({ Given, When, Then }) => { let event1: TestEvent; let event2: TestEvent; + let domainOperation: Mock<(repo: RepoMock) => Promise>; Given('integration events are emitted during the domain operation', () => { event1 = new TestEvent('id'); event1.payload = { foo: 'bar1' }; event2 = new TestEvent('id'); event2.payload = { foo: 'bar2' }; - repoInstance.getIntegrationEvents = vi.fn(() => [event1, event2]); + domainOperation = makeDomainOperation({ + events: [ + { ctor: TestEvent, payload: event1.payload }, + { ctor: TestEvent, payload: event2.payload }, + ], + }); }); When('multiple integration events are emitted and all succeed', async () => { - (integrationEventBus.dispatch as Mock) - .mockResolvedValueOnce(undefined) - .mockResolvedValueOnce(undefined); + const dispatchMock = integrationEventBus.dispatch as Mock; + dispatchMock.mockResolvedValueOnce(undefined); + dispatchMock.mockResolvedValueOnce(undefined); await unitOfWork.withTransaction(Passport, domainOperation); }); Then('all are dispatched after the transaction', () => { - expect(integrationEventBus.dispatch).toHaveBeenCalledTimes(2); + const dispatchMock = integrationEventBus.dispatch as Mock; + expect(dispatchMock).toHaveBeenCalledTimes(2); }); }); }); \ No newline at end of file diff --git a/packages/cellix/mongoose-seedwork/tests/integration/mongo-unit-of-work.integration.test.ts b/packages/cellix/mongoose-seedwork/tests/integration/mongo-unit-of-work.integration.test.ts index 2545cc5c5..984cf5f2c 100644 --- a/packages/cellix/mongoose-seedwork/tests/integration/mongo-unit-of-work.integration.test.ts +++ b/packages/cellix/mongoose-seedwork/tests/integration/mongo-unit-of-work.integration.test.ts @@ -195,6 +195,7 @@ describe('MongoUnitOfWork:Integration', () => { }); beforeEach(async () => { + vi.restoreAllMocks(); await TestModel.deleteMany({}); // biome-ignore lint:useLiteralKeys eventBus['eventSubscribers'] = {}; diff --git a/packages/cellix/test-utils/.gitignore b/packages/cellix/test-utils/.gitignore new file mode 100644 index 000000000..47069c6ec --- /dev/null +++ b/packages/cellix/test-utils/.gitignore @@ -0,0 +1,5 @@ +/dist +/node_modules + +tsconfig.tsbuidinfo +.turbo \ No newline at end of file diff --git a/packages/cellix/test-utils/.prettierrc.json b/packages/cellix/test-utils/.prettierrc.json new file mode 100644 index 000000000..8bbdcf3b2 --- /dev/null +++ b/packages/cellix/test-utils/.prettierrc.json @@ -0,0 +1,7 @@ +{ + "tabWidth": 2, + "useTabs": false, + "jsxSingleQuote": false, + "singleQuote": false, + "printWidth": 150 +} diff --git a/packages/cellix/test-utils/package.json b/packages/cellix/test-utils/package.json new file mode 100644 index 000000000..f68ef562d --- /dev/null +++ b/packages/cellix/test-utils/package.json @@ -0,0 +1,32 @@ +{ + "name": "@cellix/test-utils", + "version": "1.0.0", + "private": true, + "type": "module", + "files": [ + "dist" + ], + "exports": { + ".": { + "types": "./dist/src/index.d.ts", + "default": "./dist/src/index.js" + } + }, + "scripts": { + "prebuild": "biome lint", + "build": "tsc --build", + "watch": "tsc --watch", + "lint": "biome lint", + "clean": "rimraf dist", + "test": "vitest run", + "test:watch": "vitest", + "test:coverage:node": "vitest run --coverage" + }, + "devDependencies": { + "rimraf": "^6.0.1", + "typescript": "^5.8.3", + "@cellix/typescript-config": "workspace:*", + "@cellix/vitest-config": "workspace:*" + }, + "license": "MIT" +} diff --git a/packages/cellix/test-utils/readme.md b/packages/cellix/test-utils/readme.md new file mode 100644 index 000000000..4ec03ecc5 --- /dev/null +++ b/packages/cellix/test-utils/readme.md @@ -0,0 +1 @@ +npm i -D -w test-utils @tsconfig/node20 @tsconfig/node-ts typescript \ No newline at end of file diff --git a/packages/cellix/test-utils/src/features/index.feature b/packages/cellix/test-utils/src/features/index.feature new file mode 100644 index 000000000..9ca398e80 --- /dev/null +++ b/packages/cellix/test-utils/src/features/index.feature @@ -0,0 +1,11 @@ +Feature: makeNewableMock helper + + Scenario: Constructor behaviour + Given an implementation function that constructs `Impl` instances + When makeNewableMock is created from that function + Then the returned function can be used as a constructor and produce an `Impl` instance with expected value + + Scenario: Callable behaviour + Given a function that returns the sum of two numbers + When makeNewableMock is created from that function + Then calling the returned function should proxy the call and return the sum diff --git a/packages/cellix/test-utils/src/index.test.ts b/packages/cellix/test-utils/src/index.test.ts new file mode 100644 index 000000000..dfb16fcd4 --- /dev/null +++ b/packages/cellix/test-utils/src/index.test.ts @@ -0,0 +1,60 @@ +/** biome-ignore-all lint/suspicious/noExplicitAny: */ +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { describeFeature, loadFeature } from '@amiceli/vitest-cucumber'; +import { expect, vi } from 'vitest'; +import { makeNewableMock } from './index.ts'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const feature = await loadFeature(path.resolve(__dirname, 'features/index.feature')); + +describeFeature(feature, ({ Scenario,BeforeEachScenario }) => { + let Impl: any; + let Mock: any; + let fn: any; + let instance: any; + let result: any; + + BeforeEachScenario(() => { + Impl = undefined; + Mock = undefined; + fn = undefined; + instance = undefined; + result = undefined; + }); + + Scenario('Constructor behaviour', ({ Given, When, Then }) => { + Given('an implementation function that constructs `Impl` instances', () => { + function ImplCtor(this: any, value: number) { + this.value = value; + } + Impl = ImplCtor; + }); + + When('makeNewableMock is created from that function', () => { + Mock = makeNewableMock((v: number) => new (Impl as any)(v)); + }); + + Then('the returned function can be used as a constructor and produce an `Impl` instance with expected value', () => { + instance = new (Mock as any)(42); + expect(instance.value).toBe(42); + expect(instance).toBeInstanceOf(Impl); + }); + }); + + Scenario('Callable behaviour', ({ Given, When, Then }) => { + Given('a function that returns the sum of two numbers', () => { + fn = vi.fn((a: number, b: number) => a + b); + }); + + When('makeNewableMock is created from that function', () => { + Mock = makeNewableMock((a: number, b: number) => fn(a, b)); + }); + + Then('calling the returned function should proxy the call and return the sum', () => { + result = (Mock as any)(2, 3); + expect(result).toBe(5); + expect(fn).toHaveBeenCalledWith(2, 3); + }); + }); +}); diff --git a/packages/cellix/test-utils/src/index.ts b/packages/cellix/test-utils/src/index.ts new file mode 100644 index 000000000..898026ff8 --- /dev/null +++ b/packages/cellix/test-utils/src/index.ts @@ -0,0 +1,14 @@ +// Note: Do not use inside vi.mock() calls to avoid hoisting issues. +export function makeNewableMock( + impl: (...args: TArgs) => TResult, +) { + // Use a normal function so it can be used as a constructor with `new`. + // Keep the implementation minimal to match the localized helper used in tests. + // eslint-disable-next-line func-names + const fn = function (this: unknown, ...args: TArgs) { + // @ts-ignore - tests expect the function to return mocked instances + return impl(...(args as TArgs)); + } as unknown as (...args: TArgs) => TResult; + + return fn as unknown as (...args: TArgs) => TResult; +} diff --git a/packages/cellix/test-utils/tsconfig.json b/packages/cellix/test-utils/tsconfig.json new file mode 100644 index 000000000..d979e1092 --- /dev/null +++ b/packages/cellix/test-utils/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@cellix/typescript-config/node.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "." + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/cellix/test-utils/turbo.json b/packages/cellix/test-utils/turbo.json new file mode 100644 index 000000000..a87e1a781 --- /dev/null +++ b/packages/cellix/test-utils/turbo.json @@ -0,0 +1,3 @@ +{ + "extends": ["//"] +} \ No newline at end of file diff --git a/packages/cellix/test-utils/vitest.config.ts b/packages/cellix/test-utils/vitest.config.ts new file mode 100644 index 000000000..35059f3e9 --- /dev/null +++ b/packages/cellix/test-utils/vitest.config.ts @@ -0,0 +1,13 @@ +import { nodeConfig } from '@cellix/vitest-config'; +import { defineConfig, mergeConfig } from 'vitest/config'; + +export default mergeConfig( + nodeConfig, + defineConfig({ + // Add package-specific overrides here if needed + test: { + include: ['src/**/*.test.ts'], + retry: 0, + }, + }), +); diff --git a/packages/cellix/ui-core/package.json b/packages/cellix/ui-core/package.json index edf8dc153..b5fa12e17 100644 --- a/packages/cellix/ui-core/package.json +++ b/packages/cellix/ui-core/package.json @@ -21,7 +21,7 @@ "build": "tsc --build", "watch": "tsc --watch", "test": "vitest run", - "test:coverage": "vitest run --coverage", + "test:coverage:ui": "vitest run --coverage", "test:watch": "vitest", "lint": "biome lint", "clean": "rimraf dist", @@ -46,15 +46,14 @@ "@storybook/react": "^9.1.17", "@storybook/react-vite": "^9.1.17", "@types/react": "^19.1.16", - "@vitest/browser": "^3.2.4", - "@vitest/coverage-v8": "^3.2.4", + "@vitest/coverage-v8": "catalog:", "jsdom": "^26.1.0", "react-oidc-context": "^3.3.0", "react-router-dom": "^7.9.3", "rimraf": "^6.0.1", "storybook": "catalog:", "typescript": "^5.8.3", - "vitest": "^3.2.4" + "vitest": "catalog:" }, "license": "MIT" } diff --git a/packages/cellix/vitest-config/package.json b/packages/cellix/vitest-config/package.json index 7ae765a33..9475be2d3 100644 --- a/packages/cellix/vitest-config/package.json +++ b/packages/cellix/vitest-config/package.json @@ -12,7 +12,8 @@ }, "dependencies": { "@storybook/addon-vitest": "^9.1.17", - "vitest": "^3.2.4" + "@vitest/browser-playwright": "catalog:", + "vitest": "catalog:" }, "devDependencies": { "@cellix/typescript-config": "workspace:*", diff --git a/packages/cellix/vitest-config/src/configs/storybook.config.ts b/packages/cellix/vitest-config/src/configs/storybook.config.ts index b0011b79b..61289dcaa 100644 --- a/packages/cellix/vitest-config/src/configs/storybook.config.ts +++ b/packages/cellix/vitest-config/src/configs/storybook.config.ts @@ -1,72 +1,95 @@ import path from 'node:path'; import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; -import { defineConfig, mergeConfig, type ViteUserConfig } from 'vitest/config'; +import { defineConfig, mergeConfig, configDefaults } from 'vitest/config'; +import type { UserConfig } from 'vite'; import { baseConfig } from './base.config.ts'; +import { playwright } from '@vitest/browser-playwright'; export type StorybookVitestConfigOptions = { - storybookDirRelativeToPackage?: string; // default: '.storybook' - setupFiles?: string[]; // default: ['.storybook/vitest.setup.ts'] - browsers?: { browser: 'chromium' | 'firefox' | 'webkit' }[]; // default: [{ browser: 'chromium' }] - additionalCoverageExclude?: string[]; + storybookDirRelativeToPackage?: string; // default: '.storybook' + setupFiles?: string[]; // default: ['.storybook/vitest.setup.ts'] + browsers?: { browser: 'chromium' | 'firefox' | 'webkit' }[]; // default: [{ browser: 'chromium' }] + additionalCoverageExclude?: string[]; }; -export function createStorybookVitestConfig(pkgDirname: string, opts: StorybookVitestConfigOptions = {}): ViteUserConfig { - const STORYBOOK_DIR = opts.storybookDirRelativeToPackage ?? '.storybook'; - const setupFiles = opts.setupFiles ?? ['.storybook/vitest.setup.ts']; - const instances = opts.browsers ?? [{ browser: 'chromium' }]; - // CI environment is slower, allow retries for flaky browser tests - const isCI = process.env['CI'] === 'true' || process.env['TF_BUILD'] === 'True'; +export function createStorybookVitestConfig( + pkgDirname: string, + opts: StorybookVitestConfigOptions = {}, +): UserConfig { + const STORYBOOK_DIR = opts.storybookDirRelativeToPackage ?? '.storybook'; + const setupFiles = opts.setupFiles ?? ['.storybook/vitest.setup.ts']; + const instances = opts.browsers ?? [{ browser: 'chromium' }]; - const base = mergeConfig(baseConfig, defineConfig({ - test: { - globals: true, - // Retry tests on failure to handle flaky browser tests due to race conditions - // in @storybook/addon-vitest + Playwright browser provider - retry: isCI ? 3 : 1, - testTimeout: isCI ? 30000 : 10000, - // Serialize file execution in CI to avoid "Vitest failed to find the runner" race condition - // when using Storybook + Vitest browser mode with Playwright - // Local development benefits from parallel execution for faster feedback - fileParallelism: !isCI, - projects: [ - { - extends: true, - plugins: [ - storybookTest({ - configDir: path.join(pkgDirname, STORYBOOK_DIR), - }), - ], - test: { - name: 'storybook', - browser: { - enabled: true, - headless: true, - provider: 'playwright', - instances, - }, - setupFiles, - }, - }, - ], - coverage: { - exclude: [ - '**/*.config.ts', - '**/tsconfig.json', - '**/.storybook/**', - '**/*.stories.ts', - '**/*.stories.tsx', - '**/*.test.ts', - '**/*.test.tsx', - '**/generated.ts', - '**/generated.tsx', - '**/coverage/**', - '**/*.d.ts', - 'dist/**', - ...(opts.additionalCoverageExclude ?? []), - ], - }, - }, - })); + // https://learn.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml + const isCI = process.env['TF_BUILD'] === 'True'; - return mergeConfig(base, defineConfig({})); + const storybookConfig = defineConfig({ + // Use export conditions to resolve workspace packages to src/ during testing + resolve: { + conditions: ['vitest', 'development', 'import', 'default'], + }, + // Explicitly tell Vite's file watcher to ignore dist and coverage directories + // This prevents Vite from opening files in these directories during scan/watch + server: { + watch: { + ignored: ['**/dist/**', '**/coverage/**', '**/node_modules/**'], + }, + }, + test: { + // Prevent Vite/Vitest from scanning/transpiling build artifacts and coverage temp files. + // This greatly reduces the number of open files during coverage runs in CI. + exclude: [...configDefaults.exclude, '**/dist/**', '**/coverage/**', '**/coverage/.tmp/**'], + globals: true, + // Retry tests on failure to handle flaky browser tests due to race conditions + // in @storybook/addon-vitest + Playwright browser provider + retry: isCI ? 3 : 1, + testTimeout: isCI ? 30000 : 10000, + // Serialize file execution in CI to avoid "Vitest failed to find the runner" race condition + // when using Storybook + Vitest browser mode with Playwright + // Local development benefits from parallel execution for faster feedback + fileParallelism: !isCI, + projects: [ + { + extends: true, + plugins: [ + storybookTest({ + configDir: path.join(pkgDirname, STORYBOOK_DIR), + }), + ], + test: { + name: 'storybook', + browser: { + enabled: true, + headless: true, + provider: playwright(), + instances, + }, + setupFiles, + }, + }, + ], + coverage: { + exclude: [ + '**/*.config.ts', + '**/tsconfig.json', + '**/.storybook/**', + '**/*.stories.ts', + '**/*.stories.tsx', + '**/*.test.ts', + '**/*.test.tsx', + '**/generated.ts', + '**/generated.tsx', + '**/coverage/**', + '**/*.d.ts', + 'dist/**', + ...(opts.additionalCoverageExclude ?? []), + ], + }, + // Enable watch mode in local dev for faster iteration; disable in CI for stability + watch: !isCI, + isolate: true, + }, + }); + + return mergeConfig(baseConfig, storybookConfig); } diff --git a/packages/cellix/vitest-config/tsconfig.json b/packages/cellix/vitest-config/tsconfig.json index ae2b2f00c..3a9f9b98e 100644 --- a/packages/cellix/vitest-config/tsconfig.json +++ b/packages/cellix/vitest-config/tsconfig.json @@ -2,7 +2,8 @@ "extends": "@cellix/typescript-config/node.json", "compilerOptions": { "outDir": "dist", - "rootDir": "." + "rootDir": ".", + "lib": ["ES2022", "DOM"] }, "include": ["src"], "exclude": ["dist", "node_modules"] diff --git a/packages/sthrift/application-services/package.json b/packages/sthrift/application-services/package.json index afc88da2c..9aa24ebda 100644 --- a/packages/sthrift/application-services/package.json +++ b/packages/sthrift/application-services/package.json @@ -17,7 +17,7 @@ "build": "tsc --build", "watch": "tsc --watch", "test": "vitest run", - "test:coverage": "vitest run --coverage", + "test:coverage:node": "vitest run --coverage", "test:watch": "vitest", "lint": "biome lint", "clean": "rimraf dist" diff --git a/packages/sthrift/domain/package.json b/packages/sthrift/domain/package.json index 5a629be5a..2a6724754 100644 --- a/packages/sthrift/domain/package.json +++ b/packages/sthrift/domain/package.json @@ -17,7 +17,7 @@ "build": "tsc --build", "watch": "tsc --watch", "test": "vitest run", - "test:coverage": "vitest run --coverage", + "test:coverage:node": "vitest run --coverage", "test:integration": "vitest run integration.test.ts", "test:serenity": "cucumber-js", "test:unit": "vitest run --exclude tests/integration/**/*.test.ts", diff --git a/packages/sthrift/graphql/package.json b/packages/sthrift/graphql/package.json index ac72c9226..022168d18 100644 --- a/packages/sthrift/graphql/package.json +++ b/packages/sthrift/graphql/package.json @@ -18,7 +18,7 @@ "build": "tsc --build", "watch": "tsc --build --watch", "test": "vitest run", - "test:coverage": "vitest run --coverage", + "test:coverage:node": "vitest run --coverage", "test:watch": "vitest", "lint": "biome lint", "clean": "rimraf dist" diff --git a/packages/sthrift/graphql/src/schema/resolver-helper.ts b/packages/sthrift/graphql/src/schema/resolver-helper.ts index ca4f9c5c1..350a90370 100644 --- a/packages/sthrift/graphql/src/schema/resolver-helper.ts +++ b/packages/sthrift/graphql/src/schema/resolver-helper.ts @@ -106,7 +106,6 @@ export const extractUserProfileFromJwt = (context: GraphContext): { * Used for GraphQL field resolvers that need to resolve User union types. */ export const PopulateUserFromField = (fieldName: string) => { - // biome-ignore lint/suspicious/noExplicitAny: parent can be various types with dynamic field access return async (parent: any, _: unknown, context: GraphContext) => { if (parent[fieldName] && isValidObjectId(parent[fieldName].id)) { const userId = parent[fieldName].id; @@ -142,7 +141,6 @@ export const PopulateUserFromField = (fieldName: string) => { }; export const PopulateItemListingFromField = (fieldName: string) => { - // biome-ignore lint/suspicious/noExplicitAny: parent can be various types with dynamic field access return async (parent: any, _: unknown, context: GraphContext) => { if (parent[fieldName] && isValidObjectId(parent[fieldName].id)) { return await context.applicationServices.Listing.ItemListing.queryById({ diff --git a/packages/sthrift/messaging-service-mock/package.json b/packages/sthrift/messaging-service-mock/package.json index e6cb131df..d601239cd 100644 --- a/packages/sthrift/messaging-service-mock/package.json +++ b/packages/sthrift/messaging-service-mock/package.json @@ -14,7 +14,7 @@ "scripts": { "build": "tsc --project tsconfig.json", "test": "vitest run", - "test:coverage": "vitest run --coverage", + "test:coverage:node": "vitest run --coverage", "test:watch": "vitest" }, "dependencies": { diff --git a/packages/sthrift/messaging-service-twilio/package.json b/packages/sthrift/messaging-service-twilio/package.json index bb7ef4d24..0aa1accd3 100644 --- a/packages/sthrift/messaging-service-twilio/package.json +++ b/packages/sthrift/messaging-service-twilio/package.json @@ -26,7 +26,7 @@ "@cellix/typescript-config": "workspace:*", "@cellix/vitest-config": "workspace:*", "@types/node": "^22.0.0", - "vitest": "^3.2.4" + "vitest": "catalog:" }, "license": "MIT" } \ No newline at end of file diff --git a/packages/sthrift/messaging-service-twilio/src/index.test.ts b/packages/sthrift/messaging-service-twilio/src/index.test.ts index 9e50a0ed0..dff662339 100644 --- a/packages/sthrift/messaging-service-twilio/src/index.test.ts +++ b/packages/sthrift/messaging-service-twilio/src/index.test.ts @@ -3,6 +3,15 @@ import { ServiceMessagingTwilio } from './index'; // Mock the Twilio module vi.mock('twilio', () => { + const makeNewableMock = ( + impl: (...args: TArgs) => TResult, + ) => { + // biome-ignore lint/complexity/useArrowFunction: Needs to be a regular function to be constructable (Vitest 4 ctor mocking) + return vi.fn(function (...args: TArgs) { + return impl(...args); + }); + }; + // Mock data must be inside the factory const mockConversationData = { sid: 'CHtest123', @@ -43,14 +52,14 @@ vi.mock('twilio', () => { conversations: { v1: { conversations: Object.assign( - vi.fn(() => mockConversationInstance), + makeNewableMock(() => mockConversationInstance), mockConversationsApi, ), }, }, }; - const TwilioConstructor = vi.fn(() => mockClient); + const TwilioConstructor = makeNewableMock(() => mockClient); return { default: { @@ -85,7 +94,9 @@ describe('ServiceMessagingTwilio', () => { }); it('should create instance with empty credentials and warn', () => { - const consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(); + const consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { + // empty implementation + }); service = new ServiceMessagingTwilio('', ''); expect(service).toBeDefined(); expect(consoleWarnSpy).toHaveBeenCalledWith( diff --git a/packages/sthrift/mock-messaging-server/package.json b/packages/sthrift/mock-messaging-server/package.json index cd47e3636..17671ed50 100644 --- a/packages/sthrift/mock-messaging-server/package.json +++ b/packages/sthrift/mock-messaging-server/package.json @@ -31,6 +31,6 @@ "supertest": "^7.0.0", "tsc-watch": "^7.1.1", "typescript": "^5.8.3", - "vitest": "^3.2.4" + "vitest": "catalog:" } } diff --git a/packages/sthrift/persistence/package.json b/packages/sthrift/persistence/package.json index 2fcf2f3cf..542b577c1 100644 --- a/packages/sthrift/persistence/package.json +++ b/packages/sthrift/persistence/package.json @@ -17,7 +17,7 @@ "build": "tsc --build", "watch": "tsc --watch", "test": "vitest run", - "test:coverage": "vitest run --coverage", + "test:coverage:node": "vitest run --coverage", "test:watch": "vitest", "lint": "biome lint", "clean": "rimraf dist" @@ -31,7 +31,9 @@ "@sthrift/data-sources-mongoose-models": "workspace:*", "@sthrift/domain": "workspace:*", "mongodb": "catalog:", - "mongoose": "catalog:" + "mongoose": "catalog:", + "@cellix/test-utils": "workspace:*" + }, "devDependencies": { "@cellix/typescript-config": "workspace:*", diff --git a/packages/sthrift/persistence/src/datasources/domain/account-plan/account-plan/account-plan.repository.test.ts b/packages/sthrift/persistence/src/datasources/domain/account-plan/account-plan/account-plan.repository.test.ts index c7f942a5d..9347a4c39 100644 --- a/packages/sthrift/persistence/src/datasources/domain/account-plan/account-plan/account-plan.repository.test.ts +++ b/packages/sthrift/persistence/src/datasources/domain/account-plan/account-plan/account-plan.repository.test.ts @@ -9,6 +9,7 @@ import type mongoose from 'mongoose'; import { expect, vi } from 'vitest'; import { AccountPlanConverter } from './account-plan.domain-adapter.ts'; import { AccountPlanRepository } from './account-plan.repository.ts'; +import { makeNewableMock } from '@cellix/test-utils'; const test = { for: describeFeature }; const __dirname = path.dirname(fileURLToPath(import.meta.url)); @@ -44,6 +45,8 @@ function makeEventBus(): DomainSeedwork.EventBus { } as DomainSeedwork.EventBus); } +// use shared makeNewableMock from test-utils + function makeAccountPlanDoc( id = 'plan-1', name = 'Basic Plan', @@ -75,10 +78,9 @@ function makeAccountPlanDoc( } function createChainableQuery(result: T) { - const query = { - exec: vi.fn().mockResolvedValue(result), - }; - return query; + return { + exec: vi.fn().mockResolvedValue(result), + }; } function setupAccountPlanRepo( @@ -278,9 +280,7 @@ test.for(feature, ({ Scenario, Background, BeforeEachScenario }) => { }; repository = setupAccountPlanRepo(mockDoc, { - modelCtor: vi.fn( - () => mockNewDoc, - ) as unknown as Models.AccountPlan.AccountPlanModelType, + modelCtor: makeNewableMock(() => mockNewDoc) as unknown as Models.AccountPlan.AccountPlanModelType, }); result = await repository.getNewInstance(planInfo); diff --git a/packages/sthrift/persistence/src/datasources/domain/conversation/conversation/conversation.repository.test.ts b/packages/sthrift/persistence/src/datasources/domain/conversation/conversation/conversation.repository.test.ts index 978d8b792..9927b438b 100644 --- a/packages/sthrift/persistence/src/datasources/domain/conversation/conversation/conversation.repository.test.ts +++ b/packages/sthrift/persistence/src/datasources/domain/conversation/conversation/conversation.repository.test.ts @@ -7,6 +7,7 @@ import { Domain } from '@sthrift/domain'; import type mongoose from 'mongoose'; import { MongooseSeedwork } from '@cellix/mongoose-seedwork'; import { expect, vi } from 'vitest'; +import { makeNewableMock } from '@cellix/test-utils'; import { ConversationConverter } from './conversation.domain-adapter.ts'; import { ConversationRepository } from './conversation.repository.ts'; @@ -39,6 +40,8 @@ function makeEventBus(): DomainSeedwork.EventBus { return vi.mocked({ dispatch: vi.fn(), register: vi.fn() } as DomainSeedwork.EventBus); } +// use shared makeNewableMock from test-utils + function makeUserDoc(id: string): Models.User.PersonalUser { const validId = createValidObjectId(id); return { @@ -353,7 +356,7 @@ test.for(feature, ({ Scenario, Background, BeforeEachScenario }) => { // Setup repository with constructor mock repository = setupConversationRepo(mockDoc, { - modelCtor: vi.fn(() => mockNewDoc) as unknown as Models.Conversation.ConversationModelType + modelCtor: makeNewableMock(() => mockNewDoc) as unknown as Models.Conversation.ConversationModelType, }); result = await repository.getNewInstance(sharer, reserver, listing); diff --git a/packages/sthrift/persistence/src/datasources/domain/reservation-request/reservation-request/reservation-request.repository.test.ts b/packages/sthrift/persistence/src/datasources/domain/reservation-request/reservation-request/reservation-request.repository.test.ts index 4e2f17bd4..c9615af20 100644 --- a/packages/sthrift/persistence/src/datasources/domain/reservation-request/reservation-request/reservation-request.repository.test.ts +++ b/packages/sthrift/persistence/src/datasources/domain/reservation-request/reservation-request/reservation-request.repository.test.ts @@ -7,6 +7,7 @@ import { Domain } from '@sthrift/domain'; import type mongoose from 'mongoose'; import { MongooseSeedwork } from '@cellix/mongoose-seedwork'; import { expect, vi } from 'vitest'; +import { makeNewableMock } from '@cellix/test-utils'; import { ReservationRequestConverter } from './reservation-request.domain-adapter.ts'; import { ReservationRequestRepository } from './reservation-request.repository.ts'; @@ -39,6 +40,8 @@ function makeEventBus(): DomainSeedwork.EventBus { return vi.mocked({ dispatch: vi.fn(), register: vi.fn() } as DomainSeedwork.EventBus); } +// use shared makeNewableMock from test-utils + function makeUserDoc(id: string): Models.User.PersonalUser { const validId = createValidObjectId(id); return { @@ -294,10 +297,10 @@ test.for(feature, ({ Scenario, Background, BeforeEachScenario }) => { set: vi.fn(), }; - // Setup repository with constructor mock - repository = setupReservationRequestRepo(mockDoc, { - modelCtor: vi.fn(() => mockNewDoc) as unknown as Models.ReservationRequest.ReservationRequestModelType - }); + // Setup repository with constructor mock + repository = setupReservationRequestRepo(mockDoc, { + modelCtor: makeNewableMock(() => mockNewDoc) as unknown as Models.ReservationRequest.ReservationRequestModelType, + }); result = await repository.getNewInstance( 'PENDING', diff --git a/packages/sthrift/persistence/src/datasources/domain/user/admin-user/admin-user.repository.test.ts b/packages/sthrift/persistence/src/datasources/domain/user/admin-user/admin-user.repository.test.ts index c939d5420..26781d062 100644 --- a/packages/sthrift/persistence/src/datasources/domain/user/admin-user/admin-user.repository.test.ts +++ b/packages/sthrift/persistence/src/datasources/domain/user/admin-user/admin-user.repository.test.ts @@ -6,6 +6,7 @@ import type { Models } from '@sthrift/data-sources-mongoose-models'; import { Domain } from '@sthrift/domain'; import type mongoose from 'mongoose'; import { expect, vi } from 'vitest'; +import { makeNewableMock } from '@cellix/test-utils'; import { AdminUserConverter } from './admin-user.domain-adapter.ts'; import { AdminUserRepository } from './admin-user.repository.ts'; @@ -32,6 +33,8 @@ function makeEventBus(): DomainSeedwork.EventBus { } as DomainSeedwork.EventBus); } +// use shared makeNewableMock from test-utils + function makeSession(): mongoose.ClientSession { return vi.mocked({} as mongoose.ClientSession); } @@ -168,9 +171,7 @@ test.for(feature, ({ Scenario, Background, BeforeEachScenario }) => { 'I call getNewInstance with email "newadmin@example.com", username "newadmin", firstName "New", and lastName "Admin"', async () => { const newDoc = { ...mockDoc }; - // Create a proper constructor function mock - const ModelConstructor = vi.fn().mockImplementation(() => newDoc); - // Add the other mongoose model methods that might be needed + const ModelConstructor = makeNewableMock(() => newDoc); Object.assign(ModelConstructor, { findOne: mockModel.findOne, findById: mockModel.findById, diff --git a/packages/sthrift/persistence/src/datasources/domain/user/personal-user/personal-user.repository.test.ts b/packages/sthrift/persistence/src/datasources/domain/user/personal-user/personal-user.repository.test.ts index e3281133e..dbc0cecfd 100644 --- a/packages/sthrift/persistence/src/datasources/domain/user/personal-user/personal-user.repository.test.ts +++ b/packages/sthrift/persistence/src/datasources/domain/user/personal-user/personal-user.repository.test.ts @@ -6,6 +6,7 @@ import type { Models } from '@sthrift/data-sources-mongoose-models'; import { Domain } from '@sthrift/domain'; import type mongoose from 'mongoose'; import { expect, vi } from 'vitest'; +import { makeNewableMock } from '@cellix/test-utils'; import { PersonalUserConverter } from './personal-user.domain-adapter.ts'; import { PersonalUserRepository } from './personal-user.repository.ts'; @@ -32,6 +33,8 @@ function makeEventBus(): DomainSeedwork.EventBus { } as DomainSeedwork.EventBus); } +// use shared makeNewableMock from test-utils + function makeSession(): mongoose.ClientSession { return vi.mocked({} as mongoose.ClientSession); } @@ -178,9 +181,7 @@ test.for(feature, ({ Scenario, Background, BeforeEachScenario }) => { 'I call getNewInstance with email "new@example.com", firstName "New", and lastName "User"', async () => { const newDoc = { ...mockDoc }; - // Create a proper constructor function mock - const ModelConstructor = vi.fn().mockImplementation(() => newDoc); - // Add the other mongoose model methods that might be needed + const ModelConstructor = makeNewableMock(() => newDoc); Object.assign(ModelConstructor, { findOne: mockModel.findOne, findById: mockModel.findById, diff --git a/packages/sthrift/persistence/src/datasources/readonly/account-plan/account-plan/account-plan.read-repository.test.ts b/packages/sthrift/persistence/src/datasources/readonly/account-plan/account-plan/account-plan.read-repository.test.ts index 5c18d60af..4319c9b62 100644 --- a/packages/sthrift/persistence/src/datasources/readonly/account-plan/account-plan/account-plan.read-repository.test.ts +++ b/packages/sthrift/persistence/src/datasources/readonly/account-plan/account-plan/account-plan.read-repository.test.ts @@ -5,26 +5,40 @@ import type { FindOptions, FindOneOptions } from '../../mongo-data-source.ts'; import { AccountPlanReadRepositoryImpl, getAccountPlanReadRepository } from './account-plan.read-repository.ts'; // Mock the converter -vi.mock('../../../domain/account-plan/account-plan/account-plan.domain-adapter.ts', () => ({ - AccountPlanConverter: vi.fn().mockImplementation(() => ({ - toDomain: vi.fn((doc) => ({ id: doc._id, name: doc.name })), - })), -})); - -vi.mock('../account-plan/account-plan.data.ts', () => ({ - AccountPlanDataSourceImpl: vi.fn().mockImplementation(() => ({ - find: vi.fn(), - findById: vi.fn(), - findOne: vi.fn(), - })), -})); +vi.mock('../../../domain/account-plan/account-plan/account-plan.domain-adapter.ts', () => { + // biome-ignore lint/complexity/useArrowFunction: constructor must use function syntax for 'new' compatibility + const AccountPlanConverter = vi.fn(function () { + return { + toDomain: vi.fn((doc) => ({ id: doc._id, name: doc.name })), + }; + }); + + return { AccountPlanConverter }; +}); + +vi.mock('../account-plan/account-plan.data.ts', () => { + // biome-ignore lint/complexity/useArrowFunction: constructor must use function syntax for 'new' compatibility + const AccountPlanDataSourceImpl = vi.fn(function () { + return { + find: vi.fn(), + findById: vi.fn(), + findOne: vi.fn(), + }; + }); + + return { AccountPlanDataSourceImpl }; +}); function makeModelsContext(): ModelsContext { - return { + // Only AccountPlan.AccountPlanModel is used by AccountPlanReadRepositoryImpl + const partialContext = { AccountPlan: { AccountPlanModel: {}, }, - } as ModelsContext; + }; + + // Other members are irrelevant for these tests and safely stubbed via cast + return partialContext as unknown as ModelsContext; } function makePassport(): Domain.Passport { @@ -43,6 +57,22 @@ function makePassport(): Domain.Passport { } as unknown as Domain.Passport; } +/** + * Typed helper to access the private mongoDataSource property for testing. + * Avoids repeated inline casts throughout test assertions. + */ +function getMongoDataSource(repository: AccountPlanReadRepositoryImpl): { + find: ReturnType; + findById: ReturnType; + findOne: ReturnType; +} { + return (repository as unknown as { mongoDataSource: { + find: ReturnType; + findById: ReturnType; + findOne: ReturnType; + } }).mongoDataSource; +} + describe('AccountPlanReadRepositoryImpl', () => { let models: ModelsContext; let passport: Domain.Passport; @@ -68,8 +98,7 @@ describe('AccountPlanReadRepositoryImpl', () => { { _id: '2', name: 'Plan 2' }, ]; - // Access the mongoDataSource via prototype or direct property - const mongoDataSource = (repository as unknown as { mongoDataSource: { find: ReturnType } }).mongoDataSource; + const mongoDataSource = getMongoDataSource(repository); mongoDataSource.find = vi.fn().mockResolvedValue(mockData); const result = await repository.getAll(); @@ -81,7 +110,7 @@ describe('AccountPlanReadRepositoryImpl', () => { const options: FindOptions = { fields: ['name'] }; const mockData = [{ _id: '1', name: 'Plan 1' }]; - const mongoDataSource = (repository as unknown as { mongoDataSource: { find: ReturnType } }).mongoDataSource; + const mongoDataSource = getMongoDataSource(repository); mongoDataSource.find = vi.fn().mockResolvedValue(mockData); await repository.getAll(options); @@ -91,7 +120,7 @@ describe('AccountPlanReadRepositoryImpl', () => { it('should return empty array when no plans exist', async () => { const repository = new AccountPlanReadRepositoryImpl(models, passport); - const mongoDataSource = (repository as unknown as { mongoDataSource: { find: ReturnType } }).mongoDataSource; + const mongoDataSource = getMongoDataSource(repository); mongoDataSource.find = vi.fn().mockResolvedValue([]); const result = await repository.getAll(); @@ -104,7 +133,7 @@ describe('AccountPlanReadRepositoryImpl', () => { const repository = new AccountPlanReadRepositoryImpl(models, passport); const mockData = { _id: '123', name: 'Test Plan' }; - const mongoDataSource = (repository as unknown as { mongoDataSource: { findById: ReturnType } }).mongoDataSource; + const mongoDataSource = getMongoDataSource(repository); mongoDataSource.findById = vi.fn().mockResolvedValue(mockData); const result = await repository.getById('123'); @@ -114,7 +143,7 @@ describe('AccountPlanReadRepositoryImpl', () => { it('should return null when plan not found', async () => { const repository = new AccountPlanReadRepositoryImpl(models, passport); - const mongoDataSource = (repository as unknown as { mongoDataSource: { findById: ReturnType } }).mongoDataSource; + const mongoDataSource = getMongoDataSource(repository); mongoDataSource.findById = vi.fn().mockResolvedValue(null); const result = await repository.getById('nonexistent'); @@ -125,7 +154,7 @@ describe('AccountPlanReadRepositoryImpl', () => { const repository = new AccountPlanReadRepositoryImpl(models, passport); const options: FindOneOptions = { fields: ['name'] }; - const mongoDataSource = (repository as unknown as { mongoDataSource: { findById: ReturnType } }).mongoDataSource; + const mongoDataSource = getMongoDataSource(repository); mongoDataSource.findById = vi.fn().mockResolvedValue(null); await repository.getById('123', options); @@ -138,7 +167,7 @@ describe('AccountPlanReadRepositoryImpl', () => { const repository = new AccountPlanReadRepositoryImpl(models, passport); const mockData = { _id: '123', name: 'Premium Plan' }; - const mongoDataSource = (repository as unknown as { mongoDataSource: { findOne: ReturnType } }).mongoDataSource; + const mongoDataSource = getMongoDataSource(repository); mongoDataSource.findOne = vi.fn().mockResolvedValue(mockData); const result = await repository.getByName('Premium Plan'); @@ -148,7 +177,7 @@ describe('AccountPlanReadRepositoryImpl', () => { it('should return null when plan not found by name', async () => { const repository = new AccountPlanReadRepositoryImpl(models, passport); - const mongoDataSource = (repository as unknown as { mongoDataSource: { findOne: ReturnType } }).mongoDataSource; + const mongoDataSource = getMongoDataSource(repository); mongoDataSource.findOne = vi.fn().mockResolvedValue(null); const result = await repository.getByName('Nonexistent Plan'); @@ -158,7 +187,7 @@ describe('AccountPlanReadRepositoryImpl', () => { it('should call findOne with name filter', async () => { const repository = new AccountPlanReadRepositoryImpl(models, passport); - const mongoDataSource = (repository as unknown as { mongoDataSource: { findOne: ReturnType } }).mongoDataSource; + const mongoDataSource = getMongoDataSource(repository); mongoDataSource.findOne = vi.fn().mockResolvedValue(null); await repository.getByName('Test Plan'); diff --git a/packages/sthrift/persistence/src/datasources/readonly/account-plan/account-plan/account-plan.read-repository.ts b/packages/sthrift/persistence/src/datasources/readonly/account-plan/account-plan/account-plan.read-repository.ts index 9adfc1005..d324d6b19 100644 --- a/packages/sthrift/persistence/src/datasources/readonly/account-plan/account-plan/account-plan.read-repository.ts +++ b/packages/sthrift/persistence/src/datasources/readonly/account-plan/account-plan/account-plan.read-repository.ts @@ -67,9 +67,9 @@ export class AccountPlanReadRepositoryImpl } } -export const getAccountPlanReadRepository = ( +export function getAccountPlanReadRepository( models: ModelsContext, passport: Domain.Passport, -) => { +): AccountPlanReadRepository { return new AccountPlanReadRepositoryImpl(models, passport); -}; +} diff --git a/packages/sthrift/service-mongoose/package.json b/packages/sthrift/service-mongoose/package.json index 1e57c5e0d..028a96a92 100644 --- a/packages/sthrift/service-mongoose/package.json +++ b/packages/sthrift/service-mongoose/package.json @@ -17,7 +17,7 @@ "build": "tsc --build", "watch": "tsc --watch", "test": "vitest run", - "test:coverage": "vitest run --coverage", + "test:coverage:node": "vitest run --coverage", "test:watch": "vitest", "lint": "biome lint", "clean": "rimraf dist" diff --git a/packages/sthrift/service-otel/package.json b/packages/sthrift/service-otel/package.json index 29c414f7a..8dc4bb94b 100644 --- a/packages/sthrift/service-otel/package.json +++ b/packages/sthrift/service-otel/package.json @@ -17,7 +17,7 @@ "build": "tsc --build", "watch": "tsc --watch", "test": "vitest run", - "test:coverage": "vitest run --coverage", + "test:coverage:node": "vitest run --coverage", "test:watch": "vitest", "lint": "biome lint", "clean": "rimraf dist" diff --git a/packages/sthrift/service-otel/src/otel-builder.test.ts b/packages/sthrift/service-otel/src/otel-builder.test.ts index 2e7645a91..dc7edfcad 100644 --- a/packages/sthrift/service-otel/src/otel-builder.test.ts +++ b/packages/sthrift/service-otel/src/otel-builder.test.ts @@ -15,31 +15,47 @@ import { MongooseInstrumentation } from '@opentelemetry/instrumentation-mongoose import { expect, vi } from 'vitest'; import { OtelBuilder } from './otel-builder.ts'; +/** + * Type for mock exporter class used in tests. + * The actual class is defined inside vi.mock() to avoid hoisting issues. + */ +type MockExporter = { + __args: Record; +}; const test = { for: describeFeature }; -// Move mocks INSIDE the vi.mock factory to avoid hoisting issues vi.mock('@azure/monitor-opentelemetry-exporter', () => { - // Unique classes for instanceof checks - class TraceExporter {} - class MetricExporter {} - class LogExporter {} - // Mocks that attach args for assertion - const traceExporterMock = vi.fn((args) => Object.assign(new TraceExporter(), { __args: args })); - const metricExporterMock = vi.fn((args) => Object.assign(new MetricExporter(), { __args: args })); - const logExporterMock = vi.fn((args) => Object.assign(new LogExporter(), { __args: args })); - // Expose mocks and classes for test access + /** + * Mock exporter class for testing. Stores constructor args for verification. + * Defined inside mock factory to avoid hoisting issues. + */ + class MockExporter { + __args: Record; + constructor(args: Record) { + this.__args = args; + } + } + + const makeNewableMock = (impl: (...args: TArgs) => TResult) => { + // biome-ignore lint/complexity/useArrowFunction: Needs to be a regular function to be constructable (Vitest 4 ctor mocking) + return vi.fn(function (...args: TArgs) { + return impl(...args); + }); + }; + + const AzureMonitorTraceExporter = makeNewableMock((args: Record) => new MockExporter(args)); + const AzureMonitorMetricExporter = makeNewableMock((args: Record) => new MockExporter(args)); + const AzureMonitorLogExporter = makeNewableMock((args: Record) => new MockExporter(args)); + return { - AzureMonitorTraceExporter: traceExporterMock, - AzureMonitorMetricExporter: metricExporterMock, - AzureMonitorLogExporter: logExporterMock, - // For test access + AzureMonitorTraceExporter, + AzureMonitorMetricExporter, + AzureMonitorLogExporter, __test: { - traceExporterMock, - metricExporterMock, - logExporterMock, - TraceExporter, - MetricExporter, - LogExporter, + traceExporterMock: AzureMonitorTraceExporter, + metricExporterMock: AzureMonitorMetricExporter, + logExporterMock: AzureMonitorLogExporter, + MockExporter, }, }; }); @@ -57,22 +73,17 @@ test.for(feature, ({ Scenario, BeforeEachScenario, AfterEachScenario }) => { let traceExporterMock: ReturnType; let metricExporterMock: ReturnType; let logExporterMock: ReturnType; - let TraceExporter: new (...args: unknown[]) => unknown; - let MetricExporter: new (...args: unknown[]) => unknown; - let LogExporter: new (...args: unknown[]) => unknown; + let MockExporterClass: new (args: Record) => MockExporter; BeforeEachScenario(async () => { builder = new OtelBuilder(); originalEnv = { ...process.env }; - // Get the actual mocks and classes from the module - // biome-ignore lint:noExplicitAny + // biome-ignore lint/suspicious/noExplicitAny: Required for module mock access const azureModule = await import('@azure/monitor-opentelemetry-exporter') as any; traceExporterMock = azureModule.__test.traceExporterMock; metricExporterMock = azureModule.__test.metricExporterMock; logExporterMock = azureModule.__test.logExporterMock; - TraceExporter = azureModule.__test.TraceExporter; - MetricExporter = azureModule.__test.MetricExporter; - LogExporter = azureModule.__test.LogExporter; + MockExporterClass = azureModule.__test.MockExporter; traceExporterMock.mockClear(); metricExporterMock.mockClear(); logExporterMock.mockClear(); @@ -109,16 +120,15 @@ test.for(feature, ({ Scenario, BeforeEachScenario, AfterEachScenario }) => { exporters = builder.buildExporters(false); }); Then('it should return AzureMonitorTraceExporter, AzureMonitorMetricExporter, and AzureMonitorLogExporter with the correct connection string', () => { - expect(exporters.traceExporter).toBeInstanceOf(TraceExporter); - expect(exporters.metricExporter).toBeInstanceOf(MetricExporter); - expect(exporters.logExporter).toBeInstanceOf(LogExporter); + expect(exporters.traceExporter).toBeInstanceOf(MockExporterClass); + expect(exporters.metricExporter).toBeInstanceOf(MockExporterClass); + expect(exporters.logExporter).toBeInstanceOf(MockExporterClass); expect(traceExporterMock).toHaveBeenCalledWith({ connectionString: connStr }); expect(metricExporterMock).toHaveBeenCalledWith({ connectionString: connStr }); expect(logExporterMock).toHaveBeenCalledWith({ connectionString: connStr }); - // Also check the instance has the correct property for extra safety - expect((exporters.traceExporter as unknown as { __args: { connectionString: string } }).__args.connectionString).toBe(connStr); - expect((exporters.metricExporter as unknown as { __args: { connectionString: string } }).__args.connectionString).toBe(connStr); - expect((exporters.logExporter as unknown as { __args: { connectionString: string } }).__args.connectionString).toBe(connStr); + expect((exporters.traceExporter as unknown as MockExporter).__args['connectionString']).toBe(connStr); + expect((exporters.metricExporter as unknown as MockExporter).__args['connectionString']).toBe(connStr); + expect((exporters.logExporter as unknown as MockExporter).__args['connectionString']).toBe(connStr); }); }); diff --git a/packages/sthrift/service-sendgrid/src/sendgrid.test.ts b/packages/sthrift/service-sendgrid/src/sendgrid.test.ts index e79b9be30..96ee93672 100644 --- a/packages/sthrift/service-sendgrid/src/sendgrid.test.ts +++ b/packages/sthrift/service-sendgrid/src/sendgrid.test.ts @@ -43,186 +43,206 @@ test.for(feature, ({ Scenario }) => { process.env = { ...originalEnv }; }); - Scenario('Constructing SendGrid with missing API key', ({ Given, When, Then }) => { - Given('no SENDGRID_API_KEY environment variable', () => { - delete process.env['SENDGRID_API_KEY']; - }); - - When('SendGrid is constructed', () => { - // Handled in Then - }); - - Then('it should throw an error about missing API key', () => { - expect(() => new SendGrid('template.json')).toThrow( - 'SENDGRID_API_KEY environment variable is missing', - ); - }); - }); - - Scenario('Constructing SendGrid with valid API key', ({ Given, When, Then, And }) => { - const apiKey = 'test-api-key-123'; - const templateName = 'welcome-email.json'; - - Given('a valid SENDGRID_API_KEY environment variable', () => { - // biome-ignore lint/complexity/useLiteralKeys: Required for env var access - process.env['SENDGRID_API_KEY'] = apiKey; - }); - - And('an email template name', () => { - // Already defined above - }); - - When('SendGrid is constructed', () => { - sendGridInstance = new SendGrid(templateName); - }); - - Then('it should initialize with the template name', () => { - expect(sendGridInstance.emailTemplateName).toBe(templateName); - }); - }); - - Scenario('Sending email with magic link in development mode', ({ Given, When, Then, And }) => { - const userEmail = 'user@example.com'; - const magicLink = 'https://example.com/magic/abc123'; - const mockFs = fs as typeof fs & { - existsSync: ReturnType; - mkdirSync: ReturnType; - writeFileSync: ReturnType; - }; - - Given('a SendGrid instance in development mode', () => { - // biome-ignore lint/complexity/useLiteralKeys: Required for env var access - process.env['SENDGRID_API_KEY'] = 'test-key'; - // biome-ignore lint/complexity/useLiteralKeys: Required for env var access - process.env['NODE_ENV'] = 'development'; - // biome-ignore lint/complexity/useLiteralKeys: Required for env var access - process.env['SENDGRID_MAGICLINK_SUBJECT_SUFFIX'] = '- Dev'; - - mockFs.existsSync = vi.fn().mockReturnValue(false); - mockFs.mkdirSync = vi.fn(); - mockFs.writeFileSync = vi.fn(); - - vi.mocked(emailTemplate.readHtmlFile).mockReturnValue( - JSON.stringify(mockTemplate), - ); - - sendGridInstance = new SendGrid('template.json'); - }); - - And('a user email and magic link', () => { - // Already defined above - }); - - When('sendEmailWithMagicLink is called', async () => { - await sendGridInstance.sendEmailWithMagicLink(userEmail, magicLink); - }); - - Then('it should save the email to a file instead of sending', () => { - expect(mockFs.mkdirSync).toHaveBeenCalled(); - expect(mockFs.writeFileSync).toHaveBeenCalled(); - }); - }); - - Scenario('Sending email with magic link in production mode', ({ Given, When, Then, And }) => { - const userEmail = 'user@example.com'; - const magicLink = 'https://example.com/magic/abc123'; - let sendGridMock: { send: ReturnType }; - - Given('a SendGrid instance in production mode', async () => { - // biome-ignore lint/complexity/useLiteralKeys: Required for env var access - process.env['SENDGRID_API_KEY'] = 'test-key'; - // biome-ignore lint/complexity/useLiteralKeys: Required for env var access - process.env['NODE_ENV'] = 'production'; - // biome-ignore lint/complexity/useLiteralKeys: Required for env var access - process.env['SENDGRID_MAGICLINK_SUBJECT_SUFFIX'] = '- Prod'; - - // biome-ignore lint/suspicious/noExplicitAny: Required for mock type assertion - sendGridMock = (await import('@sendgrid/mail')).default as any; - sendGridMock.send = vi.fn().mockResolvedValue([{ statusCode: 202 }]); - - vi.mocked(emailTemplate.readHtmlFile).mockReturnValue( - JSON.stringify(mockTemplate), - ); - - sendGridInstance = new SendGrid('template.json'); - }); - - And('a user email and magic link', () => { - // Already defined above - }); - - When('sendEmailWithMagicLink is called', async () => { - await sendGridInstance.sendEmailWithMagicLink(userEmail, magicLink); - }); - - Then('it should send email via SendGrid API', () => { - expect(sendGridMock.send).toHaveBeenCalledWith( - expect.objectContaining({ - to: userEmail, - from: mockTemplate.fromEmail, - subject: expect.stringContaining(mockTemplate.subject), - html: expect.stringContaining(magicLink), - }), - ); - }); - }); - - Scenario('Replacing magic link placeholder in template', ({ Given, When, Then, And }) => { - const template = - 'Link 1 Link 2'; - const magicLink = 'https://example.com/magic/xyz'; - let result: string; - - Given('an HTML template with magic link placeholder', () => { - // biome-ignore lint/complexity/useLiteralKeys: Required for env var access - process.env['SENDGRID_API_KEY'] = 'test-key'; - sendGridInstance = new SendGrid('template.json'); - }); - - And('a magic link URL', () => { - // Already defined above - }); - - When('the template is processed', () => { - // Access private method via type assertion - // biome-ignore lint/suspicious/noExplicitAny: Required to access private method for testing - result = (sendGridInstance as any).replaceMagicLink(template, magicLink); - }); - - Then('it should replace all placeholders with the actual link', () => { - expect(result).not.toContain('{{magicLink}}'); - expect(result).toContain(magicLink); - expect((result.match(new RegExp(magicLink, 'g')) || []).length).toBe(2); - }); - }); - - Scenario('Handling invalid email template JSON', ({ Given, When, Then, And }) => { - const userEmail = 'user@example.com'; - const magicLink = 'https://example.com/magic/abc123'; - - Given('a SendGrid instance with invalid template', () => { - // biome-ignore lint/complexity/useLiteralKeys: Required for env var access - process.env['SENDGRID_API_KEY'] = 'test-key'; - - vi.mocked(emailTemplate.readHtmlFile).mockReturnValue( - '{ invalid json content', - ); - - sendGridInstance = new SendGrid('bad-template.json'); - }); - - And('a user email and magic link', () => { - // Already defined above - }); - - When('sendEmailWithMagicLink is called', async () => { - // Handled in Then - }); - - Then('it should throw an error about invalid template JSON', async () => { - await expect( - sendGridInstance.sendEmailWithMagicLink(userEmail, magicLink), - ).rejects.toThrow('Invalid email template JSON'); - }); - }); + Scenario( + 'Constructing SendGrid with missing API key', + ({ Given, When, Then }) => { + Given('no SENDGRID_API_KEY environment variable', () => { + delete process.env['SENDGRID_API_KEY']; + }); + + When('SendGrid is constructed', () => { + // Handled in Then + }); + + Then('it should throw an error about missing API key', () => { + expect(() => new SendGrid('template.json')).toThrow( + 'SENDGRID_API_KEY environment variable is missing', + ); + }); + }, + ); + + Scenario( + 'Constructing SendGrid with valid API key', + ({ Given, When, Then, And }) => { + const apiKey = 'test-api-key-123'; + const templateName = 'welcome-email.json'; + + Given('a valid SENDGRID_API_KEY environment variable', () => { + // biome-ignore lint/complexity/useLiteralKeys: Required for env var access + process.env['SENDGRID_API_KEY'] = apiKey; + }); + + And('an email template name', () => { + // Already defined above + }); + + When('SendGrid is constructed', () => { + sendGridInstance = new SendGrid(templateName); + }); + + Then('it should initialize with the template name', () => { + expect(sendGridInstance.emailTemplateName).toBe(templateName); + }); + }, + ); + + Scenario( + 'Sending email with magic link in development mode', + ({ Given, When, Then, And }) => { + const userEmail = 'user@example.com'; + const magicLink = 'https://example.com/magic/abc123'; + const mockFs = fs as typeof fs & { + existsSync: ReturnType; + mkdirSync: ReturnType; + writeFileSync: ReturnType; + }; + + Given('a SendGrid instance in development mode', () => { + // biome-ignore lint/complexity/useLiteralKeys: Required for env var access + process.env['SENDGRID_API_KEY'] = 'test-key'; + // biome-ignore lint/complexity/useLiteralKeys: Required for env var access + process.env['NODE_ENV'] = 'development'; + // biome-ignore lint/complexity/useLiteralKeys: Required for env var access + process.env['SENDGRID_MAGICLINK_SUBJECT_SUFFIX'] = '- Dev'; + + mockFs.existsSync = vi.fn().mockReturnValue(false); + mockFs.mkdirSync = vi.fn() as typeof mockFs.mkdirSync; + mockFs.writeFileSync = vi.fn() as typeof mockFs.writeFileSync; + vi.mocked(emailTemplate.readHtmlFile).mockReturnValue( + JSON.stringify(mockTemplate), + ); + + sendGridInstance = new SendGrid('template.json'); + }); + + And('a user email and magic link', () => { + // Already defined above + }); + + When('sendEmailWithMagicLink is called', async () => { + await sendGridInstance.sendEmailWithMagicLink(userEmail, magicLink); + }); + + Then('it should save the email to a file instead of sending', () => { + expect(mockFs.mkdirSync).toHaveBeenCalled(); + expect(mockFs.writeFileSync).toHaveBeenCalled(); + }); + }, + ); + + Scenario( + 'Sending email with magic link in production mode', + ({ Given, When, Then, And }) => { + const userEmail = 'user@example.com'; + const magicLink = 'https://example.com/magic/abc123'; + let sendGridMock: { send: ReturnType }; + + Given('a SendGrid instance in production mode', async () => { + // biome-ignore lint/complexity/useLiteralKeys: Required for env var access + process.env['SENDGRID_API_KEY'] = 'test-key'; + // biome-ignore lint/complexity/useLiteralKeys: Required for env var access + process.env['NODE_ENV'] = 'production'; + // biome-ignore lint/complexity/useLiteralKeys: Required for env var access + process.env['SENDGRID_MAGICLINK_SUBJECT_SUFFIX'] = '- Prod'; + + // biome-ignore lint/suspicious/noExplicitAny: Required for mock type assertion + sendGridMock = (await import('@sendgrid/mail')).default as any; + sendGridMock.send = vi.fn().mockResolvedValue([{ statusCode: 202 }]); + + vi.mocked(emailTemplate.readHtmlFile).mockReturnValue( + JSON.stringify(mockTemplate), + ); + + sendGridInstance = new SendGrid('template.json'); + }); + + And('a user email and magic link', () => { + // Already defined above + }); + + When('sendEmailWithMagicLink is called', async () => { + await sendGridInstance.sendEmailWithMagicLink(userEmail, magicLink); + }); + + Then('it should send email via SendGrid API', () => { + expect(sendGridMock.send).toHaveBeenCalledWith( + expect.objectContaining({ + to: userEmail, + from: mockTemplate.fromEmail, + subject: expect.stringContaining(mockTemplate.subject), + html: expect.stringContaining(magicLink), + }), + ); + }); + }, + ); + + Scenario( + 'Replacing magic link placeholder in template', + ({ Given, When, Then, And }) => { + const template = + 'Link 1 Link 2'; + const magicLink = 'https://example.com/magic/xyz'; + let result: string; + + Given('an HTML template with magic link placeholder', () => { + // biome-ignore lint/complexity/useLiteralKeys: Required for env var access + process.env['SENDGRID_API_KEY'] = 'test-key'; + sendGridInstance = new SendGrid('template.json'); + }); + + And('a magic link URL', () => { + // Already defined above + }); + + When('the template is processed', () => { + // Access private method via type assertion + // biome-ignore lint/suspicious/noExplicitAny: Required to access private method for testing + result = (sendGridInstance as any).replaceMagicLink( + template, + magicLink, + ); + }); + + Then('it should replace all placeholders with the actual link', () => { + expect(result).not.toContain('{{magicLink}}'); + expect(result).toContain(magicLink); + expect((result.match(new RegExp(magicLink, 'g')) || []).length).toBe(2); + }); + }, + ); + + Scenario( + 'Handling invalid email template JSON', + ({ Given, When, Then, And }) => { + const userEmail = 'user@example.com'; + const magicLink = 'https://example.com/magic/abc123'; + + Given('a SendGrid instance with invalid template', () => { + // biome-ignore lint/complexity/useLiteralKeys: Required for env var access + process.env['SENDGRID_API_KEY'] = 'test-key'; + + vi.mocked(emailTemplate.readHtmlFile).mockReturnValue( + '{ invalid json content', + ); + + sendGridInstance = new SendGrid('bad-template.json'); + }); + + And('a user email and magic link', () => { + // Already defined above + }); + + When('sendEmailWithMagicLink is called', async () => { + // Handled in Then + }); + + Then('it should throw an error about invalid template JSON', async () => { + await expect( + sendGridInstance.sendEmailWithMagicLink(userEmail, magicLink), + ).rejects.toThrow('Invalid email template JSON'); + }); + }, + ); }); diff --git a/packages/sthrift/ui-components/package.json b/packages/sthrift/ui-components/package.json index 4f6fe2f2d..56f05e48d 100644 --- a/packages/sthrift/ui-components/package.json +++ b/packages/sthrift/ui-components/package.json @@ -8,6 +8,7 @@ ], "exports": { ".": { + "vitest": "./src/index.ts", "types": "./dist/src/index.d.ts", "default": "./dist/src/index.js" }, @@ -36,7 +37,7 @@ "copy-css": "cpx \"src/**/*.{css,svg,png,jpg,jpeg,gif}\" dist/src", "watch": "tsc --watch", "test": "vitest run", - "test:coverage": "vitest run --coverage", + "test:coverage:ui": "vitest run --coverage", "test:watch": "vitest", "lint": "biome lint", "clean": "rimraf dist", @@ -67,14 +68,13 @@ "@storybook/react-vite": "^9.1.17", "@types/react": "^19.1.11", "@types/react-dom": "^19.1.6", - "@vitest/browser": "^3.2.4", - "@vitest/coverage-v8": "^3.2.4", + "@vitest/coverage-v8": "catalog:", "jsdom": "^26.1.0", "rimraf": "^6.0.1", "storybook": "catalog:", "typescript": "^5.8.3", - "vite": "^7.0.4", - "vitest": "^3.2.4" + "vite": "catalog:", + "vitest": "catalog:" }, "license": "MIT" } diff --git a/packages/sthrift/ui-components/src/index.ts b/packages/sthrift/ui-components/src/index.ts index 46b4ff7e1..51512088e 100644 --- a/packages/sthrift/ui-components/src/index.ts +++ b/packages/sthrift/ui-components/src/index.ts @@ -1,12 +1,12 @@ export type { UIItemListing } from './organisms/listings-grid/index.tsx'; // Barrel file for all reusable UI components -export { Footer } from './molecules/footer/index.js'; -export { Header } from './molecules/header/index.js'; -export { Navigation } from './molecules/navigation/index.js'; -export { SearchBar } from './molecules/search-bar/index.js'; -export { MessageSharerButton } from './molecules/message-sharer-button.js'; -export { AppLayout } from './organisms/app-layout/index.js'; -export { ListingsGrid } from './organisms/listings-grid/index.js'; -export { ComponentQueryLoader } from './molecules/component-query-loader/index.js'; +export { Footer } from './molecules/footer/index.tsx'; +export { Header } from './molecules/header/index.tsx'; +export { Navigation } from './molecules/navigation/index.tsx'; +export { SearchBar } from './molecules/search-bar/index.tsx'; +export { MessageSharerButton } from './molecules/message-sharer-button.tsx'; +export { AppLayout } from './organisms/app-layout/index.tsx'; +export { ListingsGrid } from './organisms/listings-grid/index.tsx'; +export { ComponentQueryLoader } from './molecules/component-query-loader/index.tsx'; export { Dashboard } from './organisms/dashboard/index.tsx'; -export { ReservationStatusTag } from './atoms/reservation-status-tag/index.js'; +export { ReservationStatusTag } from './atoms/reservation-status-tag/index.tsx'; \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 57c3fea48..0a455eece 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,6 +6,12 @@ settings: catalogs: default: + '@vitest/browser-playwright': + specifier: ^4.0.15 + version: 4.0.15 + '@vitest/coverage-v8': + specifier: ^4.0.15 + version: 4.0.15 mongodb: specifier: 6.18.0 version: 6.18.0 @@ -15,6 +21,12 @@ catalogs: storybook: specifier: 9.1.17 version: 9.1.17 + vite: + specifier: ^7.3.0 + version: 7.3.0 + vitest: + specifier: ^4.0.15 + version: 4.0.15 overrides: node-forge@<1.3.2: '>=1.3.2' @@ -24,14 +36,14 @@ importers: .: devDependencies: '@amiceli/vitest-cucumber': - specifier: ^5.1.2 - version: 5.2.1(vitest@3.2.4) + specifier: ^6.1.0 + version: 6.1.0(vitest@4.0.15) '@biomejs/biome': specifier: 2.0.0 version: 2.0.0 '@graphql-codegen/cli': specifier: ^5.0.7 - version: 5.0.7(@parcel/watcher@2.5.1)(@types/node@24.9.2)(graphql@16.11.0)(typescript@5.8.3) + version: 5.0.7(@parcel/watcher@2.5.1)(@types/node@24.10.4)(graphql@16.11.0)(typescript@5.8.3) '@graphql-codegen/introspection': specifier: ^4.0.3 version: 4.0.3(graphql@16.11.0) @@ -58,10 +70,13 @@ importers: version: 4.3.2 '@types/node': specifier: ^24.7.2 - version: 24.9.2 + version: 24.10.4 + '@vitest/browser-playwright': + specifier: 'catalog:' + version: 4.0.15(playwright@1.56.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.15) '@vitest/coverage-v8': - specifier: ^3.2.4 - version: 3.2.4(@vitest/browser@3.2.4)(vitest@3.2.4) + specifier: 'catalog:' + version: 4.0.15(@vitest/browser@4.0.15(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.15))(vitest@4.0.15) azurite: specifier: ^3.35.0 version: 3.35.0 @@ -73,7 +88,7 @@ importers: version: 3.0.2 knip: specifier: ^5.61.1 - version: 5.73.3(@types/node@24.9.2)(typescript@5.8.3) + version: 5.73.3(@types/node@24.10.4)(typescript@5.8.3) rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -93,11 +108,11 @@ importers: specifier: ^5.8.3 version: 5.8.3 vite: - specifier: ^7.0.4 - version: 7.1.12(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 'catalog:' + version: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.9.2)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 'catalog:' + version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) apps/api: dependencies: @@ -179,10 +194,10 @@ importers: dependencies: '@docusaurus/core': specifier: 3.9.2 - version: 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) + version: 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) '@docusaurus/preset-classic': specifier: 3.9.2 - version: 3.9.2(@algolia/client-search@5.41.0)(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.6.3) + version: 3.9.2(@algolia/client-search@5.41.0)(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.8.3) '@mdx-js/react': specifier: ^3.0.0 version: 3.1.1(@types/react@19.2.2)(react@19.2.0) @@ -210,7 +225,7 @@ importers: version: 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/plugin-content-docs': specifier: 3.9.2 - version: 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) + version: 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) '@docusaurus/types': specifier: 3.9.2 version: 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -227,17 +242,17 @@ importers: specifier: ^19.1.6 version: 19.2.2(@types/react@19.2.2) '@vitest/coverage-v8': - specifier: ^3.2.4 - version: 3.2.4(@vitest/browser@3.2.4)(vitest@3.2.4) + specifier: 'catalog:' + version: 4.0.15(@vitest/browser@4.0.15(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.15))(vitest@4.0.15) jsdom: specifier: ^26.1.0 version: 26.1.0 typescript: - specifier: ~5.6.2 - version: 5.6.3 + specifier: ^5.8.3 + version: 5.8.3 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.4)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 'catalog:' + version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) apps/ui-sharethrift: dependencies: @@ -292,7 +307,7 @@ importers: version: link:../../packages/cellix/vitest-config '@chromatic-com/storybook': specifier: ^4.1.0 - version: 4.1.2(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))) + version: 4.1.2(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))) '@eslint/js': specifier: ^9.30.1 version: 9.38.0 @@ -301,19 +316,19 @@ importers: version: 3.2.0(graphql@16.11.0) '@storybook/addon-a11y': specifier: ^9.1.17 - version: 9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))) + version: 9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))) '@storybook/addon-docs': specifier: ^9.1.17 - version: 9.1.17(@types/react@19.2.2)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))) + version: 9.1.17(@types/react@19.2.2)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))) '@storybook/addon-vitest': specifier: ^9.1.17 - version: 9.1.17(@vitest/browser@3.2.4)(@vitest/runner@3.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vitest@3.2.4) + version: 9.1.17(@vitest/browser-playwright@4.0.15)(@vitest/browser@4.0.15(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.15))(@vitest/runner@4.0.15)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vitest@4.0.15) '@storybook/react': specifier: ^9.1.17 - version: 9.1.17(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(typescript@5.8.3) + version: 9.1.17(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(typescript@5.8.3) '@storybook/react-vite': specifier: ^9.1.17 - version: 9.1.17(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.5)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(typescript@5.8.3)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 9.1.17(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.5)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(typescript@5.8.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@testing-library/jest-dom': specifier: ^6.9.1 version: 6.9.1 @@ -328,13 +343,10 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.7.0 - version: 4.7.0(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@vitest/browser': - specifier: 3.2.4 - version: 3.2.4(playwright@1.56.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) + version: 4.7.0(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/coverage-v8': - specifier: ^3.2.4 - version: 3.2.4(@vitest/browser@3.2.4)(vitest@3.2.4) + specifier: 'catalog:' + version: 4.0.15(@vitest/browser@4.0.15(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.15))(vitest@4.0.15) eslint: specifier: ^9.30.1 version: 9.38.0(jiti@2.6.1) @@ -349,7 +361,7 @@ importers: version: 16.4.0 storybook: specifier: 'catalog:' - version: 9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) typescript: specifier: ~5.8.3 version: 5.8.3 @@ -357,11 +369,11 @@ importers: specifier: ^8.35.1 version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.8.3) vite: - specifier: ^7.1.2 - version: 7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 'catalog:' + version: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.4)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 'catalog:' + version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages/cellix/api-services-spec: devDependencies: @@ -564,6 +576,21 @@ importers: specifier: workspace:* version: link:../typescript-config + packages/cellix/test-utils: + devDependencies: + '@cellix/typescript-config': + specifier: workspace:* + version: link:../typescript-config + '@cellix/vitest-config': + specifier: workspace:* + version: link:../vitest-config + rimraf: + specifier: ^6.0.1 + version: 6.0.1 + typescript: + specifier: ^5.8.3 + version: 5.8.3 + packages/cellix/typescript-config: {} packages/cellix/ui-core: @@ -598,7 +625,7 @@ importers: version: 9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))) '@storybook/addon-vitest': specifier: ^9.1.17 - version: 9.1.17(@vitest/browser@3.2.4)(@vitest/runner@3.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vitest@3.2.4) + version: 9.1.17(@vitest/browser-playwright@4.0.15)(@vitest/browser@4.0.15(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.15))(@vitest/runner@4.0.15)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vitest@4.0.15) '@storybook/react': specifier: ^9.1.17 version: 9.1.17(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(typescript@5.8.3) @@ -608,12 +635,9 @@ importers: '@types/react': specifier: ^19.1.16 version: 19.2.2 - '@vitest/browser': - specifier: ^3.2.4 - version: 3.2.4(playwright@1.56.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) '@vitest/coverage-v8': - specifier: ^3.2.4 - version: 3.2.4(@vitest/browser@3.2.4)(vitest@3.2.4) + specifier: 'catalog:' + version: 4.0.15(@vitest/browser@4.0.15(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.15))(vitest@4.0.15) jsdom: specifier: ^26.1.0 version: 26.1.0 @@ -633,17 +657,20 @@ importers: specifier: ^5.8.3 version: 5.8.3 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.4)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 'catalog:' + version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages/cellix/vitest-config: dependencies: '@storybook/addon-vitest': specifier: ^9.1.17 - version: 9.1.17(@vitest/browser@3.2.4)(@vitest/runner@3.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vitest@3.2.4) + version: 9.1.17(@vitest/browser-playwright@4.0.15)(@vitest/browser@4.0.15(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.15))(@vitest/runner@4.0.15)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vitest@4.0.15) + '@vitest/browser-playwright': + specifier: 'catalog:' + version: 4.0.15(playwright@1.56.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.15) vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.4)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 'catalog:' + version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) devDependencies: '@cellix/typescript-config': specifier: workspace:* @@ -882,7 +909,7 @@ importers: version: link:../mock-messaging-server '@types/node': specifier: ^22.0.0 - version: 22.19.0 + version: 22.19.3 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -907,13 +934,13 @@ importers: version: link:../../cellix/vitest-config '@types/node': specifier: ^22.0.0 - version: 22.19.0 + version: 22.19.3 typescript: specifier: ^5.8.3 version: 5.8.3 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 'catalog:' + version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.19.3)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages/sthrift/mock-messaging-server: dependencies: @@ -938,7 +965,7 @@ importers: version: 4.17.25 '@types/node': specifier: ^22.0.0 - version: 22.19.0 + version: 22.19.3 '@types/supertest': specifier: ^6.0.2 version: 6.0.3 @@ -955,8 +982,8 @@ importers: specifier: ^5.8.3 version: 5.8.3 vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 'catalog:' + version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.19.3)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages/sthrift/mock-mongodb-memory-server: dependencies: @@ -1015,7 +1042,7 @@ importers: version: link:../../cellix/vitest-config '@types/node': specifier: ^20.0.0 - version: 20.19.25 + version: 20.19.27 typescript: specifier: ^5.8.3 version: 5.8.3 @@ -1056,6 +1083,9 @@ importers: '@cellix/payment-service': specifier: workspace:* version: link:../../cellix/payment-service + '@cellix/test-utils': + specifier: workspace:* + version: link:../../cellix/test-utils '@sthrift/data-sources-mongoose-models': specifier: workspace:* version: link:../data-sources-mongoose-models @@ -1288,37 +1318,34 @@ importers: version: link:../../cellix/vitest-config '@chromatic-com/storybook': specifier: ^4.1.1 - version: 4.1.2(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))) + version: 4.1.2(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))) '@storybook/addon-a11y': specifier: ^9.1.17 - version: 9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))) + version: 9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))) '@storybook/addon-docs': specifier: ^9.1.17 - version: 9.1.17(@types/react@19.2.2)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))) + version: 9.1.17(@types/react@19.2.2)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))) '@storybook/addon-onboarding': specifier: ^9.1.17 - version: 9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))) + version: 9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))) '@storybook/addon-vitest': specifier: ^9.1.17 - version: 9.1.17(@vitest/browser@3.2.4)(@vitest/runner@3.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vitest@3.2.4) + version: 9.1.17(@vitest/browser-playwright@4.0.15)(@vitest/browser@4.0.15(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.15))(@vitest/runner@4.0.15)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vitest@4.0.15) '@storybook/react': specifier: ^9.1.17 - version: 9.1.17(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(typescript@5.8.3) + version: 9.1.17(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(typescript@5.8.3) '@storybook/react-vite': specifier: ^9.1.17 - version: 9.1.17(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.5)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(typescript@5.8.3)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 9.1.17(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.5)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(typescript@5.8.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@types/react': specifier: ^19.1.11 version: 19.2.2 '@types/react-dom': specifier: ^19.1.6 version: 19.2.2(@types/react@19.2.2) - '@vitest/browser': - specifier: ^3.2.4 - version: 3.2.4(playwright@1.56.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) '@vitest/coverage-v8': - specifier: ^3.2.4 - version: 3.2.4(@vitest/browser@3.2.4)(vitest@3.2.4) + specifier: 'catalog:' + version: 4.0.15(@vitest/browser@4.0.15(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.15))(vitest@4.0.15) jsdom: specifier: ^26.1.0 version: 26.1.0 @@ -1327,16 +1354,16 @@ importers: version: 6.0.1 storybook: specifier: 'catalog:' - version: 9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) typescript: specifier: ^5.8.3 version: 5.8.3 vite: - specifier: ^7.0.4 - version: 7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 'catalog:' + version: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.4)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 'catalog:' + version: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages: @@ -1422,15 +1449,11 @@ packages: resolution: {integrity: sha512-tYv3rGbhBS0eZ5D8oCgV88iuWILROiemk+tQ3YsAKZv2J4kKUNvKkrX/If/SreRy4MGP2uJzMlyKcfSfO2mrsQ==} engines: {node: '>= 14.0.0'} - '@amiceli/vitest-cucumber@5.2.1': - resolution: {integrity: sha512-gAs0j2CMGzcxe/11ZLWKUyiII7U4AF5kFBzptyisFCWhcQagZ3rIXLV5cNj5RIhIjxqJTSdaam9389Lq3u6cbA==} + '@amiceli/vitest-cucumber@6.1.0': + resolution: {integrity: sha512-3GE3F8tHBkvf04PbVfH5hopNNwPjlV8ebf7NAfxPaKG31IZTWKl0VvYt0qHNepahdR7MVB6dOpW+e/RTP08FZg==} hasBin: true peerDependencies: - vitest: ^3.1.4 - - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} + vitest: ^4.0.4 '@ant-design/colors@7.2.1': resolution: {integrity: sha512-lCHDcEzieu4GA3n8ELeZ5VQ8pKQAWcGGLRTQ50aQM2iqPpq2evTxER84jfdPvsPAtEcZ7m44NI45edFMo8oOYQ==} @@ -3792,10 +3815,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'} - '@jest/schemas@29.6.3': resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4699,6 +4718,9 @@ packages: engines: {node: '>= 18'} hasBin: true + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@storybook/addon-a11y@9.1.17': resolution: {integrity: sha512-xP2Nb+idph2r0wE2Lc3z7LjtyXxTS+U+mJWmS8hw5w0oU2TkVdV7Ew/V7/iNl5jIWMXIp9HCRmcJuKSSGuertA==} peerDependencies: @@ -5056,18 +5078,15 @@ packages: '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - '@types/node@20.19.25': - resolution: {integrity: sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==} + '@types/node@20.19.27': + resolution: {integrity: sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==} - '@types/node@22.19.0': - resolution: {integrity: sha512-xpr/lmLPQEj+TUnHmR+Ab91/glhJvsqcjB+yY0Ix9GO70H6Lb4FHH5GeqdOE5btAx7eIMwuHkp4H2MSkLcqWbA==} + '@types/node@22.19.3': + resolution: {integrity: sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==} '@types/node@24.10.4': resolution: {integrity: sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==} - '@types/node@24.9.2': - resolution: {integrity: sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==} - '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -5244,26 +5263,22 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - '@vitest/browser@3.2.4': - resolution: {integrity: sha512-tJxiPrWmzH8a+w9nLKlQMzAKX/7VjFs50MWgcAj7p9XQ7AQ9/35fByFYptgPELyLw+0aixTnC4pUWV+APcZ/kw==} + '@vitest/browser-playwright@4.0.15': + resolution: {integrity: sha512-94yVpDbb+ykiT7mK6ToonGnq2GIHEQGBTZTAzGxBGQXcVNCh54YKC2/WkfaDzxy0m6Kgw05kq3FYHKHu+wRdIA==} peerDependencies: playwright: '*' - safaridriver: '*' - vitest: 3.2.4 - webdriverio: ^7.0.0 || ^8.0.0 || ^9.0.0 - peerDependenciesMeta: - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true + vitest: 4.0.15 + + '@vitest/browser@4.0.15': + resolution: {integrity: sha512-zedtczX688KehaIaAv7m25CeDLb0gBtAOa2Oi1G1cqvSO5aLSVfH6lpZMJLW8BKYuWMxLQc9/5GYoM+jgvGIrw==} + peerDependencies: + vitest: 4.0.15 - '@vitest/coverage-v8@3.2.4': - resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} + '@vitest/coverage-v8@4.0.15': + resolution: {integrity: sha512-FUJ+1RkpTFW7rQITdgTi93qOCWJobWhBirEPCeXh2SW2wsTlFxy51apDz5gzG+ZEYt/THvWeNmhdAoS9DTwpCw==} peerDependencies: - '@vitest/browser': 3.2.4 - vitest: 3.2.4 + '@vitest/browser': 4.0.15 + vitest: 4.0.15 peerDependenciesMeta: '@vitest/browser': optional: true @@ -5271,6 +5286,9 @@ packages: '@vitest/expect@3.2.4': resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/expect@4.0.15': + resolution: {integrity: sha512-Gfyva9/GxPAWXIWjyGDli9O+waHDC0Q0jaLdFP1qPAUUfo1FEXPXUfUkp3eZA0sSq340vPycSyOlYUeM15Ft1w==} + '@vitest/mocker@3.2.4': resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} peerDependencies: @@ -5282,21 +5300,41 @@ packages: vite: optional: true + '@vitest/mocker@4.0.15': + resolution: {integrity: sha512-CZ28GLfOEIFkvCFngN8Sfx5h+Se0zN+h4B7yOsPVCcgtiO7t5jt9xQh2E1UkFep+eb9fjyMfuC5gBypwb07fvQ==} + peerDependencies: + msw: ^2.4.9 + 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/runner@3.2.4': - resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + '@vitest/pretty-format@4.0.15': + resolution: {integrity: sha512-SWdqR8vEv83WtZcrfLNqlqeQXlQLh2iilO1Wk1gv4eiHKjEzvgHb2OVc3mIPyhZE6F+CtfYjNlDJwP5MN6Km7A==} - '@vitest/snapshot@3.2.4': - resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + '@vitest/runner@4.0.15': + resolution: {integrity: sha512-+A+yMY8dGixUhHmNdPUxOh0la6uVzun86vAbuMT3hIDxMrAOmn5ILBHm8ajrqHE0t8R9T1dGnde1A5DTnmi3qw==} + + '@vitest/snapshot@4.0.15': + resolution: {integrity: sha512-A7Ob8EdFZJIBjLjeO0DZF4lqR6U7Ydi5/5LIZ0xcI+23lYlsYJAfGn8PrIWTYdZQRNnSRlzhg0zyGu37mVdy5g==} '@vitest/spy@3.2.4': resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/spy@4.0.15': + resolution: {integrity: sha512-+EIjOJmnY6mIfdXtE/bnozKEvTC4Uczg19yeZ2vtCz5Yyb0QQ31QWVQ8hswJ3Ysx/K2EqaNsVanjr//2+P3FHw==} + '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vitest/utils@4.0.15': + resolution: {integrity: sha512-HXjPW2w5dxhTD0dLwtYHDnelK3j8sR8cWIaLxr22evTyY6q8pRCjZSmhRWVjBaOVXChQd6AwMzi9pucorXCPZA==} + '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -5840,10 +5878,6 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - cacheable-lookup@7.0.0: resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} engines: {node: '>=14.16'} @@ -5912,6 +5946,10 @@ packages: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} + chai@6.2.1: + resolution: {integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==} + engines: {node: '>=18'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -8435,8 +8473,8 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - magicast@0.3.5: - resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + magicast@0.5.1: + resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} @@ -9060,6 +9098,9 @@ packages: obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + oidc-client-ts@3.3.0: resolution: {integrity: sha512-t13S540ZwFOEZKLYHJwSfITugupW4uYLwuQSSXyKH/wHwZ+7FvgHE7gnNJh1YQIZ1Yd1hKSRjqeXGSUtS0r9JA==} engines: {node: '>=18'} @@ -9314,6 +9355,10 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + pixelmatch@7.1.0: + resolution: {integrity: sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==} + hasBin: true + pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -9332,6 +9377,10 @@ packages: engines: {node: '>=18'} hasBin: true + pngjs@7.0.0: + resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} + engines: {node: '>=14.19.0'} + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -10480,6 +10529,7 @@ packages: scmp@2.1.0: resolution: {integrity: sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==} + deprecated: Just use Node.js's crypto.timingSafeEqual() scroll-into-view-if-needed@3.1.0: resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} @@ -10946,9 +10996,6 @@ packages: resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} engines: {node: '>=14.16'} - strip-literal@3.1.0: - resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} - strip-outer@1.0.1: resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} engines: {node: '>=0.10.0'} @@ -11045,10 +11092,6 @@ packages: engines: {node: '>=10'} hasBin: true - test-exclude@7.0.1: - resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} - engines: {node: '>=18'} - text-decoder@1.2.3: resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} @@ -11098,8 +11141,9 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} @@ -11113,6 +11157,10 @@ packages: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} + tinyspy@4.0.4: resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} engines: {node: '>=14.0.0'} @@ -11375,11 +11423,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - typescript@5.6.3: - resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} - engines: {node: '>=14.17'} - hasBin: true - typescript@5.8.3: resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} @@ -11598,51 +11641,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@7.1.12: - resolution: {integrity: sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - jiti: '>=1.21.0' - less: ^4.0.0 - lightningcss: ^1.21.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 - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - vite@7.3.0: resolution: {integrity: sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -11683,26 +11681,32 @@ packages: yaml: optional: true - vitest@3.2.4: - resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vitest@4.0.15: + resolution: {integrity: sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==} + 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 + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.15 + '@vitest/browser-preview': 4.0.15 + '@vitest/browser-webdriverio': 4.0.15 + '@vitest/ui': 4.0.15 happy-dom: '*' jsdom: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true - '@types/debug': + '@opentelemetry/api': 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 @@ -11812,6 +11816,7 @@ packages: whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation whatwg-mimetype@4.0.0: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} @@ -12141,18 +12146,13 @@ snapshots: dependencies: '@algolia/client-common': 5.41.0 - '@amiceli/vitest-cucumber@5.2.1(vitest@3.2.4)': + '@amiceli/vitest-cucumber@6.1.0(vitest@4.0.15)': dependencies: callsites: 4.2.0 minimist: 1.2.8 parsecurrency: 1.1.1 ts-morph: 26.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.9.2)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + vitest: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) '@ant-design/colors@7.2.1': dependencies: @@ -13411,18 +13411,6 @@ snapshots: '@biomejs/cli-win32-x64@2.0.0': optional: true - '@chromatic-com/storybook@4.1.2(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))': - dependencies: - '@neoconfetti/react': 1.0.0 - chromatic: 12.2.0 - filesize: 10.1.6 - jsonfile: 6.2.0 - storybook: 9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - strip-ansi: 7.1.2 - transitivePeerDependencies: - - '@chromatic-com/cypress' - - '@chromatic-com/playwright' - '@chromatic-com/storybook@4.1.2(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))': dependencies: '@neoconfetti/react': 1.0.0 @@ -13918,7 +13906,7 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/bundler@3.9.2(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3)': + '@docusaurus/bundler@3.9.2(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.28.5 '@docusaurus/babel': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -13937,7 +13925,7 @@ snapshots: mini-css-extract-plugin: 2.9.4(webpack@5.102.1) null-loader: 4.0.1(webpack@5.102.1) postcss: 8.5.6 - postcss-loader: 7.3.4(postcss@8.5.6)(typescript@5.6.3)(webpack@5.102.1) + postcss-loader: 7.3.4(postcss@8.5.6)(typescript@5.8.3)(webpack@5.102.1) postcss-preset-env: 10.4.0(postcss@8.5.6) terser-webpack-plugin: 5.3.14(webpack@5.102.1) tslib: 2.8.1 @@ -13959,10 +13947,10 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/core@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3)': + '@docusaurus/core@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)': dependencies: '@docusaurus/babel': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/bundler': 3.9.2(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) + '@docusaurus/bundler': 3.9.2(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) '@docusaurus/logger': 3.9.2 '@docusaurus/mdx-loader': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/utils': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -14088,13 +14076,13 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/plugin-content-blog@3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3)': + '@docusaurus/plugin-content-blog@3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) '@docusaurus/logger': 3.9.2 '@docusaurus/mdx-loader': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) - '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) + '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/types': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/utils': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/utils-common': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -14129,13 +14117,13 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3)': + '@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) '@docusaurus/logger': 3.9.2 '@docusaurus/mdx-loader': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/module-type-aliases': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/types': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/utils': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/utils-common': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -14169,9 +14157,9 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-content-pages@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3)': + '@docusaurus/plugin-content-pages@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) '@docusaurus/mdx-loader': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/types': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/utils': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -14199,9 +14187,9 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-css-cascade-layers@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3)': + '@docusaurus/plugin-css-cascade-layers@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) '@docusaurus/types': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/utils': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/utils-validation': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -14226,9 +14214,9 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-debug@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3)': + '@docusaurus/plugin-debug@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) '@docusaurus/types': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/utils': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) fs-extra: 11.3.2 @@ -14254,9 +14242,9 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-google-analytics@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3)': + '@docusaurus/plugin-google-analytics@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) '@docusaurus/types': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/utils-validation': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 @@ -14280,9 +14268,9 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-google-gtag@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3)': + '@docusaurus/plugin-google-gtag@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) '@docusaurus/types': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/utils-validation': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@types/gtag.js': 0.0.12 @@ -14307,9 +14295,9 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-google-tag-manager@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3)': + '@docusaurus/plugin-google-tag-manager@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) '@docusaurus/types': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/utils-validation': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 @@ -14333,9 +14321,9 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-sitemap@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3)': + '@docusaurus/plugin-sitemap@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) '@docusaurus/logger': 3.9.2 '@docusaurus/types': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/utils': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -14364,14 +14352,14 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-svgr@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3)': + '@docusaurus/plugin-svgr@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) '@docusaurus/types': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/utils': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/utils-validation': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@svgr/core': 8.1.0(typescript@5.6.3) - '@svgr/webpack': 8.1.0(typescript@5.6.3) + '@svgr/core': 8.1.0(typescript@5.8.3) + '@svgr/webpack': 8.1.0(typescript@5.8.3) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) tslib: 2.8.1 @@ -14394,22 +14382,22 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/preset-classic@3.9.2(@algolia/client-search@5.41.0)(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.6.3)': - dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) - '@docusaurus/plugin-content-blog': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) - '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) - '@docusaurus/plugin-content-pages': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) - '@docusaurus/plugin-css-cascade-layers': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) - '@docusaurus/plugin-debug': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) - '@docusaurus/plugin-google-analytics': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) - '@docusaurus/plugin-google-gtag': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) - '@docusaurus/plugin-google-tag-manager': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) - '@docusaurus/plugin-sitemap': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) - '@docusaurus/plugin-svgr': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) - '@docusaurus/theme-classic': 3.9.2(@types/react@19.2.2)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) - '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/theme-search-algolia': 3.9.2(@algolia/client-search@5.41.0)(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.6.3) + '@docusaurus/preset-classic@3.9.2(@algolia/client-search@5.41.0)(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.8.3)': + dependencies: + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) + '@docusaurus/plugin-content-blog': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) + '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) + '@docusaurus/plugin-content-pages': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) + '@docusaurus/plugin-css-cascade-layers': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) + '@docusaurus/plugin-debug': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) + '@docusaurus/plugin-google-analytics': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) + '@docusaurus/plugin-google-gtag': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) + '@docusaurus/plugin-google-tag-manager': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) + '@docusaurus/plugin-sitemap': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) + '@docusaurus/plugin-svgr': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) + '@docusaurus/theme-classic': 3.9.2(@types/react@19.2.2)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) + '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/theme-search-algolia': 3.9.2(@algolia/client-search@5.41.0)(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.8.3) '@docusaurus/types': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) @@ -14439,16 +14427,16 @@ snapshots: '@types/react': 19.2.2 react: 19.2.0 - '@docusaurus/theme-classic@3.9.2(@types/react@19.2.2)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3)': + '@docusaurus/theme-classic@3.9.2(@types/react@19.2.2)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) '@docusaurus/logger': 3.9.2 '@docusaurus/mdx-loader': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/module-type-aliases': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/plugin-content-blog': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) - '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) - '@docusaurus/plugin-content-pages': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) - '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/plugin-content-blog': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3))(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) + '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) + '@docusaurus/plugin-content-pages': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) + '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/theme-translations': 3.9.2 '@docusaurus/types': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/utils': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -14486,11 +14474,11 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/theme-common@3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@docusaurus/theme-common@3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@docusaurus/mdx-loader': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/module-type-aliases': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) + '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) '@docusaurus/utils': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/utils-common': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@types/history': 4.7.11 @@ -14510,13 +14498,13 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/theme-search-algolia@3.9.2(@algolia/client-search@5.41.0)(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.6.3)': + '@docusaurus/theme-search-algolia@3.9.2(@algolia/client-search@5.41.0)(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(@types/react@19.2.2)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@5.8.3)': dependencies: '@docsearch/react': 3.9.0(@algolia/client-search@5.41.0)(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3) - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) + '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) '@docusaurus/logger': 3.9.2 - '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3) - '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.6.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3) + '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.2)(react@19.2.0))(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.8.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/theme-translations': 3.9.2 '@docusaurus/utils': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/utils-validation': 3.9.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -14622,7 +14610,7 @@ snapshots: globby: 11.1.0 gray-matter: 4.0.3 jiti: 1.21.7 - js-yaml: 4.1.0 + js-yaml: 4.1.1 lodash: 4.17.21 micromatch: 4.0.8 p-queue: 6.6.2 @@ -14947,7 +14935,7 @@ snapshots: globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.0 + js-yaml: 4.1.1 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: @@ -14972,7 +14960,7 @@ snapshots: graphql: 16.11.0 tslib: 2.6.3 - '@graphql-codegen/cli@5.0.7(@parcel/watcher@2.5.1)(@types/node@24.9.2)(graphql@16.11.0)(typescript@5.8.3)': + '@graphql-codegen/cli@5.0.7(@parcel/watcher@2.5.1)(@types/node@24.10.4)(graphql@16.11.0)(typescript@5.8.3)': dependencies: '@babel/generator': 7.28.5 '@babel/template': 7.27.2 @@ -14983,12 +14971,12 @@ snapshots: '@graphql-tools/apollo-engine-loader': 8.0.22(graphql@16.11.0) '@graphql-tools/code-file-loader': 8.1.22(graphql@16.11.0) '@graphql-tools/git-loader': 8.0.26(graphql@16.11.0) - '@graphql-tools/github-loader': 8.0.22(@types/node@24.9.2)(graphql@16.11.0) + '@graphql-tools/github-loader': 8.0.22(@types/node@24.10.4)(graphql@16.11.0) '@graphql-tools/graphql-file-loader': 8.1.2(graphql@16.11.0) '@graphql-tools/json-file-loader': 8.0.20(graphql@16.11.0) '@graphql-tools/load': 8.1.2(graphql@16.11.0) - '@graphql-tools/prisma-loader': 8.0.17(@types/node@24.9.2)(graphql@16.11.0) - '@graphql-tools/url-loader': 8.0.33(@types/node@24.9.2)(graphql@16.11.0) + '@graphql-tools/prisma-loader': 8.0.17(@types/node@24.10.4)(graphql@16.11.0) + '@graphql-tools/url-loader': 8.0.33(@types/node@24.10.4)(graphql@16.11.0) '@graphql-tools/utils': 10.9.1(graphql@16.11.0) '@whatwg-node/fetch': 0.10.11 chalk: 4.1.2 @@ -14996,8 +14984,8 @@ snapshots: debounce: 1.2.1 detect-indent: 6.1.0 graphql: 16.11.0 - graphql-config: 5.1.5(@types/node@24.9.2)(graphql@16.11.0)(typescript@5.8.3) - inquirer: 8.2.7(@types/node@24.9.2) + graphql-config: 5.1.5(@types/node@24.10.4)(graphql@16.11.0)(typescript@5.8.3) + inquirer: 8.2.7(@types/node@24.10.4) is-glob: 4.0.3 jiti: 1.21.7 json-to-pretty-yaml: 1.2.2 @@ -15246,7 +15234,7 @@ snapshots: - uWebSockets.js - utf-8-validate - '@graphql-tools/executor-http@1.3.3(@types/node@24.9.2)(graphql@16.11.0)': + '@graphql-tools/executor-http@1.3.3(@types/node@24.10.4)(graphql@16.11.0)': dependencies: '@graphql-hive/signal': 1.0.0 '@graphql-tools/executor-common': 0.0.4(graphql@16.11.0) @@ -15256,7 +15244,7 @@ snapshots: '@whatwg-node/fetch': 0.10.11 '@whatwg-node/promise-helpers': 1.3.2 graphql: 16.11.0 - meros: 1.3.2(@types/node@24.9.2) + meros: 1.3.2(@types/node@24.10.4) tslib: 2.8.1 transitivePeerDependencies: - '@types/node' @@ -15295,9 +15283,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@graphql-tools/github-loader@8.0.22(@types/node@24.9.2)(graphql@16.11.0)': + '@graphql-tools/github-loader@8.0.22(@types/node@24.10.4)(graphql@16.11.0)': dependencies: - '@graphql-tools/executor-http': 1.3.3(@types/node@24.9.2)(graphql@16.11.0) + '@graphql-tools/executor-http': 1.3.3(@types/node@24.10.4)(graphql@16.11.0) '@graphql-tools/graphql-tag-pluck': 8.3.21(graphql@16.11.0) '@graphql-tools/utils': 10.9.1(graphql@16.11.0) '@whatwg-node/fetch': 0.10.11 @@ -15381,11 +15369,11 @@ snapshots: '@graphql-tools/optimize@2.0.0(graphql@16.11.0)': dependencies: graphql: 16.11.0 - tslib: 2.6.3 + tslib: 2.8.1 - '@graphql-tools/prisma-loader@8.0.17(@types/node@24.9.2)(graphql@16.11.0)': + '@graphql-tools/prisma-loader@8.0.17(@types/node@24.10.4)(graphql@16.11.0)': dependencies: - '@graphql-tools/url-loader': 8.0.33(@types/node@24.9.2)(graphql@16.11.0) + '@graphql-tools/url-loader': 8.0.33(@types/node@24.10.4)(graphql@16.11.0) '@graphql-tools/utils': 10.9.1(graphql@16.11.0) '@types/js-yaml': 4.0.9 '@whatwg-node/fetch': 0.10.11 @@ -15417,7 +15405,7 @@ snapshots: '@ardatan/relay-compiler': 12.0.3(graphql@16.11.0) '@graphql-tools/utils': 10.9.1(graphql@16.11.0) graphql: 16.11.0 - tslib: 2.6.3 + tslib: 2.8.1 transitivePeerDependencies: - encoding @@ -15436,10 +15424,10 @@ snapshots: tslib: 2.8.1 value-or-promise: 1.0.11 - '@graphql-tools/url-loader@8.0.33(@types/node@24.9.2)(graphql@16.11.0)': + '@graphql-tools/url-loader@8.0.33(@types/node@24.10.4)(graphql@16.11.0)': dependencies: '@graphql-tools/executor-graphql-ws': 2.0.7(graphql@16.11.0) - '@graphql-tools/executor-http': 1.3.3(@types/node@24.9.2)(graphql@16.11.0) + '@graphql-tools/executor-http': 1.3.3(@types/node@24.10.4)(graphql@16.11.0) '@graphql-tools/executor-legacy-ws': 1.1.19(graphql@16.11.0) '@graphql-tools/utils': 10.9.1(graphql@16.11.0) '@graphql-tools/wrap': 10.1.4(graphql@16.11.0) @@ -15515,12 +15503,12 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@inquirer/external-editor@1.0.2(@types/node@24.9.2)': + '@inquirer/external-editor@1.0.2(@types/node@24.10.4)': dependencies: chardet: 2.1.0 iconv-lite: 0.7.0 optionalDependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.4 '@isaacs/balanced-match@4.0.1': {} @@ -15537,8 +15525,6 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@istanbuljs/schema@0.1.3': {} - '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 @@ -15548,19 +15534,10 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.9.2 + '@types/node': 24.10.4 '@types/yargs': 17.0.34 chalk: 4.1.2 - '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.8.3)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': - dependencies: - glob: 10.5.0 - magic-string: 0.30.21 - react-docgen-typescript: 2.4.0(typescript@5.8.3) - vite: 7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - optionalDependencies: - typescript: 5.8.3 - '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.8.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: glob: 10.5.0 @@ -16529,11 +16506,7 @@ snapshots: - debug - react-native-b4a - '@storybook/addon-a11y@9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))': - dependencies: - '@storybook/global': 5.0.0 - axe-core: 4.11.0 - storybook: 9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@standard-schema/spec@1.0.0': {} '@storybook/addon-a11y@9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))': dependencies: @@ -16541,19 +16514,6 @@ snapshots: axe-core: 4.11.0 storybook: 9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@storybook/addon-docs@9.1.17(@types/react@19.2.2)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))': - dependencies: - '@mdx-js/react': 3.1.1(@types/react@19.2.2)(react@19.2.0) - '@storybook/csf-plugin': 9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))) - '@storybook/icons': 1.6.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@storybook/react-dom-shim': 9.1.17(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - storybook: 9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - '@storybook/addon-docs@9.1.17(@types/react@19.2.2)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))': dependencies: '@mdx-js/react': 3.1.1(@types/react@19.2.2)(react@19.2.0) @@ -16567,30 +16527,11 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@storybook/addon-onboarding@9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))': - dependencies: - storybook: 9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@storybook/addon-onboarding@9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))': dependencies: storybook: 9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@storybook/addon-vitest@9.1.17(@vitest/browser@3.2.4)(@vitest/runner@3.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vitest@3.2.4)': - dependencies: - '@storybook/global': 5.0.0 - '@storybook/icons': 1.6.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - prompts: 2.4.2 - storybook: 9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - ts-dedent: 2.2.0 - optionalDependencies: - '@vitest/browser': 3.2.4(playwright@1.56.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) - '@vitest/runner': 3.2.4 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.4)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - transitivePeerDependencies: - - react - - react-dom - - '@storybook/addon-vitest@9.1.17(@vitest/browser@3.2.4)(@vitest/runner@3.2.4)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vitest@3.2.4)': + '@storybook/addon-vitest@9.1.17(@vitest/browser-playwright@4.0.15)(@vitest/browser@4.0.15(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.15))(@vitest/runner@4.0.15)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vitest@4.0.15)': dependencies: '@storybook/global': 5.0.0 '@storybook/icons': 1.6.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -16598,20 +16539,14 @@ snapshots: storybook: 9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) ts-dedent: 2.2.0 optionalDependencies: - '@vitest/browser': 3.2.4(playwright@1.56.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) - '@vitest/runner': 3.2.4 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.4)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + '@vitest/browser': 4.0.15(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.15) + '@vitest/browser-playwright': 4.0.15(playwright@1.56.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.15) + '@vitest/runner': 4.0.15 + vitest: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - react - react-dom - '@storybook/builder-vite@9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': - dependencies: - '@storybook/csf-plugin': 9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))) - storybook: 9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - ts-dedent: 2.2.0 - vite: 7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - '@storybook/builder-vite@9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@storybook/csf-plugin': 9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))) @@ -16619,11 +16554,6 @@ snapshots: ts-dedent: 2.2.0 vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - '@storybook/csf-plugin@9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))': - dependencies: - storybook: 9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - unplugin: 1.16.1 - '@storybook/csf-plugin@9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))': dependencies: storybook: 9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) @@ -16636,38 +16566,12 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - '@storybook/react-dom-shim@9.1.17(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))': - dependencies: - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - storybook: 9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@storybook/react-dom-shim@9.1.17(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))': dependencies: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) storybook: 9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@storybook/react-vite@9.1.17(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.5)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(typescript@5.8.3)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': - dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.8.3)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@rollup/pluginutils': 5.3.0(rollup@4.53.5) - '@storybook/builder-vite': 9.1.17(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@storybook/react': 9.1.17(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(typescript@5.8.3) - find-up: 7.0.0 - magic-string: 0.30.21 - react: 19.2.0 - react-docgen: 8.0.2 - react-dom: 19.2.0(react@19.2.0) - resolve: 1.22.11 - storybook: 9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - tsconfig-paths: 4.2.0 - vite: 7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - transitivePeerDependencies: - - rollup - - supports-color - - typescript - '@storybook/react-vite@9.1.17(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.5)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(typescript@5.8.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.8.3)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) @@ -16688,16 +16592,6 @@ snapshots: - supports-color - typescript - '@storybook/react@9.1.17(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(typescript@5.8.3)': - dependencies: - '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 9.1.17(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - storybook: 9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - optionalDependencies: - typescript: 5.8.3 - '@storybook/react@9.1.17(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)))(typescript@5.8.3)': dependencies: '@storybook/global': 5.0.0 @@ -16752,12 +16646,12 @@ snapshots: '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.28.5) '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.28.5) - '@svgr/core@8.1.0(typescript@5.6.3)': + '@svgr/core@8.1.0(typescript@5.8.3)': dependencies: '@babel/core': 7.28.5 '@svgr/babel-preset': 8.1.0(@babel/core@7.28.5) camelcase: 6.3.0 - cosmiconfig: 8.3.6(typescript@5.6.3) + cosmiconfig: 8.3.6(typescript@5.8.3) snake-case: 3.0.4 transitivePeerDependencies: - supports-color @@ -16768,35 +16662,35 @@ snapshots: '@babel/types': 7.28.5 entities: 4.5.0 - '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.6.3))': + '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.8.3))': dependencies: '@babel/core': 7.28.5 '@svgr/babel-preset': 8.1.0(@babel/core@7.28.5) - '@svgr/core': 8.1.0(typescript@5.6.3) + '@svgr/core': 8.1.0(typescript@5.8.3) '@svgr/hast-util-to-babel-ast': 8.0.0 svg-parser: 2.0.4 transitivePeerDependencies: - supports-color - '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.6.3))(typescript@5.6.3)': + '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.8.3))(typescript@5.8.3)': dependencies: - '@svgr/core': 8.1.0(typescript@5.6.3) - cosmiconfig: 8.3.6(typescript@5.6.3) + '@svgr/core': 8.1.0(typescript@5.8.3) + cosmiconfig: 8.3.6(typescript@5.8.3) deepmerge: 4.3.1 svgo: 3.3.2 transitivePeerDependencies: - typescript - '@svgr/webpack@8.1.0(typescript@5.6.3)': + '@svgr/webpack@8.1.0(typescript@5.8.3)': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-constant-elements': 7.27.1(@babel/core@7.28.5) '@babel/preset-env': 7.28.5(@babel/core@7.28.5) '@babel/preset-react': 7.28.5(@babel/core@7.28.5) '@babel/preset-typescript': 7.28.5(@babel/core@7.28.5) - '@svgr/core': 8.1.0(typescript@5.6.3) - '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.6.3)) - '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.6.3))(typescript@5.6.3) + '@svgr/core': 8.1.0(typescript@5.8.3) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3)) + '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3))(typescript@5.8.3) transitivePeerDependencies: - supports-color - typescript @@ -16898,11 +16792,11 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 24.9.2 + '@types/node': 24.10.4 '@types/bonjour@3.5.13': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.4 '@types/chai@5.2.3': dependencies: @@ -16912,11 +16806,11 @@ snapshots: '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 5.1.0 - '@types/node': 24.9.2 + '@types/node': 24.10.4 '@types/connect@3.4.38': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.4 '@types/cookiejar@2.1.5': {} @@ -16946,14 +16840,14 @@ snapshots: '@types/express-serve-static-core@4.19.7': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.4 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 '@types/express-serve-static-core@5.1.0': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.4 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -16985,7 +16879,7 @@ snapshots: '@types/http-proxy@1.17.17': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.4 '@types/istanbul-lib-coverage@2.0.6': {} @@ -17004,7 +16898,7 @@ snapshots: '@types/jsonwebtoken@9.0.10': dependencies: '@types/ms': 2.1.0 - '@types/node': 24.9.2 + '@types/node': 24.10.4 '@types/lodash@4.17.20': {} @@ -17024,15 +16918,15 @@ snapshots: '@types/node-forge@1.3.14': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.4 '@types/node@17.0.45': {} - '@types/node@20.19.25': + '@types/node@20.19.27': dependencies: undici-types: 6.21.0 - '@types/node@22.19.0': + '@types/node@22.19.3': dependencies: undici-types: 6.21.0 @@ -17040,10 +16934,6 @@ snapshots: dependencies: undici-types: 7.16.0 - '@types/node@24.9.2': - dependencies: - undici-types: 7.16.0 - '@types/normalize-package-data@2.4.4': {} '@types/prismjs@1.26.5': {} @@ -17079,7 +16969,7 @@ snapshots: '@types/readable-stream@4.0.22': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.4 '@types/resolve@1.20.6': {} @@ -17087,18 +16977,18 @@ snapshots: '@types/sax@1.2.7': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.4 '@types/semver@7.7.1': {} '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 24.9.2 + '@types/node': 24.10.4 '@types/send@1.2.1': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.4 '@types/serve-index@1.9.4': dependencies: @@ -17107,14 +16997,14 @@ snapshots: '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 24.9.2 + '@types/node': 24.10.4 '@types/send': 0.17.6 '@types/shimmer@1.2.0': {} '@types/sockjs@0.3.36': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.4 '@types/strip-bom@3.0.0': {} @@ -17124,7 +17014,7 @@ snapshots: dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 24.9.2 + '@types/node': 22.19.3 form-data: 4.0.4 '@types/supertest@6.0.3': @@ -17150,7 +17040,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.4 '@types/yargs-parser@21.0.3': {} @@ -17261,7 +17151,7 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react@4.7.0(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitejs/plugin-react@4.7.0(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) @@ -17269,62 +17159,48 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitest/browser@3.2.4(playwright@1.56.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)': + '@vitest/browser-playwright@4.0.15(playwright@1.56.1)(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.15)': dependencies: - '@testing-library/dom': 10.4.1 - '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) - '@vitest/mocker': 3.2.4(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@vitest/utils': 3.2.4 - magic-string: 0.30.21 - sirv: 3.0.2 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.4)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - ws: 8.18.3 - optionalDependencies: + '@vitest/browser': 4.0.15(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.15) + '@vitest/mocker': 4.0.15(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) playwright: 1.56.1 + tinyrainbow: 3.0.3 + vitest: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.19.3)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite + optional: true - '@vitest/browser@3.2.4(playwright@1.56.1)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)': + '@vitest/browser-playwright@4.0.15(playwright@1.56.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.15)': dependencies: - '@testing-library/dom': 10.4.1 - '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) - '@vitest/mocker': 3.2.4(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@vitest/utils': 3.2.4 - magic-string: 0.30.21 - sirv: 3.0.2 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.9.2)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - ws: 8.18.3 - optionalDependencies: + '@vitest/browser': 4.0.15(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.15) + '@vitest/mocker': 4.0.15(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) playwright: 1.56.1 + tinyrainbow: 3.0.3 + vitest: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - optional: true - '@vitest/browser@3.2.4(playwright@1.56.1)(vite@7.3.0(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)': + '@vitest/browser@4.0.15(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.15)': dependencies: - '@testing-library/dom': 10.4.1 - '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) - '@vitest/mocker': 3.2.4(vite@7.3.0(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@vitest/utils': 3.2.4 + '@vitest/mocker': 4.0.15(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/utils': 4.0.15 magic-string: 0.30.21 + pixelmatch: 7.1.0 + pngjs: 7.0.0 sirv: 3.0.2 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + tinyrainbow: 3.0.3 + vitest: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.19.3)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) ws: 8.18.3 - optionalDependencies: - playwright: 1.56.1 transitivePeerDependencies: - bufferutil - msw @@ -17332,43 +17208,39 @@ snapshots: - vite optional: true - '@vitest/browser@3.2.4(playwright@1.56.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)': + '@vitest/browser@4.0.15(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.15)': dependencies: - '@testing-library/dom': 10.4.1 - '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) - '@vitest/mocker': 3.2.4(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@vitest/utils': 3.2.4 + '@vitest/mocker': 4.0.15(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/utils': 4.0.15 magic-string: 0.30.21 + pixelmatch: 7.1.0 + pngjs: 7.0.0 sirv: 3.0.2 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.4)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + tinyrainbow: 3.0.3 + vitest: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) ws: 8.18.3 - optionalDependencies: - playwright: 1.56.1 transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/coverage-v8@3.2.4(@vitest/browser@3.2.4)(vitest@3.2.4)': + '@vitest/coverage-v8@4.0.15(@vitest/browser@4.0.15(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.15))(vitest@4.0.15)': dependencies: - '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 + '@vitest/utils': 4.0.15 ast-v8-to-istanbul: 0.3.8 - 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.2.0 - magic-string: 0.30.21 - magicast: 0.3.5 + magicast: 0.5.1 + obug: 2.1.1 std-env: 3.10.0 - test-exclude: 7.0.1 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.9.2)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + tinyrainbow: 3.0.3 + vitest: 4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: - '@vitest/browser': 3.2.4(playwright@1.56.1)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) + '@vitest/browser': 4.0.15(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.15) transitivePeerDependencies: - supports-color @@ -17380,42 +17252,34 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.12(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/expect@4.0.15': dependencies: - '@vitest/spy': 3.2.4 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 7.1.12(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - - '@vitest/mocker@3.2.4(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': - dependencies: - '@vitest/spy': 3.2.4 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + '@standard-schema/spec': 1.0.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.0.15 + '@vitest/utils': 4.0.15 + chai: 6.2.1 + tinyrainbow: 3.0.3 - '@vitest/mocker@3.2.4(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.1.12(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - '@vitest/mocker@3.2.4(vite@7.3.0(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@4.0.15(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@vitest/spy': 3.2.4 + '@vitest/spy': 4.0.15 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.0(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - optional: true + vite: 7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - '@vitest/mocker@3.2.4(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@4.0.15(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@vitest/spy': 3.2.4 + '@vitest/spy': 4.0.15 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: @@ -17425,15 +17289,18 @@ snapshots: dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.2.4': + '@vitest/pretty-format@4.0.15': dependencies: - '@vitest/utils': 3.2.4 + tinyrainbow: 3.0.3 + + '@vitest/runner@4.0.15': + dependencies: + '@vitest/utils': 4.0.15 pathe: 2.0.3 - strip-literal: 3.1.0 - '@vitest/snapshot@3.2.4': + '@vitest/snapshot@4.0.15': dependencies: - '@vitest/pretty-format': 3.2.4 + '@vitest/pretty-format': 4.0.15 magic-string: 0.30.21 pathe: 2.0.3 @@ -17441,12 +17308,19 @@ snapshots: dependencies: tinyspy: 4.0.4 + '@vitest/spy@4.0.15': {} + '@vitest/utils@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 loupe: 3.2.1 tinyrainbow: 2.0.0 + '@vitest/utils@4.0.15': + dependencies: + '@vitest/pretty-format': 4.0.15 + tinyrainbow: 3.0.3 + '@webassemblyjs/ast@1.14.1': dependencies: '@webassemblyjs/helper-numbers': 1.13.2 @@ -18166,8 +18040,6 @@ snapshots: bytes@3.1.2: {} - cac@6.7.14: {} - cacheable-lookup@7.0.0: {} cacheable-request@10.2.14: @@ -18252,6 +18124,8 @@ snapshots: loupe: 3.2.1 pathval: 2.0.1 + chai@6.2.1: {} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -18291,7 +18165,7 @@ snapshots: path-case: 3.0.4 sentence-case: 3.0.4 snake-case: 3.0.4 - tslib: 2.6.3 + tslib: 2.8.1 char-regex@1.0.2: {} @@ -18576,15 +18450,6 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig@8.3.6(typescript@5.6.3): - dependencies: - import-fresh: 3.3.1 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 - optionalDependencies: - typescript: 5.6.3 - cosmiconfig@8.3.6(typescript@5.8.3): dependencies: import-fresh: 3.3.1 @@ -19426,7 +19291,7 @@ snapshots: eval@0.1.8: dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.4 require-like: 0.1.2 event-stream@3.3.4: @@ -19980,13 +19845,13 @@ snapshots: graphemer@1.4.0: {} - graphql-config@5.1.5(@types/node@24.9.2)(graphql@16.11.0)(typescript@5.8.3): + graphql-config@5.1.5(@types/node@24.10.4)(graphql@16.11.0)(typescript@5.8.3): dependencies: '@graphql-tools/graphql-file-loader': 8.1.2(graphql@16.11.0) '@graphql-tools/json-file-loader': 8.0.20(graphql@16.11.0) '@graphql-tools/load': 8.1.2(graphql@16.11.0) '@graphql-tools/merge': 9.1.1(graphql@16.11.0) - '@graphql-tools/url-loader': 8.0.33(@types/node@24.9.2)(graphql@16.11.0) + '@graphql-tools/url-loader': 8.0.33(@types/node@24.10.4)(graphql@16.11.0) '@graphql-tools/utils': 10.9.1(graphql@16.11.0) cosmiconfig: 8.3.6(typescript@5.8.3) graphql: 16.11.0 @@ -20428,9 +20293,9 @@ snapshots: inline-style-parser@0.2.4: {} - inquirer@8.2.7(@types/node@24.9.2): + inquirer@8.2.7(@types/node@24.10.4): dependencies: - '@inquirer/external-editor': 1.0.2(@types/node@24.9.2) + '@inquirer/external-editor': 1.0.2(@types/node@24.10.4) ansi-escapes: 4.3.2 chalk: 4.1.2 cli-cursor: 3.1.0 @@ -20567,7 +20432,7 @@ snapshots: is-lower-case@2.0.2: dependencies: - tslib: 2.6.3 + tslib: 2.8.1 is-map@2.0.3: {} @@ -20650,7 +20515,7 @@ snapshots: is-upper-case@2.0.2: dependencies: - tslib: 2.6.3 + tslib: 2.8.1 is-weakmap@2.0.2: {} @@ -20727,7 +20592,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.9.2 + '@types/node': 24.10.4 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -20735,13 +20600,13 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.4 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.4 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -20906,10 +20771,10 @@ snapshots: kleur@3.0.3: {} - knip@5.73.3(@types/node@24.9.2)(typescript@5.8.3): + knip@5.73.3(@types/node@24.10.4)(typescript@5.8.3): dependencies: '@nodelib/fs.walk': 1.2.8 - '@types/node': 24.9.2 + '@types/node': 24.10.4 fast-glob: 3.3.3 formatly: 0.3.0 jiti: 2.6.1 @@ -21113,11 +20978,11 @@ snapshots: lower-case-first@2.0.2: dependencies: - tslib: 2.6.3 + tslib: 2.8.1 lower-case@2.0.2: dependencies: - tslib: 2.6.3 + tslib: 2.8.1 lowercase-keys@3.0.0: {} @@ -21141,7 +21006,7 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - magicast@0.3.5: + magicast@0.5.1: dependencies: '@babel/parser': 7.28.5 '@babel/types': 7.28.5 @@ -21390,9 +21255,9 @@ snapshots: merge2@1.4.1: {} - meros@1.3.2(@types/node@24.9.2): + meros@1.3.2(@types/node@24.10.4): optionalDependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.4 methods@1.1.2: {} @@ -22025,6 +21890,8 @@ snapshots: obuf@1.1.2: {} + obug@2.1.1: {} + oidc-client-ts@3.3.0: dependencies: jwt-decode: 4.0.0 @@ -22312,6 +22179,10 @@ snapshots: picomatch@4.0.3: {} + pixelmatch@7.1.0: + dependencies: + pngjs: 7.0.0 + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 @@ -22328,6 +22199,8 @@ snapshots: optionalDependencies: fsevents: 2.3.2 + pngjs@7.0.0: {} + possible-typed-array-names@1.1.0: {} postcss-attribute-case-insensitive@7.0.1(postcss@8.5.6): @@ -22472,9 +22345,9 @@ snapshots: '@csstools/utilities': 2.0.0(postcss@8.5.6) postcss: 8.5.6 - postcss-loader@7.3.4(postcss@8.5.6)(typescript@5.6.3)(webpack@5.102.1): + postcss-loader@7.3.4(postcss@8.5.6)(typescript@5.8.3)(webpack@5.102.1): dependencies: - cosmiconfig: 8.3.6(typescript@5.6.3) + cosmiconfig: 8.3.6(typescript@5.8.3) jiti: 1.21.7 postcss: 8.5.6 semver: 7.7.3 @@ -22837,7 +22710,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 24.9.2 + '@types/node': 24.10.4 long: 5.3.2 proxy-addr@2.0.7: @@ -24088,7 +23961,7 @@ snapshots: sponge-case@1.0.1: dependencies: - tslib: 2.6.3 + tslib: 2.8.1 sprintf-js@1.0.3: {} @@ -24125,28 +23998,6 @@ snapshots: stoppable@1.1.0: {} - storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): - dependencies: - '@storybook/global': 5.0.0 - '@testing-library/jest-dom': 6.9.1 - '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@vitest/spy': 3.2.4 - better-opn: 3.0.2 - esbuild: 0.25.12 - esbuild-register: 3.6.0(esbuild@0.25.12) - recast: 0.23.11 - semver: 7.7.3 - ws: 8.18.3 - transitivePeerDependencies: - - '@testing-library/dom' - - bufferutil - - msw - - supports-color - - utf-8-validate - - vite - storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: '@storybook/global': 5.0.0 @@ -24270,10 +24121,6 @@ snapshots: strip-json-comments@5.0.3: {} - strip-literal@3.1.0: - dependencies: - js-tokens: 9.0.1 - strip-outer@1.0.1: dependencies: escape-string-regexp: 1.0.5 @@ -24347,7 +24194,7 @@ snapshots: swap-case@2.0.2: dependencies: - tslib: 2.6.3 + tslib: 2.8.1 symbol-tree@3.2.4: {} @@ -24400,12 +24247,6 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - test-exclude@7.0.1: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 10.4.5 - minimatch: 9.0.5 - text-decoder@1.2.3: dependencies: b4a: 1.7.3 @@ -24444,7 +24285,7 @@ snapshots: tinybench@2.9.0: {} - tinyexec@0.3.2: {} + tinyexec@1.0.2: {} tinyglobby@0.2.15: dependencies: @@ -24455,11 +24296,13 @@ snapshots: tinyrainbow@2.0.0: {} + tinyrainbow@3.0.3: {} + tinyspy@4.0.4: {} title-case@3.0.3: dependencies: - tslib: 2.6.3 + tslib: 2.8.1 tldts-core@6.1.86: {} @@ -24729,8 +24572,6 @@ snapshots: transitivePeerDependencies: - supports-color - typescript@5.6.3: {} - typescript@5.8.3: {} ua-parser-js@1.0.41: {} @@ -24852,11 +24693,11 @@ snapshots: upper-case-first@2.0.2: dependencies: - tslib: 2.6.3 + tslib: 2.8.1 upper-case@2.0.2: dependencies: - tslib: 2.6.3 + tslib: 2.8.1 uri-js@4.4.1: dependencies: @@ -24934,121 +24775,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-node@3.2.4(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(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.12(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vite-node@3.2.4(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(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.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vite-node@3.2.4(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(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.12(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vite@7.1.12(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): - dependencies: - esbuild: 0.25.11 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.53.5 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 22.19.0 - fsevents: 2.3.3 - jiti: 2.6.1 - lightningcss: 1.30.2 - terser: 5.44.0 - tsx: 4.20.6 - yaml: 2.8.1 - - vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): - dependencies: - esbuild: 0.25.11 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.53.5 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 24.10.4 - fsevents: 2.3.3 - jiti: 2.6.1 - lightningcss: 1.30.2 - terser: 5.44.0 - tsx: 4.20.6 - yaml: 2.8.1 - - vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): - dependencies: - esbuild: 0.25.11 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.53.5 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 24.9.2 - fsevents: 2.3.3 - jiti: 2.6.1 - lightningcss: 1.30.2 - terser: 5.44.0 - tsx: 4.20.6 - yaml: 2.8.1 - - vite@7.3.0(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) @@ -25057,14 +24784,13 @@ snapshots: rollup: 4.53.5 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.19.0 + '@types/node': 22.19.3 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 terser: 5.44.0 tsx: 4.20.6 yaml: 2.8.1 - optional: true vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: @@ -25083,35 +24809,32 @@ snapshots: tsx: 4.20.6 yaml: 2.8.1 - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.19.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.19.3)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: - '@types/chai': 5.2.3 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.12(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(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.3.3 - debug: 4.4.3(supports-color@8.1.1) + '@vitest/expect': 4.0.15 + '@vitest/mocker': 4.0.15(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/pretty-format': 4.0.15 + '@vitest/runner': 4.0.15 + '@vitest/snapshot': 4.0.15 + '@vitest/spy': 4.0.15 + '@vitest/utils': 4.0.15 + es-module-lexer: 1.7.0 expect-type: 1.2.2 magic-string: 0.30.21 + obug: 2.1.1 pathe: 2.0.3 picomatch: 4.0.3 std-env: 3.10.0 tinybench: 2.9.0 - tinyexec: 0.3.2 + tinyexec: 1.0.2 tinyglobby: 0.2.15 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 7.1.12(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + tinyrainbow: 3.0.3 + vite: 7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: - '@types/debug': 4.1.12 - '@types/node': 22.19.0 - '@vitest/browser': 3.2.4(playwright@1.56.1)(vite@7.3.0(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) + '@opentelemetry/api': 1.9.0 + '@types/node': 22.19.3 + '@vitest/browser-playwright': 4.0.15(playwright@1.56.1)(vite@7.3.0(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.15) jsdom: 26.1.0 transitivePeerDependencies: - jiti @@ -25122,40 +24845,36 @@ snapshots: - sass-embedded - stylus - sugarss - - supports-color - terser - tsx - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.10.4)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@24.10.4)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: - '@types/chai': 5.2.3 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(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.3.3 - debug: 4.4.3(supports-color@8.1.1) + '@vitest/expect': 4.0.15 + '@vitest/mocker': 4.0.15(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/pretty-format': 4.0.15 + '@vitest/runner': 4.0.15 + '@vitest/snapshot': 4.0.15 + '@vitest/spy': 4.0.15 + '@vitest/utils': 4.0.15 + es-module-lexer: 1.7.0 expect-type: 1.2.2 magic-string: 0.30.21 + obug: 2.1.1 pathe: 2.0.3 picomatch: 4.0.3 std-env: 3.10.0 tinybench: 2.9.0 - tinyexec: 0.3.2 + tinyexec: 1.0.2 tinyglobby: 0.2.15 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 7.1.12(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + tinyrainbow: 3.0.3 + vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: - '@types/debug': 4.1.12 + '@opentelemetry/api': 1.9.0 '@types/node': 24.10.4 - '@vitest/browser': 3.2.4(playwright@1.56.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) + '@vitest/browser-playwright': 4.0.15(playwright@1.56.1)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.15) jsdom: 26.1.0 transitivePeerDependencies: - jiti @@ -25166,51 +24885,6 @@ snapshots: - sass-embedded - stylus - sugarss - - supports-color - - terser - - tsx - - yaml - - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.9.2)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): - dependencies: - '@types/chai': 5.2.3 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(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.3.3 - debug: 4.4.3(supports-color@8.1.1) - expect-type: 1.2.2 - magic-string: 0.30.21 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.10.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.15 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 7.1.12(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/debug': 4.1.12 - '@types/node': 24.9.2 - '@vitest/browser': 3.2.4(playwright@1.56.1)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) - jsdom: 26.1.0 - transitivePeerDependencies: - - jiti - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - terser - tsx - yaml @@ -25487,7 +25161,7 @@ snapshots: wkx@0.5.0: dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.4 word-wrap@1.2.5: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 3aa966808..be78125a5 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -6,7 +6,12 @@ packages: catalog: mongoose: 8.17.0 mongodb: 6.18.0 + # Vitest 4.x and related testing dependencies + vitest: ^4.0.15 + '@vitest/coverage-v8': ^4.0.15 + '@vitest/browser-playwright': ^4.0.15 storybook: 9.1.17 + vite: ^7.3.0 overrides: node-forge@<1.3.2: '>=1.3.2' \ No newline at end of file diff --git a/turbo.json b/turbo.json index a41efb673..df140205e 100644 --- a/turbo.json +++ b/turbo.json @@ -1,118 +1,73 @@ { - "ui": "tui", - "tasks": { - "build": { - "dependsOn": [ - "^build", - "//#gen" - ], - "inputs": [ - "src/**", - "tsconfig*.json" - ], - "outputs": [ - "dist/**", - "build/**" - ] - }, - "test": { - "dependsOn": [ - "^build", - "@cellix/vitest-config#build" - ], - "inputs": [ - "src/**", - "tests/**", - "vitest*.config.*" - ] - }, - "test:coverage": { - "dependsOn": [ - "build", - "^build", - "@cellix/vitest-config#build" - ], - "inputs": [ - "src/**", - "tests/**", - "vitest*.config.*" - ], - "outputs": [ - "coverage/lcov.info" - ] - }, - "test:watch": { - "dependsOn": [ - "^build" - ], - "cache": false, - "persistent": true - }, - "test:unit": { - "dependsOn": [ - "^build" - ], - "inputs": [ - "src/**", - "tests/**", - "vitest*.config.*" - ], - "outputs": [ - "coverage/**" - ] - }, - "test:integration": { - "dependsOn": [ - "^build" - ], - "inputs": [ - "src/**", - "tests/**", - "vitest*.config.*" - ], - "outputs": [ - "coverage/**" - ] - }, - "storybook": { - "dependsOn": [ - "^build", - "//#gen" - ], - "cache": false, - "persistent": true - }, - "start": { - "cache": false, - "persistent": true - }, - "azurite": { - "cache": false, - "persistent": true - }, - "lint": {}, - "format": { - "outputs": [] - }, - "clean": { - "cache": false, - "outputs": [] - }, - "//#gen": { - "cache": true, - "inputs": [ - "codegen.yml", - "**/*.graphql" - ], - "outputs": [ - "**/generated.ts", - "**/graphql.schema.json", - "**/generated.tsx" - ] - }, - "//#gen:watch": { - "cache": false, - "persistent": true - } - } -} \ No newline at end of file + "ui": "tui", + "tasks": { + "build": { + "dependsOn": ["^build", "//#gen"], + "inputs": ["src/**", "tsconfig*.json"], + "outputs": ["dist/**", "build/**"] + }, + "test": { + "dependsOn": ["^build", "@cellix/vitest-config#build"], + "inputs": ["src/**", "tests/**", "vitest*.config.*"] + }, + "test:coverage:node": { + "dependsOn": ["build", "^build", "@cellix/vitest-config#build"], + "inputs": ["src/**", "tests/**", "vitest*.config.*"], + "outputs": ["coverage/lcov.info"] + }, + "test:coverage:ui": { + "dependsOn": ["build", "^build", "@cellix/vitest-config#build"], + "inputs": ["src/**", "tests/**", "vitest*.config.*"], + "outputs": ["coverage/lcov.info"] + }, + "test:watch": { + "dependsOn": ["^build"], + "cache": false, + "persistent": true + }, + "test:unit": { + "dependsOn": ["^build"], + "inputs": ["src/**", "tests/**", "vitest*.config.*"], + "outputs": ["coverage/**"] + }, + "test:integration": { + "dependsOn": ["^build"], + "inputs": ["src/**", "tests/**", "vitest*.config.*"], + "outputs": ["coverage/**"] + }, + "storybook": { + "dependsOn": ["^build", "//#gen"], + "cache": false, + "persistent": true + }, + "start": { + "cache": false, + "persistent": true + }, + "azurite": { + "cache": false, + "persistent": true + }, + "lint": {}, + "format": { + "outputs": [] + }, + "clean": { + "cache": false, + "outputs": [] + }, + "//#gen": { + "cache": true, + "inputs": ["codegen.yml", "**/*.graphql"], + "outputs": [ + "**/generated.ts", + "**/graphql.schema.json", + "**/generated.tsx" + ] + }, + "//#gen:watch": { + "cache": false, + "persistent": true + } + } +}