From 97d106458151137d0fb3970f98f275b517fed1a7 Mon Sep 17 00:00:00 2001 From: Arun-kushwaha007 Date: Fri, 20 Mar 2026 00:19:28 +0530 Subject: [PATCH 1/3] fix(backend): tolerate missing Redis during local startup --- apps/backend/src/jobs/jobs-queue.service.ts | 161 ++++++++++++++---- apps/backend/src/jobs/jobs-worker.service.ts | 28 +++ .../notifications/notifications.service.ts | 113 ++++++++---- apps/backend/src/redis/redis.service.ts | 60 +++++-- 4 files changed, 275 insertions(+), 87 deletions(-) diff --git a/apps/backend/src/jobs/jobs-queue.service.ts b/apps/backend/src/jobs/jobs-queue.service.ts index d6d7f62..d9dff3d 100644 --- a/apps/backend/src/jobs/jobs-queue.service.ts +++ b/apps/backend/src/jobs/jobs-queue.service.ts @@ -1,5 +1,6 @@ -import { Injectable, Logger } from '@nestjs/common'; +import { Injectable, Logger, OnModuleDestroy } from '@nestjs/common'; import { Queue } from 'bullmq'; +import Redis from 'ioredis'; import { AppConfigService } from '../config/app-config.service'; import { NOTIFICATION_QUEUE, PAYMENT_WEBHOOKS_QUEUE, RECEIPT_PROCESSING_QUEUE } from './jobs.constants'; @@ -8,15 +9,115 @@ const RETRY_DELAY_MS = 250; const MAX_RETRY_DELAY_MS = 1000; @Injectable() -export class JobsQueueService { +export class JobsQueueService implements OnModuleDestroy { private readonly logger = new Logger(JobsQueueService.name); - private readonly notificationQueue: Queue; - private readonly receiptQueue: Queue; - private readonly paymentWebhookQueue: Queue; + private readonly config: AppConfigService; + private notificationQueue: Queue | null = null; + private receiptQueue: Queue | null = null; + private paymentWebhookQueue: Queue | null = null; + private redisAvailable: boolean | null = null; constructor(config: AppConfigService) { + this.config = config; + } + + async enqueueNotification(payload: { + userIds: string[]; + payload: { + type: 'expense_created' | 'expense_deleted' | 'settlement_created' | 'group_invite'; + title: string; + body: string; + data?: Record; + }; + }): Promise { + const queue = await this.getNotificationQueue(); + if (!queue) { + return; + } + + try { + await queue.add('send', payload, { + attempts: 3, + backoff: { type: 'exponential', delay: 500 }, + removeOnComplete: true, + removeOnFail: 100, + }); + } catch (error) { + this.logger.warn(`Notification queue unavailable: ${error instanceof Error ? error.message : 'unknown error'}`); + } + } + + async enqueueReceiptProcessing(payload: { receiptId: string; expenseId: string }): Promise { + const queue = await this.getReceiptQueue(); + if (!queue) { + return; + } + + try { + await queue.add('process', payload, { + attempts: 3, + removeOnComplete: true, + removeOnFail: 100, + }); + } catch (error) { + this.logger.warn(`Receipt queue unavailable: ${error instanceof Error ? error.message : 'unknown error'}`); + } + } + + async enqueuePaymentWebhook(payload: { signature?: string; body: Record }): Promise { + const queue = await this.getPaymentWebhookQueue(); + if (!queue) { + return; + } + + try { + await queue.add('handle', payload, { + attempts: 5, + backoff: { type: 'exponential', delay: 1000 }, + removeOnComplete: true, + removeOnFail: 100, + }); + } catch (error) { + this.logger.warn(`Payment webhook queue unavailable: ${error instanceof Error ? error.message : 'unknown error'}`); + } + } + + async onModuleDestroy(): Promise { + await Promise.allSettled( + [this.notificationQueue, this.receiptQueue, this.paymentWebhookQueue] + .filter((queue): queue is Queue => Boolean(queue)) + .map((queue) => queue.close()), + ); + } + + private async getNotificationQueue(): Promise { + const ready = await this.ensureQueues(); + return ready ? this.notificationQueue : null; + } + + private async getReceiptQueue(): Promise { + const ready = await this.ensureQueues(); + return ready ? this.receiptQueue : null; + } + + private async getPaymentWebhookQueue(): Promise { + const ready = await this.ensureQueues(); + return ready ? this.paymentWebhookQueue : null; + } + + private async ensureQueues(): Promise { + if (this.redisAvailable !== null) { + return this.redisAvailable; + } + + this.redisAvailable = await this.canReachRedis(); + if (!this.redisAvailable) { + this.logger.warn('Redis unavailable, BullMQ queue producers disabled for local startup'); + return false; + } + const connection = { - url: config.redisUrl, + url: this.config.redisUrl, lazyConnect: true, maxRetriesPerRequest: null, enableOfflineQueue: false, @@ -34,39 +135,27 @@ export class JobsQueueService { this.notificationQueue = new Queue(NOTIFICATION_QUEUE, { connection }); this.receiptQueue = new Queue(RECEIPT_PROCESSING_QUEUE, { connection }); this.paymentWebhookQueue = new Queue(PAYMENT_WEBHOOKS_QUEUE, { connection }); + return true; } - async enqueueNotification(payload: { - userIds: string[]; - payload: { - type: 'expense_created' | 'expense_deleted' | 'settlement_created' | 'group_invite'; - title: string; - body: string; - data?: Record; - }; - }): Promise { - await this.notificationQueue.add('send', payload, { - attempts: 3, - backoff: { type: 'exponential', delay: 500 }, - removeOnComplete: true, - removeOnFail: 100, - }); - } - - async enqueueReceiptProcessing(payload: { receiptId: string; expenseId: string }): Promise { - await this.receiptQueue.add('process', payload, { - attempts: 3, - removeOnComplete: true, - removeOnFail: 100, + private async canReachRedis(): Promise { + const probe = new Redis(this.config.redisUrl, { + lazyConnect: true, + maxRetriesPerRequest: 1, + enableOfflineQueue: false, + connectTimeout: 750, + retryStrategy: () => null, }); - } - async enqueuePaymentWebhook(payload: { signature?: string; body: Record }): Promise { - await this.paymentWebhookQueue.add('handle', payload, { - attempts: 5, - backoff: { type: 'exponential', delay: 1000 }, - removeOnComplete: true, - removeOnFail: 100, - }); + try { + await probe.connect(); + await probe.ping(); + await probe.quit(); + return true; + } catch (error) { + this.logger.warn(`Redis queue probe failed: ${error instanceof Error ? error.message : 'unknown error'}`); + probe.disconnect(); + return false; + } } } diff --git a/apps/backend/src/jobs/jobs-worker.service.ts b/apps/backend/src/jobs/jobs-worker.service.ts index bc6d797..22cbd6e 100644 --- a/apps/backend/src/jobs/jobs-worker.service.ts +++ b/apps/backend/src/jobs/jobs-worker.service.ts @@ -1,5 +1,6 @@ import { forwardRef, Inject, Injectable, Logger, OnModuleDestroy, OnModuleInit } from '@nestjs/common'; import { Worker } from 'bullmq'; +import Redis from 'ioredis'; import { AppConfigService } from '../config/app-config.service'; import { NotificationsService } from '../notifications/notifications.service'; import { PaymentsService } from '../payments/payments.service'; @@ -22,6 +23,12 @@ export class JobsWorkerService implements OnModuleInit, OnModuleDestroy { ) {} async onModuleInit(): Promise { + const redisAvailable = await this.canReachRedis(); + if (!redisAvailable) { + this.logger.warn('Redis unavailable, BullMQ workers disabled for local startup'); + return; + } + const connection = { url: this.config.redisUrl, lazyConnect: true, @@ -76,4 +83,25 @@ export class JobsWorkerService implements OnModuleInit, OnModuleDestroy { async onModuleDestroy(): Promise { await Promise.all(this.workers.map((worker) => worker.close())); } + + private async canReachRedis(): Promise { + const probe = new Redis(this.config.redisUrl, { + lazyConnect: true, + maxRetriesPerRequest: 1, + enableOfflineQueue: false, + connectTimeout: 750, + retryStrategy: () => null, + }); + + try { + await probe.connect(); + await probe.ping(); + await probe.quit(); + return true; + } catch (error) { + this.logger.warn(`Redis probe failed: ${error instanceof Error ? error.message : 'unknown error'}`); + probe.disconnect(); + return false; + } + } } diff --git a/apps/backend/src/notifications/notifications.service.ts b/apps/backend/src/notifications/notifications.service.ts index 3a9f785..20e5a93 100644 --- a/apps/backend/src/notifications/notifications.service.ts +++ b/apps/backend/src/notifications/notifications.service.ts @@ -24,9 +24,11 @@ export class NotificationsService implements OnModuleInit, OnModuleDestroy { private static readonly baseRetryDelayMs = 500; private readonly logger = new Logger(NotificationsService.name); private readonly channel = 'fairshare:notifications'; - private readonly publisher: Redis; - private readonly subscriber: Redis; + private readonly config: AppConfigService; + private publisher: Redis | null = null; + private subscriber: Redis | null = null; private readonly expo: Expo; + private pubSubEnabled = true; constructor( config: AppConfigService, @@ -34,46 +36,32 @@ export class NotificationsService implements OnModuleInit, OnModuleDestroy { @Inject(forwardRef(() => JobsQueueService)) private readonly jobsQueueService: JobsQueueService, ) { - const redisOptions = (connectionName: string) => ({ - lazyConnect: true, - maxRetriesPerRequest: 1, - enableOfflineQueue: false, - connectionName, - retryStrategy: (times: number) => { - if (times > MAX_REDIS_RETRIES) { - this.logger.warn(`${connectionName} Redis reconnect attempts exhausted`); - return null; - } - - return Math.min(times * RETRY_DELAY_MS, MAX_RETRY_DELAY_MS); - }, - }); - - this.publisher = new Redis(config.redisUrl, redisOptions('fairshare:notifications-publisher')); - this.subscriber = new Redis(config.redisUrl, redisOptions('fairshare:notifications-subscriber')); - - for (const [client, name] of [ - [this.publisher, 'notifications-publisher'], - [this.subscriber, 'notifications-subscriber'], - ] as const) { - client.on('error', (error) => { - this.logger.warn(`${name} Redis error: ${error.message}`); - }); - client.on('end', () => { - this.logger.warn(`${name} Redis connection closed`); - }); - } - + this.config = config; this.expo = new Expo(); } async onModuleInit(): Promise { + const redisAvailable = await this.canReachRedis(); + if (!redisAvailable) { + this.pubSubEnabled = false; + this.logger.warn('Redis unavailable, notifications pub/sub disabled for local startup'); + return; + } + + this.publisher = this.createRedisClient('fairshare:notifications-publisher'); + this.subscriber = this.createRedisClient('fairshare:notifications-subscriber'); + try { await this.subscriber.subscribe(this.channel); } catch (error) { + this.pubSubEnabled = false; this.logger.warn( `Redis pub/sub unavailable during startup: ${error instanceof Error ? error.message : 'unknown error'}`, ); + this.publisher?.disconnect(); + this.subscriber?.disconnect(); + this.publisher = null; + this.subscriber = null; return; } @@ -93,7 +81,9 @@ export class NotificationsService implements OnModuleInit, OnModuleDestroy { } async onModuleDestroy(): Promise { - await Promise.allSettled([this.subscriber.quit(), this.publisher.quit()]); + await Promise.allSettled( + [this.subscriber, this.publisher].filter((client): client is Redis => Boolean(client)).map((client) => client.quit()), + ); } async sendPushNotification(userIds: string[], payload: NotificationEventPayload): Promise { @@ -107,7 +97,13 @@ export class NotificationsService implements OnModuleInit, OnModuleDestroy { queuedAt: new Date().toISOString(), }; - await this.publisher.publish(this.channel, JSON.stringify(event)); + if (this.pubSubEnabled && this.publisher) { + try { + await this.publisher.publish(this.channel, JSON.stringify(event)); + } catch (error) { + this.logger.warn(`Redis publish skipped: ${error instanceof Error ? error.message : 'unknown error'}`); + } + } this.logger.log( JSON.stringify({ @@ -169,7 +165,7 @@ export class NotificationsService implements OnModuleInit, OnModuleDestroy { this.logger.error('Expo push send failed', error instanceof Error ? error.stack : undefined); if (retries > 0) { const attempt = NotificationsService.maxChunkRetries - retries + 1; - const delayMs = NotificationsService.baseRetryDelayMs * (2 ** (attempt - 1)); + const delayMs = NotificationsService.baseRetryDelayMs * 2 ** (attempt - 1); await new Promise((resolve) => setTimeout(resolve, delayMs)); await this.sendChunkWithRetry(chunk, retries - 1); } @@ -212,4 +208,51 @@ export class NotificationsService implements OnModuleInit, OnModuleDestroy { }), ); } + + private createRedisClient(connectionName: string): Redis { + const client = new Redis(this.config.redisUrl, { + lazyConnect: true, + maxRetriesPerRequest: 1, + enableOfflineQueue: false, + connectionName, + retryStrategy: (times: number) => { + if (times > MAX_REDIS_RETRIES) { + this.logger.warn(`${connectionName} Redis reconnect attempts exhausted`); + return null; + } + + return Math.min(times * RETRY_DELAY_MS, MAX_RETRY_DELAY_MS); + }, + }); + + client.on('error', (error) => { + this.logger.warn(`${connectionName} Redis error: ${error.message}`); + }); + client.on('end', () => { + this.logger.warn(`${connectionName} Redis connection closed`); + }); + + return client; + } + + private async canReachRedis(): Promise { + const probe = new Redis(this.config.redisUrl, { + lazyConnect: true, + maxRetriesPerRequest: 1, + enableOfflineQueue: false, + connectTimeout: 750, + retryStrategy: () => null, + }); + + try { + await probe.connect(); + await probe.ping(); + await probe.quit(); + return true; + } catch (error) { + this.logger.warn(`Redis notifications probe failed: ${error instanceof Error ? error.message : 'unknown error'}`); + probe.disconnect(); + return false; + } + } } diff --git a/apps/backend/src/redis/redis.service.ts b/apps/backend/src/redis/redis.service.ts index 18d1d22..b7348c0 100644 --- a/apps/backend/src/redis/redis.service.ts +++ b/apps/backend/src/redis/redis.service.ts @@ -1,52 +1,80 @@ -import { Inject, Injectable } from '@nestjs/common'; +import { Inject, Injectable, Logger } from '@nestjs/common'; import Redis from 'ioredis'; @Injectable() export class RedisService { + private readonly logger = new Logger(RedisService.name); + constructor(@Inject('REDIS_CLIENT') private readonly redis: Redis) {} async ping(): Promise { - return this.redis.ping(); + try { + return await this.redis.ping(); + } catch (error) { + this.logger.warn(`Redis ping unavailable: ${error instanceof Error ? error.message : 'unknown error'}`); + return 'UNAVAILABLE'; + } } async getGroupBalanceCache(groupId: string): Promise { - return this.redis.get(`group:${groupId}:balances`); + return this.safeGet(`group:${groupId}:balances`); } async setGroupBalanceCache(groupId: string, payload: string, ttlSeconds = 120): Promise { - await this.redis.set(`group:${groupId}:balances`, payload, 'EX', ttlSeconds); + await this.safeSet(`group:${groupId}:balances`, payload, ttlSeconds); } async getGroupMembersCache(groupId: string): Promise { - return this.redis.get(`group:${groupId}:members`); + return this.safeGet(`group:${groupId}:members`); } async setGroupMembersCache(groupId: string, payload: string, ttlSeconds = 120): Promise { - await this.redis.set(`group:${groupId}:members`, payload, 'EX', ttlSeconds); + await this.safeSet(`group:${groupId}:members`, payload, ttlSeconds); } async getGroupExpenseSummaryCache(groupId: string): Promise { - return this.redis.get(`group:${groupId}:expense_summary`); + return this.safeGet(`group:${groupId}:expense_summary`); } async setGroupExpenseSummaryCache(groupId: string, payload: string, ttlSeconds = 120): Promise { - await this.redis.set(`group:${groupId}:expense_summary`, payload, 'EX', ttlSeconds); + await this.safeSet(`group:${groupId}:expense_summary`, payload, ttlSeconds); } async getGroupSummaryCache(groupId: string): Promise { - return this.redis.get(`group:${groupId}:summary`); + return this.safeGet(`group:${groupId}:summary`); } async setGroupSummaryCache(groupId: string, payload: string, ttlSeconds = 120): Promise { - await this.redis.set(`group:${groupId}:summary`, payload, 'EX', ttlSeconds); + await this.safeSet(`group:${groupId}:summary`, payload, ttlSeconds); } async invalidateGroupCache(groupId: string): Promise { - await this.redis.del( - `group:${groupId}:balances`, - `group:${groupId}:members`, - `group:${groupId}:expense_summary`, - `group:${groupId}:summary`, - ); + try { + await this.redis.del( + `group:${groupId}:balances`, + `group:${groupId}:members`, + `group:${groupId}:expense_summary`, + `group:${groupId}:summary`, + ); + } catch (error) { + this.logger.warn(`Redis invalidate skipped: ${error instanceof Error ? error.message : 'unknown error'}`); + } + } + + private async safeGet(key: string): Promise { + try { + return await this.redis.get(key); + } catch (error) { + this.logger.warn(`Redis get skipped for ${key}: ${error instanceof Error ? error.message : 'unknown error'}`); + return null; + } + } + + private async safeSet(key: string, payload: string, ttlSeconds: number): Promise { + try { + await this.redis.set(key, payload, 'EX', ttlSeconds); + } catch (error) { + this.logger.warn(`Redis set skipped for ${key}: ${error instanceof Error ? error.message : 'unknown error'}`); + } } } From 4ea66a9c82ca0dace89e84464a2fc95283ce5481 Mon Sep 17 00:00:00 2001 From: Arun-kushwaha007 Date: Fri, 20 Mar 2026 00:19:42 +0530 Subject: [PATCH 2/3] fix(web): handle backend outages and add legal pages --- apps/web/app/api/auth/login/route.ts | 17 ++++--- apps/web/app/api/auth/register/route.ts | 17 ++++--- apps/web/app/privacy/page.tsx | 64 +++++++++++++++++++++++++ apps/web/app/terms/page.tsx | 64 +++++++++++++++++++++++++ apps/web/middleware.ts | 42 +++++++++------- 5 files changed, 175 insertions(+), 29 deletions(-) create mode 100644 apps/web/app/privacy/page.tsx create mode 100644 apps/web/app/terms/page.tsx diff --git a/apps/web/app/api/auth/login/route.ts b/apps/web/app/api/auth/login/route.ts index 09abe97..fe50269 100644 --- a/apps/web/app/api/auth/login/route.ts +++ b/apps/web/app/api/auth/login/route.ts @@ -5,12 +5,17 @@ import { getBackendBaseUrl } from '../../../../src/lib/env'; export async function POST(request: Request) { const body = await request.json().catch(() => null); - const response = await fetch(`${getBackendBaseUrl()}/auth/login`, { - method: 'POST', - headers: { 'content-type': 'application/json' }, - body: JSON.stringify(body ?? {}), - cache: 'no-store', - }); + let response: Response; + try { + response = await fetch(`${getBackendBaseUrl()}/auth/login`, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify(body ?? {}), + cache: 'no-store', + }); + } catch { + return NextResponse.json({ message: 'Backend unavailable. Start the API server and try again.' }, { status: 503 }); + } const payload = (await response.json().catch(() => null)) as | { accessToken?: string; refreshToken?: string; user?: unknown; message?: string } diff --git a/apps/web/app/api/auth/register/route.ts b/apps/web/app/api/auth/register/route.ts index 7faf823..3ffe7be 100644 --- a/apps/web/app/api/auth/register/route.ts +++ b/apps/web/app/api/auth/register/route.ts @@ -5,12 +5,17 @@ import { getBackendBaseUrl } from '../../../../src/lib/env'; export async function POST(request: Request) { const body = await request.json().catch(() => null); - const response = await fetch(`${getBackendBaseUrl()}/auth/register`, { - method: 'POST', - headers: { 'content-type': 'application/json' }, - body: JSON.stringify(body ?? {}), - cache: 'no-store', - }); + let response: Response; + try { + response = await fetch(`${getBackendBaseUrl()}/auth/register`, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify(body ?? {}), + cache: 'no-store', + }); + } catch { + return NextResponse.json({ message: 'Backend unavailable. Start the API server and try again.' }, { status: 503 }); + } const payload = (await response.json().catch(() => null)) as | { accessToken?: string; refreshToken?: string; user?: unknown; message?: string } diff --git a/apps/web/app/privacy/page.tsx b/apps/web/app/privacy/page.tsx new file mode 100644 index 0000000..48d1dfb --- /dev/null +++ b/apps/web/app/privacy/page.tsx @@ -0,0 +1,64 @@ +import { Metadata } from 'next'; +import Link from 'next/link'; +import { SectionContainer } from '../../components/layout/SectionContainer'; + +export const metadata: Metadata = { + title: 'Privacy | FairShare', + description: 'FairShare privacy overview for the web demo experience.', +}; + +const sections = [ + { + title: 'What we collect', + body: 'Account details, group activity, expense data, and uploaded receipt metadata needed to operate shared-expense features.', + }, + { + title: 'How we use it', + body: 'To authenticate users, calculate balances, sync activity across your groups, and support receipt uploads and notifications.', + }, + { + title: 'What this demo means', + body: 'This repository is a development build. Do not treat local demo environments as a production-grade compliance deployment.', + }, +]; + +export default function PrivacyPage() { + return ( +
+
+ + +
+ Privacy +
+

+ DATA WITH CONTEXT. +

+

+ A concise privacy overview for the current FairShare web experience. +

+
+ + +
+ {sections.map((section) => ( +
+

{section.title}

+

{section.body}

+
+ ))} + +
+

Questions

+

+ For repo-level questions, use the contact flow in the site footer or review the code paths that handle auth, storage, and notifications. +

+ + Contact + +
+
+
+
+ ); +} diff --git a/apps/web/app/terms/page.tsx b/apps/web/app/terms/page.tsx new file mode 100644 index 0000000..bcd5acd --- /dev/null +++ b/apps/web/app/terms/page.tsx @@ -0,0 +1,64 @@ +import { Metadata } from 'next'; +import Link from 'next/link'; +import { SectionContainer } from '../../components/layout/SectionContainer'; + +export const metadata: Metadata = { + title: 'Terms | FairShare', + description: 'FairShare terms overview for the web demo experience.', +}; + +const sections = [ + { + title: 'Use of the app', + body: 'Use FairShare for lawful collaboration around shared expenses. You are responsible for the accuracy of data you enter into the app.', + }, + { + title: 'Demo limitations', + body: 'This repository includes local-development behavior, mock credentials, and optional infrastructure. Features may be incomplete or unavailable without the required services.', + }, + { + title: 'Uploaded content', + body: 'Only upload receipts and content you are permitted to store and process. Local development environments are your responsibility to secure.', + }, +]; + +export default function TermsPage() { + return ( +
+
+ + +
+ Terms +
+

+ CLEAR RULES. +

+

+ A short terms overview for using the current FairShare demo and development environment. +

+
+ + +
+ {sections.map((section) => ( +
+

{section.title}

+

{section.body}

+
+ ))} + +
+

Need support

+

+ If a local setup issue blocks you, start the required backend services first, then retry the web and mobile clients. +

+ + Open FAQ + +
+
+
+
+ ); +} diff --git a/apps/web/middleware.ts b/apps/web/middleware.ts index f29ad79..6b8af4a 100644 --- a/apps/web/middleware.ts +++ b/apps/web/middleware.ts @@ -1,4 +1,4 @@ -import { NextRequest, NextResponse } from 'next/server'; +import { NextRequest, NextResponse } from 'next/server'; import { authCookies, accessCookieOptions, refreshCookieOptions } from './src/lib/authCookies'; import { getBackendBaseUrl } from './src/lib/env'; import { isJwtExpiringSoon } from './src/lib/jwt'; @@ -13,8 +13,6 @@ function isAuthPage(pathname: string): boolean { function parseCookieValue(setCookieHeader: string | null, cookieName: string): string | null { if (!setCookieHeader) return null; - // Next/undici may coalesce multiple Set-Cookie headers into a single comma-separated string. - // This parser is intentionally minimal: it searches for "=" and extracts until the next ";". const idx = setCookieHeader.indexOf(`${cookieName}=`); if (idx < 0) return null; const start = idx + cookieName.length + 1; @@ -28,11 +26,16 @@ async function tryRefreshTokens(req: NextRequest): Promise<{ accessToken: string return null; } - const csrfResp = await fetch(`${getBackendBaseUrl()}/auth/csrf-token`, { - method: 'GET', - headers: { cookie: `${authCookies.refreshToken}=${refreshToken}` }, - cache: 'no-store', - }); + let csrfResp: Response; + try { + csrfResp = await fetch(`${getBackendBaseUrl()}/auth/csrf-token`, { + method: 'GET', + headers: { cookie: `${authCookies.refreshToken}=${refreshToken}` }, + cache: 'no-store', + }); + } catch { + return null; + } if (!csrfResp.ok) { return null; @@ -49,14 +52,19 @@ async function tryRefreshTokens(req: NextRequest): Promise<{ accessToken: string return null; } - const refreshResp = await fetch(`${getBackendBaseUrl()}/auth/refresh`, { - method: 'POST', - headers: { - 'x-csrf-token': csrfToken, - cookie: `_csrf=${csrfCookie}; ${authCookies.refreshToken}=${refreshToken}`, - }, - cache: 'no-store', - }); + let refreshResp: Response; + try { + refreshResp = await fetch(`${getBackendBaseUrl()}/auth/refresh`, { + method: 'POST', + headers: { + 'x-csrf-token': csrfToken, + cookie: `_csrf=${csrfCookie}; ${authCookies.refreshToken}=${refreshToken}`, + }, + cache: 'no-store', + }); + } catch { + return null; + } if (!refreshResp.ok) { return null; @@ -107,4 +115,4 @@ export async function middleware(req: NextRequest) { export const config = { matcher: ['/dashboard/:path*', '/login', '/register'], -}; \ No newline at end of file +}; From 4d371883e9f9e3a77057248fc8a3ec50f2e3750c Mon Sep 17 00:00:00 2001 From: Arun-kushwaha007 Date: Fri, 20 Mar 2026 00:19:55 +0530 Subject: [PATCH 3/3] chore(mobile): align Expo packages and strict typings --- apps/mobile/App.tsx | 3 + apps/mobile/app/components/ui/Button.tsx | 16 +- apps/mobile/app/components/ui/Card.tsx | 5 +- apps/mobile/app/theme/colors.ts | 5 +- apps/mobile/package.json | 20 +- pnpm-lock.yaml | 991 ++++++++--------------- 6 files changed, 371 insertions(+), 669 deletions(-) diff --git a/apps/mobile/App.tsx b/apps/mobile/App.tsx index 47d204c..f72d2bd 100644 --- a/apps/mobile/App.tsx +++ b/apps/mobile/App.tsx @@ -31,6 +31,8 @@ if (sentryDsn) { Notifications.setNotificationHandler({ handleNotification: async () => ({ shouldShowAlert: true, + shouldShowBanner: true, + shouldShowList: true, shouldPlaySound: false, shouldSetBadge: false, }), @@ -142,3 +144,4 @@ export default function App() { ); } + diff --git a/apps/mobile/app/components/ui/Button.tsx b/apps/mobile/app/components/ui/Button.tsx index e92a691..fb1a60a 100644 --- a/apps/mobile/app/components/ui/Button.tsx +++ b/apps/mobile/app/components/ui/Button.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { StyleSheet, TouchableOpacity, ViewStyle } from 'react-native'; +import { StyleProp, StyleSheet, TouchableOpacity, View, ViewStyle } from 'react-native'; import { Text } from 'react-native-paper'; import { LinearGradient } from 'expo-linear-gradient'; import Animated, { useAnimatedStyle, useSharedValue, withSpring } from 'react-native-reanimated'; @@ -10,13 +10,13 @@ interface ButtonProps { children: React.ReactNode; onPress: () => void; variant?: 'primary' | 'secondary' | 'ghost' | 'danger'; - style?: ViewStyle; + style?: StyleProp; loading?: boolean; } export function Button({ children, onPress, variant = 'primary', style, loading }: ButtonProps) { const theme = useAppTheme(); - const { colors, shadows, isDark } = theme; + const { colors, shadows } = theme; const scale = useSharedValue(1); const animatedStyle = useAnimatedStyle(() => ({ @@ -71,10 +71,7 @@ export function Button({ children, onPress, variant = 'primary', style, loading animatedStyle, ]} > - - {children} - - {/* Inset highlight for skeuomorphism */} + {loading ? 'Loading...' : children} ); @@ -90,6 +87,7 @@ export function Button({ children, onPress, variant = 'primary', style, loading scale.value = withSpring(1); }} style={[styles.wrapper, style]} + disabled={loading} > {v.gradient ? ( ; variant?: 'default' | 'elevated' | 'glass'; } @@ -74,3 +74,4 @@ const styles = StyleSheet.create({ opacity: 0.2, } }); + diff --git a/apps/mobile/app/theme/colors.ts b/apps/mobile/app/theme/colors.ts index 1f7393a..0ca0bfe 100644 --- a/apps/mobile/app/theme/colors.ts +++ b/apps/mobile/app/theme/colors.ts @@ -49,7 +49,7 @@ export const colors = { insetHighlight: 'rgba(255,255,255,0.6)', // Gradients - gradient: ['#6D28D9', '#8B5CF6'], + gradient: ['#6D28D9', '#8B5CF6'] as const, }, dark: { // Brand Colors @@ -91,6 +91,7 @@ export const colors = { insetHighlight: 'rgba(255,255,255,0.05)', // Gradients - gradient: ['#7C3AED', '#A78BFA'], + gradient: ['#7C3AED', '#A78BFA'] as const, }, }; + diff --git a/apps/mobile/package.json b/apps/mobile/package.json index abb0e0f..bc894ba 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -8,10 +8,10 @@ "build": "tsc --noEmit", "lint": "tsc --noEmit", "test": "jest --runInBand --passWithNoTests", - "eas:build": "eas build -p android --profile production" + "eas:build": "eas build -p android --profile production" }, "dependencies": { - "@expo/vector-icons": "^14.1.0", + "@expo/vector-icons": "^15.0.3", "@fairshare/shared-types": "workspace:*", "@react-native-community/netinfo": "^11.4.1", "@react-navigation/bottom-tabs": "^7.4.7", @@ -20,15 +20,15 @@ "axios": "^1.8.2", "expo": "^54.0.33", "expo-constants": "~18.0.10", - "expo-haptics": "~14.0.1", - "expo-linear-gradient": "~14.1.5", + "expo-haptics": "~15.0.8", + "expo-linear-gradient": "~15.0.8", "expo-secure-store": "^15.0.8", "expo-status-bar": "~3.0.9", - "lottie-react-native": "~7.2.2", + "lottie-react-native": "~7.3.1", "react": "19.1.0", "react-dom": "19.1.0", "react-hook-form": "^7.55.0", - "react-native": "0.81.4", + "react-native": "0.81.5", "react-native-gesture-handler": "~2.28.0", "react-native-paper": "^5.14.5", "react-native-reanimated": "~4.1.1", @@ -38,15 +38,15 @@ "react-native-screens": "^4.16.0", "socket.io-client": "^4.8.1", "zustand": "^5.0.3", - "expo-notifications": "~0.29.14", - "expo-image": "~2.4.0", - "sentry-expo": "^7.2.0", + "expo-notifications": "~0.32.16", + "expo-image": "~3.0.11", + "sentry-expo": "~7.0.0", "react-native-skeleton-placeholder": "^5.2.4" }, "devDependencies": { "@testing-library/react-native": "^13.3.3", "@types/jest": "^29.5.12", - "@types/react": "^19.0.7", + "@types/react": "~19.1.10", "jest": "^29.7.0", "jest-expo": "~54.0.11", "react-test-renderer": "19.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 03867d1..87ec64c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -184,53 +184,53 @@ importers: apps/mobile: dependencies: '@expo/vector-icons': - specifier: ^14.1.0 - version: 14.1.0(expo-font@14.0.11)(react-native@0.81.4)(react@19.1.0) + specifier: ^15.0.3 + version: 15.1.1(expo-font@14.0.11)(react-native@0.81.5)(react@19.1.0) '@fairshare/shared-types': specifier: workspace:* version: link:../../packages/shared-types '@react-native-community/netinfo': specifier: ^11.4.1 - version: 11.5.2(react-native@0.81.4)(react@19.1.0) + version: 11.5.2(react-native@0.81.5)(react@19.1.0) '@react-navigation/bottom-tabs': specifier: ^7.4.7 - version: 7.15.5(@react-native-masked-view/masked-view@0.2.9)(@react-navigation/native@7.1.33)(react-native-safe-area-context@5.6.2)(react-native-screens@4.16.0)(react-native@0.81.4)(react@19.1.0) + version: 7.15.5(@react-native-masked-view/masked-view@0.2.9)(@react-navigation/native@7.1.33)(react-native-safe-area-context@5.6.2)(react-native-screens@4.16.0)(react-native@0.81.5)(react@19.1.0) '@react-navigation/native': specifier: ^7.1.33 - version: 7.1.33(react-native@0.81.4)(react@19.1.0) + version: 7.1.33(react-native@0.81.5)(react@19.1.0) '@react-navigation/native-stack': specifier: ^7.14.2 - version: 7.14.2(@react-native-masked-view/masked-view@0.2.9)(@react-navigation/native@7.1.33)(react-native-safe-area-context@5.6.2)(react-native-screens@4.16.0)(react-native@0.81.4)(react@19.1.0) + version: 7.14.2(@react-native-masked-view/masked-view@0.2.9)(@react-navigation/native@7.1.33)(react-native-safe-area-context@5.6.2)(react-native-screens@4.16.0)(react-native@0.81.5)(react@19.1.0) axios: specifier: ^1.8.2 version: 1.13.6 expo: specifier: ^54.0.33 - version: 54.0.33(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0) + version: 54.0.33(@babel/core@7.29.0)(react-native@0.81.5)(react@19.1.0) expo-constants: specifier: ~18.0.10 - version: 18.0.13(expo@54.0.33)(react-native@0.81.4) + version: 18.0.13(expo@54.0.33)(react-native@0.81.5) expo-haptics: - specifier: ~14.0.1 - version: 14.0.1(expo@54.0.33) + specifier: ~15.0.8 + version: 15.0.8(expo@54.0.33) expo-image: - specifier: ~2.4.0 - version: 2.4.1(expo@54.0.33)(react-native-web@0.21.2)(react-native@0.81.4)(react@19.1.0) + specifier: ~3.0.11 + version: 3.0.11(expo@54.0.33)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0) expo-linear-gradient: - specifier: ~14.1.5 - version: 14.1.5(expo@54.0.33)(react-native@0.81.4)(react@19.1.0) + specifier: ~15.0.8 + version: 15.0.8(expo@54.0.33)(react-native@0.81.5)(react@19.1.0) expo-notifications: - specifier: ~0.29.14 - version: 0.29.14(expo@54.0.33)(react-native@0.81.4)(react@19.1.0) + specifier: ~0.32.16 + version: 0.32.16(expo@54.0.33)(react-native@0.81.5)(react@19.1.0) expo-secure-store: specifier: ^15.0.8 version: 15.0.8(expo@54.0.33) expo-status-bar: specifier: ~3.0.9 - version: 3.0.9(react-native@0.81.4)(react@19.1.0) + version: 3.0.9(react-native@0.81.5)(react@19.1.0) lottie-react-native: - specifier: ~7.2.2 - version: 7.2.5(react-native@0.81.4)(react@19.1.0) + specifier: ~7.3.1 + version: 7.3.6(react-native@0.81.5)(react@19.1.0) react: specifier: 19.1.0 version: 19.1.0 @@ -241,57 +241,57 @@ importers: specifier: ^7.55.0 version: 7.71.2(react@19.1.0) react-native: - specifier: 0.81.4 - version: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + specifier: 0.81.5 + version: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) react-native-gesture-handler: specifier: ~2.28.0 - version: 2.28.0(react-native@0.81.4)(react@19.1.0) + version: 2.28.0(react-native@0.81.5)(react@19.1.0) react-native-paper: specifier: ^5.14.5 - version: 5.15.0(react-native-safe-area-context@5.6.2)(react-native@0.81.4)(react@19.1.0) + version: 5.15.0(react-native-safe-area-context@5.6.2)(react-native@0.81.5)(react@19.1.0) react-native-reanimated: specifier: ~4.1.1 - version: 4.1.6(@babel/core@7.29.0)(react-native-worklets@0.5.1)(react-native@0.81.4)(react@19.1.0) + version: 4.1.6(@babel/core@7.29.0)(react-native-worklets@0.5.1)(react-native@0.81.5)(react@19.1.0) react-native-safe-area-context: specifier: ^5.6.2 - version: 5.6.2(react-native@0.81.4)(react@19.1.0) + version: 5.6.2(react-native@0.81.5)(react@19.1.0) react-native-screens: specifier: ^4.16.0 - version: 4.16.0(react-native@0.81.4)(react@19.1.0) + version: 4.16.0(react-native@0.81.5)(react@19.1.0) react-native-skeleton-placeholder: specifier: ^5.2.4 - version: 5.2.4(@react-native-masked-view/masked-view@0.2.9)(react-native-linear-gradient@2.8.3)(react-native@0.81.4)(react@19.1.0) + version: 5.2.4(@react-native-masked-view/masked-view@0.2.9)(react-native-linear-gradient@2.8.3)(react-native@0.81.5)(react@19.1.0) react-native-web: specifier: ^0.21.1 version: 0.21.2(react-dom@19.1.0)(react@19.1.0) react-native-worklets: specifier: 0.5.1 - version: 0.5.1(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0) + version: 0.5.1(@babel/core@7.29.0)(react-native@0.81.5)(react@19.1.0) sentry-expo: - specifier: ^7.2.0 - version: 7.2.0(expo-application@6.0.2)(expo-constants@18.0.13)(expo-device@55.0.9)(expo@54.0.33)(react-native@0.81.4)(react@19.1.0) + specifier: ~7.0.0 + version: 7.0.1(expo-application@6.0.2)(expo-constants@18.0.13)(expo-device@55.0.9)(expo@54.0.33)(react-native@0.81.5)(react@19.1.0) socket.io-client: specifier: ^4.8.1 version: 4.8.3 zustand: specifier: ^5.0.3 - version: 5.0.11(@types/react@19.2.14)(react@19.1.0) + version: 5.0.11(@types/react@19.1.17)(react@19.1.0) devDependencies: '@testing-library/react-native': specifier: ^13.3.3 - version: 13.3.3(jest@29.7.0)(react-native@0.81.4)(react-test-renderer@19.1.0)(react@19.1.0) + version: 13.3.3(jest@29.7.0)(react-native@0.81.5)(react-test-renderer@19.1.0)(react@19.1.0) '@types/jest': specifier: ^29.5.12 version: 29.5.14 '@types/react': - specifier: ^19.0.7 - version: 19.2.14 + specifier: ~19.1.10 + version: 19.1.17 jest: specifier: ^29.7.0 version: 29.7.0(@types/node@22.19.13)(ts-node@10.9.2) jest-expo: specifier: ~54.0.11 - version: 54.0.17(@babel/core@7.29.0)(expo@54.0.33)(jest@29.7.0)(react-native@0.81.4)(react@19.1.0) + version: 54.0.17(@babel/core@7.29.0)(expo@54.0.33)(jest@29.7.0)(react-native@0.81.5)(react@19.1.0) react-test-renderer: specifier: 19.1.0 version: 19.1.0(react@19.1.0) @@ -2010,7 +2010,7 @@ packages: dev: false optional: true - /@expo/cli@54.0.23(expo@54.0.33)(react-native@0.81.4): + /@expo/cli@54.0.23(expo@54.0.33)(react-native@0.81.5): resolution: {integrity: sha512-km0h72SFfQCmVycH/JtPFTVy69w6Lx1cHNDmfLfQqgKFYeeHTjx7LVDP4POHCtNxFP2UeRazrygJhlh4zz498g==} hasBin: true peerDependencies: @@ -2055,7 +2055,7 @@ packages: connect: 3.7.0 debug: 4.4.3 env-editor: 0.4.2 - expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0) + expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.5)(react@19.1.0) expo-server: 1.0.5 freeport-async: 2.0.0 getenv: 2.0.0 @@ -2071,7 +2071,7 @@ packages: progress: 2.0.3 prompts: 2.4.2 qrcode-terminal: 0.11.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) require-from-string: 2.0.2 requireg: 0.2.2 resolve: 1.22.11 @@ -2119,54 +2119,9 @@ packages: transitivePeerDependencies: - supports-color - /@expo/config-plugins@9.0.17: - resolution: {integrity: sha512-m24F1COquwOm7PBl5wRbkT9P9DviCXe0D7S7nQsolfbhdCWuvMkfXeoWmgjtdhy7sDlOyIgBrAdnB6MfsWKqIg==} - dependencies: - '@expo/config-types': 52.0.5 - '@expo/json-file': 9.0.2 - '@expo/plist': 0.2.2 - '@expo/sdk-runtime-versions': 1.0.0 - chalk: 4.1.2 - debug: 4.4.3 - getenv: 1.0.0 - glob: 10.5.0 - resolve-from: 5.0.0 - semver: 7.7.4 - slash: 3.0.0 - slugify: 1.6.6 - xcode: 3.0.1 - xml2js: 0.6.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@expo/config-types@52.0.5: - resolution: {integrity: sha512-AMDeuDLHXXqd8W+0zSjIt7f37vUd/BP8p43k68NHpyAvQO+z8mbQZm3cNQVAMySeayK2XoPigAFB1JF2NFajaA==} - dev: false - /@expo/config-types@54.0.10: resolution: {integrity: sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==} - /@expo/config@10.0.11: - resolution: {integrity: sha512-nociJ4zr/NmbVfMNe9j/+zRlt7wz/siISu7PjdWE4WE+elEGxWWxsGzltdJG0llzrM+khx8qUiFK5aiVcdMBww==} - dependencies: - '@babel/code-frame': 7.10.4 - '@expo/config-plugins': 9.0.17 - '@expo/config-types': 52.0.5 - '@expo/json-file': 9.1.5 - deepmerge: 4.3.1 - getenv: 1.0.0 - glob: 10.5.0 - require-from-string: 2.0.2 - resolve-from: 5.0.0 - resolve-workspace-root: 2.0.1 - semver: 7.7.4 - slugify: 1.6.6 - sucrase: 3.35.0 - transitivePeerDependencies: - - supports-color - dev: false - /@expo/config@12.0.13: resolution: {integrity: sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==} dependencies: @@ -2194,7 +2149,7 @@ packages: transitivePeerDependencies: - supports-color - /@expo/devtools@0.1.8(react-native@0.81.4)(react@19.1.0): + /@expo/devtools@0.1.8(react-native@0.81.5)(react@19.1.0): resolution: {integrity: sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==} peerDependencies: react: '*' @@ -2207,19 +2162,7 @@ packages: dependencies: chalk: 4.1.2 react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) - - /@expo/env@0.4.2: - resolution: {integrity: sha512-TgbCgvSk0Kq0e2fLoqHwEBL4M0ztFjnBEz0YCDm5boc1nvkV1VMuIMteVdeBwnTh8Z0oPJTwHCD49vhMEt1I6A==} - dependencies: - chalk: 4.1.2 - debug: 4.4.3 - dotenv: 16.4.7 - dotenv-expand: 11.0.7 - getenv: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: false + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) /@expo/env@2.0.11: resolution: {integrity: sha512-xV+ps6YCW7XIPVUwFVCRN2nox09dnRwy8uIjwHWTODu0zFw4kp4omnVkl0OOjuu2XOe7tdgAHxikrkJt9xB/7Q==} @@ -2250,21 +2193,6 @@ packages: transitivePeerDependencies: - supports-color - /@expo/image-utils@0.6.5: - resolution: {integrity: sha512-RsS/1CwJYzccvlprYktD42KjyfWZECH6PPIEowvoSmXfGLfdViwcUEI4RvBfKX5Jli6P67H+6YmHvPTbGOboew==} - dependencies: - '@expo/spawn-async': 1.7.2 - chalk: 4.1.2 - fs-extra: 9.0.0 - getenv: 1.0.0 - jimp-compact: 0.16.1 - parse-png: 2.1.0 - resolve-from: 5.0.0 - semver: 7.7.4 - temp-dir: 2.0.0 - unique-string: 2.0.0 - dev: false - /@expo/image-utils@0.8.12: resolution: {integrity: sha512-3KguH7kyKqq7pNwLb9j6BBdD/bjmNwXZG/HPWT6GWIXbwrvAJt2JNyYTP5agWJ8jbbuys1yuCzmkX+TU6rmI7A==} dependencies: @@ -2282,21 +2210,6 @@ packages: '@babel/code-frame': 7.29.0 json5: 2.2.3 - /@expo/json-file@9.0.2: - resolution: {integrity: sha512-yAznIUrybOIWp3Uax7yRflB0xsEpvIwIEqIjao9SGi2Gaa+N0OamWfe0fnXBSWF+2zzF4VvqwT4W5zwelchfgw==} - dependencies: - '@babel/code-frame': 7.10.4 - json5: 2.2.3 - write-file-atomic: 2.4.3 - dev: false - - /@expo/json-file@9.1.5: - resolution: {integrity: sha512-prWBhLUlmcQtvN6Y7BpW2k9zXGd3ySa3R6rAguMJkp1z22nunLN64KYTUWfijFlprFoxm9r2VNnGkcbndAlgKA==} - dependencies: - '@babel/code-frame': 7.10.4 - json5: 2.2.3 - dev: false - /@expo/metro-config@54.0.14(expo@54.0.33): resolution: {integrity: sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==} peerDependencies: @@ -2318,7 +2231,7 @@ packages: debug: 4.4.3 dotenv: 16.4.7 dotenv-expand: 11.0.7 - expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0) + expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.5)(react@19.1.0) getenv: 2.0.0 glob: 13.0.0 hermes-parser: 0.29.1 @@ -2370,14 +2283,6 @@ packages: ora: 3.4.0 resolve-workspace-root: 2.0.1 - /@expo/plist@0.2.2: - resolution: {integrity: sha512-ZZGvTO6vEWq02UAPs3LIdja+HRO18+LRI5QuDl6Hs3Ps7KX7xU6Y6kjahWKY37Rx2YjNpX07dGpBFzzC+vKa2g==} - dependencies: - '@xmldom/xmldom': 0.7.13 - base64-js: 1.5.1 - xmlbuilder: 14.0.0 - dev: false - /@expo/plist@0.4.8: resolution: {integrity: sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==} dependencies: @@ -2397,7 +2302,7 @@ packages: '@expo/json-file': 10.0.12 '@react-native/normalize-colors': 0.81.5 debug: 4.4.3 - expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0) + expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.5)(react@19.1.0) resolve-from: 5.0.0 semver: 7.7.4 xml2js: 0.6.0 @@ -2419,28 +2324,16 @@ packages: /@expo/sudo-prompt@9.3.2: resolution: {integrity: sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==} - /@expo/vector-icons@14.1.0(expo-font@14.0.11)(react-native@0.81.4)(react@19.1.0): - resolution: {integrity: sha512-7T09UE9h8QDTsUeMGymB4i+iqvtEeaO5VvUjryFB4tugDTG/bkzViWA74hm5pfjjDEhYMXWaX112mcvhccmIwQ==} - peerDependencies: - expo-font: '*' - react: '*' - react-native: '*' - dependencies: - expo-font: 14.0.11(expo@54.0.33)(react-native@0.81.4)(react@19.1.0) - react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) - dev: false - - /@expo/vector-icons@15.1.1(expo-font@14.0.11)(react-native@0.81.4)(react@19.1.0): + /@expo/vector-icons@15.1.1(expo-font@14.0.11)(react-native@0.81.5)(react@19.1.0): resolution: {integrity: sha512-Iu2VkcoI5vygbtYngm7jb4ifxElNVXQYdDrYkT7UCEIiKLeWnQY0wf2ZhHZ+Wro6Sc5TaumpKUOqDRpLi5rkvw==} peerDependencies: expo-font: '>=14.0.4' react: '*' react-native: '*' dependencies: - expo-font: 14.0.11(expo@54.0.33)(react-native@0.81.4)(react@19.1.0) + expo-font: 14.0.11(expo@54.0.33)(react-native@0.81.5)(react@19.1.0) react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) /@expo/ws-tunnel@1.0.6: resolution: {integrity: sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==} @@ -2930,18 +2823,6 @@ packages: resolution: {integrity: sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw==} dev: false - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.2.0 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: false - /@isaacs/fs-minipass@4.0.1: resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} @@ -5086,13 +4967,6 @@ packages: '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) dev: false - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: false - optional: true - /@playwright/test@1.58.2: resolution: {integrity: sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==} engines: {node: '>=18'} @@ -5214,28 +5088,28 @@ packages: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} dev: false - /@react-native-community/netinfo@11.5.2(react-native@0.81.4)(react@19.1.0): + /@react-native-community/netinfo@11.5.2(react-native@0.81.5)(react@19.1.0): resolution: {integrity: sha512-/g0m65BtX9HU+bPiCH2517bOHpEIUsGrWFXDzi1a5nNKn5KujQgm04WhL7/OSXWKHyrT8VVtUoJA0XKRxueBpQ==} peerDependencies: react: '*' react-native: '>=0.59' dependencies: react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) dev: false - /@react-native-masked-view/masked-view@0.2.9(react-native@0.81.4)(react@19.1.0): + /@react-native-masked-view/masked-view@0.2.9(react-native@0.81.5)(react@19.1.0): resolution: {integrity: sha512-Hs4vKBKj+15VxHZHFtMaFWSBxXoOE5Ea8saoigWhahp8Mepssm0ezU+2pTl7DK9z8Y9s5uOl/aPb4QmBZ3R3Zw==} peerDependencies: react: '>=16' react-native: '>=0.57' dependencies: react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) dev: false - /@react-native/assets-registry@0.81.4: - resolution: {integrity: sha512-AMcDadefBIjD10BRqkWw+W/VdvXEomR6aEZ0fhQRAv7igrBzb4PTn4vHKYg+sUK0e3wa74kcMy2DLc/HtnGcMA==} + /@react-native/assets-registry@0.81.5: + resolution: {integrity: sha512-705B6x/5Kxm1RKRvSv0ADYWm5JOnoiQ1ufW7h8uu2E6G9Of/eE6hP/Ivw3U5jI16ERqZxiKQwk34VJbB0niX9w==} engines: {node: '>= 20.19.4'} /@react-native/babel-plugin-codegen@0.81.5(@babel/core@7.29.0): @@ -5302,20 +5176,6 @@ packages: transitivePeerDependencies: - supports-color - /@react-native/codegen@0.81.4(@babel/core@7.29.0): - resolution: {integrity: sha512-LWTGUTzFu+qOQnvkzBP52B90Ym3stZT8IFCzzUrppz8Iwglg83FCtDZAR4yLHI29VY/x/+pkcWAMCl3739XHdw==} - engines: {node: '>= 20.19.4'} - peerDependencies: - '@babel/core': '*' - dependencies: - '@babel/core': 7.29.0 - '@babel/parser': 7.29.0 - glob: 7.2.3 - hermes-parser: 0.29.1 - invariant: 2.2.4 - nullthrows: 1.1.1 - yargs: 17.7.2 - /@react-native/codegen@0.81.5(@babel/core@7.29.0): resolution: {integrity: sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==} engines: {node: '>= 20.19.4'} @@ -5330,8 +5190,8 @@ packages: nullthrows: 1.1.1 yargs: 17.7.2 - /@react-native/community-cli-plugin@0.81.4: - resolution: {integrity: sha512-8mpnvfcLcnVh+t1ok6V9eozWo8Ut+TZhz8ylJ6gF9d6q9EGDQX6s8jenan5Yv/pzN4vQEKI4ib2pTf/FELw+SA==} + /@react-native/community-cli-plugin@0.81.5: + resolution: {integrity: sha512-yWRlmEOtcyvSZ4+OvqPabt+NS36vg0K/WADTQLhrYrm9qdZSuXmq8PmdJWz/68wAqKQ+4KTILiq2kjRQwnyhQw==} engines: {node: '>= 20.19.4'} peerDependencies: '@react-native-community/cli': '*' @@ -5342,7 +5202,7 @@ packages: '@react-native/metro-config': optional: true dependencies: - '@react-native/dev-middleware': 0.81.4 + '@react-native/dev-middleware': 0.81.5 debug: 4.4.3 invariant: 2.2.4 metro: 0.83.5 @@ -5354,34 +5214,10 @@ packages: - supports-color - utf-8-validate - /@react-native/debugger-frontend@0.81.4: - resolution: {integrity: sha512-SU05w1wD0nKdQFcuNC9D6De0ITnINCi8MEnx9RsTD2e4wN83ukoC7FpXaPCYyP6+VjFt5tUKDPgP1O7iaNXCqg==} - engines: {node: '>= 20.19.4'} - /@react-native/debugger-frontend@0.81.5: resolution: {integrity: sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==} engines: {node: '>= 20.19.4'} - /@react-native/dev-middleware@0.81.4: - resolution: {integrity: sha512-hu1Wu5R28FT7nHXs2wWXvQ++7W7zq5GPY83llajgPlYKznyPLAY/7bArc5rAzNB7b0kwnlaoPQKlvD/VP9LZug==} - engines: {node: '>= 20.19.4'} - dependencies: - '@isaacs/ttlcache': 1.4.1 - '@react-native/debugger-frontend': 0.81.4 - chrome-launcher: 0.15.2 - chromium-edge-launcher: 0.2.0 - connect: 3.7.0 - debug: 4.4.3 - invariant: 2.2.4 - nullthrows: 1.1.1 - open: 7.4.2 - serve-static: 1.16.3 - ws: 6.2.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - /@react-native/dev-middleware@0.81.5: resolution: {integrity: sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==} engines: {node: '>= 20.19.4'} @@ -5402,26 +5238,23 @@ packages: - supports-color - utf-8-validate - /@react-native/gradle-plugin@0.81.4: - resolution: {integrity: sha512-T7fPcQvDDCSusZFVSg6H1oVDKb/NnVYLnsqkcHsAF2C2KGXyo3J7slH/tJAwNfj/7EOA2OgcWxfC1frgn9TQvw==} + /@react-native/gradle-plugin@0.81.5: + resolution: {integrity: sha512-hORRlNBj+ReNMLo9jme3yQ6JQf4GZpVEBLxmTXGGlIL78MAezDZr5/uq9dwElSbcGmLEgeiax6e174Fie6qPLg==} engines: {node: '>= 20.19.4'} - /@react-native/js-polyfills@0.81.4: - resolution: {integrity: sha512-sr42FaypKXJHMVHhgSbu2f/ZJfrLzgaoQ+HdpRvKEiEh2mhFf6XzZwecyLBvWqf2pMPZa+CpPfNPiejXjKEy8w==} + /@react-native/js-polyfills@0.81.5: + resolution: {integrity: sha512-fB7M1CMOCIUudTRuj7kzxIBTVw2KXnsgbQ6+4cbqSxo8NmRRhA0Ul4ZUzZj3rFd3VznTL4Brmocv1oiN0bWZ8w==} engines: {node: '>= 20.19.4'} /@react-native/normalize-colors@0.74.89: resolution: {integrity: sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg==} dev: false - /@react-native/normalize-colors@0.81.4: - resolution: {integrity: sha512-9nRRHO1H+tcFqjb9gAM105Urtgcanbta2tuqCVY0NATHeFPDEAB7gPyiLxCHKMi1NbhP6TH0kxgSWXKZl1cyRg==} - /@react-native/normalize-colors@0.81.5: resolution: {integrity: sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==} - /@react-native/virtualized-lists@0.81.4(@types/react@19.2.14)(react-native@0.81.4)(react@19.1.0): - resolution: {integrity: sha512-hBM+rMyL6Wm1Q4f/WpqGsaCojKSNUBqAXLABNGoWm1vabZ7cSnARMxBvA/2vo3hLcoR4v7zDK8tkKm9+O0LjVA==} + /@react-native/virtualized-lists@0.81.5(@types/react@19.1.17)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-UVXgV/db25OPIvwZySeToXD/9sKKhOdkcWmmf4Jh8iBZuyfML+/5CasaZ1E7Lqg6g3uqVQq75NqIwkYmORJMPw==} engines: {node: '>= 20.19.4'} peerDependencies: '@types/react': ^19.1.0 @@ -5431,13 +5264,13 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 19.2.14 + '@types/react': 19.1.17 invariant: 2.2.4 nullthrows: 1.1.1 react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) - /@react-navigation/bottom-tabs@7.15.5(@react-native-masked-view/masked-view@0.2.9)(@react-navigation/native@7.1.33)(react-native-safe-area-context@5.6.2)(react-native-screens@4.16.0)(react-native@0.81.4)(react@19.1.0): + /@react-navigation/bottom-tabs@7.15.5(@react-native-masked-view/masked-view@0.2.9)(@react-navigation/native@7.1.33)(react-native-safe-area-context@5.6.2)(react-native-screens@4.16.0)(react-native@0.81.5)(react@19.1.0): resolution: {integrity: sha512-wQHredlCrRmShWQ1vF4HUcLdaiJ8fUgnbaeQH7BJ7MQVQh4mdzab0IOY/4QSmUyNRB350oyu1biTycyQ5FKWMQ==} peerDependencies: '@react-navigation/native': ^7.1.33 @@ -5446,13 +5279,13 @@ packages: react-native-safe-area-context: '>= 4.0.0' react-native-screens: '>= 4.0.0' dependencies: - '@react-navigation/elements': 2.9.10(@react-native-masked-view/masked-view@0.2.9)(@react-navigation/native@7.1.33)(react-native-safe-area-context@5.6.2)(react-native@0.81.4)(react@19.1.0) - '@react-navigation/native': 7.1.33(react-native@0.81.4)(react@19.1.0) + '@react-navigation/elements': 2.9.10(@react-native-masked-view/masked-view@0.2.9)(@react-navigation/native@7.1.33)(react-native-safe-area-context@5.6.2)(react-native@0.81.5)(react@19.1.0) + '@react-navigation/native': 7.1.33(react-native@0.81.5)(react@19.1.0) color: 4.2.3 react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) - react-native-safe-area-context: 5.6.2(react-native@0.81.4)(react@19.1.0) - react-native-screens: 4.16.0(react-native@0.81.4)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) + react-native-safe-area-context: 5.6.2(react-native@0.81.5)(react@19.1.0) + react-native-screens: 4.16.0(react-native@0.81.5)(react@19.1.0) sf-symbols-typescript: 2.2.0 transitivePeerDependencies: - '@react-native-masked-view/masked-view' @@ -5474,7 +5307,7 @@ packages: use-sync-external-store: 1.6.0(react@19.1.0) dev: false - /@react-navigation/elements@2.9.10(@react-native-masked-view/masked-view@0.2.9)(@react-navigation/native@7.1.33)(react-native-safe-area-context@5.6.2)(react-native@0.81.4)(react@19.1.0): + /@react-navigation/elements@2.9.10(@react-native-masked-view/masked-view@0.2.9)(@react-navigation/native@7.1.33)(react-native-safe-area-context@5.6.2)(react-native@0.81.5)(react@19.1.0): resolution: {integrity: sha512-N8tuBekzTRb0pkMHFJGvmC6Q5OisSbt6gzvw7RHMnp4NDo5auVllT12sWFaTXf8mTduaLKNSrD/NZNaOqThCBg==} peerDependencies: '@react-native-masked-view/masked-view': '>= 0.2.0' @@ -5486,17 +5319,17 @@ packages: '@react-native-masked-view/masked-view': optional: true dependencies: - '@react-native-masked-view/masked-view': 0.2.9(react-native@0.81.4)(react@19.1.0) - '@react-navigation/native': 7.1.33(react-native@0.81.4)(react@19.1.0) + '@react-native-masked-view/masked-view': 0.2.9(react-native@0.81.5)(react@19.1.0) + '@react-navigation/native': 7.1.33(react-native@0.81.5)(react@19.1.0) color: 4.2.3 react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) - react-native-safe-area-context: 5.6.2(react-native@0.81.4)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) + react-native-safe-area-context: 5.6.2(react-native@0.81.5)(react@19.1.0) use-latest-callback: 0.2.6(react@19.1.0) use-sync-external-store: 1.6.0(react@19.1.0) dev: false - /@react-navigation/elements@2.9.8(@react-native-masked-view/masked-view@0.2.9)(@react-navigation/native@7.1.33)(react-native-safe-area-context@5.6.2)(react-native@0.81.4)(react@19.1.0): + /@react-navigation/elements@2.9.8(@react-native-masked-view/masked-view@0.2.9)(@react-navigation/native@7.1.33)(react-native-safe-area-context@5.6.2)(react-native@0.81.5)(react@19.1.0): resolution: {integrity: sha512-3gpwUmVnDJYvK9nFmAA/YXw0hmT/C/lZx8RkRMK+ux9l1T+32EWnQFnn34Wa1BMDX8HN2r64yrlW93DIzKI7Uw==} peerDependencies: '@react-native-masked-view/masked-view': '>= 0.2.0' @@ -5508,17 +5341,17 @@ packages: '@react-native-masked-view/masked-view': optional: true dependencies: - '@react-native-masked-view/masked-view': 0.2.9(react-native@0.81.4)(react@19.1.0) - '@react-navigation/native': 7.1.33(react-native@0.81.4)(react@19.1.0) + '@react-native-masked-view/masked-view': 0.2.9(react-native@0.81.5)(react@19.1.0) + '@react-navigation/native': 7.1.33(react-native@0.81.5)(react@19.1.0) color: 4.2.3 react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) - react-native-safe-area-context: 5.6.2(react-native@0.81.4)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) + react-native-safe-area-context: 5.6.2(react-native@0.81.5)(react@19.1.0) use-latest-callback: 0.2.6(react@19.1.0) use-sync-external-store: 1.6.0(react@19.1.0) dev: false - /@react-navigation/native-stack@7.14.2(@react-native-masked-view/masked-view@0.2.9)(@react-navigation/native@7.1.33)(react-native-safe-area-context@5.6.2)(react-native-screens@4.16.0)(react-native@0.81.4)(react@19.1.0): + /@react-navigation/native-stack@7.14.2(@react-native-masked-view/masked-view@0.2.9)(@react-navigation/native@7.1.33)(react-native-safe-area-context@5.6.2)(react-native-screens@4.16.0)(react-native@0.81.5)(react@19.1.0): resolution: {integrity: sha512-/nKxFAFSUSGV+NSXrXXcWEcGAHdyp8RyWjoGMDzVPdBhjCLblVSgHWx5y4mm+k0de9V1pkjsftUaroP7rQckzw==} peerDependencies: '@react-navigation/native': ^7.1.31 @@ -5527,20 +5360,20 @@ packages: react-native-safe-area-context: '>= 4.0.0' react-native-screens: '>= 4.0.0' dependencies: - '@react-navigation/elements': 2.9.8(@react-native-masked-view/masked-view@0.2.9)(@react-navigation/native@7.1.33)(react-native-safe-area-context@5.6.2)(react-native@0.81.4)(react@19.1.0) - '@react-navigation/native': 7.1.33(react-native@0.81.4)(react@19.1.0) + '@react-navigation/elements': 2.9.8(@react-native-masked-view/masked-view@0.2.9)(@react-navigation/native@7.1.33)(react-native-safe-area-context@5.6.2)(react-native@0.81.5)(react@19.1.0) + '@react-navigation/native': 7.1.33(react-native@0.81.5)(react@19.1.0) color: 4.2.3 react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) - react-native-safe-area-context: 5.6.2(react-native@0.81.4)(react@19.1.0) - react-native-screens: 4.16.0(react-native@0.81.4)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) + react-native-safe-area-context: 5.6.2(react-native@0.81.5)(react@19.1.0) + react-native-screens: 4.16.0(react-native@0.81.5)(react@19.1.0) sf-symbols-typescript: 2.2.0 warn-once: 0.1.1 transitivePeerDependencies: - '@react-native-masked-view/masked-view' dev: false - /@react-navigation/native@7.1.33(react-native@0.81.4)(react@19.1.0): + /@react-navigation/native@7.1.33(react-native@0.81.5)(react@19.1.0): resolution: {integrity: sha512-DpFdWGcgLajKZ1TuIvDNQsblN2QaUFWpTQaB8v7WRP9Mix8H/6TFoIrZd93pbymI2hybd6UYrD+lI408eWVcfw==} peerDependencies: react: '>= 18.2.0' @@ -5551,7 +5384,7 @@ packages: fast-deep-equal: 3.1.3 nanoid: 3.3.11 react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) use-latest-callback: 0.2.6(react@19.1.0) dev: false @@ -5561,90 +5394,52 @@ packages: nanoid: 3.3.11 dev: false - /@sentry-internal/tracing@7.81.1: - resolution: {integrity: sha512-E5xm27xrLXL10knH2EWDQsQYh5nb4SxxZzJ3sJwDGG9XGKzBdlp20UUhKqx00wixooVX9uCj3e4Jg8SvNB1hKg==} + /@sentry-internal/tracing@7.52.0: + resolution: {integrity: sha512-o1YPcRGtC9tjeFCvWRJsbgK94zpExhzfxWaldAKvi3PuWEmPeewSdO/Q5pBIY1QonvSI+Q3gysLRcVlLYHhO5A==} engines: {node: '>=8'} dependencies: - '@sentry/core': 7.81.1 - '@sentry/types': 7.81.1 - '@sentry/utils': 7.81.1 + '@sentry/core': 7.52.0 + '@sentry/types': 7.52.0 + '@sentry/utils': 7.52.0 + tslib: 1.14.1 dev: false - /@sentry/browser@7.81.1: - resolution: {integrity: sha512-DNtS7bZEnFPKVoGazKs5wHoWC0FwsOFOOMNeDvEfouUqKKbjO7+RDHbr7H6Bo83zX4qmZWRBf8V+3n3YPIiJFw==} + /@sentry-internal/tracing@7.52.1: + resolution: {integrity: sha512-6N99rE+Ek0LgbqSzI/XpsKSLUyJjQ9nychViy+MP60p1x+hllukfTsDbNtUNrPlW0Bx+vqUrWKkAqmTFad94TQ==} engines: {node: '>=8'} dependencies: - '@sentry-internal/tracing': 7.81.1 - '@sentry/core': 7.81.1 - '@sentry/replay': 7.81.1 - '@sentry/types': 7.81.1 - '@sentry/utils': 7.81.1 + '@sentry/core': 7.52.1 + '@sentry/types': 7.52.1 + '@sentry/utils': 7.52.1 + tslib: 1.14.1 dev: false - /@sentry/cli-darwin@2.25.2: - resolution: {integrity: sha512-o1d5NnVUrc1dxDm56k7Co8tSTcOuxbApdxweVXXsiq20HblZCyIi7WxxRkAg4RfKx594sKGiw9uCVvECi+9UpA==} - engines: {node: '>=10'} - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@sentry/cli-linux-arm64@2.25.2: - resolution: {integrity: sha512-lm5jaigV6xu9Gwo0wNk+bX6yVkl5k3gNXcSXcKCISFo+Teb7Zhf9IyXANPm4VY2DdiZAjPJt8gS1bu+Mn7irtQ==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux, freebsd] - requiresBuild: true - dev: false - optional: true - - /@sentry/cli-linux-arm@2.25.2: - resolution: {integrity: sha512-n398jd87Ymejt5k/6RjCEjXAvntOWuqhBDANxzhgr5/9FzbODJ844g1mOpcxiIlduzKSzWlPbTEKQulMp2Mt4w==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux, freebsd] - requiresBuild: true - dev: false - optional: true - - /@sentry/cli-linux-i686@2.25.2: - resolution: {integrity: sha512-/YYx2gfqO5mkxyBgFcnDbZzkZ2+2xNarwrqWcqq3Qw0XlO9DWAQB2G+twV1RW/UfSU6fFIWErn94efh2EWmyzQ==} - engines: {node: '>=10'} - cpu: [x86, ia32] - os: [linux, freebsd] - requiresBuild: true - dev: false - optional: true - - /@sentry/cli-linux-x64@2.25.2: - resolution: {integrity: sha512-rRafqy84R5mYA4JEfNsUeN10af5euJnK7fgqYM0mJIaplHC2YEXT9aUYWoryWPZiYqmdNUhsA6lX7iynSW9pZw==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux, freebsd] - requiresBuild: true - dev: false - optional: true - - /@sentry/cli-win32-i686@2.25.2: - resolution: {integrity: sha512-plT/gi41F+67g9AwrEm4avRXnjCtHCcnRnJ6zPu/iINGap8mvYQJSU/qM0oGwV6hRGg3JJN66XIvJPIuIs8P8w==} - engines: {node: '>=10'} - cpu: [x86, ia32] - os: [win32] - requiresBuild: true + /@sentry/browser@7.52.0: + resolution: {integrity: sha512-Sib0T24cQCqqqAhg+nZdfI7qNYGE03jiM3RbY7yG5UoycdnJzWEwrBVSzRTgg3Uya9TRTEGJ+d9vxPIU5TL7TA==} + engines: {node: '>=8'} + dependencies: + '@sentry-internal/tracing': 7.52.0 + '@sentry/core': 7.52.0 + '@sentry/replay': 7.52.0 + '@sentry/types': 7.52.0 + '@sentry/utils': 7.52.0 + tslib: 1.14.1 dev: false - optional: true - /@sentry/cli-win32-x64@2.25.2: - resolution: {integrity: sha512-Mb6mAyPi9gIfpzF5MTk0JXgFP9nxka3Fb7JYn6AY4RW++sOjapkTrcXL2Gp3ZfQkWj5rFTgln4+eNmZPsD2gzA==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - requiresBuild: true + /@sentry/browser@7.52.1: + resolution: {integrity: sha512-HrCOfieX68t+Wj42VIkraLYwx8kN5311SdBkHccevWs2Y2dZU7R9iLbI87+nb5kpOPQ7jVWW7d6QI/yZmliYgQ==} + engines: {node: '>=8'} + dependencies: + '@sentry-internal/tracing': 7.52.1 + '@sentry/core': 7.52.1 + '@sentry/replay': 7.52.1 + '@sentry/types': 7.52.1 + '@sentry/utils': 7.52.1 + tslib: 1.14.1 dev: false - optional: true - /@sentry/cli@2.25.2: - resolution: {integrity: sha512-lgt1QPaCfs/QZNXwyw3gvuBR2/CLwFSdU/oT7Bpxwizz8XVXhlKS98zJF1UVCy7SecsDSoOI0Z+B+X658cpquQ==} + /@sentry/cli@2.17.5: + resolution: {integrity: sha512-0tXjLDpaKB46851EMJ6NbP0o9/gdEaDSLAyjEtXxlVO6+RyhUj6x6jDwn0vis8n/7q0AvbIjAcJrot+TbZP+WQ==} engines: {node: '>= 10'} hasBin: true requiresBuild: true @@ -5654,14 +5449,6 @@ packages: progress: 2.0.3 proxy-from-env: 1.1.0 which: 2.0.2 - optionalDependencies: - '@sentry/cli-darwin': 2.25.2 - '@sentry/cli-linux-arm': 2.25.2 - '@sentry/cli-linux-arm64': 2.25.2 - '@sentry/cli-linux-i686': 2.25.2 - '@sentry/cli-linux-x64': 2.25.2 - '@sentry/cli-win32-i686': 2.25.2 - '@sentry/cli-win32-x64': 2.25.2 transitivePeerDependencies: - encoding - supports-color @@ -5672,31 +5459,52 @@ packages: engines: {node: '>=18'} dev: false - /@sentry/core@7.81.1: - resolution: {integrity: sha512-tU37yAmckOGCw/moWKSwekSCWWJP15O6luIq+u7wal22hE88F3Vc5Avo8SeF3upnPR+4ejaOFH+BJTr6bgrs6Q==} + /@sentry/core@7.52.0: + resolution: {integrity: sha512-BWdG6vCMeUeMhF4ILpxXTmw70JJvT1MGJcnv09oSupWHTmqy6I19YP6YcEyFuBL4jXPN51eCl7luIdLGJrPbOg==} + engines: {node: '>=8'} + dependencies: + '@sentry/types': 7.52.0 + '@sentry/utils': 7.52.0 + tslib: 1.14.1 + dev: false + + /@sentry/core@7.52.1: + resolution: {integrity: sha512-36clugQu5z/9jrit1gzI7KfKbAUimjRab39JeR0mJ6pMuKLTTK7PhbpUAD4AQBs9qVeXN2c7h9SVZiSA0UDvkg==} + engines: {node: '>=8'} + dependencies: + '@sentry/types': 7.52.1 + '@sentry/utils': 7.52.1 + tslib: 1.14.1 + dev: false + + /@sentry/hub@7.52.0: + resolution: {integrity: sha512-w3d8Pmp3Fx2zbbjz6hAeIbsFEkLyrUs9YTGG2y8oCoTlAtGK+AjdG+Z0H/clAZONflD/je2EmFHCI0EuXE9tEw==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.81.1 - '@sentry/utils': 7.81.1 + '@sentry/core': 7.52.0 + '@sentry/types': 7.52.0 + '@sentry/utils': 7.52.0 + tslib: 1.14.1 dev: false - /@sentry/hub@7.81.1: - resolution: {integrity: sha512-25cvsI3HKiRLJBZGFC8ntuy7/yB8M1w8YLTjr3tIqydYmjFUX7f18w0iuWEtd204d8OQSPBJDapbGMdfkE5x6w==} + /@sentry/integrations@7.52.0: + resolution: {integrity: sha512-tqxYzgc71XdFD8MTCsVMCPef08lPY9jULE5Zi7TzjyV2AItDRJPkixG0qjwjOGwCtN/6KKz0lGPGYU8ZDxvsbg==} engines: {node: '>=8'} dependencies: - '@sentry/core': 7.81.1 - '@sentry/types': 7.81.1 - '@sentry/utils': 7.81.1 + '@sentry/types': 7.52.0 + '@sentry/utils': 7.52.0 + localforage: 1.10.0 + tslib: 1.14.1 dev: false - /@sentry/integrations@7.81.1: - resolution: {integrity: sha512-DN5ONn0/LX5HHVPf1EBGHFssIZaZmLgkqUIeMqCNYBpB4DiOrJANnGwTcWKDPphqhdPxjnPv9AGRLaU0PdvvZQ==} + /@sentry/integrations@7.52.1: + resolution: {integrity: sha512-4uejF01723wzEHjcP5AcNcV+Z/6U27b1LyaDu0jY3XDry98MMjhS/ASzecLpaEFxi3dh/jMTUrNp1u7WMj59Lg==} engines: {node: '>=8'} dependencies: - '@sentry/core': 7.81.1 - '@sentry/types': 7.81.1 - '@sentry/utils': 7.81.1 + '@sentry/types': 7.52.1 + '@sentry/utils': 7.52.1 localforage: 1.10.0 + tslib: 1.14.1 dev: false /@sentry/node-core@10.42.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0)(@opentelemetry/core@2.6.0)(@opentelemetry/instrumentation@0.211.0)(@opentelemetry/resources@2.6.0)(@opentelemetry/sdk-trace-base@2.6.0)(@opentelemetry/semantic-conventions@1.40.0): @@ -5799,66 +5607,97 @@ packages: '@sentry/core': 10.42.0 dev: false - /@sentry/react-native@5.17.0(expo@54.0.33)(react-native@0.81.4)(react@19.1.0): - resolution: {integrity: sha512-d0TLASMcpUtvw0A8zNznRyCskfH0kwfb3GzqMXXpfPJAG8vsBnY15EFOIc+czOLt6FbV9o3567bHYWhSW51Ssg==} - hasBin: true + /@sentry/react-native@5.5.0(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-xrES+OAIu3HFhoQSuJjd16Hh02/mByuNoKUjF7e4WDGIiTew3aqlqeLjU7x4npmg5Vbt+ND5jR12u/NmdfArwg==} peerDependencies: - expo: '>=49.0.0' react: '>=17.0.0' react-native: '>=0.65.0' - peerDependenciesMeta: - expo: - optional: true dependencies: - '@sentry/browser': 7.81.1 - '@sentry/cli': 2.25.2 - '@sentry/core': 7.81.1 - '@sentry/hub': 7.81.1 - '@sentry/integrations': 7.81.1 - '@sentry/react': 7.81.1(react@19.1.0) - '@sentry/types': 7.81.1 - '@sentry/utils': 7.81.1 - expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0) + '@sentry/browser': 7.52.0 + '@sentry/cli': 2.17.5 + '@sentry/core': 7.52.0 + '@sentry/hub': 7.52.0 + '@sentry/integrations': 7.52.0 + '@sentry/react': 7.52.0(react@19.1.0) + '@sentry/types': 7.52.0 + '@sentry/utils': 7.52.0 react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) transitivePeerDependencies: - encoding - supports-color dev: false - /@sentry/react@7.81.1(react@19.1.0): - resolution: {integrity: sha512-kk0plP/mf8KgVLOiImIpp1liYysmh3Un8uXcVAToomSuHZPGanelFAdP0XhY+0HlWU9KIfxTjhMte1iSwQ8pYw==} + /@sentry/react@7.52.0(react@19.1.0): + resolution: {integrity: sha512-VQxquyFFlvB81k7UER7tTJxjzbczNI2jqsw6nN1TVDrAIDt8/hT2x7m/M0FlWc88roBKuaMmbvzfNGWaL9abyQ==} engines: {node: '>=8'} peerDependencies: react: 15.x || 16.x || 17.x || 18.x dependencies: - '@sentry/browser': 7.81.1 - '@sentry/types': 7.81.1 - '@sentry/utils': 7.81.1 + '@sentry/browser': 7.52.0 + '@sentry/types': 7.52.0 + '@sentry/utils': 7.52.0 hoist-non-react-statics: 3.3.2 react: 19.1.0 + tslib: 1.14.1 dev: false - /@sentry/replay@7.81.1: - resolution: {integrity: sha512-4ueT0C4bYjngN/9p0fEYH10dTMLovHyk9HxJ6zSTgePvGVexhg+cSEHXisoBDwHeRZVnbIvsVM0NA7rmEDXJJw==} + /@sentry/react@7.52.1(react@19.1.0): + resolution: {integrity: sha512-RRH+GJE5TNg5QS86bSjSZuR2snpBTOO5/SU9t4BOqZMknzhMVTClGMm84hffJa9pMPMJPQ2fWQAbhrlD8RcF6w==} + engines: {node: '>=8'} + peerDependencies: + react: 15.x || 16.x || 17.x || 18.x + dependencies: + '@sentry/browser': 7.52.1 + '@sentry/types': 7.52.1 + '@sentry/utils': 7.52.1 + hoist-non-react-statics: 3.3.2 + react: 19.1.0 + tslib: 1.14.1 + dev: false + + /@sentry/replay@7.52.0: + resolution: {integrity: sha512-RRPALjDST2s7MHiMcUJ7Wo4WW7EWfUDYSG0LuhMT8DNc+ZsxQoFsLYX/yz8b3f0IUSr7xKBXP+aPeIy3jDAS2g==} + engines: {node: '>=12'} + dependencies: + '@sentry/core': 7.52.0 + '@sentry/types': 7.52.0 + '@sentry/utils': 7.52.0 + dev: false + + /@sentry/replay@7.52.1: + resolution: {integrity: sha512-A+RaUmpU9/yBHnU3ATemc6wAvobGno0yf5R6fZYkAFoo2FCR2YG6AXxkTazymIf8v2DnLGaSDORYDPdhQClU9A==} engines: {node: '>=12'} dependencies: - '@sentry-internal/tracing': 7.81.1 - '@sentry/core': 7.81.1 - '@sentry/types': 7.81.1 - '@sentry/utils': 7.81.1 + '@sentry/core': 7.52.1 + '@sentry/types': 7.52.1 + '@sentry/utils': 7.52.1 dev: false - /@sentry/types@7.81.1: - resolution: {integrity: sha512-dvJvGyctiaPMIQqa46k56Re5IODWMDxiHJ1UjBs/WYDLrmWFPGrEbyJ8w8CYLhYA+7qqrCyIZmHbWSTRIxstHw==} + /@sentry/types@7.52.0: + resolution: {integrity: sha512-XnEWpS6P6UdP1FqbmeqhI96Iowqd2jM5R7zJ97txTdAd5NmdHHH0pODTR9NiQViA1WlsXDut7ZLxgPzC9vIcMA==} engines: {node: '>=8'} dev: false - /@sentry/utils@7.81.1: - resolution: {integrity: sha512-gq+MDXIirHKxNZ+c9/lVvCXd6y2zaZANujwlFggRH2u9SRiPaIXVilLpvMm4uJqmqBMEcY81ArujExtHvkbCqg==} + /@sentry/types@7.52.1: + resolution: {integrity: sha512-OMbGBPrJsw0iEXwZ2bJUYxewI1IEAU2e1aQGc0O6QW5+6hhCh+8HO8Xl4EymqwejjztuwStkl6G1qhK+Q0/Row==} + engines: {node: '>=8'} + dev: false + + /@sentry/utils@7.52.0: + resolution: {integrity: sha512-X1NHYuqW0qpZfP731YcVe+cn36wJdAeBHPYPIkXCl4o4GePCJfH/CM/+9V9cZykNjyLrs2Xy/TavSAHNCj8j7w==} + engines: {node: '>=8'} + dependencies: + '@sentry/types': 7.52.0 + tslib: 1.14.1 + dev: false + + /@sentry/utils@7.52.1: + resolution: {integrity: sha512-MPt1Xu/jluulknW8CmZ2naJ53jEdtdwCBSo6fXJvOTI0SDqwIPbXDVrsnqLAhVJuIN7xbkj96nuY/VBR6S5sWg==} engines: {node: '>=8'} dependencies: - '@sentry/types': 7.81.1 + '@sentry/types': 7.52.1 + tslib: 1.14.1 dev: false /@sinclair/typebox@0.27.10: @@ -6396,7 +6235,7 @@ packages: tslib: 2.8.1 dev: false - /@testing-library/react-native@13.3.3(jest@29.7.0)(react-native@0.81.4)(react-test-renderer@19.1.0)(react@19.1.0): + /@testing-library/react-native@13.3.3(jest@29.7.0)(react-native@0.81.5)(react-test-renderer@19.1.0)(react@19.1.0): resolution: {integrity: sha512-k6Mjsd9dbZgvY4Bl7P1NIpePQNi+dfYtlJ5voi9KQlynxSyQkfOgJmYGCYmw/aSgH/rUcFvG8u5gd4npzgRDyg==} engines: {node: '>=18'} peerDependencies: @@ -6413,7 +6252,7 @@ packages: picocolors: 1.1.1 pretty-format: 30.2.0 react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) react-test-renderer: 19.1.0(react@19.1.0) redent: 3.0.0 dev: true @@ -6735,10 +6574,16 @@ packages: '@types/react': 19.2.14 dev: true + /@types/react@19.1.17: + resolution: {integrity: sha512-Qec1E3mhALmaspIrhWt9jkQMNdw6bReVu64mjvhbhq2NFPftLPVr+l1SZgmw/66WwBNpDh7ao5AT6gF5v41PFA==} + dependencies: + csstype: 3.2.3 + /@types/react@19.2.14: resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} dependencies: csstype: 3.2.3 + dev: true /@types/send@1.2.1: resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} @@ -6902,12 +6747,6 @@ packages: '@xtuc/long': 4.2.2 dev: true - /@xmldom/xmldom@0.7.13: - resolution: {integrity: sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==} - engines: {node: '>=10.0.0'} - deprecated: this version is no longer supported, please update to at least 0.8.* - dev: false - /@xmldom/xmldom@0.8.11: resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} engines: {node: '>=10.0.0'} @@ -7093,6 +6932,7 @@ packages: /ansi-regex@6.2.2: resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} + dev: true /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} @@ -7110,11 +6950,6 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - /ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} - dev: false - /ansis@4.2.0: resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} engines: {node: '>=14'} @@ -7184,11 +7019,6 @@ packages: /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - /at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - dev: false - /autoprefixer@10.4.27(postcss@8.5.8): resolution: {integrity: sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==} engines: {node: ^10 || ^12 || >=14} @@ -7368,7 +7198,7 @@ packages: babel-plugin-syntax-hermes-parser: 0.29.1 babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.0) debug: 4.4.3 - expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0) + expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.5)(react@19.1.0) react-refresh: 0.14.2 resolve-from: 5.0.0 transitivePeerDependencies: @@ -8077,11 +7907,6 @@ packages: shebang-command: 2.0.0 which: 2.0.2 - /crypto-random-string@2.0.0: - resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} - engines: {node: '>=8'} - dev: false - /csrf@3.1.0: resolution: {integrity: sha512-uTqEnCvWRk042asU6JtapDTcJeeailFy4ydOQS28bj1hcLnYRiqi8SsD2jS412AY1I/4qdOwWZun774iqywf9w==} engines: {node: '>= 0.8'} @@ -8338,10 +8163,6 @@ packages: es-errors: 1.3.0 gopd: 1.2.0 - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: false - /ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} dependencies: @@ -8369,10 +8190,6 @@ packages: /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: false - /empathic@2.0.0: resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} engines: {node: '>=14'} @@ -8596,39 +8413,33 @@ packages: peerDependencies: expo: '*' dependencies: - expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0) + expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.5)(react@19.1.0) dev: false - /expo-asset@12.0.12(expo@54.0.33)(react-native@0.81.4)(react@19.1.0): - resolution: {integrity: sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==} + /expo-application@7.0.8(expo@54.0.33): + resolution: {integrity: sha512-qFGyxk7VJbrNOQWBbE09XUuGuvkOgFS9QfToaK2FdagM2aQ+x3CvGV2DuVgl/l4ZxPgIf3b/MNh9xHpwSwn74Q==} peerDependencies: expo: '*' - react: '*' - react-native: '*' dependencies: - '@expo/image-utils': 0.8.12 - expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0) - expo-constants: 18.0.13(expo@54.0.33)(react-native@0.81.4) - react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) - transitivePeerDependencies: - - supports-color + expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.5)(react@19.1.0) + dev: false - /expo-constants@17.0.8(expo@54.0.33)(react-native@0.81.4): - resolution: {integrity: sha512-XfWRyQAf1yUNgWZ1TnE8pFBMqGmFP5Gb+SFSgszxDdOoheB/NI5D4p7q86kI2fvGyfTrxAe+D+74nZkfsGvUlg==} + /expo-asset@12.0.12(expo@54.0.33)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==} peerDependencies: expo: '*' + react: '*' react-native: '*' dependencies: - '@expo/config': 10.0.11 - '@expo/env': 0.4.2 - expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0) - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + '@expo/image-utils': 0.8.12 + expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.5)(react@19.1.0) + expo-constants: 18.0.13(expo@54.0.33)(react-native@0.81.5) + react: 19.1.0 + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) transitivePeerDependencies: - supports-color - dev: false - /expo-constants@18.0.13(expo@54.0.33)(react-native@0.81.4): + /expo-constants@18.0.13(expo@54.0.33)(react-native@0.81.5): resolution: {integrity: sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==} peerDependencies: expo: '*' @@ -8636,8 +8447,8 @@ packages: dependencies: '@expo/config': 12.0.13 '@expo/env': 2.0.11 - expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0) - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.5)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) transitivePeerDependencies: - supports-color @@ -8646,41 +8457,41 @@ packages: peerDependencies: expo: '*' dependencies: - expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0) + expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.5)(react@19.1.0) ua-parser-js: 0.7.41 dev: false - /expo-file-system@19.0.21(expo@54.0.33)(react-native@0.81.4): + /expo-file-system@19.0.21(expo@54.0.33)(react-native@0.81.5): resolution: {integrity: sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==} peerDependencies: expo: '*' react-native: '*' dependencies: - expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0) - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.5)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) - /expo-font@14.0.11(expo@54.0.33)(react-native@0.81.4)(react@19.1.0): + /expo-font@14.0.11(expo@54.0.33)(react-native@0.81.5)(react@19.1.0): resolution: {integrity: sha512-ga0q61ny4s/kr4k8JX9hVH69exVSIfcIc19+qZ7gt71Mqtm7xy2c6kwsPTCyhBW2Ro5yXTT8EaZOpuRi35rHbg==} peerDependencies: expo: '*' react: '*' react-native: '*' dependencies: - expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0) + expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.5)(react@19.1.0) fontfaceobserver: 2.3.0 react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) - /expo-haptics@14.0.1(expo@54.0.33): - resolution: {integrity: sha512-V81FZ7xRUfqM6uSI6FA1KnZ+QpEKnISqafob/xEfcx1ymwhm4V3snuLWWFjmAz+XaZQTqlYa8z3QbqEXz7G63w==} + /expo-haptics@15.0.8(expo@54.0.33): + resolution: {integrity: sha512-lftutojy8Qs8zaDzzjwM3gKHFZ8bOOEZDCkmh2Ddpe95Ra6kt2izeOfOfKuP/QEh0MZ1j9TfqippyHdRd1ZM9g==} peerDependencies: expo: '*' dependencies: - expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0) + expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.5)(react@19.1.0) dev: false - /expo-image@2.4.1(expo@54.0.33)(react-native-web@0.21.2)(react-native@0.81.4)(react@19.1.0): - resolution: {integrity: sha512-yHp0Cy4ylOYyLR21CcH6i70DeRyLRPc0yAIPFPn4BT/BpkJNaX5QMXDppcHa58t4WI3Bb8QRJRLuAQaeCtDF8A==} + /expo-image@3.0.11(expo@54.0.33)(react-native-web@0.21.2)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-4TudfUCLgYgENv+f48omnU8tjS2S0Pd9EaON5/s1ZUBRwZ7K8acEr4NfvLPSaeXvxW24iLAiyQ7sV7BXQH3RoA==} peerDependencies: expo: '*' react: '*' @@ -8690,9 +8501,9 @@ packages: react-native-web: optional: true dependencies: - expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0) + expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.5)(react@19.1.0) react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) react-native-web: 0.21.2(react-dom@19.1.0)(react@19.1.0) dev: false @@ -8702,19 +8513,19 @@ packages: expo: '*' react: '*' dependencies: - expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0) + expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.5)(react@19.1.0) react: 19.1.0 - /expo-linear-gradient@14.1.5(expo@54.0.33)(react-native@0.81.4)(react@19.1.0): - resolution: {integrity: sha512-BSN3MkSGLZoHMduEnAgfhoj3xqcDWaoICgIr4cIYEx1GcHfKMhzA/O4mpZJ/WC27BP1rnAqoKfbclk1eA70ndQ==} + /expo-linear-gradient@15.0.8(expo@54.0.33)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-V2d8Wjn0VzhPHO+rrSBtcl+Fo+jUUccdlmQ6OoL9/XQB7Qk3d9lYrqKDJyccwDxmQT10JdST3Tmf2K52NLc3kw==} peerDependencies: expo: '*' react: '*' react-native: '*' dependencies: - expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0) + expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.5)(react@19.1.0) react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) dev: false /expo-modules-autolinking@3.0.24: @@ -8727,7 +8538,7 @@ packages: require-from-string: 2.0.2 resolve-from: 5.0.0 - /expo-modules-core@3.0.29(react-native@0.81.4)(react@19.1.0): + /expo-modules-core@3.0.29(react-native@0.81.5)(react@19.1.0): resolution: {integrity: sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==} peerDependencies: react: '*' @@ -8735,25 +8546,25 @@ packages: dependencies: invariant: 2.2.4 react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) - /expo-notifications@0.29.14(expo@54.0.33)(react-native@0.81.4)(react@19.1.0): - resolution: {integrity: sha512-AVduNx9mKOgcAqBfrXS1OHC9VAQZrDQLbVbcorMjPDGXW7m0Q5Q+BG6FYM/saVviF2eO8fhQRsTT40yYv5/bhQ==} + /expo-notifications@0.32.16(expo@54.0.33)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-QQD/UA6v7LgvwIJ+tS7tSvqJZkdp0nCSj9MxsDk/jU1GttYdK49/5L2LvE/4U0H7sNBz1NZAyhDZozg8xgBLXw==} peerDependencies: expo: '*' react: '*' react-native: '*' dependencies: - '@expo/image-utils': 0.6.5 + '@expo/image-utils': 0.8.12 '@ide/backoff': 1.0.0 abort-controller: 3.0.0 assert: 2.1.0 badgin: 1.2.3 - expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0) - expo-application: 6.0.2(expo@54.0.33) - expo-constants: 17.0.8(expo@54.0.33)(react-native@0.81.4) + expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.5)(react@19.1.0) + expo-application: 7.0.8(expo@54.0.33) + expo-constants: 18.0.13(expo@54.0.33)(react-native@0.81.5) react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) transitivePeerDependencies: - supports-color dev: false @@ -8763,7 +8574,7 @@ packages: peerDependencies: expo: '*' dependencies: - expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0) + expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.5)(react@19.1.0) dev: false /expo-server-sdk@3.15.0: @@ -8780,18 +8591,18 @@ packages: resolution: {integrity: sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==} engines: {node: '>=20.16.0'} - /expo-status-bar@3.0.9(react-native@0.81.4)(react@19.1.0): + /expo-status-bar@3.0.9(react-native@0.81.5)(react@19.1.0): resolution: {integrity: sha512-xyYyVg6V1/SSOZWh4Ni3U129XHCnFHBTcUo0dhWtFDrZbNp/duw5AGsQfb2sVeU0gxWHXSY1+5F0jnKYC7WuOw==} peerDependencies: react: '*' react-native: '*' dependencies: react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) - react-native-is-edge-to-edge: 1.3.1(react-native@0.81.4)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) + react-native-is-edge-to-edge: 1.3.1(react-native@0.81.5)(react@19.1.0) dev: false - /expo@54.0.33(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0): + /expo@54.0.33(@babel/core@7.29.0)(react-native@0.81.5)(react@19.1.0): resolution: {integrity: sha512-3yOEfAKqo+gqHcV8vKcnq0uA5zxlohnhA3fu4G43likN8ct5ZZ3LjAh9wDdKteEkoad3tFPvwxmXW711S5OHUw==} hasBin: true peerDependencies: @@ -8809,26 +8620,26 @@ packages: optional: true dependencies: '@babel/runtime': 7.28.6 - '@expo/cli': 54.0.23(expo@54.0.33)(react-native@0.81.4) + '@expo/cli': 54.0.23(expo@54.0.33)(react-native@0.81.5) '@expo/config': 12.0.13 '@expo/config-plugins': 54.0.4 - '@expo/devtools': 0.1.8(react-native@0.81.4)(react@19.1.0) + '@expo/devtools': 0.1.8(react-native@0.81.5)(react@19.1.0) '@expo/fingerprint': 0.15.4 '@expo/metro': 54.2.0 '@expo/metro-config': 54.0.14(expo@54.0.33) - '@expo/vector-icons': 15.1.1(expo-font@14.0.11)(react-native@0.81.4)(react@19.1.0) + '@expo/vector-icons': 15.1.1(expo-font@14.0.11)(react-native@0.81.5)(react@19.1.0) '@ungap/structured-clone': 1.3.0 babel-preset-expo: 54.0.10(@babel/core@7.29.0)(@babel/runtime@7.28.6)(expo@54.0.33)(react-refresh@0.14.2) - expo-asset: 12.0.12(expo@54.0.33)(react-native@0.81.4)(react@19.1.0) - expo-constants: 18.0.13(expo@54.0.33)(react-native@0.81.4) - expo-file-system: 19.0.21(expo@54.0.33)(react-native@0.81.4) - expo-font: 14.0.11(expo@54.0.33)(react-native@0.81.4)(react@19.1.0) + expo-asset: 12.0.12(expo@54.0.33)(react-native@0.81.5)(react@19.1.0) + expo-constants: 18.0.13(expo@54.0.33)(react-native@0.81.5) + expo-file-system: 19.0.21(expo@54.0.33)(react-native@0.81.5) + expo-font: 14.0.11(expo@54.0.33)(react-native@0.81.5)(react@19.1.0) expo-keep-awake: 15.0.8(expo@54.0.33)(react@19.1.0) expo-modules-autolinking: 3.0.24 - expo-modules-core: 3.0.29(react-native@0.81.4)(react@19.1.0) + expo-modules-core: 3.0.29(react-native@0.81.5)(react@19.1.0) pretty-format: 29.7.0 react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) react-refresh: 0.14.2 whatwg-url-without-unicode: 8.0.0-3 transitivePeerDependencies: @@ -9049,14 +8860,6 @@ packages: is-callable: 1.2.7 dev: false - /foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - dev: false - /fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.104.1): resolution: {integrity: sha512-mpafl89VFPJmhnJ1ssH+8wmM2b50n+Rew5x42NeI2U78aRWgtkEtGmctp7iT16UjquJTjorEmIfESj3DxdW84Q==} engines: {node: '>=14.21.3'} @@ -9144,16 +8947,6 @@ packages: universalify: 2.0.1 dev: true - /fs-extra@9.0.0: - resolution: {integrity: sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==} - engines: {node: '>=10'} - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.2.0 - universalify: 1.0.0 - dev: false - /fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -9271,11 +9064,6 @@ packages: engines: {node: '>=10'} dev: true - /getenv@1.0.0: - resolution: {integrity: sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==} - engines: {node: '>=6'} - dev: false - /getenv@2.0.0: resolution: {integrity: sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==} engines: {node: '>=6'} @@ -9310,19 +9098,6 @@ packages: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} dev: true - /glob@10.5.0: - resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - hasBin: true - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.9 - minipass: 7.1.3 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - dev: false - /glob@13.0.0: resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} engines: {node: 20 || >=22} @@ -9844,14 +9619,6 @@ packages: resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} engines: {node: '>=6'} - /jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - dev: false - /jest-changed-files@29.7.0: resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10031,7 +9798,7 @@ packages: jest-mock: 29.7.0 jest-util: 29.7.0 - /jest-expo@54.0.17(@babel/core@7.29.0)(expo@54.0.33)(jest@29.7.0)(react-native@0.81.4)(react@19.1.0): + /jest-expo@54.0.17(@babel/core@7.29.0)(expo@54.0.33)(jest@29.7.0)(react-native@0.81.5)(react@19.1.0): resolution: {integrity: sha512-LyIhrsP4xvHEEcR1R024u/LBj3uPpAgB+UljgV+YXWkEHjprnr0KpE4tROsMNYCVTM1pPlAnPuoBmn5gnAN9KA==} hasBin: true peerDependencies: @@ -10047,14 +9814,14 @@ packages: '@jest/create-cache-key-function': 29.7.0 '@jest/globals': 29.7.0 babel-jest: 29.7.0(@babel/core@7.29.0) - expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0) + expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.5)(react@19.1.0) jest-environment-jsdom: 29.7.0 jest-snapshot: 29.7.0 jest-watch-select-projects: 2.0.0 jest-watch-typeahead: 2.2.1(jest@29.7.0) json5: 2.2.3 lodash: 4.17.23 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) react-test-renderer: 19.1.0(react@19.1.0) server-only: 0.0.1 stacktrace-js: 2.0.2 @@ -10478,6 +10245,7 @@ packages: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 + dev: true /jsonwebtoken@9.0.3: resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} @@ -10751,10 +10519,10 @@ packages: dependencies: js-tokens: 4.0.0 - /lottie-react-native@7.2.5(react-native@0.81.4)(react@19.1.0): - resolution: {integrity: sha512-S90gdsQ71PCG9r2OW01guA2mlHAiWDrYQ0acLa6mzf4q8y8RTlug3cL/eFHKxkmSgyy+unEBdPUcii+3YNWktA==} + /lottie-react-native@7.3.6(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-TevFHRvFURh6GlaqLKrSNXuKAxvBvFCiXfS7FXQI1K/ikOStgAwWLFPGjW0i1qB2/VzPACKmRs+535VjHUZZZQ==} peerDependencies: - '@lottiefiles/dotlottie-react': ^0.6.5 + '@lottiefiles/dotlottie-react': ^0.13.5 react: '*' react-native: '>=0.46' react-native-windows: '>=0.63.x' @@ -10765,7 +10533,7 @@ packages: optional: true dependencies: react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) dev: false /lru-cache@10.4.3: @@ -11777,10 +11545,6 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - /package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - dev: false - /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -11873,14 +11637,6 @@ packages: /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - /path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.3 - dev: false - /path-scurry@2.0.2: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} @@ -12384,7 +12140,7 @@ packages: /react-is@19.2.4: resolution: {integrity: sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==} - /react-native-gesture-handler@2.28.0(react-native@0.81.4)(react@19.1.0): + /react-native-gesture-handler@2.28.0(react-native@0.81.5)(react@19.1.0): resolution: {integrity: sha512-0msfJ1vRxXKVgTgvL+1ZOoYw3/0z1R+Ked0+udoJhyplC2jbVKIJ8Z1bzWdpQRCV3QcQ87Op0zJVE5DhKK2A0A==} peerDependencies: react: '*' @@ -12394,30 +12150,30 @@ packages: hoist-non-react-statics: 3.3.2 invariant: 2.2.4 react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) dev: false - /react-native-is-edge-to-edge@1.3.1(react-native@0.81.4)(react@19.1.0): + /react-native-is-edge-to-edge@1.3.1(react-native@0.81.5)(react@19.1.0): resolution: {integrity: sha512-NIXU/iT5+ORyCc7p0z2nnlkouYKX425vuU1OEm6bMMtWWR9yvb+Xg5AZmImTKoF9abxCPqrKC3rOZsKzUYgYZA==} peerDependencies: react: '*' react-native: '*' dependencies: react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) dev: false - /react-native-linear-gradient@2.8.3(react-native@0.81.4)(react@19.1.0): + /react-native-linear-gradient@2.8.3(react-native@0.81.5)(react@19.1.0): resolution: {integrity: sha512-KflAXZcEg54PXkLyflaSZQ3PJp4uC4whM7nT/Uot9m0e/qxFV3p6uor1983D1YOBJbJN7rrWdqIjq0T42jOJyA==} peerDependencies: react: '*' react-native: '*' dependencies: react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) dev: false - /react-native-paper@5.15.0(react-native-safe-area-context@5.6.2)(react-native@0.81.4)(react@19.1.0): + /react-native-paper@5.15.0(react-native-safe-area-context@5.6.2)(react-native@0.81.5)(react@19.1.0): resolution: {integrity: sha512-I/1CQLfW9VM0Oo5I5dQI/hjgf1I6q2S1wwgzAdsv6whAQ3zO97GWHwtgNh9se9j8zBOJ86afPTQKxxUL0IJd9A==} peerDependencies: react: '*' @@ -12427,12 +12183,12 @@ packages: '@callstack/react-theme-provider': 3.0.9(react@19.1.0) color: 3.2.1 react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) - react-native-safe-area-context: 5.6.2(react-native@0.81.4)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) + react-native-safe-area-context: 5.6.2(react-native@0.81.5)(react@19.1.0) use-latest-callback: 0.2.6(react@19.1.0) dev: false - /react-native-reanimated@4.1.6(@babel/core@7.29.0)(react-native-worklets@0.5.1)(react-native@0.81.4)(react@19.1.0): + /react-native-reanimated@4.1.6(@babel/core@7.29.0)(react-native-worklets@0.5.1)(react-native@0.81.5)(react@19.1.0): resolution: {integrity: sha512-F+ZJBYiok/6Jzp1re75F/9aLzkgoQCOh4yxrnwATa8392RvM3kx+fiXXFvwcgE59v48lMwd9q0nzF1oJLXpfxQ==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -12442,23 +12198,23 @@ packages: dependencies: '@babel/core': 7.29.0 react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) - react-native-is-edge-to-edge: 1.3.1(react-native@0.81.4)(react@19.1.0) - react-native-worklets: 0.5.1(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) + react-native-is-edge-to-edge: 1.3.1(react-native@0.81.5)(react@19.1.0) + react-native-worklets: 0.5.1(@babel/core@7.29.0)(react-native@0.81.5)(react@19.1.0) semver: 7.7.2 dev: false - /react-native-safe-area-context@5.6.2(react-native@0.81.4)(react@19.1.0): + /react-native-safe-area-context@5.6.2(react-native@0.81.5)(react@19.1.0): resolution: {integrity: sha512-4XGqMNj5qjUTYywJqpdWZ9IG8jgkS3h06sfVjfw5yZQZfWnRFXczi0GnYyFyCc2EBps/qFmoCH8fez//WumdVg==} peerDependencies: react: '*' react-native: '*' dependencies: react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) dev: false - /react-native-screens@4.16.0(react-native@0.81.4)(react@19.1.0): + /react-native-screens@4.16.0(react-native@0.81.5)(react@19.1.0): resolution: {integrity: sha512-yIAyh7F/9uWkOzCi1/2FqvNvK6Wb9Y1+Kzn16SuGfN9YFJDTbwlzGRvePCNTOX0recpLQF3kc2FmvMUhyTCH1Q==} peerDependencies: react: '*' @@ -12466,12 +12222,12 @@ packages: dependencies: react: 19.1.0 react-freeze: 1.0.4(react@19.1.0) - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) - react-native-is-edge-to-edge: 1.3.1(react-native@0.81.4)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) + react-native-is-edge-to-edge: 1.3.1(react-native@0.81.5)(react@19.1.0) warn-once: 0.1.1 dev: false - /react-native-skeleton-placeholder@5.2.4(@react-native-masked-view/masked-view@0.2.9)(react-native-linear-gradient@2.8.3)(react-native@0.81.4)(react@19.1.0): + /react-native-skeleton-placeholder@5.2.4(@react-native-masked-view/masked-view@0.2.9)(react-native-linear-gradient@2.8.3)(react-native@0.81.5)(react@19.1.0): resolution: {integrity: sha512-OZntVq1hU1UX33FltxK2ezT2v9vHIhV8YnEbnMWUCvxT0N9OsgD1qxiHm6qb9YRJVgq2o5z3S7dNPsPnDF/jNg==} peerDependencies: '@react-native-masked-view/masked-view': ^0.2.8 @@ -12479,10 +12235,10 @@ packages: react-native: '>=0.50.1' react-native-linear-gradient: ^2.5.6 dependencies: - '@react-native-masked-view/masked-view': 0.2.9(react-native@0.81.4)(react@19.1.0) + '@react-native-masked-view/masked-view': 0.2.9(react-native@0.81.5)(react@19.1.0) react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) - react-native-linear-gradient: 2.8.3(react-native@0.81.4)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) + react-native-linear-gradient: 2.8.3(react-native@0.81.5)(react@19.1.0) dev: false /react-native-web@0.21.2(react-dom@19.1.0)(react@19.1.0): @@ -12505,7 +12261,7 @@ packages: - encoding dev: false - /react-native-worklets@0.5.1(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0): + /react-native-worklets@0.5.1(@babel/core@7.29.0)(react-native@0.81.5)(react@19.1.0): resolution: {integrity: sha512-lJG6Uk9YuojjEX/tQrCbcbmpdLCSFxDK1rJlkDhgqkVi1KZzG7cdcBFQRqyNOOzR9Y0CXNuldmtWTGOyM0k0+w==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -12524,14 +12280,14 @@ packages: '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) convert-source-map: 2.0.0 react: 19.1.0 - react-native: 0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0) + react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0) semver: 7.7.2 transitivePeerDependencies: - supports-color dev: false - /react-native@0.81.4(@babel/core@7.29.0)(@types/react@19.2.14)(react@19.1.0): - resolution: {integrity: sha512-bt5bz3A/+Cv46KcjV0VQa+fo7MKxs17RCcpzjftINlen4ZDUl0I6Ut+brQ2FToa5oD0IB0xvQHfmsg2EDqsZdQ==} + /react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(react@19.1.0): + resolution: {integrity: sha512-1w+/oSjEXZjMqsIvmkCRsOc8UBYv163bTWKTI8+1mxztvQPhCRYGTvZ/PL1w16xXHneIj/SLGfxWg2GWN2uexw==} engines: {node: '>= 20.19.4'} hasBin: true peerDependencies: @@ -12542,14 +12298,14 @@ packages: optional: true dependencies: '@jest/create-cache-key-function': 29.7.0 - '@react-native/assets-registry': 0.81.4 - '@react-native/codegen': 0.81.4(@babel/core@7.29.0) - '@react-native/community-cli-plugin': 0.81.4 - '@react-native/gradle-plugin': 0.81.4 - '@react-native/js-polyfills': 0.81.4 - '@react-native/normalize-colors': 0.81.4 - '@react-native/virtualized-lists': 0.81.4(@types/react@19.2.14)(react-native@0.81.4)(react@19.1.0) - '@types/react': 19.2.14 + '@react-native/assets-registry': 0.81.5 + '@react-native/codegen': 0.81.5(@babel/core@7.29.0) + '@react-native/community-cli-plugin': 0.81.5 + '@react-native/gradle-plugin': 0.81.5 + '@react-native/js-polyfills': 0.81.5 + '@react-native/normalize-colors': 0.81.5 + '@react-native/virtualized-lists': 0.81.5(@types/react@19.1.17)(react-native@0.81.5)(react@19.1.0) + '@types/react': 19.1.17 abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 @@ -12925,8 +12681,8 @@ packages: transitivePeerDependencies: - supports-color - /sentry-expo@7.2.0(expo-application@6.0.2)(expo-constants@18.0.13)(expo-device@55.0.9)(expo@54.0.33)(react-native@0.81.4)(react@19.1.0): - resolution: {integrity: sha512-stVE2B1RgHxpcup8XU1UIGhoI3cta63guExInl6WYx3d5HsvIu8PZ0yDJnJGflYi9cKPAUCxErIQXMTrS0JQEw==} + /sentry-expo@7.0.1(expo-application@6.0.2)(expo-constants@18.0.13)(expo-device@55.0.9)(expo@54.0.33)(react-native@0.81.5)(react@19.1.0): + resolution: {integrity: sha512-8vmOy4R+qM1peQA9EP8rDGUMBhgMU1D5FyuWY9kfNGatmWuvEmlZpVgaXoXaNPIhPgf2TMrvQIlbqLHtTkoeSA==} peerDependencies: expo: '>=47.0.0' expo-application: '*' @@ -12934,13 +12690,13 @@ packages: expo-device: '*' dependencies: '@expo/spawn-async': 1.7.2 - '@sentry/integrations': 7.81.1 - '@sentry/react': 7.81.1(react@19.1.0) - '@sentry/react-native': 5.17.0(expo@54.0.33)(react-native@0.81.4)(react@19.1.0) - '@sentry/types': 7.81.1 - expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.4)(react@19.1.0) + '@sentry/integrations': 7.52.1 + '@sentry/react': 7.52.1(react@19.1.0) + '@sentry/react-native': 5.5.0(react-native@0.81.5)(react@19.1.0) + '@sentry/types': 7.52.1 + expo: 54.0.33(@babel/core@7.29.0)(react-native@0.81.5)(react@19.1.0) expo-application: 6.0.2(expo@54.0.33) - expo-constants: 18.0.13(expo@54.0.33)(react-native@0.81.4) + expo-constants: 18.0.13(expo@54.0.33)(react-native@0.81.5) expo-device: 55.0.9(expo@54.0.33) mkdirp: 1.0.4 rimraf: 3.0.2 @@ -13106,6 +12862,7 @@ packages: /signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + dev: true /simple-plist@1.3.1: resolution: {integrity: sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==} @@ -13313,15 +13070,6 @@ packages: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.2.0 - dev: false - /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: @@ -13344,6 +13092,7 @@ packages: engines: {node: '>=12'} dependencies: ansi-regex: 6.2.2 + dev: true /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} @@ -13423,20 +13172,6 @@ packages: resolution: {integrity: sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA==} dev: false - /sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - commander: 4.1.1 - glob: 10.5.0 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.7 - ts-interface-checker: 0.1.13 - dev: false - /sucrase@3.35.1: resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} engines: {node: '>=16 || 14 >=14.17'} @@ -13554,11 +13289,6 @@ packages: bintrees: 1.0.2 dev: false - /temp-dir@2.0.0: - resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} - engines: {node: '>=8'} - dev: false - /terminal-link@2.1.1: resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} engines: {node: '>=8'} @@ -13775,6 +13505,10 @@ packages: strip-bom: 3.0.0 dev: true + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: false + /tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -13948,26 +13682,15 @@ packages: resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} engines: {node: '>=4'} - /unique-string@2.0.0: - resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} - engines: {node: '>=8'} - dependencies: - crypto-random-string: 2.0.0 - dev: false - /universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} dev: true - /universalify@1.0.0: - resolution: {integrity: sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==} - engines: {node: '>= 10.0.0'} - dev: false - /universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} + dev: true /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} @@ -14253,26 +13976,9 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - dependencies: - ansi-styles: 6.2.3 - string-width: 5.1.2 - strip-ansi: 7.2.0 - dev: false - /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - /write-file-atomic@2.4.3: - resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} - dependencies: - graceful-fs: 4.2.11 - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - dev: false - /write-file-atomic@4.0.2: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -14352,11 +14058,6 @@ packages: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} - /xmlbuilder@14.0.0: - resolution: {integrity: sha512-ts+B2rSe4fIckR6iquDjsKbQFK2NlUk6iG5nf14mDEyldgoc2nEKZ3jZWMPTxGQwVgToSjt6VGIho1H8/fNFTg==} - engines: {node: '>=8.0'} - dev: false - /xmlbuilder@15.1.1: resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} engines: {node: '>=8.0'} @@ -14424,7 +14125,7 @@ packages: engines: {node: '>=18'} dev: true - /zustand@5.0.11(@types/react@19.2.14)(react@19.1.0): + /zustand@5.0.11(@types/react@19.1.17)(react@19.1.0): resolution: {integrity: sha512-fdZY+dk7zn/vbWNCYmzZULHRrss0jx5pPFiOuMZ/5HJN6Yv3u+1Wswy/4MpZEkEGhtNH+pwxZB8OKgUBPzYAGg==} engines: {node: '>=12.20.0'} peerDependencies: @@ -14442,6 +14143,6 @@ packages: use-sync-external-store: optional: true dependencies: - '@types/react': 19.2.14 + '@types/react': 19.1.17 react: 19.1.0 dev: false