diff --git a/packages/cellix/serenity-framework/src/clients/graphql-client.ts b/packages/cellix/serenity-framework/src/clients/graphql-client.ts index 7aaa5076f..1f1bae4c0 100644 --- a/packages/cellix/serenity-framework/src/clients/graphql-client.ts +++ b/packages/cellix/serenity-framework/src/clients/graphql-client.ts @@ -27,6 +27,12 @@ export interface GraphQLClientOptions { fetch?: typeof fetch; } +/** Per-request options for {@link GraphQLClient.execute}. */ +export interface GraphQLExecuteOptions { + /** Additional headers merged with default client headers for this request. */ + headers?: Record; +} + /** * Serenity ability for executing GraphQL operations over HTTP. * @@ -64,14 +70,18 @@ export class GraphQLClient extends Ability { * * @param query GraphQL document text. * @param variables Variables supplied to the operation. + * @param options Per-request execution options. * @throws Error when the HTTP response is not OK or the GraphQL result contains errors. */ - async execute = Record>(query: string, variables: Record = {}): Promise> { + async execute = Record>(query: string, variables: Record = {}, options: GraphQLExecuteOptions = {}): Promise> { + const requestHeaders = options.headers ?? {}; + const response = await this.fetcher(this.apiUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', ...this.resolveHeaders(), + ...requestHeaders, }, body: JSON.stringify({ query, variables }), }); diff --git a/packages/ocom-verification/acceptance-api/package.json b/packages/ocom-verification/acceptance-api/package.json index 06e434cb3..4690c16b1 100644 --- a/packages/ocom-verification/acceptance-api/package.json +++ b/packages/ocom-verification/acceptance-api/package.json @@ -30,6 +30,7 @@ "@ocom/application-services": "workspace:*", "@ocom/context-spec": "workspace:*", "@ocom/data-sources-mongoose-models": "workspace:*", + "@ocom/event-handler": "workspace:*", "@ocom/graphql": "workspace:*", "@ocom/persistence": "workspace:*", "@ocom/service-apollo-server": "workspace:*", diff --git a/packages/ocom-verification/acceptance-api/src/contexts/community/notes/member-notes.ts b/packages/ocom-verification/acceptance-api/src/contexts/community/notes/member-notes.ts new file mode 100644 index 000000000..d5cc0d99f --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/contexts/community/notes/member-notes.ts @@ -0,0 +1,39 @@ +// export interface MemberDetails { +// memberName: string; +// role?: string; +// email?: string; +// } + +export interface MemberProfileExpectation { + name?: string; + email?: string; + bio?: string; + avatarDocumentId?: string; + interests?: string[]; + showInterests?: boolean; + showEmail?: boolean; + showProfile?: boolean; + showLocation?: boolean; + showProperties?: boolean; +} + +export interface MemberNotes { + communityIdsByName: Record; + roleIdsByCommunityName: Record>; + listedMemberNames: string[]; + endUserIdsByLabel: Record; + lastMemberCommunityId: string; + lastMemberId: string; + lastMemberName: string; + lastMemberRoleName: string; + lastMemberRemoved: boolean; + lastLinkedEndUserId: string; + lastExpectedMemberProfile?: MemberProfileExpectation; + lastMemberProfileEmail?: string; + lastExpectedMemberProfileEmail?: string; + lastMemberStatus: string; + lastValidationError: string; + lastAuthorizationError: string; + principalMemberId: string; + authorizationToken: string; +} diff --git a/packages/ocom-verification/acceptance-api/src/contexts/community/questions/community-id-named.ts b/packages/ocom-verification/acceptance-api/src/contexts/community/questions/community-id-named.ts new file mode 100644 index 000000000..865ab6077 --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/contexts/community/questions/community-id-named.ts @@ -0,0 +1,23 @@ +import { type AnswersQuestions, notes, Question, type UsesAbilities } from '@serenity-js/core'; +import type { MemberNotes } from '../notes/member-notes.ts'; + +/** Resolves the ID of a community created earlier in the current scenario. */ +export class CommunityIdNamed extends Question> { + static called(communityName: string): CommunityIdNamed { + return new CommunityIdNamed(communityName); + } + + private constructor(private readonly communityName: string) { + super(`ID of community "${communityName}"`); + } + + override async answeredBy(actor: AnswersQuestions & UsesAbilities): Promise { + const communityIdsByName = await actor.answer(notes().get('communityIdsByName')).catch(() => ({}) as Record); + const communityId = communityIdsByName[this.communityName]; + if (!communityId) { + throw new Error(`Unknown community "${this.communityName}". Ensure it was created in setup.`); + } + + return communityId; + } +} diff --git a/packages/ocom-verification/acceptance-api/src/contexts/community/questions/end-user-id-in-community.ts b/packages/ocom-verification/acceptance-api/src/contexts/community/questions/end-user-id-in-community.ts new file mode 100644 index 000000000..640c4a7d2 --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/contexts/community/questions/end-user-id-in-community.ts @@ -0,0 +1,27 @@ +import { GraphQLClient } from '@cellix/serenity-framework/clients/graphql'; +import { type Actor, type AnswersQuestions, Question, type UsesAbilities } from '@serenity-js/core'; +import { END_USERS_BY_COMMUNITY_QUERY } from '../../../shared/graphql/member-operations.ts'; + +export class EndUserIdInCommunity extends Question> { + constructor( + private readonly communityId: string, + private readonly displayName: string, + ) { + super(`end user "${displayName}" in community "${communityId}"`); + } + + static withDisplayName(communityId: string, displayName: string): EndUserIdInCommunity { + return new EndUserIdInCommunity(communityId, displayName); + } + + override async answeredBy(actor: AnswersQuestions & UsesAbilities): Promise { + const graphql = GraphQLClient.as(actor as unknown as Actor); + const response = await graphql.execute(END_USERS_BY_COMMUNITY_QUERY, { communityId: this.communityId }); + const endUsers = (response.data?.['endUsersByCommunityId'] as Array> | undefined) ?? []; + const endUser = endUsers.find((candidate) => String(candidate['displayName'] ?? '') === this.displayName); + if (!endUser?.['id']) { + throw new Error(`End user "${this.displayName}" is not available in community "${this.communityId}"`); + } + return String(endUser['id']); + } +} diff --git a/packages/ocom-verification/acceptance-api/src/contexts/community/questions/has-no-member-for-community.ts b/packages/ocom-verification/acceptance-api/src/contexts/community/questions/has-no-member-for-community.ts new file mode 100644 index 000000000..1c7011ddf --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/contexts/community/questions/has-no-member-for-community.ts @@ -0,0 +1,35 @@ +import { GraphQLClient } from '@cellix/serenity-framework/clients/graphql'; +import { type Actor, type AnswersQuestions, Question, type UsesAbilities } from '@serenity-js/core'; +import { MEMBERS_FOR_CURRENT_END_USER_QUERY } from '../../../shared/graphql/member-operations.ts'; + +interface CurrentEndUserMemberShape { + id?: string; + community?: { + id?: string; + }; +} + +type ExecuteWithRequestOptions = = Record>(query: string, variables?: Record, options?: { headers?: Record }) => Promise<{ data: TData }>; + +export class HasNoMemberForCommunity extends Question> { + static authenticatedWith(authorizationToken: string, communityId: string): HasNoMemberForCommunity { + return new HasNoMemberForCommunity(authorizationToken, communityId); + } + + private constructor( + private readonly authorizationToken: string, + private readonly communityId: string, + ) { + super(`whether the authenticated end user has no member in community "${communityId}"`); + } + + override async answeredBy(actor: AnswersQuestions & UsesAbilities): Promise { + const graphql = GraphQLClient.as(actor as unknown as Actor) as GraphQLClient & { execute: ExecuteWithRequestOptions }; + const response = await graphql.execute(MEMBERS_FOR_CURRENT_END_USER_QUERY, undefined, { + headers: { Authorization: `Bearer ${this.authorizationToken}` }, + }); + const members = (response.data?.['membersForCurrentEndUser'] as CurrentEndUserMemberShape[] | undefined) ?? []; + + return !members.some((member) => String(member.community?.id ?? '') === String(this.communityId)); + } +} diff --git a/packages/ocom-verification/acceptance-api/src/contexts/community/questions/member-account-linked.ts b/packages/ocom-verification/acceptance-api/src/contexts/community/questions/member-account-linked.ts new file mode 100644 index 000000000..b1c8e7050 --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/contexts/community/questions/member-account-linked.ts @@ -0,0 +1,38 @@ +import { type AnswersQuestions, Question, type UsesAbilities } from '@serenity-js/core'; +import { MemberById } from './member-by-id.ts'; + +export class MemberAccountLinked extends Question> { + constructor( + private readonly memberId: string, + private readonly endUserId: string, + ) { + super(`whether member "${memberId}" is linked to end user "${endUserId}"`); + } + + static for(memberId: string, endUserId: string): MemberAccountLinked { + return new MemberAccountLinked(memberId, endUserId); + } + + override async answeredBy(actor: AnswersQuestions & UsesAbilities): Promise { + const member = await actor.answer(MemberById.withId(this.memberId)); + return member?.accounts?.some((account) => account.user?.id === this.endUserId) ?? false; + } +} + +export class MemberAccountCount extends Question> { + constructor( + private readonly memberId: string, + private readonly endUserId: string, + ) { + super(`the number of links from member "${memberId}" to end user "${endUserId}"`); + } + + static for(memberId: string, endUserId: string): MemberAccountCount { + return new MemberAccountCount(memberId, endUserId); + } + + override async answeredBy(actor: AnswersQuestions & UsesAbilities): Promise { + const member = await actor.answer(MemberById.withId(this.memberId)); + return member?.accounts?.filter((account) => account.user?.id === this.endUserId).length ?? 0; + } +} diff --git a/packages/ocom-verification/acceptance-api/src/contexts/community/questions/member-by-id.ts b/packages/ocom-verification/acceptance-api/src/contexts/community/questions/member-by-id.ts new file mode 100644 index 000000000..5165e588a --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/contexts/community/questions/member-by-id.ts @@ -0,0 +1,83 @@ +import { GraphQLClient } from '@cellix/serenity-framework/clients/graphql'; +import { type Actor, type AnswersQuestions, Question, type UsesAbilities } from '@serenity-js/core'; +import { MEMBER_BY_ID_QUERY } from '../../../shared/graphql/member-operations.ts'; + +export interface MemberByIdResult { + id?: string; + memberName?: string; + community?: { + id?: string; + }; + accounts?: Array<{ + user?: { + id?: string; + }; + }>; + profile?: { + name?: string; + email?: string; + bio?: string; + avatarDocumentId?: string; + interests?: string[]; + showInterests?: boolean; + showEmail?: boolean; + showProfile?: boolean; + showLocation?: boolean; + showProperties?: boolean; + }; +} + +export class MemberById extends Question> { + constructor(private readonly memberId: string) { + super(`member by id "${memberId}"`); + } + + static withId(memberId: string): MemberById { + return new MemberById(memberId); + } + + override async answeredBy(actor: AnswersQuestions & UsesAbilities): Promise { + const graphql = GraphQLClient.as(actor as unknown as Actor); + const response = await graphql.execute(MEMBER_BY_ID_QUERY, { + id: this.memberId, + }); + + const member = response.data?.['member'] as Record | undefined; + if (!member) { + return undefined; + } + + const profile = member['profile'] as Record | undefined; + const accounts = Array.isArray(member['accounts']) + ? (member['accounts'] as Array>).map((account) => ({ + user: { + id: (account['user'] as Record | undefined)?.['id'] !== undefined ? String((account['user'] as Record)['id']) : undefined, + }, + })) + : undefined; + const interests = Array.isArray(profile?.['interests']) ? (profile?.['interests'] as Array).map((value) => String(value)).filter((value) => value.length > 0) : undefined; + + return { + id: member['id'] !== undefined ? String(member['id']) : undefined, + memberName: member['memberName'] !== undefined ? String(member['memberName']) : undefined, + community: { + id: (member['community'] as Record | undefined)?.['id'] !== undefined ? String((member['community'] as Record)['id']) : undefined, + }, + accounts, + profile: profile + ? { + ...(profile['name'] !== undefined ? { name: String(profile['name'] ?? '') } : {}), + ...(profile['email'] !== undefined ? { email: String(profile['email'] ?? '') } : {}), + ...(profile['bio'] !== undefined ? { bio: String(profile['bio'] ?? '') } : {}), + ...(profile['avatarDocumentId'] !== undefined ? { avatarDocumentId: String(profile['avatarDocumentId'] ?? '') } : {}), + ...(interests !== undefined ? { interests } : {}), + ...(profile['showInterests'] !== undefined ? { showInterests: Boolean(profile['showInterests']) } : {}), + ...(profile['showEmail'] !== undefined ? { showEmail: Boolean(profile['showEmail']) } : {}), + ...(profile['showProfile'] !== undefined ? { showProfile: Boolean(profile['showProfile']) } : {}), + ...(profile['showLocation'] !== undefined ? { showLocation: Boolean(profile['showLocation']) } : {}), + ...(profile['showProperties'] !== undefined ? { showProperties: Boolean(profile['showProperties']) } : {}), + } + : undefined, + }; + } +} diff --git a/packages/ocom-verification/acceptance-api/src/contexts/community/questions/member-listed-in-community.ts b/packages/ocom-verification/acceptance-api/src/contexts/community/questions/member-listed-in-community.ts new file mode 100644 index 000000000..10ac006fc --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/contexts/community/questions/member-listed-in-community.ts @@ -0,0 +1,23 @@ +import { GraphQLClient } from '@cellix/serenity-framework/clients/graphql'; +import { type Actor, type AnswersQuestions, Question, type UsesAbilities } from '@serenity-js/core'; +import { MEMBERS_BY_COMMUNITY_QUERY } from '../../../shared/graphql/member-operations.ts'; + +export class MemberListedInCommunity extends Question> { + static named(memberName: string, communityId: string): MemberListedInCommunity { + return new MemberListedInCommunity(memberName, communityId); + } + + private constructor( + private readonly memberName: string, + private readonly communityId: string, + ) { + super(`whether member "${memberName}" is listed in community "${communityId}"`); + } + + override async answeredBy(actor: AnswersQuestions & UsesAbilities): Promise { + const graphql = GraphQLClient.as(actor as unknown as Actor); + const response = await graphql.execute(MEMBERS_BY_COMMUNITY_QUERY, { communityId: this.communityId }); + const members = response.data?.['membersByCommunityId']; + return Array.isArray(members) && members.some((member) => (member as Record)['memberName'] === this.memberName); + } +} diff --git a/packages/ocom-verification/acceptance-api/src/contexts/community/questions/member-role-name.ts b/packages/ocom-verification/acceptance-api/src/contexts/community/questions/member-role-name.ts new file mode 100644 index 000000000..8b1ff44e9 --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/contexts/community/questions/member-role-name.ts @@ -0,0 +1,17 @@ +import { type AnswersQuestions, notes, Question, type UsesAbilities } from '@serenity-js/core'; +import type { MemberNotes } from '../notes/member-notes.ts'; + +export class MemberRoleName extends Question> { + static fromLastUpdate(): MemberRoleName { + return new MemberRoleName(); + } + + private constructor() { + super('role name returned by the member update'); + } + + override async answeredBy(actor: AnswersQuestions & UsesAbilities): Promise { + const roleName = await actor.answer(notes().get('lastMemberRoleName')); + return roleName || null; + } +} diff --git a/packages/ocom-verification/acceptance-api/src/contexts/community/questions/member-visible-in-list.ts b/packages/ocom-verification/acceptance-api/src/contexts/community/questions/member-visible-in-list.ts new file mode 100644 index 000000000..2f652e72d --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/contexts/community/questions/member-visible-in-list.ts @@ -0,0 +1,17 @@ +import { type AnswersQuestions, notes, Question } from '@serenity-js/core'; +import type { MemberNotes } from '../notes/member-notes.ts'; + +export class MemberVisibleInList extends Question> { + static named(memberName: string): MemberVisibleInList { + return new MemberVisibleInList(memberName); + } + + private constructor(private readonly memberName: string) { + super(`whether member "${memberName}" is visible in the member list`); + } + + override async answeredBy(actor: AnswersQuestions): Promise { + const memberNames = await actor.answer(notes().get('listedMemberNames')); + return memberNames.includes(this.memberName); + } +} diff --git a/packages/ocom-verification/acceptance-api/src/contexts/community/questions/principal-member-id-for-community.ts b/packages/ocom-verification/acceptance-api/src/contexts/community/questions/principal-member-id-for-community.ts new file mode 100644 index 000000000..b53c861e7 --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/contexts/community/questions/principal-member-id-for-community.ts @@ -0,0 +1,45 @@ +import { GraphQLClient } from '@cellix/serenity-framework/clients/graphql'; +import { type Actor, type AnswersQuestions, Question, type UsesAbilities } from '@serenity-js/core'; +import { MEMBERS_FOR_CURRENT_END_USER_QUERY } from '../../../shared/graphql/member-operations.ts'; + +interface CurrentEndUserMemberShape { + id?: string; + community?: { + id?: string; + }; +} + +const PRINCIPAL_MEMBER_LOOKUP_MAX_ATTEMPTS = 20; +const PRINCIPAL_MEMBER_LOOKUP_DELAY_MS = 150; + +export class PrincipalMemberIdForCommunity extends Question> { + constructor(private readonly communityId: string) { + super(`principal member id for community "${communityId}"`); + } + + static inCommunity(communityId: string): PrincipalMemberIdForCommunity { + return new PrincipalMemberIdForCommunity(communityId); + } + + override async answeredBy(actor: AnswersQuestions & UsesAbilities): Promise { + const graphql = GraphQLClient.as(actor as unknown as Actor); + + for (let attempt = 1; attempt <= PRINCIPAL_MEMBER_LOOKUP_MAX_ATTEMPTS; attempt++) { + const response = await graphql.execute(MEMBERS_FOR_CURRENT_END_USER_QUERY); + const members = (response.data?.['membersForCurrentEndUser'] as CurrentEndUserMemberShape[] | undefined) ?? []; + const principalMember = members.find((member) => String(member.community?.id ?? '') === String(this.communityId)); + + if (principalMember?.id) { + return String(principalMember.id); + } + + await wait(PRINCIPAL_MEMBER_LOOKUP_DELAY_MS); + } + + throw new Error(`No provisioned creator member found for community "${this.communityId}" after waiting ${PRINCIPAL_MEMBER_LOOKUP_MAX_ATTEMPTS * PRINCIPAL_MEMBER_LOOKUP_DELAY_MS}ms`); + } +} + +function wait(delayMs: number): Promise { + return new Promise((resolve) => setTimeout(resolve, delayMs)); +} diff --git a/packages/ocom-verification/acceptance-api/src/contexts/community/step-definitions/assign-member-account.steps.ts b/packages/ocom-verification/acceptance-api/src/contexts/community/step-definitions/assign-member-account.steps.ts new file mode 100644 index 000000000..8a9c65613 --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/contexts/community/step-definitions/assign-member-account.steps.ts @@ -0,0 +1,64 @@ +import { Given, Then, When } from '@cucumber/cucumber'; +import { actors } from '@ocom-verification/verification-shared/test-data'; +import { actorCalled, actorInTheSpotlight, notes } from '@serenity-js/core'; +import type { MemberNotes } from '../notes/member-notes.ts'; +import { CommunityIdNamed } from '../questions/community-id-named.ts'; +import { EndUserIdInCommunity } from '../questions/end-user-id-in-community.ts'; +import { MemberAccountCount, MemberAccountLinked } from '../questions/member-account-linked.ts'; +import { AssignMemberAccount } from '../tasks/assign-member-account.ts'; + +const accountDisplayNames: Record = { + Charlie: `${actors.CommunityOwner.givenName} ${actors.CommunityOwner.familyName}`, +}; + +Given('end-user account {string} is available for assignment in {string}', async (accountLabel: string, communityName: string) => { + const actor = actorInTheSpotlight(); + const communityId = await actor.answer(CommunityIdNamed.called(communityName)); + const displayName = accountDisplayNames[accountLabel]; + if (!displayName) { + throw new Error(`Unknown community or end-user account label: "${communityName}" / "${accountLabel}"`); + } + const endUserId = await actor.answer(EndUserIdInCommunity.withDisplayName(communityId, displayName)); + const idsByLabel = await actor.answer(notes().get('endUserIdsByLabel')).catch(() => ({}) as Record); + await actor.attemptsTo(notes().set('endUserIdsByLabel', { ...idsByLabel, [accountLabel]: endUserId })); +}); + +When('{word} associates end-user account {string} to member {string} in {string}', async (actorName: string, accountLabel: string, _memberName: string, communityName: string) => { + const actor = actorCalled(actorName); + const endUserIds = await actor.answer(notes().get('endUserIdsByLabel')); + const memberId = await actor.answer(notes().get('lastMemberId')); + const communityId = await actor.answer(CommunityIdNamed.called(communityName)); + await actor.attemptsTo(notes().set('lastValidationError', undefined as unknown as string)); + try { + await actor.attemptsTo(AssignMemberAccount.to({ communityId, memberId, endUserId: endUserIds[accountLabel] ?? '' })); + } catch (error) { + await actor.attemptsTo(notes().set('lastValidationError', error instanceof Error ? error.message : String(error))); + } +}); + +Given('member {string} is already linked to end-user account {string}', async (_memberName: string, accountLabel: string) => { + const actor = actorInTheSpotlight(); + const communityId = await actor.answer(notes().get('lastMemberCommunityId')); + const memberId = await actor.answer(notes().get('lastMemberId')); + const endUserIds = await actor.answer(notes().get('endUserIdsByLabel')); + await actor.attemptsTo(AssignMemberAccount.to({ communityId, memberId, endUserId: endUserIds[accountLabel] ?? '' })); +}); + +Then('member {string} should be linked to end-user account {string}', async (_memberName: string, accountLabel: string) => { + const actor = actorInTheSpotlight(); + const memberId = await actor.answer(notes().get('lastMemberId')); + const endUserIds = await actor.answer(notes().get('endUserIdsByLabel')); + if (!(await actor.answer(MemberAccountLinked.for(memberId, endUserIds[accountLabel] ?? '')))) { + throw new Error(`Expected member "${memberId}" to be linked to end-user account "${accountLabel}"`); + } +}); + +Then('member {string} should remain linked to end-user account {string} only once', async (_memberName: string, accountLabel: string) => { + const actor = actorInTheSpotlight(); + const memberId = await actor.answer(notes().get('lastMemberId')); + const endUserIds = await actor.answer(notes().get('endUserIdsByLabel')); + const count = await actor.answer(MemberAccountCount.for(memberId, endUserIds[accountLabel] ?? '')); + if (count !== 1) { + throw new Error(`Expected one account association for "${accountLabel}" but found ${count}`); + } +}); diff --git a/packages/ocom-verification/acceptance-api/src/contexts/community/step-definitions/create-member.steps.ts b/packages/ocom-verification/acceptance-api/src/contexts/community/step-definitions/create-member.steps.ts new file mode 100644 index 000000000..2805fdaa8 --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/contexts/community/step-definitions/create-member.steps.ts @@ -0,0 +1,109 @@ +import { GherkinDataTable } from '@cellix/serenity-framework/cucumber/gherkin-data-table'; +import { type DataTable, Given, Then, When } from '@cucumber/cucumber'; +import { actors } from '@ocom-verification/verification-shared/test-data'; +import { Ensure, equals, isPresent } from '@serenity-js/assertions'; +import { actorCalled, notes } from '@serenity-js/core'; +import { LastGraphQLResponse } from '../../../shared/questions/last-graphql-response.ts'; +import type { MemberNotes } from '../notes/member-notes.ts'; +import { CommunityIdNamed } from '../questions/community-id-named.ts'; +import { MemberById } from '../questions/member-by-id.ts'; +import { PrincipalMemberIdForCommunity } from '../questions/principal-member-id-for-community.ts'; +import { CreateCommunity } from '../tasks/create-community.ts'; +import { CreateMember } from '../tasks/create-member.ts'; + +let lastActorName = actors.CommunityOwner.name; + +interface MemberDetails { + memberName?: string; + email?: string; +} + +Given('{word} is signed in as a community owner for member management', (actorName: string) => { + lastActorName = actorName; + actorCalled(actorName); +}); + +Given('{word} has a community named {string}', async (actorName: string, communityName: string) => { + lastActorName = actorName; + + const actor = actorCalled(actorName); + await actor.attemptsTo(CreateCommunity.withName(communityName)); + + const communityId = (await actor.answer(notes().get('lastCommunityId'))) as string; + const existing = await actor.answer(notes().get('communityIdsByName')).catch(() => ({}) as Record); + + await actor.attemptsTo( + notes().set('communityIdsByName', { + ...existing, + [communityName]: communityId, + }), + ); +}); + +When('{word} creates a member in {string} with:', async (actorName: string, communityName: string, dataTable: DataTable) => { + lastActorName = actorName; + + const actor = actorCalled(actorName); + const details = GherkinDataTable.from(dataTable).rowsHash(); + + const memberName = details.memberName?.trim() ?? ''; + + const communityId = await actor.answer(CommunityIdNamed.called(communityName)); + + const principalMemberId = await actor.answer(PrincipalMemberIdForCommunity.inCommunity(communityId)); + await actor.attemptsTo(CreateMember({ memberName, communityId, principalMemberId })); +}); + +When('{word} attempts to create a member in {string} with:', async (actorName: string, communityName: string, dataTable: DataTable) => { + lastActorName = actorName; + const actor = actorCalled(actorName); + const details = GherkinDataTable.from(dataTable).rowsHash(); + const communityId = await actor.answer(CommunityIdNamed.called(communityName)); + + await actor.attemptsTo(notes().set('lastMemberId', undefined as unknown as string), notes().set('lastValidationError', undefined as unknown as string)); + + try { + const principalMemberId = await actor.answer(PrincipalMemberIdForCommunity.inCommunity(communityId)); + await actor.attemptsTo(CreateMember({ memberName: details.memberName?.trim() ?? '', communityId, principalMemberId })); + } catch (error) { + await actor.attemptsTo(notes().set('lastValidationError', error instanceof Error ? error.message : String(error))); + } +}); + +Then('the member should be created successfully in {string}', async (communityName: string) => { + const actor = actorCalled(lastActorName); + await actor.attemptsTo(Ensure.that(LastGraphQLResponse.field('memberCreate.status.success'), equals(true)), Ensure.that(LastGraphQLResponse.field('memberCreate.member.id'), isPresent())); + + const memberId = await actor.answer(LastGraphQLResponse.field('memberCreate.member.id')); + const memberName = await actor.answer(notes().get('lastMemberName')); + const communityId = await actor.answer(CommunityIdNamed.called(communityName)); + const persistedMember = await actor.answer(MemberById.withId(memberId)); + + await actor.attemptsTo( + Ensure.that(persistedMember, isPresent()), + Ensure.that(persistedMember?.id, equals(memberId)), + Ensure.that(persistedMember?.memberName, equals(memberName)), + Ensure.that(persistedMember?.community?.id, equals(communityId)), + ); +}); + +Then('she should see a member error for {string}', async (fieldName: string) => { + const actor = actorCalled(lastActorName); + const responseError = await actor.answer(LastGraphQLResponse.field('memberCreate.status.errorMessage')).catch(() => ''); + const capturedError = await actor.answer(notes().get('lastValidationError')).catch(() => ''); + const error = responseError || capturedError; + const isFieldMentioned = error.toLowerCase().includes(fieldName.toLowerCase()); + if (!error || (!isFieldMentioned && !/cannot be empty|required|missing|invalid|must not be empty|too short|too long|already associated/i.test(error))) { + throw new Error(`Expected a validation error related to "${fieldName}", but got: "${error}"`); + } +}); + +Then('no new member should be created in {string}', async (_communityName: string) => { + const actor = actorCalled(lastActorName); + const memberId = await actor.answer(notes().get('lastMemberId')).catch(() => ''); + const success = await actor.answer(LastGraphQLResponse.field('memberCreate.status.success')).catch(() => undefined); + const capturedError = await actor.answer(notes().get('lastValidationError')).catch(() => ''); + if (memberId || success === true || (success === undefined && !capturedError)) { + throw new Error('Expected member creation to be blocked by validation'); + } +}); diff --git a/packages/ocom-verification/acceptance-api/src/contexts/community/step-definitions/index.ts b/packages/ocom-verification/acceptance-api/src/contexts/community/step-definitions/index.ts index c04c54d61..47733d53d 100644 --- a/packages/ocom-verification/acceptance-api/src/contexts/community/step-definitions/index.ts +++ b/packages/ocom-verification/acceptance-api/src/contexts/community/step-definitions/index.ts @@ -1,2 +1,8 @@ // Community context step definitions import './create-community.steps.ts'; +import './create-member.steps.ts'; +import './list-members.steps.ts'; +import './member-role.steps.ts'; +import './remove-member.steps.ts'; +import './assign-member-account.steps.ts'; +import './update-member.steps.ts'; diff --git a/packages/ocom-verification/acceptance-api/src/contexts/community/step-definitions/list-members.steps.ts b/packages/ocom-verification/acceptance-api/src/contexts/community/step-definitions/list-members.steps.ts new file mode 100644 index 000000000..519efdec1 --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/contexts/community/step-definitions/list-members.steps.ts @@ -0,0 +1,69 @@ +import { type DataTable, Given, Then, When } from '@cucumber/cucumber'; +import { actorCalled, actorInTheSpotlight, notes } from '@serenity-js/core'; +import type { MemberNotes } from '../notes/member-notes.ts'; +import { CommunityIdNamed } from '../questions/community-id-named.ts'; +import { MemberVisibleInList } from '../questions/member-visible-in-list.ts'; +import { PrincipalMemberIdForCommunity } from '../questions/principal-member-id-for-community.ts'; +import { CreateMember } from '../tasks/create-member.ts'; +import { ListMembers } from '../tasks/list-members.ts'; + +Given('{word} is an authenticated community admin for {string}', async (actorName: string, communityName: string) => { + const owner = actorInTheSpotlight(); + await owner.answer(CommunityIdNamed.called(communityName)); + const communityIdsByName = await owner.answer(notes().get('communityIdsByName')); + + await actorCalled(actorName).attemptsTo(notes().set('communityIdsByName', communityIdsByName)); +}); + +Given('the following members exist in {string}:', async (communityName: string, dataTable: DataTable) => { + const actor = actorInTheSpotlight(); + const communityId = await actor.answer(CommunityIdNamed.called(communityName)); + + for (const details of dataTable.hashes()) { + const { memberName } = details; + if (!memberName) { + throw new Error('memberName is required when creating listed members'); + } + const principalMemberId = await actor.answer(PrincipalMemberIdForCommunity.inCommunity(communityId)); + await actor.attemptsTo(CreateMember({ memberName: memberName.trim(), communityId, principalMemberId })); + } +}); + +When('{word} lists members for {string}', async (actorName: string, communityName: string) => { + const actor = actorCalled(actorName); + const communityId = await actor.answer(CommunityIdNamed.called(communityName)); + + await actor.attemptsTo(ListMembers.inCommunity(communityId)); +}); + +When('{word} searches the member list in {string} for {string}', async (actorName: string, communityName: string, searchTerm: string) => { + const actor = actorCalled(actorName); + const communityId = await actor.answer(CommunityIdNamed.called(communityName)); + + await actor.attemptsTo(ListMembers.inCommunity(communityId, searchTerm)); +}); + +Then('{word} should see the following members in {string}:', async (actorName: string, _communityName: string, dataTable: DataTable) => { + const actor = actorCalled(actorName); + for (const details of dataTable.hashes()) { + const { memberName } = details; + if (!memberName) { + throw new Error('memberName is required when verifying listed members'); + } + if (!(await actor.answer(MemberVisibleInList.named(memberName)))) { + throw new Error(`Expected member "${memberName}" to appear in the member list`); + } + } +}); + +Then('{word} should not see member {string} from {string}', async (actorName: string, memberName: string, _communityName: string) => { + if (await actorCalled(actorName).answer(MemberVisibleInList.named(memberName))) { + throw new Error(`Expected member "${memberName}" not to appear in the member list`); + } +}); + +Then('{word} should not see member {string} in the filtered results', async (actorName: string, memberName: string) => { + if (await actorCalled(actorName).answer(MemberVisibleInList.named(memberName))) { + throw new Error(`Expected member "${memberName}" not to appear in the filtered member list`); + } +}); diff --git a/packages/ocom-verification/acceptance-api/src/contexts/community/step-definitions/member-role.steps.ts b/packages/ocom-verification/acceptance-api/src/contexts/community/step-definitions/member-role.steps.ts new file mode 100644 index 000000000..30b8f6667 --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/contexts/community/step-definitions/member-role.steps.ts @@ -0,0 +1,52 @@ +import { Given, Then, When } from '@cucumber/cucumber'; +import { actors } from '@ocom-verification/verification-shared/test-data'; +import { actorCalled, actorInTheSpotlight, notes } from '@serenity-js/core'; +import type { MemberNotes } from '../notes/member-notes.ts'; +import { CommunityIdNamed } from '../questions/community-id-named.ts'; +import { MemberRoleName } from '../questions/member-role-name.ts'; +import { SeedEndUserRole } from '../tasks/seed-end-user-role.ts'; +import { UpdateMemberRole } from '../tasks/update-member-role.ts'; + +let lastActorName = actors.CommunityOwner.name; + +Given('a role {string} exists in {string}', async (roleName: string, communityName: string) => { + const actor = actorInTheSpotlight(); + const communityId = await actor.answer(CommunityIdNamed.called(communityName)); + await actor.attemptsTo(SeedEndUserRole.named(roleName, communityName, communityId)); +}); + +When('{word} changes member {string} in {string} to role {string}', async (actorName: string, _memberName: string, communityName: string, roleName: string) => { + lastActorName = actorName; + const actor = actorCalled(actorName); + const roleIds = await actor.answer(notes().get('roleIdsByCommunityName')); + const communityId = await actor.answer(CommunityIdNamed.called(communityName)); + const roleId = roleIds[communityName]?.[roleName]; + if (!roleId) throw new Error(`Missing role "${roleName}" in "${communityName}"`); + await actor.attemptsTo(UpdateMemberRole.with(roleId, communityId)); +}); + +When('{word} attempts to change member {string} in {string} to role {string}', async (actorName: string, _memberName: string, communityName: string, roleName: string) => { + lastActorName = actorName; + const actor = actorCalled(actorName); + const roleIds = await actor.answer(notes().get('roleIdsByCommunityName')); + const communityId = await actor.answer(CommunityIdNamed.called(communityName)); + const roleId = Object.values(roleIds) + .map((roles) => roles[roleName]) + .find(Boolean); + if (!roleId) throw new Error(`Missing role "${roleName}"`); + try { + await actor.attemptsTo(UpdateMemberRole.with(roleId, communityId)); + } catch (error) { + await actor.attemptsTo(notes().set('lastValidationError', error instanceof Error ? error.message : String(error))); + } +}); + +Then('member {string} should have role {string} in {string}', async (_memberName: string, roleName: string, _communityName: string) => { + const actor = actorCalled(lastActorName); + if ((await actor.answer(MemberRoleName.fromLastUpdate())) !== roleName) throw new Error(`Expected member role "${roleName}"`); +}); + +Then('member {string} should not have role {string} in {string}', async (_memberName: string, roleName: string, _communityName: string) => { + const actor = actorCalled(lastActorName); + if ((await actor.answer(MemberRoleName.fromLastUpdate()).catch(() => null)) === roleName) throw new Error(`Expected member not to have role "${roleName}"`); +}); diff --git a/packages/ocom-verification/acceptance-api/src/contexts/community/step-definitions/remove-member.steps.ts b/packages/ocom-verification/acceptance-api/src/contexts/community/step-definitions/remove-member.steps.ts new file mode 100644 index 000000000..1d634071e --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/contexts/community/step-definitions/remove-member.steps.ts @@ -0,0 +1,91 @@ +import { Given, Then, When } from '@cucumber/cucumber'; +import { actors } from '@ocom-verification/verification-shared/test-data'; +import { actorCalled, actorInTheSpotlight, notes } from '@serenity-js/core'; +import type { MemberNotes } from '../notes/member-notes.ts'; +import { CommunityIdNamed } from '../questions/community-id-named.ts'; +import { HasNoMemberForCommunity } from '../questions/has-no-member-for-community.ts'; +import { MemberListedInCommunity } from '../questions/member-listed-in-community.ts'; +import { RemoveMember } from '../tasks/remove-member.ts'; + +let lastActorName = actors.CommunityOwner.name; +let managementOwnerActorName = actors.CommunityOwner.name; + +Given('{word} is signed in without membership in {string}', async (actorName: string, communityName: string) => { + const owner = actorInTheSpotlight(); + managementOwnerActorName = owner.name; + const communityId = await owner.answer(CommunityIdNamed.called(communityName)); + const communityIds = await owner.answer(notes().get('communityIdsByName')); + const targetMemberId = await owner.answer(notes().get('lastMemberId')); + const targetMemberName = await owner.answer(notes().get('lastMemberName')); + + const actor = actorCalled(actorName); + const authorizationToken = actors.CommunityMember.email; + if (!(await actor.answer(HasNoMemberForCommunity.authenticatedWith(authorizationToken, communityId)))) { + throw new Error(`Expected ${actorName} to have no membership in community "${communityName}"`); + } + await actor.attemptsTo( + notes().set('communityIdsByName', communityIds), + notes().set('lastMemberId', targetMemberId), + notes().set('lastMemberName', targetMemberName), + notes().set('lastMemberCommunityId', communityId), + notes().set('principalMemberId', targetMemberId), + notes().set('authorizationToken', authorizationToken), + notes().set('lastAuthorizationError', undefined as unknown as string), + ); +}); + +When('{word} removes member {string} from {string}', async (actorName: string, _memberName: string, communityName: string) => { + lastActorName = actorName; + const actor = actorCalled(actorName); + const memberId = await actor.answer(notes().get('lastMemberId')); + const communityId = await actor.answer(CommunityIdNamed.called(communityName)); + if (!memberId) { + throw new Error(`Missing member or community state for removal from "${communityName}"`); + } + await actor.attemptsTo(notes().set('lastMemberRemoved', false), RemoveMember.withId(memberId, communityId)); +}); + +Then('the member should be removed successfully from {string}', async (_communityName: string) => { + const actor = actorCalled(lastActorName); + const removed = await actor.answer(notes().get('lastMemberRemoved')); + if (!removed) { + throw new Error('Expected member removal to succeed'); + } +}); + +Then('member {string} should not appear in member listings for {string}', async (memberName: string, communityName: string) => { + const actor = actorCalled(lastActorName); + const communityId = await actor.answer(CommunityIdNamed.called(communityName)); + if (await actor.answer(MemberListedInCommunity.named(memberName, communityId))) { + throw new Error(`Expected member "${memberName}" not to appear in listings for "${communityName}"`); + } +}); + +When('{word} attempts to remove member {string} from {string}', async (actorName: string, _memberName: string, communityName: string) => { + lastActorName = actorName; + const actor = actorCalled(actorName); + const memberId = await actor.answer(notes().get('lastMemberId')); + const communityId = await actor.answer(CommunityIdNamed.called(communityName)); + try { + await actor.attemptsTo(RemoveMember.withId(memberId, communityId)); + } catch (error) { + await actor.attemptsTo(notes().set('lastAuthorizationError', error instanceof Error ? error.message : String(error))); + } +}); + +Then('{word} should receive an authorization error for member management', async (actorName: string) => { + const error = await actorCalled(actorName) + .answer(notes().get('lastAuthorizationError')) + .catch(() => ''); + if (!/permission|cannot remove|unauthorized|forbidden|not a member/i.test(error)) { + throw new Error(`Expected a member-management authorization error, but got: "${error}"`); + } +}); + +Then('member {string} should remain in {string}', async (memberName: string, communityName: string) => { + const owner = actorCalled(managementOwnerActorName); + const communityId = await owner.answer(CommunityIdNamed.called(communityName)); + if (!(await owner.answer(MemberListedInCommunity.named(memberName, communityId)))) { + throw new Error(`Expected member "${memberName}" to remain in "${communityName}"`); + } +}); diff --git a/packages/ocom-verification/acceptance-api/src/contexts/community/step-definitions/update-member.steps.ts b/packages/ocom-verification/acceptance-api/src/contexts/community/step-definitions/update-member.steps.ts new file mode 100644 index 000000000..1da721cc6 --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/contexts/community/step-definitions/update-member.steps.ts @@ -0,0 +1,127 @@ +import { GherkinDataTable } from '@cellix/serenity-framework/cucumber/gherkin-data-table'; +import { type DataTable, Then, When } from '@cucumber/cucumber'; +import { actors } from '@ocom-verification/verification-shared/test-data'; +import { actorCalled, notes } from '@serenity-js/core'; +import type { MemberNotes, MemberProfileExpectation } from '../notes/member-notes.ts'; +import { CommunityIdNamed } from '../questions/community-id-named.ts'; +import { MemberById, type MemberByIdResult } from '../questions/member-by-id.ts'; +import { UpdateMember } from '../tasks/update-member-profile.ts'; + +let lastActorName = actors.CommunityOwner.name; + +interface MemberProfileUpdateDetails { + name?: string; + memberName?: string; + email?: string; + bio?: string; + avatarDocumentId?: string; + interests?: string; + showInterests?: string; + showEmail?: string; + showProfile?: string; + showLocation?: string; + showProperties?: string; +} + +When('{word} updates member {string} in {string} with:', async (actorName: string, _memberName: string, communityName: string, dataTable: DataTable) => { + lastActorName = actorName; + + const actor = actorCalled(actorName); + const details = GherkinDataTable.from(dataTable).rowsHash(); + const communityId = await actor.answer(CommunityIdNamed.called(communityName)); + + const expectedProfile: MemberProfileExpectation = { + ...(details.name ? { name: details.name } : {}), + ...(details.memberName ? { name: details.memberName } : {}), + ...(details.email ? { email: details.email } : {}), + ...(details.bio ? { bio: details.bio } : {}), + ...(details.avatarDocumentId ? { avatarDocumentId: details.avatarDocumentId } : {}), + ...(details.interests + ? { + interests: details.interests + .split(',') + .map((interest) => interest.trim()) + .filter((interest) => interest.length > 0), + } + : {}), + ...(details.showInterests !== undefined ? { showInterests: details.showInterests.toLowerCase() === 'true' } : {}), + ...(details.showEmail !== undefined ? { showEmail: details.showEmail.toLowerCase() === 'true' } : {}), + ...(details.showProfile !== undefined ? { showProfile: details.showProfile.toLowerCase() === 'true' } : {}), + ...(details.showLocation !== undefined ? { showLocation: details.showLocation.toLowerCase() === 'true' } : {}), + ...(details.showProperties !== undefined ? { showProperties: details.showProperties.toLowerCase() === 'true' } : {}), + }; + + await actor.attemptsTo(notes().set('lastValidationError', undefined as unknown as string), notes().set('lastExpectedMemberProfile', expectedProfile)); + await actor.attemptsTo( + UpdateMember.with({ + communityId, + profile: expectedProfile, + }), + ); +}); + +Then('the member should be updated successfully in {string}', async (communityName: string) => { + const actor = actorCalled(lastActorName); + + const status = await actor.answer(notes().get('lastMemberStatus')); + const memberId = await actor.answer(notes().get('lastMemberId')); + const validationError = await actor.answer(notes().get('lastValidationError')); + const expectedCommunityId = await actor.answer(CommunityIdNamed.called(communityName)); + + if (validationError) { + throw new Error(`Expected member update to succeed for "${communityName}", but got validation error: "${validationError}"`); + } + + if (status !== 'SUCCESS') { + throw new Error(`Expected member status "SUCCESS" but got "${status}"`); + } + + if (!memberId) { + throw new Error(`Expected an updated member id for "${communityName}" but none was recorded`); + } + + const updatedMember = await actor.answer(MemberById.withId(memberId)); + if (!updatedMember) { + throw new Error(`Expected member "${memberId}" to exist after update, but no member was returned by API`); + } + + if (String(updatedMember.community?.id ?? '') !== String(expectedCommunityId)) { + throw new Error(`Expected updated member to belong to "${communityName}"`); + } + + const expectedProfile = await actor.answer(notes().get('lastExpectedMemberProfile')).catch(() => undefined); + if (!expectedProfile) { + return; + } + + const actualProfile = updatedMember.profile; + if (!actualProfile) { + throw new Error('Expected updated member profile to be returned by API, but profile was missing'); + } + + assertMemberProfileMatches(expectedProfile, actualProfile); +}); + +function assertMemberProfileMatches(expectedProfile: MemberProfileExpectation, actualProfile: NonNullable): void { + const comparableFields: Array> = ['name', 'email', 'bio', 'avatarDocumentId', 'showInterests', 'showEmail', 'showProfile', 'showLocation', 'showProperties']; + + for (const field of comparableFields) { + const expectedValue = expectedProfile[field]; + if (expectedValue === undefined) { + continue; + } + + const actualValue = actualProfile[field]; + if (actualValue !== expectedValue) { + throw new Error(`Expected profile ${field} to be "${String(expectedValue)}" but got "${String(actualValue ?? '')}"`); + } + } + + if (expectedProfile.interests !== undefined) { + const expectedInterests = JSON.stringify(expectedProfile.interests); + const actualInterests = JSON.stringify(actualProfile.interests ?? []); + if (actualInterests !== expectedInterests) { + throw new Error(`Expected profile interests ${expectedInterests} but got ${actualInterests}`); + } + } +} diff --git a/packages/ocom-verification/acceptance-api/src/contexts/community/tasks/assign-member-account.ts b/packages/ocom-verification/acceptance-api/src/contexts/community/tasks/assign-member-account.ts new file mode 100644 index 000000000..87a5833f9 --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/contexts/community/tasks/assign-member-account.ts @@ -0,0 +1,26 @@ +import { type Actor, notes, Task } from '@serenity-js/core'; +import { AssignMemberAccount as AssignMemberAccountAbility } from '../../../shared/abilities/assign-member-account.ts'; +import type { MemberNotes } from '../notes/member-notes.ts'; +import { PrincipalMemberIdForCommunity } from '../questions/principal-member-id-for-community.ts'; + +interface AssignmentDetails { + communityId: string; + memberId: string; + endUserId: string; +} + +export class AssignMemberAccount extends Task { + static to(details: AssignmentDetails): AssignMemberAccount { + return new AssignMemberAccount(details); + } + + private constructor(private readonly details: AssignmentDetails) { + super('assigns an end-user account to a member'); + } + + override async performAs(actor: Actor): Promise { + const principalMemberId = await actor.answer(PrincipalMemberIdForCommunity.inCommunity(this.details.communityId)); + await AssignMemberAccountAbility.as(actor).performAs(actor, { ...this.details, principalMemberId }); + await actor.attemptsTo(notes().set('lastLinkedEndUserId', this.details.endUserId)); + } +} diff --git a/packages/ocom-verification/acceptance-api/src/contexts/community/tasks/create-member.ts b/packages/ocom-verification/acceptance-api/src/contexts/community/tasks/create-member.ts new file mode 100644 index 000000000..a40fd9f7a --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/contexts/community/tasks/create-member.ts @@ -0,0 +1,24 @@ +import { notes, Task } from '@serenity-js/core'; +import { MEMBER_CREATE_MUTATION } from '../../../shared/graphql/member-operations.ts'; +import { ExecuteGraphQL } from '../../../shared/interactions/execute-graphql.ts'; +import { LastGraphQLResponse } from '../../../shared/questions/last-graphql-response.ts'; +import type { MemberNotes } from '../notes/member-notes.ts'; + +interface CreateMemberDetails { + memberName: string; + communityId: string; + principalMemberId: string; +} + +export const CreateMember = (details: CreateMemberDetails): Task => + Task.where( + `#actor creates a member named "${details.memberName}"`, + ExecuteGraphQL.operation( + MEMBER_CREATE_MUTATION, + { input: { memberName: details.memberName, communityId: details.communityId } }, + { headers: { 'x-community-id': details.communityId, 'x-member-id': details.principalMemberId } }, + ), + notes().set('lastMemberId', LastGraphQLResponse.field('memberCreate.member.id')), + notes().set('lastMemberCommunityId', details.communityId), + notes().set('lastMemberName', LastGraphQLResponse.field('memberCreate.member.memberName')), + ); diff --git a/packages/ocom-verification/acceptance-api/src/contexts/community/tasks/list-members.ts b/packages/ocom-verification/acceptance-api/src/contexts/community/tasks/list-members.ts new file mode 100644 index 000000000..9a9752ff9 --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/contexts/community/tasks/list-members.ts @@ -0,0 +1,29 @@ +import { type Actor, notes, Task } from '@serenity-js/core'; +import { ListMembers as ListMembersAbility } from '../../../shared/abilities/list-members.ts'; +import type { MemberNotes } from '../notes/member-notes.ts'; +import { PrincipalMemberIdForCommunity } from '../questions/principal-member-id-for-community.ts'; + +export class ListMembers extends Task { + static inCommunity(communityId: string, searchTerm = ''): ListMembers { + return new ListMembers(communityId, searchTerm); + } + + private constructor( + private readonly communityId: string, + private readonly searchTerm: string, + ) { + super(`lists members in community "${communityId}"`); + } + + async performAs(actor: Actor): Promise { + const principalMemberId = await actor.answer(PrincipalMemberIdForCommunity.inCommunity(this.communityId)); + const members = await ListMembersAbility.as(actor).performAs(actor, { + communityId: this.communityId, + principalMemberId, + }); + const normalizedSearch = this.searchTerm.trim().toLowerCase(); + const listedMemberNames = members.map((member) => member.memberName).filter((name) => !normalizedSearch || name.toLowerCase().includes(normalizedSearch)); + + await actor.attemptsTo(notes().set('listedMemberNames', listedMemberNames)); + } +} diff --git a/packages/ocom-verification/acceptance-api/src/contexts/community/tasks/remove-member.ts b/packages/ocom-verification/acceptance-api/src/contexts/community/tasks/remove-member.ts new file mode 100644 index 000000000..7e966abc6 --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/contexts/community/tasks/remove-member.ts @@ -0,0 +1,29 @@ +import { type Actor, notes, Task } from '@serenity-js/core'; +import { RemoveMember as RemoveMemberAbility } from '../../../shared/abilities/remove-member.ts'; +import type { MemberNotes } from '../notes/member-notes.ts'; +import { PrincipalMemberIdForCommunity } from '../questions/principal-member-id-for-community.ts'; + +export class RemoveMember extends Task { + static withId(memberId: string, communityId: string): RemoveMember { + return new RemoveMember(memberId, communityId); + } + + private constructor( + private readonly memberId: string, + private readonly communityId: string, + ) { + super(`removes member "${memberId}"`); + } + + async performAs(actor: Actor): Promise { + const principalMemberId = await actor.answer(notes().get('principalMemberId')).catch(() => actor.answer(PrincipalMemberIdForCommunity.inCommunity(this.communityId))); + const authorizationToken = await actor.answer(notes().get('authorizationToken')).catch(() => undefined); + await RemoveMemberAbility.as(actor).performAs(actor, { + memberId: this.memberId, + communityId: this.communityId, + principalMemberId, + ...(authorizationToken ? { authorizationToken } : {}), + }); + await actor.attemptsTo(notes().set('lastMemberRemoved', true), notes().set('lastMemberStatus', 'REMOVED')); + } +} diff --git a/packages/ocom-verification/acceptance-api/src/contexts/community/tasks/seed-end-user-role.ts b/packages/ocom-verification/acceptance-api/src/contexts/community/tasks/seed-end-user-role.ts new file mode 100644 index 000000000..7fd865431 --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/contexts/community/tasks/seed-end-user-role.ts @@ -0,0 +1,29 @@ +import { seedEndUserRole } from '@ocom-verification/verification-shared/test-data'; +import { type Actor, notes, Task } from '@serenity-js/core'; +import { mongoDbName, testMongoServer } from '../../../servers/test-mongo-server.ts'; +import type { MemberNotes } from '../notes/member-notes.ts'; + +export class SeedEndUserRole extends Task { + static named(roleName: string, communityName: string, communityId: string): SeedEndUserRole { + return new SeedEndUserRole(roleName, communityName, communityId); + } + + private constructor( + private readonly roleName: string, + private readonly communityName: string, + private readonly communityId: string, + ) { + super(`seeds role "${roleName}" in "${communityName}"`); + } + + async performAs(actor: Actor): Promise { + const roleId = await seedEndUserRole({ connectionString: testMongoServer.getConnectionString(), dbName: mongoDbName }, { communityId: this.communityId, roleName: this.roleName }); + const roleIdsByCommunityName = await actor.answer(notes().get('roleIdsByCommunityName')).catch(() => ({}) as Record>); + await actor.attemptsTo( + notes().set('roleIdsByCommunityName', { + ...roleIdsByCommunityName, + [this.communityName]: { ...roleIdsByCommunityName[this.communityName], [this.roleName]: roleId }, + }), + ); + } +} diff --git a/packages/ocom-verification/acceptance-api/src/contexts/community/tasks/update-member-profile.ts b/packages/ocom-verification/acceptance-api/src/contexts/community/tasks/update-member-profile.ts new file mode 100644 index 000000000..54bf14696 --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/contexts/community/tasks/update-member-profile.ts @@ -0,0 +1,48 @@ +import { type Actor, notes, Task } from '@serenity-js/core'; +import { type MemberProfileUpdate, UpdateMemberProfile as UpdateMemberProfileAbility } from '../../../shared/abilities/update-member-profile.ts'; +import type { MemberNotes } from '../notes/member-notes.ts'; +import { PrincipalMemberIdForCommunity } from '../questions/principal-member-id-for-community.ts'; + +interface UpdateMemberProfileTaskDetails { + profile: MemberProfileUpdate; + memberId?: string; + communityId?: string; +} + +export class UpdateMember extends Task { + static with(details: UpdateMemberProfileTaskDetails) { + return new UpdateMember(details); + } + + private constructor(private readonly details: UpdateMemberProfileTaskDetails) { + super('updates a member profile'); + } + + async performAs(actor: Actor): Promise { + const memberId = this.details.memberId ?? (await actor.answer(notes().get('lastMemberId'))); + if (!memberId) { + throw new Error('Cannot update member profile because no member id is available in notes'); + } + + const communityId = this.details.communityId ?? (await actor.answer(notes().get('lastMemberCommunityId'))); + if (!communityId) { + throw new Error('Cannot update member profile because no community id is available in notes'); + } + + const principalMemberId = await actor.answer(PrincipalMemberIdForCommunity.inCommunity(communityId)); + const result = await UpdateMemberProfileAbility.as(actor).performAs(actor, { + memberId, + profile: this.details.profile, + communityId, + principalMemberId, + }); + + await actor.attemptsTo( + notes().set('lastMemberProfileEmail', result.profile?.email), + notes().set('lastExpectedMemberProfileEmail', this.details.profile.email), + notes().set('lastMemberStatus', 'SUCCESS'), + ); + } + + override toString = () => 'updates a member profile'; +} diff --git a/packages/ocom-verification/acceptance-api/src/contexts/community/tasks/update-member-role.ts b/packages/ocom-verification/acceptance-api/src/contexts/community/tasks/update-member-role.ts new file mode 100644 index 000000000..1c407aee5 --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/contexts/community/tasks/update-member-role.ts @@ -0,0 +1,29 @@ +import { type Actor, notes, Task } from '@serenity-js/core'; +import { UpdateMemberRole as UpdateMemberRoleAbility } from '../../../shared/abilities/update-member-role.ts'; +import type { MemberNotes } from '../notes/member-notes.ts'; +import { PrincipalMemberIdForCommunity } from '../questions/principal-member-id-for-community.ts'; + +export class UpdateMemberRole extends Task { + static with(roleId: string, communityId: string): UpdateMemberRole { + return new UpdateMemberRole(roleId, communityId); + } + + private constructor( + private readonly roleId: string, + private readonly communityId: string, + ) { + super('updates a member role'); + } + + async performAs(actor: Actor): Promise { + const memberId = await actor.answer(notes().get('lastMemberId')); + const principalMemberId = await actor.answer(PrincipalMemberIdForCommunity.inCommunity(this.communityId)); + const roleName = await UpdateMemberRoleAbility.as(actor).performAs(actor, { + memberId, + roleId: this.roleId, + communityId: this.communityId, + principalMemberId, + }); + await actor.attemptsTo(notes().set('lastMemberRoleName', roleName)); + } +} diff --git a/packages/ocom-verification/acceptance-api/src/mock-application-services.ts b/packages/ocom-verification/acceptance-api/src/mock-application-services.ts index 3a2fedc8b..8bdc8a0f7 100644 --- a/packages/ocom-verification/acceptance-api/src/mock-application-services.ts +++ b/packages/ocom-verification/acceptance-api/src/mock-application-services.ts @@ -1,6 +1,7 @@ import type { BlobUploadAuthorizationHeader, BlobUploadCommonResponse, CreateBlobAuthorizationHeaderRequest } from '@cellix/service-blob-storage'; import { type ApplicationServicesFactory, buildApplicationServicesFactory } from '@ocom/application-services'; import type { ApiContextSpec } from '@ocom/context-spec'; +import { RegisterEventHandlers } from '@ocom/event-handler'; import { Persistence } from '@ocom/persistence'; import type { ServiceApolloServer } from '@ocom/service-apollo-server'; import type { BlobAddress, BlobStorageOperations, ClientUploadOperations, ListBlobsRequest, UploadTextBlobRequest } from '@ocom/service-blob-storage'; @@ -39,7 +40,7 @@ function createMockTokenValidation(): TokenValidation { openIdConfigKey: 'StaffPortal', }); } - const actor = actors.CommunityOwner; + const actor = Object.values(actors).find((candidate) => candidate.email === token) ?? actors.CommunityOwner; return Promise.resolve({ verifiedJwt: { given_name: actor.givenName, @@ -136,6 +137,7 @@ function createRecordingQueueStorageService(): QueueStorageOperations { export function createMockApplicationServicesFactory(serviceMongoose: ServiceMongoose): ApplicationServicesFactory { const dataSourcesFactory = Persistence(serviceMongoose); + RegisterEventHandlers(dataSourcesFactory.withSystemPassport().domainDataSource); const blobStorageService = createNoOpBlobStorageService(); const clientOperationsService = createNoOpClientOperationsService(); const queueStorageService = createRecordingQueueStorageService(); diff --git a/packages/ocom-verification/acceptance-api/src/servers/api-graphql-test-server.ts b/packages/ocom-verification/acceptance-api/src/servers/api-graphql-test-server.ts index 5c3ce3677..3b600d72c 100644 --- a/packages/ocom-verification/acceptance-api/src/servers/api-graphql-test-server.ts +++ b/packages/ocom-verification/acceptance-api/src/servers/api-graphql-test-server.ts @@ -1,5 +1,5 @@ import { ApolloGraphQLTestServer, type TestServer } from '@cellix/serenity-framework/servers'; -import type { ApplicationServices } from '@ocom/application-services'; +import type { ApplicationServices, PrincipalHints } from '@ocom/application-services'; import { combinedSchema } from '@ocom/graphql'; import depthLimit from 'graphql-depth-limit'; import { applyMiddleware } from 'graphql-middleware'; @@ -20,7 +20,12 @@ class ApiGraphQLTestServer implements TestServer { validationRules: [depthLimit(10)], context: async ({ req }) => { this.applicationServicesFactory ??= createMockApplicationServicesFactory(mongooseTestServer.getService()); - const applicationServices = await this.applicationServicesFactory.forRequest(req.headers.authorization ?? undefined); + const requestHints: PrincipalHints = { + memberId: Array.isArray(req.headers['x-member-id']) ? req.headers['x-member-id'][0] : req.headers['x-member-id'], + communityId: Array.isArray(req.headers['x-community-id']) ? req.headers['x-community-id'][0] : req.headers['x-community-id'], + }; + const hints = requestHints.memberId || requestHints.communityId ? requestHints : undefined; + const applicationServices = await this.applicationServicesFactory.forRequest(req.headers.authorization ?? undefined, hints); if (!applicationServices) { throw new Error('ApplicationServicesFactory required for test server'); } diff --git a/packages/ocom-verification/acceptance-api/src/shared/abilities/assign-member-account.ts b/packages/ocom-verification/acceptance-api/src/shared/abilities/assign-member-account.ts new file mode 100644 index 000000000..f7f95020b --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/shared/abilities/assign-member-account.ts @@ -0,0 +1,48 @@ +import { GraphQLClient } from '@cellix/serenity-framework/clients/graphql'; +import { Ability, type Actor } from '@serenity-js/core'; +import { MEMBER_CREATE_ACCOUNT_MUTATION } from '../graphql/member-operations.ts'; + +interface AssignMemberAccountDetails { + communityId: string; + principalMemberId: string; + memberId: string; + endUserId: string; +} + +type AssignMemberAccountHandler = (actor: Actor, details: AssignMemberAccountDetails) => Promise; + +type ExecuteWithRequestOptions = = Record>( + query: string, + variables?: Record, + options?: { headers?: Record }, +) => Promise<{ data: TData; errors?: Array<{ message?: string }> }>; + +export class AssignMemberAccount extends Ability { + constructor(private readonly handler: AssignMemberAccountHandler) { + super(); + } + + static using(handler: AssignMemberAccountHandler): AssignMemberAccount { + return new AssignMemberAccount(handler); + } + + async performAs(actor: Actor, details: AssignMemberAccountDetails): Promise { + await this.handler(actor, details); + } +} + +export function assignMemberAccountAbility(): AssignMemberAccount { + return AssignMemberAccount.using(async (actor, details) => { + const graphql = GraphQLClient.as(actor) as GraphQLClient & { execute: ExecuteWithRequestOptions }; + const response = await graphql.execute( + MEMBER_CREATE_ACCOUNT_MUTATION, + { input: { memberId: details.memberId, endUserId: details.endUserId } }, + { headers: { 'x-community-id': details.communityId, 'x-member-id': details.principalMemberId } }, + ); + const result = response.data?.['memberCreateAccount'] as Record | undefined; + const status = result?.['status'] as Record | undefined; + if (status?.['success'] !== true) { + throw new Error(String(status?.['errorMessage'] ?? 'Failed to assign member account')); + } + }); +} diff --git a/packages/ocom-verification/acceptance-api/src/shared/abilities/create-community.ts b/packages/ocom-verification/acceptance-api/src/shared/abilities/create-community.ts index 3881c69d1..2106eed6a 100644 --- a/packages/ocom-verification/acceptance-api/src/shared/abilities/create-community.ts +++ b/packages/ocom-verification/acceptance-api/src/shared/abilities/create-community.ts @@ -1,6 +1,6 @@ import { GraphQLClient } from '@cellix/serenity-framework/clients/graphql'; import { Ability, type Actor } from '@serenity-js/core'; -import { COMMUNITY_CREATE_MUTATION, GET_COMMUNITY_QUERY } from '../graphql/community-operations.ts'; +import { COMMUNITY_CREATE_MUTATION, CURRENT_END_USER_QUERY, GET_COMMUNITY_QUERY } from '../graphql/community-operations.ts'; /** Community details accepted by API verification flows. */ interface CreateCommunityDetails { @@ -36,6 +36,10 @@ export class CreateCommunity extends Ability { export function createCommunityAbility(): CreateCommunity { return CreateCommunity.using(async (actor, details) => { const graphql = GraphQLClient.as(actor); + const currentEndUserResponse = await graphql.execute(CURRENT_END_USER_QUERY); + if (!(currentEndUserResponse.data['currentEndUserAndCreateIfNotExists'] as Record | undefined)?.['id']) { + throw new Error('API did not establish the authenticated end user before community creation'); + } const response = await graphql.execute(COMMUNITY_CREATE_MUTATION, { input: { name: details.name }, }); diff --git a/packages/ocom-verification/acceptance-api/src/shared/abilities/index.ts b/packages/ocom-verification/acceptance-api/src/shared/abilities/index.ts index 41d8d8913..16b3413bd 100644 --- a/packages/ocom-verification/acceptance-api/src/shared/abilities/index.ts +++ b/packages/ocom-verification/acceptance-api/src/shared/abilities/index.ts @@ -2,4 +2,6 @@ export { assignStaffRoleAbility } from './assign-staff-role.ts'; export { createCommunityAbility } from './create-community.ts'; export { createStaffRoleAbility } from './create-staff-role.ts'; export { createGraphQLClientAbility } from './graphql-client.ts'; +export { removeMemberAbility } from './remove-member.ts'; +export { updateMemberProfileAbility } from './update-member-profile.ts'; export { updateStaffRoleAbility } from './update-staff-role.ts'; diff --git a/packages/ocom-verification/acceptance-api/src/shared/abilities/list-members.ts b/packages/ocom-verification/acceptance-api/src/shared/abilities/list-members.ts new file mode 100644 index 000000000..136e6d950 --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/shared/abilities/list-members.ts @@ -0,0 +1,60 @@ +import { GraphQLClient } from '@cellix/serenity-framework/clients/graphql'; +import { Ability, type Actor } from '@serenity-js/core'; +import { MEMBERS_BY_COMMUNITY_QUERY } from '../graphql/member-operations.ts'; + +interface ListMembersDetails { + communityId: string; + principalMemberId: string; +} + +interface ListedMember { + memberName: string; +} + +type ListMembersHandler = (actor: Actor, details: ListMembersDetails) => Promise; + +export class ListMembers extends Ability { + constructor(private readonly handler: ListMembersHandler) { + super(); + } + + static using(handler: ListMembersHandler): ListMembers { + return new ListMembers(handler); + } + + async performAs(actor: Actor, details: ListMembersDetails): Promise { + return await this.handler(actor, details); + } +} + +export function listMembersAbility(): ListMembers { + return ListMembers.using(async (actor, details) => { + const graphql = GraphQLClient.as(actor); + const response = await graphql.execute( + MEMBERS_BY_COMMUNITY_QUERY, + { communityId: details.communityId }, + { + headers: { + 'x-community-id': details.communityId, + 'x-member-id': details.principalMemberId, + }, + }, + ); + + if (response.errors?.length) { + throw new Error( + response.errors + .map((error) => error.message) + .filter(Boolean) + .join('; ') || 'Failed to list members', + ); + } + + const members = response.data?.['membersByCommunityId']; + if (!Array.isArray(members)) { + throw new Error('API membersByCommunityId did not return a member list'); + } + + return members.map((member) => ({ memberName: String((member as Record)['memberName'] ?? '') })); + }); +} diff --git a/packages/ocom-verification/acceptance-api/src/shared/abilities/remove-member.ts b/packages/ocom-verification/acceptance-api/src/shared/abilities/remove-member.ts new file mode 100644 index 000000000..c77d5f113 --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/shared/abilities/remove-member.ts @@ -0,0 +1,52 @@ +import { GraphQLClient } from '@cellix/serenity-framework/clients/graphql'; +import { Ability, type Actor } from '@serenity-js/core'; +import { REMOVE_MEMBER_MUTATION } from '../graphql/member-operations.ts'; + +interface RemoveMemberDetails { + memberId: string; + communityId: string; + principalMemberId: string; + authorizationToken?: string; +} + +type ExecuteWithRequestOptions = = Record>( + query: string, + variables?: Record, + options?: { headers?: Record }, +) => Promise<{ data: TData; errors?: Array<{ message?: string }> }>; + +export class RemoveMember extends Ability { + constructor(private readonly handler: (actor: Actor, details: RemoveMemberDetails) => Promise) { + super(); + } + + static using(handler: (actor: Actor, details: RemoveMemberDetails) => Promise): RemoveMember { + return new RemoveMember(handler); + } + + async performAs(actor: Actor, details: RemoveMemberDetails): Promise { + await this.handler(actor, details); + } +} + +export function removeMemberAbility(): RemoveMember { + return RemoveMember.using(async (actor, details) => { + const graphql = GraphQLClient.as(actor) as GraphQLClient & { execute: ExecuteWithRequestOptions }; + const response = await graphql.execute( + REMOVE_MEMBER_MUTATION, + { input: { memberId: details.memberId } }, + { + headers: { + 'x-community-id': details.communityId, + 'x-member-id': details.principalMemberId, + ...(details.authorizationToken ? { Authorization: `Bearer ${details.authorizationToken}` } : {}), + }, + }, + ); + const result = response.data?.['removeMember'] as Record | undefined; + const status = result?.['status'] as Record | undefined; + if (status?.['success'] !== true) { + throw new Error(String(status?.['errorMessage'] ?? response.errors?.map((error) => error.message).join('; ') ?? 'Failed to remove member')); + } + }); +} diff --git a/packages/ocom-verification/acceptance-api/src/shared/abilities/update-member-profile.ts b/packages/ocom-verification/acceptance-api/src/shared/abilities/update-member-profile.ts new file mode 100644 index 000000000..0943cc6e6 --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/shared/abilities/update-member-profile.ts @@ -0,0 +1,121 @@ +import { GraphQLClient } from '@cellix/serenity-framework/clients/graphql'; +import { Ability, type Actor } from '@serenity-js/core'; +import { MEMBER_UPDATE_PROFILE_MUTATION } from '../graphql/member-operations.ts'; + +export interface MemberProfileUpdate { + name?: string; + email?: string; + bio?: string; + avatarDocumentId?: string; + interests?: string[]; + showInterests?: boolean; + showEmail?: boolean; + showProfile?: boolean; + showLocation?: boolean; + showProperties?: boolean; +} + +interface UpdateMemberProfileDetails { + memberId: string; + profile: MemberProfileUpdate; + communityId: string; + principalMemberId: string; +} + +interface UpdateMemberProfileResult { + id?: string; + profile?: MemberProfileUpdate; +} + +type UpdateMemberProfileHandler = (actor: Actor, details: UpdateMemberProfileDetails) => Promise; + +type ExecuteWithRequestOptions = = Record>( + query: string, + variables?: Record, + options?: { headers?: Record }, +) => Promise<{ data: TData; errors?: Array<{ message?: string }> }>; + +export class UpdateMemberProfile extends Ability { + constructor(private readonly handler: UpdateMemberProfileHandler) { + super(); + } + + static using(handler: UpdateMemberProfileHandler): UpdateMemberProfile { + return new UpdateMemberProfile(handler); + } + + async performAs(actor: Actor, details: UpdateMemberProfileDetails): Promise { + return await this.handler(actor, details); + } +} + +export function updateMemberProfileAbility(): UpdateMemberProfile { + return UpdateMemberProfile.using(async (actor, details) => { + const graphql = GraphQLClient.as(actor) as GraphQLClient & { execute: ExecuteWithRequestOptions }; + if (!details.communityId) { + throw new Error('communityId is required to update a member profile'); + } + if (!details.memberId) { + throw new Error('memberId is required to update a member profile'); + } + if (!details.profile || Object.keys(details.profile).length === 0) { + throw new Error('At least one profile field is required to update a member profile'); + } + if (!details.principalMemberId) { + throw new Error('principalMemberId is required to update a member profile'); + } + + const profileResponse = await graphql.execute( + MEMBER_UPDATE_PROFILE_MUTATION, + { + input: { + memberId: details.memberId, + profile: { + ...(details.profile.name !== undefined ? { name: details.profile.name } : {}), + ...(details.profile.email !== undefined ? { email: details.profile.email } : {}), + ...(details.profile.bio !== undefined ? { bio: details.profile.bio } : {}), + ...(details.profile.avatarDocumentId !== undefined ? { avatarDocumentId: details.profile.avatarDocumentId } : {}), + ...(details.profile.interests !== undefined ? { interests: details.profile.interests } : {}), + ...(details.profile.showInterests !== undefined ? { showInterests: details.profile.showInterests } : {}), + ...(details.profile.showEmail !== undefined ? { showEmail: details.profile.showEmail } : {}), + ...(details.profile.showProfile !== undefined ? { showProfile: details.profile.showProfile } : {}), + ...(details.profile.showLocation !== undefined ? { showLocation: details.profile.showLocation } : {}), + ...(details.profile.showProperties !== undefined ? { showProperties: details.profile.showProperties } : {}), + }, + }, + }, + { + headers: { + 'x-community-id': details.communityId, + 'x-member-id': details.principalMemberId, + }, + }, + ); + + const updateResult = profileResponse.data?.['memberUpdateProfile'] as Record | undefined; + const updateStatus = updateResult?.['status'] as Record | undefined; + if (updateStatus?.['success'] !== true) { + throw new Error(String(updateStatus?.['errorMessage'] ?? 'Failed to update member profile')); + } + + const updatedMember = updateResult?.['member'] as Record | undefined; + const profile = updatedMember?.['profile'] as Record | undefined; + const interests = Array.isArray(profile?.['interests']) ? (profile?.['interests'] as Array).map((value) => String(value)).filter((value) => value.length > 0) : undefined; + + return { + id: String(updatedMember?.['id'] ?? details.memberId), + profile: { + ...(profile?.['name'] !== undefined ? { name: String(profile['name'] ?? '') } : {}), + ...(profile?.['email'] !== undefined ? { email: String(profile['email'] ?? '') } : {}), + ...(profile?.['bio'] !== undefined ? { bio: String(profile['bio'] ?? '') } : {}), + ...(profile?.['avatarDocumentId'] !== undefined ? { avatarDocumentId: String(profile['avatarDocumentId'] ?? '') } : {}), + ...(interests !== undefined ? { interests } : {}), + ...(profile?.['showInterests'] !== undefined ? { showInterests: Boolean(profile['showInterests']) } : {}), + ...(profile?.['showEmail'] !== undefined ? { showEmail: Boolean(profile['showEmail']) } : {}), + ...(profile?.['showProfile'] !== undefined ? { showProfile: Boolean(profile['showProfile']) } : {}), + ...(profile?.['showLocation'] !== undefined ? { showLocation: Boolean(profile['showLocation']) } : {}), + ...(profile?.['showProperties'] !== undefined ? { showProperties: Boolean(profile['showProperties']) } : {}), + }, + }; + }); +} diff --git a/packages/ocom-verification/acceptance-api/src/shared/abilities/update-member-role.ts b/packages/ocom-verification/acceptance-api/src/shared/abilities/update-member-role.ts new file mode 100644 index 000000000..b31cf7a23 --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/shared/abilities/update-member-role.ts @@ -0,0 +1,49 @@ +import { GraphQLClient } from '@cellix/serenity-framework/clients/graphql'; +import { Ability, type Actor } from '@serenity-js/core'; +import { MEMBER_ROLE_UPDATE_MUTATION } from '../graphql/member-operations.ts'; + +interface UpdateMemberRoleDetails { + memberId: string; + roleId: string; + communityId: string; + principalMemberId: string; +} + +type ExecuteWithRequestOptions = = Record>( + query: string, + variables?: Record, + options?: { headers?: Record }, +) => Promise<{ data: TData; errors?: Array<{ message?: string }> }>; + +export class UpdateMemberRole extends Ability { + constructor(private readonly handler: (actor: Actor, details: UpdateMemberRoleDetails) => Promise) { + super(); + } + + static using(handler: (actor: Actor, details: UpdateMemberRoleDetails) => Promise): UpdateMemberRole { + return new UpdateMemberRole(handler); + } + + async performAs(actor: Actor, details: UpdateMemberRoleDetails): Promise { + return await this.handler(actor, details); + } +} + +export function updateMemberRoleAbility(): UpdateMemberRole { + return UpdateMemberRole.using(async (actor, details) => { + const graphql = GraphQLClient.as(actor) as GraphQLClient & { execute: ExecuteWithRequestOptions }; + const response = await graphql.execute( + MEMBER_ROLE_UPDATE_MUTATION, + { input: { memberId: details.memberId, roleId: details.roleId, reason: 'Role assignment verification' } }, + { headers: { 'x-community-id': details.communityId, 'x-member-id': details.principalMemberId } }, + ); + const result = response.data?.['memberRoleUpdate'] as Record | undefined; + const status = result?.['status'] as Record | undefined; + if (status?.['success'] !== true) { + throw new Error(String(status?.['errorMessage'] ?? response.errors?.map((error) => error.message).join('; ') ?? 'Failed to update member role')); + } + const member = result?.['member'] as Record | undefined; + const role = member?.['role'] as Record | undefined; + return String(role?.['roleName'] ?? ''); + }); +} diff --git a/packages/ocom-verification/acceptance-api/src/shared/graphql/community-operations.ts b/packages/ocom-verification/acceptance-api/src/shared/graphql/community-operations.ts index f239508d5..b25cfb1c7 100644 --- a/packages/ocom-verification/acceptance-api/src/shared/graphql/community-operations.ts +++ b/packages/ocom-verification/acceptance-api/src/shared/graphql/community-operations.ts @@ -13,6 +13,14 @@ export const COMMUNITY_CREATE_MUTATION = ` } `; +export const CURRENT_END_USER_QUERY = ` + query CurrentEndUserAndCreateIfNotExists { + currentEndUserAndCreateIfNotExists { + id + } + } +`; + export const GET_COMMUNITY_QUERY = ` query CommunityById($id: ObjectID!) { communityById(id: $id) { diff --git a/packages/ocom-verification/acceptance-api/src/shared/graphql/member-operations.ts b/packages/ocom-verification/acceptance-api/src/shared/graphql/member-operations.ts new file mode 100644 index 000000000..403dbc64a --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/shared/graphql/member-operations.ts @@ -0,0 +1,141 @@ +export const MEMBER_CREATE_MUTATION = ` + mutation MemberCreate($input: MemberCreateInput!) { + memberCreate(input: $input) { + status { + success + errorMessage + } + member { + id + memberName + } + } + } +`; + +export const REMOVE_MEMBER_MUTATION = ` + mutation RemoveMember($input: RemoveMemberInput!) { + removeMember(input: $input) { + status { + success + errorMessage + } + } + } +`; + +export const MEMBER_ROLE_UPDATE_MUTATION = ` + mutation MemberRoleUpdate($input: UpdateMemberRoleInput!) { + memberRoleUpdate(input: $input) { + status { + success + errorMessage + } + member { + id + role { + id + roleName + } + } + } + } +`; + +export const MEMBER_UPDATE_PROFILE_MUTATION = ` + mutation MemberUpdateProfile($input: MemberUpdateProfileInput!) { + memberUpdateProfile(input: $input) { + status { + success + errorMessage + } + member { + id + profile { + name + email + bio + avatarDocumentId + interests + showInterests + showEmail + showProfile + showLocation + showProperties + } + } + } + } +`; + +export const MEMBER_CREATE_ACCOUNT_MUTATION = ` + mutation MemberCreateAccount($input: MemberCreateAccountInput!) { + memberCreateAccount(input: $input) { + status { + success + errorMessage + } + member { + id + } + } + } +`; + +export const END_USERS_BY_COMMUNITY_QUERY = ` + query EndUsersByCommunity($communityId: ObjectID!) { + endUsersByCommunityId(communityId: $communityId) { + id + displayName + } + } +`; + +export const MEMBERS_FOR_CURRENT_END_USER_QUERY = ` + query MembersForCurrentEndUser { + membersForCurrentEndUser { + id + community { + id + } + } + } +`; + +export const MEMBERS_BY_COMMUNITY_QUERY = ` + query MembersByCommunity($communityId: ObjectID!) { + membersByCommunityId(communityId: $communityId) { + id + memberName + } + } +`; + +export const MEMBER_BY_ID_QUERY = ` + query MemberById($id: ObjectID!) { + member(id: $id) { + id + memberName + community { + id + } + accounts { + user { + id + } + } + profile { + name + email + bio + avatarDocumentId + interests + showInterests + showEmail + showProfile + showLocation + showProperties + } + } + } +`; diff --git a/packages/ocom-verification/acceptance-api/src/shared/interactions/execute-graphql.ts b/packages/ocom-verification/acceptance-api/src/shared/interactions/execute-graphql.ts new file mode 100644 index 000000000..9d10151d1 --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/shared/interactions/execute-graphql.ts @@ -0,0 +1,15 @@ +import { GraphQLClient, type GraphQLExecuteOptions, type GraphQLResponse } from '@cellix/serenity-framework/clients/graphql'; +import { Interaction, TakeNotes } from '@serenity-js/core'; + +export interface GraphQLResponseNotes { + lastGraphQLResponse: GraphQLResponse; +} + +/** Executes a GraphQL operation and records its response for the current actor. */ +export const ExecuteGraphQL = { + operation: (query: string, variables?: Record, options?: GraphQLExecuteOptions) => + Interaction.where('#actor executes a GraphQL operation', async (actor) => { + const response = await GraphQLClient.as(actor).execute(query, variables, options); + TakeNotes.as(actor).notepad.set('lastGraphQLResponse', response); + }), +} as const; diff --git a/packages/ocom-verification/acceptance-api/src/shared/questions/last-graphql-response.ts b/packages/ocom-verification/acceptance-api/src/shared/questions/last-graphql-response.ts new file mode 100644 index 000000000..0b269bf6a --- /dev/null +++ b/packages/ocom-verification/acceptance-api/src/shared/questions/last-graphql-response.ts @@ -0,0 +1,21 @@ +import { notes, Question } from '@serenity-js/core'; +import type { GraphQLResponseNotes } from '../interactions/execute-graphql.ts'; + +/** Reads a field from the GraphQL response most recently recorded for the actor. */ +export const LastGraphQLResponse = { + field: (path: string) => + Question.about(`the "${path}" field of the last GraphQL response`, async (actor) => { + const response = await actor.answer(notes().get('lastGraphQLResponse')); + return getByPath(response.data, path) as TValue; + }), +} as const; + +function getByPath(value: unknown, path: string): unknown { + return path.split('.').reduce((current, segment) => { + if (!current || typeof current !== 'object') { + return undefined; + } + + return (current as Record)[segment]; + }, value); +} diff --git a/packages/ocom-verification/acceptance-api/src/world.ts b/packages/ocom-verification/acceptance-api/src/world.ts index f2a1db5e4..0c33b55e0 100644 --- a/packages/ocom-verification/acceptance-api/src/world.ts +++ b/packages/ocom-verification/acceptance-api/src/world.ts @@ -3,10 +3,15 @@ import type { ApiInfrastructureState } from '@cellix/serenity-framework/infrastr import { SerenityCast } from '@cellix/serenity-framework/serenity'; import { registerLifecycleHooks } from './cucumber-lifecycle-hooks.ts'; import { infrastructure } from './infrastructure.ts'; +import { assignMemberAccountAbility } from './shared/abilities/assign-member-account.ts'; import { assignStaffRoleAbility } from './shared/abilities/assign-staff-role.ts'; import { createCommunityAbility } from './shared/abilities/create-community.ts'; import { createStaffRoleAbility } from './shared/abilities/create-staff-role.ts'; import { createGraphQLClientAbility } from './shared/abilities/graphql-client.ts'; +import { listMembersAbility } from './shared/abilities/list-members.ts'; +import { removeMemberAbility } from './shared/abilities/remove-member.ts'; +import { updateMemberProfileAbility } from './shared/abilities/update-member-profile.ts'; +import { updateMemberRoleAbility } from './shared/abilities/update-member-role.ts'; import { updateStaffRoleAbility } from './shared/abilities/update-staff-role.ts'; export const CellixApiWorld = registerManagedSerenityWorld({ @@ -19,7 +24,21 @@ export const CellixApiWorld = registerManagedSerenityWorld({ createCast: (state) => new SerenityCast({ useNotepad: true, - abilities: [(actor) => createGraphQLClientAbility(graphqlUrl(state), actor.name), () => createCommunityAbility(), () => createStaffRoleAbility(), () => updateStaffRoleAbility(), () => assignStaffRoleAbility()], + abilities: [ + (actor) => createGraphQLClientAbility(graphqlUrl(state), actor.name), + () => createCommunityAbility(), + () => createStaffRoleAbility(), + () => updateStaffRoleAbility(), + () => assignStaffRoleAbility(), + () => listMembersAbility(), + () => assignMemberAccountAbility(), + () => updateMemberProfileAbility(), + () => removeMemberAbility(), + () => updateMemberRoleAbility(), + () => createStaffRoleAbility(), + () => updateStaffRoleAbility(), + () => assignStaffRoleAbility(), + ], }), }); diff --git a/packages/ocom-verification/acceptance-ui/src/contexts/community/notes/member-notes.ts b/packages/ocom-verification/acceptance-ui/src/contexts/community/notes/member-notes.ts new file mode 100644 index 000000000..3a7fab4a4 --- /dev/null +++ b/packages/ocom-verification/acceptance-ui/src/contexts/community/notes/member-notes.ts @@ -0,0 +1,28 @@ +export interface MemberUiNotes { + endUserIdsByLabel: Record; + membersByCommunityName: Record; + lastMemberId: string; + lastLinkedEndUserId: string; + memberCreated: boolean; + memberRemoved: boolean; + memberValidationError: string; + memberAccountLinked: boolean; + memberAccountCount: number; + memberAuthorizationError: string; + memberUpdated: boolean; + updatedMemberProfile: MemberProfileFormValues; + expectedMemberProfile: MemberProfileExpectation; +} + +export interface MemberProfileFormValues { + name: string; + email: string; + bio: string; + showInterests: boolean; + showEmail: boolean; + showProfile: boolean; + showLocation: boolean; + showProperties: boolean; +} + +export type MemberProfileExpectation = MemberProfileFormValues; diff --git a/packages/ocom-verification/acceptance-ui/src/contexts/community/questions/member-account-linked.ts b/packages/ocom-verification/acceptance-ui/src/contexts/community/questions/member-account-linked.ts new file mode 100644 index 000000000..2dadf242a --- /dev/null +++ b/packages/ocom-verification/acceptance-ui/src/contexts/community/questions/member-account-linked.ts @@ -0,0 +1,11 @@ +import { notes, Question } from '@serenity-js/core'; +import type { MemberUiNotes } from '../notes/member-notes.ts'; + +export const MemberAccountLinked = (endUserId: string) => + Question.about('whether the member account was linked', async (actor) => { + const linked = await actor.answer(notes().get('memberAccountLinked')); + const linkedEndUserId = await actor.answer(notes().get('lastLinkedEndUserId')); + return linked && linkedEndUserId === endUserId; + }); + +export const MemberAccountCount = () => Question.about('the number of member account links', (actor) => actor.answer(notes().get('memberAccountCount'))); diff --git a/packages/ocom-verification/acceptance-ui/src/contexts/community/questions/member-created-flag.ts b/packages/ocom-verification/acceptance-ui/src/contexts/community/questions/member-created-flag.ts new file mode 100644 index 000000000..f0f90091d --- /dev/null +++ b/packages/ocom-verification/acceptance-ui/src/contexts/community/questions/member-created-flag.ts @@ -0,0 +1,4 @@ +import { notes, Question } from '@serenity-js/core'; +import type { MemberUiNotes } from '../notes/member-notes.ts'; + +export const MemberCreatedFlag = () => Question.about('whether the member form was submitted', (actor) => actor.answer(notes().get('memberCreated'))); diff --git a/packages/ocom-verification/acceptance-ui/src/contexts/community/questions/member-listed-in-community.ts b/packages/ocom-verification/acceptance-ui/src/contexts/community/questions/member-listed-in-community.ts new file mode 100644 index 000000000..ad94e0fc0 --- /dev/null +++ b/packages/ocom-verification/acceptance-ui/src/contexts/community/questions/member-listed-in-community.ts @@ -0,0 +1,10 @@ +import { RenderInDom } from '@cellix/serenity-framework/dom/render-in-dom'; +import { DomPageAdapter } from '@cellix/serenity-framework/pages/dom'; +import { MemberListPage } from '@ocom-verification/verification-shared/pages'; +import { Question } from '@serenity-js/core'; + +export const MemberListedInCommunity = (memberName: string) => + Question.about(`whether member "${memberName}" appears in the rendered member list`, async (actor) => { + const page = new MemberListPage(new DomPageAdapter(RenderInDom.as(actor).container)); + return await page.memberName(memberName).isVisible(); + }); diff --git a/packages/ocom-verification/acceptance-ui/src/contexts/community/questions/member-profile-updated.ts b/packages/ocom-verification/acceptance-ui/src/contexts/community/questions/member-profile-updated.ts new file mode 100644 index 000000000..033809a80 --- /dev/null +++ b/packages/ocom-verification/acceptance-ui/src/contexts/community/questions/member-profile-updated.ts @@ -0,0 +1,6 @@ +import { notes, Question } from '@serenity-js/core'; +import type { MemberProfileFormValues, MemberUiNotes } from '../notes/member-notes.ts'; + +export const UpdatedMemberProfile = () => Question.about('the submitted member profile', (actor) => actor.answer(notes().get('updatedMemberProfile')) as Promise); + +export const MemberUpdatedFlag = () => Question.about('whether the member profile was updated', (actor) => actor.answer(notes().get('memberUpdated'))); diff --git a/packages/ocom-verification/acceptance-ui/src/contexts/community/questions/member-removed-flag.ts b/packages/ocom-verification/acceptance-ui/src/contexts/community/questions/member-removed-flag.ts new file mode 100644 index 000000000..d451cd9f4 --- /dev/null +++ b/packages/ocom-verification/acceptance-ui/src/contexts/community/questions/member-removed-flag.ts @@ -0,0 +1,4 @@ +import { notes, Question } from '@serenity-js/core'; +import type { MemberUiNotes } from '../notes/member-notes.ts'; + +export const MemberRemovedFlag = () => Question.about('whether the member was removed', (actor) => actor.answer(notes().get('memberRemoved'))); diff --git a/packages/ocom-verification/acceptance-ui/src/contexts/community/step-definitions/assign-member-account.steps.tsx b/packages/ocom-verification/acceptance-ui/src/contexts/community/step-definitions/assign-member-account.steps.tsx new file mode 100644 index 000000000..c4f6008b2 --- /dev/null +++ b/packages/ocom-verification/acceptance-ui/src/contexts/community/step-definitions/assign-member-account.steps.tsx @@ -0,0 +1,91 @@ +import { Render } from '@cellix/serenity-framework/dom/render-in-dom'; +import { Given, Then, When } from '@cucumber/cucumber'; +import { actors, END_USER_IDS } from '@ocom-verification/verification-shared/test-data'; +import { actorCalled, actorInTheSpotlight, notes } from '@serenity-js/core'; +import React from 'react'; +import { MembersAccountsAdd } from '../../../../../../ocom/ui-community-route-admin/src/components/members-accounts-add.tsx'; +import type { AdminMembersAccountsAddContainerEndUserFieldsFragment, MemberCreateAccountInput } from '../../../../../../ocom/ui-community-route-admin/src/generated.tsx'; +import { wrapOcomComponent } from '../../../shared/ocom-component-wrapper.ts'; +import type { MemberUiNotes } from '../notes/member-notes.ts'; +import { MemberAccountCount, MemberAccountLinked } from '../questions/member-account-linked.ts'; +import { AssignMemberAccount } from '../tasks/assign-member-account.ts'; + +const reactGlobal = globalThis as typeof globalThis & { React?: typeof React }; +reactGlobal.React ??= React; + +const accountDetails: Record = { + Charlie: { + id: END_USER_IDS.communityOwner, + displayName: `${actors.CommunityOwner.givenName} ${actors.CommunityOwner.familyName}`, + email: actors.CommunityOwner.email, + }, +}; + +Given('end-user account {string} is available for assignment in {string}', async (accountLabel: string, _communityName: string) => { + const actor = actorInTheSpotlight(); + const account = accountDetails[accountLabel]; + if (!account) { + throw new Error(`Unknown end-user account label "${accountLabel}"`); + } + const memberId = await actor.answer(notes().get('lastMemberId')); + const endUser: AdminMembersAccountsAddContainerEndUserFieldsFragment = { + id: account.id, + displayName: account.displayName, + personalInformation: { contactInformation: { email: account.email } }, + }; + const onSave = async (values: MemberCreateAccountInput): Promise => { + const accountCount = await actor.answer(notes().get('memberAccountCount')).catch(() => 0); + if (accountCount > 0) { + await actor.attemptsTo(notes().set('memberValidationError', 'Selected user is already associated with this member')); + return; + } + await actor.attemptsTo( + notes().set('memberAccountLinked', values.memberId === memberId && values.endUserId === account.id), + notes().set('lastLinkedEndUserId', String(values.endUserId)), + notes().set('memberAccountCount', accountCount + 1), + notes().set('memberValidationError', ''), + ); + }; + await actor.attemptsTo( + notes().set('endUserIdsByLabel', { [accountLabel]: account.id }), + notes().set('memberAccountLinked', false), + notes().set('memberAccountCount', 0), + notes().set('lastLinkedEndUserId', ''), + Render.component( + , + { wrapper: wrapOcomComponent() }, + ), + ); +}); + +When('{word} associates end-user account {string} to member {string} in {string}', async (actorName: string, accountLabel: string, _memberName: string, _communityName: string) => { + const account = accountDetails[accountLabel]; + if (!account) { + throw new Error(`Unknown end-user account label "${accountLabel}"`); + } + await actorCalled(actorName).attemptsTo(notes().set('memberValidationError', ''), AssignMemberAccount()); +}); + +Given('member {string} is already linked to end-user account {string}', async (_memberName: string, _accountLabel: string) => { + await actorInTheSpotlight().attemptsTo(AssignMemberAccount()); +}); + +Then('member {string} should be linked to end-user account {string}', async (_memberName: string, accountLabel: string) => { + const actor = actorInTheSpotlight(); + const endUserIds = await actor.answer(notes().get('endUserIdsByLabel')); + if (!(await actor.answer(MemberAccountLinked(endUserIds[accountLabel] ?? '')))) { + throw new Error(`Expected the member to be linked to end-user account "${accountLabel}"`); + } +}); + +Then('member {string} should remain linked to end-user account {string} only once', async (_memberName: string, _accountLabel: string) => { + const count = await actorInTheSpotlight().answer(MemberAccountCount()); + if (count !== 1) { + throw new Error(`Expected one member account association but found ${count}`); + } +}); diff --git a/packages/ocom-verification/acceptance-ui/src/contexts/community/step-definitions/create-member.steps.tsx b/packages/ocom-verification/acceptance-ui/src/contexts/community/step-definitions/create-member.steps.tsx new file mode 100644 index 000000000..6a049401a --- /dev/null +++ b/packages/ocom-verification/acceptance-ui/src/contexts/community/step-definitions/create-member.steps.tsx @@ -0,0 +1,117 @@ +import { GherkinDataTable } from '@cellix/serenity-framework/cucumber/gherkin-data-table'; +import { Render, RenderInDom } from '@cellix/serenity-framework/dom/render-in-dom'; +import { DomPageAdapter } from '@cellix/serenity-framework/pages/dom'; +import { type DataTable, Given, Then, When } from '@cucumber/cucumber'; +import { MemberCreatePage } from '@ocom-verification/verification-shared/pages'; +import { actorCalled, actorInTheSpotlight, notes } from '@serenity-js/core'; +import React from 'react'; +import { MembersCreate } from '../../../../../../ocom/ui-community-route-admin/src/components/members-create.tsx'; +import { MemberProfile } from '../../../../../../ocom/ui-community-shared/src/components/member-profile.tsx'; +import type { SharedMemberProfileContainerMemberFieldsFragment } from '../../../../../../ocom/ui-community-shared/src/generated.tsx'; +import { wrapOcomComponent } from '../../../shared/ocom-component-wrapper.ts'; +import type { AcceptanceUiMemberCreatePage } from '../../../shared/page-contracts.ts'; +import type { MemberProfileFormValues, MemberUiNotes } from '../notes/member-notes.ts'; +import { MemberCreatedFlag } from '../questions/member-created-flag.ts'; +import { CreateMember } from '../tasks/create-member.ts'; + +const reactGlobal = globalThis as typeof globalThis & { React?: typeof React }; +reactGlobal.React ??= React; + +interface MemberDetails { + memberName?: string; +} + +Given('{word} is signed in as a community owner for member management', async (actorName: string) => { + const actor = actorCalled(actorName); + + const onSave = async (): Promise => { + await actor.attemptsTo(notes().set('memberCreated', true)); + }; + + await actor.attemptsTo(notes().set('memberCreated', false), Render.component(, { wrapper: wrapOcomComponent() })); +}); + +Given('{word} has a community named {string}', (_actorName: string, _communityName: string) => undefined); + +When('{word} creates a member in {string} with:', async (actorName: string, communityName: string, dataTable: DataTable) => { + const actor = actorCalled(actorName); + const details = GherkinDataTable.from(dataTable).rowsHash(); + const memberName = details.memberName?.trim() ?? ''; + + if (!memberName) { + throw new Error('memberName is required'); + } + + await actor.attemptsTo(CreateMember(memberName)); + await actor.attemptsTo(notes().set('lastMemberId', 'member-charlie-walker')); + const membersByCommunityName = await actor.answer(notes().get('membersByCommunityName')).catch(() => ({})); + await actor.attemptsTo( + notes().set('membersByCommunityName', { + ...membersByCommunityName, + [communityName]: [...(membersByCommunityName[communityName] ?? []), memberName], + }), + ); + + const onProfileSave = async (profile: MemberProfileFormValues): Promise => { + await actor.attemptsTo(notes().set('memberUpdated', true), notes().set('updatedMemberProfile', profile)); + return true; + }; + const profileData: SharedMemberProfileContainerMemberFieldsFragment = { + id: 'member-charlie-walker', + memberName, + profile: { + name: '', + email: '', + bio: '', + showInterests: false, + showEmail: false, + showProfile: false, + showLocation: false, + showProperties: false, + }, + createdAt: new Date(), + updatedAt: new Date(), + }; + + await actor.attemptsTo( + notes().set('memberUpdated', false), + Render.component( + , + { wrapper: wrapOcomComponent() }, + ), + ); +}); + +Then('the member should be created successfully in {string}', async (_communityName: string) => { + const submitted = await actorInTheSpotlight().answer(MemberCreatedFlag()); + if (!submitted) { + throw new Error('Expected member form to be submitted'); + } +}); + +When('{word} attempts to create a member in {string} with:', async (actorName: string, _communityName: string, dataTable: DataTable) => { + const actor = actorCalled(actorName); + const details = GherkinDataTable.from(dataTable).rowsHash(); + await actor.attemptsTo(notes().set('memberCreated', false), notes().set('memberValidationError', ''), CreateMember(details.memberName?.trim() ?? '')); + const page: AcceptanceUiMemberCreatePage = new MemberCreatePage(new DomPageAdapter(RenderInDom.as(actor).container)); + await actor.attemptsTo(notes().set('memberValidationError', (await page.validationError.textContent()) ?? '')); +}); + +Then('she should see a member error for {string}', async (fieldName: string) => { + const error = await actorInTheSpotlight().answer(notes().get('memberValidationError')); + const isFieldMentioned = error.toLowerCase().includes(fieldName.toLowerCase()); + if (!error || (!isFieldMentioned && !/cannot be empty|required|missing|invalid|must not be empty|please input|already associated/i.test(error))) { + throw new Error(`Expected a validation error related to "${fieldName}", but got: "${error}"`); + } +}); + +Then('no new member should be created in {string}', async (_communityName: string) => { + if (await actorInTheSpotlight().answer(MemberCreatedFlag())) { + throw new Error('Expected no member to be created, but the form was submitted'); + } +}); diff --git a/packages/ocom-verification/acceptance-ui/src/contexts/community/step-definitions/index.ts b/packages/ocom-verification/acceptance-ui/src/contexts/community/step-definitions/index.ts index bc657d814..4d3489e7d 100644 --- a/packages/ocom-verification/acceptance-ui/src/contexts/community/step-definitions/index.ts +++ b/packages/ocom-verification/acceptance-ui/src/contexts/community/step-definitions/index.ts @@ -1,2 +1,7 @@ // Community context step definitions import './create-community.steps.tsx'; +import './create-member.steps.tsx'; +import './list-members.steps.tsx'; +import './remove-member.steps.tsx'; +import './assign-member-account.steps.tsx'; +import './update-member.steps.tsx'; diff --git a/packages/ocom-verification/acceptance-ui/src/contexts/community/step-definitions/list-members.steps.tsx b/packages/ocom-verification/acceptance-ui/src/contexts/community/step-definitions/list-members.steps.tsx new file mode 100644 index 000000000..341bfa0ce --- /dev/null +++ b/packages/ocom-verification/acceptance-ui/src/contexts/community/step-definitions/list-members.steps.tsx @@ -0,0 +1,61 @@ +import { type DataTable, Given, Then, When } from '@cucumber/cucumber'; +import { actorCalled, actorInTheSpotlight, notes } from '@serenity-js/core'; +import type { MemberUiNotes } from '../notes/member-notes.ts'; +import { MemberListedInCommunity } from '../questions/member-listed-in-community.ts'; +import { ListMembers } from '../tasks/list-members.tsx'; +import { SearchMemberList } from '../tasks/search-member-list.ts'; + +interface ListedMemberDetails { + memberName: string; + role?: string; +} + +Given('{word} is an authenticated community admin for {string}', async (actorName: string, _communityName: string) => { + const owner = actorInTheSpotlight(); + const membersByCommunityName = await owner.answer(notes().get('membersByCommunityName')).catch(() => ({})); + await actorCalled(actorName).attemptsTo(notes().set('membersByCommunityName', membersByCommunityName)); +}); + +Given('the following members exist in {string}:', async (communityName: string, dataTable: DataTable) => { + const actor = actorInTheSpotlight(); + const membersByCommunityName = await actor.answer(notes().get('membersByCommunityName')).catch(() => ({})); + await actor.attemptsTo( + notes().set('membersByCommunityName', { + ...membersByCommunityName, + [communityName]: (dataTable.hashes() as ListedMemberDetails[]).map(({ memberName }) => memberName.trim()), + }), + ); +}); + +When('{word} lists members for {string}', async (actorName: string, communityName: string) => { + const actor = actorCalled(actorName); + const membersByCommunityName = await actor.answer(notes().get('membersByCommunityName')); + await actor.attemptsTo(ListMembers(membersByCommunityName[communityName] ?? [])); +}); + +When('{word} searches the member list in {string} for {string}', async (actorName: string, communityName: string, searchTerm: string) => { + const actor = actorCalled(actorName); + const membersByCommunityName = await actor.answer(notes().get('membersByCommunityName')); + await actor.attemptsTo(ListMembers(membersByCommunityName[communityName] ?? []), SearchMemberList(searchTerm)); +}); + +Then('{word} should see the following members in {string}:', async (actorName: string, _communityName: string, dataTable: DataTable) => { + const actor = actorCalled(actorName); + for (const { memberName } of dataTable.hashes() as ListedMemberDetails[]) { + if (!(await actor.answer(MemberListedInCommunity(memberName)))) { + throw new Error(`Expected member "${memberName}" to appear in the rendered member list`); + } + } +}); + +Then('{word} should not see member {string} from {string}', async (actorName: string, memberName: string, _communityName: string) => { + if (await actorCalled(actorName).answer(MemberListedInCommunity(memberName))) { + throw new Error(`Expected member "${memberName}" not to appear in the rendered member list`); + } +}); + +Then('{word} should not see member {string} in the filtered results', async (actorName: string, memberName: string) => { + if (await actorCalled(actorName).answer(MemberListedInCommunity(memberName))) { + throw new Error(`Expected member "${memberName}" not to appear in the filtered member list`); + } +}); diff --git a/packages/ocom-verification/acceptance-ui/src/contexts/community/step-definitions/remove-member.steps.tsx b/packages/ocom-verification/acceptance-ui/src/contexts/community/step-definitions/remove-member.steps.tsx new file mode 100644 index 000000000..8d72b1cc0 --- /dev/null +++ b/packages/ocom-verification/acceptance-ui/src/contexts/community/step-definitions/remove-member.steps.tsx @@ -0,0 +1,112 @@ +import { Render } from '@cellix/serenity-framework/dom/render-in-dom'; +import { Given, Then, When } from '@cucumber/cucumber'; +import { actorCalled, actorInTheSpotlight, notes } from '@serenity-js/core'; +import { MemberList } from '../../../../../../ocom/ui-community-route-admin/src/components/members-list.tsx'; +import type { AdminMemberListContainerMemberFieldsFragment } from '../../../../../../ocom/ui-community-route-admin/src/generated.tsx'; +import { wrapOcomComponent } from '../../../shared/ocom-component-wrapper.ts'; +import type { MemberUiNotes } from '../notes/member-notes.ts'; +import { MemberListedInCommunity } from '../questions/member-listed-in-community.ts'; +import { MemberRemovedFlag } from '../questions/member-removed-flag.ts'; +import { RemoveMember } from '../tasks/remove-member.ts'; + +Given('{word} is signed in without membership in {string}', async (actorName: string, _communityName: string) => { + const owner = actorInTheSpotlight(); + const memberId = await owner.answer(notes().get('lastMemberId')); + const actor = actorCalled(actorName); + const member: AdminMemberListContainerMemberFieldsFragment = { + id: memberId, + memberName: 'Charlie Walker', + isAdmin: false, + accounts: [], + profile: null, + createdAt: new Date(), + updatedAt: new Date(), + }; + const onRemoveMember = async (): Promise => { + await actor.attemptsTo(notes().set('memberAuthorizationError', 'You do not have permission to remove this member'), notes().set('memberRemoved', false)); + return false; + }; + await actor.attemptsTo( + notes().set('lastMemberId', memberId), + notes().set('memberRemoved', false), + notes().set('memberAuthorizationError', ''), + Render.component( + , + { wrapper: wrapOcomComponent() }, + ), + ); +}); + +When('{word} removes member {string} from {string}', async (actorName: string, memberName: string, _communityName: string) => { + const actor = actorCalled(actorName); + const memberId = await actor.answer(notes().get('lastMemberId')); + const member: AdminMemberListContainerMemberFieldsFragment = { + id: memberId, + memberName, + isAdmin: false, + accounts: [], + profile: null, + createdAt: new Date(), + updatedAt: new Date(), + }; + const onRemoveMember = async (removedMemberId: string): Promise => { + await actor.attemptsTo(notes().set('memberRemoved', removedMemberId === memberId)); + return removedMemberId === memberId; + }; + + await actor.attemptsTo( + notes().set('memberRemoved', false), + Render.component( + , + { wrapper: wrapOcomComponent() }, + ), + RemoveMember(memberName), + ); + + if (await actor.answer(MemberRemovedFlag())) { + await actor.attemptsTo( + Render.component( + , + { wrapper: wrapOcomComponent() }, + ), + ); + } +}); + +Then('the member should be removed successfully from {string}', async (_communityName: string) => { + if (!(await actorInTheSpotlight().answer(MemberRemovedFlag()))) { + throw new Error('Expected member removal callback to succeed'); + } +}); + +Then('member {string} should not appear in member listings for {string}', async (memberName: string, _communityName: string) => { + if (await actorInTheSpotlight().answer(MemberListedInCommunity(memberName))) { + throw new Error(`Expected member "${memberName}" not to appear in the rendered member list`); + } +}); + +When('{word} attempts to remove member {string} from {string}', async (actorName: string, memberName: string, _communityName: string) => { + await actorCalled(actorName).attemptsTo(RemoveMember(memberName)); +}); + +Then('{word} should receive an authorization error for member management', async (actorName: string) => { + const error = await actorCalled(actorName).answer(notes().get('memberAuthorizationError')); + if (!/permission|unauthorized|forbidden/i.test(error)) { + throw new Error(`Expected a member-management authorization error, but got: "${error}"`); + } +}); + +Then('member {string} should remain in {string}', async (memberName: string, _communityName: string) => { + if (!(await actorInTheSpotlight().answer(MemberListedInCommunity(memberName)))) { + throw new Error(`Expected member "${memberName}" to remain in the rendered member list`); + } +}); diff --git a/packages/ocom-verification/acceptance-ui/src/contexts/community/step-definitions/update-member.steps.tsx b/packages/ocom-verification/acceptance-ui/src/contexts/community/step-definitions/update-member.steps.tsx new file mode 100644 index 000000000..d53833ce2 --- /dev/null +++ b/packages/ocom-verification/acceptance-ui/src/contexts/community/step-definitions/update-member.steps.tsx @@ -0,0 +1,62 @@ +import { GherkinDataTable } from '@cellix/serenity-framework/cucumber/gherkin-data-table'; +import { type DataTable, Then, When } from '@cucumber/cucumber'; +import { actorCalled, actorInTheSpotlight, notes } from '@serenity-js/core'; +import type { MemberProfileExpectation, MemberProfileFormValues, MemberUiNotes } from '../notes/member-notes.ts'; +import { MemberUpdatedFlag, UpdatedMemberProfile } from '../questions/member-profile-updated.ts'; +import { UpdateMemberProfile } from '../tasks/update-member-profile.ts'; + +interface MemberProfileUpdateDetails { + name?: string; + email?: string; + bio?: string; + avatarDocumentId?: string; + interests?: string; + showInterests?: string; + showEmail?: string; + showProfile?: string; + showLocation?: string; + showProperties?: string; +} + +When('{word} updates member {string} in {string} with:', async (actorName: string, _memberName: string, _communityName: string, dataTable: DataTable) => { + const actor = actorCalled(actorName); + const profile = toMemberProfileExpectation(GherkinDataTable.from(dataTable).rowsHash()); + + await actor.attemptsTo(notes().set('memberUpdated', false), notes().set('expectedMemberProfile', profile), UpdateMemberProfile(profile)); +}); + +Then('the member should be updated successfully in {string}', async (_communityName: string) => { + const actor = actorInTheSpotlight(); + const updated = await actor.answer(MemberUpdatedFlag()); + if (!updated) { + throw new Error('Expected member profile form to be submitted'); + } + + assertProfileMatches(await actor.answer(notes().get('expectedMemberProfile')), await actor.answer(UpdatedMemberProfile())); +}); + +function toMemberProfileExpectation(details: MemberProfileUpdateDetails): MemberProfileExpectation { + return { + name: details.name ?? '', + email: details.email ?? '', + bio: details.bio ?? '', + showInterests: toBoolean(details.showInterests), + showEmail: toBoolean(details.showEmail), + showProfile: toBoolean(details.showProfile), + showLocation: toBoolean(details.showLocation), + showProperties: toBoolean(details.showProperties), + }; +} + +function toBoolean(value: string | undefined): boolean { + return value?.trim().toLowerCase() === 'true'; +} + +function assertProfileMatches(expected: MemberProfileExpectation, actual: MemberProfileFormValues): void { + for (const [field, expectedValue] of Object.entries(expected)) { + const actualValue = actual[field as keyof MemberProfileFormValues]; + if (JSON.stringify(actualValue) !== JSON.stringify(expectedValue)) { + throw new Error(`Expected profile ${field} to be ${JSON.stringify(expectedValue)}, but got ${JSON.stringify(actualValue)}`); + } + } +} diff --git a/packages/ocom-verification/acceptance-ui/src/contexts/community/tasks/assign-member-account.ts b/packages/ocom-verification/acceptance-ui/src/contexts/community/tasks/assign-member-account.ts new file mode 100644 index 000000000..e96e237a8 --- /dev/null +++ b/packages/ocom-verification/acceptance-ui/src/contexts/community/tasks/assign-member-account.ts @@ -0,0 +1,20 @@ +import { DomPageAdapter } from '@cellix/serenity-framework/pages/dom'; +import { TaskStep } from '@cellix/serenity-framework/serenity'; +import { MemberAccountsPage } from '@ocom-verification/verification-shared/pages'; +import { type Actor, Task } from '@serenity-js/core'; +import type { AcceptanceUiMemberAccountsPage } from '../../../shared/page-contracts.ts'; + +async function flushPendingReactWork(): Promise { + await new Promise((resolve) => setTimeout(resolve, 0)); + await new Promise((resolve) => setTimeout(resolve, 0)); +} + +export const AssignMemberAccount = (): Task => + Task.where( + '#actor assigns the selected end-user account to a member', + new TaskStep('#actor adds the selected member account', async () => { + const page: AcceptanceUiMemberAccountsPage = new MemberAccountsPage(new DomPageAdapter(document.body)); + await page.clickAddMemberAccount(); + await flushPendingReactWork(); + }), + ); diff --git a/packages/ocom-verification/acceptance-ui/src/contexts/community/tasks/create-member.ts b/packages/ocom-verification/acceptance-ui/src/contexts/community/tasks/create-member.ts new file mode 100644 index 000000000..13105c850 --- /dev/null +++ b/packages/ocom-verification/acceptance-ui/src/contexts/community/tasks/create-member.ts @@ -0,0 +1,25 @@ +import { RenderInDom } from '@cellix/serenity-framework/dom/render-in-dom'; +import { DomPageAdapter } from '@cellix/serenity-framework/pages/dom'; +import { TaskStep } from '@cellix/serenity-framework/serenity'; +import { MemberCreatePage } from '@ocom-verification/verification-shared/pages'; +import { type Actor, Task } from '@serenity-js/core'; +import type { AcceptanceUiMemberCreatePage } from '../../../shared/page-contracts.ts'; + +/** Let the form's async `onFinish` callback settle before assertions run. */ +async function flushPendingReactWork(): Promise { + await new Promise((resolve) => setTimeout(resolve, 0)); + await new Promise((resolve) => setTimeout(resolve, 0)); +} + +export const CreateMember = (memberName: string): Task => + Task.where( + `#actor creates a member named "${memberName}"`, + new TaskStep(`#actor fills the member name "${memberName}" and submits`, async (actor) => { + const page: AcceptanceUiMemberCreatePage = new MemberCreatePage(new DomPageAdapter(RenderInDom.as(actor).container)); + + await page.fillMemberName(memberName); + await page.clickCreateMember(); + + await flushPendingReactWork(); + }), + ); diff --git a/packages/ocom-verification/acceptance-ui/src/contexts/community/tasks/list-members.tsx b/packages/ocom-verification/acceptance-ui/src/contexts/community/tasks/list-members.tsx new file mode 100644 index 000000000..e4a76d2ca --- /dev/null +++ b/packages/ocom-verification/acceptance-ui/src/contexts/community/tasks/list-members.tsx @@ -0,0 +1,18 @@ +import { Render } from '@cellix/serenity-framework/dom/render-in-dom'; +import { MemberList } from '../../../../../../ocom/ui-community-route-admin/src/components/members-list.tsx'; +import type { AdminMemberListContainerMemberFieldsFragment } from '../../../../../../ocom/ui-community-route-admin/src/generated.tsx'; +import { wrapOcomComponent } from '../../../shared/ocom-component-wrapper.ts'; + +export const ListMembers = (memberNames: string[]) => { + const members: AdminMemberListContainerMemberFieldsFragment[] = memberNames.map((memberName, index) => ({ + id: `member-${index}-${memberName.toLowerCase().replaceAll(' ', '-')}`, + memberName, + isAdmin: false, + accounts: [], + profile: null, + createdAt: new Date(), + updatedAt: new Date(), + })); + + return Render.component(, { wrapper: wrapOcomComponent() }); +}; diff --git a/packages/ocom-verification/acceptance-ui/src/contexts/community/tasks/remove-member.ts b/packages/ocom-verification/acceptance-ui/src/contexts/community/tasks/remove-member.ts new file mode 100644 index 000000000..ffe7bd493 --- /dev/null +++ b/packages/ocom-verification/acceptance-ui/src/contexts/community/tasks/remove-member.ts @@ -0,0 +1,16 @@ +import { RenderInDom } from '@cellix/serenity-framework/dom/render-in-dom'; +import { DomPageAdapter } from '@cellix/serenity-framework/pages/dom'; +import { TaskStep } from '@cellix/serenity-framework/serenity'; +import { MemberListPage } from '@ocom-verification/verification-shared/pages'; +import { type Actor, Task } from '@serenity-js/core'; +import type { AcceptanceUiMemberListPage } from '../../../shared/page-contracts.ts'; + +export const RemoveMember = (memberName: string): Task => + Task.where( + '#actor removes the member', + new TaskStep('#actor clicks Remove for the member', async (actor) => { + const page: AcceptanceUiMemberListPage = new MemberListPage(new DomPageAdapter(RenderInDom.as(actor).container)); + await page.clickRemoveMember(memberName); + await new Promise((resolve) => setTimeout(resolve, 0)); + }), + ); diff --git a/packages/ocom-verification/acceptance-ui/src/contexts/community/tasks/search-member-list.ts b/packages/ocom-verification/acceptance-ui/src/contexts/community/tasks/search-member-list.ts new file mode 100644 index 000000000..3698c06fd --- /dev/null +++ b/packages/ocom-verification/acceptance-ui/src/contexts/community/tasks/search-member-list.ts @@ -0,0 +1,15 @@ +import { RenderInDom } from '@cellix/serenity-framework/dom/render-in-dom'; +import { DomPageAdapter } from '@cellix/serenity-framework/pages/dom'; +import { TaskStep } from '@cellix/serenity-framework/serenity'; +import { MemberListPage } from '@ocom-verification/verification-shared/pages'; +import { type Actor, Task } from '@serenity-js/core'; +import type { AcceptanceUiMemberListPage } from '../../../shared/page-contracts.ts'; + +export const SearchMemberList = (searchTerm: string): Task => + Task.where( + `#actor searches the member list for "${searchTerm}"`, + new TaskStep(`#actor enters "${searchTerm}" in the member search`, async (actor) => { + const page: AcceptanceUiMemberListPage = new MemberListPage(new DomPageAdapter(RenderInDom.as(actor).container)); + await page.searchByMemberName(searchTerm); + }), + ); diff --git a/packages/ocom-verification/acceptance-ui/src/contexts/community/tasks/update-member-profile.ts b/packages/ocom-verification/acceptance-ui/src/contexts/community/tasks/update-member-profile.ts new file mode 100644 index 000000000..30ebaab40 --- /dev/null +++ b/packages/ocom-verification/acceptance-ui/src/contexts/community/tasks/update-member-profile.ts @@ -0,0 +1,33 @@ +import { RenderInDom } from '@cellix/serenity-framework/dom/render-in-dom'; +import { DomPageAdapter } from '@cellix/serenity-framework/pages/dom'; +import { TaskStep } from '@cellix/serenity-framework/serenity'; +import { MemberProfilePage } from '@ocom-verification/verification-shared/pages'; +import { type Actor, Task } from '@serenity-js/core'; +import type { AcceptanceUiMemberProfilePage } from '../../../shared/page-contracts.ts'; +import type { MemberProfileFormValues } from '../notes/member-notes.ts'; + +async function flushPendingReactWork(): Promise { + await new Promise((resolve) => setTimeout(resolve, 0)); + await new Promise((resolve) => setTimeout(resolve, 0)); +} + +export const UpdateMemberProfile = (profile: MemberProfileFormValues): Task => + Task.where( + '#actor updates the member profile', + new TaskStep('#actor edits and saves the member profile', async (actor) => { + const page: AcceptanceUiMemberProfilePage = new MemberProfilePage(new DomPageAdapter(RenderInDom.as(actor).container)); + + await page.clickEditProfile(); + await page.fillDisplayName(profile.name); + await page.fillEmail(profile.email); + await page.fillBio(profile.bio); + await page.setShowInterests(profile.showInterests); + await page.setShowEmail(profile.showEmail); + await page.setShowProfile(profile.showProfile); + await page.setShowLocation(profile.showLocation); + await page.setShowProperties(profile.showProperties); + await page.clickSaveProfile(); + + await flushPendingReactWork(); + }), + ); diff --git a/packages/ocom-verification/acceptance-ui/src/shared/page-contracts.ts b/packages/ocom-verification/acceptance-ui/src/shared/page-contracts.ts index b7512789f..732ec8c44 100644 --- a/packages/ocom-verification/acceptance-ui/src/shared/page-contracts.ts +++ b/packages/ocom-verification/acceptance-ui/src/shared/page-contracts.ts @@ -1,5 +1,16 @@ -import type { CommunityPage, HomePage } from '@ocom-verification/verification-shared/pages'; +import type { CommunityPage, HomePage, MemberAccountsPage, MemberCreatePage, MemberListPage, MemberProfilePage } from '@ocom-verification/verification-shared/pages'; export type AcceptanceUiHomePage = Pick; export type AcceptanceUiCommunityPage = Pick; + +export type AcceptanceUiMemberCreatePage = Pick; + +export type AcceptanceUiMemberListPage = Pick; + +export type AcceptanceUiMemberAccountsPage = Pick; + +export type AcceptanceUiMemberProfilePage = Pick< + MemberProfilePage, + 'clickEditProfile' | 'clickSaveProfile' | 'fillDisplayName' | 'fillEmail' | 'fillBio' | 'setShowInterests' | 'setShowEmail' | 'setShowProfile' | 'setShowLocation' | 'setShowProperties' +>; diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/abilities/community-portal-page.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/abilities/community-portal-page.ts new file mode 100644 index 000000000..6bde74596 --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/abilities/community-portal-page.ts @@ -0,0 +1,55 @@ +import { PlaywrightPageAdapter } from '@cellix/serenity-framework/pages/playwright'; +import { BrowseTheWeb } from '@cellix/serenity-framework/serenity/browser'; +import { MemberAccountsPage, MemberCreatePage, MemberListPage, MemberProfilePage } from '@ocom-verification/verification-shared/pages'; +import type { Actor } from '@serenity-js/core'; +import type { Page } from 'playwright'; + +export const communityPortalPageOf = (actor: Actor): Page => BrowseTheWeb.withActor(actor).page; + +export const memberCreatePageOn = (page: Page): MemberCreatePage => new MemberCreatePage(new PlaywrightPageAdapter(page)); + +export const memberListPageOn = (page: Page): MemberListPage => new MemberListPage(new PlaywrightPageAdapter(page)); + +export const memberProfilePageOn = (page: Page): MemberProfilePage => new MemberProfilePage(new PlaywrightPageAdapter(page)); + +export const memberAccountsPageOn = (page: Page): MemberAccountsPage => new MemberAccountsPage(new PlaywrightPageAdapter(page)); + +/** Navigate to a community member list and wait for its search control to render. */ +export const openMemberListFor = async (page: Page, communityId: string, routeMemberId: string): Promise => { + await page.goto(`/community/${encodeURIComponent(communityId)}/admin/${encodeURIComponent(routeMemberId)}/members`, { waitUntil: 'networkidle' }); + const memberListPage = memberListPageOn(page); + await memberListPage.searchInput.waitFor({ state: 'visible', timeout: 15_000 }); + return memberListPage; +}; + +/** Navigate to a community member create form and wait for its name input. */ +export const openMemberCreateFormFor = async (page: Page, communityId: string, routeMemberId: string): Promise => { + await page.goto(`/community/${encodeURIComponent(communityId)}/admin/${encodeURIComponent(routeMemberId)}/members/create`, { waitUntil: 'networkidle' }); + const memberCreatePage = memberCreatePageOn(page); + await memberCreatePage.memberNameInput.waitFor({ state: 'visible', timeout: 15_000 }); + return memberCreatePage; +}; + +/** Navigate to a member profile and open its editor. */ +export const openMemberProfileEditorFor = async (page: Page, communityId: string, routeMemberId: string, memberId: string): Promise => { + await page.goto(`/community/${encodeURIComponent(communityId)}/admin/${encodeURIComponent(routeMemberId)}/members/${encodeURIComponent(memberId)}/profile`, { waitUntil: 'networkidle' }); + const memberProfilePage = memberProfilePageOn(page); + await memberProfilePage.clickEditProfile(); + return memberProfilePage; +}; + +/** Navigate to a member account-assignment form and wait for its end-user selector. */ +export const openMemberAccountAssignmentFor = async (page: Page, communityId: string, routeMemberId: string, memberId: string): Promise => { + await page.goto(`/community/${encodeURIComponent(communityId)}/admin/${encodeURIComponent(routeMemberId)}/members/${encodeURIComponent(memberId)}/accounts/add`, { waitUntil: 'networkidle' }); + const memberAccountsPage = memberAccountsPageOn(page); + await memberAccountsPage.endUserSelect.waitFor({ state: 'visible', timeout: 15_000 }); + return memberAccountsPage; +}; + +/** Navigate to a member account list and wait for the account table to render. */ +export const openMemberAccountsListFor = async (page: Page, communityId: string, routeMemberId: string, memberId: string): Promise => { + await page.goto(`/community/${encodeURIComponent(communityId)}/admin/${encodeURIComponent(routeMemberId)}/members/${encodeURIComponent(memberId)}/accounts`, { waitUntil: 'networkidle' }); + const memberAccountsPage = memberAccountsPageOn(page); + await memberAccountsPage.addAccountButton.waitFor({ state: 'visible', timeout: 15_000 }); + return memberAccountsPage; +}; diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/fill-and-submit-member-create-form.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/fill-and-submit-member-create-form.ts new file mode 100644 index 000000000..22b026d8f --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/fill-and-submit-member-create-form.ts @@ -0,0 +1,31 @@ +import { type Actor, Interaction, notes, the } from '@serenity-js/core'; +import { communityPortalPageOf, memberCreatePageOn } from '../abilities/community-portal-page.ts'; +import type { MemberE2ENotes } from '../notes/member-notes.ts'; + +export const SubmitMemberCreateForm = (actor: Actor, memberName: string) => + Interaction.where(the`#actor submits the member create form for "${memberName}"`, async () => { + const page = communityPortalPageOf(actor); + const memberCreatePage = memberCreatePageOn(page); + await memberCreatePage.clickCreateMember(); + + await memberCreatePage.validationError.waitFor({ state: 'visible', timeout: 750 }).catch(() => undefined); + if (await memberCreatePage.validationError.isVisible().catch(() => false)) { + const errorText = await memberCreatePage.validationError.textContent(); + await actor.attemptsTo(notes().set('lastMemberId', null), notes().set('errorMessage', errorText || 'Validation error')); + return; + } + + await page.waitForURL(/\/members\/[^/]+$/, { timeout: 15_000 }).catch(async () => { + await memberCreatePage.errorToast.waitFor({ state: 'visible', timeout: 1_000 }).catch(() => undefined); + const message = (await memberCreatePage.errorToast.textContent().catch(() => null)) || `Member creation did not navigate to a member detail page for "${memberName}"`; + await actor.attemptsTo(notes().set('lastMemberId', null), notes().set('errorMessage', message)); + throw new Error(message); + }); + + const memberId = new URL(page.url()).pathname.match(/\/members\/([^/]+)$/)?.[1]; + if (!memberId) { + throw new Error(`Member creation navigated to an unexpected URL: ${page.url()}`); + } + + await actor.attemptsTo(notes().set('lastMemberId', decodeURIComponent(memberId)), notes().set('errorMessage', null)); + }); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/fill-and-submit-member-profile-form.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/fill-and-submit-member-profile-form.ts new file mode 100644 index 000000000..83d92885f --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/fill-and-submit-member-profile-form.ts @@ -0,0 +1,29 @@ +import { type Actor, Interaction, notes, the } from '@serenity-js/core'; +import { communityPortalPageOf, memberProfilePageOn } from '../abilities/community-portal-page.ts'; +import type { MemberE2ENotes } from '../notes/member-notes.ts'; + +export const SubmitMemberProfileForm = (actor: Actor) => + Interaction.where(the`#actor submits the member profile form`, async () => { + const page = communityPortalPageOf(actor); + const memberProfilePage = memberProfilePageOn(page); + + await memberProfilePage.clickSaveProfile(); + await memberProfilePage.firstValidationError.waitFor({ state: 'visible', timeout: 750 }).catch(() => undefined); + if (await memberProfilePage.firstValidationError.isVisible().catch(() => false)) { + const errorText = await memberProfilePage.firstValidationError.textContent(); + await actor.attemptsTo(notes().set('errorMessage', errorText || 'Validation error')); + return; + } + + const didSave = await Promise.race([ + memberProfilePage.editProfileButton.waitFor({ state: 'visible', timeout: 15_000 }).then(() => true), + memberProfilePage.errorToast.waitFor({ state: 'visible', timeout: 15_000 }).then(() => false), + ]); + if (!didSave) { + const message = (await memberProfilePage.errorToast.textContent()) || 'Member profile update failed'; + await actor.attemptsTo(notes().set('errorMessage', message)); + throw new Error(message); + } + + await actor.attemptsTo(notes().set('errorMessage', null)); + }); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/fill-member-create-form.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/fill-member-create-form.ts new file mode 100644 index 000000000..7737758cc --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/fill-member-create-form.ts @@ -0,0 +1,10 @@ +import { type Actor, Interaction, notes, the } from '@serenity-js/core'; +import { communityPortalPageOf, memberCreatePageOn } from '../abilities/community-portal-page.ts'; +import type { MemberE2ENotes } from '../notes/member-notes.ts'; + +export const FillMemberCreateForm = (actor: Actor, memberName: string) => + Interaction.where(the`#actor fills the member create form for "${memberName}"`, async () => { + const memberCreatePage = memberCreatePageOn(communityPortalPageOf(actor)); + await memberCreatePage.fillMemberName(memberName); + await actor.attemptsTo(notes().set('lastMemberName', memberName)); + }); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/fill-member-profile-form.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/fill-member-profile-form.ts new file mode 100644 index 000000000..a479dcf32 --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/fill-member-profile-form.ts @@ -0,0 +1,17 @@ +import { type Actor, Interaction, notes, the } from '@serenity-js/core'; +import { communityPortalPageOf, memberProfilePageOn } from '../abilities/community-portal-page.ts'; +import type { MemberE2ENotes, MemberProfileExpectation } from '../notes/member-notes.ts'; + +export const FillMemberProfileForm = (actor: Actor, profile: MemberProfileExpectation) => + Interaction.where(the`#actor fills the member profile form`, async () => { + const memberProfilePage = memberProfilePageOn(communityPortalPageOf(actor)); + if (profile.name !== undefined) await memberProfilePage.fillDisplayName(profile.name); + if (profile.email !== undefined) await memberProfilePage.fillEmail(profile.email); + if (profile.bio !== undefined) await memberProfilePage.fillBio(profile.bio); + if (profile.showInterests !== undefined) await memberProfilePage.setShowInterests(profile.showInterests); + if (profile.showEmail !== undefined) await memberProfilePage.setShowEmail(profile.showEmail); + if (profile.showProfile !== undefined) await memberProfilePage.setShowProfile(profile.showProfile); + if (profile.showLocation !== undefined) await memberProfilePage.setShowLocation(profile.showLocation); + if (profile.showProperties !== undefined) await memberProfilePage.setShowProperties(profile.showProperties); + await actor.attemptsTo(notes().set('lastExpectedMemberProfile', profile)); + }); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/open-community-member-list.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/open-community-member-list.ts new file mode 100644 index 000000000..cd86fc36c --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/open-community-member-list.ts @@ -0,0 +1,13 @@ +import { type Actor, Interaction, the } from '@serenity-js/core'; +import { communityPortalPageOf, openMemberListFor } from '../abilities/community-portal-page.ts'; +import { CommunityId } from '../questions/community-id.ts'; +import { RouteMemberId } from '../questions/route-member-id.ts'; + +export const OpenCommunityMemberList = (actor: Actor, communityName: string) => + Interaction.where(the`#actor opens the member list for "${communityName}"`, async () => { + const page = communityPortalPageOf(actor); + const communityId = await actor.answer(CommunityId(communityName)); + const routeMemberId = await actor.answer(RouteMemberId(communityName)); + + await openMemberListFor(page, communityId, routeMemberId); + }); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/open-create-member-form.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/open-create-member-form.ts new file mode 100644 index 000000000..eb4ee67bb --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/open-create-member-form.ts @@ -0,0 +1,13 @@ +import { type Actor, Interaction, the } from '@serenity-js/core'; +import { communityPortalPageOf, openMemberCreateFormFor } from '../abilities/community-portal-page.ts'; +import { CommunityId } from '../questions/community-id.ts'; +import { RouteMemberId } from '../questions/route-member-id.ts'; + +export const OpenCreateMemberForm = (actor: Actor, communityName: string) => + Interaction.where(the`#actor opens the create member form for "${communityName}"`, async () => { + const page = communityPortalPageOf(actor); + const communityId = await actor.answer(CommunityId(communityName)); + const routeMemberId = await actor.answer(RouteMemberId(communityName)); + + await openMemberCreateFormFor(page, communityId, routeMemberId); + }); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/open-member-account-assignment.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/open-member-account-assignment.ts new file mode 100644 index 000000000..098885b61 --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/open-member-account-assignment.ts @@ -0,0 +1,18 @@ +import { type Actor, Interaction, notes, the } from '@serenity-js/core'; +import { communityPortalPageOf, openMemberAccountAssignmentFor } from '../abilities/community-portal-page.ts'; +import type { MemberE2ENotes } from '../notes/member-notes.ts'; +import { CommunityId } from '../questions/community-id.ts'; +import { RouteMemberId } from '../questions/route-member-id.ts'; + +export const OpenMemberAccountAssignment = (actor: Actor, communityName: string) => + Interaction.where(the`#actor opens member account assignment in "${communityName}"`, async () => { + const page = communityPortalPageOf(actor); + const communityId = await actor.answer(CommunityId(communityName)); + const memberId = await actor.answer(notes().get('lastMemberId')); + if (!memberId) { + throw new Error(`Missing member state for account assignment in "${communityName}"`); + } + const routeMemberId = await actor.answer(RouteMemberId(communityName)); + + await openMemberAccountAssignmentFor(page, communityId, routeMemberId, memberId); + }); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/open-member-profile-editor.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/open-member-profile-editor.ts new file mode 100644 index 000000000..0f2c5e57b --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/open-member-profile-editor.ts @@ -0,0 +1,18 @@ +import { type Actor, Interaction, notes, the } from '@serenity-js/core'; +import { communityPortalPageOf, openMemberProfileEditorFor } from '../abilities/community-portal-page.ts'; +import type { MemberE2ENotes } from '../notes/member-notes.ts'; +import { CommunityId } from '../questions/community-id.ts'; +import { RouteMemberId } from '../questions/route-member-id.ts'; + +export const OpenMemberProfileEditor = (actor: Actor, communityName: string, memberName: string) => + Interaction.where(the`#actor opens the profile editor for "${memberName}" in "${communityName}"`, async () => { + const page = communityPortalPageOf(actor); + const communityId = await actor.answer(CommunityId(communityName)); + const memberId = await actor.answer(notes().get('lastMemberId')); + if (!memberId) { + throw new Error(`Missing member state for profile update in "${communityName}"`); + } + const routeMemberId = await actor.answer(RouteMemberId(communityName)); + + await openMemberProfileEditorFor(page, communityId, routeMemberId, memberId); + }); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/remove-member.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/remove-member.ts new file mode 100644 index 000000000..f1d3fbc21 --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/remove-member.ts @@ -0,0 +1,42 @@ +import { type Actor, Interaction, notes, the } from '@serenity-js/core'; +import { communityPortalPageOf, openMemberListFor } from '../abilities/community-portal-page.ts'; +import type { MemberE2ENotes } from '../notes/member-notes.ts'; +import { CommunityId } from '../questions/community-id.ts'; +import { HasNoMemberForCommunity } from '../questions/has-no-member-for-community.ts'; +import { RouteMemberId } from '../questions/route-member-id.ts'; + +export const RemoveMember = (actor: Actor, communityName: string, memberName: string) => + Interaction.where(the`#actor removes member "${memberName}" from "${communityName}"`, async () => { + const page = communityPortalPageOf(actor); + const communityId = await actor.answer(CommunityId(communityName)); + const routeMemberId = await actor.answer(RouteMemberId(communityName)); + + let memberListPage: Awaited>; + try { + memberListPage = await openMemberListFor(page, communityId, routeMemberId); + } catch (error) { + if (await actor.answer(HasNoMemberForCommunity.inCommunity(communityId))) { + const message = `Unauthorized: no community membership for "${communityName}"`; + await actor.attemptsTo(notes().set('errorMessage', message)); + throw new Error(message); + } + throw error; + } + await memberListPage.memberName(memberName).waitFor({ state: 'visible', timeout: 15_000 }); + await memberListPage.clickRemoveMember(memberName); + + const outcome = await Promise.race([ + memberListPage + .memberName(memberName) + .waitFor({ state: 'hidden', timeout: 15_000 }) + .then(() => 'removed' as const), + memberListPage.errorToast.waitFor({ state: 'visible', timeout: 15_000 }).then(() => 'denied' as const), + ]); + if (outcome === 'denied') { + const message = (await memberListPage.errorToast.textContent()) || 'Member removal was denied'; + await actor.attemptsTo(notes().set('errorMessage', message)); + throw new Error(message); + } + + await actor.attemptsTo(notes().set('errorMessage', null)); + }); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/resolve-community-administrator-membership.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/resolve-community-administrator-membership.ts new file mode 100644 index 000000000..71db1f81d --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/resolve-community-administrator-membership.ts @@ -0,0 +1,46 @@ +import { type Actor, Interaction, notes, the } from '@serenity-js/core'; +import type { Response } from 'playwright'; +import { communityPortalPageOf } from '../abilities/community-portal-page.ts'; +import type { MemberE2ENotes } from '../notes/member-notes.ts'; +import { CommunityId } from '../questions/community-id.ts'; + +const membersForCurrentEndUserOperationName = 'AccountsCommunityListContainerMembersForCurrentEndUser'; + +type GraphqlPayload = { + data?: TData; + errors?: Array<{ message?: string }>; +}; + +type MembersForCurrentEndUserPayload = GraphqlPayload<{ + membersForCurrentEndUser?: Array<{ + id: string; + isAdmin?: boolean | null; + community?: { id: string } | null; + }>; +}>; + +const hasGraphqlOperation = (operationName: string) => (response: Response) => response.url().includes('/api/graphql') && response.request().method() === 'POST' && (response.request().postData()?.includes(operationName) ?? false); + +const selectPayload = (payload: GraphqlPayload | GraphqlPayload[] | null, hasExpectedData: (data: TData | undefined) => boolean): GraphqlPayload | null => { + if (!Array.isArray(payload)) { + return payload; + } + + return payload.find((item) => hasExpectedData(item.data)) ?? payload.find((item) => item.errors?.length) ?? null; +}; + +export const ResolveCommunityAdministratorMembership = (actor: Actor, communityName: string) => + Interaction.where(the`#actor resolves administrator membership for "${communityName}"`, async () => { + const page = communityPortalPageOf(actor); + const communityId = await actor.answer(CommunityId(communityName)); + + const membershipsResponse = page.waitForResponse(hasGraphqlOperation(membersForCurrentEndUserOperationName), { timeout: 15_000 }); + await page.goto('/community/accounts', { waitUntil: 'networkidle' }); + const membershipsPayload = selectPayload((await (await membershipsResponse).json()) as MembersForCurrentEndUserPayload | MembersForCurrentEndUserPayload[], (data) => Boolean(data?.membersForCurrentEndUser)); + const routeMemberId = membershipsPayload?.data?.membersForCurrentEndUser?.find((member) => member.isAdmin && member.community?.id === communityId)?.id; + if (!routeMemberId) { + throw new Error(`No administrator membership found for community "${communityName}"`); + } + + await actor.attemptsTo(notes().set('routeMemberId', routeMemberId)); + }); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/search-member-list.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/search-member-list.ts new file mode 100644 index 000000000..77a3c2745 --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/search-member-list.ts @@ -0,0 +1,8 @@ +import { type Actor, Interaction, the } from '@serenity-js/core'; +import { communityPortalPageOf, memberListPageOn } from '../abilities/community-portal-page.ts'; + +export const SearchMemberList = (actor: Actor, searchTerm: string) => + Interaction.where(the`#actor searches the member list for "${searchTerm}"`, async () => { + const memberListPage = memberListPageOn(communityPortalPageOf(actor)); + await memberListPage.searchByMemberName(searchTerm); + }); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/select-member-end-user-account.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/select-member-end-user-account.ts new file mode 100644 index 000000000..9c86dba2b --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/select-member-end-user-account.ts @@ -0,0 +1,8 @@ +import { type Actor, Interaction, the } from '@serenity-js/core'; +import { communityPortalPageOf, memberAccountsPageOn } from '../abilities/community-portal-page.ts'; + +export const SelectMemberEndUserAccount = (actor: Actor, displayName: string) => + Interaction.where(the`#actor selects end-user account "${displayName}"`, async () => { + const memberAccountsPage = memberAccountsPageOn(communityPortalPageOf(actor)); + await memberAccountsPage.selectEndUser(displayName); + }); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/submit-member-account-assignment.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/submit-member-account-assignment.ts new file mode 100644 index 000000000..9a40c168f --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/interactions/submit-member-account-assignment.ts @@ -0,0 +1,20 @@ +import { type Actor, Interaction, notes, the } from '@serenity-js/core'; +import { communityPortalPageOf, memberAccountsPageOn } from '../abilities/community-portal-page.ts'; +import type { MemberE2ENotes } from '../notes/member-notes.ts'; + +export const SubmitMemberAccountAssignment = (actor: Actor) => + Interaction.where(the`#actor submits the member account assignment`, async () => { + const page = communityPortalPageOf(actor); + const memberAccountsPage = memberAccountsPageOn(page); + const accountsListNavigation = page.waitForURL(/\/members\/[^/]+\/accounts\/?$/, { timeout: 15_000 }); + const assignmentError = memberAccountsPage.errorToast.waitFor({ state: 'visible', timeout: 15_000 }); + await memberAccountsPage.clickAddMemberAccount(); + const outcome = await Promise.race([accountsListNavigation.then(() => 'navigated' as const), assignmentError.then(() => 'error' as const)]).catch(() => 'timed-out' as const); + if (outcome !== 'navigated') { + const message = (await memberAccountsPage.errorToast.textContent().catch(() => null)) || `Member account assignment did not complete; current URL: ${page.url()}`; + await actor.attemptsTo(notes().set('errorMessage', message)); + throw new Error(message); + } + + await actor.attemptsTo(notes().set('errorMessage', null)); + }); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/notes/member-notes.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/notes/member-notes.ts new file mode 100644 index 000000000..97ba400ca --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/notes/member-notes.ts @@ -0,0 +1,28 @@ +export interface MemberProfileExpectation { + name?: string; + email?: string; + bio?: string; + avatarDocumentId?: string; + interests?: string[]; + showInterests?: boolean; + showEmail?: boolean; + showProfile?: boolean; + showLocation?: boolean; + showProperties?: boolean; +} + +export interface MemberE2ENotes { + communityIdsByName: Record; + endUserEmailsByLabel: Record; + endUserDisplayNamesByLabel: Record; + endUserExternalIdsByLabel: Record; + lastMemberCommunityId: string | null; + lastMemberCommunityName: string | null; + lastMemberId: string | null; + lastMemberName: string; + lastExpectedMemberProfile?: MemberProfileExpectation; + lastUpdatedMemberProfile?: MemberProfileExpectation; + lastMemberStatus: string | null; + errorMessage: string | null; + routeMemberId: string | null; +} diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/questions/community-id.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/questions/community-id.ts new file mode 100644 index 000000000..269568184 --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/questions/community-id.ts @@ -0,0 +1,12 @@ +import { notes, Question } from '@serenity-js/core'; +import type { MemberE2ENotes } from '../notes/member-notes.ts'; + +export const CommunityId = (communityName: string) => + Question.about(`the ID of community "${communityName}"`, async (actor) => { + const communityIdsByName = await actor.answer(notes().get('communityIdsByName')); + const communityId = communityIdsByName[communityName]; + if (!communityId) { + throw new Error(`Unknown community "${communityName}". Ensure it was created in setup.`); + } + return communityId; + }); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/questions/has-no-member-for-community.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/questions/has-no-member-for-community.ts new file mode 100644 index 000000000..bbd37cdd6 --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/questions/has-no-member-for-community.ts @@ -0,0 +1,40 @@ +import { BrowseTheWeb } from '@cellix/serenity-framework/serenity/browser'; +import { type AnswersQuestions, Question, type UsesAbilities } from '@serenity-js/core'; +import type { Response } from 'playwright'; + +const membersForCurrentEndUserOperationName = 'AccountsCommunityListContainerMembersForCurrentEndUser'; + +type MembersForCurrentEndUserPayload = { + data?: { + membersForCurrentEndUser?: Array<{ + community?: { id: string } | null; + }>; + }; +}; + +const hasGraphqlOperation = (operationName: string) => (response: Response) => response.url().includes('/api/graphql') && response.request().method() === 'POST' && (response.request().postData()?.includes(operationName) ?? false); + +export class HasNoMemberForCommunity extends Question> { + static inCommunity(communityId: string): HasNoMemberForCommunity { + return new HasNoMemberForCommunity(communityId); + } + + private constructor(private readonly communityId: string) { + super(`whether the current end user has no member in community "${communityId}"`); + } + + override async answeredBy(actor: AnswersQuestions & UsesAbilities): Promise { + const { page } = BrowseTheWeb.withActor(actor); + const membershipsResponse = page.waitForResponse(hasGraphqlOperation(membersForCurrentEndUserOperationName), { timeout: 15_000 }); + await page.goto('/community/accounts', { waitUntil: 'networkidle' }); + const membershipsPayload = (await (await membershipsResponse).json()) as MembersForCurrentEndUserPayload | MembersForCurrentEndUserPayload[]; + const payload = Array.isArray(membershipsPayload) ? membershipsPayload.find((item) => item.data?.membersForCurrentEndUser) : membershipsPayload; + const members = payload?.data?.membersForCurrentEndUser; + + if (!members) { + throw new Error('Unable to determine memberships for the current end user'); + } + + return !members.some((member) => member.community?.id === this.communityId); + } +} diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/questions/member-account-linked.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/questions/member-account-linked.ts new file mode 100644 index 000000000..7199f9dfc --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/questions/member-account-linked.ts @@ -0,0 +1,28 @@ +import { type Actor, notes, Question } from '@serenity-js/core'; +import { communityPortalPageOf, openMemberAccountsListFor } from '../abilities/community-portal-page.ts'; +import type { MemberE2ENotes } from '../notes/member-notes.ts'; +import { CommunityId } from './community-id.ts'; + +const openAccountsList = async (actor: Actor, communityName: string) => { + const memberId = await actor.answer(notes().get('lastMemberId')); + const routeMemberId = await actor.answer(notes().get('routeMemberId')); + if (!memberId || !routeMemberId) { + throw new Error(`Missing member or route member state for account verification in "${communityName}"`); + } + + return openMemberAccountsListFor(communityPortalPageOf(actor), await actor.answer(CommunityId(communityName)), routeMemberId, memberId); +}; + +export const MemberAccountLinked = (communityName: string, email: string) => + Question.about(`whether the member account list contains "${email}" in "${communityName}"`, async (serenityActor) => { + const actor = serenityActor as unknown as Actor; + const memberAccountsPage = await openAccountsList(actor, communityName); + await memberAccountsPage.linkedAccountEmail(email).waitFor({ state: 'visible', timeout: 15_000 }); + return await memberAccountsPage.linkedAccountEmail(email).isVisible(); + }); + +export const MemberAccountCount = (communityName: string, email: string) => + Question.about(`the number of rendered member account links for "${email}" in "${communityName}"`, async (serenityActor) => { + const actor = serenityActor as unknown as Actor; + return (await openAccountsList(actor, communityName)).linkedAccountCount(email); + }); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/questions/member-created-in-community.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/questions/member-created-in-community.ts new file mode 100644 index 000000000..3f52285f1 --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/questions/member-created-in-community.ts @@ -0,0 +1,19 @@ +import { type Actor, notes, Question } from '@serenity-js/core'; +import { communityPortalPageOf, openMemberListFor } from '../abilities/community-portal-page.ts'; +import type { MemberE2ENotes } from '../notes/member-notes.ts'; +import { CommunityId } from './community-id.ts'; + +export const MemberCreatedInCommunity = (communityName: string) => + Question.about(`whether the created member appears in "${communityName}"`, async (serenityActor) => { + const actor = serenityActor as unknown as Actor; + const memberName = await actor.answer(notes().get('lastMemberName')); + const routeMemberId = await actor.answer(notes().get('routeMemberId')); + if (!memberName || !routeMemberId) { + throw new Error(`Missing created member or route member state for "${communityName}"`); + } + + const communityId = await actor.answer(CommunityId(communityName)); + const memberListPage = await openMemberListFor(communityPortalPageOf(actor), communityId, routeMemberId); + await memberListPage.memberName(memberName).waitFor({ state: 'visible', timeout: 15_000 }); + return true; + }); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/questions/member-error-message.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/questions/member-error-message.ts new file mode 100644 index 000000000..83576feb6 --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/questions/member-error-message.ts @@ -0,0 +1,4 @@ +import { notes, Question } from '@serenity-js/core'; +import type { MemberE2ENotes } from '../notes/member-notes.ts'; + +export const MemberErrorMessage = () => Question.about('the member validation error', (actor) => actor.answer(notes().get('errorMessage'))); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/questions/member-listed-in-community.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/questions/member-listed-in-community.ts new file mode 100644 index 000000000..04bebe24f --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/questions/member-listed-in-community.ts @@ -0,0 +1,15 @@ +import { PlaywrightPageAdapter } from '@cellix/serenity-framework/pages/playwright'; +import { BrowseTheWeb } from '@cellix/serenity-framework/serenity/browser'; +import { MemberListPage } from '@ocom-verification/verification-shared/pages'; +import { type Actor, Question } from '@serenity-js/core'; + +export const MemberListedInCommunity = (memberName: string, route?: { communityId: string; routeMemberId: string }) => + Question.about(`whether member "${memberName}" appears in the browser member list`, async (serenityActor) => { + const actor = serenityActor as unknown as Actor; + const { page } = BrowseTheWeb.withActor(actor); + if (route) { + await page.goto(`/community/${encodeURIComponent(route.communityId)}/admin/${encodeURIComponent(route.routeMemberId)}/members`, { waitUntil: 'networkidle' }); + } + const memberListPage = new MemberListPage(new PlaywrightPageAdapter(page)); + return await memberListPage.memberName(memberName).isVisible(); + }); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/questions/member-profile-matches.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/questions/member-profile-matches.ts new file mode 100644 index 000000000..4e71bfae5 --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/questions/member-profile-matches.ts @@ -0,0 +1,37 @@ +import { type Actor, notes, Question } from '@serenity-js/core'; +import { communityPortalPageOf, openMemberProfileEditorFor } from '../abilities/community-portal-page.ts'; +import type { MemberE2ENotes, MemberProfileExpectation } from '../notes/member-notes.ts'; +import { CommunityId } from './community-id.ts'; + +const assertProfileValue = (name: string, actual: string | boolean, expected: string | boolean) => { + if (actual !== expected) { + throw new Error(`Expected member profile ${name} to be "${expected}", got "${actual}"`); + } +}; + +export const MemberProfileMatches = (communityName: string) => + Question.about(`whether the member profile matches the expected values in "${communityName}"`, async (serenityActor) => { + const actor = serenityActor as unknown as Actor; + const profile = await actor.answer(notes().get('lastExpectedMemberProfile')); + const memberId = await actor.answer(notes().get('lastMemberId')); + const routeMemberId = await actor.answer(notes().get('routeMemberId')); + if (!profile || !memberId || !routeMemberId) { + throw new Error(`Missing profile, member, or route member state for "${communityName}"`); + } + + const communityId = await actor.answer(CommunityId(communityName)); + const page = await openMemberProfileEditorFor(communityPortalPageOf(actor), communityId, routeMemberId, memberId); + await verifyProfile(page, profile); + return true; + }); + +const verifyProfile = async (page: Awaited>, profile: MemberProfileExpectation) => { + if (profile.name !== undefined) assertProfileValue('name', await page.displayNameValue(), profile.name); + if (profile.email !== undefined) assertProfileValue('email', await page.emailValue(), profile.email); + if (profile.bio !== undefined) assertProfileValue('bio', await page.bioValue(), profile.bio); + if (profile.showInterests !== undefined) assertProfileValue('showInterests', await page.showInterestsValue(), profile.showInterests); + if (profile.showEmail !== undefined) assertProfileValue('showEmail', await page.showEmailValue(), profile.showEmail); + if (profile.showProfile !== undefined) assertProfileValue('showProfile', await page.showProfileValue(), profile.showProfile); + if (profile.showLocation !== undefined) assertProfileValue('showLocation', await page.showLocationValue(), profile.showLocation); + if (profile.showProperties !== undefined) assertProfileValue('showProperties', await page.showPropertiesValue(), profile.showProperties); +}; diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/questions/member-removed-from-community.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/questions/member-removed-from-community.ts new file mode 100644 index 000000000..65da1f125 --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/questions/member-removed-from-community.ts @@ -0,0 +1,17 @@ +import { type Actor, notes, Question } from '@serenity-js/core'; +import { communityPortalPageOf, openMemberListFor } from '../abilities/community-portal-page.ts'; +import type { MemberE2ENotes } from '../notes/member-notes.ts'; +import { CommunityId } from './community-id.ts'; + +export const MemberRemovedFromCommunity = (communityName: string, memberName: string) => + Question.about(`whether member "${memberName}" is absent from "${communityName}"`, async (serenityActor) => { + const actor = serenityActor as unknown as Actor; + const routeMemberId = await actor.answer(notes().get('routeMemberId')); + if (!routeMemberId) { + throw new Error(`Missing route member state for member removal verification in "${communityName}"`); + } + + const memberListPage = await openMemberListFor(communityPortalPageOf(actor), await actor.answer(CommunityId(communityName)), routeMemberId); + await memberListPage.memberName(memberName).waitFor({ state: 'hidden', timeout: 15_000 }); + return true; + }); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/questions/route-member-id.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/questions/route-member-id.ts new file mode 100644 index 000000000..f0f5797e3 --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/questions/route-member-id.ts @@ -0,0 +1,12 @@ +import { notes, Question } from '@serenity-js/core'; +import type { MemberE2ENotes } from '../notes/member-notes.ts'; + +export const RouteMemberId = (communityName: string) => + Question.about(`the administrator route member ID for "${communityName}"`, async (actor) => { + const routeMemberId = await actor.answer(notes().get('routeMemberId')); + if (!routeMemberId) { + throw new Error(`Missing administrator route member state for "${communityName}"`); + } + + return routeMemberId; + }); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/step-definitions/assign-member-account.steps.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/step-definitions/assign-member-account.steps.ts new file mode 100644 index 000000000..1e989059a --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/step-definitions/assign-member-account.steps.ts @@ -0,0 +1,70 @@ +import { Given, Then, When } from '@cucumber/cucumber'; +import { actors } from '@ocom-verification/verification-shared/test-data'; +import { actorCalled, actorInTheSpotlight, notes } from '@serenity-js/core'; +import type { MemberE2ENotes } from '../notes/member-notes.ts'; +import { MemberAccountCount, MemberAccountLinked } from '../questions/member-account-linked.ts'; +import { AssignMemberAccount } from '../tasks/assign-member-account.ts'; + +const accountDetails: Record = { + Charlie: { + displayName: `${actors.CommunityOwner.givenName} ${actors.CommunityOwner.familyName}`, + email: actors.CommunityOwner.email, + externalId: actors.CommunityOwner.externalId, + }, +}; + +Given('end-user account {string} is available for assignment in {string}', async (accountLabel: string, communityName: string) => { + const actor = actorInTheSpotlight(); + const account = accountDetails[accountLabel]; + if (!account) { + throw new Error(`Unknown end-user account label "${accountLabel}"`); + } + await actor.attemptsTo( + notes().set('endUserDisplayNamesByLabel', { [accountLabel]: account.displayName }), + notes().set('endUserEmailsByLabel', { [accountLabel]: account.email }), + notes().set('endUserExternalIdsByLabel', { [accountLabel]: account.externalId }), + notes().set('lastMemberCommunityName', communityName), + ); +}); + +When('{word} associates end-user account {string} to member {string} in {string}', async (actorName: string, accountLabel: string, _memberName: string, communityName: string) => { + const actor = actorCalled(actorName); + const displayNames = await actor.answer(notes().get('endUserDisplayNamesByLabel')); + await actor.attemptsTo(notes().set('errorMessage', null)); + try { + await actor.attemptsTo(AssignMemberAccount(communityName, displayNames[accountLabel] ?? '')); + } catch (error) { + await actor.attemptsTo(notes().set('errorMessage', error instanceof Error ? error.message : String(error))); + } +}); + +Given('member {string} is already linked to end-user account {string}', async (_memberName: string, accountLabel: string) => { + const actor = actorInTheSpotlight(); + const displayNames = await actor.answer(notes().get('endUserDisplayNamesByLabel')); + await actor.attemptsTo(AssignMemberAccount('Green Oaks', displayNames[accountLabel] ?? '')); +}); + +Then('member {string} should be linked to end-user account {string}', async (_memberName: string, accountLabel: string) => { + const actor = actorInTheSpotlight(); + const emails = await actor.answer(notes().get('endUserEmailsByLabel')); + const communityName = await actor.answer(notes().get('lastMemberCommunityName')); + if (!communityName) { + throw new Error('Missing community state for account verification'); + } + if (!(await actor.answer(MemberAccountLinked(communityName, emails[accountLabel] ?? '')))) { + throw new Error(`Expected the member account list to contain end-user account "${accountLabel}"`); + } +}); + +Then('member {string} should remain linked to end-user account {string} only once', async (_memberName: string, accountLabel: string) => { + const actor = actorInTheSpotlight(); + const emails = await actor.answer(notes().get('endUserEmailsByLabel')); + const communityName = await actor.answer(notes().get('lastMemberCommunityName')); + if (!communityName) { + throw new Error('Missing community state for account verification'); + } + const count = await actor.answer(MemberAccountCount(communityName, emails[accountLabel] ?? '')); + if (count !== 1) { + throw new Error(`Expected one account association for "${accountLabel}" but found ${count}`); + } +}); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/step-definitions/create-member.steps.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/step-definitions/create-member.steps.ts new file mode 100644 index 000000000..f6bc297f7 --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/step-definitions/create-member.steps.ts @@ -0,0 +1,95 @@ +import { GherkinDataTable } from '@cellix/serenity-framework/cucumber/gherkin-data-table'; +import { type DataTable, Given, Then, When } from '@cucumber/cucumber'; +import { actors } from '@ocom-verification/verification-shared/test-data'; +import { actorCalled, notes } from '@serenity-js/core'; +import { LogInWithOAuth2 } from '../../../shared/abilities/oauth2-login.ts'; +import { clearKnownQueueMessages } from '../../../shared/support/queue-storage.ts'; +import type { CommunityE2ENotes } from '../notes/community-notes.ts'; +import type { MemberE2ENotes } from '../notes/member-notes.ts'; +import { MemberCreatedInCommunity } from '../questions/member-created-in-community.ts'; +import { MemberErrorMessage } from '../questions/member-error-message.ts'; +import { CreateCommunity } from '../tasks/create-community.ts'; +import { CreateMember } from '../tasks/create-member.ts'; + +interface MemberDetails { + memberName?: string; +} + +let lastActorName = actors.CommunityOwner.name; + +Given('{word} is signed in as a community owner for member management', async (actorName: string) => { + lastActorName = actorName; + const actor = actorCalled(actorName); + + await clearKnownQueueMessages(); + await actor.attemptsTo(LogInWithOAuth2(actors.CommunityOwner.email)); +}); + +Given('{word} has a community named {string}', async (actorName: string, communityName: string) => { + lastActorName = actorName; + const actor = actorCalled(actorName); + + await actor.attemptsTo(CreateCommunity(communityName)); + + const communityId = (await actor.answer(notes().get('communityId'))) as string | null; + if (!communityId) { + throw new Error(`Expected created community id for "${communityName}" but none was recorded`); + } + + const existingCommunityIdsByName = (await actor.answer(notes().get('communityIdsByName')).catch(() => ({}) as Record)) as Record; + await actor.attemptsTo( + notes().set('communityIdsByName', { + ...existingCommunityIdsByName, + [communityName]: communityId, + }), + ); +}); + +When('{word} creates a member in {string} with:', async (actorName: string, communityName: string, dataTable: DataTable) => { + lastActorName = actorName; + const actor = actorCalled(actorName); + + const details = GherkinDataTable.from(dataTable).rowsHash(); + const memberName = details.memberName?.trim() ?? ''; + if (!memberName) { + throw new Error('memberName is required'); + } + + await actor.attemptsTo(notes().set('lastMemberId', null), notes().set('errorMessage', null)); + + await actor.attemptsTo(CreateMember(communityName, memberName)); +}); + +Then('the member should be created successfully in {string}', async (communityName: string) => { + const actor = actorCalled(lastActorName); + await actor.answer(MemberCreatedInCommunity(communityName)); +}); + +When('{word} attempts to create a member in {string} with:', async (actorName: string, communityName: string, dataTable: DataTable) => { + lastActorName = actorName; + const actor = actorCalled(actorName); + const details = GherkinDataTable.from(dataTable).rowsHash(); + await actor.attemptsTo(notes().set('lastMemberId', null), notes().set('errorMessage', null)); + try { + await actor.attemptsTo(CreateMember(communityName, details.memberName?.trim() ?? '')); + } catch (error) { + await actor.attemptsTo(notes().set('errorMessage', error instanceof Error ? error.message : String(error))); + } +}); + +Then('she should see a member error for {string}', async (fieldName: string) => { + const error = await actorCalled(lastActorName).answer(MemberErrorMessage()); + const isFieldMentioned = error?.toLowerCase().includes(fieldName.toLowerCase()) ?? false; + if (!error || (!isFieldMentioned && !/cannot be empty|required|missing|invalid|must not be empty|please input|already associated/i.test(error))) { + throw new Error(`Expected a validation error related to "${fieldName}", but got: "${error}"`); + } +}); + +Then('no new member should be created in {string}', async (_communityName: string) => { + const memberId = await actorCalled(lastActorName) + .answer(notes().get('lastMemberId')) + .catch(() => null); + if (memberId) { + throw new Error('Expected no member to be created'); + } +}); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/step-definitions/index.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/step-definitions/index.ts index c04c54d61..02ccfb616 100644 --- a/packages/ocom-verification/e2e-tests/src/contexts/community/step-definitions/index.ts +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/step-definitions/index.ts @@ -1,2 +1,7 @@ // Community context step definitions import './create-community.steps.ts'; +import './create-member.steps.ts'; +import './list-members.steps.ts'; +import './remove-member.steps.ts'; +import './assign-member-account.steps.ts'; +import './update-member.steps.ts'; diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/step-definitions/list-members.steps.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/step-definitions/list-members.steps.ts new file mode 100644 index 000000000..f942e8d84 --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/step-definitions/list-members.steps.ts @@ -0,0 +1,60 @@ +import { type DataTable, Given, Then, When } from '@cucumber/cucumber'; +import { actors } from '@ocom-verification/verification-shared/test-data'; +import { actorCalled, actorInTheSpotlight, notes } from '@serenity-js/core'; +import { LogInWithOAuth2 } from '../../../shared/abilities/oauth2-login.ts'; +import type { MemberE2ENotes } from '../notes/member-notes.ts'; +import { MemberListedInCommunity } from '../questions/member-listed-in-community.ts'; +import { CreateMember } from '../tasks/create-member.ts'; +import { ListMembers } from '../tasks/list-members.ts'; +import { SearchMemberList } from '../tasks/search-member-list.ts'; + +interface ListedMemberDetails { + memberName: string; + role?: string; +} + +Given('{word} is an authenticated community admin for {string}', async (actorName: string, communityName: string) => { + const owner = actorInTheSpotlight(); + const communityIdsByName = await owner.answer(notes().get('communityIdsByName')); + if (!communityIdsByName[communityName]) { + throw new Error(`Unknown community "${communityName}". Ensure it was created in setup.`); + } + + await actorCalled(actorName).attemptsTo(notes().set('communityIdsByName', communityIdsByName), LogInWithOAuth2(actors.CommunityOwner.email)); +}); + +Given('the following members exist in {string}:', async (communityName: string, dataTable: DataTable) => { + const actor = actorInTheSpotlight(); + for (const { memberName } of dataTable.hashes() as ListedMemberDetails[]) { + await actor.attemptsTo(CreateMember(communityName, memberName.trim())); + } +}); + +When('{word} lists members for {string}', async (actorName: string, communityName: string) => { + await actorCalled(actorName).attemptsTo(ListMembers(communityName)); +}); + +When('{word} searches the member list in {string} for {string}', async (actorName: string, communityName: string, searchTerm: string) => { + await actorCalled(actorName).attemptsTo(ListMembers(communityName), SearchMemberList(searchTerm)); +}); + +Then('{word} should see the following members in {string}:', async (actorName: string, _communityName: string, dataTable: DataTable) => { + const actor = actorCalled(actorName); + for (const { memberName } of dataTable.hashes() as ListedMemberDetails[]) { + if (!(await actor.answer(MemberListedInCommunity(memberName)))) { + throw new Error(`Expected member "${memberName}" to appear in the browser member list`); + } + } +}); + +Then('{word} should not see member {string} from {string}', async (actorName: string, memberName: string, _communityName: string) => { + if (await actorCalled(actorName).answer(MemberListedInCommunity(memberName))) { + throw new Error(`Expected member "${memberName}" not to appear in the browser member list`); + } +}); + +Then('{word} should not see member {string} in the filtered results', async (actorName: string, memberName: string) => { + if (await actorCalled(actorName).answer(MemberListedInCommunity(memberName))) { + throw new Error(`Expected member "${memberName}" not to appear in the filtered member list`); + } +}); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/step-definitions/remove-member.steps.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/step-definitions/remove-member.steps.ts new file mode 100644 index 000000000..84e38fc4d --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/step-definitions/remove-member.steps.ts @@ -0,0 +1,83 @@ +import { BrowseTheWeb } from '@cellix/serenity-framework/serenity/browser'; +import { Given, Then, When } from '@cucumber/cucumber'; +import { actors } from '@ocom-verification/verification-shared/test-data'; +import { actorCalled, actorInTheSpotlight, notes } from '@serenity-js/core'; +import { SwitchOAuth2User } from '../../../shared/abilities/oauth2-login.ts'; +import type { MemberE2ENotes } from '../notes/member-notes.ts'; +import { HasNoMemberForCommunity } from '../questions/has-no-member-for-community.ts'; +import { MemberListedInCommunity } from '../questions/member-listed-in-community.ts'; +import { MemberRemovedFromCommunity } from '../questions/member-removed-from-community.ts'; +import { RemoveMember } from '../tasks/remove-member.ts'; + +let lastActorName = actors.CommunityOwner.name; +let managementOwnerActorName = actors.CommunityOwner.name; +let managementOwnerMemberId = ''; + +Given('{word} is signed in without membership in {string}', async (actorName: string, communityName: string) => { + const owner = actorInTheSpotlight(); + managementOwnerActorName = owner.name; + const communityIds = await owner.answer(notes().get('communityIdsByName')); + const targetMemberId = await owner.answer(notes().get('lastMemberId')); + const { page } = BrowseTheWeb.withActor(owner); + managementOwnerMemberId = new URL(page.url()).pathname.match(/\/admin\/([^/]+)\/members\//)?.[1] ?? ''; + const actor = actorCalled(actorName); + await actor.attemptsTo( + notes().set('communityIdsByName', communityIds), + notes().set('lastMemberId', targetMemberId), + notes().set('routeMemberId', targetMemberId), + notes().set('errorMessage', null), + SwitchOAuth2User('test@example.com'), + ); + if (!communityIds[communityName] || !managementOwnerMemberId) { + throw new Error(`Missing owner state for authorization scenario in "${communityName}"`); + } + if (!(await actor.answer(HasNoMemberForCommunity.inCommunity(communityIds[communityName])))) { + throw new Error(`Expected ${actorName} to have no membership in community "${communityName}"`); + } +}); + +When('{word} removes member {string} from {string}', async (actorName: string, memberName: string, communityName: string) => { + lastActorName = actorName; + const actor = actorCalled(actorName); + await actor.attemptsTo(RemoveMember(communityName, memberName)); +}); + +Then('the member should be removed successfully from {string}', async (communityName: string) => { + const actor = actorCalled(lastActorName); + const memberName = await actor.answer(notes().get('lastMemberName')); + if (!memberName || !(await actor.answer(MemberRemovedFromCommunity(communityName, memberName)))) { + throw new Error('Expected member removal to succeed'); + } +}); + +Then('member {string} should not appear in member listings for {string}', async (memberName: string, _communityName: string) => { + if (await actorCalled(lastActorName).answer(MemberListedInCommunity(memberName))) { + throw new Error(`Expected member "${memberName}" not to appear in the browser member list`); + } +}); + +When('{word} attempts to remove member {string} from {string}', async (actorName: string, memberName: string, communityName: string) => { + lastActorName = actorName; + const actor = actorCalled(actorName); + try { + await actor.attemptsTo(RemoveMember(communityName, memberName)); + } catch (error) { + await actor.attemptsTo(notes().set('errorMessage', error instanceof Error ? error.message : String(error))); + } +}); + +Then('{word} should receive an authorization error for member management', async (actorName: string) => { + const error = await actorCalled(actorName).answer(notes().get('errorMessage')); + if (!error || !/permission|cannot remove|unauthorized|forbidden|not authorized|not a member/i.test(error)) { + throw new Error(`Expected a member-management authorization error, but got: "${error}"`); + } +}); + +Then('member {string} should remain in {string}', async (memberName: string, communityName: string) => { + const owner = actorCalled(managementOwnerActorName); + const communityIds = await owner.answer(notes().get('communityIdsByName')); + await owner.attemptsTo(SwitchOAuth2User(actors.CommunityOwner.email)); + if (!(await owner.answer(MemberListedInCommunity(memberName, { communityId: communityIds[communityName] ?? '', routeMemberId: managementOwnerMemberId })))) { + throw new Error(`Expected member "${memberName}" to remain in "${communityName}"`); + } +}); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/step-definitions/update-member.steps.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/step-definitions/update-member.steps.ts new file mode 100644 index 000000000..6b56ce9c9 --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/step-definitions/update-member.steps.ts @@ -0,0 +1,60 @@ +import { GherkinDataTable } from '@cellix/serenity-framework/cucumber/gherkin-data-table'; +import { type DataTable, Then, When } from '@cucumber/cucumber'; +import { actors } from '@ocom-verification/verification-shared/test-data'; +import { actorCalled, notes } from '@serenity-js/core'; +import type { MemberE2ENotes, MemberProfileExpectation } from '../notes/member-notes.ts'; +import { MemberProfileMatches } from '../questions/member-profile-matches.ts'; +import { UpdateMemberProfile } from '../tasks/update-member-profile.ts'; + +let lastActorName = actors.CommunityOwner.name; + +type MemberProfileUpdateDetails = Partial>; + +const parseBoolean = (value: string): boolean => value.trim().toLowerCase() === 'true'; + +When('{word} updates member {string} in {string} with:', async (actorName: string, memberName: string, communityName: string, dataTable: DataTable) => { + lastActorName = actorName; + + const actor = actorCalled(actorName); + const details = GherkinDataTable.from(dataTable).rowsHash(); + const communityIdsByName = (await actor.answer(notes().get('communityIdsByName')).catch(() => ({}) as Record)) as Record; + + if (!communityIdsByName[communityName]) { + throw new Error(`Unknown community "${communityName}". Ensure it was created in setup.`); + } + + const expectedProfile: MemberProfileExpectation = { + ...(details.name ? { name: details.name } : {}), + ...(details.memberName ? { name: details.memberName } : {}), + ...(details.email ? { email: details.email } : {}), + ...(details.bio ? { bio: details.bio } : {}), + ...(details.avatarDocumentId ? { avatarDocumentId: details.avatarDocumentId } : {}), + ...(details.interests + ? { + interests: details.interests + .split(',') + .map((interest) => interest.trim()) + .filter((interest) => interest.length > 0), + } + : {}), + ...(details.showInterests !== undefined ? { showInterests: parseBoolean(details.showInterests) } : {}), + ...(details.showEmail !== undefined ? { showEmail: parseBoolean(details.showEmail) } : {}), + ...(details.showProfile !== undefined ? { showProfile: parseBoolean(details.showProfile) } : {}), + ...(details.showLocation !== undefined ? { showLocation: parseBoolean(details.showLocation) } : {}), + ...(details.showProperties !== undefined ? { showProperties: parseBoolean(details.showProperties) } : {}), + }; + + await actor.attemptsTo(notes().set('errorMessage', null)); + + await actor.attemptsTo( + UpdateMemberProfile({ + communityName, + memberName, + profile: expectedProfile, + }), + ); +}); + +Then('the member should be updated successfully in {string}', async (_communityName: string) => { + await actorCalled(lastActorName).answer(MemberProfileMatches(_communityName)); +}); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/tasks/assign-member-account.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/tasks/assign-member-account.ts new file mode 100644 index 000000000..236c9a588 --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/tasks/assign-member-account.ts @@ -0,0 +1,14 @@ +import { TaskStep } from '@cellix/serenity-framework/serenity'; +import { type Actor, Task, the } from '@serenity-js/core'; +import { OpenMemberAccountAssignment } from '../interactions/open-member-account-assignment.ts'; +import { ResolveCommunityAdministratorMembership } from '../interactions/resolve-community-administrator-membership.ts'; +import { SelectMemberEndUserAccount } from '../interactions/select-member-end-user-account.ts'; +import { SubmitMemberAccountAssignment } from '../interactions/submit-member-account-assignment.ts'; + +export const AssignMemberAccount = (communityName: string, displayName: string) => + Task.where( + the`#actor assigns end-user account "${displayName}" in "${communityName}"`, + new TaskStep('#actor assigns an end-user account through the community portal', async (actor) => { + await actor.attemptsTo(ResolveCommunityAdministratorMembership(actor, communityName), OpenMemberAccountAssignment(actor, communityName), SelectMemberEndUserAccount(actor, displayName), SubmitMemberAccountAssignment(actor)); + }), + ); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/tasks/create-member.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/tasks/create-member.ts new file mode 100644 index 000000000..a98546aeb --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/tasks/create-member.ts @@ -0,0 +1,14 @@ +import { TaskStep } from '@cellix/serenity-framework/serenity'; +import { type Actor, Task, the } from '@serenity-js/core'; +import { SubmitMemberCreateForm } from '../interactions/fill-and-submit-member-create-form.ts'; +import { FillMemberCreateForm } from '../interactions/fill-member-create-form.ts'; +import { OpenCreateMemberForm } from '../interactions/open-create-member-form.ts'; +import { ResolveCommunityAdministratorMembership } from '../interactions/resolve-community-administrator-membership.ts'; + +export const CreateMember = (communityName: string, memberName: string) => + Task.where( + the`#actor creates member "${memberName}" in "${communityName}" via UI`, + new TaskStep('#actor creates a member through the community portal', async (actor) => { + await actor.attemptsTo(ResolveCommunityAdministratorMembership(actor, communityName), OpenCreateMemberForm(actor, communityName), FillMemberCreateForm(actor, memberName), SubmitMemberCreateForm(actor, memberName)); + }), + ); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/tasks/list-members.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/tasks/list-members.ts new file mode 100644 index 000000000..11813b929 --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/tasks/list-members.ts @@ -0,0 +1,12 @@ +import { TaskStep } from '@cellix/serenity-framework/serenity'; +import { type Actor, Task, the } from '@serenity-js/core'; +import { OpenCommunityMemberList } from '../interactions/open-community-member-list.ts'; +import { ResolveCommunityAdministratorMembership } from '../interactions/resolve-community-administrator-membership.ts'; + +export const ListMembers = (communityName: string) => + Task.where( + the`#actor lists members in "${communityName}" via UI`, + new TaskStep('#actor opens the community member list', async (actor) => { + await actor.attemptsTo(ResolveCommunityAdministratorMembership(actor, communityName), OpenCommunityMemberList(actor, communityName)); + }), + ); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/tasks/remove-member.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/tasks/remove-member.ts new file mode 100644 index 000000000..4ae684589 --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/tasks/remove-member.ts @@ -0,0 +1,11 @@ +import { TaskStep } from '@cellix/serenity-framework/serenity'; +import { type Actor, Task, the } from '@serenity-js/core'; +import { RemoveMember as RemoveMemberInteraction } from '../interactions/remove-member.ts'; + +export const RemoveMember = (communityName: string, memberName: string) => + Task.where( + the`#actor removes member "${memberName}" from "${communityName}"`, + new TaskStep('#actor removes a member through the community portal', async (actor) => { + await actor.attemptsTo(RemoveMemberInteraction(actor, communityName, memberName)); + }), + ); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/tasks/search-member-list.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/tasks/search-member-list.ts new file mode 100644 index 000000000..79c4d8caf --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/tasks/search-member-list.ts @@ -0,0 +1,11 @@ +import { TaskStep } from '@cellix/serenity-framework/serenity'; +import { type Actor, Task, the } from '@serenity-js/core'; +import { SearchMemberList as SearchMemberListInteraction } from '../interactions/search-member-list.ts'; + +export const SearchMemberList = (searchTerm: string) => + Task.where( + the`#actor searches the member list for "${searchTerm}"`, + new TaskStep('#actor searches the open member list', async (actor) => { + await actor.attemptsTo(SearchMemberListInteraction(actor, searchTerm)); + }), + ); diff --git a/packages/ocom-verification/e2e-tests/src/contexts/community/tasks/update-member-profile.ts b/packages/ocom-verification/e2e-tests/src/contexts/community/tasks/update-member-profile.ts new file mode 100644 index 000000000..f20d16a98 --- /dev/null +++ b/packages/ocom-verification/e2e-tests/src/contexts/community/tasks/update-member-profile.ts @@ -0,0 +1,26 @@ +import { TaskStep } from '@cellix/serenity-framework/serenity'; +import { type Actor, Task, the } from '@serenity-js/core'; +import { SubmitMemberProfileForm } from '../interactions/fill-and-submit-member-profile-form.ts'; +import { FillMemberProfileForm } from '../interactions/fill-member-profile-form.ts'; +import { OpenMemberProfileEditor } from '../interactions/open-member-profile-editor.ts'; +import { ResolveCommunityAdministratorMembership } from '../interactions/resolve-community-administrator-membership.ts'; +import type { MemberProfileExpectation } from '../notes/member-notes.ts'; + +interface UpdateMemberProfileDetails { + communityName: string; + memberName: string; + profile: MemberProfileExpectation; +} + +export const UpdateMemberProfile = (details: UpdateMemberProfileDetails) => + Task.where( + the`#actor updates member profile for "${details.memberName}" in "${details.communityName}"`, + new TaskStep('#actor updates the member profile through the community portal', async (actor) => { + await actor.attemptsTo( + ResolveCommunityAdministratorMembership(actor, details.communityName), + OpenMemberProfileEditor(actor, details.communityName, details.memberName), + FillMemberProfileForm(actor, details.profile), + SubmitMemberProfileForm(actor), + ); + }), + ); diff --git a/packages/ocom-verification/e2e-tests/src/shared/abilities/oauth2-login.ts b/packages/ocom-verification/e2e-tests/src/shared/abilities/oauth2-login.ts index 2425aa4f9..70abd4db3 100644 --- a/packages/ocom-verification/e2e-tests/src/shared/abilities/oauth2-login.ts +++ b/packages/ocom-verification/e2e-tests/src/shared/abilities/oauth2-login.ts @@ -106,3 +106,18 @@ export const LogInWithOAuth2 = (email = actors.CommunityOwner.email, password = await OAuth2Login.as(actor as Actor).authenticate(actor as Actor, { email, password }); }) as Activity, ); + +export const SwitchOAuth2User = (email: string, password = 'password') => + Task.where( + the`#actor switches OAuth2 user`, + new TaskStep('#actor clears the current session and logs in again', async (actor) => { + const serenityActor = actor as Actor; + const { page } = BrowseTheWeb.withActor(serenityActor); + await page.evaluate(() => { + localStorage.clear(); + sessionStorage.clear(); + }); + await page.context().clearCookies(); + await OAuth2Login.as(serenityActor).authenticate(serenityActor, { email, password }); + }) as Activity, + ); diff --git a/packages/ocom-verification/verification-shared/src/pages/index.ts b/packages/ocom-verification/verification-shared/src/pages/index.ts index 92c1e1c6b..780ee5d5a 100644 --- a/packages/ocom-verification/verification-shared/src/pages/index.ts +++ b/packages/ocom-verification/verification-shared/src/pages/index.ts @@ -1,4 +1,8 @@ export { CommunityPage } from './community.page.ts'; export { HomePage } from './home.page.ts'; +export { MemberAccountsPage } from './member-accounts.page.ts'; +export { MemberCreatePage } from './member-create.page.ts'; +export { MemberListPage } from './member-list.page.ts'; +export { MemberProfilePage } from './member-profile.page.ts'; export { STAFF_ROLE_PERMISSION_LABELS, StaffRoleFormPage } from './staff-role-form.page.ts'; export { StaffRolesListPage } from './staff-roles-list.page.ts'; diff --git a/packages/ocom-verification/verification-shared/src/pages/member-accounts.page.ts b/packages/ocom-verification/verification-shared/src/pages/member-accounts.page.ts new file mode 100644 index 000000000..8db72039e --- /dev/null +++ b/packages/ocom-verification/verification-shared/src/pages/member-accounts.page.ts @@ -0,0 +1,39 @@ +import { AdapterBackedPageObject, type ElementHandle } from '@cellix/serenity-framework/pages'; + +export class MemberAccountsPage extends AdapterBackedPageObject { + get endUserSelect(): ElementHandle { + return this.adapter.getByLabel('End User'); + } + + get addMemberAccountButton(): ElementHandle { + return this.adapter.getByRole('button', { name: /Add Member Account/i }); + } + + get addAccountButton(): ElementHandle { + return this.adapter.getByRole('button', { name: /Add Account/i }); + } + + get errorToast(): ElementHandle { + return this.adapter.locator('.ant-message-error, .ant-notification-notice-error'); + } + + linkedAccountEmail(email: string): ElementHandle { + return this.adapter.getByText(email); + } + + async linkedAccountCount(email: string): Promise { + const cells = await this.adapter.locatorAll('tbody td'); + const texts = await Promise.all(cells.map((cell) => cell.textContent())); + return texts.filter((text) => text?.trim() === email).length; + } + + async selectEndUser(displayName: string): Promise { + await this.endUserSelect.click(); + await this.endUserSelect.fill(displayName); + await this.adapter.getByText(displayName, { selector: '.ant-select-item-option-content' }).click(); + } + + async clickAddMemberAccount(): Promise { + await this.addMemberAccountButton.click(); + } +} diff --git a/packages/ocom-verification/verification-shared/src/pages/member-create.page.ts b/packages/ocom-verification/verification-shared/src/pages/member-create.page.ts new file mode 100644 index 000000000..b6c1775cf --- /dev/null +++ b/packages/ocom-verification/verification-shared/src/pages/member-create.page.ts @@ -0,0 +1,27 @@ +import { AdapterBackedPageObject, type ElementHandle } from '@cellix/serenity-framework/pages'; + +export class MemberCreatePage extends AdapterBackedPageObject { + get memberNameInput(): ElementHandle { + return this.adapter.getByLabel('Member Name'); + } + + get createMemberButton(): ElementHandle { + return this.adapter.getByRole('button', { name: /Create Member/i }); + } + + get validationError(): ElementHandle { + return this.adapter.locator('.ant-form-item-explain-error'); + } + + get errorToast(): ElementHandle { + return this.adapter.locator('.ant-message-error, [role="alert"]'); + } + + async fillMemberName(value: string): Promise { + await this.memberNameInput.fill(value); + } + + async clickCreateMember(): Promise { + await this.createMemberButton.click(); + } +} diff --git a/packages/ocom-verification/verification-shared/src/pages/member-list.page.ts b/packages/ocom-verification/verification-shared/src/pages/member-list.page.ts new file mode 100644 index 000000000..59930eaa5 --- /dev/null +++ b/packages/ocom-verification/verification-shared/src/pages/member-list.page.ts @@ -0,0 +1,36 @@ +import { AdapterBackedPageObject, type ElementHandle } from '@cellix/serenity-framework/pages'; + +export class MemberListPage extends AdapterBackedPageObject { + get searchInput(): ElementHandle { + return this.adapter.getByPlaceholder('Search by member name or email'); + } + + memberName(name: string): ElementHandle { + return this.adapter.getByText(name); + } + + get errorToast(): ElementHandle { + return this.adapter.locator('.ant-message-error, .ant-notification-notice-error'); + } + + async searchByMemberName(name: string): Promise { + await this.searchInput.fill(name); + } + + async clickRemoveMember(name: string): Promise { + const row = this.adapter.getByRole('row', { name: new RegExp(name) }); + const buttons = await row.querySelectorAll('button'); + for (const button of buttons) { + if ((await button.textContent())?.trim() === 'Remove') { + await button.click(); + return; + } + } + const removeButton = this.adapter.getByRole('button', { name: /^Remove$/i }); + if (await removeButton.isVisible()) { + await removeButton.click(); + return; + } + throw new Error(`Remove action not found for member "${name}"`); + } +} diff --git a/packages/ocom-verification/verification-shared/src/pages/member-profile.page.ts b/packages/ocom-verification/verification-shared/src/pages/member-profile.page.ts new file mode 100644 index 000000000..85831d9de --- /dev/null +++ b/packages/ocom-verification/verification-shared/src/pages/member-profile.page.ts @@ -0,0 +1,127 @@ +import { AdapterBackedPageObject, type ElementHandle } from '@cellix/serenity-framework/pages'; + +export class MemberProfilePage extends AdapterBackedPageObject { + get displayNameInput(): ElementHandle { + return this.adapter.getByPlaceholder('Display Name'); + } + + get emailInput(): ElementHandle { + return this.adapter.getByPlaceholder('Email'); + } + + get bioInput(): ElementHandle { + return this.adapter.getByPlaceholder('Bio'); + } + + get editProfileButton(): ElementHandle { + return this.adapter.getByRole('button', { name: /Edit Profile/i }); + } + + get saveProfileButton(): ElementHandle { + return this.adapter.getByRole('button', { name: /Save Profile/i }); + } + + get firstValidationError(): ElementHandle { + return this.adapter.locator('.ant-form-item-explain-error'); + } + + get errorToast(): ElementHandle { + return this.adapter.locator('.ant-message-error, [role="alert"]'); + } + + async clickEditProfile(): Promise { + await this.editProfileButton.click(); + } + + async clickSaveProfile(): Promise { + await this.saveProfileButton.click(); + } + + async fillDisplayName(value: string): Promise { + await this.displayNameInput.fill(value); + } + + async fillEmail(value: string): Promise { + await this.emailInput.fill(value); + } + + async fillBio(value: string): Promise { + await this.bioInput.fill(value); + } + + async displayNameValue(): Promise { + return (await this.displayNameInput.inputValue()) ?? ''; + } + + async emailValue(): Promise { + return (await this.emailInput.inputValue()) ?? ''; + } + + async bioValue(): Promise { + return (await this.bioInput.inputValue()) ?? ''; + } + + async setShowInterests(value: boolean): Promise { + await this.setSwitchAtIndex(0, value); + } + + async setShowEmail(value: boolean): Promise { + await this.setSwitchAtIndex(1, value); + } + + async setShowProfile(value: boolean): Promise { + await this.setSwitchAtIndex(2, value); + } + + async setShowLocation(value: boolean): Promise { + await this.setSwitchAtIndex(3, value); + } + + async setShowProperties(value: boolean): Promise { + await this.setSwitchAtIndex(4, value); + } + + async showInterestsValue(): Promise { + return await this.switchValueAtIndex(0); + } + + async showEmailValue(): Promise { + return await this.switchValueAtIndex(1); + } + + async showProfileValue(): Promise { + return await this.switchValueAtIndex(2); + } + + async showLocationValue(): Promise { + return await this.switchValueAtIndex(3); + } + + async showPropertiesValue(): Promise { + return await this.switchValueAtIndex(4); + } + + private async setSwitchAtIndex(index: number, expectedChecked: boolean): Promise { + const switches = await this.adapter.locatorAll('button[role="switch"]'); + const target = switches[index]; + if (!target) { + throw new Error(`Expected switch at index ${index} but none was found`); + } + + const checkedState = await target.getAttribute('aria-checked'); + const isChecked = checkedState === 'true'; + if (isChecked !== expectedChecked) { + await target.click(); + } + } + + private async switchValueAtIndex(index: number): Promise { + const switches = await this.adapter.locatorAll('button[role="switch"]'); + const target = switches[index]; + if (!target) { + throw new Error(`Expected switch at index ${index} but none was found`); + } + + return (await target.getAttribute('aria-checked')) === 'true'; + } +} diff --git a/packages/ocom-verification/verification-shared/src/scenarios/community/member/member-lifecycle.feature b/packages/ocom-verification/verification-shared/src/scenarios/community/member/member-lifecycle.feature new file mode 100644 index 000000000..3b2a3a174 --- /dev/null +++ b/packages/ocom-verification/verification-shared/src/scenarios/community/member/member-lifecycle.feature @@ -0,0 +1,115 @@ +Feature: Community member management + + As a community owner or administrator + I want to manage members within a specific community + So that member records and account access remain accurate and correctly scoped + + Background: + Given Alice is signed in as a community owner for member management + And Alice has a community named "Green Oaks" + And Alice has a community named "Blue Harbor" + + Scenario: Create a member record in a community + When Alice creates a member in "Green Oaks" with: + | memberName | Charlie Walker | + Then the member should be created successfully in "Green Oaks" + + Scenario: Update all member profile fields within a community + Given Alice creates a member in "Green Oaks" with: + | memberName | Charlie Walker | + When Alice updates member "Charlie Walker" in "Green Oaks" with: + | name | Charles Walker | + | email | charles.walker@example.com | + | bio | Community gardener and volunteer | + | avatarDocumentId | avatar-charles-001 | + | interests | gardening,reading,volunteering | + | showInterests | true | + | showEmail | true | + | showProfile | true | + | showLocation | false | + | showProperties | true | + Then the member should be updated successfully in "Green Oaks" + + Scenario: Assign a community end-user account to a member + Given Alice creates a member in "Green Oaks" with: + | memberName | Charlie Walker | + And end-user account "Charlie" is available for assignment in "Green Oaks" + When Alice associates end-user account "Charlie" to member "Charlie Walker" in "Green Oaks" + Then member "Charlie Walker" should be linked to end-user account "Charlie" + + @api-only + Scenario: Update a member role with a role from the same community + Given Alice creates a member in "Green Oaks" with: + | memberName | Charlie Walker | + And a role "board member" exists in "Green Oaks" + When Alice changes member "Charlie Walker" in "Green Oaks" to role "board member" + Then member "Charlie Walker" should have role "board member" in "Green Oaks" + + @api-only @validation + Scenario: Cannot assign a role from another community + Given Alice creates a member in "Green Oaks" with: + | memberName | Charlie Walker | + And a role "harbor board member" exists in "Blue Harbor" + When Alice attempts to change member "Charlie Walker" in "Green Oaks" to role "harbor board member" + Then she should see a member error for "role" + And member "Charlie Walker" should not have role "harbor board member" in "Green Oaks" + + Scenario: List members as a community administrator + Given Bob is an authenticated community admin for "Green Oaks" + And the following members exist in "Green Oaks": + | memberName | + | Charlie Walker | + | Dana Ortiz | + And Alice creates a member in "Blue Harbor" with: + | memberName | Erin Lawson | + When Bob lists members for "Green Oaks" + Then Bob should see the following members in "Green Oaks": + | memberName | + | Charlie Walker | + | Dana Ortiz | + And Bob should not see member "Erin Lawson" from "Blue Harbor" + + Scenario: Filter the community member list by member name + Given the following members exist in "Green Oaks": + | memberName | + | Charlie Walker | + | Dana Ortiz | + | Charlotte Webb | + When Alice searches the member list in "Green Oaks" for "Charlie" + Then Alice should see the following members in "Green Oaks": + | memberName | + | Charlie Walker | + And Alice should not see member "Dana Ortiz" in the filtered results + + Scenario: Remove a member from a community + Given Alice creates a member in "Green Oaks" with: + | memberName | Charlie Walker | + When Alice removes member "Charlie Walker" from "Green Oaks" + Then the member should be removed successfully from "Green Oaks" + And member "Charlie Walker" should not appear in member listings for "Green Oaks" + + @validation + Scenario: Cannot create a member without a required name + When Alice attempts to create a member in "Green Oaks" with: + | memberName | | + Then she should see a member error for "memberName" + And no new member should be created in "Green Oaks" + + @validation + Scenario: Cannot associate the same end-user account twice to the same member + Given Alice creates a member in "Green Oaks" with: + | memberName | Charlie Walker | + And end-user account "Charlie" is available for assignment in "Green Oaks" + And member "Charlie Walker" is already linked to end-user account "Charlie" + When Alice associates end-user account "Charlie" to member "Charlie Walker" in "Green Oaks" + Then she should see a member error for "accountAssociation" + And member "Charlie Walker" should remain linked to end-user account "Charlie" only once + + @authorization + Scenario: An end user without community membership cannot remove a member + Given Alice creates a member in "Green Oaks" with: + | memberName | Charlie Walker | + And Evan is signed in without membership in "Green Oaks" + When Evan attempts to remove member "Charlie Walker" from "Green Oaks" + Then Evan should receive an authorization error for member management + And member "Charlie Walker" should remain in "Green Oaks" \ No newline at end of file diff --git a/packages/ocom-verification/verification-shared/src/test-data/index.ts b/packages/ocom-verification/verification-shared/src/test-data/index.ts index b4a279858..bb60dea82 100644 --- a/packages/ocom-verification/verification-shared/src/test-data/index.ts +++ b/packages/ocom-verification/verification-shared/src/test-data/index.ts @@ -1,6 +1,7 @@ export { DEFAULT_STAFF_ROLE_NAMES, END_USER_IDS, + type EndUserRoleSeedDetails, type EndUserSeedDocument, endUsers, type MongoDBSeedContext, @@ -10,9 +11,11 @@ export { type StaffRoleSeedDocument, type StaffUserSeedDocument, seedDatabase, + seedEndUserRole, staffRoles, staffUsers, } from './seed/index.ts'; + export { actors, defaultActor, diff --git a/packages/ocom-verification/verification-shared/src/test-data/seed/index.ts b/packages/ocom-verification/verification-shared/src/test-data/seed/index.ts index f6d65410b..e1203b7ab 100644 --- a/packages/ocom-verification/verification-shared/src/test-data/seed/index.ts +++ b/packages/ocom-verification/verification-shared/src/test-data/seed/index.ts @@ -1,4 +1,4 @@ export { END_USER_IDS, type EndUserSeedDocument, endUsers } from './end-users.ts'; -export { type MongoDBSeedContext, type MongoDBSeedDataFunction, seedDatabase } from './seed.ts'; +export { type EndUserRoleSeedDetails, type MongoDBSeedContext, type MongoDBSeedDataFunction, seedDatabase, seedEndUserRole } from './seed.ts'; export { DEFAULT_STAFF_ROLE_NAMES, STAFF_ROLE_IDS, type StaffRoleSeedDocument, staffRoles } from './staff-roles.ts'; export { STAFF_USER_IDS, type StaffUserSeedDocument, staffUsers } from './staff-users.ts'; diff --git a/packages/ocom-verification/verification-shared/src/test-data/seed/seed.ts b/packages/ocom-verification/verification-shared/src/test-data/seed/seed.ts index 3845a3a33..a1b2f9f3b 100644 --- a/packages/ocom-verification/verification-shared/src/test-data/seed/seed.ts +++ b/packages/ocom-verification/verification-shared/src/test-data/seed/seed.ts @@ -10,6 +10,11 @@ export interface MongoDBSeedContext { export type MongoDBSeedDataFunction = (context: MongoDBSeedContext) => Promise; +export interface EndUserRoleSeedDetails { + communityId: string; + roleName: string; +} + function toObjectId(id: string): ObjectId { return new ObjectId(id); } @@ -53,3 +58,42 @@ export async function seedDatabase(context: MongoDBSeedContext): Promise { await client.close(); } } + +export async function seedEndUserRole(context: MongoDBSeedContext, details: EndUserRoleSeedDetails): Promise { + const client = new MongoClient(context.connectionString); + const roleId = new ObjectId(); + const timestamp = new Date(); + try { + await client.connect(); + await client + .db(context.dbName) + .collection('roles') + .insertOne({ + _id: roleId, + roleType: 'end-user-roles', + community: toObjectId(details.communityId), + roleName: details.roleName, + isDefault: false, + permissions: { + servicePermissions: { canManageServices: false }, + serviceTicketPermissions: { canCreateTickets: false, canManageTickets: false, canAssignTickets: false, canWorkOnTickets: false }, + violationTicketPermissions: { canCreateTickets: false, canManageTickets: false, canAssignTickets: false, canWorkOnTickets: false }, + communityPermissions: { + canManageRolesAndPermissions: false, + canManageCommunitySettings: false, + canManageSiteContent: false, + canManageMembers: false, + canEditOwnMemberProfile: false, + canEditOwnMemberAccounts: false, + }, + propertyPermissions: { canManageProperties: false, canEditOwnProperty: false }, + }, + schemaVersion: '1.0.0', + createdAt: timestamp, + updatedAt: timestamp, + }); + return roleId.toHexString(); + } finally { + await client.close(); + } +} diff --git a/packages/ocom/service-otel/package.json b/packages/ocom/service-otel/package.json index 18fb61910..0dc45ff5e 100644 --- a/packages/ocom/service-otel/package.json +++ b/packages/ocom/service-otel/package.json @@ -26,17 +26,18 @@ }, "dependencies": { "@azure/functions-opentelemetry-instrumentation": "0.1.0", - "@azure/monitor-opentelemetry-exporter": "1.0.0-beta.31", + "@azure/monitor-opentelemetry-exporter": "1.0.0-beta.43", "@cellix/api-services-spec": "workspace:*", "@opentelemetry/api": "1.9.0", "@opentelemetry/instrumentation-dataloader": "0.17.0", "@opentelemetry/instrumentation-graphql": "0.48.0", - "@opentelemetry/instrumentation-http": "0.52.1", + "@opentelemetry/instrumentation-http": "0.220.0", "@opentelemetry/instrumentation-mongoose": "0.47.0", - "@opentelemetry/sdk-logs": "0.57.2", - "@opentelemetry/sdk-metrics": "1.30.1", - "@opentelemetry/sdk-node": "0.57.2", - "@opentelemetry/sdk-trace-node": "1.30.1", + "@opentelemetry/sdk-logs": "0.220.0", + "@opentelemetry/sdk-metrics": "2.9.0", + "@opentelemetry/sdk-node": "0.220.0", + "@opentelemetry/sdk-trace-node": "2.9.0", + "@opentelemetry/resources": "2.9.0", "@opentelemetry/semantic-conventions": "1.28.0" }, "devDependencies": { diff --git a/packages/ocom/service-otel/src/index.test.ts b/packages/ocom/service-otel/src/index.test.ts index 0b7eed41c..1cfaf6571 100644 --- a/packages/ocom/service-otel/src/index.test.ts +++ b/packages/ocom/service-otel/src/index.test.ts @@ -5,20 +5,23 @@ import { expect, vi } from 'vitest'; import { ServiceOtel } from './index.ts'; const test = { for: describeFeature }; -vi.mock('@opentelemetry/sdk-node', () => { - // Mock Resource class and resources namespace +vi.mock('@opentelemetry/resources', () => { class Resource { private attributes: Record; constructor(attrs: Record) { this.attributes = attrs; } - static default() { - return new Resource({ default: true }); - } merge(other: Resource) { return new Resource({ ...this.attributes, ...other.attributes }); } } + return { + defaultResource: () => new Resource({ default: true }), + resourceFromAttributes: (attributes: Record) => new Resource(attributes), + }; +}); + +vi.mock('@opentelemetry/sdk-node', () => { // Mock NodeSDK and track config let lastConfig: unknown; class NodeSDK { @@ -33,7 +36,6 @@ vi.mock('@opentelemetry/sdk-node', () => { } return { NodeSDK, - resources: { Resource }, }; }); diff --git a/packages/ocom/service-otel/src/index.ts b/packages/ocom/service-otel/src/index.ts index 4a456eae5..fa8389a95 100644 --- a/packages/ocom/service-otel/src/index.ts +++ b/packages/ocom/service-otel/src/index.ts @@ -1,4 +1,5 @@ import type { SyncServiceBase } from '@cellix/api-services-spec'; +import { defaultResource, resourceFromAttributes } from '@opentelemetry/resources'; import * as opentelemetry from '@opentelemetry/sdk-node'; import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions'; import { OtelBuilder } from './otel-builder.ts'; @@ -30,8 +31,8 @@ export class ServiceOtel implements SyncServiceBase { metricReader: metricReader, instrumentations: instrumentations, - resource: opentelemetry.resources.Resource.default().merge( - new opentelemetry.resources.Resource({ + resource: defaultResource().merge( + resourceFromAttributes({ [ATTR_SERVICE_NAME]: 'Cellix Demo', [ATTR_SERVICE_VERSION]: '1.0.0', }), diff --git a/packages/ocom/service-otel/src/otel-builder.ts b/packages/ocom/service-otel/src/otel-builder.ts index cd10147dc..e32ee943a 100644 --- a/packages/ocom/service-otel/src/otel-builder.ts +++ b/packages/ocom/service-otel/src/otel-builder.ts @@ -1,16 +1,16 @@ -import type { NodeSDKConfiguration } from '@opentelemetry/sdk-node'; -import { AzureMonitorTraceExporter, AzureMonitorMetricExporter, AzureMonitorLogExporter } from '@azure/monitor-opentelemetry-exporter'; -import { BatchLogRecordProcessor, SimpleLogRecordProcessor, ConsoleLogRecordExporter } from '@opentelemetry/sdk-logs'; -import { BatchSpanProcessor, SimpleSpanProcessor, ConsoleSpanExporter, type Sampler, SamplingDecision, ParentBasedSampler, AlwaysOnSampler } from '@opentelemetry/sdk-trace-node'; -import { PeriodicExportingMetricReader, ConsoleMetricExporter } from '@opentelemetry/sdk-metrics'; -import { HttpInstrumentation } from '@opentelemetry/instrumentation-http'; +import azureOtel from '@azure/functions-opentelemetry-instrumentation'; +import { AzureMonitorLogExporter, AzureMonitorMetricExporter, AzureMonitorTraceExporter } from '@azure/monitor-opentelemetry-exporter'; +import type { Attributes, Context, Link, SpanKind } from '@opentelemetry/api'; import { DataloaderInstrumentation } from '@opentelemetry/instrumentation-dataloader'; import { GraphQLInstrumentation } from '@opentelemetry/instrumentation-graphql'; -import azureOtel from '@azure/functions-opentelemetry-instrumentation'; +import { HttpInstrumentation } from '@opentelemetry/instrumentation-http'; import { MongooseInstrumentation } from '@opentelemetry/instrumentation-mongoose'; - +import { BatchLogRecordProcessor, ConsoleLogRecordExporter, SimpleLogRecordProcessor } from '@opentelemetry/sdk-logs'; +import { ConsoleMetricExporter, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'; +import type { NodeSDKConfiguration } from '@opentelemetry/sdk-node'; +import { AlwaysOnSampler, BatchSpanProcessor, ConsoleSpanExporter, ParentBasedSampler, type Sampler, SamplingDecision, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-node'; import { httpInstrumentationConfig } from './http-config.ts'; -import type { Attributes, Context, Link, SpanKind } from '@opentelemetry/api'; + const { AzureFunctionsInstrumentation } = azureOtel; //Need to use destructuring to access AzureFunctionsInstrumentation (CommonJS module) interface Exporters { @@ -56,7 +56,7 @@ export class OtelBuilder { if (useSimpleProcessors) { return { spanProcessors: [new SimpleSpanProcessor(exporters.traceExporter)], - logRecordProcessors: [new SimpleLogRecordProcessor(exporters.logExporter)], + logRecordProcessors: [new SimpleLogRecordProcessor({ exporter: exporters.logExporter })], }; } else { const EXPORT_TIMEOUT_MILLIS = 15000; @@ -69,7 +69,8 @@ export class OtelBuilder { }), ], logRecordProcessors: [ - new BatchLogRecordProcessor(exporters.logExporter, { + new BatchLogRecordProcessor({ + exporter: exporters.logExporter, exportTimeoutMillis: EXPORT_TIMEOUT_MILLIS, maxQueueSize: MAX_QUEUE_SIZE, }), diff --git a/packages/ocom/ui-staff-route-tech-admin/package.json b/packages/ocom/ui-staff-route-tech-admin/package.json index a1622d8fb..2d2c7c149 100644 --- a/packages/ocom/ui-staff-route-tech-admin/package.json +++ b/packages/ocom/ui-staff-route-tech-admin/package.json @@ -15,6 +15,7 @@ }, "dependencies": { "@ant-design/icons": "catalog:", + "@graphql-typed-document-node/core": "^3.2.0", "@ocom/ui-staff-shared": "workspace:*", "react": "catalog:", "react-dom": "catalog:", @@ -26,8 +27,8 @@ "@types/react": "^19.1.11", "@types/react-dom": "^19.1.6", "jsdom": "catalog:", + "typescript": "catalog:", "vite": "catalog:", - "vitest": "catalog:", - "typescript": "catalog:" + "vitest": "catalog:" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6299108cb..383eca599 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -148,7 +148,7 @@ overrides: svgo: ^3.3.4 yaml@2.8.2: 2.8.3 yauzl@3.2.0: 3.2.1 - qs: 6.15.2 + qs: 6.16.0 uuid@11.1.0: 11.1.1 express@4.22.1: 4.22.2 ajv@^6: 6.14.0 @@ -179,7 +179,7 @@ overrides: '@opentelemetry/exporter-prometheus@0.57.2': 0.217.0 '@opentelemetry/core@2.7.1': 2.8.0 '@opentelemetry/propagator-jaeger': 2.9.0 - ws: 8.21.0 + ws: 8.21.1 shell-quote: 1.9.0 '@grpc/grpc-js': '>=1.14.4' form-data: ^4.0.6 @@ -285,7 +285,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) apps/api: dependencies: @@ -358,7 +358,7 @@ importers: version: link:../../packages/ocom/local-dev-config '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) archunit: specifier: 'catalog:' version: 2.1.63 @@ -376,19 +376,19 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) apps/docs: dependencies: '@docusaurus/core': specifier: ^3.10.1 - version: 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + version: 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) '@docusaurus/plugin-content-docs': specifier: ^3.10.1 - version: 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + version: 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) '@docusaurus/preset-classic': specifier: ^3.10.1 - version: 3.10.1(@algolia/client-search@5.45.0)(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@6.0.3) + version: 3.10.1(@algolia/client-search@5.45.0)(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@6.0.3) '@mdx-js/react': specifier: ^3.0.0 version: 3.1.1(@types/react@19.2.7)(react@19.2.0) @@ -416,13 +416,13 @@ importers: version: link:../../packages/cellix/local-dev '@docusaurus/module-type-aliases': specifier: ^3.10.1 - version: 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 3.10.1(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/tsconfig': specifier: ^3.10.1 version: 3.10.1 '@docusaurus/types': specifier: ^3.10.1 - version: 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@testing-library/jest-dom': specifier: ^6.6.3 version: 6.9.1 @@ -437,10 +437,10 @@ importers: version: 19.2.3(@types/react@19.2.7) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 6.0.1(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) jsdom: specifier: ^26.1.0 version: 26.1.0 @@ -449,7 +449,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) apps/server-mongodb-memory-mock: dependencies: @@ -505,7 +505,7 @@ importers: version: link:../../packages/cellix/local-dev '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -514,13 +514,13 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) apps/ui-community: dependencies: '@apollo/client': specifier: ^3.13.9 - version: 3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.0))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.1))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@cellix/ui-core': specifier: workspace:* version: link:../../packages/cellix/ui-core @@ -550,7 +550,7 @@ importers: version: 6.3.5(luxon@3.7.2)(moment@2.30.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) apollo-link-rest: specifier: ^0.9.0 - version: 0.9.0(@apollo/client@3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.0))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(graphql@16.12.0)(qs@6.15.2) + version: 0.9.0(@apollo/client@3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.1))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(graphql@16.12.0)(qs@6.16.0) less: specifier: ^4.4.0 version: 4.4.2 @@ -578,25 +578,25 @@ importers: version: link:../../packages/cellix/local-dev '@chromatic-com/storybook': specifier: ^5.2.1 - version: 5.2.1(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + version: 5.2.1(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8)) '@storybook/addon-a11y': specifier: 'catalog:' - version: 10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + version: 10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8)) '@storybook/addon-docs': specifier: 'catalog:' - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) '@storybook/addon-onboarding': specifier: 'catalog:' - version: 10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + version: 10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8)) '@storybook/addon-vitest': specifier: 'catalog:' - version: 10.4.2(@vitest/browser-playwright@4.1.10)(@vitest/browser@4.1.10(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10))(@vitest/runner@4.1.10)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vitest@4.1.10) + version: 10.4.2(@vitest/browser-playwright@4.1.10)(@vitest/browser@4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10))(@vitest/runner@4.1.10)(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vitest@4.1.10) '@storybook/react': specifier: 10.4.2 - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@6.0.3) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(typescript@6.0.3) '@storybook/react-vite': specifier: 'catalog:' - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@6.0.3)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(typescript@6.0.3)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) '@types/react': specifier: ^19.1.8 version: 19.2.7 @@ -605,10 +605,10 @@ importers: version: 19.2.3(@types/react@19.2.7) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 6.0.1(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) esbuild: specifier: 0.28.1 version: 0.28.1 @@ -620,10 +620,10 @@ importers: version: 6.0.5(rolldown@1.0.3) storybook: specifier: 'catalog:' - version: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8) storybook-addon-apollo-client: specifier: ^9.0.0 - version: 9.0.0(@apollo/client@3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.0))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(graphql@16.12.0)(react@19.2.8) + version: 9.0.0(@apollo/client@3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.1))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(graphql@16.12.0)(react@19.2.8) tailwindcss: specifier: ^3.4.17 version: 3.4.18(tsx@4.21.0)(yaml@2.8.3) @@ -632,19 +632,19 @@ importers: version: 6.0.3 vite: specifier: 8.0.16 - version: 8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) + version: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3) vite-plugin-node-polyfills: specifier: 'catalog:' - version: 0.28.0(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 0.28.0(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) apps/ui-staff: dependencies: '@apollo/client': specifier: ^3.13.9 - version: 3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.0))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.1))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@cellix/ui-core': specifier: workspace:* version: link:../../packages/cellix/ui-core @@ -683,7 +683,7 @@ importers: version: 6.3.5(luxon@3.7.2)(moment@2.30.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) apollo-link-rest: specifier: ^0.9.0 - version: 0.9.0(@apollo/client@3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.0))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(graphql@16.12.0)(qs@6.15.2) + version: 0.9.0(@apollo/client@3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.1))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(graphql@16.12.0)(qs@6.16.0) less: specifier: ^4.4.0 version: 4.4.2 @@ -717,10 +717,10 @@ importers: version: 19.2.3(@types/react@19.2.7) '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.1(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 6.0.1(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) esbuild: specifier: 0.28.1 version: 0.28.1 @@ -738,13 +738,13 @@ importers: version: 6.0.3 vite: specifier: 8.0.16 - version: 8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) + version: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3) vite-plugin-node-polyfills: specifier: 'catalog:' - version: 0.28.0(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 0.28.0(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/cellix/api-services-spec: devDependencies: @@ -780,7 +780,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/cellix/config-rolldown: devDependencies: @@ -792,19 +792,19 @@ importers: version: link:../config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 rolldown: specifier: 1.0.0-beta.55 - version: 1.0.0-beta.55(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + version: 1.0.0-beta.55(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) typescript: specifier: 'catalog:' version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/cellix/config-typescript: {} @@ -815,16 +815,16 @@ importers: version: link:../config-typescript '@storybook/addon-vitest': specifier: 'catalog:' - version: 10.4.2(@vitest/browser-playwright@4.1.10)(@vitest/browser@4.1.10(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10))(@vitest/runner@4.1.10)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vitest@4.1.10) + version: 10.4.2(@vitest/browser-playwright@4.1.10)(@vitest/browser@4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10))(@vitest/runner@4.1.10)(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vitest@4.1.10) '@vitest/browser-playwright': specifier: 4.1.10 - version: 4.1.10(playwright@1.59.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10) + version: 4.1.10(playwright@1.59.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10) typescript: specifier: 'catalog:' version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/cellix/domain-seedwork: devDependencies: @@ -836,7 +836,7 @@ importers: version: link:../config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -845,7 +845,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/cellix/event-bus-seedwork-node: dependencies: @@ -864,7 +864,7 @@ importers: version: link:../config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -904,7 +904,7 @@ importers: version: link:../config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -913,7 +913,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/cellix/graphql-core: dependencies: @@ -932,7 +932,7 @@ importers: version: link:../config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -941,7 +941,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/cellix/local-dev: devDependencies: @@ -956,7 +956,7 @@ importers: version: 22.19.15 '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -965,7 +965,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/cellix/mongoose-seedwork: dependencies: @@ -984,7 +984,7 @@ importers: version: link:../config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) mongodb: specifier: 'catalog:' version: 6.18.0 @@ -1002,7 +1002,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/cellix/serenity-framework: dependencies: @@ -1057,7 +1057,7 @@ importers: version: 19.2.7 '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) playwright: specifier: 1.59.0 version: 1.59.0 @@ -1072,7 +1072,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/cellix/server-mongodb-memory-mock-seedwork: dependencies: @@ -1122,7 +1122,7 @@ importers: version: 5.0.5 '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -1131,7 +1131,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/cellix/service-blob-storage: dependencies: @@ -1153,7 +1153,7 @@ importers: version: link:../config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -1162,7 +1162,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/cellix/service-queue-storage: dependencies: @@ -1196,7 +1196,7 @@ importers: version: link:../config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) execa: specifier: ^9.6.0 version: 9.6.1 @@ -1208,7 +1208,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/cellix/ui-core: dependencies: @@ -1224,25 +1224,25 @@ importers: version: link:../config-vitest '@chromatic-com/storybook': specifier: ^5.2.1 - version: 5.2.1(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + version: 5.2.1(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8)) '@storybook/addon-a11y': specifier: 'catalog:' - version: 10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + version: 10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8)) '@storybook/addon-docs': specifier: 'catalog:' - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) '@storybook/addon-onboarding': specifier: 'catalog:' - version: 10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + version: 10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8)) '@storybook/addon-vitest': specifier: 'catalog:' - version: 10.4.2(@vitest/browser-playwright@4.1.10)(@vitest/browser@4.1.10(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10))(@vitest/runner@4.1.10)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vitest@4.1.10) + version: 10.4.2(@vitest/browser-playwright@4.1.10)(@vitest/browser@4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10))(@vitest/runner@4.1.10)(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vitest@4.1.10) '@storybook/react': specifier: 10.4.2 - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@6.0.3) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(typescript@6.0.3) '@storybook/react-vite': specifier: 'catalog:' - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@6.0.3)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(typescript@6.0.3)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) '@testing-library/react': specifier: ^16.2.0 version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -1254,13 +1254,13 @@ importers: version: 19.2.3(@types/react@19.2.7) '@vitest/browser': specifier: 4.1.10 - version: 4.1.10(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10) + version: 4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10) '@vitest/browser-playwright': specifier: 4.1.10 - version: 4.1.10(playwright@1.59.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10) + version: 4.1.10(playwright@1.59.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10) '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) jsdom: specifier: 'catalog:' version: 26.1.0 @@ -1281,13 +1281,13 @@ importers: version: 6.0.1 storybook: specifier: 'catalog:' - version: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8) typescript: specifier: 'catalog:' version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ocom-verification/acceptance-api: dependencies: @@ -1343,6 +1343,9 @@ importers: '@ocom/data-sources-mongoose-models': specifier: workspace:* version: link:../../ocom/data-sources-mongoose-models + '@ocom/event-handler': + specifier: workspace:* + version: link:../../ocom/event-handler '@ocom/graphql': specifier: workspace:* version: link:../../ocom/graphql @@ -1387,7 +1390,7 @@ importers: dependencies: '@apollo/client': specifier: ^3.13.9 - version: 3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.0))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.1))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@cellix/serenity-framework': specifier: workspace:* version: link:../../cellix/serenity-framework @@ -1478,7 +1481,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ocom-verification/e2e-tests: dependencies: @@ -1592,7 +1595,7 @@ importers: version: link:../../ocom-verification/archunit-tests '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -1601,7 +1604,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ocom/context-spec: dependencies: @@ -1660,7 +1663,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ocom/domain: dependencies: @@ -1712,7 +1715,7 @@ importers: version: 3.43.0 '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -1721,7 +1724,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ocom/event-handler: dependencies: @@ -1774,7 +1777,7 @@ importers: version: link:../../ocom-verification/archunit-tests '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -1783,7 +1786,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ocom/graphql-handler: dependencies: @@ -1817,7 +1820,7 @@ importers: version: link:../../cellix/config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -1826,7 +1829,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ocom/local-dev-config: dependencies: @@ -1845,7 +1848,7 @@ importers: version: 22.19.15 '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -1854,7 +1857,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ocom/persistence: dependencies: @@ -1894,7 +1897,7 @@ importers: version: link:../../ocom-verification/archunit-tests '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -1903,7 +1906,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ocom/rest: dependencies: @@ -1956,7 +1959,7 @@ importers: version: 1.1.6 '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -1965,7 +1968,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ocom/service-blob-storage: dependencies: @@ -1981,7 +1984,7 @@ importers: version: link:../../cellix/config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -1990,7 +1993,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ocom/service-mongoose: dependencies: @@ -2012,7 +2015,7 @@ importers: version: link:../../cellix/config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -2026,8 +2029,8 @@ importers: specifier: 0.1.0 version: 0.1.0(@opentelemetry/api@1.9.0) '@azure/monitor-opentelemetry-exporter': - specifier: 1.0.0-beta.31 - version: 1.0.0-beta.31 + specifier: 1.0.0-beta.43 + version: 1.0.0-beta.43 '@cellix/api-services-spec': specifier: workspace:* version: link:../../cellix/api-services-spec @@ -2041,23 +2044,26 @@ importers: specifier: 0.48.0 version: 0.48.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-http': - specifier: 0.52.1 - version: 0.52.1(@opentelemetry/api@1.9.0) + specifier: 0.220.0 + version: 0.220.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-mongoose': specifier: 0.47.0 version: 0.47.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': + specifier: 2.9.0 + version: 2.9.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-logs': - specifier: 0.57.2 - version: 0.57.2(@opentelemetry/api@1.9.0) + specifier: 0.220.0 + version: 0.220.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-metrics': - specifier: 1.30.1 - version: 1.30.1(@opentelemetry/api@1.9.0) + specifier: 2.9.0 + version: 2.9.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-node': - specifier: 0.57.2 - version: 0.57.2(@opentelemetry/api@1.9.0) + specifier: 0.220.0 + version: 0.220.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-node': - specifier: 1.30.1 - version: 1.30.1(@opentelemetry/api@1.9.0) + specifier: 2.9.0 + version: 2.9.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': specifier: 1.28.0 version: 1.28.0 @@ -2070,7 +2076,7 @@ importers: version: link:../../cellix/config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -2079,7 +2085,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ocom/service-queue-storage: dependencies: @@ -2095,7 +2101,7 @@ importers: version: link:../../cellix/config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -2104,7 +2110,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ocom/service-token-validation: dependencies: @@ -2123,7 +2129,7 @@ importers: version: link:../../cellix/config-vitest '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) rimraf: specifier: 'catalog:' version: 6.0.1 @@ -2132,7 +2138,7 @@ importers: version: 6.0.3 vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ocom/ui-community-route-accounts: dependencies: @@ -2144,7 +2150,7 @@ importers: version: 7.22.7(antd@6.3.5(luxon@3.7.2)(moment@2.30.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@apollo/client': specifier: ^3.13.9 - version: 3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.0))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.1))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@cellix/ui-core': specifier: workspace:* version: link:../../cellix/ui-core @@ -2187,25 +2193,25 @@ importers: version: link:../../cellix/config-vitest '@chromatic-com/storybook': specifier: ^5.2.1 - version: 5.2.1(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + version: 5.2.1(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8)) '@ocom-verification/archunit-tests': specifier: workspace:* version: link:../../ocom-verification/archunit-tests '@storybook/addon-a11y': specifier: 'catalog:' - version: 10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + version: 10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8)) '@storybook/addon-docs': specifier: 'catalog:' - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) '@storybook/addon-vitest': specifier: 'catalog:' - version: 10.4.2(@vitest/browser-playwright@4.1.10)(@vitest/browser@4.1.10(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10))(@vitest/runner@4.1.10)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vitest@4.1.10) + version: 10.4.2(@vitest/browser-playwright@4.1.10)(@vitest/browser@4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10))(@vitest/runner@4.1.10)(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vitest@4.1.10) '@storybook/react': specifier: 10.4.2 - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@6.0.3) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(typescript@6.0.3) '@storybook/react-vite': specifier: 'catalog:' - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@6.0.3)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(typescript@6.0.3)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) '@types/react': specifier: ^19.1.11 version: 19.2.7 @@ -2217,16 +2223,16 @@ importers: version: 26.1.0 storybook: specifier: 'catalog:' - version: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8) typescript: specifier: 'catalog:' version: 6.0.3 vite: specifier: 8.0.16 - version: 8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) + version: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3) vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ocom/ui-community-route-admin: dependencies: @@ -2238,7 +2244,7 @@ importers: version: 7.22.7(antd@6.3.5(luxon@3.7.2)(moment@2.30.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@apollo/client': specifier: ^3.13.9 - version: 3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.0))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.1))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@cellix/ui-core': specifier: workspace:* version: link:../../cellix/ui-core @@ -2281,25 +2287,25 @@ importers: version: link:../../cellix/config-vitest '@chromatic-com/storybook': specifier: ^5.2.1 - version: 5.2.1(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + version: 5.2.1(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8)) '@ocom-verification/archunit-tests': specifier: workspace:* version: link:../../ocom-verification/archunit-tests '@storybook/addon-a11y': specifier: 'catalog:' - version: 10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + version: 10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8)) '@storybook/addon-docs': specifier: 'catalog:' - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) '@storybook/addon-vitest': specifier: 'catalog:' - version: 10.4.2(@vitest/browser-playwright@4.1.10)(@vitest/browser@4.1.10(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10))(@vitest/runner@4.1.10)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vitest@4.1.10) + version: 10.4.2(@vitest/browser-playwright@4.1.10)(@vitest/browser@4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10))(@vitest/runner@4.1.10)(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vitest@4.1.10) '@storybook/react': specifier: ^10.4.2 - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@6.0.3) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(typescript@6.0.3) '@storybook/react-vite': specifier: 'catalog:' - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@6.0.3)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(typescript@6.0.3)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) '@types/react': specifier: ^19.1.11 version: 19.2.7 @@ -2311,16 +2317,16 @@ importers: version: 26.1.0 storybook: specifier: 'catalog:' - version: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8) typescript: specifier: 'catalog:' version: 6.0.3 vite: specifier: 8.0.16 - version: 8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) + version: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3) vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ocom/ui-community-route-root: dependencies: @@ -2351,25 +2357,25 @@ importers: version: link:../../cellix/config-vitest '@chromatic-com/storybook': specifier: ^5.2.1 - version: 5.2.1(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + version: 5.2.1(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8)) '@ocom-verification/archunit-tests': specifier: workspace:* version: link:../../ocom-verification/archunit-tests '@storybook/addon-a11y': specifier: 'catalog:' - version: 10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + version: 10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8)) '@storybook/addon-docs': specifier: 'catalog:' - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) '@storybook/addon-vitest': specifier: 'catalog:' - version: 10.4.2(@vitest/browser-playwright@4.1.10)(@vitest/browser@4.1.10(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10))(@vitest/runner@4.1.10)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vitest@4.1.10) + version: 10.4.2(@vitest/browser-playwright@4.1.10)(@vitest/browser@4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10))(@vitest/runner@4.1.10)(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vitest@4.1.10) '@storybook/react': specifier: 'catalog:' - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@6.0.3) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(typescript@6.0.3) '@storybook/react-vite': specifier: 'catalog:' - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@6.0.3)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(typescript@6.0.3)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) '@types/react': specifier: ^19.1.11 version: 19.2.7 @@ -2381,22 +2387,22 @@ importers: version: 26.1.0 storybook: specifier: 'catalog:' - version: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8) typescript: specifier: 'catalog:' version: 6.0.3 vite: specifier: 8.0.16 - version: 8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) + version: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3) vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ocom/ui-community-shared: dependencies: '@apollo/client': specifier: ^3.13.9 - version: 3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.0))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.1))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@cellix/ui-core': specifier: workspace:* version: link:../../cellix/ui-core @@ -2433,22 +2439,22 @@ importers: version: link:../../cellix/config-vitest '@chromatic-com/storybook': specifier: ^5.2.1 - version: 5.2.1(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + version: 5.2.1(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8)) '@storybook/addon-a11y': specifier: 'catalog:' - version: 10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + version: 10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8)) '@storybook/addon-docs': specifier: 'catalog:' - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) '@storybook/addon-vitest': specifier: 'catalog:' - version: 10.4.2(@vitest/browser-playwright@4.1.10)(@vitest/browser@4.1.10(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10))(@vitest/runner@4.1.10)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vitest@4.1.10) + version: 10.4.2(@vitest/browser-playwright@4.1.10)(@vitest/browser@4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10))(@vitest/runner@4.1.10)(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vitest@4.1.10) '@storybook/react': specifier: 'catalog:' - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@6.0.3) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(typescript@6.0.3) '@storybook/react-vite': specifier: 'catalog:' - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@6.0.3)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(typescript@6.0.3)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) '@types/react': specifier: ^19.1.11 version: 19.2.7 @@ -2460,16 +2466,16 @@ importers: version: 26.1.0 storybook: specifier: 'catalog:' - version: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8) typescript: specifier: 'catalog:' version: 6.0.3 vite: specifier: 8.0.16 - version: 8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) + version: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3) vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ocom/ui-shared: dependencies: @@ -2478,7 +2484,7 @@ importers: version: 6.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@apollo/client': specifier: ^3.13.9 - version: 3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.0))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.1))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@cellix/ui-core': specifier: workspace:* version: link:../../cellix/ui-core @@ -2515,25 +2521,25 @@ importers: version: link:../../cellix/config-vitest '@chromatic-com/storybook': specifier: ^5.2.1 - version: 5.2.1(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + version: 5.2.1(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8)) '@ocom-verification/archunit-tests': specifier: workspace:* version: link:../../ocom-verification/archunit-tests '@storybook/addon-a11y': specifier: 'catalog:' - version: 10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + version: 10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8)) '@storybook/addon-docs': specifier: 'catalog:' - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) '@storybook/addon-vitest': specifier: 'catalog:' - version: 10.4.2(@vitest/browser-playwright@4.1.10)(@vitest/browser@4.1.10(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10))(@vitest/runner@4.1.10)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vitest@4.1.10) + version: 10.4.2(@vitest/browser-playwright@4.1.10)(@vitest/browser@4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10))(@vitest/runner@4.1.10)(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vitest@4.1.10) '@storybook/react': specifier: 'catalog:' - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@6.0.3) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(typescript@6.0.3) '@storybook/react-vite': specifier: 'catalog:' - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@6.0.3)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(typescript@6.0.3)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) '@types/react': specifier: ^19.1.11 version: 19.2.7 @@ -2542,10 +2548,10 @@ importers: version: 19.2.3(@types/react@19.2.7) '@vitest/browser': specifier: 4.1.10 - version: 4.1.10(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10) + version: 4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10) '@vitest/coverage-istanbul': specifier: 'catalog:' - version: 4.1.10(vitest@4.1.10) + version: 4.1.10(supports-color@8.1.1)(vitest@4.1.10) jsdom: specifier: 'catalog:' version: 26.1.0 @@ -2554,19 +2560,19 @@ importers: version: 6.0.1 storybook: specifier: 'catalog:' - version: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8) storybook-addon-apollo-client: specifier: ^9.0.0 - version: 9.0.0(@apollo/client@3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.0))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(graphql@16.12.0)(react@19.2.8) + version: 9.0.0(@apollo/client@3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.1))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(graphql@16.12.0)(react@19.2.8) typescript: specifier: 'catalog:' version: 6.0.3 vite: specifier: 8.0.16 - version: 8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) + version: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3) vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ocom/ui-staff-route-community-management: dependencies: @@ -2606,10 +2612,10 @@ importers: version: 6.0.3 vite: specifier: 8.0.16 - version: 8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) + version: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3) vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ocom/ui-staff-route-finance: dependencies: @@ -2649,10 +2655,10 @@ importers: version: 6.0.3 vite: specifier: 8.0.16 - version: 8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) + version: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3) vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ocom/ui-staff-route-root: dependencies: @@ -2692,16 +2698,19 @@ importers: version: 6.0.3 vite: specifier: 8.0.16 - version: 8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) + version: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3) vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ocom/ui-staff-route-tech-admin: dependencies: '@ant-design/icons': specifier: 'catalog:' version: 6.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@graphql-typed-document-node/core': + specifier: ^3.2.0 + version: 3.2.0(graphql@16.12.0) '@ocom/ui-staff-shared': specifier: workspace:* version: link:../ui-staff-shared @@ -2735,10 +2744,10 @@ importers: version: 6.0.3 vite: specifier: 8.0.16 - version: 8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) + version: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3) vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ocom/ui-staff-route-user-management: dependencies: @@ -2747,7 +2756,7 @@ importers: version: 6.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@apollo/client': specifier: ^3.13.9 - version: 3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.0))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.1))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@graphql-typed-document-node/core': specifier: ^3.2.0 version: 3.2.0(graphql@16.12.0) @@ -2775,22 +2784,22 @@ importers: version: link:../../cellix/config-vitest '@chromatic-com/storybook': specifier: ^5.2.1 - version: 5.2.1(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + version: 5.2.1(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8)) '@storybook/addon-a11y': specifier: 'catalog:' - version: 10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + version: 10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8)) '@storybook/addon-docs': specifier: 'catalog:' - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) '@storybook/addon-vitest': specifier: 'catalog:' - version: 10.4.2(@vitest/browser-playwright@4.1.10)(@vitest/browser@4.1.10(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10))(@vitest/runner@4.1.10)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vitest@4.1.10) + version: 10.4.2(@vitest/browser-playwright@4.1.10)(@vitest/browser@4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10))(@vitest/runner@4.1.10)(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vitest@4.1.10) '@storybook/react': specifier: 'catalog:' - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@6.0.3) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(typescript@6.0.3) '@storybook/react-vite': specifier: 'catalog:' - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@6.0.3)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(typescript@6.0.3)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) '@types/react': specifier: ^19.1.11 version: 19.2.7 @@ -2802,16 +2811,16 @@ importers: version: 26.1.0 storybook: specifier: 'catalog:' - version: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8) typescript: specifier: 'catalog:' version: 6.0.3 vite: specifier: 8.0.16 - version: 8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) + version: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3) vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ocom/ui-staff-shared: dependencies: @@ -2820,7 +2829,7 @@ importers: version: 6.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@apollo/client': specifier: ^3.13.9 - version: 3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.0))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.1))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@cellix/ui-core': specifier: workspace:* version: link:../../cellix/ui-core @@ -2851,7 +2860,7 @@ importers: version: link:../../cellix/config-vitest '@storybook/react': specifier: 'catalog:' - version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@6.0.3) + version: 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(typescript@6.0.3) '@types/react': specifier: ^19.1.11 version: 19.2.7 @@ -2863,16 +2872,16 @@ importers: version: 26.1.0 storybook: specifier: 'catalog:' - version: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8) typescript: specifier: 'catalog:' version: 6.0.3 vite: specifier: 8.0.16 - version: 8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) + version: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3) vitest: specifier: 'catalog:' - version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) packages: @@ -3183,6 +3192,10 @@ packages: resolution: {integrity: sha512-EHaOXW0RYDKS5CFffnixdyRPak5ytiCtU7uXDcP/uiY+A6jFRwNGzzJBiznkCzvi5EYpY+YWinieqHb0oY916A==} engines: {node: '>=20.0.0'} + '@azure-rest/core-client@2.8.0': + resolution: {integrity: sha512-F1ybHeN+++QhyFCF/ehLUEvrOB6fehPdFBFtGdj0C3B2lpQ9zkPiO5JDgsqc6IfjuUe6b3dAbXK0a7+VgSGfhw==} + engines: {node: '>=22.0.0'} + '@azure/abort-controller@1.1.0': resolution: {integrity: sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==} engines: {node: '>=12.0.0'} @@ -3273,9 +3286,9 @@ packages: resolution: {integrity: sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==} engines: {node: '>=20.0.0'} - '@azure/monitor-opentelemetry-exporter@1.0.0-beta.31': - resolution: {integrity: sha512-fH/vFMWOHwN/qdJ1SxVtsJ9zWIGWJdy/tZiVVPsFbpbR4NT49J5Im72iCcTyvABRPfIkMz/zsD58Yilf0yiEZw==} - engines: {node: '>=18.0.0'} + '@azure/monitor-opentelemetry-exporter@1.0.0-beta.43': + resolution: {integrity: sha512-551lMY6gSf7TO+j15nmQ23+nG9fExb664TH9RDs9zUul1xHt3NUtfsZe90nNhOzMEeg+I1f7zn955dvH5o6yjA==} + engines: {node: '>=22.0.0'} '@azure/ms-rest-js@1.11.2': resolution: {integrity: sha512-2AyQ1IKmLGKW7DU3/x3TsTBzZLcbC9YRI+yuDPuXAQrv3zar340K9wsxU413kHFIDjkWNCo9T0w5VtwcyWxhbQ==} @@ -3313,10 +3326,6 @@ packages: resolution: {integrity: sha512-DBgNv10aCSxopt92DkTDD0o9xScXeBqPKGmR50FPZQaEcH4JLQ+GEOGEDv19V5BMkB7kxr+m4h6il/cCDPvmHg==} engines: {node: '>=20.0.0'} - '@azure/storage-common@12.3.0': - resolution: {integrity: sha512-/OFHhy86aG5Pe8dP5tsp+BuJ25JOAl9yaMU3WZbkeoiFMHFtJ7tu5ili7qEdBXNW9G5lDB19trwyI6V49F/8iQ==} - engines: {node: '>=20.0.0'} - '@azure/storage-common@12.4.1': resolution: {integrity: sha512-t14unw/WofGDUi7TKJrsyXyPsN+NLgRm7hMaq0llxNmTIzt7f257+6LE6FKIJPh88zLj6M7LPvzve0fEYg/L3A==} engines: {node: '>=20.0.0'} @@ -3924,6 +3933,10 @@ packages: resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} + engines: {node: '>=6.9.0'} + '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} @@ -4637,18 +4650,27 @@ packages: '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@emnapi/core@1.11.2': + resolution: {integrity: sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==} + '@emnapi/core@1.9.2': resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.11.2': + resolution: {integrity: sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==} + '@emnapi/runtime@1.9.2': resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + '@emotion/hash@0.8.0': resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} @@ -5249,11 +5271,12 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 - '@napi-rs/wasm-runtime@1.1.4': - resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + '@napi-rs/wasm-runtime@1.2.0': + resolution: {integrity: sha512-kDoONqMa+VnZ4vvvu/ZUurpJ4gkZU57e7g69qpNgWhYcZFPUHZM2CEMKm+cG6ufDVALbjMvfmMjFVqaK7uEMnA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} peerDependencies: - '@emnapi/core': ^1.7.1 - '@emnapi/runtime': ^1.7.1 + '@emnapi/core': ^2.0.0-alpha.3 + '@emnapi/runtime': ^2.0.0-alpha.3 '@neoconfetti/react@1.0.0': resolution: {integrity: sha512-klcSooChXXOzIm+SE5IISIAn3bYzYfPjbX7D7HoqZL84oAfgREeSg5vSIaSFH+DaGzzvImTyWe1OyrJ67vik4A==} @@ -5285,6 +5308,14 @@ packages: resolution: {integrity: sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q==} engines: {node: '>=8.0.0'} + '@opentelemetry/api-logs@0.219.0': + resolution: {integrity: sha512-FFx7YnaYJlIjqWW/AG/yAZ0L/NEY724PipXXXQLdtZPbLwBGbUMTGL1i/esI56TWfTUXxhLfpgrnWJCG8aUJyg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api-logs@0.220.0': + resolution: {integrity: sha512-CmVa4ImJ+ynfrPMNaAXHET6Bhb44SwzmfyVJFq9ni2jgXJR/l7C6gfVFddNmHP+ZOkP9cf4f9DBe68qVLTHc9w==} + engines: {node: '>=8.0.0'} + '@opentelemetry/api-logs@0.52.1': resolution: {integrity: sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==} engines: {node: '>=14'} @@ -5297,15 +5328,15 @@ packages: resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} - '@opentelemetry/context-async-hooks@1.30.1': - resolution: {integrity: sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==} - engines: {node: '>=14'} + '@opentelemetry/configuration@0.220.0': + resolution: {integrity: sha512-glfIVKnZevRin8fY/9uES/mhRtMT1lGINLHc9MIo5fTQZXswEEHamJtgjv4MTtzgnhHGC92mIS/0lzAUZMyE0w==} + engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/api': ^1.9.0 - '@opentelemetry/core@1.25.1': - resolution: {integrity: sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==} - engines: {node: '>=14'} + '@opentelemetry/context-async-hooks@2.9.0': + resolution: {integrity: sha512-OQ0vzvbZBiUhjqLnUaoNfYmP8553Crr3aggB4y0ZUi815mZ7idpdJXQmoKdeBKJelYttoBlLSSHubmyw3wvX4w==} + engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' @@ -5315,6 +5346,12 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/core@2.10.0': + resolution: {integrity: sha512-/wNZ8twnEQQA4HoHu22+vcsdru6pWPWxW+7w+FlxT6Id7PE/WIbZmVKkte+PF72e0F2dnImFeHD2syyE1Mw6MQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/core@2.2.0': resolution: {integrity: sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw==} engines: {node: ^18.19.0 || >=20.6.0} @@ -5333,69 +5370,69 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/exporter-logs-otlp-grpc@0.57.2': - resolution: {integrity: sha512-eovEy10n3umjKJl2Ey6TLzikPE+W4cUQ4gCwgGP1RqzTGtgDra0WjIqdy29ohiUKfvmbiL3MndZww58xfIvyFw==} - engines: {node: '>=14'} + '@opentelemetry/exporter-logs-otlp-grpc@0.220.0': + resolution: {integrity: sha512-s0sRPCSlXYqlgObOpCftomJllp3LfUL9FobQ5csg2172ydVhSEnu1ptpsVBJadazs5nUNp7vDuLE03FAFWTLOQ==} + engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-logs-otlp-http@0.57.2': - resolution: {integrity: sha512-0rygmvLcehBRp56NQVLSleJ5ITTduq/QfU7obOkyWgPpFHulwpw2LYTqNIz5TczKZuy5YY+5D3SDnXZL1tXImg==} - engines: {node: '>=14'} + '@opentelemetry/exporter-logs-otlp-http@0.220.0': + resolution: {integrity: sha512-8186thl+pTw64iz/qEEen5oJZoZ/gO73XruChdaGlYdWOdBIQ42r+vHLf6a7vIDqTD4b8ZOoMlyxptanECaI9A==} + engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-logs-otlp-proto@0.57.2': - resolution: {integrity: sha512-ta0ithCin0F8lu9eOf4lEz9YAScecezCHkMMyDkvd9S7AnZNX5ikUmC5EQOQADU+oCcgo/qkQIaKcZvQ0TYKDw==} - engines: {node: '>=14'} + '@opentelemetry/exporter-logs-otlp-proto@0.220.0': + resolution: {integrity: sha512-8LZAxdJ0ENDAFwr4j0oY35mHBltiSzvlhdQAPGiC7p9VnxtuSq4SW1gfBAdW6t6hiQG6OwUl8w7KHaOdJPKHWg==} + engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-metrics-otlp-grpc@0.57.2': - resolution: {integrity: sha512-r70B8yKR41F0EC443b5CGB4rUaOMm99I5N75QQt6sHKxYDzSEc6gm48Diz1CI1biwa5tDPznpylTrywO/pT7qw==} - engines: {node: '>=14'} + '@opentelemetry/exporter-metrics-otlp-grpc@0.220.0': + resolution: {integrity: sha512-U128izvJfX/dW9jRGP0gIfadR1Hg7ft3UEGIeRxLFK70m2BWw6AtNCOnsUygpw2zCgR/ygdWbGpcL6TmhW0ZGw==} + engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-metrics-otlp-http@0.57.2': - resolution: {integrity: sha512-ttb9+4iKw04IMubjm3t0EZsYRNWr3kg44uUuzfo9CaccYlOh8cDooe4QObDUkvx9d5qQUrbEckhrWKfJnKhemA==} - engines: {node: '>=14'} + '@opentelemetry/exporter-metrics-otlp-http@0.220.0': + resolution: {integrity: sha512-Yqt3RBw/bRVncaE9qIIhk4WfjbAQqXuP9FgAaU+IKPndnLEp/cUqZlSC324+bpmduRz7DoTjig8Ub0PeILWXUA==} + engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-metrics-otlp-proto@0.57.2': - resolution: {integrity: sha512-HX068Q2eNs38uf7RIkNN9Hl4Ynl+3lP0++KELkXMCpsCbFO03+0XNNZ1SkwxPlP9jrhQahsMPMkzNXpq3fKsnw==} - engines: {node: '>=14'} + '@opentelemetry/exporter-metrics-otlp-proto@0.220.0': + resolution: {integrity: sha512-lyO+IQBdSvqHN/ZOW/OzrSWemtfD+HgWngn+HBNLhjy0YrCQQTz0OE/kSekH2Pl340dn9DWzhqHdz5Eftr+HLA==} + engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-prometheus@0.217.0': - resolution: {integrity: sha512-U9MCXxJu0sBCh5aEkylYRR4xVIL8D1CW6dGwvYXbfFr0qveSorfD0XJchCAWoW6QfAAIcY/yxjf4Dj8OgkHBPw==} + '@opentelemetry/exporter-prometheus@0.220.0': + resolution: {integrity: sha512-JZD5DL/NBpVd2BHefvYosm3G40UZ/KzExLv5tc0eZe0CtrsHHtcOk3YPUxR2EINmUeBf8+w5UReTV8fFPn95lA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-trace-otlp-grpc@0.57.2': - resolution: {integrity: sha512-gHU1vA3JnHbNxEXg5iysqCWxN9j83d7/epTYBZflqQnTyCC4N7yZXn/dMM+bEmyhQPGjhCkNZLx4vZuChH1PYw==} - engines: {node: '>=14'} + '@opentelemetry/exporter-trace-otlp-grpc@0.220.0': + resolution: {integrity: sha512-bv1xmNhmNwIM6MdUBw4yYuJeVcEViVLk3uD69vOQMwueHBnfyl/u0HnBlB1FNY/Te0UOzJzvcbyR8wN6b+iGbA==} + engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-trace-otlp-http@0.57.2': - resolution: {integrity: sha512-sB/gkSYFu+0w2dVQ0PWY9fAMl172PKMZ/JrHkkW8dmjCL0CYkmXeE+ssqIL/yBUTPOvpLIpenX5T9RwXRBW/3g==} - engines: {node: '>=14'} + '@opentelemetry/exporter-trace-otlp-http@0.220.0': + resolution: {integrity: sha512-/+ExB3lRkf+erv4PnoywyL7RHKITidxtUpUTS55k7OQ0dB42S7gEF1gry7swb9MSm1hYLUhJg4QQh9W8SpwwqA==} + engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-trace-otlp-proto@0.57.2': - resolution: {integrity: sha512-awDdNRMIwDvUtoRYxRhja5QYH6+McBLtoz1q9BeEsskhZcrGmH/V1fWpGx8n+Rc+542e8pJA6y+aullbIzQmlw==} - engines: {node: '>=14'} + '@opentelemetry/exporter-trace-otlp-proto@0.220.0': + resolution: {integrity: sha512-voTAD8XgJxlK7zLkXh8EzMB09zrQr3tyY/BsnDTlDiQU/UdK58MZ63A3mUjdEDrxMjCVmBHU3WQJhRmQe+Dvzg==} + engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/exporter-zipkin@1.30.1': - resolution: {integrity: sha512-6S2QIMJahIquvFaaxmcwpvQQRD/YFaMTNoIxrfPIPOeITN+a8lfEcPDxNxn8JDAaxkg+4EnXhz8upVDYenoQjA==} - engines: {node: '>=14'} + '@opentelemetry/exporter-zipkin@2.9.0': + resolution: {integrity: sha512-RwINoce2BH8T4obT5pMcAla2sWma1YZvYuaktWmTluQ0PkQdvv5D060rWI1+kawX+J2qBRcMbwrZJJNcMJUauQ==} + engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.0.0 @@ -5411,9 +5448,9 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-http@0.52.1': - resolution: {integrity: sha512-dG/aevWhaP+7OLv4BQQSEKMJv8GyeOp3Wxl31NHqE8xo9/fYMfEljiZphUHIfyg4gnZ9swMyWjfOQs5GUQe54Q==} - engines: {node: '>=14'} + '@opentelemetry/instrumentation-http@0.220.0': + resolution: {integrity: sha512-Szt4dO2Boz2CDr38DaSw/lnqwhwKl+IAdgNGEGgSm2Anb+fwPtIAGmIwkhsLLN69QQZQE96JxjMKYY4rlRkYKw==} + engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 @@ -5429,39 +5466,39 @@ packages: peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation@0.52.1': - resolution: {integrity: sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==} - engines: {node: '>=14'} + '@opentelemetry/instrumentation@0.220.0': + resolution: {integrity: sha512-xQx3E2WxP1mDvKzxLxX+CTCtNLa560YJZ3087qYHerl2YmiKpv7AH+dAy7vmx+eVrZ5BwhfWUAVoKOoxCNHcpw==} + engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation@0.57.2': - resolution: {integrity: sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==} + '@opentelemetry/instrumentation@0.52.1': + resolution: {integrity: sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-exporter-base@0.57.2': - resolution: {integrity: sha512-XdxEzL23Urhidyebg5E6jZoaiW5ygP/mRjxLHixogbqwDy2Faduzb5N0o/Oi+XTIJu+iyxXdVORjXax+Qgfxag==} - engines: {node: '>=14'} + '@opentelemetry/otlp-exporter-base@0.220.0': + resolution: {integrity: sha512-CXYo8UD5Mn9YbgebO2EL4wejtA+gxLmLiu6HCk2KH2BR7XhFN6/6p1UlCb23DYCjeYkndevLHuejCCN1yx4+OQ==} + engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-grpc-exporter-base@0.57.2': - resolution: {integrity: sha512-USn173KTWy0saqqRB5yU9xUZ2xdgb1Rdu5IosJnm9aV4hMTuFFRTUsQxbgc24QxpCHeoKzzCSnS/JzdV0oM2iQ==} - engines: {node: '>=14'} + '@opentelemetry/otlp-grpc-exporter-base@0.220.0': + resolution: {integrity: sha512-/eIkBPMBTIvM3x/0mDX4aJeSkYifYClnBPr68PL1h5LV4VQv4+SV6CGrpiZ4fIWDnobVmhTWCm1J/QRdAWUfvA==} + engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-transformer@0.57.2': - resolution: {integrity: sha512-48IIRj49gbQVK52jYsw70+Jv+JbahT8BqT2Th7C4H7RCM9d0gZ5sgNPoMpWldmfjvIsSgiGJtjfk9MeZvjhoig==} - engines: {node: '>=14'} + '@opentelemetry/otlp-transformer@0.220.0': + resolution: {integrity: sha512-lXGrv7KXZ0gNH9SVNUaa6vv6phVYGvJxfXAlMbzbakiXru75f5MZl8Z7oqiMMQD77riVHJCFlQvbZs/VVN2/4A==} + engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/propagator-b3@1.30.1': - resolution: {integrity: sha512-oATwWWDIJzybAZ4pO76ATN5N6FFbOA1otibAVlS8v90B4S1wClnhRUk7K+2CHAwN1JKYuj4jh/lpCEG5BAqFuQ==} - engines: {node: '>=14'} + '@opentelemetry/propagator-b3@2.9.0': + resolution: {integrity: sha512-WrOT1WsOUG+B7hstD2RYoMPIOK76G8E9AQHhMjUvrQaGx/oA7rPWQvvr1Rqv7+yy4R0ZMVwWLC4vW2xnkgWPAQ==} + engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' @@ -5477,39 +5514,51 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/resources@2.10.0': + resolution: {integrity: sha512-q6MMm2zhggzsHVNbabYwut+a6nbuQQe3URUoxaojM/8K1IBfwwPzvxIjNi2/lI1TFe+fMHMW9MWhrtDLEXEnkA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + '@opentelemetry/resources@2.2.0': resolution: {integrity: sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/resources@2.7.1': - resolution: {integrity: sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==} + '@opentelemetry/resources@2.8.0': + resolution: {integrity: sha512-qmXQ27ilDbUK/vGMqwL8D4/rhn76C+sherM4wTbjlfknR8Nvfc/hCxjRJPhkzZzUsPiNg16SA31NxMabwttRjg==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/sdk-logs@0.57.2': - resolution: {integrity: sha512-TXFHJ5c+BKggWbdEQ/inpgIzEmS2BGQowLE9UhsMd7YYlUfBQJ4uax0VF/B5NYigdM/75OoJGhAV3upEhK+3gg==} - engines: {node: '>=14'} + '@opentelemetry/resources@2.9.0': + resolution: {integrity: sha512-jyA5MBLQ+Dkl3+JsZkUoUvL7yHvU64kLsvpXKarWm6347Sl1t1bXFTFykUePNpT5WH5pm9a2Qtt03iIYQhZ1Fg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.219.0': + resolution: {integrity: sha512-s6lTKRakaPClvKoWHRChxnXjDMkM/TQ30ff78jN6EBGf7MI7VzANE5PU3f4z9qDUudWjvZjOLHG0rBnBKYvoXA==} + engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.4.0 <1.10.0' - '@opentelemetry/sdk-metrics@1.30.1': - resolution: {integrity: sha512-q9zcZ0Okl8jRgmy7eNW3Ku1XSgg3sDLa5evHZpCwjspw7E8Is4K/haRPDJrBcX3YSn/Y7gUvFnByNYEKQNbNog==} - engines: {node: '>=14'} + '@opentelemetry/sdk-logs@0.220.0': + resolution: {integrity: sha512-WywcTkQtv2iNmt+6y5Kcd4rzvx9bLVsBa2Nwcmg01IUaBTkTow3W4d9KE5vNBpEDtb9tp21WcRBY/lANRrApYA==} + engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' + '@opentelemetry/api': '>=1.4.0 <1.10.0' - '@opentelemetry/sdk-metrics@2.7.1': - resolution: {integrity: sha512-MpDJdkiFDs3Pm1RHO3KByuZbuBdJEXEAkiC0+yJdsZGVCdf1RpHR6n+LHDcS7ffmfrt5kVCzJSCfm4z2C7v0uQ==} + '@opentelemetry/sdk-metrics@2.9.0': + resolution: {integrity: sha512-Xx8RGS4H5XEBl01WuCreMIpiah9cCXMbSkeuIePPdD2cUpq/vUzYmj8E/MK1OsbOc93FuAD4jfn2WOacKwLn7Q==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.9.0 <1.10.0' - '@opentelemetry/sdk-node@0.57.2': - resolution: {integrity: sha512-8BaeqZyN5sTuPBtAoY+UtKwXBdqyuRKmekN5bFzAO40CgbGzAxfTpiL3PBerT7rhZ7p2nBdq7FaMv/tBQgHE4A==} - engines: {node: '>=14'} + '@opentelemetry/sdk-node@0.220.0': + resolution: {integrity: sha512-wHtGyHhSKHNH3fym33xRu4Ef/HXTFvX8eQ42xdQdEO9LYx9Y2qNyBDJytyqVlvmo6abWZlNYTUthuAGUMYqYnQ==} + engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' @@ -5519,15 +5568,27 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' + '@opentelemetry/sdk-trace-base@2.10.0': + resolution: {integrity: sha512-GuYQQT7QD2EeO8lcZLRQzcbOyhqAzL+6WWTKTU9mSUBYBazkEDl+VrQcXQhbB08OWM9anD1aHleVadzulpOaUQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + '@opentelemetry/sdk-trace-base@2.2.0': resolution: {integrity: sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/sdk-trace-node@1.30.1': - resolution: {integrity: sha512-cBjYOINt1JxXdpw1e5MlHmFRc5fgj4GW/86vsKFxJCJ8AL4PdVtYH41gWwl4qd4uQjqEL1oJVrXkSy5cnduAnQ==} - engines: {node: '>=14'} + '@opentelemetry/sdk-trace-base@2.9.0': + resolution: {integrity: sha512-cp9zmTl62R8PJrpvFcmc8N2JQU/xfa0S+61q511Nji+QxCfZ8Ifvg7H27G8cANe4crg4RTrWsVvanHiXjSp6ag==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@2.9.0': + resolution: {integrity: sha512-ec9a7ps37huy5itYk0MalaZdSLlM6AXWp/FhtEjgMpp5leEGojBDvAl/UWttQnkMZOvFHKzRESn8TD3yKTF5nQ==} + engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' @@ -5537,9 +5598,17 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/semantic-conventions@1.25.1': - resolution: {integrity: sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==} - engines: {node: '>=14'} + '@opentelemetry/sdk-trace@2.10.0': + resolution: {integrity: sha512-MfQGq3GRmTh5fM/y+OjaO0vj6+luCB1XO2gfXCalKCfgKw0eHL++sm75DNweC6ohlp+aFvACqeE0fYayqdRaoQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace@2.9.0': + resolution: {integrity: sha512-sGA19HvtrrSKYsseHphluH6j3p6Xa3fqc7c7y8f/7mYWejc1lyDFcpSdD1kYa50HCLUeEo4zA5bW0pniaPszuw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' '@opentelemetry/semantic-conventions@1.28.0': resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} @@ -5549,6 +5618,10 @@ packages: resolution: {integrity: sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==} engines: {node: '>=14'} + '@opentelemetry/semantic-conventions@1.43.0': + resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} + engines: {node: '>=14'} + '@oxc-parser/binding-android-arm-eabi@0.121.0': resolution: {integrity: sha512-n07FQcySwOlzap424/PLMtOkbS7xOu8nsJduKL8P3COGHKgKoDYXwoAHCbChfgFpHnviehrLWIPX0lKGtbEk/A==} engines: {node: ^20.19.0 || >=22.12.0} @@ -5820,8 +5893,8 @@ packages: cpu: [arm] os: [android] - '@oxc-resolver/binding-android-arm-eabi@11.20.0': - resolution: {integrity: sha512-IjfWOXRgJFNdORDl+Uf1aibNgZY2guOD3zmOhx1BGVb/MIiqlFTdmjpQNplSN58lhWehnX4UNqC3QwpUo8pjJg==} + '@oxc-resolver/binding-android-arm-eabi@11.24.2': + resolution: {integrity: sha512-y09e0L0SRI2OA2tUIrjBgoV3eH5hvUKXNkJqXmNo5V2WxIjyC7I7aJfRLMEVpA8yi95f90gFDvO0VMgrDw+vwA==} cpu: [arm] os: [android] @@ -5830,8 +5903,8 @@ packages: cpu: [arm64] os: [android] - '@oxc-resolver/binding-android-arm64@11.20.0': - resolution: {integrity: sha512-QqslZAuFQG8Q9xm7JuIn8JUbvywhSBMVhuQHtYW+auirZJloS41oxUUaBXk7uUhZJgp44c5zQLeVvmFaDQB+2Q==} + '@oxc-resolver/binding-android-arm64@11.24.2': + resolution: {integrity: sha512-cl4icWaZFnLdg8m6qtnh5rBMuGbxc/ptStFHLeCNwr+2cZjkjNwQu/jYRS0CHlnPecOJMpuS5M6/BH+0J/YkEg==} cpu: [arm64] os: [android] @@ -5840,8 +5913,8 @@ packages: cpu: [arm64] os: [darwin] - '@oxc-resolver/binding-darwin-arm64@11.20.0': - resolution: {integrity: sha512-MUcavykj2ewlR+kc5arpg4tC2RvzJkUxWtNv74pf7lcNk00GpIpN43vXMj+j6r4eMmfZhlb8hueKoIb8e9kAGQ==} + '@oxc-resolver/binding-darwin-arm64@11.24.2': + resolution: {integrity: sha512-At29QEMF6HajbQvgY8K6OXnHD1x9rad74xBEfmCB6ZqCGsdq75aK7tOYcTbOanMy8qdIBrfL3SMr3p/lfSlb9w==} cpu: [arm64] os: [darwin] @@ -5850,8 +5923,8 @@ packages: cpu: [x64] os: [darwin] - '@oxc-resolver/binding-darwin-x64@11.20.0': - resolution: {integrity: sha512-BGB16nRUK5Etiv//ihPyzj8Lj1px0mhh4YIfe0FDf045ywknfSm0GEbiRESpr6Q4K82AvnyaRIhhluHByvS4bg==} + '@oxc-resolver/binding-darwin-x64@11.24.2': + resolution: {integrity: sha512-A5Kqr1EUj4oIL5CF4WRssq/o5P0Y11cwoFouMRmQ7YnC/A8V93nv1nb7aSU8HwcgmXropjLNkVTl4MN87cu28Q==} cpu: [x64] os: [darwin] @@ -5860,8 +5933,8 @@ packages: cpu: [x64] os: [freebsd] - '@oxc-resolver/binding-freebsd-x64@11.20.0': - resolution: {integrity: sha512-JZgtePaqj3qmD5XFHJaSLWzHRxQu0LaPkdoM1KJXYADvAaa83ijXHclV3ej3CueeW0wxfIAbGCZVP45J0CA7uQ==} + '@oxc-resolver/binding-freebsd-x64@11.24.2': + resolution: {integrity: sha512-R5xkRBRRz7ceH/P5Jrc6G7FmdUdgpLYyESFAUDVTNQ9K0sGPxcp4ljiwEwEqsvNcQ4sYbMRrWcHHBCu7ksAJVw==} cpu: [x64] os: [freebsd] @@ -5870,8 +5943,8 @@ packages: cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm-gnueabihf@11.20.0': - resolution: {integrity: sha512-hOQ/p3ry3v3SchUBXicrrnszaI/UmYzM4wtS4RGfwgVUX7a+HbyQSzJ5aOzu+o6XZkFkS3ZXN4PZAzhOb77OSg==} + '@oxc-resolver/binding-linux-arm-gnueabihf@11.24.2': + resolution: {integrity: sha512-k/RuYL4L/R58IBn3wT5ma3Wh4k62bp1eYCFRWCmMsasUOqL+H6sW0VGFadEzKWXFFlz+2uIMoeMk9ySSZJHgbg==} cpu: [arm] os: [linux] @@ -5880,8 +5953,8 @@ packages: cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm-musleabihf@11.20.0': - resolution: {integrity: sha512-2ArPksaw0AqeuGBfoS715VF+JvJQAhD2niWgjE5hVO+L+nAfikVQopvngCMX9x4BD8itWoQ3dnikrQyl5Ho5Jg==} + '@oxc-resolver/binding-linux-arm-musleabihf@11.24.2': + resolution: {integrity: sha512-bnHAak3ujYfH5pKk4NieFNbvYvernfoQDgwLddbZ3OtMYrem87/qjlA+u+aKG0oZcqSLGCful/6/CEA+aeAgaA==} cpu: [arm] os: [linux] @@ -5891,8 +5964,8 @@ packages: os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-arm64-gnu@11.20.0': - resolution: {integrity: sha512-0bJnmYFp62JdZ4nVMDUZ/C58BCZOCcqgKtnUlp7L9Ojf/czIN+3j72YlLPeWLkzlr6SlYvIQA4SGV/HyO0d+qg==} + '@oxc-resolver/binding-linux-arm64-gnu@11.24.2': + resolution: {integrity: sha512-vDT3KHgzYp47gmtNOqL2VNhCyl5Zv643eyxm//A68J8DeUGXrvD1pZFiaT4jSfe+RInfnn1R2yVHye4enx6RnA==} cpu: [arm64] os: [linux] libc: [glibc] @@ -5903,8 +5976,8 @@ packages: os: [linux] libc: [musl] - '@oxc-resolver/binding-linux-arm64-musl@11.20.0': - resolution: {integrity: sha512-wKHHzPKZo7Ufhv/Bt6yxT7FOgnIgW4gwXcJUipkShGp68W3wGVqvr1Sr0fY65lN0Oy6y41+g2kIDvkgZaMMUkw==} + '@oxc-resolver/binding-linux-arm64-musl@11.24.2': + resolution: {integrity: sha512-+kMlQvbzfyEYtu5FcjE4p+ttBLpKW4d/AsAsuE69BxV6V4twZJeIQZFfD8gh/wqglY0MkPSezWXQH0jBV13MUw==} cpu: [arm64] os: [linux] libc: [musl] @@ -5915,8 +5988,8 @@ packages: os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-ppc64-gnu@11.20.0': - resolution: {integrity: sha512-RN8goF7Ie0B79L4i4G6OeBocTgSC56vJbQ65VJje+oXnldVpLnOU7j/AQ/dP94TcCS+Yh6WG8u3Qt4ETteXFNQ==} + '@oxc-resolver/binding-linux-ppc64-gnu@11.24.2': + resolution: {integrity: sha512-shjfMhmZ3gq9fv/w7bi3PnZlgOPG+2QAOFf0BJF0EgBSIGZ6PMLN2zbGEblTUYB/NKVDRyYhE2ff3dJ1QqNPkA==} cpu: [ppc64] os: [linux] libc: [glibc] @@ -5927,8 +6000,8 @@ packages: os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-riscv64-gnu@11.20.0': - resolution: {integrity: sha512-5l1yU6/xQEqLZRzxqmMxJfWPslpwCmBsdDGaBvABPehxquCXDC7dd7oraNdKSJUMDXSM7VvVj8H2D2FTjU7oWw==} + '@oxc-resolver/binding-linux-riscv64-gnu@11.24.2': + resolution: {integrity: sha512-zGelwFR5oRo+b69k8Lrzun86DyUHzfKN6cnjbR9l7Z7NIRznOE/2ZvPa1IUKqAL2PzAXOdwkfVqNvO1H2RlpAw==} cpu: [riscv64] os: [linux] libc: [glibc] @@ -5939,8 +6012,8 @@ packages: os: [linux] libc: [musl] - '@oxc-resolver/binding-linux-riscv64-musl@11.20.0': - resolution: {integrity: sha512-xHEvkbgz6UC+A3JOyDQy76LkUaxsNSfIr3/GV8slwZsnuooJiIB34gzJfsyvR4JdCYNUUPsRJc/w/oWkODu+hg==} + '@oxc-resolver/binding-linux-riscv64-musl@11.24.2': + resolution: {integrity: sha512-qxZ1SWCXJY0eyhAlP6Lmo9F2Nrtx7EkYj9oCgL8apDPCwXwCEDA2U697bbT81JIc2IrVjxO4KX6WU2N+oN9Z4w==} cpu: [riscv64] os: [linux] libc: [musl] @@ -5951,8 +6024,8 @@ packages: os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-s390x-gnu@11.20.0': - resolution: {integrity: sha512-aWPDUUmSeyHvlW+SoEUd+JIJsQhVhu6a5tBpDRMu058naPAchTgAVGCFy35zjbnFlt0i8hLWziff6HX0D3LU4g==} + '@oxc-resolver/binding-linux-s390x-gnu@11.24.2': + resolution: {integrity: sha512-sGCecF3cx2DFlH4t/z7ApnOnXqN48p5p5mlHDEnHTAukQa2P+qMVE4CwyWE9W+q/m3QJ7kKfGrIjax31f44oFQ==} cpu: [s390x] os: [linux] libc: [glibc] @@ -5963,8 +6036,8 @@ packages: os: [linux] libc: [glibc] - '@oxc-resolver/binding-linux-x64-gnu@11.20.0': - resolution: {integrity: sha512-x2YeSimvhJjKLVD8KSu8f/rqU1potcdEMkApIPJqjZWN7c2Fpt4g2X32WDg1p+XDAmyT7nuQGe0vnhvXeLbH+g==} + '@oxc-resolver/binding-linux-x64-gnu@11.24.2': + resolution: {integrity: sha512-k/VlMMcSzMlahb3/fENM4rTlsJ0s3fFROA0KXPBmKggqmTSaE383sl8F3KCOXPLmVsYfW6hCitMhXCEtNeZxxg==} cpu: [x64] os: [linux] libc: [glibc] @@ -5975,14 +6048,14 @@ packages: os: [linux] libc: [musl] - '@oxc-resolver/binding-linux-x64-musl@11.20.0': - resolution: {integrity: sha512-kcRLEIxpZefeYfLChjpgFf3ilBzRDZ+yobMrpRsQlSrxuFGtm3U6PMU7AaEpMqo3NfDGVyJJseAjnRLzMFHjwQ==} + '@oxc-resolver/binding-linux-x64-musl@11.24.2': + resolution: {integrity: sha512-8hbnZyNi97b/8wapYaIF9+t9GmZKBW2vunaOc3h9HGJptH7b7XpvZqOTBSm/MpTjr7H497BlgOaSfLUdhmy2bw==} cpu: [x64] os: [linux] libc: [musl] - '@oxc-resolver/binding-openharmony-arm64@11.20.0': - resolution: {integrity: sha512-HHcfnApSZGtKhTiHqe8OZruOZe5XuFQH5/E0Yhj3u8fnFvzkM4/k6WjacUf4SvA0SPEAbfbgYmVPuo0VX/fIBQ==} + '@oxc-resolver/binding-openharmony-arm64@11.24.2': + resolution: {integrity: sha512-MvyGik3a6pVgZ0t/kWlbmFxFLmXQJwgLsY2eYFHLpy0wGwRbfzeIGgDwQ3kXqE30z+kSXennRkCrT7TUvkptNg==} cpu: [arm64] os: [openharmony] @@ -5991,8 +6064,8 @@ packages: engines: {node: '>=14.0.0'} cpu: [wasm32] - '@oxc-resolver/binding-wasm32-wasi@11.20.0': - resolution: {integrity: sha512-Tn0y1XOFYHNfK1wp1Z5QK8Rcld/bsOwRISQXfqAZ5IBpv8Gz1IvV39fUWNprqNdRizgcvFhOzWwFun2zkJsyBg==} + '@oxc-resolver/binding-wasm32-wasi@11.24.2': + resolution: {integrity: sha512-vHcssMPwO08RTvj/c0iOBz90attxyG3wQJ0dTcyEQK43LRpcdLWZlV5feBhv6Isn6ahbQIzHbCgfa81+RiML0Q==} engines: {node: '>=14.0.0'} cpu: [wasm32] @@ -6001,8 +6074,8 @@ packages: cpu: [arm64] os: [win32] - '@oxc-resolver/binding-win32-arm64-msvc@11.20.0': - resolution: {integrity: sha512-qPi25YNPe4YenS8MgsQU2+bIFHxxpLx1LVna2444cEHqNPhNjvWf9zqj4aWE43H9LpAsTmkkAlA3eL5ElBU3mA==} + '@oxc-resolver/binding-win32-arm64-msvc@11.24.2': + resolution: {integrity: sha512-uokJqro2iBqkFvJdKQLP7d8/BUmFwESQFVmIJUQKj1Xn1a/LysJoe1vmeECLF5b3jsV8CAL5sEMJXX6SdK9Nhg==} cpu: [arm64] os: [win32] @@ -6016,8 +6089,8 @@ packages: cpu: [x64] os: [win32] - '@oxc-resolver/binding-win32-x64-msvc@11.20.0': - resolution: {integrity: sha512-Wb14jWEW8huH6It9F6sXd9vrYmIS7pMrgkU6sxpLxkP+9z+wRgs71hUEhRpcn8FOXAFa27FVWfY2tRpbfTzfLw==} + '@oxc-resolver/binding-win32-x64-msvc@11.24.2': + resolution: {integrity: sha512-UqGPmo56KDfLlfXFAFIrNflHT8tFxWGEivWg3Zeyp4Uy2NlKN1FGPr6/BxcLGG3+kZ6Wp14g5Uj+n71boqZfiw==} cpu: [x64] os: [win32] @@ -6864,11 +6937,10 @@ packages: '@storybook/global@5.0.0': resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} - '@storybook/icons@2.0.2': - resolution: {integrity: sha512-KZBCpXsshAIjczYNXR/rlxEtCUX/eAbpFNwKi8bcOomrLA4t/SyPz5RF+lVPO2oZBUE4sAkt43mfJUevQDSEEw==} + '@storybook/icons@2.1.0': + resolution: {integrity: sha512-Fxh9vYpX9bQqFeHRiY8h2ApeRGDzRSMLwJwNZ/AIRqnyOKHxRKL+yFe+ctEkVJmuptRE9u1Hrn8ZZNHyfDKKNg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 '@storybook/react-dom-shim@10.4.2': resolution: {integrity: sha512-Eng3Yt2NCjPX94QcfyLeUFhrMj0hec2yU9J/qafBVbfj9XrFI8o+0ZwYJ7uXb9ECbvPN4y06dgt/2W/LiR417w==} @@ -7018,8 +7090,8 @@ packages: '@types/react-dom': optional: true - '@testing-library/user-event@14.6.1': - resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} + '@testing-library/user-event@14.6.4': + resolution: {integrity: sha512-QCGwP6QrjypBLwyj5cuyfVamkaIEy/XGY+1VDehbtbQqOggYmTFpFOdWR5mPz14vX8vXLMVjDHlRNBcClyO9ew==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' @@ -7066,6 +7138,9 @@ packages: '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} @@ -7117,6 +7192,9 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/express-serve-static-core@4.19.7': resolution: {integrity: sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==} @@ -7189,9 +7267,6 @@ packages: '@types/node@22.19.15': resolution: {integrity: sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==} - '@types/node@24.10.1': - resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} - '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -7552,6 +7627,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} + engines: {node: '>=0.4.0'} + hasBin: true + address@1.2.2: resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} engines: {node: '>= 10.0.0'} @@ -7602,6 +7682,9 @@ packages: ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + algoliasearch-helper@3.26.1: resolution: {integrity: sha512-CAlCxm4fYBXtvc5MamDzP6Svu8rW4z9me4DCBY1rQ2UDJ0u0flWmusQ8M3nOExZsLLRcUwUPoRAPMrhzOG3erw==} peerDependencies: @@ -7673,7 +7756,7 @@ packages: peerDependencies: '@apollo/client': '>=3' graphql: '>=0.11' - qs: 6.15.2 + qs: 6.16.0 applicationinsights@2.9.8: resolution: {integrity: sha512-eB/EtAXJ6mDLLvHrtZj/7h31qUfnC2Npr2pHGqds5+1OP7BFLsn5us+HCkwTj7Q+1sHXujLphE5Cyvq5grtV6g==} @@ -7806,8 +7889,8 @@ packages: resolution: {integrity: sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==} engines: {node: '>=4'} - axios@1.18.1: - resolution: {integrity: sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==} + axios@1.19.0: + resolution: {integrity: sha512-ht/iuYZXEjFxLH/Hkezgd7m6JKlHHXEUSneaDz8uZe1Gj5QZtCnpyDsckvAiEnT89OEbCLmnte4R4sn7P0EKFw==} azurite@3.35.0: resolution: {integrity: sha512-GzKmi+/5U0baNRjEEVtBMLpLuIKEJ0uSh0VWBzOI4qe4f5ziJyoZQmcTO7QhxZTF6+rphj7TZS3PtJY7uiiacA==} @@ -8081,9 +8164,6 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-lite@1.0.30001777: - resolution: {integrity: sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==} - caniuse-lite@1.0.30001810: resolution: {integrity: sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==} @@ -8138,8 +8218,8 @@ packages: chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + check-error@2.1.3: + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} cheerio-select@2.1.0: @@ -8188,6 +8268,9 @@ packages: cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + cjs-module-lexer@2.2.1: + resolution: {integrity: sha512-Ca8swihM+/4yKecYHY52kgJd300hi2lADU/a1RxNTRe+RJ9jvqQlESpbz9DnG9mowez8qwXHB8qYdIUw9e+F5Q==} + class-transformer@0.5.1: resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} @@ -8689,8 +8772,8 @@ packages: resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} engines: {node: '>=18'} - default-browser@5.4.0: - resolution: {integrity: sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==} + default-browser@5.5.0: + resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} engines: {node: '>=18'} defaults@1.0.4: @@ -8922,8 +9005,8 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - enhanced-resolve@5.20.0: - resolution: {integrity: sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==} + enhanced-resolve@5.24.5: + resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==} engines: {node: '>=10.13.0'} entities@2.2.0: @@ -8967,13 +9050,17 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@2.0.0: - resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + es-module-lexer@2.3.1: + resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + es-set-tostringtag@2.1.0: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} @@ -9308,6 +9395,9 @@ packages: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} + forwarded-parse@2.1.2: + resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} + forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -9388,8 +9478,8 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.13.0: - resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + get-tsconfig@4.14.2: + resolution: {integrity: sha512-XpwZALwwl/BaKTAyC6+c5T8y6kCg2jk+XGqOVrKIQmW49pNypYLMRjCUXqa28tQgJlhS2RlzP7sc+Rx7W6qsfw==} github-slugger@1.5.0: resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} @@ -9518,7 +9608,7 @@ packages: crossws: ~0.3 graphql: ^15.10.1 || ^16 uWebSockets.js: ^20 - ws: 8.21.0 + ws: 8.21.1 peerDependenciesMeta: '@fastify/websocket': optional: true @@ -9599,10 +9689,6 @@ packages: hash.js@1.1.7: resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - hasown@2.0.4: resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} @@ -9822,6 +9908,10 @@ packages: import-in-the-middle@1.15.0: resolution: {integrity: sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==} + import-in-the-middle@3.3.3: + resolution: {integrity: sha512-AiohS3H80sXO6owEltjGX+glb7qXaDhBoJb9XcQVH4UI207xu/bDLUcadVKp7Qe576reg9yr/PXZjV5qx8gfbA==} + engines: {node: '>=18'} + import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} @@ -10144,8 +10234,8 @@ packages: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} - is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} is-yarn-global@0.4.1: @@ -10179,7 +10269,7 @@ packages: isomorphic-ws@5.0.0: resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} peerDependencies: - ws: 8.21.0 + ws: 8.21.1 istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} @@ -10368,78 +10458,78 @@ packages: lie@3.1.1: resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} - lightningcss-android-arm64@1.32.0: - resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.32.0: - resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.32.0: - resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.32.0: - resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.32.0: - resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.32.0: - resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [glibc] - lightningcss-linux-arm64-musl@1.32.0: - resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [musl] - lightningcss-linux-x64-gnu@1.32.0: - resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [glibc] - lightningcss-linux-x64-musl@1.32.0: - resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [musl] - lightningcss-win32-arm64-msvc@1.32.0: - resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.32.0: - resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.32.0: - resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} engines: {node: '>= 12.0.0'} lilconfig@3.1.3: @@ -10458,8 +10548,8 @@ packages: enquirer: optional: true - loader-runner@4.3.1: - resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} + loader-runner@4.3.2: + resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==} engines: {node: '>=6.11.5'} loader-utils@2.0.4: @@ -10581,10 +10671,6 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.3.5: - resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} - engines: {node: 20 || >=22} - lru-cache@11.3.6: resolution: {integrity: sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==} engines: {node: 20 || >=22} @@ -10943,10 +11029,6 @@ packages: minimalistic-crypto-utils@1.0.1: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - minimatch@10.2.4: - resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} - engines: {node: 18 || 20 || >=22} - minimatch@10.2.5: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} @@ -11130,8 +11212,8 @@ packages: native-duplexpair@1.0.0: resolution: {integrity: sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA==} - needle@3.3.1: - resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} + needle@3.5.0: + resolution: {integrity: sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w==} engines: {node: '>= 4.4.x'} hasBin: true @@ -11247,8 +11329,8 @@ packages: nullthrows@1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} - nwsapi@2.2.22: - resolution: {integrity: sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==} + nwsapi@2.2.24: + resolution: {integrity: sha512-7YRhZ3jS45LwmSCT4b2sVFHt/WuovaktDU07QrtOBY2PXskss5a9jfmR9jptyumwXST+rFjrmppMY1KT/yn35A==} object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -11343,8 +11425,8 @@ packages: oxc-resolver@11.14.0: resolution: {integrity: sha512-i4wNrqhOd+4YdHJfHglHtFiqqSxXuzFA+RUqmmWN1aMD3r1HqUSrIhw17tSO4jwKfhLs9uw1wzFPmvMsWacStg==} - oxc-resolver@11.20.0: - resolution: {integrity: sha512-CblytBiV/a/ZXY34dsVU2NxhIOxMXst8CvDCtyBelVITgd7PLrKzbEbA6oKLdPjvDKDzCiW48qzmzZ+mYaqn+g==} + oxc-resolver@11.24.2: + resolution: {integrity: sha512-FY91FiDBj7ls5MsFS9jN3tjz2o0/zsdSsymlakySaBwVJZorHhkWyICLZMKxlu1R9vYo+sd3z1jwb4J8x7bNDw==} p-cancelable@3.0.0: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} @@ -11564,6 +11646,10 @@ packages: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -12043,8 +12129,8 @@ packages: peerDependencies: postcss: ^8.5.18 - postcss@8.5.25: - resolution: {integrity: sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==} + postcss@8.5.23: + resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==} engines: {node: ^10 || ^12 || >=14} pretty-error@4.0.0: @@ -12149,8 +12235,8 @@ packages: resolution: {integrity: sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==} engines: {node: '>=16.0.0'} - qs@6.15.2: - resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} + qs@6.16.0: + resolution: {integrity: sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==} engines: {node: '>=0.6'} querystring-es3@0.2.1: @@ -12322,8 +12408,8 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - recast@0.23.11: - resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + recast@0.23.21: + resolution: {integrity: sha512-mFAyJq9vUbSTARLZUvAEf1z3YxlvAwswbmxMx2mPA/MSm4KmpwvwvhsH/NIrZhyOuwD60Lzyw2qh83uCbgTPYw==} engines: {node: '>= 4'} recma-build-jsx@1.0.0: @@ -12468,6 +12554,10 @@ packages: resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==} engines: {node: '>=8.6.0'} + require-in-the-middle@8.0.1: + resolution: {integrity: sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==} + engines: {node: '>=9.3.0 || >=8.10.0 <9.0.0'} + require-like@0.1.2: resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} @@ -12618,6 +12708,10 @@ packages: resolution: {integrity: sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==} engines: {node: '>=11.0.0'} + sax@1.6.1: + resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==} + engines: {node: '>=11.0.0'} + saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} @@ -12679,11 +12773,6 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} - engines: {node: '>=10'} - hasBin: true - semver@7.7.4: resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} @@ -12694,6 +12783,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + send@0.19.0: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} @@ -12811,8 +12905,8 @@ packages: shimmer@1.2.1: resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} engines: {node: '>= 0.4'} side-channel-map@1.0.1: @@ -12823,8 +12917,8 @@ packages: resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} engines: {node: '>= 0.4'} - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} engines: {node: '>= 0.4'} sift@17.1.3: @@ -13212,6 +13306,10 @@ packages: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} @@ -13235,11 +13333,59 @@ packages: uglify-js: optional: true + terser-webpack-plugin@5.6.1: + resolution: {integrity: sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@minify-html/node': '*' + '@swc/core': '*' + '@swc/css': '*' + '@swc/html': '*' + clean-css: '*' + cssnano: '*' + csso: '*' + esbuild: '*' + html-minifier-terser: '*' + lightningcss: '*' + postcss: '*' + uglify-js: '*' + webpack: ^5.105.4 + peerDependenciesMeta: + '@minify-html/node': + optional: true + '@swc/core': + optional: true + '@swc/css': + optional: true + '@swc/html': + optional: true + clean-css: + optional: true + cssnano: + optional: true + csso: + optional: true + esbuild: + optional: true + html-minifier-terser: + optional: true + lightningcss: + optional: true + postcss: + optional: true + uglify-js: + optional: true + terser@5.44.1: resolution: {integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==} engines: {node: '>=10'} hasBin: true + terser@5.50.0: + resolution: {integrity: sha512-CN9BVxWhgS/hRxtUMjtC2uRWSTcSfQFHMDWma6sKKfIivCD91sM+FOPfvwoaRMqCSrUpe1nv3jDamd9eEQ4y+w==} + engines: {node: '>=10'} + hasBin: true + test-exclude@7.0.2: resolution: {integrity: sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==} engines: {node: '>=18'} @@ -13324,8 +13470,8 @@ packages: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyrainbow@3.1.0: - resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} + tinyrainbow@3.1.1: + resolution: {integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==} engines: {node: '>=14.0.0'} tinyspy@4.0.4: @@ -13544,9 +13690,6 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} engines: {node: '>=4'} @@ -13852,8 +13995,8 @@ packages: warning@4.0.3: resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} - watchpack@2.5.1: - resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} + watchpack@2.5.2: + resolution: {integrity: sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==} engines: {node: '>=10.13.0'} wbuf@1.7.3: @@ -13911,8 +14054,8 @@ packages: resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} engines: {node: '>=18.0.0'} - webpack-sources@3.3.4: - resolution: {integrity: sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==} + webpack-sources@3.5.1: + resolution: {integrity: sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==} engines: {node: '>=10.13.0'} webpack-virtual-modules@0.6.2: @@ -14042,8 +14185,8 @@ packages: write-file-atomic@3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - ws@8.21.0: - resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + ws@8.21.1: + resolution: {integrity: sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -14307,7 +14450,7 @@ snapshots: minimist: 1.2.8 parsecurrency: 1.1.1 ts-morph: 27.0.2 - vitest: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) '@ant-design/cli@6.3.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: @@ -14327,14 +14470,14 @@ snapshots: '@ant-design/cssinjs-utils@2.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@ant-design/cssinjs': 2.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 '@rc-component/util': 1.10.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) '@ant-design/cssinjs@1.24.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 '@emotion/hash': 0.8.0 '@emotion/unitless': 0.7.5 classnames: 2.5.1 @@ -14346,7 +14489,7 @@ snapshots: '@ant-design/cssinjs@2.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 '@emotion/hash': 0.8.0 '@emotion/unitless': 0.7.5 '@rc-component/util': 1.10.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -14358,7 +14501,7 @@ snapshots: '@ant-design/fast-color@2.0.6': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 '@ant-design/fast-color@3.0.1': {} @@ -14368,7 +14511,7 @@ snapshots: dependencies: '@ant-design/colors': 7.2.1 '@ant-design/icons-svg': 4.4.2 - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 classnames: 2.5.1 rc-util: 5.44.4(react-dom@19.2.8(react@19.2.8))(react@19.2.8) react: 19.2.8 @@ -14407,7 +14550,7 @@ snapshots: '@ant-design/pro-provider@2.16.2(antd@6.3.5(luxon@3.7.2)(moment@2.30.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@ant-design/cssinjs': 1.24.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 '@ctrl/tinycolor': 3.6.1 antd: 6.3.5(luxon@3.7.2)(moment@2.30.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) dayjs: 1.11.19 @@ -14420,7 +14563,7 @@ snapshots: dependencies: '@ant-design/icons': 5.6.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@ant-design/pro-provider': 2.16.2(antd@6.3.5(luxon@3.7.2)(moment@2.30.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 antd: 6.3.5(luxon@3.7.2)(moment@2.30.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) classnames: 2.5.1 dayjs: 1.11.19 @@ -14434,7 +14577,7 @@ snapshots: '@ant-design/react-slick@2.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 clsx: 2.1.1 json2mq: 0.2.0 react: 19.2.8 @@ -14445,7 +14588,7 @@ snapshots: dependencies: graphql: 16.12.0 - '@apollo/client@3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.0))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@apollo/client@3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.1))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.12.0) '@wry/caches': 1.0.1 @@ -14462,7 +14605,7 @@ snapshots: tslib: 2.8.1 zen-observable-ts: 1.2.5 optionalDependencies: - graphql-ws: 6.0.6(graphql@16.12.0)(ws@8.21.0) + graphql-ws: 6.0.6(graphql@16.12.0)(ws@8.21.1) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) transitivePeerDependencies: @@ -14511,7 +14654,7 @@ snapshots: finalhandler: 2.1.1(supports-color@8.1.1) graphql: 16.12.0 loglevel: 1.9.2 - lru-cache: 11.3.5 + lru-cache: 11.3.6 negotiator: 1.0.0 uuid: 11.1.1 whatwg-mimetype: 4.0.0 @@ -14538,7 +14681,7 @@ snapshots: '@apollo/utils.keyvaluecache@4.0.0': dependencies: '@apollo/utils.logger': 3.0.0 - lru-cache: 11.3.5 + lru-cache: 11.3.6 '@apollo/utils.logger@3.0.0': {} @@ -14575,7 +14718,7 @@ snapshots: dependencies: '@babel/generator': 7.29.7 '@babel/parser': 7.29.7 - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 chalk: 4.1.2 fb-watchman: 2.0.2 graphql: 16.12.0 @@ -14599,9 +14742,20 @@ snapshots: dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.10.1 - '@azure/core-rest-pipeline': 1.22.2 + '@azure/core-rest-pipeline': 1.25.0 '@azure/core-tracing': 1.3.1 - '@typespec/ts-http-runtime': 0.3.2 + '@typespec/ts-http-runtime': 0.3.7 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@azure-rest/core-client@2.8.0': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.10.1 + '@azure/core-rest-pipeline': 1.25.0 + '@azure/core-tracing': 1.3.1 + '@typespec/ts-http-runtime': 0.3.7 tslib: 2.8.1 transitivePeerDependencies: - supports-color @@ -14634,7 +14788,7 @@ snapshots: dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.10.1 - '@azure/core-rest-pipeline': 1.22.2 + '@azure/core-rest-pipeline': 1.25.0 '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 @@ -14646,7 +14800,7 @@ snapshots: dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-client': 1.10.1 - '@azure/core-rest-pipeline': 1.22.2 + '@azure/core-rest-pipeline': 1.25.0 transitivePeerDependencies: - supports-color @@ -14707,7 +14861,7 @@ snapshots: '@azure/core-util@1.13.1': dependencies: '@azure/abort-controller': 2.1.2 - '@typespec/ts-http-runtime': 0.3.2 + '@typespec/ts-http-runtime': 0.3.7 tslib: 2.8.1 transitivePeerDependencies: - supports-color @@ -14754,7 +14908,7 @@ snapshots: '@azure/abort-controller': 1.1.0 '@azure/core-auth': 1.10.1 '@azure/core-client': 1.10.1 - '@azure/core-rest-pipeline': 1.22.2 + '@azure/core-rest-pipeline': 1.25.0 '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 @@ -14773,7 +14927,7 @@ snapshots: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.10.1 '@azure/core-client': 1.10.1 - '@azure/core-rest-pipeline': 1.22.2 + '@azure/core-rest-pipeline': 1.25.0 '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 @@ -14789,7 +14943,7 @@ snapshots: '@azure/core-http-compat': 2.3.1 '@azure/core-lro': 2.7.2 '@azure/core-paging': 1.6.2 - '@azure/core-rest-pipeline': 1.22.2 + '@azure/core-rest-pipeline': 1.25.0 '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/keyvault-common': 2.0.0 @@ -14800,24 +14954,26 @@ snapshots: '@azure/logger@1.3.0': dependencies: - '@typespec/ts-http-runtime': 0.3.2 + '@typespec/ts-http-runtime': 0.3.7 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@azure/monitor-opentelemetry-exporter@1.0.0-beta.31': + '@azure/monitor-opentelemetry-exporter@1.0.0-beta.43': dependencies: + '@azure-rest/core-client': 2.8.0 '@azure/core-auth': 1.10.1 '@azure/core-client': 1.10.1 - '@azure/core-rest-pipeline': 1.22.2 + '@azure/core-rest-pipeline': 1.25.0 + '@azure/core-util': 1.13.1 '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.57.2 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/api-logs': 0.219.0 + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.219.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.10.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.43.0 tslib: 2.8.1 transitivePeerDependencies: - supports-color @@ -14825,7 +14981,7 @@ snapshots: '@azure/ms-rest-js@1.11.2': dependencies: '@azure/core-auth': 1.10.1 - axios: 1.18.1(supports-color@8.1.1) + axios: 1.19.0(supports-color@8.1.1) form-data: 4.0.6 tough-cookie: 4.1.3 tslib: 1.14.1 @@ -14879,26 +15035,12 @@ snapshots: '@azure/core-http-compat': 2.3.1 '@azure/core-lro': 2.7.2 '@azure/core-paging': 1.6.2 - '@azure/core-rest-pipeline': 1.22.2 + '@azure/core-rest-pipeline': 1.25.0 '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/core-xml': 1.5.1 '@azure/logger': 1.3.0 - '@azure/storage-common': 12.3.0 - events: 3.3.0 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - - '@azure/storage-common@12.3.0': - dependencies: - '@azure/abort-controller': 2.1.2 - '@azure/core-auth': 1.10.1 - '@azure/core-http-compat': 2.3.1 - '@azure/core-rest-pipeline': 1.22.2 - '@azure/core-tracing': 1.3.1 - '@azure/core-util': 1.13.1 - '@azure/logger': 1.3.0 + '@azure/storage-common': 12.4.1 events: 3.3.0 tslib: 2.8.1 transitivePeerDependencies: @@ -14925,7 +15067,7 @@ snapshots: '@azure/core-client': 1.10.1 '@azure/core-http-compat': 2.3.1 '@azure/core-paging': 1.6.2 - '@azure/core-rest-pipeline': 1.22.2 + '@azure/core-rest-pipeline': 1.25.0 '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/core-xml': 1.5.1 @@ -15706,6 +15848,8 @@ snapshots: '@babel/runtime@7.28.4': {} + '@babel/runtime@7.29.7': {} + '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.29.0 @@ -15802,12 +15946,12 @@ snapshots: '@blazediff/core@1.9.1': {} - '@chromatic-com/storybook@5.2.1(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))': + '@chromatic-com/storybook@5.2.1(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))': dependencies: '@neoconfetti/react': 1.0.0 chromatic: 16.10.0 jsonfile: 6.2.0 - storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8) strip-ansi: 7.1.2 transitivePeerDependencies: - '@chromatic-com/cypress' @@ -15849,251 +15993,251 @@ snapshots: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-alpha-function@1.0.1(postcss@8.5.25)': + '@csstools/postcss-alpha-function@1.0.1(postcss@8.5.23)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.25) - '@csstools/utilities': 2.0.0(postcss@8.5.25) - postcss: 8.5.25 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.23) + '@csstools/utilities': 2.0.0(postcss@8.5.23) + postcss: 8.5.23 - '@csstools/postcss-cascade-layers@5.0.2(postcss@8.5.25)': + '@csstools/postcss-cascade-layers@5.0.2(postcss@8.5.23)': dependencies: '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.1) - postcss: 8.5.25 + postcss: 8.5.23 postcss-selector-parser: 7.1.1 - '@csstools/postcss-color-function-display-p3-linear@1.0.1(postcss@8.5.25)': + '@csstools/postcss-color-function-display-p3-linear@1.0.1(postcss@8.5.23)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.25) - '@csstools/utilities': 2.0.0(postcss@8.5.25) - postcss: 8.5.25 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.23) + '@csstools/utilities': 2.0.0(postcss@8.5.23) + postcss: 8.5.23 - '@csstools/postcss-color-function@4.0.12(postcss@8.5.25)': + '@csstools/postcss-color-function@4.0.12(postcss@8.5.23)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.25) - '@csstools/utilities': 2.0.0(postcss@8.5.25) - postcss: 8.5.25 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.23) + '@csstools/utilities': 2.0.0(postcss@8.5.23) + postcss: 8.5.23 - '@csstools/postcss-color-mix-function@3.0.12(postcss@8.5.25)': + '@csstools/postcss-color-mix-function@3.0.12(postcss@8.5.23)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.25) - '@csstools/utilities': 2.0.0(postcss@8.5.25) - postcss: 8.5.25 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.23) + '@csstools/utilities': 2.0.0(postcss@8.5.23) + postcss: 8.5.23 - '@csstools/postcss-color-mix-variadic-function-arguments@1.0.2(postcss@8.5.25)': + '@csstools/postcss-color-mix-variadic-function-arguments@1.0.2(postcss@8.5.23)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.25) - '@csstools/utilities': 2.0.0(postcss@8.5.25) - postcss: 8.5.25 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.23) + '@csstools/utilities': 2.0.0(postcss@8.5.23) + postcss: 8.5.23 - '@csstools/postcss-content-alt-text@2.0.8(postcss@8.5.25)': + '@csstools/postcss-content-alt-text@2.0.8(postcss@8.5.23)': dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.25) - '@csstools/utilities': 2.0.0(postcss@8.5.25) - postcss: 8.5.25 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.23) + '@csstools/utilities': 2.0.0(postcss@8.5.23) + postcss: 8.5.23 - '@csstools/postcss-contrast-color-function@2.0.12(postcss@8.5.25)': + '@csstools/postcss-contrast-color-function@2.0.12(postcss@8.5.23)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.25) - '@csstools/utilities': 2.0.0(postcss@8.5.25) - postcss: 8.5.25 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.23) + '@csstools/utilities': 2.0.0(postcss@8.5.23) + postcss: 8.5.23 - '@csstools/postcss-exponential-functions@2.0.9(postcss@8.5.25)': + '@csstools/postcss-exponential-functions@2.0.9(postcss@8.5.23)': dependencies: '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - postcss: 8.5.25 + postcss: 8.5.23 - '@csstools/postcss-font-format-keywords@4.0.0(postcss@8.5.25)': + '@csstools/postcss-font-format-keywords@4.0.0(postcss@8.5.23)': dependencies: - '@csstools/utilities': 2.0.0(postcss@8.5.25) - postcss: 8.5.25 + '@csstools/utilities': 2.0.0(postcss@8.5.23) + postcss: 8.5.23 postcss-value-parser: 4.2.0 - '@csstools/postcss-gamut-mapping@2.0.11(postcss@8.5.25)': + '@csstools/postcss-gamut-mapping@2.0.11(postcss@8.5.23)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - postcss: 8.5.25 + postcss: 8.5.23 - '@csstools/postcss-gradients-interpolation-method@5.0.12(postcss@8.5.25)': + '@csstools/postcss-gradients-interpolation-method@5.0.12(postcss@8.5.23)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.25) - '@csstools/utilities': 2.0.0(postcss@8.5.25) - postcss: 8.5.25 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.23) + '@csstools/utilities': 2.0.0(postcss@8.5.23) + postcss: 8.5.23 - '@csstools/postcss-hwb-function@4.0.12(postcss@8.5.25)': + '@csstools/postcss-hwb-function@4.0.12(postcss@8.5.23)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.25) - '@csstools/utilities': 2.0.0(postcss@8.5.25) - postcss: 8.5.25 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.23) + '@csstools/utilities': 2.0.0(postcss@8.5.23) + postcss: 8.5.23 - '@csstools/postcss-ic-unit@4.0.4(postcss@8.5.25)': + '@csstools/postcss-ic-unit@4.0.4(postcss@8.5.23)': dependencies: - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.25) - '@csstools/utilities': 2.0.0(postcss@8.5.25) - postcss: 8.5.25 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.23) + '@csstools/utilities': 2.0.0(postcss@8.5.23) + postcss: 8.5.23 postcss-value-parser: 4.2.0 - '@csstools/postcss-initial@2.0.1(postcss@8.5.25)': + '@csstools/postcss-initial@2.0.1(postcss@8.5.23)': dependencies: - postcss: 8.5.25 + postcss: 8.5.23 - '@csstools/postcss-is-pseudo-class@5.0.3(postcss@8.5.25)': + '@csstools/postcss-is-pseudo-class@5.0.3(postcss@8.5.23)': dependencies: '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.1) - postcss: 8.5.25 + postcss: 8.5.23 postcss-selector-parser: 7.1.1 - '@csstools/postcss-light-dark-function@2.0.11(postcss@8.5.25)': + '@csstools/postcss-light-dark-function@2.0.11(postcss@8.5.23)': dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.25) - '@csstools/utilities': 2.0.0(postcss@8.5.25) - postcss: 8.5.25 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.23) + '@csstools/utilities': 2.0.0(postcss@8.5.23) + postcss: 8.5.23 - '@csstools/postcss-logical-float-and-clear@3.0.0(postcss@8.5.25)': + '@csstools/postcss-logical-float-and-clear@3.0.0(postcss@8.5.23)': dependencies: - postcss: 8.5.25 + postcss: 8.5.23 - '@csstools/postcss-logical-overflow@2.0.0(postcss@8.5.25)': + '@csstools/postcss-logical-overflow@2.0.0(postcss@8.5.23)': dependencies: - postcss: 8.5.25 + postcss: 8.5.23 - '@csstools/postcss-logical-overscroll-behavior@2.0.0(postcss@8.5.25)': + '@csstools/postcss-logical-overscroll-behavior@2.0.0(postcss@8.5.23)': dependencies: - postcss: 8.5.25 + postcss: 8.5.23 - '@csstools/postcss-logical-resize@3.0.0(postcss@8.5.25)': + '@csstools/postcss-logical-resize@3.0.0(postcss@8.5.23)': dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 - '@csstools/postcss-logical-viewport-units@3.0.4(postcss@8.5.25)': + '@csstools/postcss-logical-viewport-units@3.0.4(postcss@8.5.23)': dependencies: '@csstools/css-tokenizer': 3.0.4 - '@csstools/utilities': 2.0.0(postcss@8.5.25) - postcss: 8.5.25 + '@csstools/utilities': 2.0.0(postcss@8.5.23) + postcss: 8.5.23 - '@csstools/postcss-media-minmax@2.0.9(postcss@8.5.25)': + '@csstools/postcss-media-minmax@2.0.9(postcss@8.5.23)': dependencies: '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - postcss: 8.5.25 + postcss: 8.5.23 - '@csstools/postcss-media-queries-aspect-ratio-number-values@3.0.5(postcss@8.5.25)': + '@csstools/postcss-media-queries-aspect-ratio-number-values@3.0.5(postcss@8.5.23)': dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - postcss: 8.5.25 + postcss: 8.5.23 - '@csstools/postcss-nested-calc@4.0.0(postcss@8.5.25)': + '@csstools/postcss-nested-calc@4.0.0(postcss@8.5.23)': dependencies: - '@csstools/utilities': 2.0.0(postcss@8.5.25) - postcss: 8.5.25 + '@csstools/utilities': 2.0.0(postcss@8.5.23) + postcss: 8.5.23 postcss-value-parser: 4.2.0 - '@csstools/postcss-normalize-display-values@4.0.0(postcss@8.5.25)': + '@csstools/postcss-normalize-display-values@4.0.0(postcss@8.5.23)': dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 - '@csstools/postcss-oklab-function@4.0.12(postcss@8.5.25)': + '@csstools/postcss-oklab-function@4.0.12(postcss@8.5.23)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.25) - '@csstools/utilities': 2.0.0(postcss@8.5.25) - postcss: 8.5.25 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.23) + '@csstools/utilities': 2.0.0(postcss@8.5.23) + postcss: 8.5.23 - '@csstools/postcss-progressive-custom-properties@4.2.1(postcss@8.5.25)': + '@csstools/postcss-progressive-custom-properties@4.2.1(postcss@8.5.23)': dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 - '@csstools/postcss-random-function@2.0.1(postcss@8.5.25)': + '@csstools/postcss-random-function@2.0.1(postcss@8.5.23)': dependencies: '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - postcss: 8.5.25 + postcss: 8.5.23 - '@csstools/postcss-relative-color-syntax@3.0.12(postcss@8.5.25)': + '@csstools/postcss-relative-color-syntax@3.0.12(postcss@8.5.23)': dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.25) - '@csstools/utilities': 2.0.0(postcss@8.5.25) - postcss: 8.5.25 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.23) + '@csstools/utilities': 2.0.0(postcss@8.5.23) + postcss: 8.5.23 - '@csstools/postcss-scope-pseudo-class@4.0.1(postcss@8.5.25)': + '@csstools/postcss-scope-pseudo-class@4.0.1(postcss@8.5.23)': dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-selector-parser: 7.1.1 - '@csstools/postcss-sign-functions@1.1.4(postcss@8.5.25)': + '@csstools/postcss-sign-functions@1.1.4(postcss@8.5.23)': dependencies: '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - postcss: 8.5.25 + postcss: 8.5.23 - '@csstools/postcss-stepped-value-functions@4.0.9(postcss@8.5.25)': + '@csstools/postcss-stepped-value-functions@4.0.9(postcss@8.5.23)': dependencies: '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - postcss: 8.5.25 + postcss: 8.5.23 - '@csstools/postcss-text-decoration-shorthand@4.0.3(postcss@8.5.25)': + '@csstools/postcss-text-decoration-shorthand@4.0.3(postcss@8.5.23)': dependencies: '@csstools/color-helpers': 5.1.0 - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 - '@csstools/postcss-trigonometric-functions@4.0.9(postcss@8.5.25)': + '@csstools/postcss-trigonometric-functions@4.0.9(postcss@8.5.23)': dependencies: '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - postcss: 8.5.25 + postcss: 8.5.23 - '@csstools/postcss-unset-value@4.0.0(postcss@8.5.25)': + '@csstools/postcss-unset-value@4.0.0(postcss@8.5.23)': dependencies: - postcss: 8.5.25 + postcss: 8.5.23 '@csstools/selector-resolve-nested@3.1.0(postcss-selector-parser@7.1.1)': dependencies: @@ -16103,9 +16247,9 @@ snapshots: dependencies: postcss-selector-parser: 7.1.1 - '@csstools/utilities@2.0.0(postcss@8.5.25)': + '@csstools/utilities@2.0.0(postcss@8.5.23)': dependencies: - postcss: 8.5.25 + postcss: 8.5.23 '@ctrl/tinycolor@3.6.1': {} @@ -16325,7 +16469,7 @@ snapshots: transitivePeerDependencies: - '@algolia/client-search' - '@docusaurus/babel@3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@docusaurus/babel@3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@babel/core': 7.29.6(supports-color@8.1.1) '@babel/generator': 7.29.1 @@ -16334,16 +16478,25 @@ snapshots: '@babel/preset-env': 7.28.5(@babel/core@7.29.6) '@babel/preset-react': 7.28.5(@babel/core@7.29.6) '@babel/preset-typescript': 7.28.5(@babel/core@7.29.6) - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 '@babel/traverse': 7.29.0 '@docusaurus/logger': 3.10.1 - '@docusaurus/utils': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) babel-plugin-dynamic-import-node: 2.3.3 fs-extra: 11.3.2 tslib: 2.8.1 transitivePeerDependencies: + - '@minify-html/node' - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso - esbuild + - html-minifier-terser + - lightningcss + - postcss - react - react-dom - supports-color @@ -16353,34 +16506,36 @@ snapshots: '@docusaurus/bundler@3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': dependencies: '@babel/core': 7.29.6(supports-color@8.1.1) - '@docusaurus/babel': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/babel': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/cssnano-preset': 3.10.1 '@docusaurus/logger': 3.10.1 - '@docusaurus/types': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - babel-loader: 9.2.1(@babel/core@7.29.6)(webpack@5.105.4(esbuild@0.28.1)) + '@docusaurus/types': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + babel-loader: 9.2.1(@babel/core@7.29.6)(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) clean-css: 5.3.3 - copy-webpack-plugin: 11.0.0(webpack@5.105.4(esbuild@0.28.1)) - css-loader: 6.11.0(webpack@5.105.4(esbuild@0.28.1)) - css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(esbuild@0.28.1)(webpack@5.105.4(esbuild@0.28.1)) - cssnano: 6.1.2(postcss@8.5.25) - file-loader: 6.2.0(webpack@5.105.4(esbuild@0.28.1)) + copy-webpack-plugin: 11.0.0(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) + css-loader: 6.11.0(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) + css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(esbuild@0.28.1)(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) + cssnano: 6.1.2(postcss@8.5.23) + file-loader: 6.2.0(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) html-minifier-terser: 7.2.0 - mini-css-extract-plugin: 2.9.4(webpack@5.105.4(esbuild@0.28.1)) - null-loader: 4.0.1(webpack@5.105.4(esbuild@0.28.1)) - postcss: 8.5.25 - postcss-loader: 7.3.4(postcss@8.5.25)(typescript@6.0.3)(webpack@5.105.4(esbuild@0.28.1)) - postcss-preset-env: 10.4.0(postcss@8.5.25) - terser-webpack-plugin: 5.4.0(esbuild@0.28.1)(webpack@5.105.4(esbuild@0.28.1)) + mini-css-extract-plugin: 2.9.4(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) + null-loader: 4.0.1(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) + postcss: 8.5.23 + postcss-loader: 7.3.4(postcss@8.5.23)(typescript@6.0.3)(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) + postcss-preset-env: 10.4.0(postcss@8.5.23) + terser-webpack-plugin: 5.4.0(esbuild@0.28.1)(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) tslib: 2.8.1 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.4(esbuild@0.28.1)))(webpack@5.105.4(esbuild@0.28.1)) - webpack: 5.105.4(esbuild@0.28.1) - webpackbar: 7.0.0(webpack@5.105.4(esbuild@0.28.1)) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)))(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) + webpackbar: 7.0.0(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) transitivePeerDependencies: + - '@minify-html/node' - '@parcel/css' - '@rspack/core' - '@swc/core' - '@swc/css' + - '@swc/html' - csso - esbuild - lightningcss @@ -16391,15 +16546,15 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/core@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': + '@docusaurus/core@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': dependencies: - '@docusaurus/babel': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/babel': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/bundler': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) '@docusaurus/logger': 3.10.1 - '@docusaurus/mdx-loader': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-common': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/mdx-loader': 3.10.1(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-common': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@mdx-js/react': 3.1.1(@types/react@19.2.7)(react@19.2.0) boxen: 6.2.1 chalk: 4.1.2 @@ -16415,7 +16570,7 @@ snapshots: execa: 5.1.1 fs-extra: 11.3.2 html-tags: 3.3.1 - html-webpack-plugin: 5.6.5(webpack@5.105.4(esbuild@0.28.1)) + html-webpack-plugin: 5.6.5(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) leven: 3.1.0 lodash: 4.18.1 open: 8.4.2 @@ -16425,7 +16580,7 @@ snapshots: react-dom: 19.2.0(react@19.2.0) react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)' react-loadable: '@docusaurus/react-loadable@6.0.0(react@19.2.0)' - react-loadable-ssr-addon-v5-slorber: 1.0.3(@docusaurus/react-loadable@6.0.0(react@19.2.0))(webpack@5.105.4(esbuild@0.28.1)) + react-loadable-ssr-addon-v5-slorber: 1.0.3(@docusaurus/react-loadable@6.0.0(react@19.2.0))(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) react-router: 5.3.4(react@19.2.0) react-router-config: 5.1.1(react-router@5.3.4(react@19.2.0))(react@19.2.0) react-router-dom: 5.3.4(react@19.2.0) @@ -16434,19 +16589,25 @@ snapshots: tinypool: 1.1.1 tslib: 2.8.1 update-notifier: 6.0.2 - webpack: 5.105.4(esbuild@0.28.1) + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) webpack-bundle-analyzer: 4.10.2 - webpack-dev-server: 5.2.6(webpack@5.105.4(esbuild@0.28.1)) + webpack-dev-server: 5.2.6(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) webpack-merge: 6.0.1 transitivePeerDependencies: + - '@minify-html/node' - '@parcel/css' - '@rspack/core' - '@swc/core' - '@swc/css' + - '@swc/html' - bufferutil + - clean-css + - cssnano - csso - esbuild + - html-minifier-terser - lightningcss + - postcss - supports-color - typescript - uglify-js @@ -16455,9 +16616,9 @@ snapshots: '@docusaurus/cssnano-preset@3.10.1': dependencies: - cssnano-preset-advanced: 6.1.2(postcss@8.5.25) - postcss: 8.5.25 - postcss-sort-media-queries: 5.2.0(postcss@8.5.25) + cssnano-preset-advanced: 6.1.2(postcss@8.5.23) + postcss: 8.5.23 + postcss-sort-media-queries: 5.2.0(postcss@8.5.23) tslib: 2.8.1 '@docusaurus/logger@3.10.1': @@ -16465,16 +16626,16 @@ snapshots: chalk: 4.1.2 tslib: 2.8.1 - '@docusaurus/mdx-loader@3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@docusaurus/mdx-loader@3.10.1(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@docusaurus/logger': 3.10.1 - '@docusaurus/utils': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@mdx-js/mdx': 3.1.1 '@slorber/remark-comment': 1.0.0 escape-html: 1.0.3 estree-util-value-to-estree: 3.5.0 - file-loader: 6.2.0(webpack@5.105.4(esbuild@0.28.1)) + file-loader: 6.2.0(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) fs-extra: 11.3.2 image-size: 2.0.2 mdast-util-mdx: 3.0.0 @@ -16490,19 +16651,28 @@ snapshots: tslib: 2.8.1 unified: 11.0.5 unist-util-visit: 5.0.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.4(esbuild@0.28.1)))(webpack@5.105.4(esbuild@0.28.1)) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)))(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) vfile: 6.0.3 - webpack: 5.105.4(esbuild@0.28.1) + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) transitivePeerDependencies: + - '@minify-html/node' - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso - esbuild + - html-minifier-terser + - lightningcss + - postcss - supports-color - uglify-js - webpack-cli - '@docusaurus/module-type-aliases@3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@docusaurus/module-type-aliases@3.10.1(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@docusaurus/types': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/types': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@types/history': 4.7.11 '@types/react': 19.2.7 '@types/react-router-config': 5.0.11 @@ -16512,23 +16682,32 @@ snapshots: react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)' react-loadable: '@docusaurus/react-loadable@6.0.0(react@19.2.0)' transitivePeerDependencies: + - '@minify-html/node' - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso - esbuild + - html-minifier-terser + - lightningcss + - postcss - supports-color - uglify-js - webpack-cli - '@docusaurus/plugin-content-blog@3.10.1(@docusaurus/plugin-content-docs@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3))(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': + '@docusaurus/plugin-content-blog@3.10.1(@docusaurus/plugin-content-docs@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3))(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': dependencies: - '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) '@docusaurus/logger': 3.10.1 - '@docusaurus/mdx-loader': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/plugin-content-docs': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) - '@docusaurus/theme-common': 3.10.1(@docusaurus/plugin-content-docs@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/types': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-common': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/mdx-loader': 3.10.1(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/plugin-content-docs': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/theme-common': 3.10.1(@docusaurus/plugin-content-docs@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/types': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-common': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) cheerio: 1.0.0-rc.12 combine-promises: 1.2.0 feed: 4.2.2 @@ -16541,35 +16720,41 @@ snapshots: tslib: 2.8.1 unist-util-visit: 5.0.0 utility-types: 3.11.0 - webpack: 5.105.4(esbuild@0.28.1) + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) transitivePeerDependencies: - '@docusaurus/faster' - '@mdx-js/react' + - '@minify-html/node' - '@parcel/css' - '@rspack/core' - '@swc/core' - '@swc/css' + - '@swc/html' - bufferutil + - clean-css + - cssnano - csso - esbuild + - html-minifier-terser - lightningcss + - postcss - supports-color - typescript - uglify-js - utf-8-validate - webpack-cli - '@docusaurus/plugin-content-docs@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': + '@docusaurus/plugin-content-docs@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': dependencies: - '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) '@docusaurus/logger': 3.10.1 - '@docusaurus/mdx-loader': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/module-type-aliases': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/theme-common': 3.10.1(@docusaurus/plugin-content-docs@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/types': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-common': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/mdx-loader': 3.10.1(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/module-type-aliases': 3.10.1(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/theme-common': 3.10.1(@docusaurus/plugin-content-docs@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/types': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-common': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@types/react-router-config': 5.0.11 combine-promises: 1.2.0 fs-extra: 11.3.2 @@ -16580,71 +16765,89 @@ snapshots: schema-dts: 1.1.5 tslib: 2.8.1 utility-types: 3.11.0 - webpack: 5.105.4(esbuild@0.28.1) + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) transitivePeerDependencies: - '@docusaurus/faster' - '@mdx-js/react' + - '@minify-html/node' - '@parcel/css' - '@rspack/core' - '@swc/core' - '@swc/css' + - '@swc/html' - bufferutil + - clean-css + - cssnano - csso - esbuild + - html-minifier-terser - lightningcss + - postcss - supports-color - typescript - uglify-js - utf-8-validate - webpack-cli - '@docusaurus/plugin-content-pages@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': + '@docusaurus/plugin-content-pages@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': dependencies: - '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) - '@docusaurus/mdx-loader': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/types': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/mdx-loader': 3.10.1(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/types': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) fs-extra: 11.3.2 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) tslib: 2.8.1 - webpack: 5.105.4(esbuild@0.28.1) + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) transitivePeerDependencies: - '@docusaurus/faster' - '@mdx-js/react' + - '@minify-html/node' - '@parcel/css' - '@rspack/core' - '@swc/core' - '@swc/css' + - '@swc/html' - bufferutil + - clean-css + - cssnano - csso - esbuild + - html-minifier-terser - lightningcss + - postcss - supports-color - typescript - uglify-js - utf-8-validate - webpack-cli - '@docusaurus/plugin-css-cascade-layers@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': + '@docusaurus/plugin-css-cascade-layers@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': dependencies: - '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) - '@docusaurus/types': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/types': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) tslib: 2.8.1 transitivePeerDependencies: - '@docusaurus/faster' - '@mdx-js/react' + - '@minify-html/node' - '@parcel/css' - '@rspack/core' - '@swc/core' - '@swc/css' + - '@swc/html' - bufferutil + - clean-css + - cssnano - csso - esbuild + - html-minifier-terser - lightningcss + - postcss - react - react-dom - supports-color @@ -16653,11 +16856,11 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-debug@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': + '@docusaurus/plugin-debug@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': dependencies: - '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) - '@docusaurus/types': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/types': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) fs-extra: 11.3.2 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) @@ -16666,50 +16869,62 @@ snapshots: transitivePeerDependencies: - '@docusaurus/faster' - '@mdx-js/react' + - '@minify-html/node' - '@parcel/css' - '@rspack/core' - '@swc/core' - '@swc/css' + - '@swc/html' - bufferutil + - clean-css + - cssnano - csso - esbuild + - html-minifier-terser - lightningcss + - postcss - supports-color - typescript - uglify-js - utf-8-validate - webpack-cli - '@docusaurus/plugin-google-analytics@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': + '@docusaurus/plugin-google-analytics@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': dependencies: - '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) - '@docusaurus/types': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/types': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(postcss@8.5.23)(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) tslib: 2.8.1 transitivePeerDependencies: - '@docusaurus/faster' - '@mdx-js/react' + - '@minify-html/node' - '@parcel/css' - '@rspack/core' - '@swc/core' - '@swc/css' + - '@swc/html' - bufferutil + - clean-css + - cssnano - csso - esbuild + - html-minifier-terser - lightningcss + - postcss - supports-color - typescript - uglify-js - utf-8-validate - webpack-cli - '@docusaurus/plugin-google-gtag@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': + '@docusaurus/plugin-google-gtag@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': dependencies: - '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) - '@docusaurus/types': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/types': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@types/gtag.js': 0.0.20 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) @@ -16717,53 +16932,65 @@ snapshots: transitivePeerDependencies: - '@docusaurus/faster' - '@mdx-js/react' + - '@minify-html/node' - '@parcel/css' - '@rspack/core' - '@swc/core' - '@swc/css' + - '@swc/html' - bufferutil + - clean-css + - cssnano - csso - esbuild + - html-minifier-terser - lightningcss + - postcss - supports-color - typescript - uglify-js - utf-8-validate - webpack-cli - '@docusaurus/plugin-google-tag-manager@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': + '@docusaurus/plugin-google-tag-manager@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': dependencies: - '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) - '@docusaurus/types': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/types': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(postcss@8.5.23)(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) tslib: 2.8.1 transitivePeerDependencies: - '@docusaurus/faster' - '@mdx-js/react' + - '@minify-html/node' - '@parcel/css' - '@rspack/core' - '@swc/core' - '@swc/css' + - '@swc/html' - bufferutil + - clean-css + - cssnano - csso - esbuild + - html-minifier-terser - lightningcss + - postcss - supports-color - typescript - uglify-js - utf-8-validate - webpack-cli - '@docusaurus/plugin-sitemap@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': + '@docusaurus/plugin-sitemap@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': dependencies: - '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) '@docusaurus/logger': 3.10.1 - '@docusaurus/types': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-common': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/types': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-common': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) fs-extra: 11.3.2 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) @@ -16772,81 +16999,99 @@ snapshots: transitivePeerDependencies: - '@docusaurus/faster' - '@mdx-js/react' + - '@minify-html/node' - '@parcel/css' - '@rspack/core' - '@swc/core' - '@swc/css' + - '@swc/html' - bufferutil + - clean-css + - cssnano - csso - esbuild + - html-minifier-terser - lightningcss + - postcss - supports-color - typescript - uglify-js - utf-8-validate - webpack-cli - '@docusaurus/plugin-svgr@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': + '@docusaurus/plugin-svgr@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': dependencies: - '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) - '@docusaurus/types': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/types': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@svgr/core': 8.1.0(typescript@6.0.3) '@svgr/webpack': 8.1.0(typescript@6.0.3) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) tslib: 2.8.1 - webpack: 5.105.4(esbuild@0.28.1) + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) transitivePeerDependencies: - '@docusaurus/faster' - '@mdx-js/react' + - '@minify-html/node' - '@parcel/css' - '@rspack/core' - '@swc/core' - '@swc/css' + - '@swc/html' - bufferutil + - clean-css + - cssnano - csso - esbuild + - html-minifier-terser - lightningcss + - postcss - supports-color - typescript - uglify-js - utf-8-validate - webpack-cli - '@docusaurus/preset-classic@3.10.1(@algolia/client-search@5.45.0)(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@6.0.3)': - dependencies: - '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) - '@docusaurus/plugin-content-blog': 3.10.1(@docusaurus/plugin-content-docs@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3))(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) - '@docusaurus/plugin-content-docs': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) - '@docusaurus/plugin-content-pages': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) - '@docusaurus/plugin-css-cascade-layers': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) - '@docusaurus/plugin-debug': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) - '@docusaurus/plugin-google-analytics': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) - '@docusaurus/plugin-google-gtag': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) - '@docusaurus/plugin-google-tag-manager': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) - '@docusaurus/plugin-sitemap': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) - '@docusaurus/plugin-svgr': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/preset-classic@3.10.1(@algolia/client-search@5.45.0)(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@6.0.3)': + dependencies: + '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/plugin-content-blog': 3.10.1(@docusaurus/plugin-content-docs@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3))(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/plugin-content-docs': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/plugin-content-pages': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/plugin-css-cascade-layers': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/plugin-debug': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/plugin-google-analytics': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/plugin-google-gtag': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/plugin-google-tag-manager': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/plugin-sitemap': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/plugin-svgr': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) '@docusaurus/theme-classic': 3.10.1(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) - '@docusaurus/theme-common': 3.10.1(@docusaurus/plugin-content-docs@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/theme-search-algolia': 3.10.1(@algolia/client-search@5.45.0)(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@6.0.3) - '@docusaurus/types': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/theme-common': 3.10.1(@docusaurus/plugin-content-docs@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/theme-search-algolia': 3.10.1(@algolia/client-search@5.45.0)(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@6.0.3) + '@docusaurus/types': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(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) transitivePeerDependencies: - '@algolia/client-search' - '@docusaurus/faster' - '@mdx-js/react' + - '@minify-html/node' - '@parcel/css' - '@rspack/core' - '@swc/core' - '@swc/css' + - '@swc/html' - '@types/react' - bufferutil + - clean-css + - cssnano - csso - esbuild + - html-minifier-terser - lightningcss + - postcss - search-insights - supports-color - typescript @@ -16861,26 +17106,26 @@ snapshots: '@docusaurus/theme-classic@3.10.1(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3)': dependencies: - '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) '@docusaurus/logger': 3.10.1 - '@docusaurus/mdx-loader': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/module-type-aliases': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/plugin-content-blog': 3.10.1(@docusaurus/plugin-content-docs@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3))(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) - '@docusaurus/plugin-content-docs': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) - '@docusaurus/plugin-content-pages': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) - '@docusaurus/theme-common': 3.10.1(@docusaurus/plugin-content-docs@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/mdx-loader': 3.10.1(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/module-type-aliases': 3.10.1(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/plugin-content-blog': 3.10.1(@docusaurus/plugin-content-docs@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3))(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/plugin-content-docs': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/plugin-content-pages': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/theme-common': 3.10.1(@docusaurus/plugin-content-docs@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/theme-translations': 3.10.1 - '@docusaurus/types': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-common': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/types': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-common': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@mdx-js/react': 3.1.1(@types/react@19.2.7)(react@19.2.0) clsx: 2.1.1 copy-text-to-clipboard: 3.2.2 infima: 0.2.0-alpha.45 lodash: 4.18.1 nprogress: 0.2.0 - postcss: 8.5.25 + postcss: 8.5.23 prism-react-renderer: 2.4.1(react@19.2.0) prismjs: 1.30.0 react: 19.2.0 @@ -16891,14 +17136,19 @@ snapshots: utility-types: 3.11.0 transitivePeerDependencies: - '@docusaurus/faster' + - '@minify-html/node' - '@parcel/css' - '@rspack/core' - '@swc/core' - '@swc/css' + - '@swc/html' - '@types/react' - bufferutil + - clean-css + - cssnano - csso - esbuild + - html-minifier-terser - lightningcss - supports-color - typescript @@ -16906,13 +17156,13 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/theme-common@3.10.1(@docusaurus/plugin-content-docs@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@docusaurus/theme-common@3.10.1(@docusaurus/plugin-content-docs@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@docusaurus/mdx-loader': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/module-type-aliases': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/plugin-content-docs': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) - '@docusaurus/utils': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-common': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/mdx-loader': 3.10.1(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/module-type-aliases': 3.10.1(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/plugin-content-docs': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/utils': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-common': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@types/history': 4.7.11 '@types/react': 19.2.7 '@types/react-router-config': 5.0.11 @@ -16924,23 +17174,32 @@ snapshots: tslib: 2.8.1 utility-types: 3.11.0 transitivePeerDependencies: + - '@minify-html/node' - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso - esbuild + - html-minifier-terser + - lightningcss + - postcss - supports-color - uglify-js - webpack-cli - '@docusaurus/theme-search-algolia@3.10.1(@algolia/client-search@5.45.0)(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@6.0.3)': + '@docusaurus/theme-search-algolia@3.10.1(@algolia/client-search@5.45.0)(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(@types/react@19.2.7)(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3)(typescript@6.0.3)': dependencies: '@algolia/autocomplete-core': 1.19.2(@algolia/client-search@5.45.0)(algoliasearch@5.45.0)(search-insights@2.17.3) '@docsearch/react': 4.3.2(@algolia/client-search@5.45.0)(@types/react@19.2.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(search-insights@2.17.3) - '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/core': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) '@docusaurus/logger': 3.10.1 - '@docusaurus/plugin-content-docs': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) - '@docusaurus/theme-common': 3.10.1(@docusaurus/plugin-content-docs@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3))(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/plugin-content-docs': 3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3) + '@docusaurus/theme-common': 3.10.1(@docusaurus/plugin-content-docs@3.10.1(@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.0))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@6.0.3))(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@docusaurus/theme-translations': 3.10.1 - '@docusaurus/utils': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-validation': 3.10.1(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) algoliasearch: 5.45.0 algoliasearch-helper: 3.26.1(algoliasearch@5.45.0) clsx: 2.1.1 @@ -16955,15 +17214,21 @@ snapshots: - '@algolia/client-search' - '@docusaurus/faster' - '@mdx-js/react' + - '@minify-html/node' - '@parcel/css' - '@rspack/core' - '@swc/core' - '@swc/css' + - '@swc/html' - '@types/react' - bufferutil + - clean-css + - cssnano - csso - esbuild + - html-minifier-terser - lightningcss + - postcss - search-insights - supports-color - typescript @@ -16978,7 +17243,7 @@ snapshots: '@docusaurus/tsconfig@3.10.1': {} - '@docusaurus/types@3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@docusaurus/types@3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@mdx-js/mdx': 3.1.1 '@types/history': 4.7.11 @@ -16990,55 +17255,82 @@ snapshots: react-dom: 19.2.0(react@19.2.0) react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)' utility-types: 3.11.0 - webpack: 5.105.4(esbuild@0.28.1) + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) webpack-merge: 5.10.0 transitivePeerDependencies: + - '@minify-html/node' - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso - esbuild + - html-minifier-terser + - lightningcss + - postcss - supports-color - uglify-js - webpack-cli - '@docusaurus/utils-common@3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@docusaurus/utils-common@3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@docusaurus/types': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/types': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) tslib: 2.8.1 transitivePeerDependencies: + - '@minify-html/node' - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso - esbuild + - html-minifier-terser + - lightningcss + - postcss - react - react-dom - supports-color - uglify-js - webpack-cli - '@docusaurus/utils-validation@3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@docusaurus/utils-validation@3.10.1(esbuild@0.28.1)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@docusaurus/logger': 3.10.1 - '@docusaurus/utils': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-common': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-common': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) fs-extra: 11.3.2 joi: 17.13.4 js-yaml: 4.3.1 lodash: 4.18.1 tslib: 2.8.1 transitivePeerDependencies: + - '@minify-html/node' - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso - esbuild + - html-minifier-terser + - lightningcss + - postcss - react - react-dom - supports-color - uglify-js - webpack-cli - '@docusaurus/utils@3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@docusaurus/utils@3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@docusaurus/logger': 3.10.1 - '@docusaurus/types': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@docusaurus/utils-common': 3.10.1(esbuild@0.28.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/types': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@docusaurus/utils-common': 3.10.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) escape-string-regexp: 4.0.0 execa: 5.1.1 - file-loader: 6.2.0(webpack@5.105.4(esbuild@0.28.1)) + file-loader: 6.2.0(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) fs-extra: 11.3.2 github-slugger: 1.5.0 globby: 11.1.0 @@ -17051,12 +17343,21 @@ snapshots: prompts: 2.4.2 resolve-pathname: 3.0.0 tslib: 2.8.1 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.4(esbuild@0.28.1)))(webpack@5.105.4(esbuild@0.28.1)) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)))(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) utility-types: 3.11.0 - webpack: 5.105.4(esbuild@0.28.1) + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) transitivePeerDependencies: + - '@minify-html/node' - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso - esbuild + - html-minifier-terser + - lightningcss + - postcss - react - react-dom - supports-color @@ -17074,6 +17375,12 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/core@1.11.2': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + '@emnapi/core@1.9.2': dependencies: '@emnapi/wasi-threads': 1.2.1 @@ -17085,6 +17392,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.11.2': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.9.2': dependencies: tslib: 2.8.1 @@ -17095,6 +17407,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.8.1 + optional: true + '@emotion/hash@0.8.0': {} '@emotion/unitless@0.7.5': {} @@ -17465,10 +17782,10 @@ snapshots: '@graphql-tools/utils': 10.11.0(graphql@16.12.0) '@whatwg-node/disposablestack': 0.0.6 graphql: 16.12.0 - graphql-ws: 6.0.6(graphql@16.12.0)(ws@8.21.0) - isomorphic-ws: 5.0.0(ws@8.21.0) + graphql-ws: 6.0.6(graphql@16.12.0)(ws@8.21.1) + isomorphic-ws: 5.0.0(ws@8.21.1) tslib: 2.8.1 - ws: 8.21.0 + ws: 8.21.1 transitivePeerDependencies: - '@fastify/websocket' - bufferutil @@ -17496,9 +17813,9 @@ snapshots: '@graphql-tools/utils': 10.11.0(graphql@16.12.0) '@types/ws': 8.18.1 graphql: 16.12.0 - isomorphic-ws: 5.0.0(ws@8.21.0) + isomorphic-ws: 5.0.0(ws@8.21.1) tslib: 2.8.1 - ws: 8.21.0 + ws: 8.21.1 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -17670,10 +17987,10 @@ snapshots: '@whatwg-node/fetch': 0.10.13 '@whatwg-node/promise-helpers': 1.3.2 graphql: 16.12.0 - isomorphic-ws: 5.0.0(ws@8.21.0) + isomorphic-ws: 5.0.0(ws@8.21.1) sync-fetch: 0.6.0-2 tslib: 2.8.1 - ws: 8.21.0 + ws: 8.21.1 transitivePeerDependencies: - '@fastify/websocket' - '@types/node' @@ -17728,7 +18045,7 @@ snapshots: '@happy-dom/global-registrator@20.10.6': dependencies: - '@types/node': 24.10.1 + '@types/node': 22.19.15 happy-dom: 20.10.1 transitivePeerDependencies: - bufferutil @@ -17761,15 +18078,15 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.10.1 + '@types/node': 22.19.15 '@types/yargs': 17.0.35 chalk: 4.1.2 - '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0(typescript@6.0.3)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0(typescript@6.0.3)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))': dependencies: glob: 13.0.6 react-docgen-typescript: 2.4.0(typescript@6.0.3) - vite: 8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3) optionalDependencies: typescript: 6.0.3 @@ -17896,18 +18213,32 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@napi-rs/wasm-runtime@1.1.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': + dependencies: + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@napi-rs/wasm-runtime@1.2.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.1 + '@tybys/wasm-util': 0.10.3 + optional: true + + '@napi-rs/wasm-runtime@1.2.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': + dependencies: + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 + '@tybys/wasm-util': 0.10.3 optional: true - '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/wasm-runtime@1.2.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': dependencies: '@emnapi/core': 1.9.2 '@emnapi/runtime': 1.9.2 - '@tybys/wasm-util': 0.10.1 + '@tybys/wasm-util': 0.10.3 optional: true '@neoconfetti/react@1.0.0': {} @@ -17934,6 +18265,14 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs@0.219.0': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api-logs@0.220.0': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs@0.52.1': dependencies: '@opentelemetry/api': 1.9.0 @@ -17944,20 +18283,26 @@ snapshots: '@opentelemetry/api@1.9.0': {} - '@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/configuration@0.220.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.0) + yaml: 2.8.3 - '@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/context-async-hooks@2.9.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.25.1 '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.28.0 + '@opentelemetry/core@2.10.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -17973,111 +18318,105 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.38.0 - '@opentelemetry/exporter-logs-otlp-grpc@0.57.2(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-logs-otlp-grpc@0.220.0(@opentelemetry/api@1.9.0)': dependencies: '@grpc/grpc-js': 1.14.4 '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.220.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-http@0.57.2(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-logs-otlp-http@0.220.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.57.2 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/api-logs': 0.220.0 + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.220.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-proto@0.57.2(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-logs-otlp-proto@0.220.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.57.2 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.220.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-grpc@0.57.2(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-metrics-otlp-grpc@0.220.0(@opentelemetry/api@1.9.0)': dependencies: '@grpc/grpc-js': 1.14.4 '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.9.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http@0.57.2(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-metrics-otlp-http@0.220.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.9.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-proto@0.57.2(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-metrics-otlp-proto@0.220.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.9.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-prometheus@0.217.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-prometheus@0.220.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.7.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.9.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.38.0 - '@opentelemetry/exporter-trace-otlp-grpc@0.57.2(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-trace-otlp-grpc@0.220.0(@opentelemetry/api@1.9.0)': dependencies: '@grpc/grpc-js': 1.14.4 '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.9.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-http@0.57.2(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-trace-otlp-http@0.220.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.9.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-proto@0.57.2(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-trace-otlp-proto@0.220.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.9.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-zipkin@1.30.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-zipkin@2.9.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.28.0 + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 '@opentelemetry/instrumentation-dataloader@0.17.0(@opentelemetry/api@1.9.0)': dependencies: @@ -18093,13 +18432,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-http@0.52.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-http@0.220.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.25.1 - semver: 7.7.3 + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + forwarded-parse: 2.1.2 transitivePeerDependencies: - supports-color @@ -18123,59 +18462,55 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.52.1 - '@types/shimmer': 1.2.0 - import-in-the-middle: 1.15.0 - require-in-the-middle: 7.5.2 - semver: 7.7.4 - shimmer: 1.2.1 + '@opentelemetry/api-logs': 0.220.0 + import-in-the-middle: 3.3.3 + require-in-the-middle: 8.0.1 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.57.2 + '@opentelemetry/api-logs': 0.52.1 '@types/shimmer': 1.2.0 import-in-the-middle: 1.15.0 require-in-the-middle: 7.5.2 - semver: 7.7.4 + semver: 7.8.5 shimmer: 1.2.1 transitivePeerDependencies: - supports-color - '@opentelemetry/otlp-exporter-base@0.57.2(@opentelemetry/api@1.9.0)': + '@opentelemetry/otlp-exporter-base@0.220.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.220.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-grpc-exporter-base@0.57.2(@opentelemetry/api@1.9.0)': + '@opentelemetry/otlp-grpc-exporter-base@0.220.0(@opentelemetry/api@1.9.0)': dependencies: '@grpc/grpc-js': 1.14.4 '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.220.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer@0.57.2(@opentelemetry/api@1.9.0)': + '@opentelemetry/otlp-transformer@0.220.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.57.2 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - protobufjs: 7.6.5 + '@opentelemetry/api-logs': 0.220.0 + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.9.0(@opentelemetry/api@1.9.0) - '@opentelemetry/propagator-b3@1.30.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/propagator-b3@2.9.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.0) '@opentelemetry/propagator-jaeger@2.9.0(@opentelemetry/api@1.9.0)': dependencies: @@ -18188,60 +18523,82 @@ snapshots: '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.28.0 + '@opentelemetry/resources@2.10.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.10.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.38.0 - '@opentelemetry/resources@2.7.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/resources@2.8.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.38.0 - '@opentelemetry/sdk-logs@0.57.2(@opentelemetry/api@1.9.0)': + '@opentelemetry/resources@2.9.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.57.2 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 - '@opentelemetry/sdk-metrics@1.30.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-logs@0.219.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/api-logs': 0.219.0 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 - '@opentelemetry/sdk-metrics@2.7.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-logs@0.220.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.7.1(@opentelemetry/api@1.9.0) + '@opentelemetry/api-logs': 0.220.0 + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 - '@opentelemetry/sdk-node@0.57.2(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-metrics@2.9.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.57.2 - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-grpc': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-http': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-logs-otlp-proto': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-grpc': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-http': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-metrics-otlp-proto': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-prometheus': 0.217.0(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-grpc': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-http': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-trace-otlp-proto': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/exporter-zipkin': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-node': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.28.0 + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.9.0(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-node@0.220.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.220.0 + '@opentelemetry/configuration': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/context-async-hooks': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-grpc': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-http': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-logs-otlp-proto': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-grpc': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-http': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-metrics-otlp-proto': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-prometheus': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-grpc': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-http': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-proto': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-zipkin': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-b3': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-jaeger': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.220.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 transitivePeerDependencies: - supports-color @@ -18252,6 +18609,14 @@ snapshots: '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.28.0 + '@opentelemetry/sdk-trace-base@2.10.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.10.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.10.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.10.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -18259,15 +18624,20 @@ snapshots: '@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.38.0 - '@opentelemetry/sdk-trace-node@1.30.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-trace-base@2.9.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/propagator-b3': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/propagator-jaeger': 2.9.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - semver: 7.7.4 + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + + '@opentelemetry/sdk-trace-node@2.9.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.9.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0)': dependencies: @@ -18275,12 +18645,26 @@ snapshots: '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.2.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions@1.25.1': {} + '@opentelemetry/sdk-trace@2.10.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.10.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.10.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + + '@opentelemetry/sdk-trace@2.9.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.9.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 '@opentelemetry/semantic-conventions@1.28.0': {} '@opentelemetry/semantic-conventions@1.38.0': {} + '@opentelemetry/semantic-conventions@1.43.0': {} + '@oxc-parser/binding-android-arm-eabi@0.121.0': optional: true @@ -18389,7 +18773,7 @@ snapshots: dependencies: '@emnapi/core': 1.9.2 '@emnapi/runtime': 1.9.2 - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.2.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) optional: true '@oxc-parser/binding-win32-arm64-msvc@0.121.0': @@ -18421,94 +18805,94 @@ snapshots: '@oxc-resolver/binding-android-arm-eabi@11.14.0': optional: true - '@oxc-resolver/binding-android-arm-eabi@11.20.0': + '@oxc-resolver/binding-android-arm-eabi@11.24.2': optional: true '@oxc-resolver/binding-android-arm64@11.14.0': optional: true - '@oxc-resolver/binding-android-arm64@11.20.0': + '@oxc-resolver/binding-android-arm64@11.24.2': optional: true '@oxc-resolver/binding-darwin-arm64@11.14.0': optional: true - '@oxc-resolver/binding-darwin-arm64@11.20.0': + '@oxc-resolver/binding-darwin-arm64@11.24.2': optional: true '@oxc-resolver/binding-darwin-x64@11.14.0': optional: true - '@oxc-resolver/binding-darwin-x64@11.20.0': + '@oxc-resolver/binding-darwin-x64@11.24.2': optional: true '@oxc-resolver/binding-freebsd-x64@11.14.0': optional: true - '@oxc-resolver/binding-freebsd-x64@11.20.0': + '@oxc-resolver/binding-freebsd-x64@11.24.2': optional: true '@oxc-resolver/binding-linux-arm-gnueabihf@11.14.0': optional: true - '@oxc-resolver/binding-linux-arm-gnueabihf@11.20.0': + '@oxc-resolver/binding-linux-arm-gnueabihf@11.24.2': optional: true '@oxc-resolver/binding-linux-arm-musleabihf@11.14.0': optional: true - '@oxc-resolver/binding-linux-arm-musleabihf@11.20.0': + '@oxc-resolver/binding-linux-arm-musleabihf@11.24.2': optional: true '@oxc-resolver/binding-linux-arm64-gnu@11.14.0': optional: true - '@oxc-resolver/binding-linux-arm64-gnu@11.20.0': + '@oxc-resolver/binding-linux-arm64-gnu@11.24.2': optional: true '@oxc-resolver/binding-linux-arm64-musl@11.14.0': optional: true - '@oxc-resolver/binding-linux-arm64-musl@11.20.0': + '@oxc-resolver/binding-linux-arm64-musl@11.24.2': optional: true '@oxc-resolver/binding-linux-ppc64-gnu@11.14.0': optional: true - '@oxc-resolver/binding-linux-ppc64-gnu@11.20.0': + '@oxc-resolver/binding-linux-ppc64-gnu@11.24.2': optional: true '@oxc-resolver/binding-linux-riscv64-gnu@11.14.0': optional: true - '@oxc-resolver/binding-linux-riscv64-gnu@11.20.0': + '@oxc-resolver/binding-linux-riscv64-gnu@11.24.2': optional: true '@oxc-resolver/binding-linux-riscv64-musl@11.14.0': optional: true - '@oxc-resolver/binding-linux-riscv64-musl@11.20.0': + '@oxc-resolver/binding-linux-riscv64-musl@11.24.2': optional: true '@oxc-resolver/binding-linux-s390x-gnu@11.14.0': optional: true - '@oxc-resolver/binding-linux-s390x-gnu@11.20.0': + '@oxc-resolver/binding-linux-s390x-gnu@11.24.2': optional: true '@oxc-resolver/binding-linux-x64-gnu@11.14.0': optional: true - '@oxc-resolver/binding-linux-x64-gnu@11.20.0': + '@oxc-resolver/binding-linux-x64-gnu@11.24.2': optional: true '@oxc-resolver/binding-linux-x64-musl@11.14.0': optional: true - '@oxc-resolver/binding-linux-x64-musl@11.20.0': + '@oxc-resolver/binding-linux-x64-musl@11.24.2': optional: true - '@oxc-resolver/binding-openharmony-arm64@11.20.0': + '@oxc-resolver/binding-openharmony-arm64@11.24.2': optional: true '@oxc-resolver/binding-wasm32-wasi@11.14.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': @@ -18519,17 +18903,17 @@ snapshots: - '@emnapi/runtime' optional: true - '@oxc-resolver/binding-wasm32-wasi@11.20.0': + '@oxc-resolver/binding-wasm32-wasi@11.24.2': dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 + '@napi-rs/wasm-runtime': 1.2.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) optional: true '@oxc-resolver/binding-win32-arm64-msvc@11.14.0': optional: true - '@oxc-resolver/binding-win32-arm64-msvc@11.20.0': + '@oxc-resolver/binding-win32-arm64-msvc@11.24.2': optional: true '@oxc-resolver/binding-win32-ia32-msvc@11.14.0': @@ -18538,7 +18922,7 @@ snapshots: '@oxc-resolver/binding-win32-x64-msvc@11.14.0': optional: true - '@oxc-resolver/binding-win32-x64-msvc@11.20.0': + '@oxc-resolver/binding-win32-x64-msvc@11.24.2': optional: true '@paralleldrive/cuid2@2.3.1': @@ -18744,7 +19128,7 @@ snapshots: '@rc-component/async-validator@5.1.0': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 '@rc-component/cascader@1.14.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: @@ -18764,7 +19148,7 @@ snapshots: '@rc-component/collapse@1.2.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 '@rc-component/motion': 1.3.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@rc-component/util': 1.10.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) clsx: 2.1.1 @@ -18866,7 +19250,7 @@ snapshots: '@rc-component/mini-decimal@1.1.0': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 '@rc-component/motion@1.3.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: @@ -18891,7 +19275,7 @@ snapshots: '@rc-component/overflow@1.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 '@rc-component/resize-observer': 1.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@rc-component/util': 1.10.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) clsx: 2.1.1 @@ -18935,7 +19319,7 @@ snapshots: '@rc-component/qrcode@1.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 react: 19.2.8 react-dom: 19.2.8(react@19.2.8) @@ -18954,7 +19338,7 @@ snapshots: '@rc-component/segmented@1.3.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 '@rc-component/motion': 1.3.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@rc-component/util': 1.10.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) clsx: 2.1.1 @@ -19083,7 +19467,7 @@ snapshots: '@rc-component/virtual-list@1.0.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 '@rc-component/resize-observer': 1.1.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@rc-component/util': 1.10.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) clsx: 2.1.1 @@ -19166,11 +19550,19 @@ snapshots: - '@emnapi/runtime' optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-beta.55(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': + dependencies: + '@napi-rs/wasm-runtime': 1.1.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + optional: true + '@rolldown/binding-wasm32-wasi@1.0.3': dependencies: '@emnapi/core': 1.10.0 '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/wasm-runtime': 1.2.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.55': @@ -19199,9 +19591,9 @@ snapshots: '@rollup/pluginutils@5.3.0': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-walker: 2.0.2 - picomatch: 4.0.4 + picomatch: 4.0.5 '@sec-ant/readable-stream@0.4.1': {} @@ -19276,7 +19668,7 @@ snapshots: dependencies: '@serenity-js/core': 3.43.0 agent-base: 7.1.4 - axios: 1.18.1(supports-color@8.1.1) + axios: 1.19.0(supports-color@8.1.1) http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 11.3.6 @@ -19291,7 +19683,7 @@ snapshots: '@serenity-js/core': 3.43.0 '@serenity-js/rest': 3.43.0 ansi-regex: 5.0.1 - axios: 1.18.1(supports-color@8.1.1) + axios: 1.19.0(supports-color@8.1.1) chalk: 4.1.2 find-java-home: 2.0.0 progress: 2.0.3 @@ -19322,7 +19714,7 @@ snapshots: '@slorber/react-helmet-async@1.3.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 invariant: 2.2.4 prop-types: 15.8.1 react: 19.2.0 @@ -19344,7 +19736,7 @@ snapshots: '@sonar/scan@4.3.2(supports-color@8.1.1)': dependencies: adm-zip: 0.5.16 - axios: 1.18.1(supports-color@8.1.1) + axios: 1.19.0(supports-color@8.1.1) commander: 13.1.0 fs-extra: 11.3.2 hpagent: 1.2.0 @@ -19362,21 +19754,40 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@storybook/addon-a11y@10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))': + '@storybook/addon-a11y@10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))': dependencies: '@storybook/global': 5.0.0 axe-core: 4.11.0 - storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8) + + '@storybook/addon-docs@10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23))': + dependencies: + '@mdx-js/react': 3.1.1(@types/react@19.2.7)(react@19.2.8) + '@storybook/csf-plugin': 10.4.2(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) + '@storybook/icons': 2.1.0(react@19.2.8) + '@storybook/react-dom-shim': 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8)) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8) + ts-dedent: 2.2.0 + optionalDependencies: + '@types/react': 19.2.7 + transitivePeerDependencies: + - '@types/react-dom' + - esbuild + - rollup + - vite + - webpack - '@storybook/addon-docs@10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1))': + '@storybook/addon-docs@10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1))': dependencies: '@mdx-js/react': 3.1.1(@types/react@19.2.7)(react@19.2.8) - '@storybook/csf-plugin': 10.4.2(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) - '@storybook/icons': 2.0.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@storybook/react-dom-shim': 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + '@storybook/csf-plugin': 10.4.2(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) + '@storybook/icons': 2.1.0(react@19.2.8) + '@storybook/react-dom-shim': 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8)) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8) ts-dedent: 2.2.0 optionalDependencies: '@types/react': 19.2.7 @@ -19387,75 +19798,93 @@ snapshots: - vite - webpack - '@storybook/addon-onboarding@10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))': + '@storybook/addon-onboarding@10.4.2(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))': dependencies: - storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8) - '@storybook/addon-vitest@10.4.2(@vitest/browser-playwright@4.1.10)(@vitest/browser@4.1.10(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10))(@vitest/runner@4.1.10)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vitest@4.1.10)': + '@storybook/addon-vitest@10.4.2(@vitest/browser-playwright@4.1.10)(@vitest/browser@4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10))(@vitest/runner@4.1.10)(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vitest@4.1.10)': dependencies: '@storybook/global': 5.0.0 - '@storybook/icons': 2.0.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@storybook/icons': 2.1.0(react@19.2.8) + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8) optionalDependencies: - '@vitest/browser': 4.1.10(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10) - '@vitest/browser-playwright': 4.1.10(playwright@1.59.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10) + '@vitest/browser': 4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10) + '@vitest/browser-playwright': 4.1.10(playwright@1.59.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10) '@vitest/runner': 4.1.10 - vitest: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) transitivePeerDependencies: - react - - react-dom - '@storybook/builder-vite@10.4.2(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1))': + '@storybook/builder-vite@10.4.2(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23))': + dependencies: + '@storybook/csf-plugin': 10.4.2(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8) + ts-dedent: 2.2.0 + vite: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3) + transitivePeerDependencies: + - esbuild + - rollup + - webpack + + '@storybook/builder-vite@10.4.2(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1))': dependencies: - '@storybook/csf-plugin': 10.4.2(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) - storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@storybook/csf-plugin': 10.4.2(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8) ts-dedent: 2.2.0 - vite: 8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - esbuild - rollup - webpack - '@storybook/csf-plugin@10.4.2(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1))': + '@storybook/csf-plugin@10.4.2(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23))': + dependencies: + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8) + unplugin: 2.3.11 + optionalDependencies: + esbuild: 0.28.1 + vite: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3) + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) + + '@storybook/csf-plugin@10.4.2(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1))': dependencies: - storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8) unplugin: 2.3.11 optionalDependencies: esbuild: 0.28.1 - vite: 8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3) webpack: 5.105.4(esbuild@0.28.1) '@storybook/global@5.0.0': {} - '@storybook/icons@2.0.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@storybook/icons@2.1.0(react@19.2.8)': dependencies: react: 19.2.8 - react-dom: 19.2.8(react@19.2.8) - '@storybook/react-dom-shim@10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))': + '@storybook/react-dom-shim@10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))': dependencies: react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8) optionalDependencies: '@types/react': 19.2.7 '@types/react-dom': 19.2.3(@types/react@19.2.7) - '@storybook/react-vite@10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@6.0.3)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1))': + '@storybook/react-vite@10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(typescript@6.0.3)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(typescript@6.0.3)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(typescript@6.0.3)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) '@rollup/pluginutils': 5.3.0 - '@storybook/builder-vite': 10.4.2(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) - '@storybook/react': 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@6.0.3) + '@storybook/builder-vite': 10.4.2(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) + '@storybook/react': 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(typescript@6.0.3) empathic: 2.0.1 magic-string: 0.30.21 react: 19.2.8 react-docgen: 8.0.2 react-dom: 19.2.8(react@19.2.8) resolve: 1.22.11 - storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8) tsconfig-paths: 4.2.0 - vite: 8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - '@types/react' - '@types/react-dom' @@ -19465,15 +19894,39 @@ snapshots: - typescript - webpack - '@storybook/react@10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(typescript@6.0.3)': + '@storybook/react-vite@10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(typescript@6.0.3)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1))': + dependencies: + '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(typescript@6.0.3)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) + '@rollup/pluginutils': 5.3.0 + '@storybook/builder-vite': 10.4.2(esbuild@0.28.1)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.4(esbuild@0.28.1)) + '@storybook/react': 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(typescript@6.0.3) + empathic: 2.0.1 + magic-string: 0.30.21 + react: 19.2.8 + react-docgen: 8.0.2 + react-dom: 19.2.8(react@19.2.8) + resolve: 1.22.11 + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8) + tsconfig-paths: 4.2.0 + vite: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - esbuild + - rollup + - supports-color + - typescript + - webpack + + '@storybook/react@10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8))(typescript@6.0.3)': dependencies: '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)) + '@storybook/react-dom-shim': 10.4.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8)) react: 19.2.8 react-docgen: 8.0.2 react-docgen-typescript: 2.4.0(typescript@6.0.3) react-dom: 19.2.8(react@19.2.8) - storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + storybook: 10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8) optionalDependencies: '@types/react': 19.2.7 '@types/react-dom': 19.2.3(@types/react@19.2.7) @@ -19583,7 +20036,7 @@ snapshots: '@testing-library/dom@10.4.1': dependencies: '@babel/code-frame': 7.29.7 - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 '@types/aria-query': 5.0.4 aria-query: 5.3.0 dom-accessibility-api: 0.5.16 @@ -19620,7 +20073,7 @@ snapshots: '@types/react': 19.2.7 '@types/react-dom': 19.2.3(@types/react@19.2.7) - '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': + '@testing-library/user-event@14.6.4(@testing-library/dom@10.4.1)': dependencies: '@testing-library/dom': 10.4.1 @@ -19663,6 +20116,11 @@ snapshots: tslib: 2.8.1 optional: true + '@tybys/wasm-util@0.10.3': + dependencies: + tslib: 2.8.1 + optional: true + '@types/aria-query@5.0.4': {} '@types/babel__core@7.20.5': @@ -19689,11 +20147,11 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 24.10.1 + '@types/node': 22.19.15 '@types/bonjour@3.5.13': dependencies: - '@types/node': 24.10.1 + '@types/node': 22.19.15 '@types/chai@5.2.3': dependencies: @@ -19703,11 +20161,11 @@ snapshots: '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 5.1.0 - '@types/node': 24.10.1 + '@types/node': 22.19.15 '@types/connect@3.4.38': dependencies: - '@types/node': 24.10.1 + '@types/node': 22.19.15 '@types/debug@4.1.12': dependencies: @@ -19720,11 +20178,11 @@ snapshots: '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/eslint@9.6.1': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/json-schema': 7.0.15 '@types/estree-jsx@1.0.5': @@ -19733,16 +20191,18 @@ snapshots: '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} + '@types/express-serve-static-core@4.19.7': dependencies: - '@types/node': 24.10.1 + '@types/node': 22.19.15 '@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.10.1 + '@types/node': 22.19.15 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -19780,7 +20240,7 @@ snapshots: '@types/http-proxy@1.17.17': dependencies: - '@types/node': 24.10.1 + '@types/node': 22.19.15 '@types/istanbul-lib-coverage@2.0.6': {} @@ -19814,10 +20274,6 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/node@24.10.1': - dependencies: - undici-types: 7.16.0 - '@types/normalize-package-data@2.4.4': {} '@types/prismjs@1.26.5': {} @@ -19853,7 +20309,7 @@ snapshots: '@types/readable-stream@4.0.22': dependencies: - '@types/node': 24.10.1 + '@types/node': 22.19.15 '@types/resolve@1.20.6': {} @@ -19861,18 +20317,18 @@ snapshots: '@types/sax@1.2.7': dependencies: - '@types/node': 24.10.1 + '@types/node': 22.19.15 '@types/semver@7.7.1': {} '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 24.10.1 + '@types/node': 22.19.15 '@types/send@1.2.1': dependencies: - '@types/node': 24.10.1 + '@types/node': 22.19.15 '@types/serve-index@1.9.4': dependencies: @@ -19881,14 +20337,14 @@ snapshots: '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 24.10.1 + '@types/node': 22.19.15 '@types/send': 0.17.6 '@types/shimmer@1.2.0': {} '@types/sockjs@0.3.36': dependencies: - '@types/node': 24.10.1 + '@types/node': 22.19.15 '@types/triple-beam@1.3.5': {} @@ -19910,7 +20366,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 24.10.1 + '@types/node': 22.19.15 '@types/yargs-parser@21.0.3': {} @@ -19975,90 +20431,42 @@ snapshots: '@vercel/oidc@3.0.5': {} - '@vitejs/plugin-react@6.0.1(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))': + '@vitejs/plugin-react@6.0.1(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.7 - vite: 8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) - - '@vitest/browser-playwright@4.1.10(playwright@1.59.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10)': - dependencies: - '@vitest/browser': 4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10) - '@vitest/mocker': 4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) - playwright: 1.59.0 - tinyrainbow: 3.1.0 - vitest: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) - transitivePeerDependencies: - - bufferutil - - msw - - utf-8-validate - - vite - optional: true + vite: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3) - '@vitest/browser-playwright@4.1.10(playwright@1.59.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10)': + '@vitest/browser-playwright@4.1.10(playwright@1.59.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10)': dependencies: - '@vitest/browser': 4.1.10(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10) - '@vitest/mocker': 4.1.10(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + '@vitest/browser': 4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10) + '@vitest/mocker': 4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) playwright: 1.59.0 - tinyrainbow: 3.1.0 - vitest: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) - transitivePeerDependencies: - - bufferutil - - msw - - utf-8-validate - - vite - - '@vitest/browser@4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10)': - dependencies: - '@blazediff/core': 1.9.1 - '@vitest/mocker': 4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) - '@vitest/utils': 4.1.10 - magic-string: 0.30.21 - pngjs: 7.0.0 - sirv: 3.0.2 - tinyrainbow: 3.1.0 - vitest: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) - ws: 8.21.0 + tinyrainbow: 3.1.1 + vitest: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - optional: true - '@vitest/browser@4.1.10(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10)': + '@vitest/browser@4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10)': dependencies: '@blazediff/core': 1.9.1 - '@vitest/mocker': 4.1.10(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + '@vitest/mocker': 4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/utils': 4.1.10 magic-string: 0.30.21 pngjs: 7.0.0 sirv: 3.0.2 - tinyrainbow: 3.1.0 - vitest: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) - ws: 8.21.0 + tinyrainbow: 3.1.1 + vitest: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) + ws: 8.21.1 transitivePeerDependencies: - bufferutil - msw - - utf-8-validate - - vite - - '@vitest/coverage-istanbul@4.1.10(supports-color@8.1.1)(vitest@4.1.10)': - dependencies: - '@babel/core': 7.29.6(supports-color@8.1.1) - '@istanbuljs/schema': 0.1.3 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-reports: 3.2.0 - magicast: 0.5.2 - obug: 2.1.1 - tinyrainbow: 3.1.0 - vitest: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) - transitivePeerDependencies: - - supports-color + - utf-8-validate + - vite - '@vitest/coverage-istanbul@4.1.10(vitest@4.1.10)': + '@vitest/coverage-istanbul@4.1.10(supports-color@8.1.1)(vitest@4.1.10)': dependencies: '@babel/core': 7.29.6(supports-color@8.1.1) '@istanbuljs/schema': 0.1.3 @@ -20069,8 +20477,8 @@ snapshots: istanbul-reports: 3.2.0 magicast: 0.5.2 obug: 2.1.1 - tinyrainbow: 3.1.0 - vitest: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + tinyrainbow: 3.1.1 + vitest: 4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) transitivePeerDependencies: - supports-color @@ -20089,23 +20497,15 @@ snapshots: '@vitest/spy': 4.1.10 '@vitest/utils': 4.1.10 chai: 6.2.2 - tinyrainbow: 3.1.0 - - '@vitest/mocker@4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))': - dependencies: - '@vitest/spy': 4.1.10 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) + tinyrainbow: 3.1.1 - '@vitest/mocker@4.1.10(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))': + '@vitest/mocker@4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3) '@vitest/pretty-format@3.2.4': dependencies: @@ -20113,7 +20513,7 @@ snapshots: '@vitest/pretty-format@4.1.10': dependencies: - tinyrainbow: 3.1.0 + tinyrainbow: 3.1.1 '@vitest/runner@4.1.10': dependencies: @@ -20143,7 +20543,7 @@ snapshots: dependencies: '@vitest/pretty-format': 4.1.10 convert-source-map: 2.0.0 - tinyrainbow: 3.1.0 + tinyrainbow: 3.1.1 '@webassemblyjs/ast@1.14.1': dependencies: @@ -20282,20 +20682,26 @@ snapshots: dependencies: acorn: 8.16.0 - acorn-import-phases@1.0.4(acorn@8.16.0): + acorn-import-phases@1.0.4(acorn@8.18.0): dependencies: - acorn: 8.16.0 + acorn: 8.18.0 acorn-jsx@5.3.2(acorn@8.16.0): dependencies: acorn: 8.16.0 + acorn-jsx@5.3.2(acorn@8.18.0): + dependencies: + acorn: 8.18.0 + acorn-walk@8.3.4: dependencies: acorn: 8.16.0 acorn@8.16.0: {} + acorn@8.18.0: {} + address@1.2.2: {} adm-zip@0.5.16: {} @@ -20325,13 +20731,17 @@ snapshots: optionalDependencies: ajv: 8.18.0 + ajv-formats@2.1.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + ajv-keywords@3.5.2(ajv@6.14.0): dependencies: ajv: 6.14.0 - ajv-keywords@5.1.0(ajv@8.18.0): + ajv-keywords@5.1.0(ajv@8.20.0): dependencies: - ajv: 8.18.0 + ajv: 8.20.0 fast-deep-equal: 3.1.3 ajv@6.14.0: @@ -20348,6 +20758,13 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 4.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + algoliasearch-helper@3.26.1(algoliasearch@5.45.0): dependencies: '@algolia/events': 4.0.1 @@ -20408,7 +20825,7 @@ snapshots: '@ant-design/fast-color': 3.0.1 '@ant-design/icons': 6.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@ant-design/react-slick': 2.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 '@rc-component/cascader': 1.14.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@rc-component/checkbox': 2.0.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@rc-component/collapse': 1.2.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -20462,13 +20879,13 @@ snapshots: anymatch@3.1.3: dependencies: normalize-path: 3.0.0 - picomatch: 4.0.4 + picomatch: 4.0.5 - apollo-link-rest@0.9.0(@apollo/client@3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.0))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(graphql@16.12.0)(qs@6.15.2): + apollo-link-rest@0.9.0(@apollo/client@3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.1))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(graphql@16.12.0)(qs@6.16.0): dependencies: - '@apollo/client': 3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.0))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@apollo/client': 3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.1))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) graphql: 16.12.0 - qs: 6.15.2 + qs: 6.16.0 applicationinsights@2.9.8: dependencies: @@ -20490,7 +20907,7 @@ snapshots: archunit@2.1.63: dependencies: '@zerollup/ts-helpers': 1.7.18(typescript@5.9.3) - minimatch: 10.2.4 + minimatch: 10.2.5 plantuml-parser: 0.4.0 typescript: 5.9.3 @@ -20599,14 +21016,14 @@ snapshots: auto-bind@4.0.0: {} - autoprefixer@10.4.22(postcss@8.5.25): + autoprefixer@10.4.22(postcss@8.5.23): dependencies: browserslist: 4.28.8 - caniuse-lite: 1.0.30001777 + caniuse-lite: 1.0.30001810 fraction.js: 5.3.4 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: @@ -20617,7 +21034,7 @@ snapshots: axe-core@4.11.0: {} - axios@1.18.1(supports-color@8.1.1): + axios@1.19.0(supports-color@8.1.1): dependencies: follow-redirects: 1.16.0(debug@4.4.3) form-data: 4.0.6 @@ -20632,7 +21049,7 @@ snapshots: '@azure/ms-rest-js': 1.11.2 applicationinsights: 2.9.8 args: 5.0.3 - axios: 1.18.1(supports-color@8.1.1) + axios: 1.19.0(supports-color@8.1.1) etag: 1.8.1 express: 4.22.2 fs-extra: 11.3.2 @@ -20666,12 +21083,12 @@ snapshots: b4a@1.7.3: {} - babel-loader@9.2.1(@babel/core@7.29.6)(webpack@5.105.4(esbuild@0.28.1)): + babel-loader@9.2.1(@babel/core@7.29.6)(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)): dependencies: '@babel/core': 7.29.6(supports-color@8.1.1) find-cache-dir: 4.0.0 schema-utils: 4.3.3 - webpack: 5.105.4(esbuild@0.28.1) + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) babel-plugin-dynamic-import-node@2.3.3: dependencies: @@ -20748,7 +21165,7 @@ snapshots: http-errors: 2.0.1 iconv-lite: 0.7.3 on-finished: 2.4.1 - qs: 6.15.2 + qs: 6.16.0 raw-body: 3.0.2 type-is: 2.1.0 transitivePeerDependencies: @@ -20869,7 +21286,7 @@ snapshots: buffer-image-size@0.6.4: dependencies: - '@types/node': 24.10.1 + '@types/node': 22.19.15 buffer-xor@1.0.3: {} @@ -20972,12 +21389,10 @@ snapshots: caniuse-api@3.0.0: dependencies: browserslist: 4.28.8 - caniuse-lite: 1.0.30001777 + caniuse-lite: 1.0.30001810 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-lite@1.0.30001777: {} - caniuse-lite@1.0.30001810: {} capital-case@1.0.4: @@ -20991,7 +21406,7 @@ snapshots: chai@5.3.3: dependencies: assertion-error: 2.0.1 - check-error: 2.1.1 + check-error: 2.1.3 deep-eql: 5.0.2 loupe: 3.2.1 pathval: 2.0.1 @@ -21051,7 +21466,7 @@ snapshots: chardet@2.1.1: {} - check-error@2.1.1: {} + check-error@2.1.3: {} cheerio-select@2.1.0: dependencies: @@ -21086,7 +21501,7 @@ snapshots: chromatic@16.10.0: dependencies: - semver: 7.7.4 + semver: 7.8.5 chrome-devtools-mcp@1.3.0: {} @@ -21102,6 +21517,8 @@ snapshots: cjs-module-lexer@1.4.3: {} + cjs-module-lexer@2.2.1: {} + class-transformer@0.5.1: {} classnames@2.5.1: {} @@ -21313,7 +21730,7 @@ snapshots: copy-text-to-clipboard@3.2.2: {} - copy-webpack-plugin@11.0.0(webpack@5.105.4(esbuild@0.28.1)): + copy-webpack-plugin@11.0.0(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)): dependencies: fast-glob: 3.3.3 glob-parent: 6.0.2 @@ -21321,7 +21738,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.3.3 serialize-javascript: 7.0.5 - webpack: 5.105.4(esbuild@0.28.1) + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) core-js-compat@3.47.0: dependencies: @@ -21404,51 +21821,51 @@ snapshots: dependencies: type-fest: 1.4.0 - css-blank-pseudo@7.0.1(postcss@8.5.25): + css-blank-pseudo@7.0.1(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-selector-parser: 7.1.1 - css-declaration-sorter@7.3.0(postcss@8.5.25): + css-declaration-sorter@7.3.0(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 - css-has-pseudo@7.0.3(postcss@8.5.25): + css-has-pseudo@7.0.3(postcss@8.5.23): dependencies: '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.1) - postcss: 8.5.25 + postcss: 8.5.23 postcss-selector-parser: 7.1.1 postcss-value-parser: 4.2.0 - css-loader@6.11.0(webpack@5.105.4(esbuild@0.28.1)): + css-loader@6.11.0(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)): dependencies: - icss-utils: 5.1.0(postcss@8.5.25) - postcss: 8.5.25 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.25) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.25) - postcss-modules-scope: 3.2.1(postcss@8.5.25) - postcss-modules-values: 4.0.0(postcss@8.5.25) + icss-utils: 5.1.0(postcss@8.5.23) + postcss: 8.5.23 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.23) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.23) + postcss-modules-scope: 3.2.1(postcss@8.5.23) + postcss-modules-values: 4.0.0(postcss@8.5.23) postcss-value-parser: 4.2.0 - semver: 7.7.4 + semver: 7.8.5 optionalDependencies: - webpack: 5.105.4(esbuild@0.28.1) + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) - css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(esbuild@0.28.1)(webpack@5.105.4(esbuild@0.28.1)): + css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(esbuild@0.28.1)(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)): dependencies: '@jridgewell/trace-mapping': 0.3.31 - cssnano: 6.1.2(postcss@8.5.25) + cssnano: 6.1.2(postcss@8.5.23) jest-worker: 29.7.0 - postcss: 8.5.25 + postcss: 8.5.23 schema-utils: 4.3.3 serialize-javascript: 7.0.5 - webpack: 5.105.4(esbuild@0.28.1) + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) optionalDependencies: clean-css: 5.3.3 esbuild: 0.28.1 - css-prefers-color-scheme@10.0.0(postcss@8.5.25): + css-prefers-color-scheme@10.0.0(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 css-select@4.3.0: dependencies: @@ -21484,60 +21901,60 @@ snapshots: cssesc@3.0.0: {} - cssnano-preset-advanced@6.1.2(postcss@8.5.25): + cssnano-preset-advanced@6.1.2(postcss@8.5.23): dependencies: - autoprefixer: 10.4.22(postcss@8.5.25) + autoprefixer: 10.4.22(postcss@8.5.23) browserslist: 4.28.8 - cssnano-preset-default: 6.1.2(postcss@8.5.25) - postcss: 8.5.25 - postcss-discard-unused: 6.0.5(postcss@8.5.25) - postcss-merge-idents: 6.0.3(postcss@8.5.25) - postcss-reduce-idents: 6.0.3(postcss@8.5.25) - postcss-zindex: 6.0.2(postcss@8.5.25) + cssnano-preset-default: 6.1.2(postcss@8.5.23) + postcss: 8.5.23 + postcss-discard-unused: 6.0.5(postcss@8.5.23) + postcss-merge-idents: 6.0.3(postcss@8.5.23) + postcss-reduce-idents: 6.0.3(postcss@8.5.23) + postcss-zindex: 6.0.2(postcss@8.5.23) - cssnano-preset-default@6.1.2(postcss@8.5.25): + cssnano-preset-default@6.1.2(postcss@8.5.23): dependencies: browserslist: 4.28.8 - css-declaration-sorter: 7.3.0(postcss@8.5.25) - cssnano-utils: 4.0.2(postcss@8.5.25) - postcss: 8.5.25 - postcss-calc: 9.0.1(postcss@8.5.25) - postcss-colormin: 6.1.0(postcss@8.5.25) - postcss-convert-values: 6.1.0(postcss@8.5.25) - postcss-discard-comments: 6.0.2(postcss@8.5.25) - postcss-discard-duplicates: 6.0.3(postcss@8.5.25) - postcss-discard-empty: 6.0.3(postcss@8.5.25) - postcss-discard-overridden: 6.0.2(postcss@8.5.25) - postcss-merge-longhand: 6.0.5(postcss@8.5.25) - postcss-merge-rules: 6.1.1(postcss@8.5.25) - postcss-minify-font-values: 6.1.0(postcss@8.5.25) - postcss-minify-gradients: 6.0.3(postcss@8.5.25) - postcss-minify-params: 6.1.0(postcss@8.5.25) - postcss-minify-selectors: 6.0.4(postcss@8.5.25) - postcss-normalize-charset: 6.0.2(postcss@8.5.25) - postcss-normalize-display-values: 6.0.2(postcss@8.5.25) - postcss-normalize-positions: 6.0.2(postcss@8.5.25) - postcss-normalize-repeat-style: 6.0.2(postcss@8.5.25) - postcss-normalize-string: 6.0.2(postcss@8.5.25) - postcss-normalize-timing-functions: 6.0.2(postcss@8.5.25) - postcss-normalize-unicode: 6.1.0(postcss@8.5.25) - postcss-normalize-url: 6.0.2(postcss@8.5.25) - postcss-normalize-whitespace: 6.0.2(postcss@8.5.25) - postcss-ordered-values: 6.0.2(postcss@8.5.25) - postcss-reduce-initial: 6.1.0(postcss@8.5.25) - postcss-reduce-transforms: 6.0.2(postcss@8.5.25) - postcss-svgo: 6.0.3(postcss@8.5.25) - postcss-unique-selectors: 6.0.4(postcss@8.5.25) - - cssnano-utils@4.0.2(postcss@8.5.25): - dependencies: - postcss: 8.5.25 - - cssnano@6.1.2(postcss@8.5.25): - dependencies: - cssnano-preset-default: 6.1.2(postcss@8.5.25) + css-declaration-sorter: 7.3.0(postcss@8.5.23) + cssnano-utils: 4.0.2(postcss@8.5.23) + postcss: 8.5.23 + postcss-calc: 9.0.1(postcss@8.5.23) + postcss-colormin: 6.1.0(postcss@8.5.23) + postcss-convert-values: 6.1.0(postcss@8.5.23) + postcss-discard-comments: 6.0.2(postcss@8.5.23) + postcss-discard-duplicates: 6.0.3(postcss@8.5.23) + postcss-discard-empty: 6.0.3(postcss@8.5.23) + postcss-discard-overridden: 6.0.2(postcss@8.5.23) + postcss-merge-longhand: 6.0.5(postcss@8.5.23) + postcss-merge-rules: 6.1.1(postcss@8.5.23) + postcss-minify-font-values: 6.1.0(postcss@8.5.23) + postcss-minify-gradients: 6.0.3(postcss@8.5.23) + postcss-minify-params: 6.1.0(postcss@8.5.23) + postcss-minify-selectors: 6.0.4(postcss@8.5.23) + postcss-normalize-charset: 6.0.2(postcss@8.5.23) + postcss-normalize-display-values: 6.0.2(postcss@8.5.23) + postcss-normalize-positions: 6.0.2(postcss@8.5.23) + postcss-normalize-repeat-style: 6.0.2(postcss@8.5.23) + postcss-normalize-string: 6.0.2(postcss@8.5.23) + postcss-normalize-timing-functions: 6.0.2(postcss@8.5.23) + postcss-normalize-unicode: 6.1.0(postcss@8.5.23) + postcss-normalize-url: 6.0.2(postcss@8.5.23) + postcss-normalize-whitespace: 6.0.2(postcss@8.5.23) + postcss-ordered-values: 6.0.2(postcss@8.5.23) + postcss-reduce-initial: 6.1.0(postcss@8.5.23) + postcss-reduce-transforms: 6.0.2(postcss@8.5.23) + postcss-svgo: 6.0.3(postcss@8.5.23) + postcss-unique-selectors: 6.0.4(postcss@8.5.23) + + cssnano-utils@4.0.2(postcss@8.5.23): + dependencies: + postcss: 8.5.23 + + cssnano@6.1.2(postcss@8.5.23): + dependencies: + cssnano-preset-default: 6.1.2(postcss@8.5.23) lilconfig: 3.1.3 - postcss: 8.5.25 + postcss: 8.5.23 csso@5.0.5: dependencies: @@ -21611,7 +22028,7 @@ snapshots: default-browser-id@5.0.1: {} - default-browser@5.4.0: + default-browser@5.5.0: dependencies: bundle-name: 4.1.0 default-browser-id: 5.0.1 @@ -21682,7 +22099,7 @@ snapshots: diagnostic-channel@1.1.1: dependencies: - semver: 7.8.0 + semver: 7.8.5 didyoumean@1.2.2: {} @@ -21823,10 +22240,10 @@ snapshots: encodeurl@2.0.0: {} - enhanced-resolve@5.20.0: + enhanced-resolve@5.24.5: dependencies: graceful-fs: 4.2.11 - tapable: 2.3.0 + tapable: 2.3.3 entities@2.2.0: {} @@ -21921,12 +22338,16 @@ snapshots: es-errors@1.3.0: {} - es-module-lexer@2.0.0: {} + es-module-lexer@2.3.1: {} es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + es-set-tostringtag@2.1.0: dependencies: es-errors: 1.3.0 @@ -21952,7 +22373,7 @@ snapshots: esast-util-from-js@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 - acorn: 8.16.0 + acorn: 8.18.0 esast-util-from-estree: 2.0.0 vfile-message: 4.0.3 @@ -22016,7 +22437,7 @@ snapshots: estree-util-attach-comments@3.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-util-build-jsx@3.0.1: dependencies: @@ -22051,7 +22472,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esutils@2.0.3: {} @@ -22061,7 +22482,7 @@ snapshots: eval@0.1.8: dependencies: - '@types/node': 24.10.1 + '@types/node': 22.19.15 require-like: 0.1.2 event-target-shim@5.0.1: {} @@ -22140,7 +22561,7 @@ snapshots: parseurl: 1.3.3 path-to-regexp: 0.1.13 proxy-addr: 2.0.7 - qs: 6.15.2 + qs: 6.16.0 range-parser: 1.2.1 safe-buffer: 5.2.1 send: 0.19.0 @@ -22222,9 +22643,9 @@ snapshots: dependencies: walk-up-path: 4.0.0 - fdir@6.5.0(picomatch@4.0.4): + fdir@6.5.0(picomatch@4.0.5): optionalDependencies: - picomatch: 4.0.4 + picomatch: 4.0.5 fecha@4.2.3: {} @@ -22245,11 +22666,11 @@ snapshots: dependencies: is-unicode-supported: 2.1.0 - file-loader@6.2.0(webpack@5.105.4(esbuild@0.28.1)): + file-loader@6.2.0(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.105.4(esbuild@0.28.1) + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) filename-reserved-regex@2.0.0: {} @@ -22360,6 +22781,8 @@ snapshots: dependencies: fetch-blob: 3.2.0 + forwarded-parse@2.1.2: {} + forwarded@0.2.0: {} fraction.js@5.3.4: {} @@ -22408,7 +22831,7 @@ snapshots: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 function-bind: 1.1.2 get-proto: 1.0.1 gopd: 1.2.0 @@ -22421,7 +22844,7 @@ snapshots: get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 get-stdin@8.0.0: {} @@ -22438,7 +22861,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.13.0: + get-tsconfig@4.14.2: dependencies: resolve-pkg-maps: 1.0.0 @@ -22471,20 +22894,20 @@ snapshots: dependencies: foreground-child: 3.3.1 jackspeak: 4.1.1 - minimatch: 10.2.4 + minimatch: 10.2.5 minipass: 7.1.3 package-json-from-dist: 1.0.1 path-scurry: 2.0.2 glob@13.0.0: dependencies: - minimatch: 10.2.4 + minimatch: 10.2.5 minipass: 7.1.3 path-scurry: 2.0.2 glob@13.0.6: dependencies: - minimatch: 10.2.4 + minimatch: 10.2.5 minipass: 7.1.3 path-scurry: 2.0.2 @@ -22503,7 +22926,7 @@ snapshots: es6-error: 4.1.1 matcher: 3.0.0 roarr: 2.15.4 - semver: 7.7.4 + semver: 7.8.5 serialize-error: 7.0.1 global-dirs@3.0.1: @@ -22614,11 +23037,11 @@ snapshots: graphql: 16.12.0 tslib: 2.8.1 - graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.0): + graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.1): dependencies: graphql: 16.12.0 optionalDependencies: - ws: 8.21.0 + ws: 8.21.1 graphql@14.7.0: dependencies: @@ -22641,13 +23064,13 @@ snapshots: happy-dom@20.10.1: dependencies: - '@types/node': 24.10.1 + '@types/node': 22.19.15 '@types/whatwg-mimetype': 3.0.2 '@types/ws': 8.18.1 buffer-image-size: 0.6.4 entities: 7.0.1 whatwg-mimetype: 3.0.0 - ws: 8.21.0 + ws: 8.21.1 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -22695,10 +23118,6 @@ snapshots: inherits: 2.0.4 minimalistic-assert: 1.0.1 - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - hasown@2.0.4: dependencies: function-bind: 1.1.2 @@ -22736,7 +23155,7 @@ snapshots: hast-util-to-estree@3.1.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 @@ -22806,7 +23225,7 @@ snapshots: history@4.10.1: dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 loose-envify: 1.4.0 resolve-pathname: 3.0.0 tiny-invariant: 1.3.3 @@ -22866,7 +23285,7 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@5.6.5(webpack@5.105.4(esbuild@0.28.1)): + html-webpack-plugin@5.6.5(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -22874,7 +23293,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.3.0 optionalDependencies: - webpack: 5.105.4(esbuild@0.28.1) + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) htmlparser2@6.1.0: dependencies: @@ -22986,9 +23405,9 @@ snapshots: dependencies: safer-buffer: 2.1.2 - icss-utils@5.1.0(postcss@8.5.25): + icss-utils@5.1.0(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 ieee754@1.2.1: {} @@ -23019,6 +23438,12 @@ snapshots: cjs-module-lexer: 1.4.3 module-details-from-path: 1.0.4 + import-in-the-middle@3.3.3: + dependencies: + cjs-module-lexer: 2.2.1 + es-module-lexer: 2.3.1 + module-details-from-path: 1.0.4 + import-lazy@4.0.0: {} imurmurhash@0.1.4: {} @@ -23070,7 +23495,7 @@ snapshots: dependencies: es-errors: 1.3.0 hasown: 2.0.4 - side-channel: 1.1.0 + side-channel: 1.1.1 invariant@2.2.4: dependencies: @@ -23136,7 +23561,7 @@ snapshots: is-core-module@2.16.1: dependencies: - hasown: 2.0.2 + hasown: 2.0.4 is-data-view@1.0.2: dependencies: @@ -23305,7 +23730,7 @@ snapshots: dependencies: is-docker: 2.2.1 - is-wsl@3.1.0: + is-wsl@3.1.1: dependencies: is-inside-container: 1.0.0 @@ -23325,9 +23750,9 @@ snapshots: isomorphic-timers-promises@1.0.1: {} - isomorphic-ws@5.0.0(ws@8.21.0): + isomorphic-ws@5.0.0(ws@8.21.1): dependencies: - ws: 8.21.0 + ws: 8.21.1 istanbul-lib-coverage@3.2.2: {} @@ -23357,21 +23782,21 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.10.1 + '@types/node': 22.19.15 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 - picomatch: 4.0.4 + picomatch: 4.0.5 jest-worker@27.5.1: dependencies: - '@types/node': 24.10.1 + '@types/node': 22.19.15 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 24.10.1 + '@types/node': 22.19.15 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -23412,7 +23837,7 @@ snapshots: http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.22 + nwsapi: 2.2.24 parse5: 7.3.0 rrweb-cssom: 0.8.0 saxes: 6.0.0 @@ -23423,7 +23848,7 @@ snapshots: whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.2.0 - ws: 8.21.0 + ws: 8.21.1 xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil @@ -23482,7 +23907,7 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.8.0 + semver: 7.8.5 jwa@1.4.2: dependencies: @@ -23564,7 +23989,7 @@ snapshots: image-size: 0.5.5 make-dir: 2.1.0 mime: 1.6.0 - needle: 3.3.1 + needle: 3.5.0 source-map: 0.6.1 leven@2.1.0: {} @@ -23575,54 +24000,54 @@ snapshots: dependencies: immediate: 3.0.6 - lightningcss-android-arm64@1.32.0: + lightningcss-android-arm64@1.33.0: optional: true - lightningcss-darwin-arm64@1.32.0: + lightningcss-darwin-arm64@1.33.0: optional: true - lightningcss-darwin-x64@1.32.0: + lightningcss-darwin-x64@1.33.0: optional: true - lightningcss-freebsd-x64@1.32.0: + lightningcss-freebsd-x64@1.33.0: optional: true - lightningcss-linux-arm-gnueabihf@1.32.0: + lightningcss-linux-arm-gnueabihf@1.33.0: optional: true - lightningcss-linux-arm64-gnu@1.32.0: + lightningcss-linux-arm64-gnu@1.33.0: optional: true - lightningcss-linux-arm64-musl@1.32.0: + lightningcss-linux-arm64-musl@1.33.0: optional: true - lightningcss-linux-x64-gnu@1.32.0: + lightningcss-linux-x64-gnu@1.33.0: optional: true - lightningcss-linux-x64-musl@1.32.0: + lightningcss-linux-x64-musl@1.33.0: optional: true - lightningcss-win32-arm64-msvc@1.32.0: + lightningcss-win32-arm64-msvc@1.33.0: optional: true - lightningcss-win32-x64-msvc@1.32.0: + lightningcss-win32-x64-msvc@1.33.0: optional: true - lightningcss@1.32.0: + lightningcss@1.33.0: dependencies: detect-libc: 2.1.2 optionalDependencies: - lightningcss-android-arm64: 1.32.0 - lightningcss-darwin-arm64: 1.32.0 - lightningcss-darwin-x64: 1.32.0 - lightningcss-freebsd-x64: 1.32.0 - lightningcss-linux-arm-gnueabihf: 1.32.0 - lightningcss-linux-arm64-gnu: 1.32.0 - lightningcss-linux-arm64-musl: 1.32.0 - lightningcss-linux-x64-gnu: 1.32.0 - lightningcss-linux-x64-musl: 1.32.0 - lightningcss-win32-arm64-msvc: 1.32.0 - lightningcss-win32-x64-msvc: 1.32.0 + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 lilconfig@3.1.3: {} @@ -23639,7 +24064,7 @@ snapshots: through: 2.3.8 wrap-ansi: 7.0.0 - loader-runner@4.3.1: {} + loader-runner@4.3.2: {} loader-utils@2.0.4: dependencies: @@ -23746,8 +24171,6 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.3.5: {} - lru-cache@11.3.6: {} lru-cache@5.1.1: @@ -23784,7 +24207,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.8.0 + semver: 7.8.5 map-cache@0.2.2: {} @@ -24121,7 +24544,7 @@ snapshots: micromark-extension-mdx-expression@3.0.1: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 devlop: 1.1.0 micromark-factory-mdx-expression: 2.0.3 micromark-factory-space: 2.0.1 @@ -24132,7 +24555,7 @@ snapshots: micromark-extension-mdx-jsx@3.0.2: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 micromark-factory-mdx-expression: 2.0.3 @@ -24149,7 +24572,7 @@ snapshots: micromark-extension-mdxjs-esm@3.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-util-character: 2.1.1 @@ -24161,8 +24584,8 @@ snapshots: micromark-extension-mdxjs@3.0.0: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) micromark-extension-mdx-expression: 3.0.1 micromark-extension-mdx-jsx: 3.0.2 micromark-extension-mdx-md: 2.0.0 @@ -24185,7 +24608,7 @@ snapshots: micromark-factory-mdx-expression@2.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 devlop: 1.1.0 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 @@ -24259,7 +24682,7 @@ snapshots: micromark-util-events-to-acorn@2.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/unist': 3.0.3 devlop: 1.1.0 estree-util-visit: 2.0.0 @@ -24323,7 +24746,7 @@ snapshots: micromatch@4.0.8: dependencies: braces: 3.0.3 - picomatch: 4.0.4 + picomatch: 4.0.5 miller-rabin@4.0.1: dependencies: @@ -24360,20 +24783,16 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.9.4(webpack@5.105.4(esbuild@0.28.1)): + mini-css-extract-plugin@2.9.4(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)): dependencies: schema-utils: 4.3.3 tapable: 2.3.0 - webpack: 5.105.4(esbuild@0.28.1) + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) minimalistic-assert@1.0.1: {} minimalistic-crypto-utils@1.0.1: {} - minimatch@10.2.4: - dependencies: - brace-expansion: 5.0.9 - minimatch@10.2.5: dependencies: brace-expansion: 5.0.9 @@ -24415,7 +24834,7 @@ snapshots: https-proxy-agent: 7.0.6 mongodb: 6.21.0 new-find-package-json: 2.0.0(supports-color@8.1.1) - semver: 7.7.4 + semver: 7.8.5 tar-stream: 3.1.7 tslib: 2.8.1 yauzl: 3.2.1 @@ -24441,7 +24860,7 @@ snapshots: https-proxy-agent: 7.0.6 mongodb: 6.21.0 new-find-package-json: 2.0.0(supports-color@8.1.1) - semver: 7.7.4 + semver: 7.8.5 tar-stream: 3.1.7 tslib: 2.8.1 yauzl: 3.2.1 @@ -24590,10 +25009,10 @@ snapshots: native-duplexpair@1.0.0: {} - needle@3.3.1: + needle@3.5.0: dependencies: iconv-lite: 0.6.3 - sax: 1.5.0 + sax: 1.6.1 optional: true negotiator@0.6.3: {} @@ -24685,7 +25104,7 @@ snapshots: normalize-package-data@8.0.0: dependencies: hosted-git-info: 9.0.2 - semver: 7.8.0 + semver: 7.8.5 validate-npm-package-license: 3.0.4 normalize-path@2.1.1: @@ -24713,15 +25132,15 @@ snapshots: dependencies: boolbase: 1.0.0 - null-loader@4.0.1(webpack@5.105.4(esbuild@0.28.1)): + null-loader@4.0.1(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.105.4(esbuild@0.28.1) + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) nullthrows@1.1.1: {} - nwsapi@2.2.22: {} + nwsapi@2.2.24: {} object-assign@4.1.1: {} @@ -24777,7 +25196,7 @@ snapshots: open@10.2.0: dependencies: - default-browser: 5.4.0 + default-browser: 5.5.0 define-lazy-prop: 3.0.0 is-inside-container: 1.0.0 wsl-utils: 0.1.0 @@ -24895,27 +25314,27 @@ snapshots: - '@emnapi/core' - '@emnapi/runtime' - oxc-resolver@11.20.0: + oxc-resolver@11.24.2: optionalDependencies: - '@oxc-resolver/binding-android-arm-eabi': 11.20.0 - '@oxc-resolver/binding-android-arm64': 11.20.0 - '@oxc-resolver/binding-darwin-arm64': 11.20.0 - '@oxc-resolver/binding-darwin-x64': 11.20.0 - '@oxc-resolver/binding-freebsd-x64': 11.20.0 - '@oxc-resolver/binding-linux-arm-gnueabihf': 11.20.0 - '@oxc-resolver/binding-linux-arm-musleabihf': 11.20.0 - '@oxc-resolver/binding-linux-arm64-gnu': 11.20.0 - '@oxc-resolver/binding-linux-arm64-musl': 11.20.0 - '@oxc-resolver/binding-linux-ppc64-gnu': 11.20.0 - '@oxc-resolver/binding-linux-riscv64-gnu': 11.20.0 - '@oxc-resolver/binding-linux-riscv64-musl': 11.20.0 - '@oxc-resolver/binding-linux-s390x-gnu': 11.20.0 - '@oxc-resolver/binding-linux-x64-gnu': 11.20.0 - '@oxc-resolver/binding-linux-x64-musl': 11.20.0 - '@oxc-resolver/binding-openharmony-arm64': 11.20.0 - '@oxc-resolver/binding-wasm32-wasi': 11.20.0 - '@oxc-resolver/binding-win32-arm64-msvc': 11.20.0 - '@oxc-resolver/binding-win32-x64-msvc': 11.20.0 + '@oxc-resolver/binding-android-arm-eabi': 11.24.2 + '@oxc-resolver/binding-android-arm64': 11.24.2 + '@oxc-resolver/binding-darwin-arm64': 11.24.2 + '@oxc-resolver/binding-darwin-x64': 11.24.2 + '@oxc-resolver/binding-freebsd-x64': 11.24.2 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.24.2 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.24.2 + '@oxc-resolver/binding-linux-arm64-gnu': 11.24.2 + '@oxc-resolver/binding-linux-arm64-musl': 11.24.2 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.24.2 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.24.2 + '@oxc-resolver/binding-linux-riscv64-musl': 11.24.2 + '@oxc-resolver/binding-linux-s390x-gnu': 11.24.2 + '@oxc-resolver/binding-linux-x64-gnu': 11.24.2 + '@oxc-resolver/binding-linux-x64-musl': 11.24.2 + '@oxc-resolver/binding-openharmony-arm64': 11.24.2 + '@oxc-resolver/binding-wasm32-wasi': 11.24.2 + '@oxc-resolver/binding-win32-arm64-msvc': 11.24.2 + '@oxc-resolver/binding-win32-x64-msvc': 11.24.2 p-cancelable@3.0.0: {} @@ -24973,7 +25392,7 @@ snapshots: got: 12.6.1 registry-auth-token: 5.1.0 registry-url: 6.0.1 - semver: 7.8.0 + semver: 7.8.5 pad-right@0.2.2: dependencies: @@ -25087,7 +25506,7 @@ snapshots: path-scurry@2.0.2: dependencies: - lru-cache: 11.3.5 + lru-cache: 11.3.6 minipass: 7.1.3 path-to-regexp@0.1.13: {} @@ -25127,6 +25546,8 @@ snapshots: picomatch@4.0.4: {} + picomatch@4.0.5: {} + pify@2.3.0: {} pify@4.0.1: @@ -25181,429 +25602,429 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-attribute-case-insensitive@7.0.1(postcss@8.5.25): + postcss-attribute-case-insensitive@7.0.1(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-selector-parser: 7.1.1 - postcss-calc@9.0.1(postcss@8.5.25): + postcss-calc@9.0.1(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 - postcss-clamp@4.1.0(postcss@8.5.25): + postcss-clamp@4.1.0(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-color-functional-notation@7.0.12(postcss@8.5.25): + postcss-color-functional-notation@7.0.12(postcss@8.5.23): dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.25) - '@csstools/utilities': 2.0.0(postcss@8.5.25) - postcss: 8.5.25 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.23) + '@csstools/utilities': 2.0.0(postcss@8.5.23) + postcss: 8.5.23 - postcss-color-hex-alpha@10.0.0(postcss@8.5.25): + postcss-color-hex-alpha@10.0.0(postcss@8.5.23): dependencies: - '@csstools/utilities': 2.0.0(postcss@8.5.25) - postcss: 8.5.25 + '@csstools/utilities': 2.0.0(postcss@8.5.23) + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-color-rebeccapurple@10.0.0(postcss@8.5.25): + postcss-color-rebeccapurple@10.0.0(postcss@8.5.23): dependencies: - '@csstools/utilities': 2.0.0(postcss@8.5.25) - postcss: 8.5.25 + '@csstools/utilities': 2.0.0(postcss@8.5.23) + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-colormin@6.1.0(postcss@8.5.25): + postcss-colormin@6.1.0(postcss@8.5.23): dependencies: browserslist: 4.28.8 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-convert-values@6.1.0(postcss@8.5.25): + postcss-convert-values@6.1.0(postcss@8.5.23): dependencies: browserslist: 4.28.8 - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-custom-media@11.0.6(postcss@8.5.25): + postcss-custom-media@11.0.6(postcss@8.5.23): dependencies: '@csstools/cascade-layer-name-parser': 2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - postcss: 8.5.25 + postcss: 8.5.23 - postcss-custom-properties@14.0.6(postcss@8.5.25): + postcss-custom-properties@14.0.6(postcss@8.5.23): dependencies: '@csstools/cascade-layer-name-parser': 2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/utilities': 2.0.0(postcss@8.5.25) - postcss: 8.5.25 + '@csstools/utilities': 2.0.0(postcss@8.5.23) + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-custom-selectors@8.0.5(postcss@8.5.25): + postcss-custom-selectors@8.0.5(postcss@8.5.23): dependencies: '@csstools/cascade-layer-name-parser': 2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - postcss: 8.5.25 + postcss: 8.5.23 postcss-selector-parser: 7.1.1 - postcss-dir-pseudo-class@9.0.1(postcss@8.5.25): + postcss-dir-pseudo-class@9.0.1(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-selector-parser: 7.1.1 - postcss-discard-comments@6.0.2(postcss@8.5.25): + postcss-discard-comments@6.0.2(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 - postcss-discard-duplicates@6.0.3(postcss@8.5.25): + postcss-discard-duplicates@6.0.3(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 - postcss-discard-empty@6.0.3(postcss@8.5.25): + postcss-discard-empty@6.0.3(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 - postcss-discard-overridden@6.0.2(postcss@8.5.25): + postcss-discard-overridden@6.0.2(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 - postcss-discard-unused@6.0.5(postcss@8.5.25): + postcss-discard-unused@6.0.5(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-selector-parser: 6.1.2 - postcss-double-position-gradients@6.0.4(postcss@8.5.25): + postcss-double-position-gradients@6.0.4(postcss@8.5.23): dependencies: - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.25) - '@csstools/utilities': 2.0.0(postcss@8.5.25) - postcss: 8.5.25 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.23) + '@csstools/utilities': 2.0.0(postcss@8.5.23) + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-focus-visible@10.0.1(postcss@8.5.25): + postcss-focus-visible@10.0.1(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-selector-parser: 7.1.1 - postcss-focus-within@9.0.1(postcss@8.5.25): + postcss-focus-within@9.0.1(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-selector-parser: 7.1.1 - postcss-font-variant@5.0.0(postcss@8.5.25): + postcss-font-variant@5.0.0(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 - postcss-gap-properties@6.0.0(postcss@8.5.25): + postcss-gap-properties@6.0.0(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 - postcss-image-set-function@7.0.0(postcss@8.5.25): + postcss-image-set-function@7.0.0(postcss@8.5.23): dependencies: - '@csstools/utilities': 2.0.0(postcss@8.5.25) - postcss: 8.5.25 + '@csstools/utilities': 2.0.0(postcss@8.5.23) + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-import@15.1.0(postcss@8.5.25): + postcss-import@15.1.0(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.11 - postcss-js@4.1.0(postcss@8.5.25): + postcss-js@4.1.0(postcss@8.5.23): dependencies: camelcase-css: 2.0.1 - postcss: 8.5.25 + postcss: 8.5.23 - postcss-lab-function@7.0.12(postcss@8.5.25): + postcss-lab-function@7.0.12(postcss@8.5.23): dependencies: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.25) - '@csstools/utilities': 2.0.0(postcss@8.5.25) - postcss: 8.5.25 + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.23) + '@csstools/utilities': 2.0.0(postcss@8.5.23) + postcss: 8.5.23 - postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.25)(tsx@4.21.0)(yaml@2.8.3): + postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.23)(tsx@4.21.0)(yaml@2.8.3): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 2.6.1 - postcss: 8.5.25 + postcss: 8.5.23 tsx: 4.21.0 yaml: 2.8.3 - postcss-loader@7.3.4(postcss@8.5.25)(typescript@6.0.3)(webpack@5.105.4(esbuild@0.28.1)): + postcss-loader@7.3.4(postcss@8.5.23)(typescript@6.0.3)(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)): dependencies: cosmiconfig: 8.3.6(typescript@6.0.3) jiti: 2.6.1 - postcss: 8.5.25 - semver: 7.7.4 - webpack: 5.105.4(esbuild@0.28.1) + postcss: 8.5.23 + semver: 7.8.5 + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) transitivePeerDependencies: - typescript - postcss-logical@8.1.0(postcss@8.5.25): + postcss-logical@8.1.0(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-merge-idents@6.0.3(postcss@8.5.25): + postcss-merge-idents@6.0.3(postcss@8.5.23): dependencies: - cssnano-utils: 4.0.2(postcss@8.5.25) - postcss: 8.5.25 + cssnano-utils: 4.0.2(postcss@8.5.23) + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-merge-longhand@6.0.5(postcss@8.5.25): + postcss-merge-longhand@6.0.5(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 - stylehacks: 6.1.1(postcss@8.5.25) + stylehacks: 6.1.1(postcss@8.5.23) - postcss-merge-rules@6.1.1(postcss@8.5.25): + postcss-merge-rules@6.1.1(postcss@8.5.23): dependencies: browserslist: 4.28.8 caniuse-api: 3.0.0 - cssnano-utils: 4.0.2(postcss@8.5.25) - postcss: 8.5.25 + cssnano-utils: 4.0.2(postcss@8.5.23) + postcss: 8.5.23 postcss-selector-parser: 6.1.2 - postcss-minify-font-values@6.1.0(postcss@8.5.25): + postcss-minify-font-values@6.1.0(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-minify-gradients@6.0.3(postcss@8.5.25): + postcss-minify-gradients@6.0.3(postcss@8.5.23): dependencies: colord: 2.9.3 - cssnano-utils: 4.0.2(postcss@8.5.25) - postcss: 8.5.25 + cssnano-utils: 4.0.2(postcss@8.5.23) + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-minify-params@6.1.0(postcss@8.5.25): + postcss-minify-params@6.1.0(postcss@8.5.23): dependencies: browserslist: 4.28.8 - cssnano-utils: 4.0.2(postcss@8.5.25) - postcss: 8.5.25 + cssnano-utils: 4.0.2(postcss@8.5.23) + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-minify-selectors@6.0.4(postcss@8.5.25): + postcss-minify-selectors@6.0.4(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-selector-parser: 6.1.2 - postcss-modules-extract-imports@3.1.0(postcss@8.5.25): + postcss-modules-extract-imports@3.1.0(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 - postcss-modules-local-by-default@4.2.0(postcss@8.5.25): + postcss-modules-local-by-default@4.2.0(postcss@8.5.23): dependencies: - icss-utils: 5.1.0(postcss@8.5.25) - postcss: 8.5.25 + icss-utils: 5.1.0(postcss@8.5.23) + postcss: 8.5.23 postcss-selector-parser: 7.1.1 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.2.1(postcss@8.5.25): + postcss-modules-scope@3.2.1(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-selector-parser: 7.1.1 - postcss-modules-values@4.0.0(postcss@8.5.25): + postcss-modules-values@4.0.0(postcss@8.5.23): dependencies: - icss-utils: 5.1.0(postcss@8.5.25) - postcss: 8.5.25 + icss-utils: 5.1.0(postcss@8.5.23) + postcss: 8.5.23 - postcss-nested@6.2.0(postcss@8.5.25): + postcss-nested@6.2.0(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-selector-parser: 6.1.2 - postcss-nesting@13.0.2(postcss@8.5.25): + postcss-nesting@13.0.2(postcss@8.5.23): dependencies: '@csstools/selector-resolve-nested': 3.1.0(postcss-selector-parser@7.1.1) '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.1) - postcss: 8.5.25 + postcss: 8.5.23 postcss-selector-parser: 7.1.1 - postcss-normalize-charset@6.0.2(postcss@8.5.25): + postcss-normalize-charset@6.0.2(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 - postcss-normalize-display-values@6.0.2(postcss@8.5.25): + postcss-normalize-display-values@6.0.2(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-normalize-positions@6.0.2(postcss@8.5.25): + postcss-normalize-positions@6.0.2(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-normalize-repeat-style@6.0.2(postcss@8.5.25): + postcss-normalize-repeat-style@6.0.2(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-normalize-string@6.0.2(postcss@8.5.25): + postcss-normalize-string@6.0.2(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-normalize-timing-functions@6.0.2(postcss@8.5.25): + postcss-normalize-timing-functions@6.0.2(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-normalize-unicode@6.1.0(postcss@8.5.25): + postcss-normalize-unicode@6.1.0(postcss@8.5.23): dependencies: browserslist: 4.28.8 - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-normalize-url@6.0.2(postcss@8.5.25): + postcss-normalize-url@6.0.2(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-normalize-whitespace@6.0.2(postcss@8.5.25): + postcss-normalize-whitespace@6.0.2(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-opacity-percentage@3.0.0(postcss@8.5.25): + postcss-opacity-percentage@3.0.0(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 - postcss-ordered-values@6.0.2(postcss@8.5.25): + postcss-ordered-values@6.0.2(postcss@8.5.23): dependencies: - cssnano-utils: 4.0.2(postcss@8.5.25) - postcss: 8.5.25 + cssnano-utils: 4.0.2(postcss@8.5.23) + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-overflow-shorthand@6.0.0(postcss@8.5.25): + postcss-overflow-shorthand@6.0.0(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-page-break@3.0.4(postcss@8.5.25): + postcss-page-break@3.0.4(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 - postcss-place@10.0.0(postcss@8.5.25): + postcss-place@10.0.0(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-preset-env@10.4.0(postcss@8.5.25): - dependencies: - '@csstools/postcss-alpha-function': 1.0.1(postcss@8.5.25) - '@csstools/postcss-cascade-layers': 5.0.2(postcss@8.5.25) - '@csstools/postcss-color-function': 4.0.12(postcss@8.5.25) - '@csstools/postcss-color-function-display-p3-linear': 1.0.1(postcss@8.5.25) - '@csstools/postcss-color-mix-function': 3.0.12(postcss@8.5.25) - '@csstools/postcss-color-mix-variadic-function-arguments': 1.0.2(postcss@8.5.25) - '@csstools/postcss-content-alt-text': 2.0.8(postcss@8.5.25) - '@csstools/postcss-contrast-color-function': 2.0.12(postcss@8.5.25) - '@csstools/postcss-exponential-functions': 2.0.9(postcss@8.5.25) - '@csstools/postcss-font-format-keywords': 4.0.0(postcss@8.5.25) - '@csstools/postcss-gamut-mapping': 2.0.11(postcss@8.5.25) - '@csstools/postcss-gradients-interpolation-method': 5.0.12(postcss@8.5.25) - '@csstools/postcss-hwb-function': 4.0.12(postcss@8.5.25) - '@csstools/postcss-ic-unit': 4.0.4(postcss@8.5.25) - '@csstools/postcss-initial': 2.0.1(postcss@8.5.25) - '@csstools/postcss-is-pseudo-class': 5.0.3(postcss@8.5.25) - '@csstools/postcss-light-dark-function': 2.0.11(postcss@8.5.25) - '@csstools/postcss-logical-float-and-clear': 3.0.0(postcss@8.5.25) - '@csstools/postcss-logical-overflow': 2.0.0(postcss@8.5.25) - '@csstools/postcss-logical-overscroll-behavior': 2.0.0(postcss@8.5.25) - '@csstools/postcss-logical-resize': 3.0.0(postcss@8.5.25) - '@csstools/postcss-logical-viewport-units': 3.0.4(postcss@8.5.25) - '@csstools/postcss-media-minmax': 2.0.9(postcss@8.5.25) - '@csstools/postcss-media-queries-aspect-ratio-number-values': 3.0.5(postcss@8.5.25) - '@csstools/postcss-nested-calc': 4.0.0(postcss@8.5.25) - '@csstools/postcss-normalize-display-values': 4.0.0(postcss@8.5.25) - '@csstools/postcss-oklab-function': 4.0.12(postcss@8.5.25) - '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.25) - '@csstools/postcss-random-function': 2.0.1(postcss@8.5.25) - '@csstools/postcss-relative-color-syntax': 3.0.12(postcss@8.5.25) - '@csstools/postcss-scope-pseudo-class': 4.0.1(postcss@8.5.25) - '@csstools/postcss-sign-functions': 1.1.4(postcss@8.5.25) - '@csstools/postcss-stepped-value-functions': 4.0.9(postcss@8.5.25) - '@csstools/postcss-text-decoration-shorthand': 4.0.3(postcss@8.5.25) - '@csstools/postcss-trigonometric-functions': 4.0.9(postcss@8.5.25) - '@csstools/postcss-unset-value': 4.0.0(postcss@8.5.25) - autoprefixer: 10.4.22(postcss@8.5.25) + postcss-preset-env@10.4.0(postcss@8.5.23): + dependencies: + '@csstools/postcss-alpha-function': 1.0.1(postcss@8.5.23) + '@csstools/postcss-cascade-layers': 5.0.2(postcss@8.5.23) + '@csstools/postcss-color-function': 4.0.12(postcss@8.5.23) + '@csstools/postcss-color-function-display-p3-linear': 1.0.1(postcss@8.5.23) + '@csstools/postcss-color-mix-function': 3.0.12(postcss@8.5.23) + '@csstools/postcss-color-mix-variadic-function-arguments': 1.0.2(postcss@8.5.23) + '@csstools/postcss-content-alt-text': 2.0.8(postcss@8.5.23) + '@csstools/postcss-contrast-color-function': 2.0.12(postcss@8.5.23) + '@csstools/postcss-exponential-functions': 2.0.9(postcss@8.5.23) + '@csstools/postcss-font-format-keywords': 4.0.0(postcss@8.5.23) + '@csstools/postcss-gamut-mapping': 2.0.11(postcss@8.5.23) + '@csstools/postcss-gradients-interpolation-method': 5.0.12(postcss@8.5.23) + '@csstools/postcss-hwb-function': 4.0.12(postcss@8.5.23) + '@csstools/postcss-ic-unit': 4.0.4(postcss@8.5.23) + '@csstools/postcss-initial': 2.0.1(postcss@8.5.23) + '@csstools/postcss-is-pseudo-class': 5.0.3(postcss@8.5.23) + '@csstools/postcss-light-dark-function': 2.0.11(postcss@8.5.23) + '@csstools/postcss-logical-float-and-clear': 3.0.0(postcss@8.5.23) + '@csstools/postcss-logical-overflow': 2.0.0(postcss@8.5.23) + '@csstools/postcss-logical-overscroll-behavior': 2.0.0(postcss@8.5.23) + '@csstools/postcss-logical-resize': 3.0.0(postcss@8.5.23) + '@csstools/postcss-logical-viewport-units': 3.0.4(postcss@8.5.23) + '@csstools/postcss-media-minmax': 2.0.9(postcss@8.5.23) + '@csstools/postcss-media-queries-aspect-ratio-number-values': 3.0.5(postcss@8.5.23) + '@csstools/postcss-nested-calc': 4.0.0(postcss@8.5.23) + '@csstools/postcss-normalize-display-values': 4.0.0(postcss@8.5.23) + '@csstools/postcss-oklab-function': 4.0.12(postcss@8.5.23) + '@csstools/postcss-progressive-custom-properties': 4.2.1(postcss@8.5.23) + '@csstools/postcss-random-function': 2.0.1(postcss@8.5.23) + '@csstools/postcss-relative-color-syntax': 3.0.12(postcss@8.5.23) + '@csstools/postcss-scope-pseudo-class': 4.0.1(postcss@8.5.23) + '@csstools/postcss-sign-functions': 1.1.4(postcss@8.5.23) + '@csstools/postcss-stepped-value-functions': 4.0.9(postcss@8.5.23) + '@csstools/postcss-text-decoration-shorthand': 4.0.3(postcss@8.5.23) + '@csstools/postcss-trigonometric-functions': 4.0.9(postcss@8.5.23) + '@csstools/postcss-unset-value': 4.0.0(postcss@8.5.23) + autoprefixer: 10.4.22(postcss@8.5.23) browserslist: 4.28.8 - css-blank-pseudo: 7.0.1(postcss@8.5.25) - css-has-pseudo: 7.0.3(postcss@8.5.25) - css-prefers-color-scheme: 10.0.0(postcss@8.5.25) + css-blank-pseudo: 7.0.1(postcss@8.5.23) + css-has-pseudo: 7.0.3(postcss@8.5.23) + css-prefers-color-scheme: 10.0.0(postcss@8.5.23) cssdb: 8.4.3 - postcss: 8.5.25 - postcss-attribute-case-insensitive: 7.0.1(postcss@8.5.25) - postcss-clamp: 4.1.0(postcss@8.5.25) - postcss-color-functional-notation: 7.0.12(postcss@8.5.25) - postcss-color-hex-alpha: 10.0.0(postcss@8.5.25) - postcss-color-rebeccapurple: 10.0.0(postcss@8.5.25) - postcss-custom-media: 11.0.6(postcss@8.5.25) - postcss-custom-properties: 14.0.6(postcss@8.5.25) - postcss-custom-selectors: 8.0.5(postcss@8.5.25) - postcss-dir-pseudo-class: 9.0.1(postcss@8.5.25) - postcss-double-position-gradients: 6.0.4(postcss@8.5.25) - postcss-focus-visible: 10.0.1(postcss@8.5.25) - postcss-focus-within: 9.0.1(postcss@8.5.25) - postcss-font-variant: 5.0.0(postcss@8.5.25) - postcss-gap-properties: 6.0.0(postcss@8.5.25) - postcss-image-set-function: 7.0.0(postcss@8.5.25) - postcss-lab-function: 7.0.12(postcss@8.5.25) - postcss-logical: 8.1.0(postcss@8.5.25) - postcss-nesting: 13.0.2(postcss@8.5.25) - postcss-opacity-percentage: 3.0.0(postcss@8.5.25) - postcss-overflow-shorthand: 6.0.0(postcss@8.5.25) - postcss-page-break: 3.0.4(postcss@8.5.25) - postcss-place: 10.0.0(postcss@8.5.25) - postcss-pseudo-class-any-link: 10.0.1(postcss@8.5.25) - postcss-replace-overflow-wrap: 4.0.0(postcss@8.5.25) - postcss-selector-not: 8.0.1(postcss@8.5.25) - - postcss-pseudo-class-any-link@10.0.1(postcss@8.5.25): - dependencies: - postcss: 8.5.25 + postcss: 8.5.23 + postcss-attribute-case-insensitive: 7.0.1(postcss@8.5.23) + postcss-clamp: 4.1.0(postcss@8.5.23) + postcss-color-functional-notation: 7.0.12(postcss@8.5.23) + postcss-color-hex-alpha: 10.0.0(postcss@8.5.23) + postcss-color-rebeccapurple: 10.0.0(postcss@8.5.23) + postcss-custom-media: 11.0.6(postcss@8.5.23) + postcss-custom-properties: 14.0.6(postcss@8.5.23) + postcss-custom-selectors: 8.0.5(postcss@8.5.23) + postcss-dir-pseudo-class: 9.0.1(postcss@8.5.23) + postcss-double-position-gradients: 6.0.4(postcss@8.5.23) + postcss-focus-visible: 10.0.1(postcss@8.5.23) + postcss-focus-within: 9.0.1(postcss@8.5.23) + postcss-font-variant: 5.0.0(postcss@8.5.23) + postcss-gap-properties: 6.0.0(postcss@8.5.23) + postcss-image-set-function: 7.0.0(postcss@8.5.23) + postcss-lab-function: 7.0.12(postcss@8.5.23) + postcss-logical: 8.1.0(postcss@8.5.23) + postcss-nesting: 13.0.2(postcss@8.5.23) + postcss-opacity-percentage: 3.0.0(postcss@8.5.23) + postcss-overflow-shorthand: 6.0.0(postcss@8.5.23) + postcss-page-break: 3.0.4(postcss@8.5.23) + postcss-place: 10.0.0(postcss@8.5.23) + postcss-pseudo-class-any-link: 10.0.1(postcss@8.5.23) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.5.23) + postcss-selector-not: 8.0.1(postcss@8.5.23) + + postcss-pseudo-class-any-link@10.0.1(postcss@8.5.23): + dependencies: + postcss: 8.5.23 postcss-selector-parser: 7.1.1 - postcss-reduce-idents@6.0.3(postcss@8.5.25): + postcss-reduce-idents@6.0.3(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-reduce-initial@6.1.0(postcss@8.5.25): + postcss-reduce-initial@6.1.0(postcss@8.5.23): dependencies: browserslist: 4.28.8 caniuse-api: 3.0.0 - postcss: 8.5.25 + postcss: 8.5.23 - postcss-reduce-transforms@6.0.2(postcss@8.5.25): + postcss-reduce-transforms@6.0.2(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 - postcss-replace-overflow-wrap@4.0.0(postcss@8.5.25): + postcss-replace-overflow-wrap@4.0.0(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 - postcss-selector-not@8.0.1(postcss@8.5.25): + postcss-selector-not@8.0.1(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-selector-parser: 7.1.1 postcss-selector-parser@6.1.2: @@ -25616,29 +26037,29 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-sort-media-queries@5.2.0(postcss@8.5.25): + postcss-sort-media-queries@5.2.0(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 sort-css-media-queries: 2.2.0 - postcss-svgo@6.0.3(postcss@8.5.25): + postcss-svgo@6.0.3(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-value-parser: 4.2.0 svgo: 3.3.4 - postcss-unique-selectors@6.0.4(postcss@8.5.25): + postcss-unique-selectors@6.0.4(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 postcss-selector-parser: 6.1.2 postcss-value-parser@4.2.0: {} - postcss-zindex@6.0.2(postcss@8.5.25): + postcss-zindex@6.0.2(postcss@8.5.23): dependencies: - postcss: 8.5.25 + postcss: 8.5.23 - postcss@8.5.25: + postcss@8.5.23: dependencies: nanoid: 3.3.18 picocolors: 1.1.1 @@ -25711,7 +26132,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.1 - '@types/node': 24.10.1 + '@types/node': 22.19.15 long: 5.3.2 proxy-addr@2.0.7: @@ -25753,9 +26174,10 @@ snapshots: pvutils@1.1.5: {} - qs@6.15.2: + qs@6.16.0: dependencies: - side-channel: 1.1.0 + es-define-property: 1.0.1 + side-channel: 1.1.1 querystring-es3@0.2.1: {} @@ -25782,12 +26204,12 @@ snapshots: dependencies: bytes: 3.1.2 http-errors: 2.0.1 - iconv-lite: 0.7.0 + iconv-lite: 0.7.3 unpipe: 1.0.0 rc-resize-observer@1.4.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 classnames: 2.5.1 rc-util: 5.44.4(react-dom@19.2.8(react@19.2.8))(react@19.2.8) react: 19.2.8 @@ -25796,7 +26218,7 @@ snapshots: rc-util@5.44.4(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 react: 19.2.8 react-dom: 19.2.8(react@19.2.8) react-is: 18.3.1 @@ -25815,8 +26237,8 @@ snapshots: react-docgen@8.0.2: dependencies: '@babel/core': 7.29.6(supports-color@8.1.1) - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@babel/types': 7.29.7 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 '@types/doctrine': 0.0.9 @@ -25849,11 +26271,11 @@ snapshots: dependencies: react: 19.2.0 - react-loadable-ssr-addon-v5-slorber@1.0.3(@docusaurus/react-loadable@6.0.0(react@19.2.0))(webpack@5.105.4(esbuild@0.28.1)): + react-loadable-ssr-addon-v5-slorber@1.0.3(@docusaurus/react-loadable@6.0.0(react@19.2.0))(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)): dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 react-loadable: '@docusaurus/react-loadable@6.0.0(react@19.2.0)' - webpack: 5.105.4(esbuild@0.28.1) + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) react-oidc-context@3.3.0(oidc-client-ts@3.4.1)(react@19.2.8): dependencies: @@ -25862,13 +26284,13 @@ snapshots: react-router-config@5.1.1(react-router@5.3.4(react@19.2.0))(react@19.2.0): dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 react: 19.2.0 react-router: 5.3.4(react@19.2.0) react-router-dom@5.3.4(react@19.2.0): dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 history: 4.10.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -25885,7 +26307,7 @@ snapshots: react-router@5.3.4(react@19.2.0): dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 history: 4.10.1 hoist-non-react-statics: 3.3.2 loose-envify: 1.4.0 @@ -25957,9 +26379,9 @@ snapshots: readdirp@3.6.0: dependencies: - picomatch: 4.0.4 + picomatch: 4.0.5 - recast@0.23.11: + recast@0.23.21: dependencies: ast-types: 0.16.1 esprima: 4.0.1 @@ -25984,7 +26406,7 @@ snapshots: recma-parse@1.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esast-util-from-js: 2.0.1 unified: 11.0.5 vfile: 6.0.3 @@ -26009,7 +26431,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.24.0 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 @@ -26081,7 +26503,7 @@ snapshots: relay-runtime@12.0.0: dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.29.7 fbjs: 3.0.5 invariant: 2.2.4 transitivePeerDependencies: @@ -26184,6 +26606,13 @@ snapshots: transitivePeerDependencies: - supports-color + require-in-the-middle@8.0.1: + dependencies: + debug: 4.4.3(supports-color@8.1.1) + module-details-from-path: 1.0.4 + transitivePeerDependencies: + - supports-color + require-like@0.1.2: {} requires-port@1.0.0: {} @@ -26273,6 +26702,28 @@ snapshots: - '@emnapi/core' - '@emnapi/runtime' + rolldown@1.0.0-beta.55(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2): + dependencies: + '@oxc-project/types': 0.103.0 + '@rolldown/pluginutils': 1.0.0-beta.55 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.55 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.55 + '@rolldown/binding-darwin-x64': 1.0.0-beta.55 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.55 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.55 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.55 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.55 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.55 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.55 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.55 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.55(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.55 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.55 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + rolldown@1.0.3: dependencies: '@oxc-project/types': 0.133.0 @@ -26309,7 +26760,7 @@ snapshots: dependencies: escalade: 3.2.0 picocolors: 1.1.1 - postcss: 8.5.25 + postcss: 8.5.23 strip-json-comments: 3.1.1 run-applescript@7.1.0: {} @@ -26353,6 +26804,9 @@ snapshots: sax@1.5.0: {} + sax@1.6.1: + optional: true + saxes@6.0.0: dependencies: xmlchars: 2.2.0 @@ -26370,9 +26824,9 @@ snapshots: schema-utils@4.3.3: dependencies: '@types/json-schema': 7.0.15 - ajv: 8.18.0 - ajv-formats: 2.1.1(ajv@8.18.0) - ajv-keywords: 5.1.0(ajv@8.18.0) + ajv: 8.20.0 + ajv-formats: 2.1.1(ajv@8.20.0) + ajv-keywords: 5.1.0(ajv@8.20.0) scroll-into-view-if-needed@3.1.0: dependencies: @@ -26400,7 +26854,7 @@ snapshots: semver-diff@4.0.0: dependencies: - semver: 7.7.4 + semver: 7.8.5 semver@5.7.2: {} @@ -26408,12 +26862,12 @@ snapshots: semver@7.7.2: {} - semver@7.7.3: {} - semver@7.7.4: {} semver@7.8.0: {} + semver@7.8.5: {} + send@0.19.0: dependencies: debug: 2.6.9 @@ -26454,7 +26908,7 @@ snapshots: moment-timezone: 0.5.48 pg-connection-string: 2.9.1 retry-as-promised: 7.1.1 - semver: 7.8.0 + semver: 7.8.5 sequelize-pool: 7.1.0 toposort-class: 1.0.1 uuid: 8.3.2 @@ -26555,7 +27009,7 @@ snapshots: shimmer@1.2.1: {} - side-channel-list@1.0.0: + side-channel-list@1.0.1: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 @@ -26575,11 +27029,11 @@ snapshots: object-inspect: 1.13.4 side-channel-map: 1.0.1 - side-channel@1.1.0: + side-channel@1.1.1: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 - side-channel-list: 1.0.0 + side-channel-list: 1.0.1 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 @@ -26755,36 +27209,35 @@ snapshots: stoppable@1.1.0: {} - storybook-addon-apollo-client@9.0.0(@apollo/client@3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.0))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(graphql@16.12.0)(react@19.2.8): + storybook-addon-apollo-client@9.0.0(@apollo/client@3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.1))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(graphql@16.12.0)(react@19.2.8): dependencies: - '@apollo/client': 3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.0))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@apollo/client': 3.14.0(@types/react@19.2.7)(graphql-ws@6.0.6(graphql@16.12.0)(ws@8.21.1))(graphql@16.12.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) graphql: 16.12.0 react: 19.2.8 - storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + storybook@10.4.2(@testing-library/dom@10.4.1)(@types/react@19.2.7)(react@19.2.8): dependencies: '@storybook/global': 5.0.0 - '@storybook/icons': 2.0.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@storybook/icons': 2.1.0(react@19.2.8) '@testing-library/jest-dom': 6.9.1 - '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) + '@testing-library/user-event': 14.6.4(@testing-library/dom@10.4.1) '@vitest/expect': 3.2.4 '@vitest/spy': 3.2.4 '@webcontainer/env': 1.1.1 esbuild: 0.28.1 open: 10.2.0 oxc-parser: 0.127.0 - oxc-resolver: 11.20.0 - recast: 0.23.11 - semver: 7.8.0 + oxc-resolver: 11.24.2 + recast: 0.23.21 + semver: 7.8.5 use-sync-external-store: 1.6.0(react@19.2.8) - ws: 8.21.0 + ws: 8.21.1 optionalDependencies: '@types/react': 19.2.7 transitivePeerDependencies: - '@testing-library/dom' - bufferutil - react - - react-dom - utf-8-validate stream-browserify@3.0.0: @@ -26915,10 +27368,10 @@ snapshots: dependencies: inline-style-parser: 0.2.7 - stylehacks@6.1.1(postcss@8.5.25): + stylehacks@6.1.1(postcss@8.5.23): dependencies: browserslist: 4.28.8 - postcss: 8.5.25 + postcss: 8.5.23 postcss-selector-parser: 6.1.2 stylis@4.3.6: {} @@ -27003,11 +27456,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.25 - postcss-import: 15.1.0(postcss@8.5.25) - postcss-js: 4.1.0(postcss@8.5.25) - postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.25)(tsx@4.21.0)(yaml@2.8.3) - postcss-nested: 6.2.0(postcss@8.5.25) + postcss: 8.5.23 + postcss-import: 15.1.0(postcss@8.5.23) + postcss-js: 4.1.0(postcss@8.5.23) + postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.23)(tsx@4.21.0)(yaml@2.8.3) + postcss-nested: 6.2.0(postcss@8.5.23) postcss-selector-parser: 6.1.2 resolve: 1.22.11 sucrase: 3.35.1 @@ -27017,6 +27470,8 @@ snapshots: tapable@2.3.0: {} + tapable@2.3.3: {} + tar-stream@3.1.7: dependencies: b4a: 1.7.3 @@ -27042,20 +27497,52 @@ snapshots: transitivePeerDependencies: - supports-color - terser-webpack-plugin@5.4.0(esbuild@0.28.1)(webpack@5.105.4(esbuild@0.28.1)): + terser-webpack-plugin@5.4.0(esbuild@0.28.1)(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 terser: 5.44.1 + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) + optionalDependencies: + esbuild: 0.28.1 + + terser-webpack-plugin@5.6.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + terser: 5.50.0 + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) + optionalDependencies: + clean-css: 5.3.3 + cssnano: 6.1.2(postcss@8.5.23) + esbuild: 0.28.1 + html-minifier-terser: 7.2.0 + postcss: 8.5.23 + + terser-webpack-plugin@5.6.1(esbuild@0.28.1)(webpack@5.105.4(esbuild@0.28.1)): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + terser: 5.50.0 webpack: 5.105.4(esbuild@0.28.1) optionalDependencies: esbuild: 0.28.1 + optional: true terser@5.44.1: dependencies: '@jridgewell/source-map': 0.3.11 - acorn: 8.16.0 + acorn: 8.18.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + terser@5.50.0: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.18.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -27063,13 +27550,13 @@ snapshots: dependencies: '@istanbuljs/schema': 0.1.3 glob: 10.5.0 - minimatch: 10.2.4 + minimatch: 10.2.5 test-exclude@8.0.0: dependencies: '@istanbuljs/schema': 0.1.3 glob: 13.0.6 - minimatch: 10.2.4 + minimatch: 10.2.5 text-decoder@1.2.3: dependencies: @@ -27124,14 +27611,14 @@ snapshots: tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 tinypool@1.1.1: {} tinyrainbow@2.0.0: {} - tinyrainbow@3.1.0: {} + tinyrainbow@3.1.1: {} tinyspy@4.0.4: {} @@ -27237,7 +27724,7 @@ snapshots: tsx@4.21.0: dependencies: esbuild: 0.28.1 - get-tsconfig: 4.13.0 + get-tsconfig: 4.14.2 optionalDependencies: fsevents: 2.3.3 @@ -27337,8 +27824,6 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.16.0: {} - unicode-canonical-property-names-ecmascript@2.0.1: {} unicode-emoji-modifier-base@1.0.0: {} @@ -27410,8 +27895,8 @@ snapshots: unplugin@2.3.11: dependencies: '@jridgewell/remapping': 2.3.5 - acorn: 8.16.0 - picomatch: 4.0.4 + acorn: 8.18.0 + picomatch: 4.0.5 webpack-virtual-modules: 0.6.2 upath@2.0.1: {} @@ -27435,7 +27920,7 @@ snapshots: is-yarn-global: 0.4.1 latest-version: 7.0.0 pupa: 3.3.0 - semver: 7.7.4 + semver: 7.8.5 semver-diff: 4.0.0 xdg-basedir: 5.1.0 @@ -27453,14 +27938,14 @@ snapshots: uri-templates@0.2.0: {} - url-loader@4.1.1(file-loader@6.2.0(webpack@5.105.4(esbuild@0.28.1)))(webpack@5.105.4(esbuild@0.28.1)): + url-loader@4.1.1(file-loader@6.2.0(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)))(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)): dependencies: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.105.4(esbuild@0.28.1) + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) optionalDependencies: - file-loader: 6.2.0(webpack@5.105.4(esbuild@0.28.1)) + file-loader: 6.2.0(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) url-parse@1.5.10: dependencies: @@ -27470,7 +27955,7 @@ snapshots: url@0.11.4: dependencies: punycode: 1.4.1 - qs: 6.15.2 + qs: 6.16.0 urlpattern-polyfill@10.1.0: {} @@ -27546,19 +28031,19 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-plugin-node-polyfills@0.28.0(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)): + vite-plugin-node-polyfills@0.28.0(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@rollup/plugin-inject': 5.0.5 node-stdlib-browser: 1.3.1 - vite: 8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - rollup - vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3): + vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3): dependencies: - lightningcss: 1.32.0 - picomatch: 4.0.4 - postcss: 8.5.25 + lightningcss: 1.33.0 + picomatch: 4.0.5 + postcss: 8.5.23 rolldown: 1.0.3 tinyglobby: 0.2.17 optionalDependencies: @@ -27567,91 +28052,42 @@ snapshots: fsevents: 2.3.3 jiti: 2.6.1 less: 4.4.2 - terser: 5.44.1 - tsx: 4.21.0 - yaml: 2.8.3 - - vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3): - dependencies: - lightningcss: 1.32.0 - picomatch: 4.0.4 - postcss: 8.5.25 - rolldown: 1.0.3 - tinyglobby: 0.2.17 - optionalDependencies: - '@types/node': 24.10.1 - esbuild: 0.28.1 - fsevents: 2.3.3 - jiti: 2.6.1 - less: 4.4.2 - terser: 5.44.1 + terser: 5.50.0 tsx: 4.21.0 yaml: 2.8.3 - vitest@4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)): + vitest@4.1.10(@opentelemetry/api@1.9.0)(@types/node@22.19.15)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) + '@vitest/mocker': 4.1.10(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/pretty-format': 4.1.10 '@vitest/runner': 4.1.10 '@vitest/snapshot': 4.1.10 '@vitest/spy': 4.1.10 '@vitest/utils': 4.1.10 - es-module-lexer: 2.0.0 + es-module-lexer: 2.3.1 expect-type: 1.3.0 magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 - picomatch: 4.0.4 + picomatch: 4.0.5 std-env: 4.0.0 tinybench: 2.9.0 tinyexec: 1.0.4 tinyglobby: 0.2.17 - tinyrainbow: 3.1.0 - vite: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) + tinyrainbow: 3.1.1 + vite: 8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 '@types/node': 22.19.15 - '@vitest/browser-playwright': 4.1.10(playwright@1.59.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10) + '@vitest/browser-playwright': 4.1.10(playwright@1.59.0)(vite@8.0.16(@types/node@22.19.15)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.50.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10) '@vitest/coverage-istanbul': 4.1.10(supports-color@8.1.1)(vitest@4.1.10) happy-dom: 20.10.1 jsdom: 26.1.0 transitivePeerDependencies: - msw - vitest@4.1.10(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-istanbul@4.1.10)(happy-dom@20.10.1)(jsdom@26.1.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)): - dependencies: - '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3)) - '@vitest/pretty-format': 4.1.10 - '@vitest/runner': 4.1.10 - '@vitest/snapshot': 4.1.10 - '@vitest/spy': 4.1.10 - '@vitest/utils': 4.1.10 - es-module-lexer: 2.0.0 - expect-type: 1.3.0 - magic-string: 0.30.21 - obug: 2.1.1 - pathe: 2.0.3 - picomatch: 4.0.4 - std-env: 4.0.0 - tinybench: 2.9.0 - tinyexec: 1.0.4 - tinyglobby: 0.2.17 - tinyrainbow: 3.1.0 - vite: 8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3) - why-is-node-running: 2.3.0 - optionalDependencies: - '@opentelemetry/api': 1.9.0 - '@types/node': 24.10.1 - '@vitest/browser-playwright': 4.1.10(playwright@1.59.0)(vite@8.0.16(@types/node@24.10.1)(esbuild@0.28.1)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.10) - '@vitest/coverage-istanbul': 4.1.10(vitest@4.1.10) - happy-dom: 20.10.1 - jsdom: 26.1.0 - transitivePeerDependencies: - - msw - vm-browserify@1.1.2: {} w3c-xmlserializer@5.0.0: @@ -27664,9 +28100,8 @@ snapshots: dependencies: loose-envify: 1.4.0 - watchpack@2.5.1: + watchpack@2.5.2: dependencies: - glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 wbuf@1.7.3: @@ -27698,12 +28133,12 @@ snapshots: opener: 1.5.2 picocolors: 1.1.1 sirv: 2.0.4 - ws: 8.21.0 + ws: 8.21.1 transitivePeerDependencies: - bufferutil - utf-8-validate - webpack-dev-middleware@7.4.5(webpack@5.105.4(esbuild@0.28.1)): + webpack-dev-middleware@7.4.5(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)): dependencies: colorette: 2.0.20 memfs: 4.51.1 @@ -27712,9 +28147,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.105.4(esbuild@0.28.1) + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) - webpack-dev-server@5.2.6(webpack@5.105.4(esbuild@0.28.1)): + webpack-dev-server@5.2.6(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -27742,10 +28177,10 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.105.4(esbuild@0.28.1)) - ws: 8.21.0 + webpack-dev-middleware: 7.4.5(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) + ws: 8.21.1 optionalDependencies: - webpack: 5.105.4(esbuild@0.28.1) + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) transitivePeerDependencies: - bufferutil - supports-color @@ -27763,50 +28198,101 @@ snapshots: flat: 5.0.2 wildcard: 2.0.1 - webpack-sources@3.3.4: {} + webpack-sources@3.5.1: {} webpack-virtual-modules@0.6.2: {} + webpack@5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.9 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.18.0 + acorn-import-phases: 1.0.4(acorn@8.18.0) + browserslist: 4.28.8 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.24.5 + es-module-lexer: 2.3.1 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.2 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.3 + tapable: 2.3.3 + terser-webpack-plugin: 5.6.1(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23)(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)) + watchpack: 2.5.2 + webpack-sources: 3.5.1 + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso + - esbuild + - html-minifier-terser + - lightningcss + - postcss + - uglify-js + webpack@5.105.4(esbuild@0.28.1): dependencies: '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/json-schema': 7.0.15 '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.16.0 - acorn-import-phases: 1.0.4(acorn@8.16.0) + acorn: 8.18.0 + acorn-import-phases: 1.0.4(acorn@8.18.0) browserslist: 4.28.8 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.20.0 - es-module-lexer: 2.0.0 + enhanced-resolve: 5.24.5 + es-module-lexer: 2.3.1 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.1 + loader-runner: 4.3.2 mime-types: 2.1.35 neo-async: 2.6.2 schema-utils: 4.3.3 - tapable: 2.3.0 - terser-webpack-plugin: 5.4.0(esbuild@0.28.1)(webpack@5.105.4(esbuild@0.28.1)) - watchpack: 2.5.1 - webpack-sources: 3.3.4 + tapable: 2.3.3 + terser-webpack-plugin: 5.6.1(esbuild@0.28.1)(webpack@5.105.4(esbuild@0.28.1)) + watchpack: 2.5.2 + webpack-sources: 3.5.1 transitivePeerDependencies: + - '@minify-html/node' - '@swc/core' + - '@swc/css' + - '@swc/html' + - clean-css + - cssnano + - csso - esbuild + - html-minifier-terser + - lightningcss + - postcss - uglify-js + optional: true - webpackbar@7.0.0(webpack@5.105.4(esbuild@0.28.1)): + webpackbar@7.0.0(webpack@5.105.4(esbuild@0.28.1)(postcss@8.5.23)): dependencies: ansis: 3.17.0 consola: 3.4.2 pretty-time: 1.1.0 std-env: 3.10.0 optionalDependencies: - webpack: 5.105.4(esbuild@0.28.1) + webpack: 5.105.4(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.23))(esbuild@0.28.1)(html-minifier-terser@7.2.0)(postcss@8.5.23) websocket-driver@0.7.5: dependencies: @@ -27920,7 +28406,7 @@ snapshots: wkx@0.5.0: dependencies: - '@types/node': 24.10.1 + '@types/node': 22.19.15 wrap-ansi@6.2.0: dependencies: @@ -27949,11 +28435,11 @@ snapshots: signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - ws@8.21.0: {} + ws@8.21.1: {} wsl-utils@0.1.0: dependencies: - is-wsl: 3.1.0 + is-wsl: 3.1.1 xdg-basedir@5.1.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 9e55032b2..04b70e787 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -102,7 +102,7 @@ overrides: svgo: ^3.3.4 'yaml@2.8.2': 2.8.3 'yauzl@3.2.0': 3.2.1 - qs: 6.15.2 + qs: 6.16.0 'uuid@11.1.0': 11.1.1 'express@4.22.1': 4.22.2 'ajv@^6': 6.14.0 @@ -133,7 +133,7 @@ overrides: '@opentelemetry/exporter-prometheus@0.57.2': 0.217.0 '@opentelemetry/core@2.7.1': 2.8.0 '@opentelemetry/propagator-jaeger': 2.9.0 - ws: 8.21.0 + ws: 8.21.1 shell-quote: 1.9.0 '@grpc/grpc-js': '>=1.14.4' form-data: ^4.0.6