diff --git a/admin-ui/src/gql/types.ts b/admin-ui/src/gql/types.ts
index 5c8ba6fe61..bb5c305a04 100644
--- a/admin-ui/src/gql/types.ts
+++ b/admin-ui/src/gql/types.ts
@@ -328,8 +328,7 @@ export type IColor = {
};
export type IConfigurableOrBundleProduct =
- | IBundleProduct
- | IConfigurableProduct;
+ IBundleProduct | IConfigurableProduct;
/** Configurable Product (Proxy) */
export type IConfigurableProduct = IProduct & {
@@ -924,35 +923,6 @@ export type IGeoPosition = {
longitude: Scalars['Float']['output'];
};
-export type IGlobalSearchResponse = {
- counts: Array;
- results: Array;
-};
-
-export type IGlobalSearchResult =
- | IAssortment
- | IBundleProduct
- | IConfigurableProduct
- | IEnrollment
- | IFilter
- | IOrder
- | IPlanProduct
- | IQuotation
- | ISimpleProduct
- | ITokenizedProduct
- | IUser
- | IWork;
-
-export type IGlobalSearchTypeCount = {
- totalCount: Scalars['Int']['output'];
- type: ISearchableEntity;
-};
-
-export type IGlobalSearchTypeLimitInput = {
- limit: Scalars['Int']['input'];
- type: ISearchableEntity;
-};
-
export type ILanguage = {
_id: Scalars['ID']['output'];
isActive?: Maybe;
@@ -1062,12 +1032,28 @@ export type IMutation = {
* Optional worker to identify the worker.
*/
allocateWork?: Maybe;
+ /**
+ * Authenticate gate control by validating a pass code and setting an HttpOnly cookie.
+ * Returns true if the pass code is valid.
+ */
+ authenticateGate: Scalars['Boolean']['output'];
/**
* Toggle Bookmark state on a product as currently logged in user,
* Does not work when multiple bookmarks with different explicit meta configurations exist.
* In those cases please use createBookmark and removeBookmark
*/
bookmark: IBookmark;
+ /**
+ * Cancel all tickets for an event (tokenized product). Invalidates all non-cancelled tokens.
+ * Optionally generates discount codes for affected users.
+ * Returns the number of tickets cancelled.
+ */
+ cancelEvent: Scalars['Int']['output'];
+ /**
+ * Cancel a ticket (token). Sets the cancelled flag on the token metadata.
+ * Optionally generates a discount code for reimbursement.
+ */
+ cancelTicket: IToken;
/** Change the current user's password. Must be logged in. */
changePassword?: Maybe;
/**
@@ -1119,6 +1105,8 @@ export type IMutation = {
createWebAuthnCredentialCreationOptions?: Maybe;
/** Create WebAuthn PublicKeyCredentialRequestrOptions to use for WebAuthn Login Flow */
createWebAuthnCredentialRequestOptions?: Maybe;
+ /** Deauthenticate gate control by clearing the gate pass code cookie. */
+ deauthenticateGate: Scalars['Boolean']['output'];
/** Manually mark a undelivered order as delivered */
deliverOrder: IOrder;
/**
@@ -1284,6 +1272,11 @@ export type IMutation = {
sendEnrollmentEmail?: Maybe;
/** Send an email with a link the user can use verify their email address. */
sendVerificationEmail?: Maybe;
+ /**
+ * Set or remove the scanner pass code for gate control on a tokenized product.
+ * Pass null to remove the pass code.
+ */
+ setEventScannerPassCode: IProduct;
/** Set a new password for a specific user */
setPassword: IUser;
/** Set roles of a user */
@@ -1472,11 +1465,25 @@ export type IMutationAllocateWorkArgs = {
worker?: InputMaybe;
};
+export type IMutationAuthenticateGateArgs = {
+ passCode: Scalars['String']['input'];
+};
+
export type IMutationBookmarkArgs = {
bookmarked?: InputMaybe;
productId: Scalars['ID']['input'];
};
+export type IMutationCancelEventArgs = {
+ generateDiscount?: InputMaybe;
+ productId: Scalars['ID']['input'];
+};
+
+export type IMutationCancelTicketArgs = {
+ generateDiscount?: InputMaybe;
+ tokenId: Scalars['ID']['input'];
+};
+
export type IMutationChangePasswordArgs = {
newPassword: Scalars['String']['input'];
oldPassword: Scalars['String']['input'];
@@ -1892,6 +1899,11 @@ export type IMutationSendVerificationEmailArgs = {
email?: InputMaybe;
};
+export type IMutationSetEventScannerPassCodeArgs = {
+ passCode?: InputMaybe;
+ productId: Scalars['ID']['input'];
+};
+
export type IMutationSetPasswordArgs = {
newPassword: Scalars['String']['input'];
userId: Scalars['ID']['input'];
@@ -2862,10 +2874,13 @@ export type IQuery = {
filters: Array;
/** Returns total number of filters */
filtersCount: Scalars['Int']['output'];
- /** Search across multiple entity types in a single request */
- globalSearch: IGlobalSearchResponse;
/** User impersonating currently logged in user */
impersonator?: Maybe;
+ /**
+ * Validates a scanner pass code for gate access. Pass code is read from the unchained_gate_passcode cookie (set via authenticateGate mutation).
+ * Optionally restricted to a specific product.
+ */
+ isPassCodeValid: Scalars['Boolean']['output'];
/** Get a specific language */
language?: Maybe;
/** Get all languages, by default sorted by creation date (ascending) */
@@ -2925,6 +2940,10 @@ export type IQuery = {
searchProducts: IProductSearchResult;
/** Get shop-global data and the resolved country/language pair */
shopInfo: IShop;
+ /** List all ticket events (tokenized products), by default includes drafts */
+ ticketEvents: Array;
+ /** Returns total number of ticket events (tokenized products) */
+ ticketEventsCount: Scalars['Int']['output'];
/** Get token */
token?: Maybe;
/** Get all tokens */
@@ -3103,16 +3122,8 @@ export type IQueryFiltersCountArgs = {
queryString?: InputMaybe;
};
-export type IQueryGlobalSearchArgs = {
- includeCarts?: InputMaybe;
- includeDraftProducts?: InputMaybe;
- includeGuestUsers?: InputMaybe;
- includeInactiveAssortments?: InputMaybe;
- includeInactiveFilters?: InputMaybe;
- limit?: InputMaybe;
- query: Scalars['String']['input'];
- typeLimits?: InputMaybe>;
- types?: InputMaybe>;
+export type IQueryIsPassCodeValidArgs = {
+ productId?: InputMaybe;
};
export type IQueryLanguageArgs = {
@@ -3209,6 +3220,7 @@ export type IQueryProductsArgs = {
slugs?: InputMaybe>;
sort?: InputMaybe>;
tags?: InputMaybe>;
+ type?: InputMaybe;
};
export type IQueryProductsCountArgs = {
@@ -3216,6 +3228,7 @@ export type IQueryProductsCountArgs = {
queryString?: InputMaybe;
slugs?: InputMaybe>;
tags?: InputMaybe>;
+ type?: InputMaybe;
};
export type IQueryQuotationArgs = {
@@ -3249,6 +3262,21 @@ export type IQuerySearchProductsArgs = {
queryString?: InputMaybe;
};
+export type IQueryTicketEventsArgs = {
+ includeDrafts?: InputMaybe;
+ limit?: InputMaybe;
+ offset?: InputMaybe;
+ onlyInvalidateable?: InputMaybe;
+ queryString?: InputMaybe;
+ sort?: InputMaybe>;
+};
+
+export type IQueryTicketEventsCountArgs = {
+ includeDrafts?: InputMaybe;
+ onlyInvalidateable?: InputMaybe;
+ queryString?: InputMaybe;
+};
+
export type IQueryTokenArgs = {
tokenId: Scalars['ID']['input'];
};
@@ -3431,18 +3459,21 @@ export type IReorderProductMediaInput = {
};
export enum IRoleAction {
+ AddCartQuotation = 'addCartQuotation',
AnswerQuotation = 'answerQuotation',
BookmarkProduct = 'bookmarkProduct',
BulkImport = 'bulkImport',
ChangePassword = 'changePassword',
CheckoutCart = 'checkoutCart',
ConfirmMediaUpload = 'confirmMediaUpload',
+ CreateBookmark = 'createBookmark',
CreateCart = 'createCart',
CreateEnrollment = 'createEnrollment',
CreateUser = 'createUser',
DownloadFile = 'downloadFile',
EnrollUser = 'enrollUser',
ForgotPassword = 'forgotPassword',
+ GateControl = 'gateControl',
Heartbeat = 'heartbeat',
Impersonate = 'impersonate',
LoginAsGuest = 'loginAsGuest',
@@ -3492,6 +3523,7 @@ export enum IRoleAction {
UploadTempFile = 'uploadTempFile',
UploadUserAvatar = 'uploadUserAvatar',
UseWebAuthn = 'useWebAuthn',
+ ValidatePassCode = 'validatePassCode',
VerifyEmail = 'verifyEmail',
ViewAssortment = 'viewAssortment',
ViewAssortments = 'viewAssortments',
@@ -3562,17 +3594,6 @@ export type ISearchResultProductsArgs = {
offset?: InputMaybe;
};
-export enum ISearchableEntity {
- Assortment = 'ASSORTMENT',
- Enrollment = 'ENROLLMENT',
- Filter = 'FILTER',
- Order = 'ORDER',
- Product = 'PRODUCT',
- Quotation = 'QUOTATION',
- User = 'USER',
- Work = 'WORK',
-}
-
export type IShop = {
_id: Scalars['ID']['output'];
adminUiConfig: IAdminUiConfig;
@@ -3711,6 +3732,7 @@ export type IToken = {
ercMetadata?: Maybe;
expiryDate?: Maybe;
invalidatedDate?: Maybe;
+ isCanceled?: Maybe;
isInvalidateable: Scalars['Boolean']['output'];
product: ITokenizedProduct;
quantity: Scalars['Int']['output'];
@@ -3739,12 +3761,14 @@ export type ITokenizedProduct = IProduct & {
contractConfiguration?: Maybe;
contractStandard?: Maybe;
created?: Maybe;
+ isCanceled?: Maybe;
leveledCatalogPrices: Array;
media: Array;
proxies: Array;
published?: Maybe;
reviews: Array;
reviewsCount: Scalars['Int']['output'];
+ scannerPassCode?: Maybe;
sequence: Scalars['Int']['output'];
siblings: Array;
simulatedPrice?: Maybe;
@@ -11776,6 +11800,7 @@ export type ITokenFragment = {
ercMetadata?: any | null;
accessKey: string;
isInvalidateable: boolean;
+ isCanceled?: boolean | null;
};
export type ITokenFragmentVariables = Exact<{ [key: string]: never }>;
@@ -12227,6 +12252,7 @@ export type IExportTokenMutation = {
ercMetadata?: any | null;
accessKey: string;
isInvalidateable: boolean;
+ isCanceled?: boolean | null;
};
};
@@ -12518,6 +12544,9 @@ export type IProductQuery = {
>;
}
| {
+ tokensCount: number;
+ isCanceled?: boolean | null;
+ scannerPassCode?: string | null;
_id: string;
sequence: number;
status: IProductStatus;
@@ -12531,6 +12560,39 @@ export type IProductQuery = {
subtitle?: string | null;
description?: string | null;
} | null;
+ contractConfiguration?: {
+ ercMetadataProperties?: any | null;
+ supply: number;
+ } | null;
+ simulatedStocks?: Array<{ quantity?: number | null }> | null;
+ tokens: Array<{
+ _id: string;
+ tokenSerialNumber?: string | null;
+ isCanceled?: boolean | null;
+ invalidatedDate?: any | null;
+ isInvalidateable: boolean;
+ quantity: number;
+ status: ITokenExportStatus;
+ walletAddress?: string | null;
+ user?: {
+ _id: string;
+ username?: string | null;
+ isGuest: boolean;
+ primaryEmail?: { address: string; verified: boolean } | null;
+ avatar?: { _id: string; url?: string | null } | null;
+ profile?: {
+ displayName?: string | null;
+ address?: {
+ firstName?: string | null;
+ lastName?: string | null;
+ } | null;
+ } | null;
+ lastContact?: {
+ emailAddress?: string | null;
+ telNumber?: string | null;
+ } | null;
+ } | null;
+ }>;
media: Array<{
_id: string;
tags?: Array | null;
@@ -14895,6 +14957,7 @@ export type IUserTokensQuery = {
ercMetadata?: any | null;
accessKey: string;
isInvalidateable: boolean;
+ isCanceled?: boolean | null;
product: {
_id: string;
sequence: number;
@@ -15770,6 +15833,211 @@ export type IVerifyQuotationMutation = {
};
};
+export type ICancelEventMutationVariables = Exact<{
+ productId: Scalars['ID']['input'];
+ generateDiscount?: InputMaybe;
+}>;
+
+export type ICancelEventMutation = { cancelEvent: number };
+
+export type ICancelTicketMutationVariables = Exact<{
+ tokenId: Scalars['ID']['input'];
+ generateDiscount?: InputMaybe;
+}>;
+
+export type ICancelTicketMutation = {
+ cancelTicket: {
+ _id: string;
+ isCanceled?: boolean | null;
+ invalidatedDate?: any | null;
+ isInvalidateable: boolean;
+ tokenSerialNumber?: string | null;
+ };
+};
+
+export type ICheckGateCookieQueryVariables = Exact<{ [key: string]: never }>;
+
+export type ICheckGateCookieQuery = { isPassCodeValid: boolean };
+
+export type ITicketEventsQueryVariables = Exact<{
+ queryString?: InputMaybe;
+ limit?: InputMaybe;
+ offset?: InputMaybe;
+ includeDrafts?: InputMaybe;
+ forceLocale?: InputMaybe;
+}>;
+
+export type ITicketEventsQuery = {
+ ticketEventsCount: number;
+ ticketEvents: Array<
+ | {
+ _id: string;
+ status: IProductStatus;
+ tags?: Array | null;
+ updated?: any | null;
+ published?: any | null;
+ }
+ | {
+ _id: string;
+ status: IProductStatus;
+ tags?: Array | null;
+ updated?: any | null;
+ published?: any | null;
+ }
+ | {
+ _id: string;
+ status: IProductStatus;
+ tags?: Array | null;
+ updated?: any | null;
+ published?: any | null;
+ }
+ | {
+ _id: string;
+ status: IProductStatus;
+ tags?: Array | null;
+ updated?: any | null;
+ published?: any | null;
+ }
+ | {
+ tokensCount: number;
+ isCanceled?: boolean | null;
+ _id: string;
+ status: IProductStatus;
+ tags?: Array | null;
+ updated?: any | null;
+ published?: any | null;
+ texts?: {
+ _id: string;
+ slug?: string | null;
+ title?: string | null;
+ subtitle?: string | null;
+ description?: string | null;
+ } | null;
+ media: Array<{
+ _id: string;
+ file?: { _id: string; url?: string | null; name: string } | null;
+ }>;
+ contractConfiguration?: {
+ ercMetadataProperties?: any | null;
+ supply: number;
+ } | null;
+ simulatedStocks?: Array<{ quantity?: number | null }> | null;
+ }
+ >;
+};
+
+export type IGateEventDetailQueryVariables = Exact<{
+ productId: Scalars['ID']['input'];
+}>;
+
+export type IGateEventDetailQuery = {
+ product?:
+ | { _id: string }
+ | { _id: string }
+ | { _id: string }
+ | { _id: string }
+ | {
+ isCanceled?: boolean | null;
+ _id: string;
+ texts?: {
+ _id: string;
+ title?: string | null;
+ subtitle?: string | null;
+ } | null;
+ contractConfiguration?: {
+ ercMetadataProperties?: any | null;
+ supply: number;
+ } | null;
+ tokens: Array<{
+ _id: string;
+ tokenSerialNumber?: string | null;
+ isCanceled?: boolean | null;
+ invalidatedDate?: any | null;
+ isInvalidateable: boolean;
+ ercMetadata?: any | null;
+ user?: {
+ _id: string;
+ username?: string | null;
+ isGuest: boolean;
+ primaryEmail?: { address: string; verified: boolean } | null;
+ avatar?: { _id: string; url?: string | null } | null;
+ profile?: {
+ displayName?: string | null;
+ address?: {
+ firstName?: string | null;
+ lastName?: string | null;
+ } | null;
+ } | null;
+ lastContact?: {
+ emailAddress?: string | null;
+ telNumber?: string | null;
+ } | null;
+ } | null;
+ }>;
+ }
+ | null;
+};
+
+export type IGateEventsQueryVariables = Exact<{
+ onlyInvalidateable: Scalars['Boolean']['input'];
+}>;
+
+export type IGateEventsQuery = {
+ ticketEvents: Array<
+ | { _id: string; status: IProductStatus }
+ | { _id: string; status: IProductStatus }
+ | { _id: string; status: IProductStatus }
+ | { _id: string; status: IProductStatus }
+ | {
+ isCanceled?: boolean | null;
+ _id: string;
+ status: IProductStatus;
+ texts?: {
+ _id: string;
+ title?: string | null;
+ subtitle?: string | null;
+ } | null;
+ contractConfiguration?: {
+ ercMetadataProperties?: any | null;
+ supply: number;
+ } | null;
+ tokens: Array<{
+ _id: string;
+ tokenSerialNumber?: string | null;
+ isCanceled?: boolean | null;
+ invalidatedDate?: any | null;
+ isInvalidateable: boolean;
+ }>;
+ }
+ >;
+};
+
+export type IAuthenticateGateMutationVariables = Exact<{
+ passCode: Scalars['String']['input'];
+}>;
+
+export type IAuthenticateGateMutation = { authenticateGate: boolean };
+
+export type IDeauthenticateGateMutationVariables = Exact<{
+ [key: string]: never;
+}>;
+
+export type IDeauthenticateGateMutation = { deauthenticateGate: boolean };
+
+export type ISetEventScannerPassCodeMutationVariables = Exact<{
+ productId: Scalars['ID']['input'];
+ passCode?: InputMaybe;
+}>;
+
+export type ISetEventScannerPassCodeMutation = {
+ setEventScannerPassCode:
+ | { _id: string }
+ | { _id: string }
+ | { _id: string }
+ | { _id: string }
+ | { scannerPassCode?: string | null; _id: string };
+};
+
export type IInvalidateTokenMutationVariables = Exact<{
tokenId: Scalars['ID']['input'];
}>;
@@ -15788,6 +16056,7 @@ export type IInvalidateTokenMutation = {
ercMetadata?: any | null;
accessKey: string;
isInvalidateable: boolean;
+ isCanceled?: boolean | null;
};
};
@@ -15810,6 +16079,7 @@ export type ITokenQuery = {
ercMetadata?: any | null;
accessKey: string;
isInvalidateable: boolean;
+ isCanceled?: boolean | null;
product: {
_id: string;
sequence: number;
@@ -15879,6 +16149,7 @@ export type ITokensQuery = {
ercMetadata?: any | null;
accessKey: string;
isInvalidateable: boolean;
+ isCanceled?: boolean | null;
product: {
_id: string;
sequence: number;
diff --git a/admin-ui/src/modules/Auth/permissionConfig.ts b/admin-ui/src/modules/Auth/permissionConfig.ts
index b8e859fde8..1da7969eaf 100644
--- a/admin-ui/src/modules/Auth/permissionConfig.ts
+++ b/admin-ui/src/modules/Auth/permissionConfig.ts
@@ -51,6 +51,7 @@ const UNRESTRICTED_PAGES = [
'/403',
'/500',
'/external',
+ '/ticketing/gate',
];
const PUBLIC_ONLY_PAGES = [
diff --git a/admin-ui/src/modules/accounts/components/LogInForm.tsx b/admin-ui/src/modules/accounts/components/LogInForm.tsx
index 6e7dbec4f4..ffc3b173d8 100644
--- a/admin-ui/src/modules/accounts/components/LogInForm.tsx
+++ b/admin-ui/src/modules/accounts/components/LogInForm.tsx
@@ -302,6 +302,17 @@ const LogInForm = () => {
})}
+
+
+ {intl.formatMessage({
+ id: 'open_gate_control',
+ defaultMessage: 'Open Gate Control',
+ })}
+
+
diff --git a/admin-ui/src/modules/apollo/utils/createApolloClient.ts b/admin-ui/src/modules/apollo/utils/createApolloClient.ts
index b0606f6ad4..246bfc56d7 100644
--- a/admin-ui/src/modules/apollo/utils/createApolloClient.ts
+++ b/admin-ui/src/modules/apollo/utils/createApolloClient.ts
@@ -84,7 +84,6 @@ const createApolloClient = ({
defaultOptions: {
watchQuery: {
fetchPolicy: 'cache-and-network',
- errorPolicy: 'all',
},
},
diff --git a/admin-ui/src/modules/common/components/Layout.tsx b/admin-ui/src/modules/common/components/Layout.tsx
index 70b749b5ef..fda1e0a1be 100644
--- a/admin-ui/src/modules/common/components/Layout.tsx
+++ b/admin-ui/src/modules/common/components/Layout.tsx
@@ -15,6 +15,7 @@ import {
CubeIcon,
DocumentTextIcon,
FolderArrowDownIcon,
+ TicketIcon,
} from '@heroicons/react/24/outline';
import Link from 'next/link';
import React, { useState } from 'react';
@@ -236,6 +237,12 @@ const Layout = ({
href: '/tokens',
requiredRole: 'viewTokens',
},
+ isSystemReady && {
+ name: formatMessage({ id: 'ticketing', defaultMessage: 'Ticketing' }),
+ icon: TicketIcon,
+ href: '/ticketing',
+ requiredRole: 'viewTokens',
+ },
{
name: formatMessage({ id: 'system', defaultMessage: 'System settings' }),
icon: Cog8ToothIcon,
diff --git a/admin-ui/src/modules/order/components/OrderStatusBadge.tsx b/admin-ui/src/modules/order/components/OrderStatusBadge.tsx
index 790cb28b89..04f3558350 100644
--- a/admin-ui/src/modules/order/components/OrderStatusBadge.tsx
+++ b/admin-ui/src/modules/order/components/OrderStatusBadge.tsx
@@ -4,12 +4,7 @@ import Badge from '@/components/ui/Badge';
import { ORDER_STATUSES } from '../../common/data/miscellaneous';
type OrderStatus =
- | 'PENDING'
- | 'CONFIRMED'
- | 'OPEN'
- | 'FULFILLED'
- | 'REJECTED'
- | string;
+ 'PENDING' | 'CONFIRMED' | 'OPEN' | 'FULFILLED' | 'REJECTED' | string;
type OrderStatusBadgeProps = {
status: OrderStatus;
diff --git a/admin-ui/src/modules/product/fragments/TokenFragment.ts b/admin-ui/src/modules/product/fragments/TokenFragment.ts
index ce0b9415e1..142262b9af 100644
--- a/admin-ui/src/modules/product/fragments/TokenFragment.ts
+++ b/admin-ui/src/modules/product/fragments/TokenFragment.ts
@@ -14,6 +14,7 @@ const TokenFragment = gql`
ercMetadata
accessKey
isInvalidateable
+ isCanceled
}
`;
diff --git a/admin-ui/src/modules/product/hooks/useProduct.ts b/admin-ui/src/modules/product/hooks/useProduct.ts
index 8932c983be..b723771427 100644
--- a/admin-ui/src/modules/product/hooks/useProduct.ts
+++ b/admin-ui/src/modules/product/hooks/useProduct.ts
@@ -57,6 +57,58 @@ const GetProductQuery = (inlineFragment = '') => gql`
__typename
}
}
+ ... on TokenizedProduct {
+ texts {
+ _id
+ title
+ subtitle
+ description
+ }
+ contractConfiguration {
+ ercMetadataProperties
+ supply
+ }
+ simulatedStocks {
+ quantity
+ }
+ tokensCount
+ isCanceled
+ scannerPassCode
+ tokens {
+ _id
+ tokenSerialNumber
+ isCanceled
+ invalidatedDate
+ isInvalidateable
+ quantity
+ status
+ walletAddress
+ user {
+ _id
+ username
+ isGuest
+ primaryEmail {
+ address
+ verified
+ }
+ avatar {
+ _id
+ url
+ }
+ profile {
+ displayName
+ address {
+ firstName
+ lastName
+ }
+ }
+ lastContact {
+ emailAddress
+ telNumber
+ }
+ }
+ }
+ }
}
}
${ProductDetailFragment}
diff --git a/admin-ui/src/modules/ticketing/components/EventTokenList.tsx b/admin-ui/src/modules/ticketing/components/EventTokenList.tsx
new file mode 100644
index 0000000000..78ced8f7bd
--- /dev/null
+++ b/admin-ui/src/modules/ticketing/components/EventTokenList.tsx
@@ -0,0 +1,71 @@
+import { useIntl } from 'react-intl';
+import Table from '../../common/components/Table';
+import EventTokenListItem from './EventTokenListItem';
+
+const EventTokenList = ({ tokens, onCancelTicket, onInvalidateTicket }) => {
+ const { formatMessage } = useIntl();
+
+ if (!tokens?.length) {
+ return (
+
+ {formatMessage({
+ id: 'no_tickets_issued',
+ defaultMessage: 'No tickets have been issued yet.',
+ })}
+
+ );
+ }
+
+ return (
+
+
+
+ {formatMessage({
+ id: 'ticket_number',
+ defaultMessage: 'Ticket #',
+ })}
+
+
+ {formatMessage({
+ id: 'attendee',
+ defaultMessage: 'Attendee',
+ })}
+
+
+ {formatMessage({
+ id: 'email',
+ defaultMessage: 'E-Mail',
+ })}
+
+
+ {formatMessage({
+ id: 'phone',
+ defaultMessage: 'Phone',
+ })}
+
+
+ {formatMessage({
+ id: 'redeemed',
+ defaultMessage: 'Redeemed',
+ })}
+
+
+ {formatMessage({
+ id: 'actions',
+ defaultMessage: 'Actions',
+ })}
+
+
+ {tokens.map((token) => (
+
+ ))}
+
+ );
+};
+
+export default EventTokenList;
diff --git a/admin-ui/src/modules/ticketing/components/EventTokenListItem.tsx b/admin-ui/src/modules/ticketing/components/EventTokenListItem.tsx
new file mode 100644
index 0000000000..a7c82b3bed
--- /dev/null
+++ b/admin-ui/src/modules/ticketing/components/EventTokenListItem.tsx
@@ -0,0 +1,105 @@
+import Link from 'next/link';
+import { useIntl } from 'react-intl';
+import Table from '../../common/components/Table';
+import Badge from '../../../components/ui/Badge';
+import useFormatDateTime from '../../common/utils/useFormatDateTime';
+import formatUsername from '../../common/utils/formatUsername';
+import MediaAvatar from '../../common/components/MediaAvatar';
+
+const EventTokenListItem = ({ token, onCancelTicket, onInvalidateTicket }) => {
+ const { formatMessage } = useIntl();
+ const { formatDateTime } = useFormatDateTime();
+
+ return (
+
+
+
+ {token.tokenSerialNumber || token._id?.slice(-8)}
+
+
+
+ {token.user && (
+
+
+ {formatUsername(token.user)}
+
+ )}
+
+
+
+ {token.user?.lastContact?.emailAddress ||
+ token.user?.primaryEmail?.address ||
+ '-'}
+
+
+
+
+ {token.user?.lastContact?.telNumber || '-'}
+
+
+
+ {token.invalidatedDate ? (
+
+ ) : (
+ -
+ )}
+
+
+
+ {token.isCanceled ? (
+
+ ) : (
+ <>
+ {!token.invalidatedDate && (
+ onCancelTicket(token._id)}
+ className="inline-flex items-center rounded-md border border-slate-300 dark:border-slate-600 px-3 py-1 text-xs font-medium text-rose-600 dark:text-rose-400 hover:bg-rose-50 dark:hover:bg-rose-900/20"
+ >
+ {formatMessage({
+ id: 'cancel_ticket',
+ defaultMessage: 'Cancel',
+ })}
+
+ )}
+ {token.isInvalidateable && !token.invalidatedDate && (
+ onInvalidateTicket(token._id)}
+ className="inline-flex items-center rounded-md border border-slate-300 dark:border-slate-600 px-3 py-1 text-xs font-medium text-emerald-600 dark:text-emerald-400 hover:bg-emerald-50 dark:hover:bg-emerald-900/20"
+ >
+ {formatMessage({
+ id: 'redeem_ticket',
+ defaultMessage: 'Redeem',
+ })}
+
+ )}
+ >
+ )}
+
+
+
+ );
+};
+
+export default EventTokenListItem;
diff --git a/admin-ui/src/modules/ticketing/components/GateAttendeeList.tsx b/admin-ui/src/modules/ticketing/components/GateAttendeeList.tsx
new file mode 100644
index 0000000000..b94d2c28dd
--- /dev/null
+++ b/admin-ui/src/modules/ticketing/components/GateAttendeeList.tsx
@@ -0,0 +1,180 @@
+import { useCallback } from 'react';
+import { useIntl } from 'react-intl';
+import { toast } from 'react-toastify';
+import Table from '../../common/components/Table';
+import Badge from '../../../components/ui/Badge';
+import useFormatDateTime from '../../common/utils/useFormatDateTime';
+import formatUsername from '../../common/utils/formatUsername';
+import useInvalidateTicket from '../../token/hooks/useInvalidateTicket';
+
+const GateAttendeeList = ({ event, onRefetch }) => {
+ const { formatMessage } = useIntl();
+ const { formatDateTime } = useFormatDateTime();
+ const { invalidateTicket } = useInvalidateTicket();
+
+ const slot = event?.contractConfiguration?.ercMetadataProperties?.slot;
+ const tokens = event?.tokens || [];
+ const activeTokens = tokens.filter((t) => !t.isCanceled);
+ const redeemedCount = activeTokens.filter((t) => t.invalidatedDate).length;
+
+ const onRedeem = useCallback(async (tokenId: string) => {
+ try {
+ await invalidateTicket({ tokenId });
+ toast.success(
+ formatMessage({
+ id: 'gate_ticket_redeemed',
+ defaultMessage: 'Ticket redeemed successfully',
+ }),
+ );
+ onRefetch?.();
+ } catch (e) {
+ toast.error(
+ formatMessage({
+ id: 'gate_redeem_error',
+ defaultMessage:
+ 'Could not redeem ticket. It may already be redeemed or not yet redeemable.',
+ }),
+ );
+ }
+ }, []);
+
+ return (
+
+
+
+ {slot && (
+
+ {formatDateTime(slot, {
+ dateStyle: 'full',
+ timeStyle: 'short',
+ })}
+
+ )}
+
+
+
+ {redeemedCount}
+
+
/ {activeTokens.length}
+
+ {formatMessage({
+ id: 'gate_redeemed',
+ defaultMessage: 'redeemed',
+ })}
+
+
+
+
+ {!activeTokens.length ? (
+
+ {formatMessage({
+ id: 'gate_no_tickets',
+ defaultMessage: 'No tickets for this event.',
+ })}
+
+ ) : (
+
+
+
+
+ {formatMessage({
+ id: 'ticket_number',
+ defaultMessage: 'Ticket #',
+ })}
+
+
+ {formatMessage({
+ id: 'attendee',
+ defaultMessage: 'Attendee',
+ })}
+
+
+ {formatMessage({
+ id: 'email',
+ defaultMessage: 'E-Mail',
+ })}
+
+
+ {formatMessage({
+ id: 'status',
+ defaultMessage: 'Status',
+ })}
+
+
+ {formatMessage({
+ id: 'actions',
+ defaultMessage: 'Actions',
+ })}
+
+
+ {activeTokens.map((token) => (
+
+
+
+ {token.tokenSerialNumber || token._id?.slice(-8)}
+
+
+
+
+ {token.user ? formatUsername(token.user) : '-'}
+
+
+
+
+ {token.user?.lastContact?.emailAddress ||
+ token.user?.primaryEmail?.address ||
+ '-'}
+
+
+
+ {token.invalidatedDate ? (
+
+ ) : (
+
+ )}
+
+
+ {!token.invalidatedDate && token.isInvalidateable && (
+ onRedeem(token._id)}
+ className="inline-flex items-center rounded-md bg-emerald-600 px-4 py-1.5 text-xs font-medium text-white hover:bg-emerald-700 focus:outline-none focus:ring-2 focus:ring-emerald-500 focus:ring-offset-2"
+ >
+ {formatMessage({
+ id: 'gate_redeem',
+ defaultMessage: 'Redeem',
+ })}
+
+ )}
+ {token.invalidatedDate && (
+
+ {formatMessage({
+ id: 'gate_checked_in',
+ defaultMessage: 'Checked in',
+ })}
+
+ )}
+
+
+ ))}
+
+
+ )}
+
+ );
+};
+
+export default GateAttendeeList;
diff --git a/admin-ui/src/modules/ticketing/components/GateControl.tsx b/admin-ui/src/modules/ticketing/components/GateControl.tsx
new file mode 100644
index 0000000000..f2ef69cd5f
--- /dev/null
+++ b/admin-ui/src/modules/ticketing/components/GateControl.tsx
@@ -0,0 +1,110 @@
+import { useState } from 'react';
+import { useIntl } from 'react-intl';
+import Loading from '../../../components/ui/Loading';
+import NoData from '../../../components/ui/NoData';
+import useGateEvents from '../hooks/useGateEvents';
+import useGateEventDetail from '../hooks/useGateEventDetail';
+import useIsPassCodeValid from '../hooks/useIsPassCodeValid';
+import GateEventList from './GateEventList';
+import GateAttendeeList from './GateAttendeeList';
+
+const GateControl = ({ onLogout, isAdmin = false }) => {
+ const { formatMessage } = useIntl();
+ const { clearPassCode } = useIsPassCodeValid();
+ const { events, loading: eventsLoading } = useGateEvents({
+ onlyInvalidateable: !isAdmin,
+ });
+ const [selectedEventId, setSelectedEventId] = useState(null);
+ const {
+ event: selectedEvent,
+ loading: detailLoading,
+ refetch,
+ } = useGateEventDetail(selectedEventId);
+
+ const selectedEventFromList: any = selectedEventId
+ ? events.find((e: any) => e._id === selectedEventId)
+ : null;
+
+ const title =
+ selectedEventFromList?.texts?.title || (selectedEvent as any)?.texts?.title;
+
+ return (
+
+
+
+ {selectedEventId && (
+
setSelectedEventId(null)}
+ className="inline-flex items-center rounded-md border border-slate-300 dark:border-slate-600 px-2 py-1.5 text-xs font-medium text-slate-600 dark:text-slate-400 hover:bg-slate-50 dark:hover:bg-slate-700"
+ >
+
+
+
+ {formatMessage({ id: 'gate_back', defaultMessage: 'Back' })}
+
+ )}
+
+ {selectedEventId
+ ? title
+ : formatMessage({
+ id: isAdmin ? 'gate_all_events' : 'gate_active_events',
+ defaultMessage: isAdmin ? 'All Events' : 'Active Events',
+ })}
+
+
+ {onLogout && (
+
{
+ await clearPassCode();
+ onLogout();
+ }}
+ className="inline-flex items-center rounded-md border border-slate-300 dark:border-slate-600 px-3 py-1.5 text-xs font-medium text-slate-600 dark:text-slate-400 hover:bg-slate-50 dark:hover:bg-slate-700"
+ >
+ {formatMessage({
+ id: 'gate_deactivate',
+ defaultMessage: 'Deactivate Scanner',
+ })}
+
+ )}
+
+
+ {selectedEventId ? (
+ detailLoading && !selectedEvent ? (
+
+ ) : selectedEvent ? (
+
+ ) : (
+
+ )
+ ) : eventsLoading ? (
+
+ ) : events.length ? (
+
setSelectedEventId(e._id)}
+ />
+ ) : (
+
+ )}
+
+ );
+};
+
+export default GateControl;
diff --git a/admin-ui/src/modules/ticketing/components/GateEventList.tsx b/admin-ui/src/modules/ticketing/components/GateEventList.tsx
new file mode 100644
index 0000000000..4215f0710e
--- /dev/null
+++ b/admin-ui/src/modules/ticketing/components/GateEventList.tsx
@@ -0,0 +1,93 @@
+import { useIntl } from 'react-intl';
+import useFormatDateTime from '../../common/utils/useFormatDateTime';
+import Badge from '../../../components/ui/Badge';
+
+const GateEventList = ({ events, onSelectEvent }) => {
+ const { formatMessage } = useIntl();
+ const { formatDateTime } = useFormatDateTime();
+
+ return (
+
+ {events.map((event: any) => {
+ const slot = event?.contractConfiguration?.ercMetadataProperties?.slot;
+ const tokens = event?.tokens || [];
+ const activeTokens = tokens.filter((t) => !t.isCanceled);
+ const redeemedCount = activeTokens.filter(
+ (t) => t.invalidatedDate,
+ ).length;
+ const invalidateableCount = activeTokens.filter(
+ (t) => t.isInvalidateable && !t.invalidatedDate,
+ ).length;
+
+ return (
+
onSelectEvent(event)}
+ className="w-full text-left bg-white dark:bg-slate-800 rounded-lg shadow-sm border border-slate-200 dark:border-slate-700 p-5 hover:border-slate-400 dark:hover:border-slate-500 transition-colors"
+ >
+
+
+
+ {event?.texts?.title}
+
+ {event?.texts?.subtitle && (
+
+ {event.texts.subtitle}
+
+ )}
+ {slot && (
+
+ {formatDateTime(slot, {
+ dateStyle: 'medium',
+ timeStyle: 'short',
+ })}
+
+ )}
+
+
+ {invalidateableCount > 0 && (
+
+ )}
+
+
+ {redeemedCount}
+
+
+ {' '}
+ / {activeTokens.length}
+
+
+ {formatMessage({
+ id: 'gate_redeemed',
+ defaultMessage: 'redeemed',
+ })}
+
+
+
+
+
+
+
+
+ );
+ })}
+
+ );
+};
+
+export default GateEventList;
diff --git a/admin-ui/src/modules/ticketing/components/GatePassCodeForm.tsx b/admin-ui/src/modules/ticketing/components/GatePassCodeForm.tsx
new file mode 100644
index 0000000000..002f393e8b
--- /dev/null
+++ b/admin-ui/src/modules/ticketing/components/GatePassCodeForm.tsx
@@ -0,0 +1,72 @@
+import { useState } from 'react';
+import { useIntl } from 'react-intl';
+import { toast } from 'react-toastify';
+import useIsPassCodeValid from '../hooks/useIsPassCodeValid';
+
+const GatePassCodeForm = ({ onAuthenticated }) => {
+ const { formatMessage } = useIntl();
+ const { validatePassCode, loading } = useIsPassCodeValid();
+ const [passCode, setPassCode] = useState('');
+
+ const handleSubmit = async (e) => {
+ e.preventDefault();
+ if (!passCode.trim()) return;
+
+ const valid = await validatePassCode(passCode.trim());
+ if (valid) {
+ onAuthenticated();
+ } else {
+ toast.error(
+ formatMessage({
+ id: 'gate_invalid_passcode',
+ defaultMessage: 'Invalid pass code. Please try again.',
+ }),
+ );
+ }
+ };
+
+ return (
+
+
+
+ {formatMessage({
+ id: 'gate_enter_passcode',
+ defaultMessage:
+ 'Enter the scanner pass code to activate the gate control.',
+ })}
+
+
+
+
+ );
+};
+
+export default GatePassCodeForm;
diff --git a/admin-ui/src/modules/ticketing/components/TicketEventDetail.tsx b/admin-ui/src/modules/ticketing/components/TicketEventDetail.tsx
new file mode 100644
index 0000000000..2504cbb4cc
--- /dev/null
+++ b/admin-ui/src/modules/ticketing/components/TicketEventDetail.tsx
@@ -0,0 +1,411 @@
+import Link from 'next/link';
+import { useCallback, useState } from 'react';
+import { useIntl } from 'react-intl';
+import { toast } from 'react-toastify';
+import useModal from '../../modal/hooks/useModal';
+import DangerMessage from '../../modal/components/DangerMessage';
+import useFormatDateTime from '../../common/utils/useFormatDateTime';
+import ImageWithFallback from '../../../components/ui/ImageWithFallback';
+import defaultNextImageLoader from '../../common/utils/defaultNextImageLoader';
+import Badge from '../../../components/ui/Badge';
+import EventTokenList from './EventTokenList';
+import useCancelTicket from '../hooks/useCancelTicket';
+import useCancelEvent from '../hooks/useCancelEvent';
+import useInvalidateTicket from '../../token/hooks/useInvalidateTicket';
+import useSetScannerPassCode from '../hooks/useSetScannerPassCode';
+import generateUniqueId from '../../common/utils/getUniqueId';
+
+const TicketEventDetail = ({ product }) => {
+ const { formatMessage } = useIntl();
+ const { formatDateTime } = useFormatDateTime();
+ const { setModal } = useModal();
+ const { cancelTicket } = useCancelTicket();
+ const { cancelEvent } = useCancelEvent();
+ const { invalidateTicket } = useInvalidateTicket();
+ const { setScannerPassCode } = useSetScannerPassCode();
+ const [passCodeInput, setPassCodeInput] = useState('');
+
+ const slot = product?.contractConfiguration?.ercMetadataProperties?.slot;
+ const supply = product?.contractConfiguration?.supply || 0;
+ const remaining =
+ product?.simulatedStocks?.reduce((acc, cur) => acc + cur.quantity, 0) || 0;
+ const sold = supply - remaining;
+
+ const activeTokens = product?.tokens?.filter((t) => !t.isCanceled) || [];
+ const redeemedTokens = activeTokens.filter((t) => t.invalidatedDate);
+
+ const onCancelEvent = useCallback(async () => {
+ let generateDiscount = false;
+ await setModal(
+ setModal('')}
+ message={
+ <>
+ {formatMessage({
+ id: 'cancel_event_confirmation',
+ defaultMessage:
+ 'Are you sure you want to cancel this event? All tickets will be cancelled.',
+ })}
+
+ {
+ generateDiscount = e.target.checked;
+ }}
+ />
+ {formatMessage({
+ id: 'generate_discount_codes',
+ defaultMessage: 'Generate discount codes for affected users',
+ })}
+
+ >
+ }
+ onOkClick={async () => {
+ setModal('');
+ try {
+ await cancelEvent({ productId: product._id, generateDiscount });
+ toast.success(
+ formatMessage({
+ id: 'event_cancelled',
+ defaultMessage: 'Event cancelled successfully',
+ }),
+ );
+ } catch (e) {
+ toast.error(e.message);
+ }
+ }}
+ okText={formatMessage({
+ id: 'cancel_event',
+ defaultMessage: 'Cancel Event',
+ })}
+ />,
+ );
+ }, [product?._id]);
+
+ const onCancelTicket = useCallback(async (tokenId: string) => {
+ let generateDiscount = false;
+ await setModal(
+ setModal('')}
+ message={
+ <>
+ {formatMessage({
+ id: 'cancel_ticket_confirmation',
+ defaultMessage: 'Are you sure you want to cancel this ticket?',
+ })}
+
+ {
+ generateDiscount = e.target.checked;
+ }}
+ />
+ {formatMessage({
+ id: 'generate_discount_code',
+ defaultMessage: 'Generate discount code for the user',
+ })}
+
+ >
+ }
+ onOkClick={async () => {
+ setModal('');
+ try {
+ await cancelTicket({ tokenId, generateDiscount });
+ toast.success(
+ formatMessage({
+ id: 'ticket_cancelled',
+ defaultMessage: 'Ticket cancelled successfully',
+ }),
+ );
+ } catch (e) {
+ toast.error(e.message);
+ }
+ }}
+ okText={formatMessage({
+ id: 'cancel_ticket',
+ defaultMessage: 'Cancel Ticket',
+ })}
+ />,
+ );
+ }, []);
+
+ const onInvalidateTicket = useCallback(async (tokenId: string) => {
+ try {
+ await invalidateTicket({ tokenId });
+ toast.success(
+ formatMessage({
+ id: 'ticket_redeemed',
+ defaultMessage: 'Ticket redeemed successfully',
+ }),
+ );
+ } catch (e) {
+ toast.error(
+ formatMessage({
+ id: 'ticket_redeem_error',
+ defaultMessage:
+ 'Ticket already redeemed or not redeemable at this time',
+ }),
+ );
+ }
+ }, []);
+
+ if (!product) return null;
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ {product?.texts?.title}
+
+ {product?.texts?.subtitle && (
+
+ {product.texts.subtitle}
+
+ )}
+ {product?.texts?.description && (
+
+ {product.texts.description}
+
+ )}
+
+
+
+
+ {formatMessage({
+ id: 'event_date',
+ defaultMessage: 'Event Date',
+ })}
+
+
+ {slot
+ ? formatDateTime(slot, {
+ dateStyle: 'full',
+ timeStyle: 'short',
+ })
+ : '-'}
+
+
+
+
+ {formatMessage({
+ id: 'status',
+ defaultMessage: 'Status',
+ })}
+
+
+
+
+
+
+
+ {formatMessage({
+ id: 'tickets_sold',
+ defaultMessage: 'Tickets Sold',
+ })}
+
+
+ {sold}
+ / {supply}
+
+
+
+
+ {formatMessage({
+ id: 'tickets_redeemed',
+ defaultMessage: 'Tickets Redeemed',
+ })}
+
+
+
+ {redeemedTokens.length}
+
+
+ {' '}
+ / {activeTokens.length}
+
+
+
+
+
+ {product.status === 'ACTIVE' && !product.isCanceled && (
+
+
+ {formatMessage({
+ id: 'cancel_event',
+ defaultMessage: 'Cancel Event',
+ })}
+
+
+ )}
+
+
+
+
+
+
+ {formatMessage({
+ id: 'gate_control_settings',
+ defaultMessage: 'Gate Control',
+ })}
+
+
+ {formatMessage({
+ id: 'gate_control_description',
+ defaultMessage:
+ 'Set a scanner pass code to enable gate control for this event. Share this code with gate operators.',
+ })}
+
+
+
+
+ {formatMessage({
+ id: 'scanner_pass_code',
+ defaultMessage: 'Scanner Pass Code',
+ })}
+
+ setPassCodeInput(e.target.value)}
+ placeholder={
+ product?.scannerPassCode
+ ? formatMessage({
+ id: 'scanner_pass_code_set',
+ defaultMessage:
+ 'Pass code is set (enter new value to change)',
+ })
+ : formatMessage({
+ id: 'scanner_pass_code_placeholder',
+ defaultMessage: 'Enter a pass code for gate operators',
+ })
+ }
+ className="block w-full rounded-md border border-slate-300 dark:border-slate-600 bg-white dark:bg-slate-700 px-3 py-2 text-sm text-slate-900 dark:text-slate-100 placeholder-slate-400 focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-500"
+ />
+
+
{
+ try {
+ await setScannerPassCode({
+ productId: product._id,
+ passCode: passCodeInput.trim(),
+ });
+ setPassCodeInput('');
+ toast.success(
+ formatMessage({
+ id: 'scanner_pass_code_saved',
+ defaultMessage: 'Scanner pass code updated',
+ }),
+ );
+ } catch (e) {
+ toast.error(e.message);
+ }
+ }}
+ className="inline-flex items-center rounded-md bg-slate-800 px-4 py-2 text-sm font-medium text-white hover:bg-slate-950 disabled:opacity-50 disabled:cursor-not-allowed"
+ >
+ {formatMessage({
+ id: 'save',
+ defaultMessage: 'Save',
+ })}
+
+ {product?.scannerPassCode && (
+
{
+ try {
+ await setScannerPassCode({
+ productId: product._id,
+ passCode: null,
+ });
+ setPassCodeInput('');
+ toast.success(
+ formatMessage({
+ id: 'scanner_pass_code_removed',
+ defaultMessage: 'Scanner pass code removed',
+ }),
+ );
+ } catch (e) {
+ toast.error(e.message);
+ }
+ }}
+ className="inline-flex items-center rounded-md border border-rose-300 dark:border-rose-600 px-4 py-2 text-sm font-medium text-rose-600 dark:text-rose-400 hover:bg-rose-50 dark:hover:bg-rose-900/20"
+ >
+ {formatMessage({
+ id: 'remove',
+ defaultMessage: 'Remove',
+ })}
+
+ )}
+
+ {product?.scannerPassCode && (
+
+ {formatMessage({
+ id: 'scanner_pass_code_active',
+ defaultMessage: 'Gate control is active for this event.',
+ })}
+
+ )}
+
+
+
+
+ {formatMessage(
+ {
+ id: 'attendee_list',
+ defaultMessage: 'Attendees ({count})',
+ },
+ { count: product?.tokens?.length || 0 },
+ )}
+
+
+
+
+ );
+};
+
+export default TicketEventDetail;
diff --git a/admin-ui/src/modules/ticketing/components/TicketEventList.tsx b/admin-ui/src/modules/ticketing/components/TicketEventList.tsx
new file mode 100644
index 0000000000..58047c1adb
--- /dev/null
+++ b/admin-ui/src/modules/ticketing/components/TicketEventList.tsx
@@ -0,0 +1,38 @@
+import { useIntl } from 'react-intl';
+import Table from '../../common/components/Table';
+import TicketEventListItem from './TicketEventListItem';
+
+const TicketEventList = ({ products }) => {
+ const { formatMessage } = useIntl();
+
+ return (
+
+
+
+
+ {formatMessage({ id: 'title', defaultMessage: 'Title' })}
+
+
+ {formatMessage({
+ id: 'event_date',
+ defaultMessage: 'Event Date',
+ })}
+
+
+ {formatMessage({
+ id: 'tickets_sold',
+ defaultMessage: 'Tickets Sold',
+ })}
+
+
+ {formatMessage({ id: 'status', defaultMessage: 'Status' })}
+
+
+ {(products || []).map((product) => (
+
+ ))}
+
+ );
+};
+
+export default TicketEventList;
diff --git a/admin-ui/src/modules/ticketing/components/TicketEventListItem.tsx b/admin-ui/src/modules/ticketing/components/TicketEventListItem.tsx
new file mode 100644
index 0000000000..e7062d5d16
--- /dev/null
+++ b/admin-ui/src/modules/ticketing/components/TicketEventListItem.tsx
@@ -0,0 +1,101 @@
+import Link from 'next/link';
+import Table from '../../common/components/Table';
+import Badge from '../../../components/ui/Badge';
+import useFormatDateTime from '../../common/utils/useFormatDateTime';
+import ImageWithFallback from '../../../components/ui/ImageWithFallback';
+import defaultNextImageLoader from '../../common/utils/defaultNextImageLoader';
+import generateUniqueId from '../../common/utils/getUniqueId';
+
+const EVENT_STATUSES = {
+ ACTIVE: 'emerald',
+ DRAFT: 'amber',
+ DELETED: 'rose',
+};
+
+const TicketEventListItem = ({ product }) => {
+ const { formatDateTime } = useFormatDateTime();
+ const slot = product?.contractConfiguration?.ercMetadataProperties?.slot;
+
+ const supply = product?.contractConfiguration?.supply || 0;
+ const remaining =
+ product?.simulatedStocks?.reduce((acc, cur) => acc + cur.quantity, 0) || 0;
+ const sold = supply - remaining;
+ const ticketUrl = `/ticketing?slug=${generateUniqueId(product)}`;
+ return (
+
+
+
+
+
+
+
+
+ {product?.texts?.title || 'Untitled'}
+ {product?.texts?.subtitle && (
+
+ {product.texts.subtitle}
+
+ )}
+
+
+
+
+ {slot
+ ? formatDateTime(slot, {
+ month: 'short',
+ year: 'numeric',
+ day: 'numeric',
+ hour: 'numeric',
+ minute: 'numeric',
+ })
+ : '-'}
+
+
+
+
+
+ {sold}
+
+
/
+
{supply}
+ {supply > 0 && (
+
+ )}
+
+
+
+
+
+
+ );
+};
+
+export default TicketEventListItem;
diff --git a/admin-ui/src/modules/ticketing/hooks/useCancelEvent.ts b/admin-ui/src/modules/ticketing/hooks/useCancelEvent.ts
new file mode 100644
index 0000000000..0f77cb9bf8
--- /dev/null
+++ b/admin-ui/src/modules/ticketing/hooks/useCancelEvent.ts
@@ -0,0 +1,30 @@
+import { gql } from '@apollo/client';
+import { useMutation } from '@apollo/client/react';
+
+const CancelEventMutation = gql`
+ mutation CancelEvent($productId: ID!, $generateDiscount: Boolean) {
+ cancelEvent(productId: $productId, generateDiscount: $generateDiscount)
+ }
+`;
+
+const useCancelEvent = () => {
+ const [cancelEventMutation] = useMutation(CancelEventMutation);
+
+ const cancelEvent = async ({
+ productId,
+ generateDiscount,
+ }: {
+ productId: string;
+ generateDiscount?: boolean;
+ }) => {
+ const result = await cancelEventMutation({
+ variables: { productId, generateDiscount },
+ refetchQueries: ['Product', 'TicketEvents', 'Tokens'],
+ });
+ return result;
+ };
+
+ return { cancelEvent };
+};
+
+export default useCancelEvent;
diff --git a/admin-ui/src/modules/ticketing/hooks/useCancelTicket.ts b/admin-ui/src/modules/ticketing/hooks/useCancelTicket.ts
new file mode 100644
index 0000000000..9f462f061b
--- /dev/null
+++ b/admin-ui/src/modules/ticketing/hooks/useCancelTicket.ts
@@ -0,0 +1,36 @@
+import { gql } from '@apollo/client';
+import { useMutation } from '@apollo/client/react';
+
+const CancelTicketMutation = gql`
+ mutation CancelTicket($tokenId: ID!, $generateDiscount: Boolean) {
+ cancelTicket(tokenId: $tokenId, generateDiscount: $generateDiscount) {
+ _id
+ isCanceled
+ invalidatedDate
+ isInvalidateable
+ tokenSerialNumber
+ }
+ }
+`;
+
+const useCancelTicket = () => {
+ const [cancelTicketMutation] = useMutation(CancelTicketMutation);
+
+ const cancelTicket = async ({
+ tokenId,
+ generateDiscount,
+ }: {
+ tokenId: string;
+ generateDiscount?: boolean;
+ }) => {
+ const result = await cancelTicketMutation({
+ variables: { tokenId, generateDiscount },
+ refetchQueries: ['Product', 'TicketEvents', 'Tokens', 'Token'],
+ });
+ return result;
+ };
+
+ return { cancelTicket };
+};
+
+export default useCancelTicket;
diff --git a/admin-ui/src/modules/ticketing/hooks/useCheckGateCookie.ts b/admin-ui/src/modules/ticketing/hooks/useCheckGateCookie.ts
new file mode 100644
index 0000000000..afeac321f2
--- /dev/null
+++ b/admin-ui/src/modules/ticketing/hooks/useCheckGateCookie.ts
@@ -0,0 +1,32 @@
+import { gql } from '@apollo/client';
+import { useQuery } from '@apollo/client/react';
+import { useCurrentUser } from '../../accounts';
+import {
+ ICheckGateCookieQuery,
+ ICheckGateCookieQueryVariables,
+} from '../../../gql/types';
+
+const CheckGateCookieQuery = gql`
+ query CheckGateCookie {
+ isPassCodeValid
+ }
+`;
+const useCheckGateCookie = () => {
+ const { currentUser } = useCurrentUser();
+ const isAdmin = Boolean(currentUser?._id);
+ const { data, loading, refetch } = useQuery<
+ ICheckGateCookieQuery,
+ ICheckGateCookieQueryVariables
+ >(CheckGateCookieQuery, {
+ fetchPolicy: 'cache-and-network',
+ skip: isAdmin,
+ });
+ const authenticated = isAdmin || data?.isPassCodeValid === true;
+ return {
+ authenticated,
+ loading,
+ refetch,
+ };
+};
+
+export default useCheckGateCookie;
diff --git a/admin-ui/src/modules/ticketing/hooks/useEventProducts.ts b/admin-ui/src/modules/ticketing/hooks/useEventProducts.ts
new file mode 100644
index 0000000000..3740c00881
--- /dev/null
+++ b/admin-ui/src/modules/ticketing/hooks/useEventProducts.ts
@@ -0,0 +1,75 @@
+import { gql } from '@apollo/client';
+import { useQuery } from '@apollo/client/react';
+
+const TicketEventsQuery = gql`
+ query TicketEvents(
+ $queryString: String
+ $limit: Int
+ $offset: Int
+ $includeDrafts: Boolean = true
+ $forceLocale: Locale
+ ) {
+ ticketEvents(
+ queryString: $queryString
+ limit: $limit
+ offset: $offset
+ includeDrafts: $includeDrafts
+ ) {
+ _id
+ status
+ tags
+ updated
+ published
+ ... on TokenizedProduct {
+ texts(forceLocale: $forceLocale) {
+ _id
+ slug
+ title
+ subtitle
+ description
+ }
+ media(limit: 1) {
+ _id
+ file {
+ _id
+ url
+ name
+ }
+ }
+ contractConfiguration {
+ ercMetadataProperties
+ supply
+ }
+ simulatedStocks {
+ quantity
+ }
+ tokensCount
+ isCanceled
+ }
+ }
+ ticketEventsCount(includeDrafts: $includeDrafts, queryString: $queryString)
+ }
+`;
+
+const useEventProducts = ({
+ queryString = null,
+ limit = 50,
+ offset = 0,
+}: {
+ queryString?: string;
+ limit?: number;
+ offset?: number;
+}) => {
+ const { data, loading, error } = useQuery(TicketEventsQuery, {
+ variables: { queryString, limit, offset },
+ });
+
+ return {
+ products: data?.ticketEvents || [],
+ productsCount: data?.ticketEventsCount || 0,
+ loading,
+ error,
+ };
+};
+
+export default useEventProducts;
diff --git a/admin-ui/src/modules/ticketing/hooks/useGateEventDetail.ts b/admin-ui/src/modules/ticketing/hooks/useGateEventDetail.ts
new file mode 100644
index 0000000000..b641dc87f1
--- /dev/null
+++ b/admin-ui/src/modules/ticketing/hooks/useGateEventDetail.ts
@@ -0,0 +1,79 @@
+import { gql } from '@apollo/client';
+import { useQuery } from '@apollo/client/react';
+import {
+ IGateEventDetailQuery,
+ IGateEventDetailQueryVariables,
+} from '../../../gql/types';
+
+const GateEventDetailQuery = gql`
+ query GateEventDetail($productId: ID!) {
+ product(productId: $productId) {
+ _id
+ ... on TokenizedProduct {
+ texts {
+ _id
+ title
+ subtitle
+ }
+ contractConfiguration {
+ ercMetadataProperties
+ supply
+ }
+ isCanceled
+ tokens {
+ _id
+ tokenSerialNumber
+ isCanceled
+ invalidatedDate
+ isInvalidateable
+ ercMetadata
+ user {
+ _id
+ username
+ isGuest
+ primaryEmail {
+ address
+ verified
+ }
+ avatar {
+ _id
+ url
+ }
+ profile {
+ displayName
+ address {
+ firstName
+ lastName
+ }
+ }
+ lastContact {
+ emailAddress
+ telNumber
+ }
+ }
+ }
+ }
+ }
+ }
+`;
+
+const useGateEventDetail = (productId: string | null) => {
+ const { data, loading, error, refetch, previousData } = useQuery<
+ IGateEventDetailQuery,
+ IGateEventDetailQueryVariables
+ >(GateEventDetailQuery, {
+ variables: { productId },
+ skip: !productId,
+ fetchPolicy: 'cache-and-network',
+ pollInterval: 10000,
+ });
+
+ return {
+ event: data?.product || previousData?.product || null,
+ loading,
+ error,
+ refetch,
+ };
+};
+
+export default useGateEventDetail;
diff --git a/admin-ui/src/modules/ticketing/hooks/useGateEvents.ts b/admin-ui/src/modules/ticketing/hooks/useGateEvents.ts
new file mode 100644
index 0000000000..ce5e52f079
--- /dev/null
+++ b/admin-ui/src/modules/ticketing/hooks/useGateEvents.ts
@@ -0,0 +1,66 @@
+import { gql } from '@apollo/client';
+import { useQuery } from '@apollo/client/react';
+import {
+ IGateEventsQuery,
+ IGateEventsQueryVariables,
+} from '../../../gql/types';
+
+const GateEventsQuery = gql`
+ query GateEvents($onlyInvalidateable: Boolean!) {
+ ticketEvents(
+ limit: 100
+ includeDrafts: false
+ onlyInvalidateable: $onlyInvalidateable
+ ) {
+ _id
+ status
+ ... on TokenizedProduct {
+ texts {
+ _id
+ title
+ subtitle
+ }
+ contractConfiguration {
+ ercMetadataProperties
+ supply
+ }
+ isCanceled
+ tokens {
+ _id
+ tokenSerialNumber
+ isCanceled
+ invalidatedDate
+ isInvalidateable
+ }
+ }
+ }
+ }
+`;
+
+const useGateEvents = ({
+ onlyInvalidateable = false,
+}: { onlyInvalidateable?: boolean } = {}) => {
+ const { data, loading, error, refetch, previousData } = useQuery<
+ IGateEventsQuery,
+ IGateEventsQueryVariables
+ >(GateEventsQuery, {
+ variables: { onlyInvalidateable },
+ fetchPolicy: 'cache-and-network',
+ pollInterval: 10000,
+ });
+
+ const events = (
+ data?.ticketEvents ||
+ previousData?.ticketEvents ||
+ []
+ ).filter((p: any) => p?.tokens?.length && !p.isCanceled);
+
+ return {
+ events,
+ loading,
+ error,
+ refetch,
+ };
+};
+
+export default useGateEvents;
diff --git a/admin-ui/src/modules/ticketing/hooks/useIsPassCodeValid.ts b/admin-ui/src/modules/ticketing/hooks/useIsPassCodeValid.ts
new file mode 100644
index 0000000000..d6ea4e66f4
--- /dev/null
+++ b/admin-ui/src/modules/ticketing/hooks/useIsPassCodeValid.ts
@@ -0,0 +1,58 @@
+import { gql } from '@apollo/client';
+import { useMutation } from '@apollo/client/react';
+import {
+ IAuthenticateGateMutation,
+ IAuthenticateGateMutationVariables,
+ IDeauthenticateGateMutation,
+ IDeauthenticateGateMutationVariables,
+} from '../../../gql/types';
+
+const AuthenticateGateMutation = gql`
+ mutation AuthenticateGate($passCode: String!) {
+ authenticateGate(passCode: $passCode)
+ }
+`;
+
+const DeauthenticateGateMutation = gql`
+ mutation DeauthenticateGate {
+ deauthenticateGate
+ }
+`;
+
+const useIsPassCodeValid = () => {
+ const [authenticateGate, { loading: authLoading }] = useMutation<
+ IAuthenticateGateMutation,
+ IAuthenticateGateMutationVariables
+ >(AuthenticateGateMutation);
+ const [deauthenticateGate, { loading: deauthLoading }] = useMutation<
+ IDeauthenticateGateMutation,
+ IDeauthenticateGateMutationVariables
+ >(DeauthenticateGateMutation);
+
+ const validatePassCode = async (passCode: string) => {
+ try {
+ const result = await authenticateGate({
+ variables: { passCode },
+ });
+ return result.data?.authenticateGate || false;
+ } catch {
+ return false;
+ }
+ };
+
+ const clearPassCode = async () => {
+ try {
+ await deauthenticateGate();
+ } catch {
+ // ignore
+ }
+ };
+
+ return {
+ validatePassCode,
+ clearPassCode,
+ loading: authLoading || deauthLoading,
+ };
+};
+
+export default useIsPassCodeValid;
diff --git a/admin-ui/src/modules/ticketing/hooks/useSetScannerPassCode.ts b/admin-ui/src/modules/ticketing/hooks/useSetScannerPassCode.ts
new file mode 100644
index 0000000000..9494306616
--- /dev/null
+++ b/admin-ui/src/modules/ticketing/hooks/useSetScannerPassCode.ts
@@ -0,0 +1,41 @@
+import { gql } from '@apollo/client';
+import { useMutation } from '@apollo/client/react';
+import {
+ ISetEventScannerPassCodeMutation,
+ ISetEventScannerPassCodeMutationVariables,
+} from '../../../gql/types';
+
+const SetEventScannerPassCodeMutation = gql`
+ mutation SetEventScannerPassCode($productId: ID!, $passCode: String) {
+ setEventScannerPassCode(productId: $productId, passCode: $passCode) {
+ _id
+ ... on TokenizedProduct {
+ scannerPassCode
+ }
+ }
+ }
+`;
+
+const useSetScannerPassCode = () => {
+ const [setPassCodeMutation] = useMutation<
+ ISetEventScannerPassCodeMutation,
+ ISetEventScannerPassCodeMutationVariables
+ >(SetEventScannerPassCodeMutation);
+
+ const setScannerPassCode = async ({
+ productId,
+ passCode,
+ }: {
+ productId: string;
+ passCode: string | null;
+ }) => {
+ return setPassCodeMutation({
+ variables: { productId, passCode },
+ refetchQueries: ['Product'],
+ });
+ };
+
+ return { setScannerPassCode };
+};
+
+export default useSetScannerPassCode;
diff --git a/admin-ui/src/modules/ticketing/index.ts b/admin-ui/src/modules/ticketing/index.ts
new file mode 100644
index 0000000000..d672fe521b
--- /dev/null
+++ b/admin-ui/src/modules/ticketing/index.ts
@@ -0,0 +1,6 @@
+export { default as useEventProducts } from './hooks/useEventProducts';
+export { default as useCancelTicket } from './hooks/useCancelTicket';
+export { default as useCancelEvent } from './hooks/useCancelEvent';
+export { default as useIsPassCodeValid } from './hooks/useIsPassCodeValid';
+export { default as useGateEvents } from './hooks/useGateEvents';
+export { default as useSetScannerPassCode } from './hooks/useSetScannerPassCode';
diff --git a/admin-ui/src/modules/token/components/TokenDetail.tsx b/admin-ui/src/modules/token/components/TokenDetail.tsx
index b59b4caf2c..57d0627df0 100644
--- a/admin-ui/src/modules/token/components/TokenDetail.tsx
+++ b/admin-ui/src/modules/token/components/TokenDetail.tsx
@@ -120,6 +120,19 @@ const TokenDetail = ({ token }) => {
+ {token?.isCanceled && (
+
+
+ {formatMessage({
+ id: 'cancelled_status',
+ defaultMessage: 'Cancelled',
+ })}
+ :
+
+
+
+ )}
+
{token?.walletAddress && (
diff --git a/admin-ui/src/modules/token/components/TokenList.tsx b/admin-ui/src/modules/token/components/TokenList.tsx
index 0234239ca2..74aa0ed18c 100644
--- a/admin-ui/src/modules/token/components/TokenList.tsx
+++ b/admin-ui/src/modules/token/components/TokenList.tsx
@@ -33,6 +33,12 @@ const TokenList = ({ tokens }) => {
defaultMessage: 'Invalidated',
})}
+
+ {formatMessage({
+ id: 'token_cancelled',
+ defaultMessage: 'Cancelled',
+ })}
+
{(tokens || []).map((token) => (
diff --git a/admin-ui/src/modules/token/components/TokenListItem.tsx b/admin-ui/src/modules/token/components/TokenListItem.tsx
index 0addb783f2..6f4fefedaf 100644
--- a/admin-ui/src/modules/token/components/TokenListItem.tsx
+++ b/admin-ui/src/modules/token/components/TokenListItem.tsx
@@ -69,6 +69,11 @@ const TokenListItem = ({ token }) => {
: null}
+
+ {token.isCanceled ? (
+
+ ) : null}
+
);
};
diff --git a/admin-ui/src/pages/ticketing/TicketEventDetailPage.tsx b/admin-ui/src/pages/ticketing/TicketEventDetailPage.tsx
new file mode 100644
index 0000000000..c048a71417
--- /dev/null
+++ b/admin-ui/src/pages/ticketing/TicketEventDetailPage.tsx
@@ -0,0 +1,33 @@
+import { useIntl } from 'react-intl';
+import BreadCrumbs from '../../components/ui/BreadCrumbs';
+import PageHeader from '../../components/ui/PageHeader';
+import Loading from '../../components/ui/Loading';
+import TicketEventDetail from '../../modules/ticketing/components/TicketEventDetail';
+import useProduct from '../../modules/product/hooks/useProduct';
+
+const TicketEventDetailPage = ({ slug }) => {
+ const { formatMessage } = useIntl();
+ const { product, loading } = useProduct({ slug: slug as string });
+
+ if (loading) return ;
+
+ return (
+ <>
+
+
+
+ >
+ );
+};
+
+export default TicketEventDetailPage;
diff --git a/admin-ui/src/pages/ticketing/gate.tsx b/admin-ui/src/pages/ticketing/gate.tsx
new file mode 100644
index 0000000000..04b1c0cc89
--- /dev/null
+++ b/admin-ui/src/pages/ticketing/gate.tsx
@@ -0,0 +1,56 @@
+import Link from 'next/link';
+import { useIntl } from 'react-intl';
+import { gql } from '@apollo/client';
+import useCurrentUser from '../../modules/accounts/hooks/useCurrentUser';
+import GatePassCodeForm from '../../modules/ticketing/components/GatePassCodeForm';
+import GateControl from '../../modules/ticketing/components/GateControl';
+import useCheckGateCookie from '../../modules/ticketing/hooks/useCheckGateCookie';
+
+const CheckGateCookieQuery = gql`
+ query CheckGateCookie {
+ isPassCodeValid
+ }
+`;
+
+const GateControlPage = () => {
+ const { formatMessage } = useIntl();
+ const { currentUser } = useCurrentUser();
+ const isAdmin = Boolean(currentUser?._id);
+ const { authenticated, loading, refetch } = useCheckGateCookie();
+
+ return (
+
+
+
+ {formatMessage({
+ id: 'gate_control_header',
+ defaultMessage: 'Gate Control',
+ })}
+
+
+
+
+ {formatMessage({
+ id: currentUser?._id ? 'back_to_admin' : 'back_to_login',
+ defaultMessage: currentUser?._id ? 'Back to Admin' : 'Log in',
+ })}
+
+
+ {authenticated ? (
+
refetch() : undefined}
+ isAdmin={isAdmin}
+ />
+ ) : loading ? null : (
+ refetch()} />
+ )}
+
+ );
+};
+
+GateControlPage.getLayout = (page) => page;
+
+export default GateControlPage;
diff --git a/admin-ui/src/pages/ticketing/index.tsx b/admin-ui/src/pages/ticketing/index.tsx
new file mode 100644
index 0000000000..523c6be53f
--- /dev/null
+++ b/admin-ui/src/pages/ticketing/index.tsx
@@ -0,0 +1,109 @@
+import Link from 'next/link';
+import { useIntl } from 'react-intl';
+import { useRouter } from 'next/router';
+
+import BreadCrumbs from '../../components/ui/BreadCrumbs';
+import PageHeader from '../../components/ui/PageHeader';
+import Loading from '../../components/ui/Loading';
+import NoData from '../../components/ui/NoData';
+import ListHeader from '../../components/ui/ListHeader';
+import SearchWithTags from '../../modules/common/components/SearchWithTags';
+import AnimatedCounter from '../../components/ui/AnimatedCounter';
+import TicketEventList from '../../modules/ticketing/components/TicketEventList';
+import useEventProducts from '../../modules/ticketing/hooks/useEventProducts';
+import TicketEventDetailPage from './TicketEventDetailPage';
+
+const TicketingPage = () => {
+ const { formatMessage } = useIntl();
+ const { query, push } = useRouter();
+
+ const { queryString, slug, ...rest } = query;
+
+ const setQueryString = (searchString) => {
+ const { skip, ...withoutSkip } = rest;
+ if (searchString)
+ push({
+ query: {
+ ...withoutSkip,
+ queryString: searchString,
+ },
+ });
+ else
+ push({
+ query: {
+ ...rest,
+ },
+ });
+ };
+
+ const { products, productsCount, loading } = useEventProducts({
+ limit: 0,
+ offset: 0,
+ queryString: queryString as string,
+ });
+
+ if (slug) return ;
+
+ const headerText =
+ productsCount === 1
+ ? formatMessage({
+ id: 'event_header',
+ defaultMessage: '1 Event',
+ })
+ : formatMessage(
+ {
+ id: 'event_count_header',
+ defaultMessage: '{count} Events',
+ },
+ { count: },
+ );
+
+ return (
+ <>
+
+
+
+
+ {formatMessage({
+ id: 'gate_control',
+ defaultMessage: 'Gate Control',
+ })}
+
+
+
+
+
+
+ <>
+ {loading ? : }
+ {!loading && !products?.length && (
+
+ )}
+ >
+
+
+ >
+ );
+};
+
+export default TicketingPage;
diff --git a/admin-ui/src/pages/tokens/TokenDetailPage.tsx b/admin-ui/src/pages/tokens/TokenDetailPage.tsx
index d23e767043..74874ad05f 100644
--- a/admin-ui/src/pages/tokens/TokenDetailPage.tsx
+++ b/admin-ui/src/pages/tokens/TokenDetailPage.tsx
@@ -1,4 +1,3 @@
-import { useRouter } from 'next/router';
import { IRoleAction } from '../../gql/types';
import useToken from '../../modules/token/hooks/useToken';
@@ -13,6 +12,7 @@ import { XMarkIcon } from '@heroicons/react/24/outline';
import DangerMessage from '../../modules/modal/components/DangerMessage';
import useModal from '../../modules/modal/hooks/useModal';
import useInvalidateTicket from '../../modules/token/hooks/useInvalidateTicket';
+import useCancelTicket from '../../modules/ticketing/hooks/useCancelTicket';
import { toast } from 'react-toastify';
import { useCallback } from 'react';
import useAuth from '../../modules/Auth/useAuth';
@@ -21,8 +21,10 @@ const TokenDetailPage = ({ tokenId }) => {
const { formatMessage } = useIntl();
const { setModal } = useModal();
- const { token, loading } = useToken({ tokenId: tokenId as string });
+ const { token: rawToken, loading } = useToken({ tokenId: tokenId as string });
+ const token = rawToken as typeof rawToken & { isCanceled?: boolean };
const { invalidateTicket } = useInvalidateTicket();
+ const { cancelTicket } = useCancelTicket();
const { hasRole } = useAuth();
const onInvalidateToken = useCallback(async () => {
@@ -30,23 +32,72 @@ const TokenDetailPage = ({ tokenId }) => {
setModal('')}
message={formatMessage({
- id: 'delete_paymentProvider_confirmation',
+ id: 'invalidate_token_confirmation',
defaultMessage:
- 'This action might cause inconsistencies with other data that relates to it. Are you sure you want to delete this Payment provider? ',
+ 'Are you sure you want to invalidate this token? This marks it as redeemed.',
})}
onOkClick={async () => {
setModal('');
await invalidateTicket({ tokenId });
toast.success(
formatMessage({
- id: 'payment_provider_deleted',
- defaultMessage: 'Payment provider deleted successfully',
+ id: 'token_invalidated',
+ defaultMessage: 'Token invalidated successfully',
}),
);
}}
okText={formatMessage({
- id: 'delete_payment_provider',
- defaultMessage: 'Delete payment provider',
+ id: 'invalidate_token',
+ defaultMessage: 'Invalidate',
+ })}
+ />,
+ );
+ }, [tokenId]);
+
+ const onCancelToken = useCallback(async () => {
+ let generateDiscount = false;
+ await setModal(
+ setModal('')}
+ message={
+ <>
+ {formatMessage({
+ id: 'cancel_ticket_confirmation',
+ defaultMessage:
+ 'Are you sure you want to cancel this ticket? This action cannot be undone.',
+ })}
+
+ {
+ generateDiscount = e.target.checked;
+ }}
+ />
+ {formatMessage({
+ id: 'generate_discount_code',
+ defaultMessage: 'Generate discount code for the user',
+ })}
+
+ >
+ }
+ onOkClick={async () => {
+ setModal('');
+ try {
+ await cancelTicket({ tokenId, generateDiscount });
+ toast.success(
+ formatMessage({
+ id: 'ticket_cancelled',
+ defaultMessage: 'Ticket cancelled successfully',
+ }),
+ );
+ } catch (e) {
+ toast.error(e.message);
+ }
+ }}
+ okText={formatMessage({
+ id: 'cancel_ticket',
+ defaultMessage: 'Cancel Ticket',
})}
/>,
);
@@ -73,19 +124,33 @@ const TokenDetailPage = ({ tokenId }) => {
)}
- {!token.invalidatedDate &&
- token.isInvalidateable &&
- hasRole(IRoleAction.UpdateToken) ? (
- }
- text={formatMessage({
- id: 'invalidate-token',
- defaultMessage: 'Invalidate',
- })}
- onClick={onInvalidateToken}
- />
- ) : null}
+
+ {!token.isCanceled && hasRole(IRoleAction.UpdateToken) && (
+ }
+ text={formatMessage({
+ id: 'cancel-ticket',
+ defaultMessage: 'Cancel Ticket',
+ })}
+ onClick={onCancelToken}
+ />
+ )}
+ {!token.invalidatedDate &&
+ token.isInvalidateable &&
+ !token.isCanceled &&
+ hasRole(IRoleAction.UpdateToken) ? (
+ }
+ text={formatMessage({
+ id: 'invalidate-token',
+ defaultMessage: 'Invalidate',
+ })}
+ onClick={onInvalidateToken}
+ />
+ ) : null}
+
>
diff --git a/admin-ui/tsup.config.ts b/admin-ui/tsup.config.ts
index f4eae06c2f..a9fdc46875 100644
--- a/admin-ui/tsup.config.ts
+++ b/admin-ui/tsup.config.ts
@@ -24,7 +24,8 @@ export default defineConfig({
'modules/product-review': 'src/modules/product-review/index.ts',
'modules/quotation': 'src/modules/quotation/index.ts',
'modules/token': 'src/modules/token/index.ts',
- 'modules/warehousing-providers': 'src/modules/warehousing-providers/index.ts',
+ 'modules/warehousing-providers':
+ 'src/modules/warehousing-providers/index.ts',
'modules/work': 'src/modules/work/index.ts',
},
format: ['esm'],
diff --git a/examples/ticketing/boot.ts b/examples/ticketing/boot.ts
index 21ca6dfe53..0237ed901c 100644
--- a/examples/ticketing/boot.ts
+++ b/examples/ticketing/boot.ts
@@ -1,7 +1,7 @@
import Fastify from 'fastify';
import { startPlatform } from '@unchainedshop/platform';
import { registerBasePlugins } from '@unchainedshop/plugins/presets/base';
-import { connect, unchainedLogger } from '@unchainedshop/api/lib/fastify/index.js';
+import { connect, unchainedLogger } from '@unchainedshop/api/fastify';
import setupTicketing, { ticketingModules, type TicketingAPI } from '@unchainedshop/ticketing';
import connectTicketingToFastify from '@unchainedshop/ticketing/lib/fastify.js';
import ticketingServices from '@unchainedshop/ticketing/lib/services.js';
diff --git a/package-lock.json b/package-lock.json
index 8117e730b6..2bf9fb91d0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -286,14 +286,14 @@
}
},
"node_modules/@ai-sdk/gateway": {
- "version": "3.0.104",
- "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.104.tgz",
- "integrity": "sha512-ZKX5n74io8VIRlhIMSLWVlvT3sXC8Z7cZ9GHuWBWZDVi96+62AIsWuLGvMfcBA1STYuSoDrp6rIziZmvrTq0TA==",
+ "version": "3.0.142",
+ "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.142.tgz",
+ "integrity": "sha512-Y1iwdxdebYXpoK5y/4CrcCfJGeFwEJWlEx+pMWIg/ZVWGi9KA+JXM7YBkhxcshpq/jAXx8YyQeFMyZr0TGfXZQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@ai-sdk/provider": "3.0.8",
- "@ai-sdk/provider-utils": "4.0.23",
+ "@ai-sdk/provider": "3.0.13",
+ "@ai-sdk/provider-utils": "4.0.35",
"@vercel/oidc": "3.2.0"
},
"engines": {
@@ -304,14 +304,14 @@
}
},
"node_modules/@ai-sdk/mcp": {
- "version": "1.0.36",
- "resolved": "https://registry.npmjs.org/@ai-sdk/mcp/-/mcp-1.0.36.tgz",
- "integrity": "sha512-THQKwlknp7OU2ViLPfIU7W01XvDRM2eqH+4UULQgP64AopnwI9mGqqJeGIx2l/pxUu9yIDQtW9YtYM8kHm2CQg==",
+ "version": "1.0.57",
+ "resolved": "https://registry.npmjs.org/@ai-sdk/mcp/-/mcp-1.0.57.tgz",
+ "integrity": "sha512-HDMybaHgV/hk4Wr9Fu08Zb118TaMxZ9a5kYBb1OZXygSMH1lDq//E/QthtJ1jvJsFtEYYcNqiVobnEUPeoRYFQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@ai-sdk/provider": "3.0.8",
- "@ai-sdk/provider-utils": "4.0.23",
+ "@ai-sdk/provider": "3.0.13",
+ "@ai-sdk/provider-utils": "4.0.35",
"pkce-challenge": "^5.0.0"
},
"engines": {
@@ -322,13 +322,13 @@
}
},
"node_modules/@ai-sdk/openai": {
- "version": "3.0.53",
- "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-3.0.53.tgz",
- "integrity": "sha512-Wld+Rbc05KaUn08uBt06eEuwcgalcIFtIl32Yp+GxuZXUQwOb6YeAuq+C6da4ch6BurFoqEaLemJVwjBb7x+PQ==",
+ "version": "3.0.80",
+ "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-3.0.80.tgz",
+ "integrity": "sha512-u3EfYbBG4YS/U2eOGH0yv8lPRwDj25X3sTluUKMYEwOLTZzWYv0IPtrpO7tPEra0QU4oq5Gpg49/FGFSrzE4vA==",
"license": "Apache-2.0",
"dependencies": {
- "@ai-sdk/provider": "3.0.8",
- "@ai-sdk/provider-utils": "4.0.23"
+ "@ai-sdk/provider": "3.0.13",
+ "@ai-sdk/provider-utils": "4.0.35"
},
"engines": {
"node": ">=18"
@@ -338,13 +338,13 @@
}
},
"node_modules/@ai-sdk/openai-compatible": {
- "version": "2.0.41",
- "resolved": "https://registry.npmjs.org/@ai-sdk/openai-compatible/-/openai-compatible-2.0.41.tgz",
- "integrity": "sha512-kNAGINk71AlOXx10Dq/PXw4t/9XjdK8uxfpVElRwtSFMdeSiLVt58p9TPx4/FJD+hxZuVhvxYj9r42osxWq79g==",
+ "version": "2.0.56",
+ "resolved": "https://registry.npmjs.org/@ai-sdk/openai-compatible/-/openai-compatible-2.0.56.tgz",
+ "integrity": "sha512-cQrN6OUn/jvsY3OdsU6Wn+ss7vp1iwIcakZKSlSRMnYqShBfyT7Qht+eqmgxs7w9ttrw6FAG6o11AiBs+iEsTA==",
"license": "Apache-2.0",
"dependencies": {
- "@ai-sdk/provider": "3.0.8",
- "@ai-sdk/provider-utils": "4.0.23"
+ "@ai-sdk/provider": "3.0.13",
+ "@ai-sdk/provider-utils": "4.0.35"
},
"engines": {
"node": ">=18"
@@ -354,9 +354,9 @@
}
},
"node_modules/@ai-sdk/provider": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.8.tgz",
- "integrity": "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==",
+ "version": "3.0.13",
+ "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.13.tgz",
+ "integrity": "sha512-ZPtVYt5QIJzOta1kdUiDuCx4HhFkvNPv/rvmZ2b1iXwybYjJsCnNYR4PAw4kW7rgVfDARvHXcU64efWuqNp6bw==",
"license": "Apache-2.0",
"dependencies": {
"json-schema": "^0.4.0"
@@ -366,14 +366,14 @@
}
},
"node_modules/@ai-sdk/provider-utils": {
- "version": "4.0.23",
- "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.23.tgz",
- "integrity": "sha512-z8GlDaCmRSDlqkMF2f4/RFgWxdarvIbyuk+m6WXT1LYgsnGiXRJGTD2Z1+SDl3LqtFuRtGX1aghYvQLoHL/9pg==",
+ "version": "4.0.35",
+ "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.35.tgz",
+ "integrity": "sha512-bjYld/2KGPLt78kpqbya+fD4LYS7BqVQJyUjE3qAHrYB0FR2Q90BaWEVIBZaguTWXf/A8L6uG1zO1v9TxVlGWg==",
"license": "Apache-2.0",
"dependencies": {
- "@ai-sdk/provider": "3.0.8",
+ "@ai-sdk/provider": "3.0.13",
"@standard-schema/spec": "^1.1.0",
- "eventsource-parser": "^3.0.6"
+ "eventsource-parser": "^3.0.8"
},
"engines": {
"node": ">=18"
@@ -383,14 +383,14 @@
}
},
"node_modules/@ai-sdk/react": {
- "version": "3.0.170",
- "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-3.0.170.tgz",
- "integrity": "sha512-YUDn+mK0c8iUz14rCBf1A0zg6SV5b5aSVUz+azF1bdBd1SFXVI19dKYR+PQSpZY+0+z+zs252AAsacUqiO98Kw==",
+ "version": "3.0.220",
+ "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-3.0.220.tgz",
+ "integrity": "sha512-mUqM13WXUT2jNhoU0Kf7YxAtIS+atCUtzZ1LNkhF1q42oYs4g2gWFtq4gNCejACvFMu1KusGRQU2S7ONXtVLZw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@ai-sdk/provider-utils": "4.0.23",
- "ai": "6.0.168",
+ "@ai-sdk/provider-utils": "4.0.35",
+ "ai": "6.0.218",
"swr": "^2.2.5",
"throttleit": "2.1.0"
},
@@ -415,9 +415,9 @@
}
},
"node_modules/@apollo/client": {
- "version": "4.1.9",
- "resolved": "https://registry.npmjs.org/@apollo/client/-/client-4.1.9.tgz",
- "integrity": "sha512-qfpkQD51tdU/7iAR6aLb4w9o/L7I475DluWHRb61U/3Q0AH29nNOxOBHjBbWDdf16ncPOoQuxne1sEs2NjqBFw==",
+ "version": "4.2.5",
+ "resolved": "https://registry.npmjs.org/@apollo/client/-/client-4.2.5.tgz",
+ "integrity": "sha512-1VyJ4eAriUFCfK2Btc09PQtxxgrnmoO1Dbg2A1O7MQbsK1ri5GSWBzc7/P6A0KJrkWll/Ojf9HC6ptIET8yv3g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -430,7 +430,7 @@
"tslib": "^2.3.0"
},
"peerDependencies": {
- "graphql": "^16.0.0",
+ "graphql": "^16.0.0 || ^17.0.0",
"graphql-ws": "^5.5.5 || ^6.0.3",
"react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc",
"react-dom": "^17.0.0 || ^18.0.0 || >=19.0.0-rc",
@@ -468,13 +468,13 @@
}
},
"node_modules/@babel/code-frame": {
- "version": "7.29.0",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
- "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
+ "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-validator-identifier": "^7.28.5",
+ "@babel/helper-validator-identifier": "^7.29.7",
"js-tokens": "^4.0.0",
"picocolors": "^1.1.1"
},
@@ -483,9 +483,9 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.29.0",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz",
- "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz",
+ "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -493,21 +493,21 @@
}
},
"node_modules/@babel/core": {
- "version": "7.29.0",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz",
- "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz",
+ "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.29.0",
- "@babel/generator": "^7.29.0",
- "@babel/helper-compilation-targets": "^7.28.6",
- "@babel/helper-module-transforms": "^7.28.6",
- "@babel/helpers": "^7.28.6",
- "@babel/parser": "^7.29.0",
- "@babel/template": "^7.28.6",
- "@babel/traverse": "^7.29.0",
- "@babel/types": "^7.29.0",
+ "@babel/code-frame": "^7.29.7",
+ "@babel/generator": "^7.29.7",
+ "@babel/helper-compilation-targets": "^7.29.7",
+ "@babel/helper-module-transforms": "^7.29.7",
+ "@babel/helpers": "^7.29.7",
+ "@babel/parser": "^7.29.7",
+ "@babel/template": "^7.29.7",
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7",
"@jridgewell/remapping": "^2.3.5",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
@@ -534,14 +534,14 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.29.1",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
- "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz",
+ "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.29.0",
- "@babel/types": "^7.29.0",
+ "@babel/parser": "^7.29.7",
+ "@babel/types": "^7.29.7",
"@jridgewell/gen-mapping": "^0.3.12",
"@jridgewell/trace-mapping": "^0.3.28",
"jsesc": "^3.0.2"
@@ -551,14 +551,14 @@
}
},
"node_modules/@babel/helper-compilation-targets": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
- "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz",
+ "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/compat-data": "^7.28.6",
- "@babel/helper-validator-option": "^7.27.1",
+ "@babel/compat-data": "^7.29.7",
+ "@babel/helper-validator-option": "^7.29.7",
"browserslist": "^4.24.0",
"lru-cache": "^5.1.1",
"semver": "^6.3.1"
@@ -578,9 +578,9 @@
}
},
"node_modules/@babel/helper-globals": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
- "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz",
+ "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -588,29 +588,29 @@
}
},
"node_modules/@babel/helper-module-imports": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
- "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz",
+ "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/traverse": "^7.28.6",
- "@babel/types": "^7.28.6"
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-transforms": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
- "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz",
+ "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-module-imports": "^7.28.6",
- "@babel/helper-validator-identifier": "^7.28.5",
- "@babel/traverse": "^7.28.6"
+ "@babel/helper-module-imports": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
},
"engines": {
"node": ">=6.9.0"
@@ -620,9 +620,9 @@
}
},
"node_modules/@babel/helper-plugin-utils": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz",
- "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz",
+ "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -630,9 +630,9 @@
}
},
"node_modules/@babel/helper-string-parser": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
- "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
+ "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -640,9 +640,9 @@
}
},
"node_modules/@babel/helper-validator-identifier": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
- "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -650,9 +650,9 @@
}
},
"node_modules/@babel/helper-validator-option": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
- "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz",
+ "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -660,27 +660,27 @@
}
},
"node_modules/@babel/helpers": {
- "version": "7.29.2",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz",
- "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz",
+ "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/template": "^7.28.6",
- "@babel/types": "^7.29.0"
+ "@babel/template": "^7.29.7",
+ "@babel/types": "^7.29.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
- "version": "7.29.2",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz",
- "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz",
+ "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.29.0"
+ "@babel/types": "^7.29.7"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -690,13 +690,13 @@
}
},
"node_modules/@babel/plugin-syntax-import-assertions": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz",
- "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz",
+ "integrity": "sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.28.6"
+ "@babel/helper-plugin-utils": "^7.29.7"
},
"engines": {
"node": ">=6.9.0"
@@ -706,9 +706,9 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.29.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
- "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz",
+ "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -716,33 +716,33 @@
}
},
"node_modules/@babel/template": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
- "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz",
+ "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.28.6",
- "@babel/parser": "^7.28.6",
- "@babel/types": "^7.28.6"
+ "@babel/code-frame": "^7.29.7",
+ "@babel/parser": "^7.29.7",
+ "@babel/types": "^7.29.7"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
- "version": "7.29.0",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
- "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz",
+ "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.29.0",
- "@babel/generator": "^7.29.0",
- "@babel/helper-globals": "^7.28.0",
- "@babel/parser": "^7.29.0",
- "@babel/template": "^7.28.6",
- "@babel/types": "^7.29.0",
+ "@babel/code-frame": "^7.29.7",
+ "@babel/generator": "^7.29.7",
+ "@babel/helper-globals": "^7.29.7",
+ "@babel/parser": "^7.29.7",
+ "@babel/template": "^7.29.7",
+ "@babel/types": "^7.29.7",
"debug": "^4.3.1"
},
"engines": {
@@ -750,14 +750,14 @@
}
},
"node_modules/@babel/types": {
- "version": "7.29.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
- "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz",
+ "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/helper-string-parser": "^7.27.1",
- "@babel/helper-validator-identifier": "^7.28.5"
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
},
"engines": {
"node": ">=6.9.0"
@@ -871,9 +871,9 @@
}
},
"node_modules/@emnapi/runtime": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz",
- "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==",
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz",
+ "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==",
"dev": true,
"license": "MIT",
"optional": true,
@@ -1422,9 +1422,9 @@
}
},
"node_modules/@eslint/config-helpers": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.5.tgz",
- "integrity": "sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==",
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz",
+ "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -1479,9 +1479,9 @@
}
},
"node_modules/@eslint/plugin-kit": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz",
- "integrity": "sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==",
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz",
+ "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -1869,16 +1869,16 @@
"license": "MIT"
},
"node_modules/@formatjs/bigdecimal": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/@formatjs/bigdecimal/-/bigdecimal-0.2.1.tgz",
- "integrity": "sha512-WbdsKlM5RH2boxpIQH5Rd1Ph7cqTP6oG7S+1heE1+voUHBQpzq1NfxBuQ7kTitHGPiK+6OtwKJo0IwhQ2qtPPQ==",
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/@formatjs/bigdecimal/-/bigdecimal-0.2.6.tgz",
+ "integrity": "sha512-aPzKsGQOkQRHUEbyO/ZtYfr4EqaBQnSs6U4tzTla1xBnIdEHgY2GqEqso28UMwWRkzKqqTj5+/6BmuOsRkfn2A==",
"dev": true,
"license": "MIT"
},
"node_modules/@formatjs/cli": {
- "version": "6.14.3",
- "resolved": "https://registry.npmjs.org/@formatjs/cli/-/cli-6.14.3.tgz",
- "integrity": "sha512-CDJmPZCkOvUV1ick+kD6lwFnCC8fDSek7am8i6Ao8qKefiute4RVgoKDLqlCppWJzG+FaFaTHEODEIrNc0w2oQ==",
+ "version": "6.16.11",
+ "resolved": "https://registry.npmjs.org/@formatjs/cli/-/cli-6.16.11.tgz",
+ "integrity": "sha512-O3tTFavGK3zOhW4i2/ONWfMUgbU7fapxNbIsdFuF9eTMtQZFnKFdoBDdiBHj7d2W4ULVyeWd4b3qw2XHYpmuBg==",
"dev": true,
"license": "MIT",
"bin": {
@@ -1887,6 +1887,14 @@
"engines": {
"node": ">= 20.12.0"
},
+ "optionalDependencies": {
+ "@formatjs/cli-native-darwin-arm64": "1.1.5",
+ "@formatjs/cli-native-linux-arm64": "1.2.5",
+ "@formatjs/cli-native-linux-arm64-musl": "1.0.3",
+ "@formatjs/cli-native-linux-x64": "1.1.5",
+ "@formatjs/cli-native-linux-x64-musl": "1.0.3",
+ "@formatjs/cli-native-win32-x64": "1.1.6"
+ },
"peerDependencies": {
"@glimmer/syntax": "^0.84.3 || ^0.95.0",
"@vue/compiler-core": "^3.5.0",
@@ -1917,81 +1925,178 @@
}
}
},
+ "node_modules/@formatjs/cli-native-darwin-arm64": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@formatjs/cli-native-darwin-arm64/-/cli-native-darwin-arm64-1.1.5.tgz",
+ "integrity": "sha512-zGt7OenQakyh8a+eAgCx/zUInbQXYT0UNzeOaYlnaKmU9yr78wsVAGGhPc85gchnQ7gIXSWOKhwIzvfSMFGU7w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@formatjs/cli-native-linux-arm64": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/@formatjs/cli-native-linux-arm64/-/cli-native-linux-arm64-1.2.5.tgz",
+ "integrity": "sha512-G1Ou5CFDM2hfqmD2jfXJJpHL7DL7f7OxlMXf6VPWvUYu+jcvpEj0KdEtmz5poh8rWzfHbOf4MfqC6WNhExJD5A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@formatjs/cli-native-linux-arm64-musl": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@formatjs/cli-native-linux-arm64-musl/-/cli-native-linux-arm64-musl-1.0.3.tgz",
+ "integrity": "sha512-1qq9EZIY87cnptTd2PywI41s/DlkJBzNID6AofHCYm8sunXfj+vYAIQOSZnctNm7/u1ZlSJ/VjxHSS1NIC4tTw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@formatjs/cli-native-linux-x64": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@formatjs/cli-native-linux-x64/-/cli-native-linux-x64-1.1.5.tgz",
+ "integrity": "sha512-v/EtDIMC7C3cOpYpRJDvUImQFHBveFP+PTggZJbi88zXCeMMEL6eMwbMlJezUIwvYjgH1FWQargCgwOnI3lVdg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@formatjs/cli-native-linux-x64-musl": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@formatjs/cli-native-linux-x64-musl/-/cli-native-linux-x64-musl-1.0.3.tgz",
+ "integrity": "sha512-wb90O1S7cad8QKmHQ2I5glN9O9m+y+V29mrvvxFbKAVmVbKB7oyjhoau/jtuHQ/Yv2tfah3CYCj+1iaDNlJmYg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@formatjs/cli-native-win32-x64": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/@formatjs/cli-native-win32-x64/-/cli-native-win32-x64-1.1.6.tgz",
+ "integrity": "sha512-fsPOUB4JePy6VJfQV+oorLfozbb9IfYRAncGZ54VZg77Uj2aOP2h/KLhQmgippNlgi0Q77EB8QDMzNQfaKpVAA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
"node_modules/@formatjs/fast-memoize": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-3.1.2.tgz",
- "integrity": "sha512-vPnriihkfK0lzoQGaXq+qXH23VsYyansRTkTgo2aTG0k1NjLFyZimFVdfj4C9JkSE5dm7CEngcQ5TTc1yAyBfQ==",
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-3.1.6.tgz",
+ "integrity": "sha512-H5aexk1Le7T9TPmscacZ+1pR6CTa2n1wq+HDVGXhH8TzUlQQpeXzZs91dRtmFHrbeNbjPFPfQujUqm7MHgVoXQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@formatjs/icu-messageformat-parser": {
- "version": "3.5.5",
- "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-3.5.5.tgz",
- "integrity": "sha512-ASMon8BNlKHgQQpZx84xI80EXRS90GlsEU4wEulCKCzrMtUdrfEvFc9UEYmRbvEvtFQLZ4qHXnisUy6PuFjwyA==",
+ "version": "3.5.12",
+ "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-3.5.12.tgz",
+ "integrity": "sha512-YyzzxVgYJ8DELmmkhn0Yr0rUj0dTJFf9Jp628K3S0ysInBWxLVDOS8i3RP91cCp4DMK4WYb4cVMhWA9i4knSJg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@formatjs/icu-skeleton-parser": "2.1.5"
+ "@formatjs/icu-skeleton-parser": "2.1.10"
}
},
"node_modules/@formatjs/icu-skeleton-parser": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-2.1.5.tgz",
- "integrity": "sha512-9Kc6tMaAPZKTGevdfcvx5zT3v4BTfamo+djJE29wF6ds1QLhoA09MZNDpWMZaebWzuoOTIXhDvgmqmjSlUOGlw==",
+ "version": "2.1.10",
+ "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-2.1.10.tgz",
+ "integrity": "sha512-XuSva+8ZGawk8VnD5VD6UeH8KarQ/Z022zgjHDoHmlNiAewstXuuzXc0Hk5pGFSdG+nNw5bfJKXqj1ZXHn9yUA==",
"dev": true,
"license": "MIT"
},
"node_modules/@formatjs/intl": {
- "version": "4.1.7",
- "resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-4.1.7.tgz",
- "integrity": "sha512-SOJHtwG4Ke17zHBO61BLOiA1dcK2kk+QChsNZyPlBbI7dElAEkCLl5e3ZX1uxxXF1RtjAnD+lvqMN0tiPlP2Ww==",
+ "version": "4.1.14",
+ "resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-4.1.14.tgz",
+ "integrity": "sha512-hl8dgvbV2Te/KPnCud+nuBc+z8qW8fGreiun7ul5LopIHkbP0izylvnhIFDL2dQMeMPdrKCAXhJkYDeoxVuDRw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@formatjs/fast-memoize": "3.1.2",
- "@formatjs/icu-messageformat-parser": "3.5.5",
- "intl-messageformat": "11.2.2"
+ "@formatjs/fast-memoize": "3.1.6",
+ "@formatjs/icu-messageformat-parser": "3.5.12",
+ "intl-messageformat": "11.2.9"
}
},
"node_modules/@formatjs/intl-localematcher": {
- "version": "0.8.4",
- "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.8.4.tgz",
- "integrity": "sha512-J51dAnynnqJdVUEXidHoIWn+qYve+yNQEgmFk9Dyfr3p0okzm+5QhQ+9QmsMz08+BeWTVpc1HadIiLfZmRYbAQ==",
+ "version": "0.8.10",
+ "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.8.10.tgz",
+ "integrity": "sha512-P/IC3qws3jH+1fEs+o0RIFgXKRaQlFehjS5W0FPAqdo6hgzawLl+eD0q0JjheQ3XtoOe5n8WSYfX06KQZI/QJA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@formatjs/fast-memoize": "3.1.2"
+ "@formatjs/fast-memoize": "3.1.6"
}
},
"node_modules/@formatjs/intl-pluralrules": {
- "version": "6.3.3",
- "resolved": "https://registry.npmjs.org/@formatjs/intl-pluralrules/-/intl-pluralrules-6.3.3.tgz",
- "integrity": "sha512-xydjMtIwf1C06S60f7fSe223yf4L3ETclwFqmN5kEP+lNTRbrBYQCriOn4h+SkxlG3nM5/sV8W/IHlmjriZZGg==",
+ "version": "6.3.10",
+ "resolved": "https://registry.npmjs.org/@formatjs/intl-pluralrules/-/intl-pluralrules-6.3.10.tgz",
+ "integrity": "sha512-pMoqKYhsfz2ostOQsh/5e66EJPiYWzy4yO7k9zcBLfw0pgOf15TRDYaT6lPghqUe9gdEEfP74QL7u6gwomxCTg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@formatjs/bigdecimal": "0.2.1",
- "@formatjs/intl-localematcher": "0.8.4"
+ "@formatjs/bigdecimal": "0.2.6",
+ "@formatjs/intl-localematcher": "0.8.10"
}
},
"node_modules/@formatjs/intl-relativetimeformat": {
- "version": "12.3.3",
- "resolved": "https://registry.npmjs.org/@formatjs/intl-relativetimeformat/-/intl-relativetimeformat-12.3.3.tgz",
- "integrity": "sha512-BmYJsWGtgC4gFh8bGdn8S+/1WS7rPmgR2IVN8xrohpr5urSwUbUAMEGXUaL+bWMxt/43DswIrUn+2o+V9REJlg==",
+ "version": "12.3.10",
+ "resolved": "https://registry.npmjs.org/@formatjs/intl-relativetimeformat/-/intl-relativetimeformat-12.3.10.tgz",
+ "integrity": "sha512-dAHd3MaS4Ffmxjhex5y9Z2a1dbuNBCLSI+kThvU1IUnmtv+NuUEBFxE89jGZngccXJJJHrxvEypkkbnf7Foaig==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@formatjs/intl-localematcher": "0.8.4"
+ "@formatjs/intl-localematcher": "0.8.10"
}
},
"node_modules/@formatjs/ts-transformer": {
- "version": "4.4.5",
- "resolved": "https://registry.npmjs.org/@formatjs/ts-transformer/-/ts-transformer-4.4.5.tgz",
- "integrity": "sha512-2uHFo3kDEWUC6rf7i9975nGy1mesD/scyvC2usqoEEdA+9eZjXVMQ3eIhhD7oqNpwrZYAdwXhrCtokgFF+99wQ==",
+ "version": "4.4.14",
+ "resolved": "https://registry.npmjs.org/@formatjs/ts-transformer/-/ts-transformer-4.4.14.tgz",
+ "integrity": "sha512-k3zaGIAUpQIS5tpifOJ8Jzsqy+j1YV916b1yhwd6US+kRQHdSyxtk76zad8NabalOWel5ouyzGohD0ZlApKkdg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@formatjs/icu-messageformat-parser": "3.5.5",
+ "@formatjs/icu-messageformat-parser": "3.5.12",
+ "@types/babel__core": "^7.20.5",
"@types/node": "22 || 24",
"json-stable-stringify": "^1.3.0",
"typescript": "^5.6 || 6"
@@ -2009,19 +2114,19 @@
}
},
"node_modules/@formatjs/ts-transformer/node_modules/@types/node": {
- "version": "24.12.2",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz",
- "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==",
+ "version": "24.13.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz",
+ "integrity": "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "undici-types": "~7.16.0"
+ "undici-types": "~7.18.0"
}
},
"node_modules/@formatjs/ts-transformer/node_modules/undici-types": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
- "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
+ "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==",
"dev": true,
"license": "MIT"
},
@@ -2407,13 +2512,13 @@
}
},
"node_modules/@graphql-tools/apollo-engine-loader": {
- "version": "8.0.30",
- "resolved": "https://registry.npmjs.org/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.30.tgz",
- "integrity": "sha512-hUydKGGECrWloERMmfoMzHZi12X99AM9geCGF5XVsv4iMRl/Iyuet24th4kC9bZ8MlAdCwAwtUsCyv9uRfYwSA==",
+ "version": "8.0.31",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.31.tgz",
+ "integrity": "sha512-ToqJ24QuNtGPG7XDQP7KWFMFacz7/Q7FtsNhWBNffljSloG6w6UrvAf85Ono+8d32OI5Es8tKhn2K1IBtzhj4Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@graphql-tools/utils": "^11.1.0",
+ "@graphql-tools/utils": "^11.1.1",
"@whatwg-node/fetch": "^0.10.13",
"sync-fetch": "0.6.0",
"tslib": "^2.4.0"
@@ -2445,14 +2550,14 @@
}
},
"node_modules/@graphql-tools/code-file-loader": {
- "version": "8.1.32",
- "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-8.1.32.tgz",
- "integrity": "sha512-gR5mNQjn0BugDL8a4A+ovS2KEvU52RNOGnbwiq9oWAEHiSv7iqJu77bpWARTzlE1ZFPK5MSQe9218+1t5PbXmQ==",
+ "version": "8.1.33",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-8.1.33.tgz",
+ "integrity": "sha512-FKMZ6ktSNeewLfjIkW96Kw73NBLkK37C6Gh1kv5QtJy/tumuZYt8uTq9bM3P1Y82OscGyVC6/4V12TVaEraYCw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@graphql-tools/graphql-tag-pluck": "8.3.31",
- "@graphql-tools/utils": "^11.1.0",
+ "@graphql-tools/graphql-tag-pluck": "8.3.32",
+ "@graphql-tools/utils": "^11.1.1",
"globby": "^11.0.3",
"tslib": "^2.4.0",
"unixify": "^1.0.0"
@@ -2465,9 +2570,9 @@
}
},
"node_modules/@graphql-tools/delegate": {
- "version": "12.0.14",
- "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-12.0.14.tgz",
- "integrity": "sha512-/xCDM8zlCk1Lccww9asOIpxna9IFpIlol4yGsBD9Y2+3/Zu5k4/HzDC8LKJtw5MxdG+uJN1l9nRepr4GeBC4kA==",
+ "version": "12.0.17",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-12.0.17.tgz",
+ "integrity": "sha512-pIVszWEm69rF+bkM0jUyM1KdIxGzygQbIp1GtV1CuEGRB8lN1uFY1eeTzM2nudHXg8cj+XSVO8cnRpph+o8Dmg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2505,12 +2610,12 @@
}
},
"node_modules/@graphql-tools/executor": {
- "version": "1.5.3",
- "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.5.3.tgz",
- "integrity": "sha512-mgBFC0bsrZPZLu9EnydpMnAuQ8Iiq0CEbUcsmvXsm2/iYektGHDN/+bmb7hicA6dWZtdPfklYJmr21WD0GnOfA==",
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.5.4.tgz",
+ "integrity": "sha512-6CdAENBTtVIXmOoJWJvYNFpE0b8zzwAMZ+VGkyLY2QT5dRGCjZTnGpDIFtxQa8IvRjnPpY3iUptgPlqTLOw3VA==",
"license": "MIT",
"dependencies": {
- "@graphql-tools/utils": "^11.1.0",
+ "@graphql-tools/utils": "^11.1.1",
"@graphql-typed-document-node/core": "^3.2.0",
"@repeaterjs/repeater": "^3.0.4",
"@whatwg-node/disposablestack": "^0.0.6",
@@ -2564,9 +2669,9 @@
}
},
"node_modules/@graphql-tools/executor-http": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-3.2.1.tgz",
- "integrity": "sha512-53i0TYO0cznIlZDJcnq4gQ6SOZ8efGgCDV33MYh6oqEapcp36tCMEVnVGVxcX5qRRyNHkqTY6hkA+/AyK9kicQ==",
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-3.3.0.tgz",
+ "integrity": "sha512-IkKXIjSg9U8MNsQUBVJAXE4+LSxaQ0cs7p5JTALLGDABY1o17vPDRwWALsX81AXD5dY27ihi/+OhGMueW/Fopg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2588,17 +2693,17 @@
}
},
"node_modules/@graphql-tools/executor-legacy-ws": {
- "version": "1.1.28",
- "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.1.28.tgz",
- "integrity": "sha512-O4uj93GG9iUb3s32eyhUohvyfA8mLhN8FvGzEdK628hFQPhZN75yurtVFrR08DHex71mQ3wYCCFkErpwdJbDDQ==",
+ "version": "1.1.29",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.1.29.tgz",
+ "integrity": "sha512-Z8fBtK8Uyp1Lyt3UgRu6BPx1fL3wvnGiRS1Wbb+nWQuwGacXDS8Pfr2e5BmV3OCHG2prbkJMr+caVFMWCbt9ug==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@graphql-tools/utils": "^11.1.0",
+ "@graphql-tools/utils": "^11.1.1",
"@types/ws": "^8.0.0",
"isomorphic-ws": "^5.0.0",
"tslib": "^2.4.0",
- "ws": "^8.20.0"
+ "ws": "^8.21.0"
},
"engines": {
"node": ">=16.0.0"
@@ -2608,14 +2713,14 @@
}
},
"node_modules/@graphql-tools/git-loader": {
- "version": "8.0.36",
- "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-8.0.36.tgz",
- "integrity": "sha512-PDDakesRu8FJYHJLf9/gkTweh8M19Bymz9i+vOlk9OTs9XmNcCqKM+1S610KX2AodvuBFz/xbesjTtTJIppLPg==",
+ "version": "8.0.37",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-8.0.37.tgz",
+ "integrity": "sha512-J1GNGyjb8inHWXt4F9n5flmaiwhYP9WcwTWBs/fSeXikppcz+yGOO4BM0xx9BOEROxKW5fDM6UT9MdRCcs++zw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@graphql-tools/graphql-tag-pluck": "8.3.31",
- "@graphql-tools/utils": "^11.1.0",
+ "@graphql-tools/graphql-tag-pluck": "8.3.32",
+ "@graphql-tools/utils": "^11.1.1",
"is-glob": "4.0.3",
"micromatch": "^4.0.8",
"tslib": "^2.4.0",
@@ -2629,15 +2734,15 @@
}
},
"node_modules/@graphql-tools/github-loader": {
- "version": "9.1.2",
- "resolved": "https://registry.npmjs.org/@graphql-tools/github-loader/-/github-loader-9.1.2.tgz",
- "integrity": "sha512-jhRJncj9Wkr1Cd8Mo3QI2oG6fTw5ILr1/OXcHIqx744NBj8pPwQBXmQzZqh7MXxbekl2EAcum7SJIjq1HpYcPA==",
+ "version": "9.1.3",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/github-loader/-/github-loader-9.1.3.tgz",
+ "integrity": "sha512-sKxjy4zZ12ci0y4Wd/rl7odyl7dN1EU6Ttx8nhHHZs+VXaaasNoAni2pOrll8IR1wlYWhAe0hLBQDWblp7gWiw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@graphql-tools/executor-http": "^3.2.1",
- "@graphql-tools/graphql-tag-pluck": "^8.3.31",
- "@graphql-tools/utils": "^11.1.0",
+ "@graphql-tools/executor-http": "^3.3.0",
+ "@graphql-tools/graphql-tag-pluck": "^8.3.32",
+ "@graphql-tools/utils": "^11.1.1",
"@whatwg-node/fetch": "^0.10.13",
"@whatwg-node/promise-helpers": "^1.0.0",
"sync-fetch": "0.6.0",
@@ -2651,14 +2756,14 @@
}
},
"node_modules/@graphql-tools/graphql-file-loader": {
- "version": "8.1.14",
- "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.1.14.tgz",
- "integrity": "sha512-CfAcsSEVkkHfEXLFzrd5rUYpcQEGWNV8lfc1Tb1p5m9HnYICzDDH08I5V33iMrEDza3GuujjjRBYqplBkqwIow==",
+ "version": "8.1.15",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.1.15.tgz",
+ "integrity": "sha512-ehK6IuX1G2Rc1uVaEUE/M+D7JAGnBux+Ia/BPL92WNcTYBcvYZfFPuR9JA5Fn1wOxplRiRFyERzQEMltZF0nhg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@graphql-tools/import": "^7.1.14",
- "@graphql-tools/utils": "^11.1.0",
+ "@graphql-tools/import": "^7.1.15",
+ "@graphql-tools/utils": "^11.1.1",
"globby": "^11.0.3",
"tslib": "^2.4.0",
"unixify": "^1.0.0"
@@ -2671,18 +2776,18 @@
}
},
"node_modules/@graphql-tools/graphql-tag-pluck": {
- "version": "8.3.31",
- "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.31.tgz",
- "integrity": "sha512-ema2RRPZGj8TKruNElyDBHVCNFMxioGIVfLBuiA+GdfmRGt95b/i7Uksnj4EwItA6MCmhxokxZoa/fl6mJt3tw==",
+ "version": "8.3.32",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.32.tgz",
+ "integrity": "sha512-5CuTW3kSv7fQ6gsaGS/A+tL3wXeLBN1vMQF5MDFhyv+GIpMYdOzbcaGrLIppxFam7IAu+ZUri8s6fxsdreL4Lw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/core": "^7.28.6",
- "@babel/parser": "^7.29.2",
+ "@babel/core": "^7.29.7",
+ "@babel/parser": "^7.29.3",
"@babel/plugin-syntax-import-assertions": "^7.26.0",
"@babel/traverse": "^7.26.10",
"@babel/types": "^7.26.10",
- "@graphql-tools/utils": "^11.1.0",
+ "@graphql-tools/utils": "^11.1.1",
"tslib": "^2.4.0"
},
"engines": {
@@ -2693,13 +2798,13 @@
}
},
"node_modules/@graphql-tools/import": {
- "version": "7.1.14",
- "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-7.1.14.tgz",
- "integrity": "sha512-aqLcu04aEidszbXM6M0PWWL8bP17eX9sxXwjYWpglLvIRd4NFqb3C9QzBY8pleqXNMtWqXktlm9BQjevgSrirQ==",
+ "version": "7.1.15",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-7.1.15.tgz",
+ "integrity": "sha512-uzMakKZsbKzfiJhKIjf4Hk2kft5rQGch+VITNURVGTZ3t6S4nek++EqeGFlJAR7V2vc2/Lqwpw2vCTDFpx+oZA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@graphql-tools/utils": "^11.1.0",
+ "@graphql-tools/utils": "^11.1.1",
"resolve-from": "5.0.0",
"tslib": "^2.4.0"
},
@@ -2711,13 +2816,13 @@
}
},
"node_modules/@graphql-tools/json-file-loader": {
- "version": "8.0.28",
- "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-8.0.28.tgz",
- "integrity": "sha512-qgCsSkPArnjlNkcYpgGKiXxCTNkrAT9E+l1LhR+Por2jTlKBBeZ8stortkQ/PNDDjuL0WPrLQmHKhNPHabnB3A==",
+ "version": "8.0.29",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-8.0.29.tgz",
+ "integrity": "sha512-2fZzOmffPOg/B0nCcGRS2MMR6d73Dh5vv9zC0xIoX9Ju3oXhXpdbvSCTvNXdt3ifXP++CjfAVunq0x9PL6Uekg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@graphql-tools/utils": "^11.1.0",
+ "@graphql-tools/utils": "^11.1.1",
"globby": "^11.0.3",
"tslib": "^2.4.0",
"unixify": "^1.0.0"
@@ -2730,14 +2835,14 @@
}
},
"node_modules/@graphql-tools/load": {
- "version": "8.1.10",
- "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-8.1.10.tgz",
- "integrity": "sha512-hjcvfEFtwtc8vGi46wtpmGWadNzfEhzbjqinyFIZuIZPlR4aYdWQtqWtY/RMM4Ew4t1USkMNm6xrqC2TH1vCSA==",
+ "version": "8.1.11",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-8.1.11.tgz",
+ "integrity": "sha512-6J0PmYecHnUF6lI5QhtTXj7JYzyFi5gvgER7nS2wqLpjdOfOI+jsO1/gbXF3iS6i/ABulGBh7eyr0nmDNNwlyQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@graphql-tools/schema": "^10.0.33",
- "@graphql-tools/utils": "^11.1.0",
+ "@graphql-tools/schema": "^10.0.34",
+ "@graphql-tools/utils": "^11.1.1",
"p-limit": "3.1.0",
"tslib": "^2.4.0"
},
@@ -2749,12 +2854,12 @@
}
},
"node_modules/@graphql-tools/merge": {
- "version": "9.1.9",
- "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.1.9.tgz",
- "integrity": "sha512-iHUWNjRHeQRYdgIMIuChThOwoKzA9vrzYeslgfBo5eUYEyHGZCoDPjAavssoYXLwstYt1dZj2J22jSzc2DrN0Q==",
+ "version": "9.1.10",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.1.10.tgz",
+ "integrity": "sha512-CsUCcPXv/HMWpPZ/xoOioSWFuAaAsGGPIdqQbjDv9X1sHGs0muQRW5FK7vUBN4OH/D7aPqpiHvKmRsrHz+ScuQ==",
"license": "MIT",
"dependencies": {
- "@graphql-tools/utils": "^11.1.0",
+ "@graphql-tools/utils": "^11.1.1",
"tslib": "^2.4.0"
},
"engines": {
@@ -2781,14 +2886,14 @@
}
},
"node_modules/@graphql-tools/relay-operation-optimizer": {
- "version": "7.1.4",
- "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.1.4.tgz",
- "integrity": "sha512-cwOD/GEo/R//1uGCP0/urIxsMFoUgzkJVyMt9BDM2HhQhU6rSgH5l6lFukAFTJyPJVdyeOdYm2i0Jj5vYWbHTw==",
+ "version": "7.1.5",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.1.5.tgz",
+ "integrity": "sha512-B3nscUeWT3wYucrvbJcmU8sAVlkCp+WhZ5wVlK432AfnLjDYUNLobHYzQnnU7tT5NncMXusPiS8K4YG4iUPjrw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@ardatan/relay-compiler": "^13.0.1",
- "@graphql-tools/utils": "^11.1.0",
+ "@graphql-tools/utils": "^11.1.1",
"tslib": "^2.4.0"
},
"engines": {
@@ -2799,13 +2904,13 @@
}
},
"node_modules/@graphql-tools/schema": {
- "version": "10.0.33",
- "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.33.tgz",
- "integrity": "sha512-O6P3RIftO0jafnSsFAqpjurUuUxJ43s/AdPVLQsBkI6y4Ic/tKm4C1Qm1KKQsCDTOxXPJClh/v3g7k7yLKCFBQ==",
+ "version": "10.0.34",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.34.tgz",
+ "integrity": "sha512-wGCiUuwqDtlXtDvQ00CI+4u0pd3yd/xGGYOiwc9L63KJZwSXdrUv8ajpJ5lMalawc0mpjcCB0ljEQSeUhajuag==",
"license": "MIT",
"dependencies": {
- "@graphql-tools/merge": "^9.1.9",
- "@graphql-tools/utils": "^11.1.0",
+ "@graphql-tools/merge": "^9.1.10",
+ "@graphql-tools/utils": "^11.1.1",
"tslib": "^2.4.0"
},
"engines": {
@@ -2816,16 +2921,16 @@
}
},
"node_modules/@graphql-tools/url-loader": {
- "version": "9.1.2",
- "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-9.1.2.tgz",
- "integrity": "sha512-pVSiPrfWQKb3jq23Pl7EjbB2uv3tgZLnWo/axkmg4itAEZ5s/vV/jKa8P1HZzUnSVUTR+8tcEZVeNsUbzFCbkg==",
+ "version": "9.1.3",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-9.1.3.tgz",
+ "integrity": "sha512-i8rZVsXzYe8klXbIUXxRkMK5bHloM9JyFnHzSYdzciRPxym8QzDnL3QY4eZjS4luDb2DdJ8Ak0G8ghJ0BSVTVw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@graphql-tools/executor-graphql-ws": "^3.1.4",
- "@graphql-tools/executor-http": "^3.2.1",
- "@graphql-tools/executor-legacy-ws": "^1.1.28",
- "@graphql-tools/utils": "^11.1.0",
+ "@graphql-tools/executor-http": "^3.3.0",
+ "@graphql-tools/executor-legacy-ws": "^1.1.29",
+ "@graphql-tools/utils": "^11.1.1",
"@graphql-tools/wrap": "^11.1.1",
"@types/ws": "^8.0.0",
"@whatwg-node/fetch": "^0.10.13",
@@ -2833,7 +2938,7 @@
"isomorphic-ws": "^5.0.0",
"sync-fetch": "0.6.0",
"tslib": "^2.4.0",
- "ws": "^8.20.0"
+ "ws": "^8.21.0"
},
"engines": {
"node": ">=20.0.0"
@@ -2843,9 +2948,9 @@
}
},
"node_modules/@graphql-tools/utils": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.1.0.tgz",
- "integrity": "sha512-PtFVG4r8Z2LEBSaPYQMusBiB3o6kjLVJyjCLbnWem/SpSuM21v6LTmgpkXfYU1qpBV2UGsFyuEnSJInl8fR1Ag==",
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.1.1.tgz",
+ "integrity": "sha512-MuWwacINZZV6mX1ZSk6CcV4XVQLsbKBG/hLd0QPhe4GHxjqr2ATjKsnnwlB0TKI+QQvj2U8ewu8WeAzz9kC2Xg==",
"license": "MIT",
"dependencies": {
"@graphql-typed-document-node/core": "^3.1.1",
@@ -2861,13 +2966,13 @@
}
},
"node_modules/@graphql-tools/wrap": {
- "version": "11.1.14",
- "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-11.1.14.tgz",
- "integrity": "sha512-ebSVT7apxr+88q3Wy0i4AyRmJ42I0SuMqjPIn1fqW14yCTQRZG8YLuIALG1gKR936+GkfMLOrADh6egJvdlN6Q==",
+ "version": "11.1.16",
+ "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-11.1.16.tgz",
+ "integrity": "sha512-JW1XGFTmltXa537J2bAr8dN/n6EWwiBuM9q8V8mWqZ0eWrf++/TT3/mlV3c0M8B8nrS/lqSsotIwPAtVZR8sWQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@graphql-tools/delegate": "^12.0.14",
+ "@graphql-tools/delegate": "^12.0.17",
"@graphql-tools/schema": "^10.0.29",
"@graphql-tools/utils": "^11.0.0",
"@whatwg-node/promise-helpers": "^1.3.2",
@@ -2966,9 +3071,9 @@
"license": "BSD-3-Clause"
},
"node_modules/@hapi/wreck": {
- "version": "18.1.0",
- "resolved": "https://registry.npmjs.org/@hapi/wreck/-/wreck-18.1.0.tgz",
- "integrity": "sha512-0z6ZRCmFEfV/MQqkQomJ7sl/hyxvcZM7LtuVqN3vdAO4vM9eBbowl0kaqQj9EJJQab+3Uuh1GxbGIBFy4NfJ4w==",
+ "version": "18.1.2",
+ "resolved": "https://registry.npmjs.org/@hapi/wreck/-/wreck-18.1.2.tgz",
+ "integrity": "sha512-3dMnV2pfhQiyEqu8DL3VBmxkdLiRDiiUDuG79Dp+UK1gL9ZxAfDOUhB6k3D5MLqcgJJ1IARyGFhwoc1NITr/pg==",
"license": "BSD-3-Clause",
"dependencies": {
"@hapi/boom": "^10.0.1",
@@ -3185,6 +3290,9 @@
"arm"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -3202,6 +3310,9 @@
"arm64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -3219,6 +3330,9 @@
"ppc64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -3236,6 +3350,9 @@
"riscv64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -3253,6 +3370,9 @@
"s390x"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -3270,6 +3390,9 @@
"x64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -3287,6 +3410,9 @@
"arm64"
],
"dev": true,
+ "libc": [
+ "musl"
+ ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -3304,6 +3430,9 @@
"x64"
],
"dev": true,
+ "libc": [
+ "musl"
+ ],
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -3321,6 +3450,9 @@
"arm"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -3344,6 +3476,9 @@
"arm64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -3367,6 +3502,9 @@
"ppc64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -3390,6 +3528,9 @@
"riscv64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -3413,6 +3554,9 @@
"s390x"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -3436,6 +3580,9 @@
"x64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -3459,6 +3606,9 @@
"arm64"
],
"dev": true,
+ "libc": [
+ "musl"
+ ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -3482,6 +3632,9 @@
"x64"
],
"dev": true,
+ "libc": [
+ "musl"
+ ],
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -3928,9 +4081,9 @@
}
},
"node_modules/@internationalized/date": {
- "version": "3.12.1",
- "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.12.1.tgz",
- "integrity": "sha512-6IedsVWXyq4P9Tj+TxuU8WGWM70hYLl12nbYU8jkikVpa6WXapFazPUcHUMDMoWftIDE2ILDkFFte6W2nFCkRQ==",
+ "version": "3.12.2",
+ "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.12.2.tgz",
+ "integrity": "sha512-FY1Y+H64NDs+HAF6omlnWxm3mEpfgaCSWtL5l551ZZfImA+kGjPFgrnJrGjH6lfmLL0g8Z/mBu1R3kufeCp6Jw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -3938,9 +4091,9 @@
}
},
"node_modules/@internationalized/number": {
- "version": "3.6.6",
- "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.6.tgz",
- "integrity": "sha512-iFgmQaXHE0vytNfpLZWOC2mEJCBRzcUxt53Xf/yCXG93lRvqas237i3r7X4RKMwO3txiyZD4mQjKAByFv6UGSQ==",
+ "version": "3.6.7",
+ "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.7.tgz",
+ "integrity": "sha512-3ji1fcrT+FPAK86UqEhB/psHixYo6niWPJtt7+qRaYFynt/BaJG8GhAPimtWUpEiVSTq8ZM8L5psMxGquiB/Vg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -3948,9 +4101,9 @@
}
},
"node_modules/@internationalized/string": {
- "version": "3.2.8",
- "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.2.8.tgz",
- "integrity": "sha512-NdbMQUSfXLYIQol5VyMtinm9pZDciiMfN7RtmSuSB78io1hqwJ0naYfxyW6vgxWBkzWymQa/3uLDlbfmshtCaA==",
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.2.9.tgz",
+ "integrity": "sha512-kzP/M/mbQxODlmOt4bIQZ2SBVUWUSqMLXooXixnX7noche8WHaQcA+nwFN1K2KCF/cp+LDUhcJsCicwkvhD1pg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -4092,25 +4245,25 @@
"license": "MIT"
},
"node_modules/@mongodb-js/saslprep": {
- "version": "1.4.9",
- "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.4.9.tgz",
- "integrity": "sha512-RXSxsokhAF/4nWys8An8npsqOI33Ex1Hlzqjw2pZOO+GKtMAR2noGnUdsFiGwsaO/xXI+56mtjTmDA3JXJsvmA==",
+ "version": "1.4.12",
+ "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.4.12.tgz",
+ "integrity": "sha512-QAfAMwNgnYxZ2C6D1HgeP7Gc4i/uvJRim415PCIL9ptRxWMNbWeLBYb2/9R4pGKny/s1FVu2JA2cxCUBUOggrA==",
"license": "MIT",
"dependencies": {
"sparse-bitfield": "^3.0.3"
}
},
"node_modules/@next/env": {
- "version": "16.2.4",
- "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.4.tgz",
- "integrity": "sha512-dKkkOzOSwFYe5RX6y26fZgkSpVAlIOJKQHIiydQcrWH6y/97+RceSOAdjZ14Qa3zLduVUy0TXcn+EiM6t4rPgw==",
+ "version": "16.2.10",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.10.tgz",
+ "integrity": "sha512-zLPxg9M0MEHmygpj5OuxjQ+vHMiy/K7cSp74G8ecYolmgUWw0RwN02tF56npup/+qaI8JB97hQgS/r2Hb6QwVA==",
"dev": true,
"license": "MIT"
},
"node_modules/@next/eslint-plugin-next": {
- "version": "16.2.4",
- "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.4.tgz",
- "integrity": "sha512-tOX826JJ96gYK/go18sPUgMq9FK1tqxBFfUCEufJb5XIkWFFmpgU7mahJANKGkHs7F41ir3tReJ3Lv5La0RvhA==",
+ "version": "16.2.10",
+ "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.10.tgz",
+ "integrity": "sha512-Gs8D2m21VnJeFo9qvYIIqJH94frWerWYu41BprU1pLtRVF7PCQNLiFZZ3fG+iPuj3K83Cwv/rt+msLOy8Qgu3Q==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4118,9 +4271,9 @@
}
},
"node_modules/@next/swc-darwin-arm64": {
- "version": "16.2.4",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.4.tgz",
- "integrity": "sha512-OXTFFox5EKN1Ym08vfrz+OXxmCcEjT4SFMbNRsWZE99dMqt2Kcusl5MqPXcW232RYkMLQTy0hqgAMEsfEd/l2A==",
+ "version": "16.2.10",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.10.tgz",
+ "integrity": "sha512-v9IdJCa0H0mbo+8z5zwUpOk1Vj7RjkcI5uNYf5Ws1y6szf/p3Mzl9hLaST8SCt6L9h8NGnruZcd2+o0NTNwDhA==",
"cpu": [
"arm64"
],
@@ -4135,9 +4288,9 @@
}
},
"node_modules/@next/swc-darwin-x64": {
- "version": "16.2.4",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.4.tgz",
- "integrity": "sha512-XhpVnUfmYWvD3YrXu55XdcAkQtOnvaI6wtQa8fuF5fGoKoxIUZ0kWPtcOfqJEWngFF/lOS9l3+O9CcownhiQxQ==",
+ "version": "16.2.10",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.10.tgz",
+ "integrity": "sha512-17IS0jJRViROGmA9uGdNR8VPJpfbnaVG7E9qhso5jDLkmyd0lSDORWxbcKINzcFqzZqGwGtMSnrFRxBpuUYjLQ==",
"cpu": [
"x64"
],
@@ -4152,13 +4305,16 @@
}
},
"node_modules/@next/swc-linux-arm64-gnu": {
- "version": "16.2.4",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.4.tgz",
- "integrity": "sha512-Mx/tjlNA3G8kg14QvuGAJ4xBwPk1tUHq56JxZ8CXnZwz1Etz714soCEzGQQzVMz4bEnGPowzkV6Xrp6wAkEWOQ==",
+ "version": "16.2.10",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.10.tgz",
+ "integrity": "sha512-GRQRsRtuciNJvB54AvvuQTiq0oZtFwa1owQqtZD8wwnGpM2L39MV22kpI72YSXLKIyY40LC66EiLFv4PiicXxg==",
"cpu": [
"arm64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -4169,13 +4325,16 @@
}
},
"node_modules/@next/swc-linux-arm64-musl": {
- "version": "16.2.4",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.4.tgz",
- "integrity": "sha512-iVMMp14514u7Nup2umQS03nT/bN9HurK8ufylC3FZNykrwjtx7V1A7+4kvhbDSCeonTVqV3Txnv0Lu+m2oDXNg==",
+ "version": "16.2.10",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.10.tgz",
+ "integrity": "sha512-zkN9MQYS7UQBro+FnISUq1itaQjXI9xqISzuQ+2bc921NcJ1x4yPCqrn77tVN6/dOOXaaWVX3k6/bR07pPwK+A==",
"cpu": [
"arm64"
],
"dev": true,
+ "libc": [
+ "musl"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -4186,13 +4345,16 @@
}
},
"node_modules/@next/swc-linux-x64-gnu": {
- "version": "16.2.4",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.4.tgz",
- "integrity": "sha512-EZOvm1aQWgnI/N/xcWOlnS3RQBk0VtVav5Zo7n4p0A7UKyTDx047k8opDbXgBpHl4CulRqRfbw3QrX2w5UOXMQ==",
+ "version": "16.2.10",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.10.tgz",
+ "integrity": "sha512-iCVJnwvrPYECvA6WM/7+oo+OiTvedIKLxtCLAZP4xZR3nXa1zmzZyLPbYCmWvpd4CvMYF1EMTafd0ii3DygLvA==",
"cpu": [
"x64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -4203,13 +4365,16 @@
}
},
"node_modules/@next/swc-linux-x64-musl": {
- "version": "16.2.4",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.4.tgz",
- "integrity": "sha512-h9FxsngCm9cTBf71AR4fGznDEDx1hS7+kSEiIRjq5kO1oXWm07DxVGZjCvk0SGx7TSjlUqhI8oOyz7NfwAdPoA==",
+ "version": "16.2.10",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.10.tgz",
+ "integrity": "sha512-ov2g4H0dHY9bPoOU83m91hWT7Iq5qy13bUnyyshLU3HGR1Ownn0X9QpmDPc5iIUaahTp7f7LeGAhV4DSFtackw==",
"cpu": [
"x64"
],
"dev": true,
+ "libc": [
+ "musl"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -4220,9 +4385,9 @@
}
},
"node_modules/@next/swc-win32-arm64-msvc": {
- "version": "16.2.4",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.4.tgz",
- "integrity": "sha512-3NdJV5OXMSOeJYijX+bjaLge3mJBlh4ybydbT4GFoB/2hAojWHtMhl3CYlYoMrjPuodp0nzFVi4Tj2+WaMg+Ow==",
+ "version": "16.2.10",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.10.tgz",
+ "integrity": "sha512-DwAnhLX76HQiFFQNgWlcK+JzlnD1rZ+UK/WY0ZMI/deXpvgnesjNYrqcfo1JzBuz4Kf7o3brIBL0glI1junatA==",
"cpu": [
"arm64"
],
@@ -4237,9 +4402,9 @@
}
},
"node_modules/@next/swc-win32-x64-msvc": {
- "version": "16.2.4",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.4.tgz",
- "integrity": "sha512-kMVGgsqhO5YTYODD9IPGGhA6iprWidQckK3LmPeW08PIFENRmgfb4MjXHO+p//d+ts2rpjvK5gXWzXSMrPl9cw==",
+ "version": "16.2.10",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.10.tgz",
+ "integrity": "sha512-0JXq3b85Jk9Jg4ntLUbXSPvoDw3gpZou7twuKdoFG2jOw635v7+IiXfTaa0TxVMyx78pUjnrVYwLgjKfX4e6/A==",
"cpu": [
"x64"
],
@@ -4281,9 +4446,9 @@
}
},
"node_modules/@nodable/entities": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.0.tgz",
- "integrity": "sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-9uGyhaQavEUMC8AIddIjau4NsnsXhou+j5sBAGojCM1oxmQpVKTWR/9JxABD6UAv12vpIms55fPZKFQEhG6uBg==",
"dev": true,
"funding": [
{
@@ -4332,9 +4497,9 @@
}
},
"node_modules/@opentelemetry/api": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz",
- "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==",
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz",
+ "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==",
"dev": true,
"license": "Apache-2.0",
"engines": {
@@ -4358,9 +4523,9 @@
}
},
"node_modules/@passwordless-id/webauthn": {
- "version": "2.3.5",
- "resolved": "https://registry.npmjs.org/@passwordless-id/webauthn/-/webauthn-2.3.5.tgz",
- "integrity": "sha512-b/Nrsd9nkkLAKDybUmgQOLcjF5eILO3vjo6uVsvmCGD0XDacGB9b8wFnZGMnBMqvu8eDl5wYGrZ9PoaZ1ODlhw==",
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/@passwordless-id/webauthn/-/webauthn-2.4.0.tgz",
+ "integrity": "sha512-xOuI2/7nSgxEt6aFnJYOayoq2SHNplqEsHf1A40rTfmU/7LKs97LiyAumFzqxymHPc/eZNeHpJtqFcr3WFN9JQ==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/passwordless-id"
@@ -4373,27 +4538,27 @@
"license": "MIT"
},
"node_modules/@pkgr/core": {
- "version": "0.2.9",
- "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz",
- "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==",
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz",
+ "integrity": "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==",
"dev": true,
"license": "MIT",
"engines": {
- "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ "node": "^14.18.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/pkgr"
}
},
"node_modules/@react-aria/focus": {
- "version": "3.22.0",
- "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.22.0.tgz",
- "integrity": "sha512-ZfDOVuVhqDsM9mkNji3QUZ/d40JhlVgXrDkrfXylM1035QCrcTHN7m2DpbE95sU2A8EQb4wikvt5jM6K/73BPg==",
+ "version": "3.22.1",
+ "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.22.1.tgz",
+ "integrity": "sha512-CPxtkyrBi/HYY5P3lE/57sQ6qfa0lN8E55TOm89H0kNGv0lKt+/0zP7lWERzBjRr5IxBVrQX4gFEowBN52LPaA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@swc/helpers": "^0.5.0",
- "react-aria": "3.48.0"
+ "react-aria": "^3.48.0"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
@@ -4401,15 +4566,15 @@
}
},
"node_modules/@react-aria/interactions": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.28.0.tgz",
- "integrity": "sha512-OXwdU1EWFdMxmr/K1CXNGJzmNlCClByb+PuCaqUyzBymHPCGVhawirLIon/CrIN5psh3AiWpHSh4H0WeJdVpng==",
+ "version": "3.28.1",
+ "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.28.1.tgz",
+ "integrity": "sha512-Bqb+HrD5I5MHS2SKBhISYqo2SW8Y2dfzgF/Y1lIJq7xqLxheo9vzxPGEHhz+XzkgGfoqEJx8A6a3C7uiqS3HWA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@react-types/shared": "^3.34.0",
"@swc/helpers": "^0.5.0",
- "react-aria": "3.48.0"
+ "react-aria": "^3.48.0"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1",
@@ -4417,9 +4582,9 @@
}
},
"node_modules/@react-types/shared": {
- "version": "3.34.0",
- "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.34.0.tgz",
- "integrity": "sha512-gp6xo/s2lX54AlTjOiqwDnxA7UW79BNvI9dB9pr3LZTzRKCd1ZA+ZbgKw/ReIiWuvvVw/8QFJpnqeeFyLocMcQ==",
+ "version": "3.36.0",
+ "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.36.0.tgz",
+ "integrity": "sha512-DkP/H0C2YjjS7gZWKNqOmU8a16qHPjQNdzMwmTq9SzplM6Iw0kVMTZ0OIoe6FOgGqa+FwMsE2QbPjh/n3g/jXQ==",
"dev": true,
"license": "Apache-2.0",
"peerDependencies": {
@@ -4452,9 +4617,9 @@
}
},
"node_modules/@reduxjs/toolkit": {
- "version": "2.11.2",
- "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz",
- "integrity": "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==",
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.12.0.tgz",
+ "integrity": "sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4478,27 +4643,16 @@
}
}
},
- "node_modules/@reduxjs/toolkit/node_modules/immer": {
- "version": "11.1.4",
- "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.4.tgz",
- "integrity": "sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/immer"
- }
- },
"node_modules/@repeaterjs/repeater": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.6.tgz",
- "integrity": "sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.1.0.tgz",
+ "integrity": "sha512-TaoVksZRSx2KWYYpyLQtMQXXeS98VsgZImzW65xmiVgbYhXLk+aEsmzPLirqVuE4/XuUapH2iMtxUzaBNDzdSQ==",
"license": "MIT"
},
"node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.61.0.tgz",
- "integrity": "sha512-dnxczajOqt0gesZlN5pGQ1s1imQVrsmCw5G2Ci4oM+0WvNz3pyRnlWrT7McoZIb8VlFwCawdmbWRmxRn7HI+VQ==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz",
+ "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==",
"cpu": [
"arm"
],
@@ -4510,9 +4664,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.61.0.tgz",
- "integrity": "sha512-Bp3JpGP00Vu3f238ivRrjf7z3xSzVPXqCmaJYA9t2c+c8vKYvOzmXF7LkkeUalTEGd6cZcSWe+PFIP3Vy48fRg==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz",
+ "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==",
"cpu": [
"arm64"
],
@@ -4524,9 +4678,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.61.0.tgz",
- "integrity": "sha512-zaYIpr670mUmmZ1tVzUFplbQbG7h3Gugx3L5FoqhsC2m/YnLlR1a7zVLmXNPy+iY1tFPEbNG+HHBXZGyId0G5w==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz",
+ "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==",
"cpu": [
"arm64"
],
@@ -4538,9 +4692,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.61.0.tgz",
- "integrity": "sha512-+P49fvkv2dSoeevUW+lgZ/I2JHSsJCK1Lyjj7Cu6E4UHG4tS9XIefzIjo5qhgELjAclnen1rLzK2PMKJdo+Dyg==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz",
+ "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==",
"cpu": [
"x64"
],
@@ -4552,9 +4706,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.61.0.tgz",
- "integrity": "sha512-l3FAAOyKJXH2ea6KNFN+MMgC/rnE94YGLXs2ehYqDcCoHt1DpvgWX75BhUJxN38XojP7Ul+4H8PRn7EdyqSDrw==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz",
+ "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==",
"cpu": [
"arm64"
],
@@ -4566,9 +4720,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.61.0.tgz",
- "integrity": "sha512-VokPN3TSctKj65cyCNPaUh4vMFA8awxOot/0sp+4J7ZlNRKQEhXhawqPwajoi8H5ZFt61i0ugZJuTKXBjGJ17Q==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz",
+ "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==",
"cpu": [
"x64"
],
@@ -4580,9 +4734,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.61.0.tgz",
- "integrity": "sha512-DxH0P3wxm+Yzs/p3zrk9dw1rURu8p0Nv5+MRK/L7OtnLNg5rLZraSBFZ8iUXOd9f2BlhJyEpIZUH/emjq4UJ4g==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz",
+ "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==",
"cpu": [
"arm"
],
@@ -4597,9 +4751,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.61.0.tgz",
- "integrity": "sha512-T6ZvMNe84kAz6TBWHC7hGAoEtzP1LWYw/AqayGWEF6uISt3Abk/st06LqRD9THd7Xz3NxzurUpzAuEAUbZf+nw==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz",
+ "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==",
"cpu": [
"arm"
],
@@ -4614,9 +4768,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.61.0.tgz",
- "integrity": "sha512-q/4hzvQkDs8b4jIBab1pnLiiM0ayTZsN2amBFPDzuyZxjEd4wDwx0UJFYM3cOZzSf5Kw8fnWSprJzIBMkcR44Q==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz",
+ "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==",
"cpu": [
"arm64"
],
@@ -4631,9 +4785,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.61.0.tgz",
- "integrity": "sha512-vvYWX3akdEAY6km+9wAqFDnk6pQsbJKVnj7xawcvs/+fdlYBGp+U+Qq/lLfpIxYIZvZLHMAKD9HLdacSx/r3dw==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz",
+ "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==",
"cpu": [
"arm64"
],
@@ -4648,9 +4802,9 @@
]
},
"node_modules/@rollup/rollup-linux-loong64-gnu": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.61.0.tgz",
- "integrity": "sha512-DePa5cqOxDP/Zp0VOXpeWaGew5iIv5DXp9NYbzkX5PFQyWVX9184WCTh3hvr/7lhXo8ZVlbFLkz8+o/q1dU6gA==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz",
+ "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==",
"cpu": [
"loong64"
],
@@ -4665,9 +4819,9 @@
]
},
"node_modules/@rollup/rollup-linux-loong64-musl": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.61.0.tgz",
- "integrity": "sha512-LV8aWMB8UChglMCEzs7RkN0GsH29RJaLLqwm9fCIjlqwxQTiWAqNcc7wjBkH31hV0PU/yVxGYvrYsgfea2qw6g==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz",
+ "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==",
"cpu": [
"loong64"
],
@@ -4682,9 +4836,9 @@
]
},
"node_modules/@rollup/rollup-linux-ppc64-gnu": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.61.0.tgz",
- "integrity": "sha512-QoNSnwQtaeNu5grdBbsL0tt1uyl5EnS8DA8Mr3nluMXbhdQNyhN+G4tBax7VCdxLKj8YJ0/4OO9Ho84jMnJtKA==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz",
+ "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==",
"cpu": [
"ppc64"
],
@@ -4699,9 +4853,9 @@
]
},
"node_modules/@rollup/rollup-linux-ppc64-musl": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.61.0.tgz",
- "integrity": "sha512-/zZp5MKapIIApE8trN8qLGNSiRN9TUoaUZ1cmVu4XnVdd5LQLOXTtyi+vtfUbNnT3iyjzpPqYeKXmvJ+gJGYWw==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz",
+ "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==",
"cpu": [
"ppc64"
],
@@ -4716,9 +4870,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.61.0.tgz",
- "integrity": "sha512-RbrzcD3aJ1k3UbtMRRBNwojdVVyXjuVAFTfn/xPa6EEl6GE9Sm/akPgFTb9aAC9pMKGJ6CtWxaGrqWcabH+ySg==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz",
+ "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==",
"cpu": [
"riscv64"
],
@@ -4733,9 +4887,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-musl": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.61.0.tgz",
- "integrity": "sha512-ZF+onDsBso8PJf1XaG9lB+O9RnBpKGnY6OrzC4CSHrtC1jb6jWLTKK4bRqdoCXHd22gyr2hiYmEAm8Wns/BOCw==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz",
+ "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==",
"cpu": [
"riscv64"
],
@@ -4750,9 +4904,9 @@
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.61.0.tgz",
- "integrity": "sha512-Atk0aSIk5Zx2Wuh9dgRQgLP0Koc8hOeYpbWryMXyk8G8/HmPkwPPkMqIIDhrXHHYqfUzSJA/I7IWSBv8xSmRBA==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz",
+ "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==",
"cpu": [
"s390x"
],
@@ -4767,9 +4921,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.61.0.tgz",
- "integrity": "sha512-0uMOcf3eZ5K+K4cYHkdxShFMPlPXCOdfDFEFn9dNYAEEd2cVvmOfH7zFgRVoDgmtQ1m9k5q7qfrHzyMAubKYUA==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz",
+ "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==",
"cpu": [
"x64"
],
@@ -4784,9 +4938,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.61.0.tgz",
- "integrity": "sha512-mvFtE4A/t/7hRJ7X8Ozmu8FsIkAUat2nzl12pgU337BRmq87AQUJztwHz2Zv5/tjo9/C95E66CK03SI/ToEDJw==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz",
+ "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==",
"cpu": [
"x64"
],
@@ -4801,9 +4955,9 @@
]
},
"node_modules/@rollup/rollup-openbsd-x64": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.61.0.tgz",
- "integrity": "sha512-z9b9+aTxvt8n2rNltMPvyaUfB8NJ+CVyOrGK/MdIKHx7B+lXmZpm/XbRsU7Rpf3fRqJ2uS6mBJiJveCtq8LHDg==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz",
+ "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==",
"cpu": [
"x64"
],
@@ -4815,9 +4969,9 @@
]
},
"node_modules/@rollup/rollup-openharmony-arm64": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.61.0.tgz",
- "integrity": "sha512-jXaXFqKMehsOc+g8R6oo33RRC6w07G9jDBxAE5eAKX7mOcCbZloYIPNhfG9Wl+P9O9IWHFO4OJgPi1Ml2qkt7w==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz",
+ "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==",
"cpu": [
"arm64"
],
@@ -4829,9 +4983,9 @@
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.61.0.tgz",
- "integrity": "sha512-OXNWVFocS2IA4+QplhTZZ2a+8hPZR7T8KuozsNmJKK8y7cp83StHvGksfHzPG3wczWTczyWHVQuqeiTUbjiyBg==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz",
+ "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==",
"cpu": [
"arm64"
],
@@ -4843,9 +4997,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.61.0.tgz",
- "integrity": "sha512-AlAbNtBO637LxSldqV43z0FfXoGfl2TW1DgAg/bs7aQswFbDewz2SJm3BUhiGfbOVtW571xbc9p+REdxhyN/Eg==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz",
+ "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==",
"cpu": [
"ia32"
],
@@ -4857,9 +5011,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-gnu": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.61.0.tgz",
- "integrity": "sha512-QRSrQXyJ1M4tjNXdR0/G/IgV6lzfQQJYBjlWIEYkY2Xs86DRl/iEpQ4blMDjJxSl7n19eDKKXMg0AmuBVYy8pQ==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz",
+ "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==",
"cpu": [
"x64"
],
@@ -4871,9 +5025,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.61.0.tgz",
- "integrity": "sha512-tkuFxhvKO/HlGd0VsINF6vHSYH8AF8W0TcNxKDK6JZmrehngFj78pToc8iemtnvwilDjs2G/qSzYFhe9U8q+fw==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz",
+ "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==",
"cpu": [
"x64"
],
@@ -4908,56 +5062,20 @@
}
},
"node_modules/@scure/btc-signer": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@scure/btc-signer/-/btc-signer-2.0.1.tgz",
- "integrity": "sha512-vk5a/16BbSFZkhh1JIJ0+4H9nceZVo5WzKvJGGWiPp3sQOExeW+L53z3dI6u0adTPoE8ZbL+XEb6hEGzVZSvvQ==",
- "license": "MIT",
- "dependencies": {
- "@noble/curves": "~2.0.0",
- "@noble/hashes": "~2.0.0",
- "@scure/base": "~2.0.0",
- "micro-packed": "~0.8.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/@scure/btc-signer/node_modules/@noble/curves": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.0.1.tgz",
- "integrity": "sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@scure/btc-signer/-/btc-signer-2.2.0.tgz",
+ "integrity": "sha512-ZXZ08sZqSZKEcOuEQnxTF66ouHtl6+UA6U/QfQM06K9WiOlEkXF4LviZCaSgkdiFh9cyMt9+xdup7JtEv3p0fw==",
"license": "MIT",
"dependencies": {
- "@noble/hashes": "2.0.1"
- },
- "engines": {
- "node": ">= 20.19.0"
+ "@noble/curves": "~2.2.0",
+ "@noble/hashes": "~2.2.0",
+ "@scure/base": "~2.2.0",
+ "micro-packed": "~0.9.0"
},
"funding": {
"url": "https://paulmillr.com/funding/"
}
},
- "node_modules/@scure/btc-signer/node_modules/@noble/hashes": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz",
- "integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==",
- "license": "MIT",
- "engines": {
- "node": ">= 20.19.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/@scure/btc-signer/node_modules/@scure/base": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@scure/base/-/base-2.0.0.tgz",
- "integrity": "sha512-3E1kpuZginKkek01ovG8krQ0Z44E3DHPjc5S2rjJw9lZn3KSQOs8S7wqikF/AH7iRanHypj85uGyxk0XAyC37w==",
- "license": "MIT",
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
"node_modules/@shikijs/engine-oniguruma": {
"version": "3.23.0",
"resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz",
@@ -5048,9 +5166,9 @@
"license": "MIT"
},
"node_modules/@swc/helpers": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.21.tgz",
- "integrity": "sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==",
+ "version": "0.5.23",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz",
+ "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -5071,49 +5189,49 @@
}
},
"node_modules/@tailwindcss/node": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.4.tgz",
- "integrity": "sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.2.tgz",
+ "integrity": "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/remapping": "^2.3.5",
- "enhanced-resolve": "^5.19.0",
- "jiti": "^2.6.1",
+ "enhanced-resolve": "5.21.6",
+ "jiti": "^2.7.0",
"lightningcss": "1.32.0",
"magic-string": "^0.30.21",
"source-map-js": "^1.2.1",
- "tailwindcss": "4.2.4"
+ "tailwindcss": "4.3.2"
}
},
"node_modules/@tailwindcss/oxide": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.4.tgz",
- "integrity": "sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.2.tgz",
+ "integrity": "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 20"
},
"optionalDependencies": {
- "@tailwindcss/oxide-android-arm64": "4.2.4",
- "@tailwindcss/oxide-darwin-arm64": "4.2.4",
- "@tailwindcss/oxide-darwin-x64": "4.2.4",
- "@tailwindcss/oxide-freebsd-x64": "4.2.4",
- "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.4",
- "@tailwindcss/oxide-linux-arm64-gnu": "4.2.4",
- "@tailwindcss/oxide-linux-arm64-musl": "4.2.4",
- "@tailwindcss/oxide-linux-x64-gnu": "4.2.4",
- "@tailwindcss/oxide-linux-x64-musl": "4.2.4",
- "@tailwindcss/oxide-wasm32-wasi": "4.2.4",
- "@tailwindcss/oxide-win32-arm64-msvc": "4.2.4",
- "@tailwindcss/oxide-win32-x64-msvc": "4.2.4"
+ "@tailwindcss/oxide-android-arm64": "4.3.2",
+ "@tailwindcss/oxide-darwin-arm64": "4.3.2",
+ "@tailwindcss/oxide-darwin-x64": "4.3.2",
+ "@tailwindcss/oxide-freebsd-x64": "4.3.2",
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2",
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.3.2",
+ "@tailwindcss/oxide-linux-arm64-musl": "4.3.2",
+ "@tailwindcss/oxide-linux-x64-gnu": "4.3.2",
+ "@tailwindcss/oxide-linux-x64-musl": "4.3.2",
+ "@tailwindcss/oxide-wasm32-wasi": "4.3.2",
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.3.2",
+ "@tailwindcss/oxide-win32-x64-msvc": "4.3.2"
}
},
"node_modules/@tailwindcss/oxide-android-arm64": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.4.tgz",
- "integrity": "sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.2.tgz",
+ "integrity": "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==",
"cpu": [
"arm64"
],
@@ -5128,9 +5246,9 @@
}
},
"node_modules/@tailwindcss/oxide-darwin-arm64": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.4.tgz",
- "integrity": "sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.2.tgz",
+ "integrity": "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==",
"cpu": [
"arm64"
],
@@ -5145,9 +5263,9 @@
}
},
"node_modules/@tailwindcss/oxide-darwin-x64": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.4.tgz",
- "integrity": "sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.2.tgz",
+ "integrity": "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==",
"cpu": [
"x64"
],
@@ -5162,9 +5280,9 @@
}
},
"node_modules/@tailwindcss/oxide-freebsd-x64": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.4.tgz",
- "integrity": "sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.2.tgz",
+ "integrity": "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==",
"cpu": [
"x64"
],
@@ -5179,9 +5297,9 @@
}
},
"node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.4.tgz",
- "integrity": "sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.2.tgz",
+ "integrity": "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==",
"cpu": [
"arm"
],
@@ -5196,13 +5314,16 @@
}
},
"node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.4.tgz",
- "integrity": "sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.2.tgz",
+ "integrity": "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==",
"cpu": [
"arm64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -5213,13 +5334,16 @@
}
},
"node_modules/@tailwindcss/oxide-linux-arm64-musl": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.4.tgz",
- "integrity": "sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.2.tgz",
+ "integrity": "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==",
"cpu": [
"arm64"
],
"dev": true,
+ "libc": [
+ "musl"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -5230,13 +5354,16 @@
}
},
"node_modules/@tailwindcss/oxide-linux-x64-gnu": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.4.tgz",
- "integrity": "sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.2.tgz",
+ "integrity": "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==",
"cpu": [
"x64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -5247,13 +5374,16 @@
}
},
"node_modules/@tailwindcss/oxide-linux-x64-musl": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.4.tgz",
- "integrity": "sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.2.tgz",
+ "integrity": "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==",
"cpu": [
"x64"
],
"dev": true,
+ "libc": [
+ "musl"
+ ],
"license": "MIT",
"optional": true,
"os": [
@@ -5264,9 +5394,9 @@
}
},
"node_modules/@tailwindcss/oxide-wasm32-wasi": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.4.tgz",
- "integrity": "sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.2.tgz",
+ "integrity": "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==",
"bundleDependencies": [
"@napi-rs/wasm-runtime",
"@emnapi/core",
@@ -5282,11 +5412,11 @@
"license": "MIT",
"optional": true,
"dependencies": {
- "@emnapi/core": "^1.8.1",
- "@emnapi/runtime": "^1.8.1",
- "@emnapi/wasi-threads": "^1.1.0",
- "@napi-rs/wasm-runtime": "^1.1.1",
- "@tybys/wasm-util": "^0.10.1",
+ "@emnapi/core": "^1.11.1",
+ "@emnapi/runtime": "^1.11.1",
+ "@emnapi/wasi-threads": "^1.2.2",
+ "@napi-rs/wasm-runtime": "^1.1.4",
+ "@tybys/wasm-util": "^0.10.2",
"tslib": "^2.8.1"
},
"engines": {
@@ -5294,9 +5424,9 @@
}
},
"node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.4.tgz",
- "integrity": "sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.2.tgz",
+ "integrity": "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==",
"cpu": [
"arm64"
],
@@ -5311,9 +5441,9 @@
}
},
"node_modules/@tailwindcss/oxide-win32-x64-msvc": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.4.tgz",
- "integrity": "sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.2.tgz",
+ "integrity": "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==",
"cpu": [
"x64"
],
@@ -5328,40 +5458,40 @@
}
},
"node_modules/@tailwindcss/postcss": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.4.tgz",
- "integrity": "sha512-wgAVj6nUWAolAu8YFvzT2cTBIElWHkjZwFYovF+xsqKsW2ADxM/X2opxj5NsF/qVccAOjRNe8X2IdPzMsWyHTg==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.2.tgz",
+ "integrity": "sha512-rjVWYCa7Ngbi5AarT6k8TkxUG3Wl1QKzHdIZVsjZSzf36Jmo2IKZt/NHRAwly8oDkbBOH0YTu+CHuf9jPxMc+g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
- "@tailwindcss/node": "4.2.4",
- "@tailwindcss/oxide": "4.2.4",
- "postcss": "^8.5.6",
- "tailwindcss": "4.2.4"
+ "@tailwindcss/node": "4.3.2",
+ "@tailwindcss/oxide": "4.3.2",
+ "postcss": "^8.5.15",
+ "tailwindcss": "4.3.2"
}
},
"node_modules/@tailwindcss/typography": {
- "version": "0.5.19",
- "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz",
- "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==",
+ "version": "0.5.20",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.20.tgz",
+ "integrity": "sha512-hwbzQuNUfcPvbegQFatVPl/MY/tcM9KLl963hQ5laJKPh81TEZ1+dNG9PirGvcaDBkp+BCshExAyKVPW91dozw==",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-selector-parser": "6.0.10"
},
"peerDependencies": {
- "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1"
+ "tailwindcss": ">=3.0.0 || >=4.0.0 || insiders"
}
},
"node_modules/@tanstack/react-virtual": {
- "version": "3.13.24",
- "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.24.tgz",
- "integrity": "sha512-aIJvz5OSkhNIhZIpYivrxrPTKYsjW9Uzy+sP/mx0S3sev2HyvPb7xmjbYvokzEpfgYHy/HjzJ2zFAETuUfgCpg==",
+ "version": "3.14.5",
+ "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.14.5.tgz",
+ "integrity": "sha512-4EKRXh7zBLkbKbFmG3AUVkircuHd+7OdT1pocJSepxtfBd3qnrJgJ5rtPkRYyo9fmyVb2+pI2xPy5oYvMLQy6A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@tanstack/virtual-core": "3.14.0"
+ "@tanstack/virtual-core": "3.17.3"
},
"funding": {
"type": "github",
@@ -5373,9 +5503,9 @@
}
},
"node_modules/@tanstack/virtual-core": {
- "version": "3.14.0",
- "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.14.0.tgz",
- "integrity": "sha512-JLANqGy/D6k4Ujmh8Tr25lGimuOXNiaVyXaCAZS0W+1390sADdGnyUdSWNIfd49gebtIxGMij4IktRVzrdr12Q==",
+ "version": "3.17.3",
+ "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.17.3.tgz",
+ "integrity": "sha512-8Np/TFELpI0ySuJoVmjvOrQYXH/8sTX0Biv9szhFhY39xOdAAY+smrMxjxOum/ux3eM8MUJQsEJ0/R0UpvC8dw==",
"dev": true,
"license": "MIT",
"funding": {
@@ -5383,6 +5513,51 @@
"url": "https://github.com/sponsors/tannerlinsley"
}
},
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
+ "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.2"
+ }
+ },
"node_modules/@types/body-parser": {
"version": "1.19.6",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
@@ -5600,13 +5775,13 @@
"license": "MIT"
},
"node_modules/@types/node": {
- "version": "25.6.0",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz",
- "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==",
+ "version": "25.9.4",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.4.tgz",
+ "integrity": "sha512-dszCsrKb5U7ZsVZBWiHFklTloVl0mSEnWH/iZXfZUlI4rzCUnsvGmgqfuVRHL54ugE7/wRuxEIXRa2iMZ+BG6g==",
"devOptional": true,
"license": "MIT",
"dependencies": {
- "undici-types": "~7.19.0"
+ "undici-types": ">=7.24.0 <7.24.7"
}
},
"node_modules/@types/picomatch": {
@@ -5617,9 +5792,9 @@
"license": "MIT"
},
"node_modules/@types/qs": {
- "version": "6.15.0",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz",
- "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==",
+ "version": "6.15.1",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz",
+ "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==",
"dev": true,
"license": "MIT"
},
@@ -5631,9 +5806,9 @@
"license": "MIT"
},
"node_modules/@types/react": {
- "version": "19.2.14",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
- "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
+ "version": "19.2.17",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz",
+ "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5722,17 +5897,17 @@
}
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.59.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.0.tgz",
- "integrity": "sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==",
+ "version": "8.62.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.62.1.tgz",
+ "integrity": "sha512-4EQM77WgVNxj7OkL/5b/D/xZsw00G577+UriYTC7JF5opcF3T2AuoeY7ueLaZgSVjSgCS6yOAJB5bRGLPSJUzA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/regexpp": "^4.12.2",
- "@typescript-eslint/scope-manager": "8.59.0",
- "@typescript-eslint/type-utils": "8.59.0",
- "@typescript-eslint/utils": "8.59.0",
- "@typescript-eslint/visitor-keys": "8.59.0",
+ "@typescript-eslint/scope-manager": "8.62.1",
+ "@typescript-eslint/type-utils": "8.62.1",
+ "@typescript-eslint/utils": "8.62.1",
+ "@typescript-eslint/visitor-keys": "8.62.1",
"ignore": "^7.0.5",
"natural-compare": "^1.4.0",
"ts-api-utils": "^2.5.0"
@@ -5745,7 +5920,7 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "@typescript-eslint/parser": "^8.59.0",
+ "@typescript-eslint/parser": "^8.62.1",
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
"typescript": ">=4.8.4 <6.1.0"
}
@@ -5761,16 +5936,16 @@
}
},
"node_modules/@typescript-eslint/parser": {
- "version": "8.59.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.0.tgz",
- "integrity": "sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg==",
+ "version": "8.62.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.62.1.tgz",
+ "integrity": "sha512-sPhE4iHuJDSvoAiec+Ro8JyXw8f0ql13HFR82P99nCm9GwTEKG0KYLvDe6REk8BCXuit6vJAv/Yxg5ABaNS2rA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/scope-manager": "8.59.0",
- "@typescript-eslint/types": "8.59.0",
- "@typescript-eslint/typescript-estree": "8.59.0",
- "@typescript-eslint/visitor-keys": "8.59.0",
+ "@typescript-eslint/scope-manager": "8.62.1",
+ "@typescript-eslint/types": "8.62.1",
+ "@typescript-eslint/typescript-estree": "8.62.1",
+ "@typescript-eslint/visitor-keys": "8.62.1",
"debug": "^4.4.3"
},
"engines": {
@@ -5786,14 +5961,14 @@
}
},
"node_modules/@typescript-eslint/project-service": {
- "version": "8.59.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.0.tgz",
- "integrity": "sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==",
+ "version": "8.62.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.62.1.tgz",
+ "integrity": "sha512-yQ3RgY5RkSBpsNS1Bx/JQEcA24FOSdfGktoyprAr5u18390UQdtVcfnEv4nIrIshNnavlVyZBKxQwT1fIAE6cg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.59.0",
- "@typescript-eslint/types": "^8.59.0",
+ "@typescript-eslint/tsconfig-utils": "^8.62.1",
+ "@typescript-eslint/types": "^8.62.1",
"debug": "^4.4.3"
},
"engines": {
@@ -5808,14 +5983,14 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "8.59.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.0.tgz",
- "integrity": "sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg==",
+ "version": "8.62.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.62.1.tgz",
+ "integrity": "sha512-r4d249KbQ1SFdpeStvob8Ih6aPPIzfqllPVOtvhve6ZcpuVcYo5/7zUWckKpHE7StASX4kTKZTLf0WQm/wPkcg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.59.0",
- "@typescript-eslint/visitor-keys": "8.59.0"
+ "@typescript-eslint/types": "8.62.1",
+ "@typescript-eslint/visitor-keys": "8.62.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -5826,9 +6001,9 @@
}
},
"node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.59.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.0.tgz",
- "integrity": "sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==",
+ "version": "8.62.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.62.1.tgz",
+ "integrity": "sha512-xadytJqX9vJVQ2fdQjkcIVigwaOJNWkpjdLt6cEQ+xPnrI1fkp+/jZE/I97k9KUjqtpd25i0HeyZf3T6dutv2g==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5843,15 +6018,15 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "8.59.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.0.tgz",
- "integrity": "sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg==",
+ "version": "8.62.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.62.1.tgz",
+ "integrity": "sha512-aXM5xlqXiTxPibXB93cLAURfT3rlizf7uMXISCXy66Isr/9hISJx3yDsKl0L7lKa51b8JpFuNKby0/O0pEm9jg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.59.0",
- "@typescript-eslint/typescript-estree": "8.59.0",
- "@typescript-eslint/utils": "8.59.0",
+ "@typescript-eslint/types": "8.62.1",
+ "@typescript-eslint/typescript-estree": "8.62.1",
+ "@typescript-eslint/utils": "8.62.1",
"debug": "^4.4.3",
"ts-api-utils": "^2.5.0"
},
@@ -5868,9 +6043,9 @@
}
},
"node_modules/@typescript-eslint/types": {
- "version": "8.59.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.0.tgz",
- "integrity": "sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==",
+ "version": "8.62.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.62.1.tgz",
+ "integrity": "sha512-ooCzJFaf+Hg+uG6fA3NRFGuFjlfNlDhBthbv4ZPU/0elCAFUfnyXUvf/WOpHz/jYwSmvU2GkR2LtyUfy1AxZ1Q==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5882,16 +6057,16 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.59.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.0.tgz",
- "integrity": "sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==",
+ "version": "8.62.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.62.1.tgz",
+ "integrity": "sha512-xMcW9oP9u7fAMXYs9A65CVmtLQe2r//oXINHfi8HV+oiqhih17sbLdhXr4540YWlgpDKQdY854OL5ZrdCiQsAA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/project-service": "8.59.0",
- "@typescript-eslint/tsconfig-utils": "8.59.0",
- "@typescript-eslint/types": "8.59.0",
- "@typescript-eslint/visitor-keys": "8.59.0",
+ "@typescript-eslint/project-service": "8.62.1",
+ "@typescript-eslint/tsconfig-utils": "8.62.1",
+ "@typescript-eslint/types": "8.62.1",
+ "@typescript-eslint/visitor-keys": "8.62.1",
"debug": "^4.4.3",
"minimatch": "^10.2.2",
"semver": "^7.7.3",
@@ -5910,16 +6085,16 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "8.59.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.0.tgz",
- "integrity": "sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g==",
+ "version": "8.62.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.62.1.tgz",
+ "integrity": "sha512-sHtbPfuKNZCG+ih8SyjjucqRntSVmp8XgL5u6o9mAhiSn8ds5o/M/XdM0abweme2Tln3szOstOrZ9OXitvPh0g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.9.1",
- "@typescript-eslint/scope-manager": "8.59.0",
- "@typescript-eslint/types": "8.59.0",
- "@typescript-eslint/typescript-estree": "8.59.0"
+ "@typescript-eslint/scope-manager": "8.62.1",
+ "@typescript-eslint/types": "8.62.1",
+ "@typescript-eslint/typescript-estree": "8.62.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -5934,13 +6109,13 @@
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.59.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.0.tgz",
- "integrity": "sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==",
+ "version": "8.62.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.62.1.tgz",
+ "integrity": "sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.59.0",
+ "@typescript-eslint/types": "8.62.1",
"eslint-visitor-keys": "^5.0.0"
},
"engines": {
@@ -6088,16 +6263,16 @@
"link": true
},
"node_modules/@ungap/structured-clone": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
- "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.2.tgz",
+ "integrity": "sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==",
"dev": true,
"license": "ISC"
},
"node_modules/@unicode/unicode-17.0.0": {
- "version": "1.6.16",
- "resolved": "https://registry.npmjs.org/@unicode/unicode-17.0.0/-/unicode-17.0.0-1.6.16.tgz",
- "integrity": "sha512-advq5p36zZ+PDRUpDkWcHHR++R19kx0LYB5iG3bj0KB8mYVKg0ywS996e2bXeXxDb8XdOF7KTivcx7VkYie1pg==",
+ "version": "1.6.17",
+ "resolved": "https://registry.npmjs.org/@unicode/unicode-17.0.0/-/unicode-17.0.0-1.6.17.tgz",
+ "integrity": "sha512-TcBN39y5g7rmQbjnIDsW+4XlEXk6BnJMlhGyUHqUljp00affwlSLv5v7nB37pbdD/ks1BpptvILVQRMp34wPPw==",
"dev": true,
"license": "MIT"
},
@@ -6150,9 +6325,9 @@
}
},
"node_modules/@whatwg-node/node-fetch": {
- "version": "0.8.5",
- "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.8.5.tgz",
- "integrity": "sha512-4xzCl/zphPqlp9tASLVeUhB5+WJHbuWGYpfoC2q1qh5dw0AqZBW7L27V5roxYWijPxj4sspRAAoOH3d2ztaHUQ==",
+ "version": "0.8.6",
+ "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.8.6.tgz",
+ "integrity": "sha512-BDMdYFcerLQkwA2RTldxOqRCs6ZQD1S7UgP3pUdGUkcbgTrP/V5ko77ZkCww9DHmC4lpoYuwigGfQYj285gMvA==",
"license": "MIT",
"dependencies": {
"@fastify/busboy": "^3.1.1",
@@ -6289,9 +6464,9 @@
}
},
"node_modules/acorn": {
- "version": "8.16.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
- "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
+ "version": "8.17.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz",
+ "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==",
"dev": true,
"license": "MIT",
"bin": {
@@ -6321,16 +6496,16 @@
}
},
"node_modules/ai": {
- "version": "6.0.168",
- "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.168.tgz",
- "integrity": "sha512-2HqCJuO+1V2aV7vfYs5LFEUfxbkGX+5oa54q/gCCTL7KLTdbxcCu5D7TdLA5kwsrs3Szgjah9q6D9tpjHM3hUQ==",
+ "version": "6.0.218",
+ "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.218.tgz",
+ "integrity": "sha512-HsyCUNaaYgX/b/kGOoYfKkqfT1HvpUKKDb8YkN1FKeCNZjKdqXLGY+cKBpYGIRAvsPuOHskxLxZ46cK1dTBWQQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@ai-sdk/gateway": "3.0.104",
- "@ai-sdk/provider": "3.0.8",
- "@ai-sdk/provider-utils": "4.0.23",
- "@opentelemetry/api": "1.9.0"
+ "@ai-sdk/gateway": "3.0.142",
+ "@ai-sdk/provider": "3.0.13",
+ "@ai-sdk/provider-utils": "4.0.35",
+ "@opentelemetry/api": "^1.9.0"
},
"engines": {
"node": ">=18"
@@ -6412,13 +6587,16 @@
}
},
"node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
"node_modules/ansi-styles": {
@@ -6441,6 +6619,19 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/anynum": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.1.tgz",
+ "integrity": "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/append-field": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
@@ -6689,9 +6880,9 @@
"license": "MIT"
},
"node_modules/b4a": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz",
- "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==",
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz",
+ "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==",
"devOptional": true,
"license": "Apache-2.0",
"peerDependencies": {
@@ -6725,9 +6916,9 @@
}
},
"node_modules/bare-events": {
- "version": "2.8.2",
- "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz",
- "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==",
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.1.tgz",
+ "integrity": "sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==",
"devOptional": true,
"license": "Apache-2.0",
"peerDependencies": {
@@ -6740,9 +6931,9 @@
}
},
"node_modules/bare-fs": {
- "version": "4.7.1",
- "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.1.tgz",
- "integrity": "sha512-WDRsyVN52eAx/lBamKD6uyw8H4228h/x0sGGGegOamM2cd7Pag88GfMQalobXI+HaEUxpCkbKQUDOQqt9wawRw==",
+ "version": "4.7.3",
+ "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.3.tgz",
+ "integrity": "sha512-xRgplks8SvcKkdlv2M6Z2LZmRsmqd+x0nXXGXeMEjwdibj1HSDrlnqBRLeYdMvsgCox7Bq0e+DHwfczOfsn6IA==",
"devOptional": true,
"license": "Apache-2.0",
"dependencies": {
@@ -6765,9 +6956,9 @@
}
},
"node_modules/bare-os": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.9.0.tgz",
- "integrity": "sha512-JTjuZyNIDpw+GytMO4a6TK1VXdVKKJr6DRxEHasyuYyShV2deuiHJK/ahGZlebc+SG0/wJCB9XK8gprBGDFi/Q==",
+ "version": "3.9.3",
+ "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.9.3.tgz",
+ "integrity": "sha512-fF4Q7QsyKVF5Rj0qvI8BgUNjqzC2JvQlpTaPLjVJVxYVUX5Zr9un+y3w1HmA4nNKdFmRBT8z/WmrjvXzXVerKQ==",
"devOptional": true,
"license": "Apache-2.0",
"engines": {
@@ -6775,9 +6966,9 @@
}
},
"node_modules/bare-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz",
- "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.1.tgz",
+ "integrity": "sha512-ghj2DSK/2e99a1anTVPCV4m4YIYtrbXhfM7V3D7XZLOTsybnYyaJloymGqssQc8l/or0UoDyRtNQkmkEF/ysgQ==",
"devOptional": true,
"license": "Apache-2.0",
"dependencies": {
@@ -6785,12 +6976,13 @@
}
},
"node_modules/bare-stream": {
- "version": "2.13.0",
- "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.0.tgz",
- "integrity": "sha512-3zAJRZMDFGjdn+RVnNpF9kuELw+0Fl3lpndM4NcEOhb9zwtSo/deETfuIwMSE5BXanA0FrN1qVjffGwAg2Y7EA==",
+ "version": "2.13.3",
+ "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.3.tgz",
+ "integrity": "sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==",
"devOptional": true,
"license": "Apache-2.0",
"dependencies": {
+ "b4a": "^1.8.1",
"streamx": "^2.25.0",
"teex": "^1.0.1"
},
@@ -6812,9 +7004,9 @@
}
},
"node_modules/bare-url": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.2.tgz",
- "integrity": "sha512-/9a2j4ac6ckpmAHvod/ob7x439OAHst/drc2Clnq+reRYd/ovddwcF4LfoxHyNk5AuGBnPg+HqFjmE/Zpq6v0A==",
+ "version": "2.4.5",
+ "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.5.tgz",
+ "integrity": "sha512-K+y9xF1tN+CdPu4qWwr0QiK1Al07eFPGYK5M2pDXcmHdMdgC/tT/bpmMe1hrmRHaidKLkXrC+cRNYf3XVDUhSQ==",
"devOptional": true,
"license": "Apache-2.0",
"dependencies": {
@@ -6843,9 +7035,9 @@
"license": "MIT"
},
"node_modules/baseline-browser-mapping": {
- "version": "2.10.23",
- "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.23.tgz",
- "integrity": "sha512-xwVXGqevyKPsiuQdLj+dZMVjidjJV508TBqexND5HrF89cGdCYCJFB3qhcxRHSeMctdCfbR1jrxBajhDy7o29g==",
+ "version": "2.10.40",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.40.tgz",
+ "integrity": "sha512-BSSLZ9/Cjjv7Gtj5B68ZzXcXUg8iOf3fme+FCuh8rC/Go+Kmh8cox7M3A8dolou16s64QjLPOSdngh7GxXvkSw==",
"dev": true,
"license": "Apache-2.0",
"bin": {
@@ -6899,26 +7091,26 @@
"license": "MIT"
},
"node_modules/bn.js": {
- "version": "4.12.3",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz",
- "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==",
+ "version": "4.12.4",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.4.tgz",
+ "integrity": "sha512-njR1b+ixG2ufvL9Zn9JGneW+b5GV6jqpYyPPpg4QVt723b5kJPGUczkUyWEH9BwEA74UakJZ43I4FDLBF7ci0g==",
"license": "MIT"
},
"node_modules/body-parser": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz",
- "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz",
+ "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==",
"license": "MIT",
"dependencies": {
"bytes": "^3.1.2",
- "content-type": "^1.0.5",
+ "content-type": "^2.0.0",
"debug": "^4.4.3",
- "http-errors": "^2.0.0",
- "iconv-lite": "^0.7.0",
+ "http-errors": "^2.0.1",
+ "iconv-lite": "^0.7.2",
"on-finished": "^2.4.1",
- "qs": "^6.14.1",
- "raw-body": "^3.0.1",
- "type-is": "^2.0.1"
+ "qs": "^6.15.2",
+ "raw-body": "^3.0.2",
+ "type-is": "^2.1.0"
},
"engines": {
"node": ">=18"
@@ -6928,10 +7120,23 @@
"url": "https://opencollective.com/express"
}
},
+ "node_modules/body-parser/node_modules/content-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz",
+ "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
"node_modules/brace-expansion": {
- "version": "5.0.5",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz",
- "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==",
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz",
+ "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -6962,9 +7167,9 @@
"license": "MIT"
},
"node_modules/browserslist": {
- "version": "4.28.2",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz",
- "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==",
+ "version": "4.28.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz",
+ "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==",
"dev": true,
"funding": [
{
@@ -6982,10 +7187,10 @@
],
"license": "MIT",
"dependencies": {
- "baseline-browser-mapping": "^2.10.12",
- "caniuse-lite": "^1.0.30001782",
- "electron-to-chromium": "^1.5.328",
- "node-releases": "^2.0.36",
+ "baseline-browser-mapping": "^2.10.38",
+ "caniuse-lite": "^1.0.30001799",
+ "electron-to-chromium": "^1.5.376",
+ "node-releases": "^2.0.48",
"update-browserslist-db": "^1.2.3"
},
"bin": {
@@ -6996,9 +7201,9 @@
}
},
"node_modules/bson": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/bson/-/bson-7.2.0.tgz",
- "integrity": "sha512-YCEo7KjMlbNlyHhz7zAZNDpIpQbd+wOEHJYezv0nMYTn4x31eIUM2yomNNubclAt63dObUzKHWsBLJ9QcZNSnQ==",
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/bson/-/bson-7.3.1.tgz",
+ "integrity": "sha512-h/C0qe6857pQhcSJHLfsR1uYGj98Ge3wKAD3Ed9KqH3wcVh+BM4Jq4xISD7vs9OPuT07n+q3QQVjslJ286j6ag==",
"license": "Apache-2.0",
"engines": {
"node": ">=20.19.0"
@@ -7029,6 +7234,16 @@
"ieee754": "^1.1.13"
}
},
+ "node_modules/buffer-crc32": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz",
+ "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
"node_modules/buffer-equal-constant-time": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
@@ -7180,9 +7395,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001791",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz",
- "integrity": "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==",
+ "version": "1.0.30001800",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001800.tgz",
+ "integrity": "sha512-MMHtuAz9Ys840zAY5F4k6fV5GaivZ9sPk+nz0mY+GYVzRBnYkN0mpqkSR92oWRQ19yQWo4HvBV/FnC16AJX8MA==",
"dev": true,
"funding": [
{
@@ -7340,9 +7555,9 @@
}
},
"node_modules/chardet": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz",
- "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz",
+ "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==",
"dev": true,
"license": "MIT"
},
@@ -7378,6 +7593,22 @@
"node": ">=8"
}
},
+ "node_modules/cli-cursor": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz",
+ "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "restore-cursor": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/cli-table3": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz",
@@ -7410,51 +7641,22 @@
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
- },
- "node_modules/cli-truncate/node_modules/ansi-regex": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
- "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
- }
- },
- "node_modules/cli-truncate/node_modules/string-width": {
- "version": "8.2.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz",
- "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "get-east-asian-width": "^1.5.0",
- "strip-ansi": "^7.1.2"
- },
- "engines": {
- "node": ">=20"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/cli-truncate/node_modules/strip-ansi": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
- "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
+ },
+ "node_modules/cli-truncate/node_modules/string-width": {
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz",
+ "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ansi-regex": "^6.2.2"
+ "get-east-asian-width": "^1.5.0",
+ "strip-ansi": "^7.1.2"
},
"engines": {
- "node": ">=12"
+ "node": ">=20"
},
"funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/cli-width": {
@@ -7489,6 +7691,16 @@
"node": ">=12"
}
},
+ "node_modules/cliui/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/cliui/node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
@@ -7525,6 +7737,19 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/cliui/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/cliui/node_modules/wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
@@ -7799,9 +8024,9 @@
}
},
"node_modules/cosmiconfig": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz",
- "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==",
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz",
+ "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -8584,9 +8809,9 @@
"license": "MIT"
},
"node_modules/date-fns": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz",
- "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==",
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.4.0.tgz",
+ "integrity": "sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==",
"dev": true,
"license": "MIT",
"funding": {
@@ -8605,9 +8830,9 @@
}
},
"node_modules/dayjs": {
- "version": "1.11.20",
- "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz",
- "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==",
+ "version": "1.11.21",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz",
+ "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==",
"dev": true,
"license": "MIT"
},
@@ -8882,9 +9107,9 @@
"license": "MIT"
},
"node_modules/electron-to-chromium": {
- "version": "1.5.344",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.344.tgz",
- "integrity": "sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==",
+ "version": "1.5.384",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.384.tgz",
+ "integrity": "sha512-g6KAKY1vkYsADvSPWvdJsuYT0ixdcu6lUtD9P/wJKGBEDlZVXh2AX42j1mPqqaQPDluWjara9ziQ7xqAeXCt5A==",
"dev": true,
"license": "ISC"
},
@@ -8915,9 +9140,9 @@
}
},
"node_modules/enhanced-resolve": {
- "version": "5.21.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz",
- "integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==",
+ "version": "5.21.6",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz",
+ "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -9043,6 +9268,25 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/es-abstract-get": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz",
+ "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.2",
+ "is-callable": "^1.2.7",
+ "object-inspect": "^1.13.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/es-define-property": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
@@ -9062,9 +9306,9 @@
}
},
"node_modules/es-object-atoms": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
- "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
+ "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0"
@@ -9090,15 +9334,18 @@
}
},
"node_modules/es-to-primitive": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
- "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz",
+ "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==",
"dev": true,
"license": "MIT",
"dependencies": {
+ "es-abstract-get": "^1.0.0",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
"is-callable": "^1.2.7",
- "is-date-object": "^1.0.5",
- "is-symbol": "^1.0.4"
+ "is-date-object": "^1.1.0",
+ "is-symbol": "^1.1.1"
},
"engines": {
"node": ">= 0.4"
@@ -9108,9 +9355,9 @@
}
},
"node_modules/es-toolkit": {
- "version": "1.46.0",
- "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.46.0.tgz",
- "integrity": "sha512-IToJ6ct9OLl5zz6WsC/1vZEwfSZ7Myil+ygl5Tf30Xjn9AEkzNB4kqp2G7VUJKF1DtTx/ra5M5KLlXvzOg51BA==",
+ "version": "1.49.0",
+ "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.49.0.tgz",
+ "integrity": "sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==",
"dev": true,
"license": "MIT",
"workspaces": [
@@ -9190,18 +9437,21 @@
}
},
"node_modules/eslint": {
- "version": "10.2.1",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.2.1.tgz",
- "integrity": "sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q==",
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.6.0.tgz",
+ "integrity": "sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg==",
"dev": true,
"license": "MIT",
+ "workspaces": [
+ "packages/*"
+ ],
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.2",
"@eslint/config-array": "^0.23.5",
- "@eslint/config-helpers": "^0.5.5",
+ "@eslint/config-helpers": "^0.6.0",
"@eslint/core": "^1.2.1",
- "@eslint/plugin-kit": "^0.7.1",
+ "@eslint/plugin-kit": "^0.7.2",
"@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
"@humanwhocodes/retry": "^0.4.2",
@@ -9262,27 +9512,34 @@
}
},
"node_modules/eslint-plugin-cypress": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-6.3.1.tgz",
- "integrity": "sha512-iTJtdIZbyCUlagEI4YlVcwgPFV7X379Qi/upujaD4kvOaQkMvzmpt90vfSnaqgqprp/HPIvhnzv3fdI7mYV4QQ==",
+ "version": "6.4.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-6.4.2.tgz",
+ "integrity": "sha512-OIGJP5y6/cyMxBtMASP/iBM7Pv4ZHccE9uI8MhtAZDrdNDYDwHgKa/3Khrr+FGRr9hSIfNYstGRhSmbcLURWYA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "globals": "^17.5.0"
+ "globals": "^17.7.0"
},
"peerDependencies": {
+ "@typescript-eslint/parser": ">=8",
"eslint": ">=9"
+ },
+ "peerDependenciesMeta": {
+ "@typescript-eslint/parser": {
+ "optional": true
+ }
}
},
"node_modules/eslint-plugin-formatjs": {
- "version": "6.4.6",
- "resolved": "https://registry.npmjs.org/eslint-plugin-formatjs/-/eslint-plugin-formatjs-6.4.6.tgz",
- "integrity": "sha512-7RZd4t3zt0kcIBj8wINOyLprPCCKk+37PmtKLKa9cD+rOOKG1elmBm5+mmJEHz1TEV2L15g1SHeDl9OLvJelrQ==",
+ "version": "6.4.16",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-formatjs/-/eslint-plugin-formatjs-6.4.16.tgz",
+ "integrity": "sha512-gttSsHBhSD+b5tt7e7VjLXgDPQXkRLDF2KQKCWP+yiPR2VmBX6MqqMleFcGI6XgM0nKv4fRnfsms9a7/65WJLA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@formatjs/icu-messageformat-parser": "3.5.5",
- "@formatjs/ts-transformer": "4.4.5",
+ "@formatjs/icu-messageformat-parser": "3.5.12",
+ "@formatjs/ts-transformer": "4.4.14",
+ "@types/estree-jsx": "^1.0.5",
"@types/picomatch": "^4.0.0",
"@unicode/unicode-17.0.0": "^1.6.16",
"magic-string": "^0.30.0",
@@ -9293,14 +9550,14 @@
}
},
"node_modules/eslint-plugin-prettier": {
- "version": "5.5.5",
- "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz",
- "integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==",
+ "version": "5.5.6",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.6.tgz",
+ "integrity": "sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"prettier-linter-helpers": "^1.0.1",
- "synckit": "^0.11.12"
+ "synckit": "^0.11.13"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
@@ -9477,9 +9734,9 @@
}
},
"node_modules/eventsource-parser": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.8.tgz",
- "integrity": "sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.0.tgz",
+ "integrity": "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==",
"license": "MIT",
"engines": {
"node": ">=18.0.0"
@@ -9595,13 +9852,13 @@
}
},
"node_modules/express-rate-limit": {
- "version": "8.4.1",
- "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.4.1.tgz",
- "integrity": "sha512-NGVYwQSAyEQgzxX1iCM978PP9AdO/hW93gMcF6ZwQCm+rFvLsBH6w4xcXWTcliS8La5EPRN3p9wzItqBwJrfNw==",
+ "version": "8.5.2",
+ "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz",
+ "integrity": "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ip-address": "10.1.0"
+ "ip-address": "^10.2.0"
},
"engines": {
"node": ">= 16"
@@ -9790,9 +10047,9 @@
"license": "MIT"
},
"node_modules/fast-json-stringify": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-6.3.0.tgz",
- "integrity": "sha512-oRCntNDY/329HJPlmdNLIdogNtt6Vyjb1WuT01Soss3slIdyUp8kAcDU3saQTOquEK8KFVfwIIF7FebxUAu+yA==",
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-6.4.0.tgz",
+ "integrity": "sha512-ibRCQ0GZKJIQ+P3Et1h0LhPgp3PMTYk0MH8O+kW3lNYsvmaQww5Nn3f1jf73Q0jR1Yz3a1CDP4/NZD3vOajWJQ==",
"funding": [
{
"type": "github",
@@ -9852,9 +10109,9 @@
}
},
"node_modules/fast-uri": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
- "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==",
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.3.tgz",
+ "integrity": "sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==",
"funding": [
{
"type": "github",
@@ -9868,9 +10125,9 @@
"license": "BSD-3-Clause"
},
"node_modules/fast-xml-builder": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.5.tgz",
- "integrity": "sha512-4TJn/8FKLeslLAH3dnohXqE3QSoxkhvaMzepOIZytwJXZO69Bfz0HBdDHzOTOon6G59Zrk6VQ2bEiv1t61rfkA==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz",
+ "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==",
"dev": true,
"funding": [
{
@@ -9880,13 +10137,14 @@
],
"license": "MIT",
"dependencies": {
- "path-expression-matcher": "^1.1.3"
+ "path-expression-matcher": "^1.5.0",
+ "xml-naming": "^0.1.0"
}
},
"node_modules/fast-xml-parser": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.2.tgz",
- "integrity": "sha512-P7oW7tLbYnhOLQk/Gv7cZgzgMPP/XN03K02/Jy6Y/NHzyIAIpxuZIM/YqAkfiXFPxA2CTm7NtCijK9EDu09u2w==",
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.9.3.tgz",
+ "integrity": "sha512-brCNCeScma/kqa54J4PIDriSSSLssRkuYaUCpvHJulGc3HGI/xxKUCTDcYkAdqJsyb//ydpbxecjC3hB9+tb/g==",
"dev": true,
"funding": [
{
@@ -9896,19 +10154,21 @@
],
"license": "MIT",
"dependencies": {
- "@nodable/entities": "^2.1.0",
- "fast-xml-builder": "^1.1.5",
+ "@nodable/entities": "^2.2.0",
+ "fast-xml-builder": "^1.2.0",
+ "is-unsafe": "^1.0.1",
"path-expression-matcher": "^1.5.0",
- "strnum": "^2.2.3"
+ "strnum": "^2.4.1",
+ "xml-naming": "^0.1.0"
},
"bin": {
"fxparser": "src/cli/cli.js"
}
},
"node_modules/fastify": {
- "version": "5.8.5",
- "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.8.5.tgz",
- "integrity": "sha512-Yqptv59pQzPgQUSIm87hMqHJmdkb1+GPxdE6vW6FRyVE9G86mt7rOghitiU4JHRaTyDUk9pfeKmDeu70lAwM4Q==",
+ "version": "5.9.0",
+ "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.9.0.tgz",
+ "integrity": "sha512-VMS5lE0zj+MZlJpQa3Qv5iGjfun0H2N7VRgoBwpcTNQ2bdIQpv7fDpb+HGteGbicBsGkzGS+X+hdx9mmrfWuHQ==",
"funding": [
{
"type": "github",
@@ -9928,7 +10188,7 @@
"abstract-logging": "^2.0.1",
"avvio": "^9.0.0",
"fast-json-stringify": "^6.0.0",
- "find-my-way": "^9.0.0",
+ "find-my-way": "^9.6.0",
"light-my-request": "^6.0.0",
"pino": "^9.14.0 || ^10.1.0",
"process-warning": "^5.0.0",
@@ -10081,9 +10341,9 @@
}
},
"node_modules/find-my-way": {
- "version": "9.5.0",
- "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.5.0.tgz",
- "integrity": "sha512-VW2RfnmscZO5KgBY5XVyKREMW5nMZcxDy+buTOsL+zIPnBlbKm+00sgzoQzq1EVh4aALZLfKdwv6atBGcjvjrQ==",
+ "version": "9.6.0",
+ "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.6.0.tgz",
+ "integrity": "sha512-Zf4Xve4RymLl7NgaavNebZ01joJ8MfVerOG43wy7SHLO+r+K0C6d/SE0BiR7AV5V1VOCFlOP7ecdo+I4qmiHrQ==",
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.3",
@@ -10316,18 +10576,21 @@
}
},
"node_modules/function.prototype.name": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
- "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz",
+ "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.3",
- "define-properties": "^1.2.1",
+ "call-bind": "^1.0.9",
+ "call-bound": "^1.0.4",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
"functions-have-names": "^1.2.3",
- "hasown": "^2.0.2",
- "is-callable": "^1.2.7"
+ "has-property-descriptors": "^1.0.2",
+ "hasown": "^2.0.4",
+ "is-callable": "^1.2.7",
+ "is-document.all": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
@@ -10377,9 +10640,9 @@
}
},
"node_modules/get-east-asian-width": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz",
- "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==",
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz",
+ "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -10518,9 +10781,9 @@
}
},
"node_modules/globals": {
- "version": "17.5.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-17.5.0.tgz",
- "integrity": "sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==",
+ "version": "17.7.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-17.7.0.tgz",
+ "integrity": "sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -10588,9 +10851,9 @@
"license": "ISC"
},
"node_modules/graphql": {
- "version": "16.13.2",
- "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.13.2.tgz",
- "integrity": "sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==",
+ "version": "16.14.2",
+ "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.14.2.tgz",
+ "integrity": "sha512-Chq1s4CY7jmh8gO2qvLIJyfCDIN+EHLFW/9iShnp1z8FjBQMoodWP1kDC36VAMXXIvAjj4ARa7ntfAV2BrjsbA==",
"license": "MIT",
"engines": {
"node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0"
@@ -10700,9 +10963,9 @@
}
},
"node_modules/graphql-tag": {
- "version": "2.12.6",
- "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz",
- "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==",
+ "version": "2.12.7",
+ "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.7.tgz",
+ "integrity": "sha512-xnE/NFzy+0eIesvAsREJZ284zTl/wYuBAvpsFSDhRGRdRHdnE90M21Q3xAWyYInb0J756c6x0pIQ62+vtvOs1Q==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10712,7 +10975,7 @@
"node": ">=10"
},
"peerDependencies": {
- "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0"
+ "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
}
},
"node_modules/graphql-ws": {
@@ -10743,9 +11006,9 @@
}
},
"node_modules/graphql-yoga": {
- "version": "5.21.0",
- "resolved": "https://registry.npmjs.org/graphql-yoga/-/graphql-yoga-5.21.0.tgz",
- "integrity": "sha512-PS37UoDihx8209RRl1ogttzWevNYDnGvP7beHkwHzUpUdfZTHsVRTVe1ysGXre1EjwUAePbpez302YSrq70Ngw==",
+ "version": "5.21.2",
+ "resolved": "https://registry.npmjs.org/graphql-yoga/-/graphql-yoga-5.21.2.tgz",
+ "integrity": "sha512-IIRF/3xtjj2D6caAWL9177hQ8tV3mWB3hve1GRnz7njPhQ3iY1jFtSp98fNGv0yV9kaPh9kKQ8JWdJZnedVmDw==",
"license": "MIT",
"dependencies": {
"@envelop/core": "^5.5.1",
@@ -10757,7 +11020,7 @@
"@graphql-yoga/subscription": "^5.0.5",
"@whatwg-node/fetch": "^0.10.6",
"@whatwg-node/promise-helpers": "^1.3.2",
- "@whatwg-node/server": "^0.10.14",
+ "@whatwg-node/server": "^0.11.0",
"lru-cache": "^10.0.0",
"tslib": "^2.8.1"
},
@@ -10786,6 +11049,22 @@
"graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
}
},
+ "node_modules/graphql-yoga/node_modules/@whatwg-node/server": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@whatwg-node/server/-/server-0.11.0.tgz",
+ "integrity": "sha512-VSdkwnJRr8Yv9UgB2aXB3VUPWwd6Oqnn0hycFwhg9pZgWxJXb7JmhsiXe9tmpMwjHFxli12PGcz9aI63YYloGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@envelop/instrumentation": "^1.0.0",
+ "@whatwg-node/disposablestack": "^0.0.6",
+ "@whatwg-node/fetch": "^0.10.13",
+ "@whatwg-node/promise-helpers": "^1.3.2",
+ "tslib": "^2.6.3"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
"node_modules/graphql-yoga/node_modules/lru-cache": {
"version": "10.4.3",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
@@ -11093,9 +11372,9 @@
"license": "MIT"
},
"node_modules/hono": {
- "version": "4.12.15",
- "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.15.tgz",
- "integrity": "sha512-qM0jDhFEaCBb4TxoW7f53Qrpv9RBiayUHo0S52JudprkhvpjIrGoU1mnnr29Fvd1U335ZFPZQY1wlkqgfGXyLg==",
+ "version": "4.12.27",
+ "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.27.tgz",
+ "integrity": "sha512-1yrb/+w6HWQJrUCLkJ2IF5jNIPvvFkblV5RNOYl6bV+OA6p9GLcMpHFFGTosSvHvcAUibuUukRqhlYI4z32C7Q==",
"dev": true,
"license": "MIT",
"engines": {
@@ -11246,9 +11525,9 @@
}
},
"node_modules/immer": {
- "version": "10.2.0",
- "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz",
- "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==",
+ "version": "11.1.9",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.9.tgz",
+ "integrity": "sha512-sc/z0Cyti70bZa0ZU4sWfAElfovFb9Ni8tArJZLuklYWxegPiK3pDOql1Rq5H0FIRAW9LSQRG6OX4KqBldbhBA==",
"dev": true,
"license": "MIT",
"funding": {
@@ -11257,9 +11536,9 @@
}
},
"node_modules/immutable": {
- "version": "5.1.5",
- "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz",
- "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==",
+ "version": "5.1.9",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz",
+ "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==",
"dev": true,
"license": "MIT"
},
@@ -11362,14 +11641,14 @@
}
},
"node_modules/intl-messageformat": {
- "version": "11.2.2",
- "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-11.2.2.tgz",
- "integrity": "sha512-yUfyIkPGqMvvk2onw2xBJeLsjXdiYUYebR8mmZVQYBuZUJsFGVht48Ftm1khgu8EZ0n+izX4rAEj3fLAilkh9g==",
+ "version": "11.2.9",
+ "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-11.2.9.tgz",
+ "integrity": "sha512-cGzymZerpDhVXRKjKLgXKda9gI29TU2o88L7gwNMHp3WZVxA/0c5tX52udXbW9JklDApolvMXZG6Dhhdz5eirA==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
- "@formatjs/fast-memoize": "3.1.2",
- "@formatjs/icu-messageformat-parser": "3.5.5"
+ "@formatjs/fast-memoize": "3.1.6",
+ "@formatjs/icu-messageformat-parser": "3.5.12"
}
},
"node_modules/invariant": {
@@ -11383,9 +11662,9 @@
}
},
"node_modules/ip-address": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz",
- "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==",
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz",
+ "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -11393,9 +11672,9 @@
}
},
"node_modules/ipaddr.js": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz",
- "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==",
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.4.0.tgz",
+ "integrity": "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==",
"license": "MIT",
"engines": {
"node": ">= 10"
@@ -11533,13 +11812,13 @@
}
},
"node_modules/is-core-module": {
- "version": "2.16.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
- "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "version": "2.16.2",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz",
+ "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "hasown": "^2.0.2"
+ "hasown": "^2.0.3"
},
"engines": {
"node": ">= 0.4"
@@ -11594,6 +11873,22 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/is-document.all": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz",
+ "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -11947,6 +12242,19 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/is-unsafe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-unsafe/-/is-unsafe-1.0.1.tgz",
+ "integrity": "sha512-CLK2+VdgERgD96EYm5lUQssZYlRg2tkZnbsxZoacmSiRxiFJ4Nk4SzjCl+Ur+v3kXIY9dTIdb3IH22y1mZ56LA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/is-upper-case": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-2.0.2.tgz",
@@ -12061,9 +12369,9 @@
"license": "MIT"
},
"node_modules/jiti": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
- "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz",
+ "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==",
"dev": true,
"license": "MIT",
"bin": {
@@ -12071,9 +12379,9 @@
}
},
"node_modules/joi": {
- "version": "17.13.3",
- "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz",
- "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==",
+ "version": "17.13.4",
+ "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.4.tgz",
+ "integrity": "sha512-1RuuER6kmt8K8I3nIWvPZKi5RQCb568ZPyY4Pwjlua+yo+63ZTmIwxLZH0heBmiKN4uxjvCiarDrjaeH84xicQ==",
"license": "BSD-3-Clause",
"dependencies": {
"@hapi/hoek": "^9.3.0",
@@ -12090,9 +12398,9 @@
"license": "BSD-3-Clause"
},
"node_modules/jose": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.2.tgz",
- "integrity": "sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ==",
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz",
+ "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/panva"
@@ -12116,10 +12424,20 @@
"license": "MIT"
},
"node_modules/js-yaml": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
- "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz",
+ "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==",
"dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/puzrin"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nodeca"
+ }
+ ],
"license": "MIT",
"dependencies": {
"argparse": "^2.0.1"
@@ -12580,6 +12898,9 @@
"arm64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -12601,6 +12922,9 @@
"arm64"
],
"dev": true,
+ "libc": [
+ "musl"
+ ],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -12622,6 +12946,9 @@
"x64"
],
"dev": true,
+ "libc": [
+ "glibc"
+ ],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -12643,6 +12970,9 @@
"x64"
],
"dev": true,
+ "libc": [
+ "musl"
+ ],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -12719,10 +13049,20 @@
"license": "MIT"
},
"node_modules/linkify-it": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz",
- "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==",
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz",
+ "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==",
"dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/puzrin"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/markdown-it"
+ }
+ ],
"license": "MIT",
"dependencies": {
"uc.micro": "^2.0.0"
@@ -12746,19 +13086,6 @@
"node": ">=20.0.0"
}
},
- "node_modules/listr2/node_modules/ansi-regex": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
- "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
- }
- },
"node_modules/listr2/node_modules/ansi-styles": {
"version": "6.2.3",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
@@ -12797,22 +13124,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/listr2/node_modules/strip-ansi": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
- "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^6.2.2"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
- }
- },
"node_modules/listr2/node_modules/wrap-ansi": {
"version": "9.0.2",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz",
@@ -13064,19 +13375,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/log-update/node_modules/ansi-regex": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
- "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
- }
- },
"node_modules/log-update/node_modules/ansi-styles": {
"version": "6.2.3",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
@@ -13084,68 +13382,19 @@
"dev": true,
"license": "MIT",
"engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/log-update/node_modules/cli-cursor": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz",
- "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "restore-cursor": "^5.0.0"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/log-update/node_modules/emoji-regex": {
- "version": "10.6.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
- "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/log-update/node_modules/onetime": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
- "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mimic-function": "^5.0.0"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/log-update/node_modules/restore-cursor": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
- "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "onetime": "^7.0.0",
- "signal-exit": "^4.1.0"
- },
- "engines": {
- "node": ">=18"
+ "node": ">=12"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
+ "node_modules/log-update/node_modules/emoji-regex": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
+ "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/log-update/node_modules/slice-ansi": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz",
@@ -13181,22 +13430,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/log-update/node_modules/strip-ansi": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
- "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^6.2.2"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
- }
- },
"node_modules/log-update/node_modules/wrap-ansi": {
"version": "9.0.2",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz",
@@ -13270,9 +13503,9 @@
}
},
"node_modules/lucide-react": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.11.0.tgz",
- "integrity": "sha512-UOhjdztXCgdBReRcIhsvz2siIBogfv/lhJEIViCpLt924dO+GDms9T7DNoucI23s6kEPpe988m5N0D2ajnzb2g==",
+ "version": "1.23.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.23.0.tgz",
+ "integrity": "sha512-38BpJcD0JhFosxHApP/BYsBetLpQFRoTRzEzstM/XCc3jsAG7wqaY1lgVwxiUe3xqYE+lNxo2PkCmYwXWrwwIw==",
"dev": true,
"license": "ISC",
"peerDependencies": {
@@ -13345,15 +13578,25 @@
}
},
"node_modules/markdown-it": {
- "version": "14.1.1",
- "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz",
- "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==",
+ "version": "14.3.0",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.3.0.tgz",
+ "integrity": "sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw==",
"dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/puzrin"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/markdown-it"
+ }
+ ],
"license": "MIT",
"dependencies": {
"argparse": "^2.0.1",
- "entities": "^4.4.0",
- "linkify-it": "^5.0.0",
+ "entities": "^4.5.0",
+ "linkify-it": "^5.0.2",
"mdurl": "^2.0.0",
"punycode.js": "^2.3.1",
"uc.micro": "^2.1.0"
@@ -13759,12 +14002,12 @@
}
},
"node_modules/micro-packed": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/micro-packed/-/micro-packed-0.8.0.tgz",
- "integrity": "sha512-AKb8znIvg9sooythbXzyFeChEY0SkW0C6iXECpy/ls0e5BtwXO45J9wD9SLzBztnS4XmF/5kwZknsq+jyynd/A==",
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/micro-packed/-/micro-packed-0.9.0.tgz",
+ "integrity": "sha512-gFdaWTxEXOwtSOcpxulO4AuXVtp3HWIRmB8eq8+3m1Zku0ubgva0UGpi03YhcvsTJasHngG9gTIUK5kHNKdesg==",
"license": "MIT",
"dependencies": {
- "@scure/base": "2.0.0"
+ "@scure/base": "~2.2.0"
},
"engines": {
"node": ">= 20.19.0"
@@ -13773,15 +14016,6 @@
"url": "https://paulmillr.com/funding/"
}
},
- "node_modules/micro-packed/node_modules/@scure/base": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@scure/base/-/base-2.0.0.tgz",
- "integrity": "sha512-3E1kpuZginKkek01ovG8krQ0Z44E3DHPjc5S2rjJw9lZn3KSQOs8S7wqikF/AH7iRanHypj85uGyxk0XAyC37w==",
- "license": "MIT",
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
"node_modules/micromark": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz",
@@ -14524,16 +14758,6 @@
"node": "^16 || ^18 || >=20"
}
},
- "node_modules/minio/node_modules/buffer-crc32": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz",
- "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8.0.0"
- }
- },
"node_modules/minipass": {
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
@@ -14586,9 +14810,9 @@
}
},
"node_modules/mongodb": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-7.2.0.tgz",
- "integrity": "sha512-F/2+BMZtLVhY30ioZp0dAmZ+IRZMBqI+nrv6t5+9/1AIwCa8sMRC3jBf81lpxMhnZgqq8CoUD503Z1oZWq1/sw==",
+ "version": "7.4.0",
+ "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-7.4.0.tgz",
+ "integrity": "sha512-giySkkdYiwoBFo/oCc8nzov3xOYZ/sB8OpAYk5GINRLEjVw0LDsm8xgQL0XMTyU4extQlDZjhdUr1ZEwKFaazw==",
"license": "Apache-2.0",
"dependencies": {
"@mongodb-js/saslprep": "^1.3.0",
@@ -14645,14 +14869,14 @@
}
},
"node_modules/mongodb-memory-server": {
- "version": "11.0.1",
- "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-11.0.1.tgz",
- "integrity": "sha512-nUlKovSJZBh7q5hPsewFRam9H66D08Ne18nyknkNalfXMPtK1Og3kOcuqQhcX88x/pghSZPIJHrLbxNFW3OWiw==",
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-11.2.0.tgz",
+ "integrity": "sha512-506AD8qvClVx8Raw/WhAUUWBgIXPyi856iC01aa5vAzHmn6WOXC6ulvudkTF7oTMzJxkyA0A84VpD4BpyfqJ9w==",
"devOptional": true,
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
- "mongodb-memory-server-core": "11.0.1",
+ "mongodb-memory-server-core": "11.2.0",
"tslib": "^2.8.1"
},
"engines": {
@@ -14660,9 +14884,9 @@
}
},
"node_modules/mongodb-memory-server-core": {
- "version": "11.0.1",
- "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-11.0.1.tgz",
- "integrity": "sha512-IcIb2S9Xf7Lmz43Z1ZujMqNg7PU5Q7yn+4wOnu7l6pfeGPkEmlqzV1hIbroVx8s4vXhPB1oMGC1u8clW7aj3Xw==",
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-11.2.0.tgz",
+ "integrity": "sha512-vOoDtn0JiLrHvZY81Rp/UtKXXK0rtJHZGZFVnccvJwYitPLNspO0Ty0grqFQOe7iAET8+GI4zAQcphg+R3vxQg==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -14670,14 +14894,14 @@
"camelcase": "^6.3.0",
"debug": "^4.4.3",
"find-cache-dir": "^3.3.2",
- "follow-redirects": "^1.15.11",
+ "follow-redirects": "^1.16.0",
"https-proxy-agent": "^7.0.6",
- "mongodb": "^7.0.0",
+ "mongodb": "^7.2.0",
"new-find-package-json": "^2.0.0",
"semver": "^7.7.3",
- "tar-stream": "^3.1.7",
+ "tar-stream": "^3.1.8",
"tslib": "^2.8.1",
- "yauzl": "^3.2.0"
+ "yauzl": "^3.3.1"
},
"engines": {
"node": ">=20.19.0"
@@ -14690,9 +14914,9 @@
"license": "MIT"
},
"node_modules/multer": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/multer/-/multer-2.1.1.tgz",
- "integrity": "sha512-mo+QTzKlx8R7E5ylSXxWzGoXoZbOsRMpyitcht8By2KHvMbf3tjwosZ/Mu/XYU6UuJ3VZnODIrak5ZrPiPyB6A==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/multer/-/multer-2.2.0.tgz",
+ "integrity": "sha512-6rdyFg2kLrMh9Jee7/BMPuV9lEAd7lLW2YUpF9/YxR7njyoUwwQ0ZPh3TaIY50Sw6vlyD2HW3wGOkTS4P79xrQ==",
"license": "MIT",
"dependencies": {
"append-field": "^1.0.0",
@@ -14753,9 +14977,9 @@
}
},
"node_modules/nanoid": {
- "version": "3.3.11",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
- "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "version": "3.3.15",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz",
+ "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==",
"dev": true,
"funding": [
{
@@ -14801,13 +15025,13 @@
}
},
"node_modules/next": {
- "version": "16.2.4",
- "resolved": "https://registry.npmjs.org/next/-/next-16.2.4.tgz",
- "integrity": "sha512-kPvz56wF5frc+FxlHI5qnklCzbq53HTwORaWBGdT0vNoKh1Aya9XC8aPauH4NJxqtzbWsS5mAbctm4cr+EkQ2Q==",
+ "version": "16.2.10",
+ "resolved": "https://registry.npmjs.org/next/-/next-16.2.10.tgz",
+ "integrity": "sha512-2som5AVXb3kE6Yjine3/mNbBayYF58eguBWIVVUdr1y/L426xyVEgYxgBG+1QC34P2x5E+tcDup6XkuOAX3dCA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@next/env": "16.2.4",
+ "@next/env": "16.2.10",
"@swc/helpers": "0.5.15",
"baseline-browser-mapping": "^2.9.19",
"caniuse-lite": "^1.0.30001579",
@@ -14821,14 +15045,14 @@
"node": ">=20.9.0"
},
"optionalDependencies": {
- "@next/swc-darwin-arm64": "16.2.4",
- "@next/swc-darwin-x64": "16.2.4",
- "@next/swc-linux-arm64-gnu": "16.2.4",
- "@next/swc-linux-arm64-musl": "16.2.4",
- "@next/swc-linux-x64-gnu": "16.2.4",
- "@next/swc-linux-x64-musl": "16.2.4",
- "@next/swc-win32-arm64-msvc": "16.2.4",
- "@next/swc-win32-x64-msvc": "16.2.4",
+ "@next/swc-darwin-arm64": "16.2.10",
+ "@next/swc-darwin-x64": "16.2.10",
+ "@next/swc-linux-arm64-gnu": "16.2.10",
+ "@next/swc-linux-arm64-musl": "16.2.10",
+ "@next/swc-linux-x64-gnu": "16.2.10",
+ "@next/swc-linux-x64-musl": "16.2.10",
+ "@next/swc-win32-arm64-msvc": "16.2.10",
+ "@next/swc-win32-x64-msvc": "16.2.10",
"sharp": "^0.34.5"
},
"peerDependencies": {
@@ -14962,16 +15186,19 @@
}
},
"node_modules/node-releases": {
- "version": "2.0.38",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz",
- "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==",
+ "version": "2.0.50",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz",
+ "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
},
"node_modules/nodemailer": {
- "version": "8.0.6",
- "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-8.0.6.tgz",
- "integrity": "sha512-Nm2XeuDwwy2wi5A+8jPWwQwNzcjNjhWdE3pVLoXEusxJqCnAPAgnBGkSmiLknbnWuOF9qraRpYZjfxqtKZ4tPw==",
+ "version": "8.0.11",
+ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-8.0.11.tgz",
+ "integrity": "sha512-nrO/pDAUKl+wXX+lx16tDLbnm0fW6sK/x8mgohaCpg+CdCEl482bD4tCuAZk2DyliruiNTIZxRCoWkDqJEnAiA==",
"license": "MIT-0",
"engines": {
"node": ">=6.0.0"
@@ -15047,9 +15274,9 @@
"license": "MIT"
},
"node_modules/npm-run-all/node_modules/brace-expansion": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz",
- "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==",
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz",
+ "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -15400,9 +15627,9 @@
}
},
"node_modules/papaparse": {
- "version": "5.5.3",
- "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.3.tgz",
- "integrity": "sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==",
+ "version": "5.5.4",
+ "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.4.tgz",
+ "integrity": "sha512-SwzWD9gl/ElwYLCI0nUja1mFJzjq2D8ziShfNBa7zCHzkOozeOGDwHWQ+tvCzEZcewecWZ5U7kUopDnG+DFYEQ==",
"dev": true,
"license": "MIT"
},
@@ -15580,9 +15807,9 @@
}
},
"node_modules/path-expression-matcher": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz",
- "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==",
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.6.1.tgz",
+ "integrity": "sha512-h7bxdzhHk8Knyc4Tj+jMaa7fEEoUJy7p1qtbVgkYg1Uhpe5Np5VuGXCRZnkZvU+Q42M1vStt0ifa3ueykRJPmQ==",
"dev": true,
"funding": [
{
@@ -15653,9 +15880,9 @@
}
},
"node_modules/path-scurry/node_modules/lru-cache": {
- "version": "11.3.5",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz",
- "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==",
+ "version": "11.5.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz",
+ "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==",
"dev": true,
"license": "BlueOak-1.0.0",
"engines": {
@@ -15903,9 +16130,9 @@
}
},
"node_modules/postcss": {
- "version": "8.5.12",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.12.tgz",
- "integrity": "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==",
+ "version": "8.5.16",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz",
+ "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==",
"dev": true,
"funding": [
{
@@ -15923,7 +16150,7 @@
],
"license": "MIT",
"dependencies": {
- "nanoid": "^3.3.11",
+ "nanoid": "^3.3.12",
"picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
},
@@ -15999,9 +16226,9 @@
}
},
"node_modules/prettier": {
- "version": "3.8.3",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz",
- "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==",
+ "version": "3.9.4",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.4.tgz",
+ "integrity": "sha512-yWG/o/4oJfo036EKAfK6ACAoDOfHeRHx4tuxkfBZiauURiaSmYwlpOr5LQqKtIkRD2z1PLteme2WoxEnj4tHTg==",
"dev": true,
"license": "MIT",
"bin": {
@@ -16067,9 +16294,9 @@
"license": "MIT"
},
"node_modules/property-information": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz",
- "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz",
+ "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==",
"dev": true,
"license": "MIT",
"funding": {
@@ -16208,12 +16435,16 @@
}
},
"node_modules/range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz",
+ "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/raw-body": {
@@ -16232,9 +16463,9 @@
}
},
"node_modules/react": {
- "version": "19.2.5",
- "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz",
- "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==",
+ "version": "19.2.7",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz",
+ "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -16242,20 +16473,20 @@
}
},
"node_modules/react-aria": {
- "version": "3.48.0",
- "resolved": "https://registry.npmjs.org/react-aria/-/react-aria-3.48.0.tgz",
- "integrity": "sha512-jQjd4rBEIMqecBaAKYJbVGK6EqIHLa5znVQ7jwFyK5vCyljoj6KhgtiahmcIPsG5vG5vEDLw+ba+bEWn6A2P4w==",
+ "version": "3.50.0",
+ "resolved": "https://registry.npmjs.org/react-aria/-/react-aria-3.50.0.tgz",
+ "integrity": "sha512-S0Os6QZk33fzUAKu1QLT9afoUaCBt1ZNdoiq0n2YMVgKIdNIQS8zxiZ8O9hYE6QyDkHKjD6q39LQZ+qaSAIgjw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@internationalized/date": "^3.12.1",
- "@internationalized/number": "^3.6.6",
- "@internationalized/string": "^3.2.8",
- "@react-types/shared": "^3.34.0",
+ "@internationalized/date": "^3.12.2",
+ "@internationalized/number": "^3.6.7",
+ "@internationalized/string": "^3.2.9",
+ "@react-types/shared": "^3.36.0",
"@swc/helpers": "^0.5.0",
"aria-hidden": "^1.2.3",
"clsx": "^2.0.0",
- "react-stately": "3.46.0",
+ "react-stately": "3.48.0",
"use-sync-external-store": "^1.6.0"
},
"peerDependencies": {
@@ -16264,16 +16495,16 @@
}
},
"node_modules/react-dom": {
- "version": "19.2.5",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz",
- "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==",
+ "version": "19.2.7",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz",
+ "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"scheduler": "^0.27.0"
},
"peerDependencies": {
- "react": "^19.2.5"
+ "react": "^19.2.7"
}
},
"node_modules/react-fast-compare": {
@@ -16284,25 +16515,25 @@
"license": "MIT"
},
"node_modules/react-intl": {
- "version": "10.1.3",
- "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-10.1.3.tgz",
- "integrity": "sha512-SEONkI1nbrMJ5OXhCD66YSPY8Py5VuAA1P9pLKi3pB+eYRUbt0ryF3lhue8rH/SVX2d/hvKa6C4YB/lGjophKg==",
+ "version": "10.1.14",
+ "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-10.1.14.tgz",
+ "integrity": "sha512-DuL7vAViDCjxyiPNccMkt1PBv22mh+1OBhA8ta4r0fbjnJYhLVFc+3pR71qADZRHytRnKm9JcVDP9jYJW+qO6g==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
- "@formatjs/icu-messageformat-parser": "3.5.5",
- "@formatjs/intl": "4.1.7",
- "intl-messageformat": "11.2.2"
+ "@formatjs/icu-messageformat-parser": "3.5.12",
+ "@formatjs/intl": "4.1.14",
+ "intl-messageformat": "11.2.9"
},
"peerDependencies": {
- "@types/react": "19",
- "react": "19"
+ "@types/react": ">=18.0.0",
+ "react": ">=18.0.0"
}
},
"node_modules/react-is": {
- "version": "19.2.5",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.5.tgz",
- "integrity": "sha512-Dn0t8IQhCmeIT3wu+Apm1/YVsJXsGWi6k4sPdnBIdqMVtHtv0IGi6dcpNpNkNac0zB2uUAqNX3MHzN8c+z2rwQ==",
+ "version": "19.2.7",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz",
+ "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==",
"dev": true,
"license": "MIT"
},
@@ -16335,9 +16566,9 @@
}
},
"node_modules/react-redux": {
- "version": "9.2.0",
- "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz",
- "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==",
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.3.0.tgz",
+ "integrity": "sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -16359,16 +16590,16 @@
}
},
"node_modules/react-stately": {
- "version": "3.46.0",
- "resolved": "https://registry.npmjs.org/react-stately/-/react-stately-3.46.0.tgz",
- "integrity": "sha512-OdxhWvHgs2L4OJGIs7hnuTr5WjjMM6enhNEAMRqiekhF8+ITvA2LRwNftOZwcogaoCslGYq5S2VQTQwnm0GbCA==",
+ "version": "3.48.0",
+ "resolved": "https://registry.npmjs.org/react-stately/-/react-stately-3.48.0.tgz",
+ "integrity": "sha512-ImicSAG+lTotAe5izcs1fz49Zk48w7pDusqYg04WaPhCoej8BJ24soMu3iLXIrsi273s4P1gZrYGrqReMfgEEA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@internationalized/date": "^3.12.1",
- "@internationalized/number": "^3.6.6",
- "@internationalized/string": "^3.2.8",
- "@react-types/shared": "^3.34.0",
+ "@internationalized/date": "^3.12.2",
+ "@internationalized/number": "^3.6.7",
+ "@internationalized/string": "^3.2.9",
+ "@react-types/shared": "^3.36.0",
"@swc/helpers": "^0.5.0",
"use-sync-external-store": "^1.6.0"
},
@@ -16443,9 +16674,9 @@
}
},
"node_modules/recharts": {
- "version": "3.8.1",
- "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.8.1.tgz",
- "integrity": "sha512-mwzmO1s9sFL0TduUpwndxCUNoXsBw3u3E/0+A+cLcrSfQitSG62L32N69GhqUrrT5qKcAE3pCGVINC6pqkBBQg==",
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.9.1.tgz",
+ "integrity": "sha512-WMcwlXcB7l+BbxiEdyClkG+1sxrMHNZpzT577LEvU4+rXPd8oTAy1wXk72hnk2KOOmxuLvw3z5DtXT7HEAydtg==",
"dev": true,
"license": "MIT",
"workspaces": [
@@ -16457,9 +16688,9 @@
"decimal.js-light": "^2.5.1",
"es-toolkit": "^1.39.3",
"eventemitter3": "^5.0.1",
- "immer": "^10.1.1",
+ "immer": "^11.1.8",
"react-redux": "8.x.x || 9.x.x",
- "reselect": "5.1.1",
+ "reselect": "5.2.0",
"tiny-invariant": "^1.3.3",
"use-sync-external-store": "^1.2.2",
"victory-vendor": "^37.0.2"
@@ -16699,9 +16930,9 @@
}
},
"node_modules/reselect": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz",
- "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.2.0.tgz",
+ "integrity": "sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==",
"dev": true,
"license": "MIT"
},
@@ -16746,6 +16977,39 @@
"node": ">=8"
}
},
+ "node_modules/restore-cursor": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
+ "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "onetime": "^7.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/restore-cursor/node_modules/onetime": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
+ "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-function": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/ret": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz",
@@ -16779,9 +17043,9 @@
"license": "Unlicense"
},
"node_modules/rollup": {
- "version": "4.61.0",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.61.0.tgz",
- "integrity": "sha512-T9mWdbWfQtp0B5lv/HX+wrhYsmXRlcWnXXmJbXqKJhlRaoS6KMhq0gpyzW4UJfclcxrEdLnTgjT2NjruLONu0g==",
+ "version": "4.62.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz",
+ "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -16795,31 +17059,31 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.61.0",
- "@rollup/rollup-android-arm64": "4.61.0",
- "@rollup/rollup-darwin-arm64": "4.61.0",
- "@rollup/rollup-darwin-x64": "4.61.0",
- "@rollup/rollup-freebsd-arm64": "4.61.0",
- "@rollup/rollup-freebsd-x64": "4.61.0",
- "@rollup/rollup-linux-arm-gnueabihf": "4.61.0",
- "@rollup/rollup-linux-arm-musleabihf": "4.61.0",
- "@rollup/rollup-linux-arm64-gnu": "4.61.0",
- "@rollup/rollup-linux-arm64-musl": "4.61.0",
- "@rollup/rollup-linux-loong64-gnu": "4.61.0",
- "@rollup/rollup-linux-loong64-musl": "4.61.0",
- "@rollup/rollup-linux-ppc64-gnu": "4.61.0",
- "@rollup/rollup-linux-ppc64-musl": "4.61.0",
- "@rollup/rollup-linux-riscv64-gnu": "4.61.0",
- "@rollup/rollup-linux-riscv64-musl": "4.61.0",
- "@rollup/rollup-linux-s390x-gnu": "4.61.0",
- "@rollup/rollup-linux-x64-gnu": "4.61.0",
- "@rollup/rollup-linux-x64-musl": "4.61.0",
- "@rollup/rollup-openbsd-x64": "4.61.0",
- "@rollup/rollup-openharmony-arm64": "4.61.0",
- "@rollup/rollup-win32-arm64-msvc": "4.61.0",
- "@rollup/rollup-win32-ia32-msvc": "4.61.0",
- "@rollup/rollup-win32-x64-gnu": "4.61.0",
- "@rollup/rollup-win32-x64-msvc": "4.61.0",
+ "@rollup/rollup-android-arm-eabi": "4.62.2",
+ "@rollup/rollup-android-arm64": "4.62.2",
+ "@rollup/rollup-darwin-arm64": "4.62.2",
+ "@rollup/rollup-darwin-x64": "4.62.2",
+ "@rollup/rollup-freebsd-arm64": "4.62.2",
+ "@rollup/rollup-freebsd-x64": "4.62.2",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.62.2",
+ "@rollup/rollup-linux-arm-musleabihf": "4.62.2",
+ "@rollup/rollup-linux-arm64-gnu": "4.62.2",
+ "@rollup/rollup-linux-arm64-musl": "4.62.2",
+ "@rollup/rollup-linux-loong64-gnu": "4.62.2",
+ "@rollup/rollup-linux-loong64-musl": "4.62.2",
+ "@rollup/rollup-linux-ppc64-gnu": "4.62.2",
+ "@rollup/rollup-linux-ppc64-musl": "4.62.2",
+ "@rollup/rollup-linux-riscv64-gnu": "4.62.2",
+ "@rollup/rollup-linux-riscv64-musl": "4.62.2",
+ "@rollup/rollup-linux-s390x-gnu": "4.62.2",
+ "@rollup/rollup-linux-x64-gnu": "4.62.2",
+ "@rollup/rollup-linux-x64-musl": "4.62.2",
+ "@rollup/rollup-openbsd-x64": "4.62.2",
+ "@rollup/rollup-openharmony-arm64": "4.62.2",
+ "@rollup/rollup-win32-arm64-msvc": "4.62.2",
+ "@rollup/rollup-win32-ia32-msvc": "4.62.2",
+ "@rollup/rollup-win32-x64-gnu": "4.62.2",
+ "@rollup/rollup-win32-x64-msvc": "4.62.2",
"fsevents": "~2.3.2"
}
},
@@ -17025,9 +17289,9 @@
"license": "BSD-3-Clause"
},
"node_modules/semver": {
- "version": "7.7.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
- "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -17249,9 +17513,9 @@
}
},
"node_modules/shell-quote": {
- "version": "1.8.3",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz",
- "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==",
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.9.0.tgz",
+ "integrity": "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -17598,9 +17862,9 @@
}
},
"node_modules/streamx": {
- "version": "2.25.0",
- "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz",
- "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==",
+ "version": "2.28.0",
+ "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.28.0.tgz",
+ "integrity": "sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -17650,6 +17914,16 @@
"node": ">=8"
}
},
+ "node_modules/string-width/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/string-width/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
@@ -17660,6 +17934,19 @@
"node": ">=8"
}
},
+ "node_modules/string-width/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/string.prototype.padend": {
"version": "3.1.6",
"resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz",
@@ -17680,19 +17967,20 @@
}
},
"node_modules/string.prototype.trim": {
- "version": "1.2.10",
- "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
- "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz",
+ "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.2",
+ "call-bind": "^1.0.9",
+ "call-bound": "^1.0.4",
"define-data-property": "^1.1.4",
"define-properties": "^1.2.1",
- "es-abstract": "^1.23.5",
- "es-object-atoms": "^1.0.0",
- "has-property-descriptors": "^1.0.2"
+ "es-abstract": "^1.24.2",
+ "es-object-atoms": "^1.1.2",
+ "has-property-descriptors": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -17702,16 +17990,16 @@
}
},
"node_modules/string.prototype.trimend": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
- "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz",
+ "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.8",
- "call-bound": "^1.0.2",
+ "call-bind": "^1.0.9",
+ "call-bound": "^1.0.4",
"define-properties": "^1.2.1",
- "es-object-atoms": "^1.0.0"
+ "es-object-atoms": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
@@ -17754,16 +18042,19 @@
}
},
"node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ansi-regex": "^5.0.1"
+ "ansi-regex": "^6.2.2"
},
"engines": {
- "node": ">=8"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
"node_modules/strip-bom": {
@@ -17787,9 +18078,9 @@
}
},
"node_modules/stripe": {
- "version": "22.1.0",
- "resolved": "https://registry.npmjs.org/stripe/-/stripe-22.1.0.tgz",
- "integrity": "sha512-w/xHyJGxXWnLPbNHG13sz/fae0MrFGC80Oz7YbICQymbfpqfEcsoG+6yG+9BWb81PWc4rrkeSO4wmTcmefmbLw==",
+ "version": "22.3.0",
+ "resolved": "https://registry.npmjs.org/stripe/-/stripe-22.3.0.tgz",
+ "integrity": "sha512-ypO6xjVrMWs9SmIMeHr8naCx3dAQ0clxMdUTxn7Ejd7hmY9meBGfE+N4pVHkf9sUNebAHp6uJo6mV3GxDIc2cA==",
"license": "MIT",
"engines": {
"node": ">=18"
@@ -17804,9 +18095,9 @@
}
},
"node_modules/strnum": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.3.tgz",
- "integrity": "sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==",
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.1.tgz",
+ "integrity": "sha512-M9eUSMT2dCB2cTNPG7UYj6KuK7RJR2SN2+yCV/fTW3xzTCS6EaGZ5pSMgDIjB7r8zSfTGk+dvvn9rTjpVS9Mwg==",
"dev": true,
"funding": [
{
@@ -17814,7 +18105,10 @@
"url": "https://github.com/sponsors/NaturalIntelligence"
}
],
- "license": "MIT"
+ "license": "MIT",
+ "dependencies": {
+ "anynum": "^1.0.1"
+ }
},
"node_modules/style-to-js": {
"version": "1.1.21",
@@ -17930,9 +18224,9 @@
}
},
"node_modules/swr": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/swr/-/swr-2.4.1.tgz",
- "integrity": "sha512-2CC6CiKQtEwaEeNiqWTAw9PGykW8SR5zZX8MZk6TeAvEAnVS7Visz8WzphqgtQ8v2xz/4Q5K+j+SeMaKXeeQIA==",
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/swr/-/swr-2.4.2.tgz",
+ "integrity": "sha512-ej644Y2bvkIajfR32KGeSSdBXQW+ScjGjkybZgSE7kFpk9eGnV44XY9FJylXi+W75pavSX1PVNB57W5EbhGIYw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -17959,13 +18253,13 @@
}
},
"node_modules/synckit": {
- "version": "0.11.12",
- "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz",
- "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==",
+ "version": "0.11.13",
+ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz",
+ "integrity": "sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@pkgr/core": "^0.2.9"
+ "@pkgr/core": "^0.3.6"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
@@ -17975,9 +18269,9 @@
}
},
"node_modules/systeminformation": {
- "version": "5.31.5",
- "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.31.5.tgz",
- "integrity": "sha512-5SyLdip4/3alxD4Kh+63bUQTJmu7YMfYQTC+koZy7X73HgNqZSD2P4wOZQWtUncvPvcEmnfIjCoygN4MRoEejQ==",
+ "version": "5.31.11",
+ "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.31.11.tgz",
+ "integrity": "sha512-I6O7iaUj23AXRgCPDDnvi3xHvdOLp4+1YMbF+X194lJwY1NeWojgHJPhslVKcmTtrLTguRk3QJK+xEdTiI3P0w==",
"dev": true,
"license": "MIT",
"os": [
@@ -18002,16 +18296,16 @@
}
},
"node_modules/tabbable": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz",
- "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==",
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.5.0.tgz",
+ "integrity": "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==",
"dev": true,
"license": "MIT"
},
"node_modules/tailwind-merge": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.5.0.tgz",
- "integrity": "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==",
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz",
+ "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==",
"dev": true,
"license": "MIT",
"funding": {
@@ -18020,9 +18314,9 @@
}
},
"node_modules/tailwindcss": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.4.tgz",
- "integrity": "sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==",
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz",
+ "integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==",
"dev": true,
"license": "MIT"
},
@@ -18041,9 +18335,9 @@
}
},
"node_modules/tar-stream": {
- "version": "3.1.8",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz",
- "integrity": "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.0.tgz",
+ "integrity": "sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -18097,17 +18391,23 @@
}
},
"node_modules/thread-stream": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.0.0.tgz",
- "integrity": "sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.2.0.tgz",
+ "integrity": "sha512-e2zZ96wSChazBsbENf/Pcm/4swHt2cEKQ92rhUjkL9GCKiTDJIaTBenjE/m9DXi0QBmTMDkFDdOomUy20A1tDQ==",
"license": "MIT",
"dependencies": {
- "real-require": "^0.2.0"
+ "real-require": "^1.0.0"
},
"engines": {
"node": ">=20"
}
},
+ "node_modules/thread-stream/node_modules/real-require": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/real-require/-/real-require-1.0.0.tgz",
+ "integrity": "sha512-P4nbQYQfePJxRSmY+v/KINxVucm4NF3p3s7pJveMTtom52FR4YGltUQLB8idDXwDDWW+eYrWDFbuzUnjoWHF7g==",
+ "license": "MIT"
+ },
"node_modules/throttleit": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz",
@@ -18163,9 +18463,9 @@
"license": "MIT"
},
"node_modules/tinyglobby": {
- "version": "0.2.16",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz",
- "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==",
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
+ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -18210,9 +18510,9 @@
"license": "MIT"
},
"node_modules/tmp": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz",
- "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==",
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz",
+ "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -18233,12 +18533,12 @@
}
},
"node_modules/toad-cache": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz",
- "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==",
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.1.tgz",
+ "integrity": "sha512-5DXWzE4Vz7xNHsv+xQ+MGfJYyC78Aok3tEr0MNwHoRf7vZnga1mQXZ4/Nsodld4VR6Wd+VhfmqnNrsRJyYPfrQ==",
"license": "MIT",
"engines": {
- "node": ">=12"
+ "node": ">=20"
}
},
"node_modules/toidentifier": {
@@ -18437,17 +18737,34 @@
}
},
"node_modules/type-is": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
- "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz",
+ "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==",
"license": "MIT",
"dependencies": {
- "content-type": "^1.0.5",
+ "content-type": "^2.0.0",
"media-typer": "^1.1.0",
"mime-types": "^3.0.0"
},
"engines": {
- "node": ">= 0.6"
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/type-is/node_modules/content-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz",
+ "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/type-is/node_modules/mime-db": {
@@ -18533,18 +18850,18 @@
}
},
"node_modules/typed-array-length": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
- "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz",
+ "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "is-typed-array": "^1.1.13",
- "possible-typed-array-names": "^1.0.0",
- "reflect.getprototypeof": "^1.0.6"
+ "call-bind": "^1.0.9",
+ "for-each": "^0.3.5",
+ "gopd": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "possible-typed-array-names": "^1.1.0",
+ "reflect.getprototypeof": "^1.0.10"
},
"engines": {
"node": ">= 0.4"
@@ -18598,16 +18915,16 @@
}
},
"node_modules/typescript-eslint": {
- "version": "8.59.0",
- "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.0.tgz",
- "integrity": "sha512-BU3ONW9X+v90EcCH9ZS6LMackcVtxRLlI3XrYyqZIwVSHIk7Qf7bFw1z0M9Q0IUxhTMZCf8piY9hTYaNEIASrw==",
+ "version": "8.62.1",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.62.1.tgz",
+ "integrity": "sha512-vymnnM5g0AKQDSAyfP12nMIBvgwgA42syg74kkuZ4x1VuTzwQKwc5h9rGxeShCjny5o+zWAb6OEoz7XLgrIkIw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/eslint-plugin": "8.59.0",
- "@typescript-eslint/parser": "8.59.0",
- "@typescript-eslint/typescript-estree": "8.59.0",
- "@typescript-eslint/utils": "8.59.0"
+ "@typescript-eslint/eslint-plugin": "8.62.1",
+ "@typescript-eslint/parser": "8.62.1",
+ "@typescript-eslint/typescript-estree": "8.62.1",
+ "@typescript-eslint/utils": "8.62.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -18677,9 +18994,9 @@
}
},
"node_modules/undici-types": {
- "version": "7.19.2",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz",
- "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==",
+ "version": "7.24.6",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz",
+ "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==",
"devOptional": true,
"license": "MIT"
},
@@ -19179,14 +19496,14 @@
}
},
"node_modules/which-typed-array": {
- "version": "1.1.20",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz",
- "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==",
+ "version": "1.1.22",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz",
+ "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==",
"dev": true,
"license": "MIT",
"dependencies": {
"available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.8",
+ "call-bind": "^1.0.9",
"call-bound": "^1.0.4",
"for-each": "^0.3.5",
"get-proto": "^1.0.1",
@@ -19225,6 +19542,16 @@
"node": ">=8"
}
},
+ "node_modules/wrap-ansi/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/wrap-ansi/node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
@@ -19261,6 +19588,19 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/wrap-ansi/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -19268,9 +19608,9 @@
"license": "ISC"
},
"node_modules/ws": {
- "version": "8.20.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz",
- "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==",
+ "version": "8.21.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz",
+ "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==",
"dev": true,
"license": "MIT",
"engines": {
@@ -19301,6 +19641,22 @@
"xml-js": "bin/cli.js"
}
},
+ "node_modules/xml-naming": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz",
+ "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
"node_modules/xml2js": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz",
@@ -19343,9 +19699,9 @@
"license": "ISC"
},
"node_modules/yaml": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz",
- "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==",
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
+ "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
"dev": true,
"license": "ISC",
"bin": {
@@ -19359,9 +19715,9 @@
}
},
"node_modules/yargs": {
- "version": "17.7.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
- "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "version": "17.7.3",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz",
+ "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -19427,9 +19783,9 @@
}
},
"node_modules/zod": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz",
- "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==",
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz",
+ "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/colinhacks"
@@ -20004,6 +20360,7 @@
"@unchainedshop/api": "^5.0.0-alpha.1",
"@unchainedshop/core": "^5.0.0-alpha.1",
"@unchainedshop/core-files": "^5.0.0-alpha.1",
+ "@unchainedshop/core-orders": "^5.0.0-alpha.1",
"@unchainedshop/core-warehousing": "^5.0.0-alpha.1",
"@unchainedshop/core-worker": "^5.0.0-alpha.1",
"@unchainedshop/events": "^5.0.0-alpha.1",
diff --git a/packages/api/src/context.ts b/packages/api/src/context.ts
index 09a66e7af1..72d08ed982 100644
--- a/packages/api/src/context.ts
+++ b/packages/api/src/context.ts
@@ -40,9 +40,22 @@ export interface AdminUiConfig {
defaultUserTags?: string[];
}
+export interface CookieOptions {
+ domain?: string;
+ path?: string;
+ secure?: boolean;
+ httpOnly?: boolean;
+ sameSite?: 'strict' | 'lax' | 'none' | boolean;
+ maxAge?: number;
+ expires?: Date;
+}
+
export interface UnchainedHTTPServerContext {
setHeader: (key: string, value: string) => void;
getHeader: (key: string) => string;
+ getCookie: (name: string) => string | undefined;
+ setCookie: (name: string, value: string, options: CookieOptions) => void;
+ clearCookie: (name: string, options: CookieOptions) => void;
remoteAddress?: string;
remotePort?: number;
}
@@ -78,6 +91,9 @@ export const createContextResolver =
async ({
getHeader,
setHeader,
+ getCookie,
+ setCookie,
+ clearCookie,
remoteAddress,
remotePort,
userId,
@@ -87,7 +103,15 @@ export const createContextResolver =
login,
logout,
}) => {
- const abstractHttpServerContext = { remoteAddress, remotePort, getHeader, setHeader };
+ const abstractHttpServerContext = {
+ remoteAddress,
+ remotePort,
+ getHeader,
+ setHeader,
+ getCookie,
+ setCookie,
+ clearCookie,
+ };
const loaders = instantiateLoaders(unchainedAPI);
const localeContext = await getLocaleContext(abstractHttpServerContext, unchainedAPI);
diff --git a/packages/api/src/errors.ts b/packages/api/src/errors.ts
index a445630fee..322dba3da6 100644
--- a/packages/api/src/errors.ts
+++ b/packages/api/src/errors.ts
@@ -231,6 +231,11 @@ export const TokenWrongStatusError = createError(
export const TokenNotFoundError = createError('TokenNotFoundError', 'Token not found');
+export const TokenAlreadyRedeemedError = createError(
+ 'TokenAlreadyRedeemedError',
+ 'Cannot cancel a redeemed ticket',
+);
+
export const CyclicAssortmentLinkNotSupportedError = createError(
'CyclicAssortmentLinkNotSupported',
'Cyclic assortment link detected, make sure child assortment is not assigned as a parent on the assortment graph',
@@ -340,3 +345,8 @@ export const DuplicateFilterKeyError = createError(
'DuplicateFilterKeyError',
'Key already registered for another filter',
);
+
+export const TicketingModuleNotFoundError = createError(
+ 'TicketingModuleNotFoundError',
+ 'Ticketing module (passes) is not available, please configure @unchainedshop/ticketing',
+);
diff --git a/packages/api/src/express/index.ts b/packages/api/src/express/index.ts
index 07b15f4736..bb2db00eb5 100644
--- a/packages/api/src/express/index.ts
+++ b/packages/api/src/express/index.ts
@@ -172,6 +172,9 @@ const createAddContextMiddleware = (authConfig?: AuthConfig, trustProxy = false)
{
setHeader,
getHeader,
+ getCookie,
+ setCookie,
+ clearCookie,
remoteAddress,
remotePort,
login: authContext.login,
diff --git a/packages/api/src/fastify/index.ts b/packages/api/src/fastify/index.ts
index f6895c6ea2..9f714a9179 100644
--- a/packages/api/src/fastify/index.ts
+++ b/packages/api/src/fastify/index.ts
@@ -101,6 +101,9 @@ const createMiddlewareHook = (authConfig?: AuthConfig, trustProxy = false) =>
{
setHeader,
getHeader,
+ getCookie,
+ setCookie,
+ clearCookie,
remoteAddress,
remotePort,
login: authContext.login,
diff --git a/packages/api/src/gate-cookie.ts b/packages/api/src/gate-cookie.ts
new file mode 100644
index 0000000000..21435bdc45
--- /dev/null
+++ b/packages/api/src/gate-cookie.ts
@@ -0,0 +1,33 @@
+import type { CookieOptions } from './context.ts';
+
+const {
+ UNCHAINED_GATE_COOKIE_NAME = 'unchained_gate_passcode',
+ UNCHAINED_GATE_COOKIE_MAX_AGE_SECONDS = '86400', // 24 hours
+ UNCHAINED_COOKIE_PATH = '/',
+ UNCHAINED_COOKIE_DOMAIN,
+ UNCHAINED_COOKIE_SAMESITE = 'lax',
+ UNCHAINED_COOKIE_INSECURE,
+} = process.env;
+
+export const GATE_COOKIE_NAME = UNCHAINED_GATE_COOKIE_NAME;
+export const GATE_COOKIE_MAX_AGE = parseInt(UNCHAINED_GATE_COOKIE_MAX_AGE_SECONDS, 10) * 1000;
+
+const resolveSameSite = (): CookieOptions['sameSite'] =>
+ (
+ ({
+ none: 'none',
+ lax: 'lax',
+ strict: 'strict',
+ }) as Record
+ )[UNCHAINED_COOKIE_SAMESITE?.trim()?.toLowerCase()] || 'lax';
+
+export function getGateCookieOptions(maxAge?: number): CookieOptions {
+ return {
+ domain: UNCHAINED_COOKIE_DOMAIN,
+ path: UNCHAINED_COOKIE_PATH,
+ secure: !UNCHAINED_COOKIE_INSECURE,
+ httpOnly: true,
+ sameSite: resolveSameSite(),
+ maxAge,
+ };
+}
diff --git a/packages/api/src/resolvers/mutations/index.ts b/packages/api/src/resolvers/mutations/index.ts
index f8773a5319..37ebaedf60 100755
--- a/packages/api/src/resolvers/mutations/index.ts
+++ b/packages/api/src/resolvers/mutations/index.ts
@@ -84,6 +84,11 @@ import updateWarehousingProvider from './warehousing/updateWarehousingProvider.t
import removeWarehousingProvider from './warehousing/removeWarehousingProvider.ts';
import exportToken from './warehousing/exportToken.ts';
import invalidateToken from './warehousing/invalidateToken.ts';
+import cancelTicket from './warehousing/cancelTicket.ts';
+import cancelEvent from './warehousing/cancelEvent.ts';
+import setEventScannerPassCode from './warehousing/setEventScannerPassCode.ts';
+import authenticateGate from './warehousing/authenticateGate.ts';
+import deauthenticateGate from './warehousing/deauthenticateGate.ts';
import setPassword from './accounts/setPassword.ts';
import setRoles from './users/setRoles.ts';
import setUsername from './accounts/setUsername.ts';
@@ -266,6 +271,11 @@ export default {
removeWarehousingProvider: acl(actions.manageWarehousingProviders)(removeWarehousingProvider),
exportToken: acl(actions.updateToken)(exportToken),
invalidateToken: acl(actions.updateToken)(invalidateToken),
+ cancelTicket: acl(actions.updateToken)(cancelTicket),
+ cancelEvent: acl(actions.manageProducts)(cancelEvent),
+ setEventScannerPassCode: acl(actions.manageProducts)(setEventScannerPassCode),
+ authenticateGate: acl(actions.validatePassCode)(authenticateGate),
+ deauthenticateGate: acl(actions.validatePassCode)(deauthenticateGate),
createFilter: acl(actions.manageFilters)(createFilter),
updateFilter: acl(actions.manageFilters)(updateFilter),
removeFilter: acl(actions.manageFilters)(removeFilter),
diff --git a/packages/api/src/resolvers/mutations/warehousing/authenticateGate.ts b/packages/api/src/resolvers/mutations/warehousing/authenticateGate.ts
new file mode 100644
index 0000000000..b045ddb2c9
--- /dev/null
+++ b/packages/api/src/resolvers/mutations/warehousing/authenticateGate.ts
@@ -0,0 +1,32 @@
+import { log } from '@unchainedshop/logger';
+import type { Context } from '../../../context.ts';
+import { TicketingModuleNotFoundError } from '../../../errors.ts';
+import { GATE_COOKIE_NAME, GATE_COOKIE_MAX_AGE, getGateCookieOptions } from '../../../gate-cookie.ts';
+
+export default async function authenticateGate(
+ root: never,
+ { passCode }: { passCode: string },
+ context: Context,
+) {
+ const { services, userId } = context;
+ log(`mutation authenticateGate`, { userId });
+
+ if (!passCode) return false;
+
+ const ticketingServices = services as unknown as {
+ ticketing?: {
+ isPassCodeValid: (passCode: string, productId?: string) => Promise;
+ };
+ };
+
+ if (!ticketingServices.ticketing?.isPassCodeValid) {
+ throw new TicketingModuleNotFoundError({});
+ }
+
+ const isValid = await ticketingServices.ticketing.isPassCodeValid(passCode);
+ if (!isValid) return false;
+
+ context.setCookie(GATE_COOKIE_NAME, passCode, getGateCookieOptions(GATE_COOKIE_MAX_AGE));
+
+ return true;
+}
diff --git a/packages/api/src/resolvers/mutations/warehousing/cancelEvent.ts b/packages/api/src/resolvers/mutations/warehousing/cancelEvent.ts
new file mode 100644
index 0000000000..a49ff21f7f
--- /dev/null
+++ b/packages/api/src/resolvers/mutations/warehousing/cancelEvent.ts
@@ -0,0 +1,45 @@
+import type { Context } from '../../../context.ts';
+import { log } from '@unchainedshop/logger';
+import { ProductStatus } from '@unchainedshop/core-products';
+import {
+ InvalidIdError,
+ ProductNotFoundError,
+ ProductWrongStatusError,
+ TicketingModuleNotFoundError,
+} from '../../../errors.ts';
+
+export default async function cancelEvent(
+ root: never,
+ { productId, generateDiscount }: { productId: string; generateDiscount?: boolean },
+ context: Context,
+) {
+ const { modules, services, userId, countryCode, currencyCode } = context;
+ log(`mutation cancelEvent ${productId}`, { userId });
+
+ if (!productId) throw new InvalidIdError({ productId });
+
+ const product = await modules.products.findProduct({ productId });
+ if (!product) throw new ProductNotFoundError({ productId });
+
+ if (product.status !== ProductStatus.ACTIVE) {
+ throw new ProductWrongStatusError({ productId });
+ }
+
+ const passes = (modules as unknown as Record).passes as any;
+ if (!passes?.cancelTicket) {
+ throw new TicketingModuleNotFoundError({});
+ }
+
+ const ticketingServices = (services as unknown as any).ticketing;
+ if (!ticketingServices?.cancelTicketsForProduct) {
+ throw new TicketingModuleNotFoundError({});
+ }
+
+ const result = await ticketingServices.cancelTicketsForProduct(productId, {
+ generateDiscount,
+ countryCode,
+ currencyCode,
+ });
+
+ return result.cancelledCount;
+}
diff --git a/packages/api/src/resolvers/mutations/warehousing/cancelTicket.ts b/packages/api/src/resolvers/mutations/warehousing/cancelTicket.ts
new file mode 100644
index 0000000000..4940a93c77
--- /dev/null
+++ b/packages/api/src/resolvers/mutations/warehousing/cancelTicket.ts
@@ -0,0 +1,48 @@
+import type { Context } from '../../../context.ts';
+import { log } from '@unchainedshop/logger';
+import {
+ InvalidIdError,
+ TokenNotFoundError,
+ TokenAlreadyRedeemedError,
+ TicketingModuleNotFoundError,
+} from '../../../errors.ts';
+
+export default async function cancelTicket(
+ root: never,
+ { tokenId, generateDiscount }: { tokenId: string; generateDiscount?: boolean },
+ context: Context,
+) {
+ const { modules, services, userId, countryCode, currencyCode } = context;
+ log(`mutation cancelTicket ${tokenId}`, { userId, generateDiscount });
+
+ if (!tokenId) throw new InvalidIdError({ tokenId });
+
+ const token = await modules.warehousing.findToken({ tokenId });
+ if (!token) throw new TokenNotFoundError({ tokenId });
+
+ if (token.meta?.cancelled) {
+ return token;
+ }
+
+ if (token.invalidatedDate) {
+ throw new TokenAlreadyRedeemedError({ tokenId });
+ }
+
+ const passes = (modules as unknown as Record).passes as any;
+ if (!passes?.cancelTicket) {
+ throw new TicketingModuleNotFoundError({});
+ }
+
+ const ticketingServices = (services as unknown as any).ticketing;
+ if (!ticketingServices?.cancelTicketWithDiscount) {
+ throw new TicketingModuleNotFoundError({});
+ }
+
+ const result = await ticketingServices.cancelTicketWithDiscount(tokenId, {
+ generateDiscount,
+ countryCode,
+ currencyCode,
+ });
+
+ return result.token;
+}
diff --git a/packages/api/src/resolvers/mutations/warehousing/deauthenticateGate.ts b/packages/api/src/resolvers/mutations/warehousing/deauthenticateGate.ts
new file mode 100644
index 0000000000..eea2a3273c
--- /dev/null
+++ b/packages/api/src/resolvers/mutations/warehousing/deauthenticateGate.ts
@@ -0,0 +1,12 @@
+import { log } from '@unchainedshop/logger';
+import type { Context } from '../../../context.ts';
+import { GATE_COOKIE_NAME, getGateCookieOptions } from '../../../gate-cookie.ts';
+
+export default async function deauthenticateGate(root: never, _: never, context: Context) {
+ const { userId } = context;
+ log(`mutation deauthenticateGate`, { userId });
+
+ context.clearCookie(GATE_COOKIE_NAME, getGateCookieOptions());
+
+ return true;
+}
diff --git a/packages/api/src/resolvers/mutations/warehousing/setEventScannerPassCode.ts b/packages/api/src/resolvers/mutations/warehousing/setEventScannerPassCode.ts
new file mode 100644
index 0000000000..7e54fa88b5
--- /dev/null
+++ b/packages/api/src/resolvers/mutations/warehousing/setEventScannerPassCode.ts
@@ -0,0 +1,29 @@
+import { log } from '@unchainedshop/logger';
+import { InvalidIdError, ProductNotFoundError } from '../../../errors.ts';
+import type { Context } from '../../../context.ts';
+
+export default async function setEventScannerPassCode(
+ root: never,
+ { productId, passCode }: { productId: string; passCode?: string | null },
+ { modules, userId }: Context,
+) {
+ log(`mutation setEventScannerPassCode ${productId}`, { userId });
+
+ if (!productId) throw new InvalidIdError({ productId });
+
+ const product = await modules.products.findProduct({ productId });
+ if (!product) throw new ProductNotFoundError({ productId });
+
+ const existingMeta = (product.meta as Record) || {};
+ const updatedMeta = { ...existingMeta };
+
+ if (passCode === null || passCode === undefined) {
+ delete updatedMeta.scannerPassCode;
+ } else {
+ updatedMeta.scannerPassCode = passCode;
+ }
+
+ await modules.products.update(productId, { meta: updatedMeta });
+
+ return modules.products.findProduct({ productId });
+}
diff --git a/packages/api/src/resolvers/queries/index.ts b/packages/api/src/resolvers/queries/index.ts
index a76d01c9c0..21ca15117d 100755
--- a/packages/api/src/resolvers/queries/index.ts
+++ b/packages/api/src/resolvers/queries/index.ts
@@ -64,6 +64,9 @@ import warehousingProvidersCount from './warehousing/warehousingProvidersCount.t
import token from './warehousing/token.ts';
import tokens from './warehousing/tokens.ts';
import tokensCount from './warehousing/tokensCount.ts';
+import ticketEvents from './ticketing/ticketEvents.ts';
+import ticketEventsCount from './ticketing/ticketEventsCount.ts';
+import isPassCodeValid from './ticketing/isPassCodeValid.ts';
import work from './worker/work.ts';
import workQueue from './worker/workQueue.ts';
import workStatistics from './worker/workStatistics.ts';
@@ -109,6 +112,9 @@ export default {
token: acl(actions.viewToken)(token),
tokens: acl(actions.viewTokens)(tokens),
tokensCount: acl(actions.viewTokens)(tokensCount),
+ ticketEvents: acl(actions.gateControl)(ticketEvents),
+ ticketEventsCount: acl(actions.gateControl)(ticketEventsCount),
+ isPassCodeValid: acl(actions.validatePassCode)(isPassCodeValid),
translatedProductTexts: acl(actions.viewTranslations)(translatedProductTexts),
translatedProductMediaTexts: acl(actions.viewTranslations)(translatedProductMediaTexts),
translatedProductVariationTexts: acl(actions.viewTranslations)(translatedProductVariationTexts),
diff --git a/packages/api/src/resolvers/queries/ticketing/isPassCodeValid.ts b/packages/api/src/resolvers/queries/ticketing/isPassCodeValid.ts
new file mode 100644
index 0000000000..93590412bf
--- /dev/null
+++ b/packages/api/src/resolvers/queries/ticketing/isPassCodeValid.ts
@@ -0,0 +1,29 @@
+import { log } from '@unchainedshop/logger';
+import type { Context } from '../../../context.ts';
+import { TicketingModuleNotFoundError } from '../../../errors.ts';
+import { GATE_COOKIE_NAME } from '../../../gate-cookie.ts';
+
+interface TicketingServices {
+ ticketing?: {
+ isPassCodeValid: (passCode: string, productId?: string) => Promise;
+ };
+}
+
+export default async function isPassCodeValid(
+ root: never,
+ { productId }: { productId?: string },
+ context: Context,
+) {
+ const { services, userId } = context;
+ log(`query isPassCodeValid`, { userId });
+
+ const passCode = context.getCookie(GATE_COOKIE_NAME);
+ if (!passCode) return false;
+
+ const ticketingServices = services as unknown as TicketingServices;
+ if (!ticketingServices.ticketing?.isPassCodeValid) {
+ throw new TicketingModuleNotFoundError({});
+ }
+
+ return ticketingServices.ticketing.isPassCodeValid(passCode, productId);
+}
diff --git a/packages/api/src/resolvers/queries/ticketing/ticketEvents.ts b/packages/api/src/resolvers/queries/ticketing/ticketEvents.ts
new file mode 100644
index 0000000000..b96ce9e03a
--- /dev/null
+++ b/packages/api/src/resolvers/queries/ticketing/ticketEvents.ts
@@ -0,0 +1,76 @@
+import { log } from '@unchainedshop/logger';
+import type { SortOption } from '@unchainedshop/utils';
+import type { Context } from '../../../context.ts';
+import { TicketingModuleNotFoundError } from '../../../errors.ts';
+import { GATE_COOKIE_NAME } from '../../../gate-cookie.ts';
+
+export default async function ticketEvents(
+ root: never,
+ {
+ queryString,
+ limit = 50,
+ offset = 0,
+ includeDrafts = true,
+ sort,
+ onlyInvalidateable = false,
+ }: {
+ queryString?: string;
+ limit: number;
+ offset: number;
+ includeDrafts?: boolean;
+ sort?: SortOption[];
+ onlyInvalidateable?: boolean;
+ },
+ context: Context,
+) {
+ const { modules, services, userId } = context;
+ log(`query ticketEvents`, { userId });
+
+ const passCode = context.getCookie?.(GATE_COOKIE_NAME);
+ const ticketingServices = (context.services as any)?.ticketing;
+
+ let products;
+
+ if (!userId && passCode) {
+ if (!ticketingServices?.productIdsForPassCode) {
+ throw new TicketingModuleNotFoundError({});
+ }
+ const productIds = await ticketingServices.productIdsForPassCode(passCode);
+ if (!productIds.length) return [];
+
+ const allProducts = await modules.products.findProducts({
+ type: 'TOKENIZED_PRODUCT',
+ queryString,
+ includeDrafts: false,
+ limit,
+ offset,
+ sort,
+ });
+
+ products = allProducts.filter((p) => productIds.includes(p._id));
+ } else {
+ products = await modules.products.findProducts({
+ type: 'TOKENIZED_PRODUCT',
+ queryString,
+ includeDrafts,
+ limit,
+ offset,
+ sort,
+ });
+ }
+
+ if (onlyInvalidateable) {
+ const filtered = await Promise.all(
+ products.map(async (product) => {
+ const tokens = await modules.warehousing.findTokens({ productId: product._id });
+ const hasInvalidateable = await Promise.all(
+ tokens.map((token) => services.warehousing.isTokenInvalidateable({ token })),
+ );
+ return hasInvalidateable.some(Boolean) ? product : null;
+ }),
+ );
+ return filtered.filter(Boolean);
+ }
+
+ return products;
+}
diff --git a/packages/api/src/resolvers/queries/ticketing/ticketEventsCount.ts b/packages/api/src/resolvers/queries/ticketing/ticketEventsCount.ts
new file mode 100644
index 0000000000..0018b62849
--- /dev/null
+++ b/packages/api/src/resolvers/queries/ticketing/ticketEventsCount.ts
@@ -0,0 +1,65 @@
+import { log } from '@unchainedshop/logger';
+import type { Context } from '../../../context.ts';
+import { TicketingModuleNotFoundError } from '../../../errors.ts';
+import { GATE_COOKIE_NAME } from '../../../gate-cookie.ts';
+
+export default async function ticketEventsCount(
+ root: never,
+ {
+ queryString,
+ includeDrafts = true,
+ onlyInvalidateable = false,
+ }: {
+ queryString?: string;
+ includeDrafts?: boolean;
+ onlyInvalidateable?: boolean;
+ },
+ context: Context,
+) {
+ const { modules, services, userId } = context;
+ log(`query ticketEventsCount`, { userId });
+
+ const passCode = context.getCookie?.(GATE_COOKIE_NAME);
+ const ticketingServices = (context.services as any)?.ticketing;
+
+ if (!userId && passCode) {
+ if (!ticketingServices?.productIdsForPassCode) {
+ throw new TicketingModuleNotFoundError({});
+ }
+ const productIds = await ticketingServices.productIdsForPassCode(passCode);
+ if (!onlyInvalidateable) return productIds.length;
+
+ let count = 0;
+ for (const productId of productIds) {
+ const tokens = await modules.warehousing.findTokens({ productId });
+ const hasInvalidateable = await Promise.all(
+ tokens.map((token) => services.warehousing.isTokenInvalidateable({ token })),
+ );
+ if (hasInvalidateable.some(Boolean)) count++;
+ }
+ return count;
+ }
+
+ if (onlyInvalidateable) {
+ const products = await modules.products.findProducts({
+ type: 'TOKENIZED_PRODUCT',
+ queryString,
+ includeDrafts,
+ });
+ let count = 0;
+ for (const product of products) {
+ const tokens = await modules.warehousing.findTokens({ productId: product._id });
+ const hasInvalidateable = await Promise.all(
+ tokens.map((token) => services.warehousing.isTokenInvalidateable({ token })),
+ );
+ if (hasInvalidateable.some(Boolean)) count++;
+ }
+ return count;
+ }
+
+ return modules.products.count({
+ type: 'TOKENIZED_PRODUCT',
+ queryString,
+ includeDrafts,
+ });
+}
diff --git a/packages/api/src/resolvers/type/product/product-tokenized-types.ts b/packages/api/src/resolvers/type/product/product-tokenized-types.ts
index ba9e6eabdc..9811d1e511 100644
--- a/packages/api/src/resolvers/type/product/product-tokenized-types.ts
+++ b/packages/api/src/resolvers/type/product/product-tokenized-types.ts
@@ -52,19 +52,36 @@ export const TokenizedProduct = {
});
},
+ isCanceled(product: Product): boolean {
+ return Boolean(product.meta?.cancelled);
+ },
+
async tokens(product: Product, params: never, requestContext: Context) {
- await checkAction(requestContext, actions.viewTokens, [undefined, params]);
+ try {
+ await checkAction(requestContext, actions.viewTokens, [product, params]);
+ } catch {
+ return [];
+ }
const tokens = await requestContext.modules.warehousing.findTokens({
productId: product._id,
});
return tokens;
},
async tokensCount(product: Product, params: never, requestContext: Context) {
- await checkAction(requestContext, actions.viewTokens, [undefined, params]);
+ try {
+ await checkAction(requestContext, actions.viewTokens, [product, params]);
+ } catch {
+ return 0;
+ }
return requestContext.modules.warehousing.tokensCount({
productId: product._id,
});
},
+
+ async scannerPassCode(product: Product, params: never, requestContext: Context) {
+ await checkAction(requestContext, actions.manageProducts, [undefined, params]);
+ return (product.meta as Record)?.scannerPassCode || null;
+ },
};
delete (TokenizedProduct as any).salesUnit;
diff --git a/packages/api/src/resolvers/type/token-types.ts b/packages/api/src/resolvers/type/token-types.ts
index 4a79dc8d8d..72850778d6 100644
--- a/packages/api/src/resolvers/type/token-types.ts
+++ b/packages/api/src/resolvers/type/token-types.ts
@@ -37,6 +37,10 @@ export const Token = {
return services.warehousing.isTokenInvalidateable({ token, product });
},
+ isCanceled: async (token: TokenSurrogate) => {
+ return Boolean(token.meta?.cancelled);
+ },
+
accessKey: async (token: TokenSurrogate, params: never, requestContext: Context) => {
const { modules } = requestContext;
await checkAction(requestContext, actions.updateToken, [undefined, { tokenId: token._id }]);
diff --git a/packages/api/src/roles/all.ts b/packages/api/src/roles/all.ts
index ff630a8437..c9e7206a5e 100644
--- a/packages/api/src/roles/all.ts
+++ b/packages/api/src/roles/all.ts
@@ -1,5 +1,6 @@
import { timingSafeStringEqual } from '@unchainedshop/utils';
import { type Context, IN_LOGIN_RESPONSE } from '../context.ts';
+import { GATE_COOKIE_NAME } from '../gate-cookie.ts';
export const all = (role, actions) => {
const isInLoginMutationResponse = (root) => {
@@ -113,7 +114,26 @@ export const all = (role, actions) => {
role.allow(actions.viewOrder, () => false);
role.allow(actions.viewQuotation, () => false);
role.allow(actions.viewEnrollment, () => false);
- role.allow(actions.viewTokens, () => false);
+ const hasValidPassCode = async (_root: any, _params: any, context: Context) => {
+ const passCode = context.getCookie?.(GATE_COOKIE_NAME);
+ if (!passCode) return false;
+ const ticketingServices = (context.services as any)?.ticketing;
+ if (!ticketingServices?.isPassCodeValid) return false;
+ return ticketingServices.isPassCodeValid(passCode);
+ };
+
+ role.allow(actions.validatePassCode, () => true);
+ role.allow(actions.gateControl, hasValidPassCode);
+
+ const hasValidPassCodeForProduct = async (root: any, _params: any, context: Context) => {
+ if (!root?._id) return false;
+ const passCode = context.getCookie?.(GATE_COOKIE_NAME);
+ if (!passCode) return false;
+ const ticketingServices = (context.services as any)?.ticketing;
+ if (!ticketingServices?.isPassCodeValid) return false;
+ return ticketingServices.isPassCodeValid(passCode, root._id);
+ };
+ role.allow(actions.viewTokens, hasValidPassCodeForProduct);
role.allow(actions.viewStatistics, () => false);
role.allow(actions.uploadUserAvatar, () => false);
role.allow(actions.uploadTempFile, () => false);
@@ -127,12 +147,31 @@ export const all = (role, actions) => {
role.allow(actions.viewUserOrders, isInLoginMutationResponse);
role.allow(actions.viewUserTokens, isInLoginMutationResponse);
role.allow(actions.viewUserQuotations, isInLoginMutationResponse);
- role.allow(actions.viewUserPrivateInfos, isInLoginMutationResponse);
+ const isInLoginOrHasValidPassCode = async (root: any, params: any, context: Context) => {
+ if (isInLoginMutationResponse(root)) return true;
+ return hasValidPassCode(root, params, context);
+ };
+ role.allow(actions.viewUserPrivateInfos, isInLoginOrHasValidPassCode);
role.allow(actions.viewUserEnrollments, isInLoginMutationResponse);
role.allow(actions.viewUserProductReviews, isInLoginMutationResponse);
- // special case: access to token sometimes works via a X-Token-AccessKey Header and thus should also be allowed for anonymous users
- role.allow(actions.updateToken, isOwnedToken);
+ // special case: access to token sometimes works via a X-Token-AccessKey Header or valid gate pass code
+ const hasValidPassCodeForToken = async (_root: any, params: any, context: Context) => {
+ const passCode = context.getCookie?.(GATE_COOKIE_NAME);
+ if (!passCode) return false;
+ const ticketingServices = (context.services as any)?.ticketing;
+ if (!ticketingServices?.isPassCodeValid) return false;
+ const tokenId = params?.tokenId;
+ if (!tokenId) return false;
+ const token = await context.modules.warehousing.findToken({ tokenId });
+ if (!token) return false;
+ return ticketingServices.isPassCodeValid(passCode, token.productId);
+ };
+ const isOwnedTokenOrValidPassCode = async (root: any, params: any, context: Context) => {
+ if (await isOwnedToken(root, params, context)) return true;
+ return hasValidPassCodeForToken(root, params, context);
+ };
+ role.allow(actions.updateToken, isOwnedTokenOrValidPassCode);
role.allow(actions.viewToken, isOwnedToken);
// special case: access to file downloads should work when meta.isPrivate is not set
diff --git a/packages/api/src/roles/index.ts b/packages/api/src/roles/index.ts
index 5ba7f216a1..7acebbf1e0 100644
--- a/packages/api/src/roles/index.ts
+++ b/packages/api/src/roles/index.ts
@@ -117,6 +117,8 @@ const actions: Record = [
'downloadFile',
'uploadUserAvatar',
'uploadTempFile',
+ 'validatePassCode',
+ 'gateControl',
].reduce((oldValue, actionValue) => {
const newValue = oldValue;
newValue[actionValue] = actionValue;
diff --git a/packages/api/src/roles/loggedIn.ts b/packages/api/src/roles/loggedIn.ts
index 3ffcdea877..2ebfe8ebbe 100644
--- a/packages/api/src/roles/loggedIn.ts
+++ b/packages/api/src/roles/loggedIn.ts
@@ -275,4 +275,6 @@ export const loggedIn = (role: any, actions: Record) => {
role.allow(actions.uploadTempFile, canUpdateAvatar);
role.allow(actions.changePassword, () => true);
role.allow(actions.logoutAllSessions, () => true);
+ role.allow(actions.validatePassCode, () => true);
+ role.allow(actions.gateControl, () => true);
};
diff --git a/packages/api/src/schema/mutation.ts b/packages/api/src/schema/mutation.ts
index d5305ec405..a97e151407 100644
--- a/packages/api/src/schema/mutation.ts
+++ b/packages/api/src/schema/mutation.ts
@@ -858,6 +858,36 @@ export default [
invalidateToken(tokenId: ID!): Token!
exportToken(tokenId: ID!, quantity: Int! = 1, recipientWalletAddress: String!): Token!
+ """
+ Cancel a ticket (token). Sets the cancelled flag on the token metadata.
+ Optionally generates a discount code for reimbursement.
+ """
+ cancelTicket(tokenId: ID!, generateDiscount: Boolean): Token!
+
+ """
+ Cancel all tickets for an event (tokenized product). Invalidates all non-cancelled tokens.
+ Optionally generates discount codes for affected users.
+ Returns the number of tickets cancelled.
+ """
+ cancelEvent(productId: ID!, generateDiscount: Boolean): Int!
+
+ """
+ Set or remove the scanner pass code for gate control on a tokenized product.
+ Pass null to remove the pass code.
+ """
+ setEventScannerPassCode(productId: ID!, passCode: String): Product!
+
+ """
+ Authenticate gate control by validating a pass code and setting an HttpOnly cookie.
+ Returns true if the pass code is valid.
+ """
+ authenticateGate(passCode: String!): Boolean!
+
+ """
+ Deauthenticate gate control by clearing the gate pass code cookie.
+ """
+ deauthenticateGate: Boolean!
+
"""
Store user W3C Push subscription object
"""
diff --git a/packages/api/src/schema/query.ts b/packages/api/src/schema/query.ts
index 4699fd9ed8..0f146577e4 100644
--- a/packages/api/src/schema/query.ts
+++ b/packages/api/src/schema/query.ts
@@ -50,6 +50,7 @@ export default [
slugs: [String!]
includeDrafts: Boolean = false
queryString: String
+ type: ProductType
): Int! @cacheControl(maxAge: 180)
"""
@@ -65,6 +66,7 @@ export default [
offset: Int = 0
includeDrafts: Boolean = false
sort: [SortOptionInput!]
+ type: ProductType
): [Product!]!
"""
@@ -225,6 +227,33 @@ export default [
"""
tokensCount(queryString: String): Int!
+ """
+ List all ticket events (tokenized products), by default includes drafts
+ """
+ ticketEvents(
+ queryString: String
+ limit: Int = 50
+ offset: Int = 0
+ includeDrafts: Boolean = true
+ sort: [SortOptionInput!]
+ onlyInvalidateable: Boolean = false
+ ): [Product!]!
+
+ """
+ Returns total number of ticket events (tokenized products)
+ """
+ ticketEventsCount(
+ queryString: String
+ includeDrafts: Boolean = true
+ onlyInvalidateable: Boolean = false
+ ): Int!
+
+ """
+ Validates a scanner pass code for gate access. Pass code is read from the unchained_gate_passcode cookie (set via authenticateGate mutation).
+ Optionally restricted to a specific product.
+ """
+ isPassCodeValid(productId: ID): Boolean!
+
"""
Returns total number of payment providers, optionally filtered by type
"""
diff --git a/packages/api/src/schema/types/product/tokenized-product.ts b/packages/api/src/schema/types/product/tokenized-product.ts
index 6d2b7671fa..7fd6a2400a 100644
--- a/packages/api/src/schema/types/product/tokenized-product.ts
+++ b/packages/api/src/schema/types/product/tokenized-product.ts
@@ -61,6 +61,8 @@ export default [
contractConfiguration: ContractConfiguration
tokens: [Token!]!
tokensCount: Int!
+ isCanceled: Boolean
+ scannerPassCode: String @cacheControl(scope: PRIVATE, maxAge: 0)
}
`,
];
diff --git a/packages/api/src/schema/types/warehousing.ts b/packages/api/src/schema/types/warehousing.ts
index 8e21f192aa..f64af5115e 100644
--- a/packages/api/src/schema/types/warehousing.ts
+++ b/packages/api/src/schema/types/warehousing.ts
@@ -60,6 +60,7 @@ export default [
chainId: String
tokenSerialNumber: String
ercMetadata(forceLocale: Locale): JSON
+ isCanceled: Boolean
}
`,
];
diff --git a/packages/core-products/src/module/configureProductsModule.ts b/packages/core-products/src/module/configureProductsModule.ts
index f2dbc07b77..e6f4025401 100644
--- a/packages/core-products/src/module/configureProductsModule.ts
+++ b/packages/core-products/src/module/configureProductsModule.ts
@@ -34,6 +34,8 @@ export interface ProductQuery {
slugs?: string[];
tags?: string[];
skus?: string[];
+ type?: string;
+ contractStandard?: string;
bundleItemProductIds?: string[];
proxyAssignmentProductIds?: string[];
}
@@ -75,9 +77,19 @@ export const buildFindSelector = ({
skus,
bundleItemProductIds,
proxyAssignmentProductIds,
+ type,
+ contractStandard,
}: ProductQuery) => {
const selector: mongodb.Filter = productSelector ? { ...productSelector } : {};
+ if (type && !selector.type) {
+ selector.type = type as ProductType;
+ }
+
+ if (contractStandard) {
+ (selector as any)['tokenization.contractStandard'] = contractStandard;
+ }
+
if (productIds && !selector._id) {
selector._id = { $in: productIds };
}
diff --git a/packages/platform/src/setup/setupTemplates.ts b/packages/platform/src/setup/setupTemplates.ts
index a046cc31d1..21cbd29c27 100644
--- a/packages/platform/src/setup/setupTemplates.ts
+++ b/packages/platform/src/setup/setupTemplates.ts
@@ -9,6 +9,8 @@ import { resolveOrderConfirmationTemplate } from '../templates/resolveOrderConfi
import { resolveQuotationStatusTemplate } from '../templates/resolveQuotationStatusTemplate.ts';
import { resolveEnrollmentStatusTemplate } from '../templates/resolveEnrollmentStatusTemplate.ts';
import { resolveErrorReportTemplate } from '../templates/resolveErrorReportTemplate.ts';
+import { resolveEventCancelledTemplate } from '../templates/resolveEventCancelledTemplate.ts';
+import { resolveTicketCancelledTemplate } from '../templates/resolveTicketCancelledTemplate.ts';
export const MessageTypes = {
ACCOUNT_ACTION: 'ACCOUNT_ACTION',
@@ -18,6 +20,8 @@ export const MessageTypes = {
QUOTATION_STATUS: 'QUOTATION_STATUS',
ENROLLMENT_STATUS: 'ENROLLMENT_STATUS',
ERROR_REPORT: 'ERROR_REPORT',
+ EVENT_CANCELLED: 'EVENT_CANCELLED',
+ TICKET_CANCELLED: 'TICKET_CANCELLED',
} as const;
export type MessageTypes = (typeof MessageTypes)[keyof typeof MessageTypes];
@@ -30,6 +34,8 @@ export const setupTemplates = (unchainedAPI: UnchainedCore) => {
MessagingDirector.registerTemplate(MessageTypes.QUOTATION_STATUS, resolveQuotationStatusTemplate);
MessagingDirector.registerTemplate(MessageTypes.ENROLLMENT_STATUS, resolveEnrollmentStatusTemplate);
MessagingDirector.registerTemplate(MessageTypes.ERROR_REPORT, resolveErrorReportTemplate);
+ MessagingDirector.registerTemplate(MessageTypes.EVENT_CANCELLED, resolveEventCancelledTemplate);
+ MessagingDirector.registerTemplate(MessageTypes.TICKET_CANCELLED, resolveTicketCancelledTemplate);
subscribe('ORDER_CHECKOUT', async ({ payload }: RawPayloadType<{ order: Order }>) => {
const { order } = payload;
diff --git a/packages/platform/src/templates/resolveEventCancelledTemplate.ts b/packages/platform/src/templates/resolveEventCancelledTemplate.ts
new file mode 100644
index 0000000000..de43e88769
--- /dev/null
+++ b/packages/platform/src/templates/resolveEventCancelledTemplate.ts
@@ -0,0 +1,68 @@
+import type { TemplateResolver } from '@unchainedshop/core';
+
+const { EMAIL_FROM, EMAIL_WEBSITE_NAME = 'Unchained Shop', EMAIL_WEBSITE_URL } = process.env;
+
+export const resolveEventCancelledTemplate: TemplateResolver<{
+ productId: string;
+ userId: string;
+ discountCode?: string;
+ discountAmount?: number;
+}> = async ({ productId, userId, discountCode, discountAmount }, { modules }) => {
+ const user = await modules.users.findUserById(userId);
+ if (!user) return [];
+
+ const product = await modules.products.findProduct({ productId });
+ if (!product) return [];
+
+ const recipient = user.lastContact?.emailAddress || modules.users.primaryEmail(user)?.address;
+ if (!recipient) return [];
+
+ const locale = modules.users.userLocale(user);
+ const productText = await modules.products.texts.findLocalizedText({
+ productId,
+ locale,
+ });
+ const eventTitle = productText?.title || 'Event';
+
+ const slot = (product as any).tokenization?.ercMetadataProperties?.slot || product.meta?.slot;
+ const slotText = slot
+ ? new Date(slot).toLocaleString(locale.baseName, { dateStyle: 'medium', timeStyle: 'short' })
+ : '';
+
+ const location = product.meta?.location || '';
+
+ const eventDetails = [slotText, location].filter(Boolean).join(' at ');
+
+ let text = `Hello
+
+We regret to inform you that the event "${eventTitle}"${eventDetails ? ` (${eventDetails})` : ''} has been cancelled.`;
+
+ if (discountCode && discountAmount) {
+ text += `
+
+As compensation, you have received a discount code worth ${(discountAmount / 100).toFixed(2)}:
+
+ ${discountCode}
+
+You can use this code for future purchases.`;
+ }
+
+ text += `
+
+We apologize for the inconvenience.
+
+${EMAIL_WEBSITE_NAME}${EMAIL_WEBSITE_URL ? `\n${EMAIL_WEBSITE_URL}` : ''}
+`;
+
+ return [
+ {
+ type: 'EMAIL',
+ input: {
+ from: `${EMAIL_WEBSITE_NAME} <${EMAIL_FROM || 'noreply@unchained.local'}>`,
+ to: recipient,
+ subject: `${eventTitle}: Event Cancelled`,
+ text,
+ },
+ },
+ ];
+};
diff --git a/packages/platform/src/templates/resolveTicketCancelledTemplate.ts b/packages/platform/src/templates/resolveTicketCancelledTemplate.ts
new file mode 100644
index 0000000000..44ba89ebac
--- /dev/null
+++ b/packages/platform/src/templates/resolveTicketCancelledTemplate.ts
@@ -0,0 +1,71 @@
+import type { TemplateResolver } from '@unchainedshop/core';
+
+const { EMAIL_FROM, EMAIL_WEBSITE_NAME = 'Unchained Shop', EMAIL_WEBSITE_URL } = process.env;
+
+export const resolveTicketCancelledTemplate: TemplateResolver<{
+ tokenId: string;
+ userId: string;
+ discountCode?: string;
+ discountAmount?: number;
+}> = async ({ tokenId, userId, discountCode, discountAmount }, { modules }) => {
+ const user = await modules.users.findUserById(userId);
+ if (!user) return [];
+
+ const token = await modules.warehousing.findToken({ tokenId });
+ if (!token) return [];
+
+ const product = await modules.products.findProduct({ productId: token.productId });
+ if (!product) return [];
+
+ const recipient = user.lastContact?.emailAddress || modules.users.primaryEmail(user)?.address;
+ if (!recipient) return [];
+
+ const locale = modules.users.userLocale(user);
+ const productText = await modules.products.texts.findLocalizedText({
+ productId: token.productId,
+ locale,
+ });
+ const eventTitle = productText?.title || 'Event';
+
+ const slot = (product as any).tokenization?.ercMetadataProperties?.slot || product.meta?.slot;
+ const slotText = slot
+ ? new Date(slot).toLocaleString(locale.baseName, { dateStyle: 'medium', timeStyle: 'short' })
+ : '';
+
+ const location = product.meta?.location || '';
+
+ const eventDetails = [slotText, location].filter(Boolean).join(' at ');
+
+ let text = `Hello
+
+Your ticket for "${eventTitle}"${eventDetails ? ` (${eventDetails})` : ''} has been cancelled.`;
+
+ if (discountCode && discountAmount) {
+ text += `
+
+As compensation, you have received a discount code worth ${(discountAmount / 100).toFixed(2)}:
+
+ ${discountCode}
+
+You can use this code for future purchases.`;
+ }
+
+ text += `
+
+If you have any questions, please don't hesitate to contact us.
+
+${EMAIL_WEBSITE_NAME}${EMAIL_WEBSITE_URL ? `\n${EMAIL_WEBSITE_URL}` : ''}
+`;
+
+ return [
+ {
+ type: 'EMAIL',
+ input: {
+ from: `${EMAIL_WEBSITE_NAME} <${EMAIL_FROM || 'noreply@unchained.local'}>`,
+ to: recipient,
+ subject: `${eventTitle}: Ticket Cancelled`,
+ text,
+ },
+ },
+ ];
+};
diff --git a/packages/plugins/src/payment/datatrans-v2/api/types.ts b/packages/plugins/src/payment/datatrans-v2/api/types.ts
index f8dc414623..043a512aa9 100644
--- a/packages/plugins/src/payment/datatrans-v2/api/types.ts
+++ b/packages/plugins/src/payment/datatrans-v2/api/types.ts
@@ -60,18 +60,7 @@ export interface DT2015Configuration {
}
export type SupportedLanguage =
- | 'de'
- | 'en'
- | 'fr'
- | 'it'
- | 'es'
- | 'el'
- | 'no'
- | 'da'
- | 'pl'
- | 'pt'
- | 'ru'
- | 'ja';
+ 'de' | 'en' | 'fr' | 'it' | 'es' | 'el' | 'no' | 'da' | 'pl' | 'pt' | 'ru' | 'ja';
export type PaymentMethod =
| 'ACC'
diff --git a/packages/plugins/src/payment/stripe/stripe.ts b/packages/plugins/src/payment/stripe/stripe.ts
index 26ba6e2a87..05c447545d 100644
--- a/packages/plugins/src/payment/stripe/stripe.ts
+++ b/packages/plugins/src/payment/stripe/stripe.ts
@@ -14,7 +14,7 @@ if (STRIPE_SECRET) {
try {
const { default: Stripe } = await import('stripe');
stripe = new Stripe(STRIPE_SECRET, {
- apiVersion: '2026-04-22.dahlia',
+ apiVersion: '2026-06-24.dahlia',
});
} catch {
logger.warn(`optional peer npm package 'stripe' not installed, stripe adapter will not work`);
diff --git a/packages/plugins/src/pricing/discount-reimbursement-code/adapter.ts b/packages/plugins/src/pricing/discount-reimbursement-code/adapter.ts
new file mode 100644
index 0000000000..540654da58
--- /dev/null
+++ b/packages/plugins/src/pricing/discount-reimbursement-code/adapter.ts
@@ -0,0 +1,86 @@
+import {
+ OrderDiscountAdapter,
+ type OrderDiscountConfiguration,
+ type IDiscountAdapter,
+} from '@unchainedshop/core';
+
+export interface PassesModule {
+ verifyDiscountCode: (code: string) => Promise;
+ discountCodeUsageBalance: (code: string) => Promise;
+}
+
+const getPassesModule = (modules: Record): PassesModule | null => {
+ const passes = modules.passes as PassesModule | undefined;
+ if (!passes?.verifyDiscountCode || !passes?.discountCodeUsageBalance) return null;
+ return passes;
+};
+
+export const ReimbursementCode: IDiscountAdapter = {
+ ...OrderDiscountAdapter,
+
+ key: 'shop.unchained.discount.reimbursement-code',
+ label: 'Reimbursement Code',
+ version: '1.0.0',
+ orderIndex: 2,
+
+ isManualAdditionAllowed: async () => true,
+ isManualRemovalAllowed: async () => true,
+
+ actions: async ({ context }) => {
+ const passes = getPassesModule(context.modules as unknown as Record);
+
+ const discountAmount = passes ? await passes.verifyDiscountCode(context.code!) : null;
+
+ const remainingDiscount = async (): Promise => {
+ if (!passes || discountAmount === null) return 0;
+ const used = await passes.discountCodeUsageBalance(context.code!);
+ const value = (discountAmount || 0) / 100;
+ return Math.max(0, Math.round((value - used) / value));
+ };
+
+ const orderPositions = await context.modules.orders.positions.findOrderPositions({
+ orderId: context?.order?._id as string,
+ });
+
+ const totalTickets = (orderPositions || []).reduce((sum, { quantity }) => sum + quantity, 0);
+
+ return {
+ ...(await OrderDiscountAdapter.actions({ context })),
+
+ reserve: async () => {
+ const remaining = await remainingDiscount();
+ return { remainingDiscount: remaining };
+ },
+
+ isValidForSystemTriggering: async () => false,
+
+ isValidForCodeTriggering: async () => {
+ if (discountAmount === null) return false;
+
+ const remaining = await remainingDiscount();
+ const reservation = context.orderDiscount?.reservation;
+
+ if (!remaining) {
+ if (reservation) return false;
+ throw new Error('DISCOUNT_USAGE_LIMIT_EXCEEDED');
+ }
+
+ if (reservation) {
+ const reservedItems = Math.max(0, Math.min(reservation.remainingDiscount, totalTickets));
+ const currentItems = Math.max(0, Math.min(remaining, totalTickets));
+ if (currentItems < reservedItems) return false;
+ }
+
+ return true;
+ },
+
+ discountForPricingAdapterKey({ pricingAdapterKey }) {
+ if (pricingAdapterKey !== 'shop.unchained.pricing.order-discount') return null;
+ if (discountAmount === null) return null;
+ return { fixedRate: discountAmount };
+ },
+ };
+ },
+};
+
+export default ReimbursementCode;
diff --git a/packages/plugins/src/pricing/discount-reimbursement-code/index.ts b/packages/plugins/src/pricing/discount-reimbursement-code/index.ts
new file mode 100644
index 0000000000..567fcb0db8
--- /dev/null
+++ b/packages/plugins/src/pricing/discount-reimbursement-code/index.ts
@@ -0,0 +1,14 @@
+import { type IPlugin } from '@unchainedshop/core';
+import { ReimbursementCode } from './adapter.ts';
+
+export const ReimbursementCodePlugin: IPlugin = {
+ key: 'shop.unchained.discount.reimbursement-code',
+ label: 'Reimbursement Code Discount Plugin',
+ version: '1.0.0',
+
+ adapters: [ReimbursementCode],
+};
+
+export default ReimbursementCodePlugin;
+
+export { ReimbursementCode } from './adapter.ts';
diff --git a/packages/plugins/src/warehousing/eth-minter/adapter.ts b/packages/plugins/src/warehousing/eth-minter/adapter.ts
index c6a6d55e59..7c14743a72 100644
--- a/packages/plugins/src/warehousing/eth-minter/adapter.ts
+++ b/packages/plugins/src/warehousing/eth-minter/adapter.ts
@@ -14,6 +14,64 @@ import { createLogger } from '@unchainedshop/logger';
const logger = createLogger('unchained:eth-minter');
+const buildTokenMetadata = async ({
+ product,
+ token,
+ tokenSerialNumber,
+ modules,
+ locale,
+ ercMetadataProperties,
+ tokenId,
+}: {
+ product: any;
+ token: any;
+ tokenSerialNumber: string;
+ modules: any;
+ locale: any;
+ ercMetadataProperties: any;
+ tokenId?: string;
+}) => {
+ const { ROOT_URL = 'http://localhost:4010' } = process.env;
+
+ const allLanguages = await modules.languages.findLanguages({
+ includeInactive: false,
+ });
+
+ const [firstMedia] = await modules.products.media.findProductMedias({
+ productId: product._id,
+ limit: 1,
+ });
+ const file = firstMedia && (await modules.files.findFile({ fileId: firstMedia.mediaId }));
+
+ const fileAdapter = file && getFileAdapter();
+ const signedUrl = await fileAdapter?.createDownloadURL(file!);
+ const url = signedUrl && (await modules.files.normalizeUrl(signedUrl, {}));
+ const text = await modules.products.texts.findLocalizedText({
+ productId: product._id,
+ locale: locale || systemLocale,
+ });
+
+ const name = `${text.title} #${tokenSerialNumber}`;
+
+ const isDefaultLanguageActive = locale ? locale.language === systemLocale.language : true;
+ const localization = isDefaultLanguageActive
+ ? {
+ uri: `${ROOT_URL}/erc-metadata/${product._id}/{locale}/${tokenId}.json`,
+ default: systemLocale.language,
+ locales: allLanguages.map((lang) => lang.isoCode),
+ }
+ : undefined;
+
+ return {
+ name,
+ description: text.description,
+ image: url,
+ properties: ercMetadataProperties,
+ localization,
+ ...(token?.meta || {}),
+ };
+};
+
export const ETHMinter: IWarehousingAdapter = {
...WarehousingAdapter,
@@ -29,21 +87,27 @@ export const ETHMinter: IWarehousingAdapter = {
},
actions: (configuration, context) => {
- const { MINTER_TOKEN_OFFSET = '0', ROOT_URL = 'http://localhost:4010' } = process.env;
+ const { MINTER_TOKEN_OFFSET = '0' } = process.env;
const { product, orderPosition, token, modules, locale } = context as WarehousingContext &
UnchainedCore;
const { contractAddress, contractStandard, tokenId, supply, ercMetadataProperties } =
product?.tokenization || {};
- const getTokensCreated = async () => {
- const existingTokens = await modules.warehousing.findTokens(
+
+ const getTokensCreated = async ({ skipCancelled = false } = {}) => {
+ const selector: Record =
contractStandard === ProductContractStandard.ERC721
- ? { contractAddress: contractStandard }
+ ? { productId: product!._id }
: {
- contractAddress: contractStandard,
+ productId: product!._id,
tokenSerialNumber: tokenId,
- },
- );
+ };
+
+ if (skipCancelled) {
+ selector['meta.cancelled'] = { $ne: true };
+ }
+
+ const existingTokens = await modules.warehousing.findTokens(selector);
const tokensCreated = existingTokens.reduce((acc, curToken) => {
return acc + curToken.quantity;
}, 0);
@@ -68,17 +132,33 @@ export const ETHMinter: IWarehousingAdapter = {
},
stock: async () => {
- const tokensCreated = await getTokensCreated();
+ const tokensCreated = await getTokensCreated({ skipCancelled: true });
return supply ? supply - tokensCreated : 0;
},
- tokenize: async () => {
- // Upload Image to IPFS
- // Upload Metadata to IPFS
- // Prepare metadata
+ async isInvalidateable(tokenSerialNumber, referenceDate) {
+ if (token?.invalidatedDate) return false;
+
+ const slot = ercMetadataProperties?.slot;
+ if (!slot) return true;
+
+ const currentDate = new Date(referenceDate);
+ const earliestEntry = new Date(slot);
+ earliestEntry.setHours(earliestEntry.getHours() - 2);
+
+ const latestEntry = new Date(slot);
+ latestEntry.setHours(latestEntry.getHours() + 1);
+
+ return (
+ earliestEntry.getTime() < currentDate.getTime() &&
+ latestEntry.getTime() > currentDate.getTime()
+ );
+ },
+
+ tokenize: async () => {
const chainId = configuration.find(({ key }) => key === 'chainId')?.value || undefined;
- const meta = { contractStandard };
+ const meta = { contractStandard, orderId: orderPosition?.orderId };
const tokensCreated = await getTokensCreated();
if (!orderPosition) {
@@ -121,43 +201,15 @@ export const ETHMinter: IWarehousingAdapter = {
throw new Error('Product not found in context');
}
- const allLanguages = await modules.languages.findLanguages({
- includeInactive: false,
+ return buildTokenMetadata({
+ product,
+ token,
+ tokenSerialNumber,
+ modules,
+ locale,
+ ercMetadataProperties,
+ tokenId,
});
-
- const [firstMedia] = await modules.products.media.findProductMedias({
- productId: product._id,
- limit: 1,
- });
- const file = firstMedia && (await modules.files.findFile({ fileId: firstMedia.mediaId }));
-
- const fileAdapter = file && getFileAdapter();
- const signedUrl = await fileAdapter?.createDownloadURL(file!);
- const url = signedUrl && (await modules.files.normalizeUrl(signedUrl, {}));
- const text = await modules.products.texts.findLocalizedText({
- productId: product._id,
- locale: locale || systemLocale,
- });
-
- const name = `${text.title} #${tokenSerialNumber}`;
-
- const isDefaultLanguageActive = locale ? locale.language === systemLocale.language : true;
- const localization = isDefaultLanguageActive
- ? {
- uri: `${ROOT_URL}/erc-metadata/${product._id}/${locale}/${tokenId}.json`,
- default: systemLocale.language,
- locales: allLanguages.map((lang) => lang.isoCode),
- }
- : undefined;
-
- return {
- name,
- description: text.description,
- image: url,
- properties: ercMetadataProperties,
- localization,
- ...(token?.meta || {}),
- };
},
};
},
diff --git a/packages/ticketing/package.json b/packages/ticketing/package.json
index 18c9cbe118..dc78dd5dc0 100644
--- a/packages/ticketing/package.json
+++ b/packages/ticketing/package.json
@@ -5,6 +5,20 @@
"main": "lib/index.js",
"types": "lib/index.d.ts",
"type": "module",
+ "exports": {
+ ".": {
+ "import": "./lib/index.js",
+ "types": "./lib/index.d.ts"
+ },
+ "./lib/*": {
+ "import": "./lib/*",
+ "types": "./lib/*"
+ },
+ "./lib/*.js": {
+ "import": "./lib/*.js",
+ "types": "./lib/*.d.ts"
+ }
+ },
"scripts": {
"clean": "tsc -b --clean",
"build": "tsc -b",
@@ -37,6 +51,7 @@
"@unchainedshop/api": "^5.0.0-alpha.1",
"@unchainedshop/core": "^5.0.0-alpha.1",
"@unchainedshop/core-files": "^5.0.0-alpha.1",
+ "@unchainedshop/core-orders": "^5.0.0-alpha.1",
"@unchainedshop/core-warehousing": "^5.0.0-alpha.1",
"@unchainedshop/core-worker": "^5.0.0-alpha.1",
"@unchainedshop/events": "^5.0.0-alpha.1",
diff --git a/packages/ticketing/src/discount-codes.ts b/packages/ticketing/src/discount-codes.ts
new file mode 100644
index 0000000000..e6922987b3
--- /dev/null
+++ b/packages/ticketing/src/discount-codes.ts
@@ -0,0 +1,108 @@
+export interface DiscountCodeHandlers {
+ generate: (amount: number) => Promise;
+ verify: (code: string) => Promise;
+}
+
+const defaultDiscountCodeSecret = '0000000000000000000000000000000000000000000000000000000000000000';
+
+async function siphash24Digest(payload: Uint8Array, key: Uint8Array): Promise {
+ const cryptoKey = await crypto.subtle.importKey(
+ 'raw',
+ key as ArrayBufferView,
+ { name: 'HMAC', hash: 'SHA-256' },
+ false,
+ ['sign'],
+ );
+ const signature = await crypto.subtle.sign('HMAC', cryptoKey, payload as ArrayBufferView);
+ return new Uint8Array(signature).slice(0, 8);
+}
+
+function toBase58(buffer: Uint8Array): string {
+ const ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
+ let num = 0n;
+ for (const byte of buffer) {
+ num = num * 256n + BigInt(byte);
+ }
+ if (num === 0n) return ALPHABET[0];
+ let result = '';
+ while (num > 0n) {
+ result = ALPHABET[Number(num % 58n)] + result;
+ num = num / 58n;
+ }
+ return result;
+}
+
+function fromBase58(str: string): Uint8Array {
+ const ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
+ let num = 0n;
+ for (const char of str) {
+ const index = ALPHABET.indexOf(char);
+ if (index === -1) throw new Error(`Invalid base58 character: ${char}`);
+ num = num * 58n + BigInt(index);
+ }
+ const bytes: number[] = [];
+ while (num > 0n) {
+ bytes.unshift(Number(num & 0xffn));
+ num = num >> 8n;
+ }
+ return new Uint8Array(bytes);
+}
+
+export function createDefaultDiscountCodeHandlers(): DiscountCodeHandlers {
+ const secret = process.env.DISCOUNT_CODE_SECRET || defaultDiscountCodeSecret;
+ const keyBytes = new Uint8Array(secret.match(/.{1,2}/g)!.map((byte) => parseInt(byte, 16)));
+
+ const generate = async (priceAmount: number): Promise => {
+ const salt = crypto.getRandomValues(new Uint16Array(1))[0];
+ const priceCents = Math.floor(priceAmount / 100);
+ const uint16Array = new Uint16Array([priceCents, salt]);
+ const payloadBuffer = new Uint8Array(
+ uint16Array.buffer,
+ uint16Array.byteOffset,
+ uint16Array.byteLength,
+ );
+
+ const hash = await siphash24Digest(payloadBuffer, keyBytes);
+ const signature = toBase58(hash);
+ const payload = toBase58(payloadBuffer);
+
+ return signature.replace(/(.{4})(.{4})(.*)/, `${payload}-$1-$2-$3`);
+ };
+
+ const verify = async (dashedSignature: string): Promise => {
+ try {
+ const [payload] = dashedSignature.split('-');
+ const payloadBytes = fromBase58(payload);
+ // Ensure we have exactly 4 bytes for two uint16 values
+ const padded = new Uint8Array(4);
+ padded.set(payloadBytes.slice(0, 4));
+ const uint16Array = new Uint16Array(padded.buffer);
+
+ const priceCents = uint16Array[0];
+ const salt = uint16Array[1];
+
+ const priceAmount = Math.floor(priceCents * 100);
+
+ // Need to regenerate with same salt for comparison
+ const saltedUint16 = new Uint16Array([priceCents, salt]);
+ const saltedPayload = new Uint8Array(
+ saltedUint16.buffer,
+ saltedUint16.byteOffset,
+ saltedUint16.byteLength,
+ );
+ const hash = await siphash24Digest(saltedPayload, keyBytes);
+ const sig = toBase58(hash);
+ const pay = toBase58(saltedPayload);
+ const expected = sig.replace(/(.{4})(.{4})(.*)/, `${pay}-$1-$2-$3`);
+
+ if (expected === dashedSignature) {
+ return priceAmount;
+ }
+ } catch {
+ /* invalid code */
+ }
+ return null;
+ };
+
+ return { generate, verify };
+}
diff --git a/packages/ticketing/src/index.ts b/packages/ticketing/src/index.ts
index c7c18c800f..7f72b1f6f6 100644
--- a/packages/ticketing/src/index.ts
+++ b/packages/ticketing/src/index.ts
@@ -1,19 +1,26 @@
import { subscribe } from '@unchainedshop/events';
import type { RawPayloadType } from '@unchainedshop/events';
import { WorkerEventTypes, type Work } from '@unchainedshop/core-worker';
-import type { UnchainedCore } from '@unchainedshop/core';
+import { type UnchainedCore } from '@unchainedshop/core';
import { RendererTypes, registerRenderer } from './template-registry.ts';
-import ticketingModules, { type TicketingModule } from './module.ts';
+import ticketingModules, { type TicketingModule, type TicketingOptions } from './module.ts';
import setupMagicKey from './magic-key.ts';
import ticketingServices, { type TicketingServices } from './services.ts';
+import type { DiscountCodeHandlers } from './discount-codes.ts';
export type TicketingAPI = UnchainedCore & {
modules: TicketingModule;
services: TicketingServices;
};
-export type { RendererTypes, TicketingModule, TicketingServices };
+export type {
+ RendererTypes,
+ TicketingModule,
+ TicketingServices,
+ TicketingOptions,
+ DiscountCodeHandlers,
+};
export { ticketingServices, ticketingModules };
@@ -39,10 +46,10 @@ export default function setupTicketing(
createAppleWalletPass,
createGoogleWalletPass,
}: {
- renderOrderPDF: any;
- createAppleWalletPass: any;
- createGoogleWalletPass: any;
- },
+ renderOrderPDF?: any;
+ createAppleWalletPass?: any;
+ createGoogleWalletPass?: any;
+ } = {},
) {
setupPDFTickets({
renderOrderPDF,
diff --git a/packages/ticketing/src/module.ts b/packages/ticketing/src/module.ts
index e8d16507c2..a87ed84f4f 100644
--- a/packages/ticketing/src/module.ts
+++ b/packages/ticketing/src/module.ts
@@ -8,14 +8,22 @@ import type { File } from '@unchainedshop/core-files';
import { RendererTypes, getRenderer } from './template-registry.ts';
import { buildPassBinary, pushToApplePushNotificationService } from './mobile-tickets/apple-wallet.ts';
+import { type DiscountCodeHandlers, createDefaultDiscountCodeHandlers } from './discount-codes.ts';
+import { OrdersCollection, OrderStatus } from '@unchainedshop/core-orders';
export const APPLE_WALLET_PASSES_FILE_DIRECTORY = 'apple-wallet-passes';
const logger = createLogger('unchained:apple-wallet-webservice');
-const configurePasses = async ({ db }: ModuleInput>) => {
+export interface TicketingOptions {
+ discountCode?: DiscountCodeHandlers;
+}
+
+const configurePasses = async ({ db, options }: ModuleInput) => {
+ const discountCodeHandlers = options?.discountCode || createDefaultDiscountCodeHandlers();
const MediaObjects = await MediaObjectsCollection(db);
const TokenSurrogates = await TokenSurrogateCollection(db);
+ const Orders = await OrdersCollection(db);
await buildDbIndexes(MediaObjects as any, [
{ index: { path: 1, 'meta.passTypeIdentifier': 1, 'meta.serialNumber': 1 } },
@@ -220,6 +228,61 @@ const configurePasses = async ({ db }: ModuleInput>) => {
}
return TokenSurrogates.countDocuments(selector);
};
+ const discountCodeUsageBalance = async (discountCode: string): Promise => {
+ const orders = await Orders.aggregate([
+ {
+ $match: {
+ status: {
+ $in: [OrderStatus.CONFIRMED, OrderStatus.FULFILLED],
+ },
+ },
+ },
+ {
+ $lookup: {
+ from: 'order_discounts',
+ localField: 'calculation.discountId',
+ foreignField: '_id',
+ as: 'discounts',
+ },
+ },
+ {
+ $unwind: '$discounts',
+ },
+ {
+ $match: { 'discounts.code': discountCode },
+ },
+ {
+ $project: {
+ calculations: {
+ $filter: {
+ input: '$calculation',
+ as: 'calc',
+ cond: {
+ $and: [
+ { $eq: ['$$calc.category', 'DISCOUNTS'] },
+ { $eq: ['$$calc.discountId', '$discounts._id'] },
+ ],
+ },
+ },
+ },
+ },
+ },
+ ]).toArray();
+
+ return Math.round(
+ Math.abs(
+ orders.reduce((prev, { calculations }) => {
+ return (
+ prev +
+ (calculations as any[]).reduce(
+ (p: number, { amount }: { amount: number }) => p + amount / 100,
+ 0,
+ )
+ );
+ }, 0),
+ ),
+ );
+ };
return {
upsertAppleWalletPass,
@@ -233,6 +296,9 @@ const configurePasses = async ({ db }: ModuleInput>) => {
cancelTicket,
isTicketCancelled,
getTicketsCreated,
+ generateDiscountCode: discountCodeHandlers.generate,
+ verifyDiscountCode: discountCodeHandlers.verify,
+ discountCodeUsageBalance,
};
};
diff --git a/packages/ticketing/src/services.ts b/packages/ticketing/src/services.ts
index f016cb0ed7..8ae69c0177 100644
--- a/packages/ticketing/src/services.ts
+++ b/packages/ticketing/src/services.ts
@@ -1,10 +1,24 @@
+import { ProductType } from '@unchainedshop/core-products';
import type { TicketingModule } from './module.ts';
import type { Bound, UnchainedCore } from '@unchainedshop/core';
+type Modules = UnchainedCore['modules'];
+type TicketingModules = Modules & TicketingModule;
+
+interface DiscountOptions {
+ generateDiscount?: boolean;
+ countryCode?: string;
+ currencyCode?: string;
+}
+
async function cancelTicketsForProduct(
- this: TicketingModule & UnchainedCore['modules'],
+ this: Modules,
productId: string,
-): Promise {
+ options?: DiscountOptions,
+): Promise<{
+ cancelledCount: number;
+}> {
+ const { passes } = this as unknown as TicketingModules;
const tokensToCancel = await this.warehousing.findTokens({
productId,
'meta.cancelled': null,
@@ -12,24 +26,158 @@ async function cancelTicketsForProduct(
for (const token of tokensToCancel) {
await this.warehousing.invalidateToken(token._id);
- await this.passes.cancelTicket(token._id);
+ await passes.cancelTicket(token._id);
}
await this.products.update(productId, {
- $set: { 'meta.cancelled': true },
+ 'meta.cancelled': true,
+ });
+
+ const affectedUserIds = [...new Set(tokensToCancel.map((t) => t.userId).filter(Boolean))] as string[];
+
+ const discountByUser = new Map();
+
+ if (options?.generateDiscount && tokensToCancel.length > 0 && options.countryCode) {
+ const product = await this.products.findProduct({ productId });
+ const price =
+ product &&
+ (await this.products.prices.price(product, {
+ countryCode: options.countryCode,
+ currencyCode: options.currencyCode,
+ }));
+
+ if (price?.amount) {
+ const userTokenCounts = tokensToCancel.reduce(
+ (acc, token) => {
+ if (token.userId) {
+ acc[token.userId] = (acc[token.userId] || 0) + 1;
+ }
+ return acc;
+ },
+ {} as Record,
+ );
+
+ for (const [userId, quantity] of Object.entries(userTokenCounts)) {
+ const totalAmount = price.amount * quantity;
+ const discountCode = await passes.generateDiscountCode(totalAmount);
+ discountByUser.set(userId, { discountCode, amount: totalAmount });
+ }
+ }
+ }
+
+ await Promise.allSettled(
+ affectedUserIds.map(async (userId) => {
+ const discount = discountByUser.get(userId);
+ await this.worker.addWork({
+ type: 'MESSAGE',
+ input: {
+ template: 'EVENT_CANCELLED',
+ productId,
+ userId,
+ discountCode: discount?.discountCode,
+ discountAmount: discount?.amount,
+ },
+ });
+ }),
+ );
+
+ return { cancelledCount: tokensToCancel.length };
+}
+
+async function cancelTicketWithDiscount(
+ this: Modules,
+ tokenId: string,
+ options?: DiscountOptions,
+): Promise<{ token: any }> {
+ const { passes } = this as unknown as TicketingModules;
+ const token = await this.warehousing.findToken({ tokenId });
+ await this.warehousing.invalidateToken(tokenId);
+ const cancelledToken = await passes.cancelTicket(tokenId);
+
+ let discountCode: string | undefined;
+ let discountAmount: number | undefined;
+
+ if (options?.generateDiscount && cancelledToken && options.countryCode) {
+ const product = await this.products.findProduct({ productId: cancelledToken.productId });
+ const price =
+ product &&
+ (await this.products.prices.price(product, {
+ countryCode: options.countryCode,
+ currencyCode: options.currencyCode,
+ }));
+
+ if (price?.amount) {
+ discountAmount = price.amount;
+ discountCode = await passes.generateDiscountCode(discountAmount);
+ }
+ }
+
+ if (token?.userId) {
+ await this.worker.addWork({
+ type: 'MESSAGE',
+ input: {
+ template: 'TICKET_CANCELLED',
+ tokenId,
+ userId: token.userId,
+ discountCode,
+ discountAmount,
+ },
+ });
+ }
+
+ return { token: cancelledToken };
+}
+
+async function isPassCodeValid(this: Modules, passCode: string, productId?: string): Promise {
+ if (!passCode) return false;
+
+ const products = await this.products.findProducts({
+ type: ProductType.TOKENIZED_PRODUCT,
+ includeDrafts: false,
+ });
+
+ const matchingProducts = productId ? products.filter((p) => p._id === productId) : products;
+
+ return matchingProducts
+ .filter(Boolean)
+ .some(
+ (p) =>
+ (p.meta as Record)?.scannerPassCode?.toLowerCase().trim() ===
+ passCode.toLowerCase().trim(),
+ );
+}
+
+async function productIdsForPassCode(this: Modules, passCode: string): Promise {
+ if (!passCode) return [];
+
+ const products = await this.products.findProducts({
+ type: ProductType.TOKENIZED_PRODUCT,
+ includeDrafts: false,
});
- return tokensToCancel.length;
+ return products
+ .filter(
+ (p) =>
+ (p.meta as Record)?.scannerPassCode?.toLowerCase().trim() ===
+ passCode.toLowerCase().trim(),
+ )
+ .map((p) => p._id);
}
export default {
ticketing: {
cancelTicketsForProduct,
+ cancelTicketWithDiscount,
+ isPassCodeValid,
+ productIdsForPassCode,
},
};
export interface TicketingServices {
ticketing: {
cancelTicketsForProduct: Bound;
+ cancelTicketWithDiscount: Bound;
+ isPassCodeValid: Bound;
+ productIdsForPassCode: Bound;
};
}
diff --git a/tools/demo-data-cli/src/types/bulk-import.ts b/tools/demo-data-cli/src/types/bulk-import.ts
index 29501569a4..0be950f197 100644
--- a/tools/demo-data-cli/src/types/bulk-import.ts
+++ b/tools/demo-data-cli/src/types/bulk-import.ts
@@ -29,11 +29,7 @@ export interface ProductLocalizedContent extends LocalizedContent {
// Product Types
export type ProductType =
- | 'SIMPLE_PRODUCT'
- | 'CONFIGURABLE_PRODUCT'
- | 'BUNDLE_PRODUCT'
- | 'PLAN_PRODUCT'
- | 'TOKENIZED_PRODUCT';
+ 'SIMPLE_PRODUCT' | 'CONFIGURABLE_PRODUCT' | 'BUNDLE_PRODUCT' | 'PLAN_PRODUCT' | 'TOKENIZED_PRODUCT';
export interface ProductPricing {
amount: number;