diff --git a/package.json b/package.json index a3f8ac740..72ddda3b9 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "eslint-plugin-react-hooks": "^4.6.2", "only-allow": "^1.2.1", "prettier": "^3.3.3", - "prettier-plugin-tailwindcss": "^0.6.6", + "prettier-plugin-tailwindcss": "^0.6.8", "typescript": "^5.6.2" }, "engines": { diff --git a/packages/boutique/backend/package.json b/packages/boutique/backend/package.json index f66d637c6..ed9022a6a 100644 --- a/packages/boutique/backend/package.json +++ b/packages/boutique/backend/package.json @@ -17,7 +17,7 @@ "express": "^4.21.0", "helmet": "^7.1.0", "knex": "^3.1.0", - "objection": "^3.1.4", + "objection": "^3.1.5", "pg": "^8.13.0", "winston": "^3.14.2", "zod": "^3.23.8" diff --git a/packages/boutique/frontend/package.json b/packages/boutique/frontend/package.json index c977e99c6..8f7a5496a 100644 --- a/packages/boutique/frontend/package.json +++ b/packages/boutique/frontend/package.json @@ -33,13 +33,13 @@ "devDependencies": { "@tailwindcss/forms": "^0.5.9", "@tailwindcss/typography": "^0.5.15", - "@types/react": "18.3.8", + "@types/react": "18.3.10", "@types/react-dom": "18.3.0", "@vitejs/plugin-react-swc": "^3.7.0", "autoprefixer": "^10.4.20", "postcss": "^8.4.47", "tailwindcss": "^3.4.13", "typescript": "^5.6.2", - "vite": "^5.4.7" + "vite": "^5.4.8" } } diff --git a/packages/shared/backend/package.json b/packages/shared/backend/package.json index a5326f2a0..71f5a4839 100644 --- a/packages/shared/backend/package.json +++ b/packages/shared/backend/package.json @@ -24,7 +24,7 @@ "@google-cloud/logging-winston": "^6.0.0", "awilix": "^11.0.0", "express": "^4.21.0", - "objection": "^3.1.4", + "objection": "^3.1.5", "knex": "^3.1.0", "winston": "^3.14.2", "axios": "^1.7.7" diff --git a/packages/wallet/backend/package.json b/packages/wallet/backend/package.json index 66ebccc5a..9acfc2a47 100644 --- a/packages/wallet/backend/package.json +++ b/packages/wallet/backend/package.json @@ -29,7 +29,7 @@ "knex": "^3.1.0", "moment": "^2.30.1", "node-cache": "^5.1.2", - "objection": "^3.1.4", + "objection": "^3.1.5", "pg": "^8.13.0", "randexp": "^0.5.3", "socket.io": "^4.8.0", @@ -38,7 +38,7 @@ "zod": "^3.23.8" }, "devDependencies": { - "@faker-js/faker": "^9.0.2", + "@faker-js/faker": "^9.0.3", "@graphql-codegen/cli": "^5.0.2", "@graphql-codegen/typescript": "^4.0.9", "@graphql-codegen/typescript-operations": "^4.2.3", diff --git a/packages/wallet/backend/src/account/service.ts b/packages/wallet/backend/src/account/service.ts index ce1f5a589..8a34ef957 100644 --- a/packages/wallet/backend/src/account/service.ts +++ b/packages/wallet/backend/src/account/service.ts @@ -109,10 +109,12 @@ export class AccountService implements IAccountService { const accounts = await query if (!includeWalletAddress) { - accounts.forEach(async (acc) => { - const balance = await this.getAccountBalance(acc) - acc.balance = transformBalance(balance, acc.assetScale) - }) + await Promise.all( + accounts.map(async (acc) => { + const balance = await this.getAccountBalance(acc) + acc.balance = transformBalance(balance, acc.assetScale) + }) + ) } return accounts @@ -164,7 +166,7 @@ export class AccountService implements IAccountService { account.gateHubWalletId ) return Number( - balances.find((balance) => balance.vault.assetCode === account.assetCode) + balances.find((balance) => balance.vault.asset_code === account.assetCode) ?.total ?? 0 ) } diff --git a/packages/wallet/backend/src/app.ts b/packages/wallet/backend/src/app.ts index 414f0984a..5ccbb7fe6 100644 --- a/packages/wallet/backend/src/app.ts +++ b/packages/wallet/backend/src/app.ts @@ -320,7 +320,19 @@ export class App { '/cards/:cardId/limits', isAuth, cardController.createOrOverrideCardLimits + ) router.get( + '/cards/:cardId/transactions', + isAuth, + cardController.getCardTransactions + ) + router.get('/cards/:cardId/pin', isAuth, cardController.getPin) + router.post('/cards/:cardId/change-pin', isAuth, cardController.changePin) + router.put( + '/cards/:cardId/block', + isAuth, + cardController.permanentlyBlockCard ) + // Return an error for invalid routes router.use('*', (req: Request, res: CustomResponse) => { const e = Error(`Requested path ${req.path} was not found`) diff --git a/packages/wallet/backend/src/card/controller.ts b/packages/wallet/backend/src/card/controller.ts index 7495d1cfa..fb40ad7c7 100644 --- a/packages/wallet/backend/src/card/controller.ts +++ b/packages/wallet/backend/src/card/controller.ts @@ -11,6 +11,7 @@ import { ICardResponse, ICardUnlockRequest } from './types' +import { IGetTransactionsResponse } from '@wallet/shared/src' import { validate } from '@/shared/validate' import { getCardsByCustomerSchema, @@ -18,7 +19,10 @@ import { lockCardSchema, unlockCardSchema, getCardLimitsSchema, - createOrOverrideCardLimitsSchema + createOrOverrideCardLimitsSchema, + getCardTransactionsSchema, + changePinSchema, + permanentlyBlockCardSchema } from './validation' export interface ICardController { @@ -26,8 +30,12 @@ export interface ICardController { getCardDetails: Controller getCardLimits: Controller createOrOverrideCardLimits: Controller + getCardTransactions: Controller + getPin: Controller + changePin: Controller lock: Controller unlock: Controller + permanentlyBlockCard: Controller } export class CardController implements ICardController { @@ -56,9 +64,9 @@ export class CardController implements ICardController { ) => { try { const userId = req.session.user.id - const { params, body } = await validate(getCardDetailsSchema, req) + const { params, query } = await validate(getCardDetailsSchema, req) const { cardId } = params - const { publicKeyBase64 } = body + const { publicKeyBase64 } = query const requestBody: ICardDetailsRequest = { cardId, publicKeyBase64 } const cardDetails = await this.cardService.getCardDetails( @@ -71,6 +79,63 @@ export class CardController implements ICardController { } } + public getCardTransactions = async ( + req: Request, + res: Response, + next: NextFunction + ) => { + try { + const userId = req.session.user.id + const { params, query } = await validate(getCardTransactionsSchema, req) + const { cardId } = params + const { pageSize, pageNumber } = query + + const transactions = await this.cardService.getCardTransactions( + userId, + cardId, + pageSize, + pageNumber + ) + + res.status(200).json(toSuccessResponse(transactions)) + } catch (error) { + next(error) + } + } + + public getPin = async (req: Request, res: Response, next: NextFunction) => { + try { + const userId = req.session.user.id + const { params, query } = await validate(getCardDetailsSchema, req) + const { cardId } = params + const { publicKeyBase64 } = query + + const requestBody: ICardDetailsRequest = { cardId, publicKeyBase64 } + const cardPin = await this.cardService.getPin(userId, requestBody) + res.status(200).json(toSuccessResponse(cardPin)) + } catch (error) { + next(error) + } + } + + public changePin = async ( + req: Request, + res: Response, + next: NextFunction + ) => { + try { + const userId = req.session.user.id + const { params, body } = await validate(changePinSchema, req) + const { cardId } = params + const { cypher } = body + + const result = await this.cardService.changePin(userId, cardId, cypher) + res.status(201).json(toSuccessResponse(result)) + } catch (error) { + next(error) + } + } + public getCardLimits = async ( req: Request, res: Response, @@ -116,12 +181,14 @@ export class CardController implements ICardController { public lock = async (req: Request, res: Response, next: NextFunction) => { try { + const userId = req.session.user.id const { params, query, body } = await validate(lockCardSchema, req) const { cardId } = params const { reasonCode } = query const requestBody: ICardLockRequest = body const result = await this.cardService.lock( + userId, cardId, reasonCode, requestBody @@ -135,15 +202,38 @@ export class CardController implements ICardController { public unlock = async (req: Request, res: Response, next: NextFunction) => { try { + const userId = req.session.user.id const { params, body } = await validate(unlockCardSchema, req) const { cardId } = params const requestBody: ICardUnlockRequest = body - const result = await this.cardService.unlock(cardId, requestBody) + const result = await this.cardService.unlock(userId, cardId, requestBody) res.status(200).json(toSuccessResponse(result)) } catch (error) { next(error) } } + + public permanentlyBlockCard = async ( + req: Request, + res: Response, + next: NextFunction + ) => { + try { + const userId = req.session.user.id + const { params, query } = await validate(permanentlyBlockCardSchema, req) + const { cardId } = params + const { reasonCode } = query + + const result = await this.cardService.permanentlyBlockCard( + userId, + cardId, + reasonCode + ) + res.status(200).json(toSuccessResponse(result)) + } catch (error) { + next(error) + } + } } diff --git a/packages/wallet/backend/src/card/service.ts b/packages/wallet/backend/src/card/service.ts index 9c79361e1..66f1264db 100644 --- a/packages/wallet/backend/src/card/service.ts +++ b/packages/wallet/backend/src/card/service.ts @@ -9,8 +9,10 @@ import { ICardResponse, ICardUnlockRequest } from './types' +import { IGetTransactionsResponse } from '@wallet/shared/src' import { LockReasonCode } from '@wallet/shared/src' import { NotFound } from '@shared/backend' +import { BlockReasonCode } from '@wallet/shared/src' export class CardService { constructor( @@ -27,14 +29,7 @@ export class CardService { requestBody: ICardDetailsRequest ): Promise { const { cardId } = requestBody - - const walletAddress = await this.walletAddressService.getByCardId( - userId, - cardId - ) - if (!walletAddress) { - throw new NotFound('Card not found or not associated with the user.') - } + await this.ensureWalletAddressExists(userId, cardId) return this.gateHubClient.getCardDetails(requestBody) } @@ -58,21 +53,81 @@ export class CardService { return this.gateHubClient.createOrOverrideCardLimits(cardId, requestBody) } + async getCardTransactions( + userId: string, + cardId: string, + pageSize?: number, + pageNumber?: number + ): Promise { + await this.ensureWalletAddressExists(userId, cardId) + + return this.gateHubClient.getCardTransactions(cardId, pageSize, pageNumber) + } + + async getPin( + userId: string, + requestBody: ICardDetailsRequest + ): Promise { + const { cardId } = requestBody + await this.ensureWalletAddressExists(userId, cardId) + + return this.gateHubClient.getPin(requestBody) + } + + async changePin( + userId: string, + cardId: string, + cypher: string + ): Promise { + await this.ensureWalletAddressExists(userId, cardId) + + await this.gateHubClient.changePin(cardId, cypher) + } + async lock( + userId: string, cardId: string, reasonCode: LockReasonCode, requestBody: ICardLockRequest ): Promise { + await this.ensureWalletAddressExists(userId, cardId) + return this.gateHubClient.lockCard(cardId, reasonCode, requestBody) } async unlock( + userId: string, cardId: string, requestBody: ICardUnlockRequest ): Promise { + await this.ensureWalletAddressExists(userId, cardId) + return this.gateHubClient.unlockCard(cardId, requestBody) } + async permanentlyBlockCard( + userId: string, + cardId: string, + reasonCode: BlockReasonCode + ): Promise { + await this.ensureWalletAddressExists(userId, cardId) + + return this.gateHubClient.permanentlyBlockCard(cardId, reasonCode) + } + + private async ensureWalletAddressExists( + userId: string, + cardId: string + ): Promise { + const walletAddress = await this.walletAddressService.getByCardId( + userId, + cardId + ) + if (!walletAddress) { + throw new NotFound('Card not found or not associated with the user.') + } + } + private async ensureWalletAddressExists( userId: string, cardId: string diff --git a/packages/wallet/backend/src/card/validation.ts b/packages/wallet/backend/src/card/validation.ts index 2ff55cb2b..f9536711c 100644 --- a/packages/wallet/backend/src/card/validation.ts +++ b/packages/wallet/backend/src/card/validation.ts @@ -10,7 +10,7 @@ export const getCardDetailsSchema = z.object({ params: z.object({ cardId: z.string() }), - body: z.object({ + query: z.object({ publicKeyBase64: z.string() }) }) @@ -74,3 +74,42 @@ export const unlockCardSchema = z.object({ note: z.string() }) }) + +export const getCardTransactionsSchema = z.object({ + params: z.object({ + cardId: z.string() + }), + query: z.object({ + pageSize: z.coerce.number().int().positive().optional(), + pageNumber: z.coerce.number().int().nonnegative().optional() + }) +}) + +export const changePinSchema = z.object({ + params: z.object({ + cardId: z.string() + }), + body: z.object({ + cypher: z.string() + }) +}) + +export const permanentlyBlockCardSchema = z.object({ + params: z.object({ + cardId: z.string() + }), + query: z.object({ + reasonCode: z.enum([ + 'LostCard', + 'StolenCard', + 'IssuerRequestGeneral', + 'IssuerRequestFraud', + 'IssuerRequestLegal', + 'IssuerRequestIncorrectOpening', + 'CardDamagedOrNotWorking', + 'UserRequest', + 'IssuerRequestCustomerDeceased', + 'ProductDoesNotRenew' + ]) + }) +}) diff --git a/packages/wallet/backend/src/gatehub/client.ts b/packages/wallet/backend/src/gatehub/client.ts index 6435d6087..71a1a88bf 100644 --- a/packages/wallet/backend/src/gatehub/client.ts +++ b/packages/wallet/backend/src/gatehub/client.ts @@ -30,7 +30,11 @@ import { } from '@/gatehub/consts' import axios, { AxiosError } from 'axios' import { Logger } from 'winston' -import { IFRAME_TYPE, LockReasonCode } from '@wallet/shared/src' +import { + IFRAME_TYPE, + LockReasonCode, + IGetTransactionsResponse +} from '@wallet/shared/src' import { BadRequest } from '@shared/backend' import { ICardDetailsResponse, @@ -45,6 +49,7 @@ import { ICardLimitResponse, ICardLimitRequest } from '@/card/types' +import { BlockReasonCode } from '@wallet/shared/src' export class GateHubClient { private clientIds = SANDBOX_CLIENT_IDS @@ -278,14 +283,18 @@ export class GateHubClient { } async createTransaction( - body: ICreateTransactionRequest + body: ICreateTransactionRequest, + managedUserUuid?: string ): Promise { const url = `${this.apiUrl}/core/v1/transactions` const response = await this.request( 'POST', url, - JSON.stringify(body) + JSON.stringify(body), + { + managedUserUuid + } ) return response @@ -375,6 +384,93 @@ export class GateHubClient { return cardDetailsResponse } + async getCardTransactions( + cardId: string, + pageSize?: number, + pageNumber?: number + ): Promise { + let url = `${this.apiUrl}/v1/cards/${cardId}/transactions` + + const queryParams: string[] = [] + + if (pageSize !== undefined) + queryParams.push(`pageSize=${encodeURIComponent(pageSize.toString())}`) + if (pageNumber !== undefined) + queryParams.push( + `pageNumber=${encodeURIComponent(pageNumber.toString())}` + ) + + if (queryParams.length > 0) { + url += `?${queryParams.join('&')}` + } + + return this.request('GET', url) + } + + async getPin( + requestBody: ICardDetailsRequest + ): Promise { + const url = `${this.apiUrl}/token/pin` + + const response = await this.request( + 'POST', + url, + JSON.stringify(requestBody), + { + cardAppId: this.env.GATEHUB_CARD_APP_ID + } + ) + + const token = response.token + if (!token) { + throw new Error('Failed to obtain token for card pin retrieval') + } + + // TODO change this to direct call to card managing entity + // Will get this from the GateHub proxy for now + const cardPinUrl = `${this.apiUrl}/v1/proxy/client-device/pin` + const cardPinResponse = await this.request( + 'GET', + cardPinUrl, + undefined, + { + token + } + ) + + return cardPinResponse + } + + async changePin(cardId: string, cypher: string): Promise { + const url = `${this.apiUrl}/token/pin-change` + + const response = await this.request( + 'POST', + url, + JSON.stringify({ cardId: cardId }), + { + cardAppId: this.env.GATEHUB_CARD_APP_ID + } + ) + + const token = response.token + if (!token) { + throw new Error('Failed to obtain token for card pin retrieval') + } + + // TODO change this to direct call to card managing entity + // Will get this from the GateHub proxy for now + const cardPinUrl = `${this.apiUrl}/v1/proxy/client-device/pin` + await this.request( + 'POST', + cardPinUrl, + JSON.stringify({ cypher: cypher }), + { + token + } + ) + } + async getCardLimits(cardId: string): Promise { const url = `${this.apiUrl}/v1/cards/${cardId}/limits` @@ -433,6 +529,17 @@ export class GateHubClient { ) } + async permanentlyBlockCard( + cardId: string, + reasonCode: BlockReasonCode + ): Promise { + let url = `${this.apiUrl}/v1/cards/${cardId}/block` + + url += `?reasonCode=${encodeURIComponent(reasonCode)}` + + return this.request('PUT', url) + } + private async request( method: HTTP_METHODS, url: string, diff --git a/packages/wallet/backend/src/gatehub/types.ts b/packages/wallet/backend/src/gatehub/types.ts index 346536c36..471af48d3 100644 --- a/packages/wallet/backend/src/gatehub/types.ts +++ b/packages/wallet/backend/src/gatehub/types.ts @@ -95,9 +95,9 @@ export interface IWalletBalance { interface IVault { uuid: string name: string - assetCode: string - createdAt: string - updatedAt: string + asset_code: string + created_at: string + updated_at: string } export interface IConnectUserToGatewayResponse {} diff --git a/packages/wallet/backend/src/rafiki/service.ts b/packages/wallet/backend/src/rafiki/service.ts index dba597db4..dc8e78bd6 100644 --- a/packages/wallet/backend/src/rafiki/service.ts +++ b/packages/wallet/backend/src/rafiki/service.ts @@ -247,21 +247,27 @@ export class RafikiService implements IRafikiService { const walletAddress = await this.getWalletAddress(wh) const debitAmount = this.getAmountFromWebHook(wh) - const { gateHubWalletId: sendingWallet, userId } = - await this.getGateHubWalletAddress(walletAddress) + const { + gateHubWalletId: sendingWallet, + userId, + gateHubUserId + } = await this.getGateHubWalletAddress(walletAddress) if (!this.validateAmount(debitAmount, wh.type)) { return } - await this.gateHubClient.createTransaction({ - amount: this.amountToNumber(debitAmount), - vault_uuid: this.getVaultUuid(debitAmount.assetCode), - sending_address: sendingWallet, - receiving_address: this.env.GATEHUB_SETTLEMENT_WALLET_ADDRESS, - type: HOSTED_TRANSACTION_TYPE, - message: 'Transfer' - }) + await this.gateHubClient.createTransaction( + { + amount: this.amountToNumber(debitAmount), + vault_uuid: this.getVaultUuid(debitAmount.assetCode), + sending_address: sendingWallet, + receiving_address: this.env.GATEHUB_SETTLEMENT_WALLET_ADDRESS, + type: HOSTED_TRANSACTION_TYPE, + message: 'Transfer' + }, + gateHubUserId + ) if (wh.data.balance !== '0') { await this.rafikiClient.withdrawLiqudity(wh.id) @@ -365,9 +371,11 @@ export class RafikiService implements IRafikiService { } private async getGateHubWalletAddress(walletAddress: WalletAddress) { - const account = await Account.query().findById(walletAddress.accountId) + const account = await Account.query() + .findById(walletAddress.accountId) + .withGraphFetched('user') - if (!account || !account.gateHubWalletId) { + if (!account?.gateHubWalletId || !account.user?.gateHubUserId) { throw new BadRequest( 'No account associated to the provided payment pointer' ) @@ -375,7 +383,8 @@ export class RafikiService implements IRafikiService { return { userId: account.userId, - gateHubWalletId: account.gateHubWalletId + gateHubWalletId: account.gateHubWalletId, + gateHubUserId: account.user.gateHubUserId } } } diff --git a/packages/wallet/backend/tests/cards/controller.test.ts b/packages/wallet/backend/tests/cards/controller.test.ts index e8187abae..9a7d7be36 100644 --- a/packages/wallet/backend/tests/cards/controller.test.ts +++ b/packages/wallet/backend/tests/cards/controller.test.ts @@ -12,6 +12,7 @@ import { ICardLimitResponse, ICardResponse } from '@/card/types' +import { IGetTransactionsResponse } from '@wallet/shared/src' import { AwilixContainer } from 'awilix' import { Cradle } from '@/createContainer' import { createApp, TestApp } from '@/tests/app' @@ -40,10 +41,14 @@ describe('CardController', () => { const mockCardService = { getCardsByCustomer: jest.fn(), getCardDetails: jest.fn(), + getCardTransactions: jest.fn(), getCardLimits: jest.fn(), createOrOverrideCardLimits: jest.fn(), lock: jest.fn(), - unlock: jest.fn() + unlock: jest.fn(), + getPin: jest.fn(), + changePin: jest.fn(), + permanentlyBlockCard: jest.fn() } const args = mockLogInRequest().body @@ -158,7 +163,7 @@ describe('CardController', () => { it('should get card details successfully', async () => { const next = jest.fn() - req.body = { publicKeyBase64: 'test-public-key' } + req.query = { publicKeyBase64: 'test-public-key' } const mockedCardDetails: ICardDetailsResponse = { cipher: 'encrypted-card-data' @@ -185,7 +190,7 @@ describe('CardController', () => { delete req.params.cardId - await cardController.getCardsByCustomer(req, res, (err) => { + await cardController.getCardDetails(req, res, (err) => { next(err) res.status(err.statusCode).json({ success: false, @@ -204,7 +209,7 @@ describe('CardController', () => { const next = jest.fn() req.params.cardId = 'test-card-id' - req.body = {} + req.query = {} await cardController.getCardDetails(req, res, (err) => { next(err) @@ -222,6 +227,110 @@ describe('CardController', () => { }) }) + describe('getCardTransactions', () => { + it('should get card transactions successfully', async () => { + const next = jest.fn() + + const mockedTransactions: IGetTransactionsResponse = { + data: [ + { + id: 1, + transactionId: '78b34171-0a7c-4185-9fd5-7c5f366ed50b', + ghResponseCode: 'TRXNS', + cardScheme: 3, + type: 1, + createdAt: '2024-02-01T00:00:00.000Z', + txStatus: 'PROCESSING', + vaultId: 1, + cardId: 1, + refTransactionId: '', + responseCode: null, + transactionAmount: '1.1', + transactionCurrency: 'EUR', + billingAmount: '1.1', + billingCurrency: 'EUR', + terminalId: null, + wallet: 123, + transactionDateTime: '2024-02-01T00:00:00.000Z', + processDateTime: null + }, + { + id: 2, + transactionId: '545b34171-0a7c-4185-9fd5-7c5f366e4566', + ghResponseCode: 'TRXNS', + cardScheme: 3, + type: 1, + createdAt: '2024-02-01T00:00:00.000Z', + txStatus: 'PROCESSING', + vaultId: 1, + cardId: 1, + refTransactionId: '', + responseCode: null, + transactionAmount: '1.1', + transactionCurrency: 'EUR', + billingAmount: '1.1', + billingCurrency: 'EUR', + terminalId: null, + wallet: 123, + transactionDateTime: '2024-02-01T00:00:00.000Z', + processDateTime: null + } + ], + pagination: { + pageNumber: 1, + pageSize: 10, + totalRecords: 2, + totalPages: 1 + } + } + + mockCardService.getCardTransactions.mockResolvedValue(mockedTransactions) + + req.params = { cardId: 'test-card-id' } + req.query = { pageSize: '10', pageNumber: '1' } + + await cardController.getCardTransactions(req, res, next) + + expect(mockCardService.getCardTransactions).toHaveBeenCalledWith( + userId, + 'test-card-id', + 10, + 1 + ) + expect(res.statusCode).toBe(200) + expect(res._getJSONData()).toEqual({ + success: true, + message: 'SUCCESS', + result: mockedTransactions + }) + }) + it('should return 400 if page size is invalid', async () => { + const next = jest.fn() + + req.params = { cardId: 'test-card-id' } + // Invalid pageSize + req.query = { pageSize: '-1', pageNumber: '1' } + + await cardController.getCardTransactions(req, res, (err) => { + next(err) + res.status(err.statusCode).json({ + success: false, + message: err.message + }) + }) + + expect(next).toHaveBeenCalled() + const error = next.mock.calls[0][0] + expect(error).toBeInstanceOf(BadRequest) + expect(error.message).toBe('Invalid input') + expect(res.statusCode).toBe(400) + expect(res._getJSONData()).toEqual({ + success: false, + message: 'Invalid input' + }) + }) + }) + describe('getCardLimits', () => { it('should get card limits successfully', async () => { const next = jest.fn() @@ -403,6 +512,35 @@ describe('CardController', () => { }) describe('lock', () => { + it('should lock card successfully', async () => { + const next = jest.fn() + + req.params.cardId = 'test-card-id' + req.body = { note: 'Lost my card' } + req.query = { reasonCode: 'LostCard' } + + const mockResult = { status: 'locked' } + mockCardService.lock.mockResolvedValue(mockResult) + + await cardController.lock(req, res, next) + + expect(mockCardService.lock).toHaveBeenCalledWith( + userId, + 'test-card-id', + 'LostCard', + { + note: 'Lost my card' + } + ) + + expect(res.statusCode).toBe(200) + expect(res._getJSONData()).toEqual({ + success: true, + message: 'SUCCESS', + result: mockResult + }) + }) + it('should return 400 if reasonCode is missing', async () => { const next = jest.fn() @@ -485,9 +623,13 @@ describe('CardController', () => { await cardController.unlock(req, res, next) - expect(mockCardService.unlock).toHaveBeenCalledWith('test-card-id', { - note: 'Found my card' - }) + expect(mockCardService.unlock).toHaveBeenCalledWith( + userId, + 'test-card-id', + { + note: 'Found my card' + } + ) expect(res.statusCode).toBe(200) expect(res._getJSONData()).toEqual({ @@ -519,4 +661,188 @@ describe('CardController', () => { }) }) }) + + describe('getPin', () => { + it('should get pin successfully', async () => { + const next = jest.fn() + + req.query = { publicKeyBase64: 'test-public-key' } + + const mockedCardDetails: ICardDetailsResponse = { + cipher: 'encrypted-card-pin' + } + + mockCardService.getPin.mockResolvedValue(mockedCardDetails) + + await cardController.getPin(req, res, next) + + expect(mockCardService.getPin).toHaveBeenCalledWith(userId, { + cardId: 'test-card-id', + publicKeyBase64: 'test-public-key' + }) + expect(res.statusCode).toBe(200) + expect(res._getJSONData()).toEqual({ + success: true, + message: 'SUCCESS', + result: mockedCardDetails + }) + }) + + it('should return 400 if cardId is missing', async () => { + const next = jest.fn() + + delete req.params.cardId + + await cardController.getPin(req, res, (err) => { + next(err) + res.status(err.statusCode).json({ + success: false, + message: err.message + }) + }) + + expect(next).toHaveBeenCalled() + const error = next.mock.calls[0][0] + expect(error).toBeInstanceOf(BadRequest) + expect(error.message).toBe('Invalid input') + expect(res.statusCode).toBe(400) + }) + + it('should return 400 if publicKeyBase64 is missing', async () => { + const next = jest.fn() + + req.params.cardId = 'test-card-id' + req.query = {} + + await cardController.getPin(req, res, (err) => { + next(err) + res.status(err.statusCode).json({ + success: false, + message: err.message + }) + }) + + expect(next).toHaveBeenCalled() + const error = next.mock.calls[0][0] + expect(error).toBeInstanceOf(BadRequest) + expect(error.message).toBe('Invalid input') + expect(res.statusCode).toBe(400) + }) + }) + + describe('changePin', () => { + it('should change pin successfully', async () => { + const next = jest.fn() + req.params.cardId = 'test-card-id' + req.body = { + cypher: 'test-cypher' + } + + mockCardService.changePin.mockResolvedValue({}) + + await cardController.changePin(req, res, next) + + expect(mockCardService.changePin).toHaveBeenCalledWith( + userId, + 'test-card-id', + 'test-cypher' + ) + expect(res.statusCode).toBe(201) + expect(res._getJSONData()).toEqual({ + success: true, + message: 'SUCCESS', + result: {} + }) + }) + + it('should return 400 if cardId is missing', async () => { + const next = jest.fn() + + delete req.params.cardId + + await cardController.changePin(req, res, (err) => { + next(err) + res.status(err.statusCode).json({ + success: false, + message: err.message + }) + }) + + expect(next).toHaveBeenCalled() + const error = next.mock.calls[0][0] + expect(error).toBeInstanceOf(BadRequest) + expect(error.message).toBe('Invalid input') + expect(res.statusCode).toBe(400) + }) + + it('should return 400 if cypher is missing', async () => { + const next = jest.fn() + + req.params.cardId = 'test-card-id' + req.body = {} + + await cardController.changePin(req, res, (err) => { + next(err) + res.status(err.statusCode).json({ + success: false, + message: err.message + }) + }) + + expect(next).toHaveBeenCalled() + const error = next.mock.calls[0][0] + expect(error).toBeInstanceOf(BadRequest) + expect(error.message).toBe('Invalid input') + expect(res.statusCode).toBe(400) + }) + }) + + describe('permanentlyBlockCard', () => { + it('should get block card successfully', async () => { + const next = jest.fn() + + mockCardService.permanentlyBlockCard.mockResolvedValue({}) + + req.params = { cardId: 'test-card-id' } + req.query = { reasonCode: 'StolenCard' } + + await cardController.permanentlyBlockCard(req, res, next) + + expect(mockCardService.permanentlyBlockCard).toHaveBeenCalledWith( + userId, + 'test-card-id', + 'StolenCard' + ) + expect(res.statusCode).toBe(200) + expect(res._getJSONData()).toEqual({ + success: true, + message: 'SUCCESS', + result: {} + }) + }) + it('should return 400 if reasonCode is invalid', async () => { + const next = jest.fn() + + req.params = { cardId: 'test-card-id' } + req.query = { reasonCode: 'InvalidCode' } + + await cardController.permanentlyBlockCard(req, res, (err) => { + next(err) + res.status(err.statusCode).json({ + success: false, + message: err.message + }) + }) + + expect(next).toHaveBeenCalled() + const error = next.mock.calls[0][0] + expect(error).toBeInstanceOf(BadRequest) + expect(error.message).toBe('Invalid input') + expect(res.statusCode).toBe(400) + expect(res._getJSONData()).toEqual({ + success: false, + message: 'Invalid input' + }) + }) + }) }) diff --git a/packages/wallet/frontend/package.json b/packages/wallet/frontend/package.json index b845bc12f..95da8f2eb 100644 --- a/packages/wallet/frontend/package.json +++ b/packages/wallet/frontend/package.json @@ -35,7 +35,7 @@ "@tailwindcss/forms": "^0.5.9", "@types/node": "^20.12.11", "@types/nprogress": "^0.2.3", - "@types/react": "18.3.8", + "@types/react": "18.3.10", "@types/react-dom": "18.3.0", "autoprefixer": "^10.4.20", "postcss": "^8.4.47", diff --git a/packages/wallet/shared/src/types/card.ts b/packages/wallet/shared/src/types/card.ts index 71f0433ee..2b43aaeff 100644 --- a/packages/wallet/shared/src/types/card.ts +++ b/packages/wallet/shared/src/types/card.ts @@ -6,6 +6,53 @@ export type LockReasonCode = | 'IssuerRequestFraud' | 'IssuerRequestLegal' +export type BlockReasonCode = + | 'LostCard' + | 'StolenCard' + | 'IssuerRequestGeneral' + | 'IssuerRequestFraud' + | 'IssuerRequestLegal' + | 'IssuerRequestIncorrectOpening' + | 'CardDamagedOrNotWorking' + | 'UserRequest' + | 'IssuerRequestCustomerDeceased' + | 'ProductDoesNotRenew' + +// Response for fetching card transactions +export interface ITransaction { + id: number + transactionId: string + ghResponseCode: string + cardScheme: number + type: number + createdAt: string + txStatus: string + vaultId: number + cardId: number + refTransactionId: string + responseCode: string | null + transactionAmount: string + transactionCurrency: string + billingAmount: string + billingCurrency: string + terminalId: string | null + wallet: number + transactionDateTime: string + processDateTime: string | null +} + +export interface IPagination { + pageNumber: number + pageSize: number + totalPages: number + totalRecords: number +} + +export interface IGetTransactionsResponse { + data: ITransaction[] + pagination: IPagination +} + export type CardLimitType = | 'perTransaction' | 'dailyOverall' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 15c3425bd..a7d63247d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,8 +36,8 @@ importers: specifier: ^3.3.3 version: 3.3.3 prettier-plugin-tailwindcss: - specifier: ^0.6.6 - version: 0.6.6(prettier@3.3.3) + specifier: ^0.6.8 + version: 0.6.8(prettier@3.3.3) typescript: specifier: ^5.6.2 version: 5.6.2 @@ -75,8 +75,8 @@ importers: specifier: ^3.1.0 version: 3.1.0(pg@8.13.0) objection: - specifier: ^3.1.4 - version: 3.1.4(knex@3.1.0) + specifier: ^3.1.5 + version: 3.1.5(knex@3.1.0) pg: specifier: ^8.13.0 version: 8.13.0 @@ -125,25 +125,25 @@ importers: version: 3.9.0(react-hook-form@7.53.0(react@18.3.1)) '@radix-ui/react-dialog': specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-dropdown-menu': specifier: ^2.1.1 - version: 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-label': specifier: ^2.1.0 - version: 2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-popover': specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': specifier: ^1.1.0 - version: 1.1.0(@types/react@18.3.8)(react@18.3.1) + version: 1.1.0(@types/react@18.3.10)(react@18.3.1) '@radix-ui/react-tabs': specifier: ^1.1.0 - version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-toast': specifier: ^1.2.1 - version: 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-query': specifier: ^5.56.2 version: 5.56.2(react@18.3.1) @@ -176,7 +176,7 @@ importers: version: 1.0.7(tailwindcss@3.4.13) valtio: specifier: ^2.0.0 - version: 2.0.0(@types/react@18.3.8)(react@18.3.1) + version: 2.0.0(@types/react@18.3.10)(react@18.3.1) zod: specifier: ^3.23.8 version: 3.23.8 @@ -188,14 +188,14 @@ importers: specifier: ^0.5.15 version: 0.5.15(tailwindcss@3.4.13) '@types/react': - specifier: 18.3.8 - version: 18.3.8 + specifier: 18.3.10 + version: 18.3.10 '@types/react-dom': specifier: 18.3.0 version: 18.3.0 '@vitejs/plugin-react-swc': specifier: ^3.7.0 - version: 3.7.0(@swc/helpers@0.5.5)(vite@5.4.7(@types/node@22.5.5)) + version: 3.7.0(@swc/helpers@0.5.5)(vite@5.4.8(@types/node@22.5.5)) autoprefixer: specifier: ^10.4.20 version: 10.4.20(postcss@8.4.47) @@ -209,8 +209,8 @@ importers: specifier: ^5.6.2 version: 5.6.2 vite: - specifier: ^5.4.7 - version: 5.4.7(@types/node@22.5.5) + specifier: ^5.4.8 + version: 5.4.8(@types/node@22.5.5) packages/boutique/shared: dependencies: @@ -240,8 +240,8 @@ importers: specifier: ^3.1.0 version: 3.1.0(pg@8.13.0) objection: - specifier: ^3.1.4 - version: 3.1.4(knex@3.1.0) + specifier: ^3.1.5 + version: 3.1.5(knex@3.1.0) winston: specifier: ^3.14.2 version: 3.14.2 @@ -328,8 +328,8 @@ importers: specifier: ^5.1.2 version: 5.1.2 objection: - specifier: ^3.1.4 - version: 3.1.4(knex@3.1.0) + specifier: ^3.1.5 + version: 3.1.5(knex@3.1.0) pg: specifier: ^8.13.0 version: 8.13.0 @@ -350,8 +350,8 @@ importers: version: 3.23.8 devDependencies: '@faker-js/faker': - specifier: ^9.0.2 - version: 9.0.2 + specifier: ^9.0.3 + version: 9.0.3 '@graphql-codegen/cli': specifier: ^5.0.2 version: 5.0.2(@types/node@20.14.15)(graphql@16.9.0)(typescript@5.6.2) @@ -408,10 +408,10 @@ importers: version: 3.9.0(react-hook-form@7.53.0(react@18.3.1)) '@radix-ui/react-toast': specifier: ^1.2.1 - version: 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-tooltip': specifier: ^1.1.2 - version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@wallet/shared': specifier: workspace:* version: link:../shared @@ -441,10 +441,10 @@ importers: version: 7.53.0(react@18.3.1) react-joyride: specifier: ^2.9.2 - version: 2.9.2(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 2.9.2(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-select: specifier: ^5.8.1 - version: 5.8.1(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 5.8.1(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) sharp: specifier: ^0.33.5 version: 0.33.5 @@ -459,7 +459,7 @@ importers: version: 1.0.7(tailwindcss@3.4.13) valtio: specifier: ^2.0.0 - version: 2.0.0(@types/react@18.3.8)(react@18.3.1) + version: 2.0.0(@types/react@18.3.10)(react@18.3.1) zod: specifier: ^3.23.8 version: 3.23.8 @@ -480,8 +480,8 @@ importers: specifier: ^0.2.3 version: 0.2.3 '@types/react': - specifier: 18.3.8 - version: 18.3.8 + specifier: 18.3.10 + version: 18.3.10 '@types/react-dom': specifier: 18.3.0 version: 18.3.0 @@ -1071,8 +1071,8 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@faker-js/faker@9.0.2': - resolution: {integrity: sha512-nI/FP30ZGXb+UaR7yXawVTH40NVKXPIx0tA3GKjkKLjorqBoMAeq4iSEacl8mJmpVhOCDa0vYHwYDmOOcFMrYw==} + '@faker-js/faker@9.0.3': + resolution: {integrity: sha512-lWrrK4QNlFSU+13PL9jMbMKLJYXDFu3tQfayBsMXX7KL/GiQeqfB1CzHkqD5UHBUtPAuPo6XwGbMFNdVMZObRA==} engines: {node: '>=18.0.0', npm: '>=9.0.0'} '@fastify/busboy@2.1.1': @@ -2434,8 +2434,8 @@ packages: '@types/react-transition-group@4.4.11': resolution: {integrity: sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==} - '@types/react@18.3.8': - resolution: {integrity: sha512-syBUrW3/XpnW4WJ41Pft+I+aPoDVbrBVQGEnbD7NijDGlVC+8gV/XKRY+7vMDlfPpbwYt0l1vd/Sj8bJGMbs9Q==} + '@types/react@18.3.10': + resolution: {integrity: sha512-02sAAlBnP39JgXwkAq3PeU9DVaaGpZyF3MGcC0MKgQVkZor5IiiDAipVaxQHtDJAmO4GIy/rVBy/LzVj76Cyqg==} '@types/request@2.48.12': resolution: {integrity: sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==} @@ -4851,8 +4851,8 @@ packages: resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} - objection@3.1.4: - resolution: {integrity: sha512-BI1YQ18JicfoODgCdKxmw4W8f24/e9hCEQpOTux0xmyd8hOidOzDd1WopOMxqxo7FA+Jfw8XTfZIUaqDnS7r0g==} + objection@3.1.5: + resolution: {integrity: sha512-Hx/ipAwXSuRBbOMWFKtRsAN0yITafqXtWB4OT4Z9wED7ty1h7bOnBdhLtcNus23GwLJqcMsRWdodL2p5GwlnfQ==} engines: {node: '>=14.0.0'} peerDependencies: knex: '>=1.0.1' @@ -5152,8 +5152,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-plugin-tailwindcss@0.6.6: - resolution: {integrity: sha512-OPva5S7WAsPLEsOuOWXATi13QrCKACCiIonFgIR6V4lYv4QLp++UXVhZSzRbZxXGimkQtQT86CC6fQqTOybGng==} + prettier-plugin-tailwindcss@0.6.8: + resolution: {integrity: sha512-dGu3kdm7SXPkiW4nzeWKCl3uoImdd5CTZEJGxyypEPL37Wj0HT2pLqjrvSei1nTeuQfO4PUfjeW5cTUNRLZ4sA==} engines: {node: '>=14.21.3'} peerDependencies: '@ianvs/prettier-plugin-sort-imports': '*' @@ -6203,8 +6203,8 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vite@5.4.7: - resolution: {integrity: sha512-5l2zxqMEPVENgvzTuBpHer2awaetimj2BGkhBPdnwKbPNOlHsODU+oiazEZzLK7KhAnOrO+XGYJYn4ZlUhDtDQ==} + vite@5.4.8: + resolution: {integrity: sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -6896,7 +6896,7 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.13.0(@types/react@18.3.8)(react@18.3.1)': + '@emotion/react@11.13.0(@types/react@18.3.10)(react@18.3.1)': dependencies: '@babel/runtime': 7.25.0 '@emotion/babel-plugin': 11.12.0 @@ -6908,7 +6908,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 transitivePeerDependencies: - supports-color @@ -7024,7 +7024,7 @@ snapshots: '@eslint/js@8.57.1': {} - '@faker-js/faker@9.0.2': {} + '@faker-js/faker@9.0.3': {} '@fastify/busboy@2.1.1': {} @@ -7994,351 +7994,351 @@ snapshots: '@radix-ui/primitive@1.1.0': {} - '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.8)(react@18.3.1)': + '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 - '@radix-ui/react-context@1.1.0(@types/react@18.3.8)(react@18.3.1)': + '@radix-ui/react-context@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 - '@radix-ui/react-dialog@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dialog@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.10)(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.7(@types/react@18.3.8)(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.10)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-direction@1.1.0(@types/react@18.3.8)(react@18.3.1)': + '@radix-ui/react-direction@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 - '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.8)(react@18.3.1)': + '@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 - '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-id@1.1.0(@types/react@18.3.8)(react@18.3.1)': + '@radix-ui/react-id@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 - '@radix-ui/react-label@2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-label@2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.7(@types/react@18.3.8)(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.10)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-popover@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-popover@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.10)(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.7(@types/react@18.3.8)(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.10)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.10)(react@18.3.1) '@radix-ui/rect': 1.1.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-slot@1.1.0(@types/react@18.3.8)(react@18.3.1)': + '@radix-ui/react-slot@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 - '@radix-ui/react-tabs@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-tabs@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-toast@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-toast@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-tooltip@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-tooltip@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.8)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.10)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 - '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.8)(react@18.3.1)': + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 - '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.8)(react@18.3.1)': + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 - '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.8)(react@18.3.1)': + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 - '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.8)(react@18.3.1)': + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 - '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.8)(react@18.3.1)': + '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: '@radix-ui/rect': 1.1.0 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 - '@radix-ui/react-use-size@1.1.0(@types/react@18.3.8)(react@18.3.1)': + '@radix-ui/react-use-size@1.1.0(@types/react@18.3.10)(react@18.3.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.8)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.10)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 - '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 '@types/react-dom': 18.3.0 '@radix-ui/rect@1.1.0': {} @@ -8680,13 +8680,13 @@ snapshots: '@types/react-dom@18.3.0': dependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 '@types/react-transition-group@4.4.11': dependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 - '@types/react@18.3.8': + '@types/react@18.3.10': dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 @@ -8823,10 +8823,10 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react-swc@3.7.0(@swc/helpers@0.5.5)(vite@5.4.7(@types/node@22.5.5))': + '@vitejs/plugin-react-swc@3.7.0(@swc/helpers@0.5.5)(vite@5.4.8(@types/node@22.5.5))': dependencies: '@swc/core': 1.7.10(@swc/helpers@0.5.5) - vite: 5.4.7(@types/node@22.5.5) + vite: 5.4.8(@types/node@22.5.5) transitivePeerDependencies: - '@swc/helpers' @@ -11641,7 +11641,7 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 - objection@3.1.4(knex@3.1.0): + objection@3.1.5(knex@3.1.0): dependencies: ajv: 8.17.1 ajv-formats: 2.1.1(ajv@8.17.1) @@ -11947,7 +11947,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-tailwindcss@0.6.6(prettier@3.3.3): + prettier-plugin-tailwindcss@0.6.8(prettier@3.3.3): dependencies: prettier: 3.3.3 @@ -12087,16 +12087,16 @@ snapshots: dependencies: react: 18.3.1 - react-innertext@1.1.5(@types/react@18.3.8)(react@18.3.1): + react-innertext@1.1.5(@types/react@18.3.10)(react@18.3.1): dependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 react: 18.3.1 react-is@16.13.1: {} react-is@18.3.1: {} - react-joyride@2.9.2(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-joyride@2.9.2(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@gilbarbara/deep-equal': 0.3.1 deep-diff: 1.0.2 @@ -12105,7 +12105,7 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-floater: 0.7.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-innertext: 1.1.5(@types/react@18.3.8)(react@18.3.1) + react-innertext: 1.1.5(@types/react@18.3.10)(react@18.3.1) react-is: 16.13.1 scroll: 3.0.1 scrollparent: 2.1.0 @@ -12114,24 +12114,24 @@ snapshots: transitivePeerDependencies: - '@types/react' - react-remove-scroll-bar@2.3.6(@types/react@18.3.8)(react@18.3.1): + react-remove-scroll-bar@2.3.6(@types/react@18.3.10)(react@18.3.1): dependencies: react: 18.3.1 - react-style-singleton: 2.2.1(@types/react@18.3.8)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.10)(react@18.3.1) tslib: 2.6.3 optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 - react-remove-scroll@2.5.7(@types/react@18.3.8)(react@18.3.1): + react-remove-scroll@2.5.7(@types/react@18.3.10)(react@18.3.1): dependencies: react: 18.3.1 - react-remove-scroll-bar: 2.3.6(@types/react@18.3.8)(react@18.3.1) - react-style-singleton: 2.2.1(@types/react@18.3.8)(react@18.3.1) + react-remove-scroll-bar: 2.3.6(@types/react@18.3.10)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.10)(react@18.3.1) tslib: 2.6.3 - use-callback-ref: 1.3.2(@types/react@18.3.8)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.3.8)(react@18.3.1) + use-callback-ref: 1.3.2(@types/react@18.3.10)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.10)(react@18.3.1) optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 react-router-dom@6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -12145,11 +12145,11 @@ snapshots: '@remix-run/router': 1.19.2 react: 18.3.1 - react-select@5.8.1(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-select@5.8.1(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.25.0 '@emotion/cache': 11.13.1 - '@emotion/react': 11.13.0(@types/react@18.3.8)(react@18.3.1) + '@emotion/react': 11.13.0(@types/react@18.3.10)(react@18.3.1) '@floating-ui/dom': 1.6.10 '@types/react-transition-group': 4.4.11 memoize-one: 6.0.0 @@ -12157,19 +12157,19 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.8)(react@18.3.1) + use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.10)(react@18.3.1) transitivePeerDependencies: - '@types/react' - supports-color - react-style-singleton@2.2.1(@types/react@18.3.8)(react@18.3.1): + react-style-singleton@2.2.1(@types/react@18.3.10)(react@18.3.1): dependencies: get-nonce: 1.0.1 invariant: 2.2.4 react: 18.3.1 tslib: 2.6.3 optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -13059,26 +13059,26 @@ snapshots: urlpattern-polyfill@8.0.2: {} - use-callback-ref@1.3.2(@types/react@18.3.8)(react@18.3.1): + use-callback-ref@1.3.2(@types/react@18.3.10)(react@18.3.1): dependencies: react: 18.3.1 tslib: 2.6.3 optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 - use-isomorphic-layout-effect@1.1.2(@types/react@18.3.8)(react@18.3.1): + use-isomorphic-layout-effect@1.1.2(@types/react@18.3.10)(react@18.3.1): dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 - use-sidecar@1.1.2(@types/react@18.3.8)(react@18.3.1): + use-sidecar@1.1.2(@types/react@18.3.10)(react@18.3.1): dependencies: detect-node-es: 1.1.0 react: 18.3.1 tslib: 2.6.3 optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 util-deprecate@1.0.2: {} @@ -13096,18 +13096,18 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - valtio@2.0.0(@types/react@18.3.8)(react@18.3.1): + valtio@2.0.0(@types/react@18.3.10)(react@18.3.1): dependencies: proxy-compare: 3.0.0 optionalDependencies: - '@types/react': 18.3.8 + '@types/react': 18.3.10 react: 18.3.1 value-or-promise@1.0.12: {} vary@1.1.2: {} - vite@5.4.7(@types/node@22.5.5): + vite@5.4.8(@types/node@22.5.5): dependencies: esbuild: 0.21.5 postcss: 8.4.47