diff --git a/electron/src/preload.ts b/electron/src/preload.ts index e06a63cb..5e5eb28d 100644 --- a/electron/src/preload.ts +++ b/electron/src/preload.ts @@ -7,20 +7,64 @@ import { contextBridge, ipcRenderer } from 'electron'; -// Enhanced logger for preload script +// Enhanced logger for preload script that forwards to main process const logger = { - log: (...args: unknown[]) => console.log('[Preload]', ...args), - error: (...args: unknown[]) => console.error('[Preload]', ...args), - info: (...args: unknown[]) => console.info('[Preload]', ...args), - warn: (...args: unknown[]) => console.warn('[Preload]', ...args), - debug: (...args: unknown[]) => console.debug('[Preload]', ...args), + log: (...args: unknown[]) => { + console.log('[Preload]', ...args); + ipcRenderer.send('renderer-log', { level: 'log', args }); + }, + error: (...args: unknown[]) => { + console.error('[Preload]', ...args); + ipcRenderer.send('renderer-log', { level: 'error', args }); + }, + info: (...args: unknown[]) => { + console.info('[Preload]', ...args); + ipcRenderer.send('renderer-log', { level: 'info', args }); + }, + warn: (...args: unknown[]) => { + console.warn('[Preload]', ...args); + ipcRenderer.send('renderer-log', { level: 'warn', args }); + }, + debug: (...args: unknown[]) => { + console.debug('[Preload]', ...args); + ipcRenderer.send('renderer-log', { level: 'debug', args }); + }, sqlite: { - log: (operation: string, ...args: unknown[]) => - console.log('[Preload][SQLite]', operation, ...args), - error: (operation: string, error: unknown) => - console.error('[Preload][SQLite]', operation, 'failed:', error), - debug: (operation: string, ...args: unknown[]) => - console.debug('[Preload][SQLite]', operation, ...args) + log: (operation: string, ...args: unknown[]) => { + const message = ['[Preload][SQLite]', operation, ...args]; + console.log(...message); + ipcRenderer.send('renderer-log', { + level: 'log', + args: message, + source: 'sqlite', + operation + }); + }, + error: (operation: string, error: unknown) => { + const message = ['[Preload][SQLite]', operation, 'failed:', error]; + console.error(...message); + ipcRenderer.send('renderer-log', { + level: 'error', + args: message, + source: 'sqlite', + operation, + error: error instanceof Error ? { + name: error.name, + message: error.message, + stack: error.stack + } : error + }); + }, + debug: (operation: string, ...args: unknown[]) => { + const message = ['[Preload][SQLite]', operation, ...args]; + console.debug(...message); + ipcRenderer.send('renderer-log', { + level: 'debug', + args: message, + source: 'sqlite', + operation + }); + } } }; @@ -123,24 +167,94 @@ const createSQLiteProxy = () => { const withRetry = async (operation: string, ...args: unknown[]): Promise => { let lastError: Error | undefined; + const operationId = `${operation}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`; + const startTime = Date.now(); + + logger.sqlite.debug(operation, 'starting with args:', { + operationId, + args, + timestamp: new Date().toISOString() + }); for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) { try { - logger.sqlite.debug(operation, 'attempt', attempt, args); + logger.sqlite.debug(operation, `attempt ${attempt}/${MAX_RETRIES}`, { + operationId, + attempt, + args, + timestamp: new Date().toISOString() + }); + + // Log the exact IPC call + logger.sqlite.debug(operation, 'invoking IPC', { + operationId, + channel: `sqlite-${operation}`, + args, + timestamp: new Date().toISOString() + }); + const result = await ipcRenderer.invoke(`sqlite-${operation}`, ...args); - logger.sqlite.log(operation, 'success', result); + + const duration = Date.now() - startTime; + logger.sqlite.log(operation, 'success', { + operationId, + attempt, + result, + duration: `${duration}ms`, + timestamp: new Date().toISOString() + }); + return result as T; } catch (error) { + const duration = Date.now() - startTime; lastError = error instanceof Error ? error : new Error(String(error)); - logger.sqlite.error(operation, error); + + logger.sqlite.error(operation, { + operationId, + attempt, + error: { + name: lastError.name, + message: lastError.message, + stack: lastError.stack + }, + args, + duration: `${duration}ms`, + timestamp: new Date().toISOString() + }); + if (attempt < MAX_RETRIES) { - logger.warn(`[Preload] SQLite ${operation} failed (attempt ${attempt}/${MAX_RETRIES}), retrying...`, error); - await new Promise(resolve => setTimeout(resolve, RETRY_DELAY)); + const backoffDelay = RETRY_DELAY * Math.pow(2, attempt - 1); + logger.warn(`[Preload] SQLite ${operation} failed (attempt ${attempt}/${MAX_RETRIES}), retrying in ${backoffDelay}ms...`, { + operationId, + error: lastError, + args, + nextAttemptIn: `${backoffDelay}ms`, + timestamp: new Date().toISOString() + }); + await new Promise(resolve => setTimeout(resolve, backoffDelay)); } } } - throw new Error(`SQLite ${operation} failed after ${MAX_RETRIES} attempts: ${lastError?.message || "Unknown error"}`); + const finalError = new Error( + `SQLite ${operation} failed after ${MAX_RETRIES} attempts: ${lastError?.message || "Unknown error"}` + ); + + logger.error('[Preload] SQLite operation failed permanently:', { + operation, + operationId, + error: { + name: finalError.name, + message: finalError.message, + stack: finalError.stack, + originalError: lastError + }, + args, + attempts: MAX_RETRIES, + timestamp: new Date().toISOString() + }); + + throw finalError; }; return { diff --git a/electron/src/rt/logger.ts b/electron/src/rt/logger.ts index 9af34952..ced36283 100644 --- a/electron/src/rt/logger.ts +++ b/electron/src/rt/logger.ts @@ -6,6 +6,7 @@ * @author Matthew Raymer */ +import { app, ipcMain } from 'electron'; import winston from 'winston'; import path from 'path'; import os from 'os'; @@ -29,10 +30,10 @@ declare module 'winston' { } } -// Ensure log directory exists -const logDir = path.join(os.homedir(), 'Logs', 'TimeSafari'); -if (!fs.existsSync(logDir)) { - fs.mkdirSync(logDir, { recursive: true, mode: 0o755 }); +// Create logs directory if it doesn't exist +const logsDir = path.join(app.getPath('userData'), 'logs'); +if (!fs.existsSync(logsDir)) { + fs.mkdirSync(logsDir, { recursive: true }); } // Custom format for console output with migration filtering @@ -63,7 +64,7 @@ const fileFormat = winston.format.combine( ); // Create logger instance -export const logger = winston.createLogger({ +const logger = winston.createLogger({ level: process.env.NODE_ENV === 'development' ? 'debug' : 'info', format: fileFormat, defaultMeta: { service: 'timesafari-electron' }, @@ -76,14 +77,14 @@ export const logger = winston.createLogger({ }), // File transport for all logs new winston.transports.File({ - filename: path.join(logDir, 'error.log'), + filename: path.join(logsDir, 'error.log'), level: 'error', maxsize: 5242880, // 5MB maxFiles: 5 }), // File transport for all logs including debug new winston.transports.File({ - filename: path.join(logDir, 'combined.log'), + filename: path.join(logsDir, 'combined.log'), maxsize: 5242880, // 5MB maxFiles: 5 }) @@ -150,5 +151,38 @@ logger.migration = { } }; +// Add renderer log handler +ipcMain.on('renderer-log', (_event, { level, args, source, operation, error }) => { + const message = args.map((arg: unknown) => + typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg) + ).join(' '); + + const meta = { + source: source || 'renderer', + ...(operation && { operation }), + ...(error && { error }) + }; + + switch (level) { + case 'error': + logger.error(message, meta); + break; + case 'warn': + logger.warn(message, meta); + break; + case 'info': + logger.info(message, meta); + break; + case 'debug': + logger.debug(message, meta); + break; + default: + logger.log(level, message, meta); + } +}); + // Export logger instance -export default logger; \ No newline at end of file +export { logger }; + +// Export a function to get the logs directory +export const getLogsDirectory = () => logsDir; \ No newline at end of file diff --git a/electron/src/rt/sqlite-init.ts b/electron/src/rt/sqlite-init.ts index 16468208..122fb5b6 100644 --- a/electron/src/rt/sqlite-init.ts +++ b/electron/src/rt/sqlite-init.ts @@ -92,6 +92,7 @@ let transactionState: TransactionState = { const MAX_RECOVERY_ATTEMPTS = 3; const RECOVERY_DELAY_MS = 1000; const VERIFICATION_TIMEOUT_MS = 5000; +const LOCK_TIMEOUT_MS = 10000; // Added for the new sqlite-run handler // Type definitions for SQLite operations interface SQLiteConnectionOptions { @@ -105,6 +106,7 @@ interface SQLiteConnectionOptions { } interface SQLiteQueryOptions { + database: string; statement: string; values?: unknown[]; } @@ -619,19 +621,102 @@ const cleanupSQLiteHandlers = (): void => { registeredHandlers.clear(); }; -/** - * Registers an IPC handler with tracking - * @param channel The IPC channel to register - * @param handler The handler function - */ +// Add at the top of the file after imports +const stringifyObject = (obj: unknown): string => { + try { + return JSON.stringify(obj, null, 2); + } catch (error) { + return `[Object could not be stringified: ${error instanceof Error ? error.message : String(error)}]`; + } +}; + +// Update the registerHandler function const registerHandler = (channel: string, handler: (...args: any[]) => Promise): void => { + logger.info(`[IPC:${channel}] Registering handler`, { + channel, + timestamp: new Date().toISOString(), + existingHandler: registeredHandlers.has(channel) + }); + if (registeredHandlers.has(channel)) { - logger.debug(`Handler already registered for channel: ${channel}, removing first`); - ipcMain.removeHandler(channel); + logger.warn(`[IPC:${channel}] Handler already registered, removing first`, { + channel, + timestamp: new Date().toISOString() + }); + try { + ipcMain.removeHandler(channel); + logger.debug(`[IPC:${channel}] Removed existing handler`); + } catch (error) { + logger.error(`[IPC:${channel}] Failed to remove existing handler:`, { + error: error instanceof Error ? { + name: error.name, + message: error.message, + stack: error.stack + } : String(error), + channel, + timestamp: new Date().toISOString() + }); + } + } + + // Wrap the handler with logging + const wrappedHandler = async (...args: any[]) => { + const startTime = Date.now(); + logger.info(`[IPC:${channel}] Handler called with args:`, { + channel, + args: args.map(arg => stringifyObject(arg)), + timestamp: new Date().toISOString() + }); + + try { + const result = await handler(...args); + const duration = Date.now() - startTime; + + logger.info(`[IPC:${channel}] Handler completed successfully:`, { + channel, + result: stringifyObject(result), + duration: `${duration}ms`, + timestamp: new Date().toISOString() + }); + + return result; + } catch (error) { + const duration = Date.now() - startTime; + + logger.error(`[IPC:${channel}] Handler failed:`, { + channel, + error: error instanceof Error ? { + name: error.name, + message: error.message, + stack: error.stack + } : stringifyObject(error), + duration: `${duration}ms`, + timestamp: new Date().toISOString() + }); + + throw error; + } + }; + + try { + ipcMain.handle(channel, wrappedHandler); + registeredHandlers.add(channel); + logger.info(`[IPC:${channel}] Handler registered successfully`, { + channel, + timestamp: new Date().toISOString() + }); + } catch (error) { + logger.error(`[IPC:${channel}] Failed to register handler:`, { + error: error instanceof Error ? { + name: error.name, + message: error.message, + stack: error.stack + } : String(error), + channel, + timestamp: new Date().toISOString() + }); + throw error; } - ipcMain.handle(channel, handler); - registeredHandlers.add(channel); - logger.debug(`Registered handler for channel: ${channel}`); }; /** @@ -743,19 +828,111 @@ export function setupSQLiteHandlers(): void { // Handler for running SQL statements registerHandler('sqlite-run', async (_event, options: SQLiteQueryOptions) => { - logger.debug('Running SQL statement:', options); + const startTime = Date.now(); + const operationId = `run_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`; + + logger.info('[sqlite-run] IPC handler called with options:', { + operationId, + options: stringifyObject(options), + timestamp: new Date().toISOString() + }); + try { + logger.debug('[sqlite-run] Starting database operation', { + operationId, + timestamp: new Date().toISOString() + }); + startDatabaseOperation(); + if (!pluginState.instance) { - throw new SQLiteError('Plugin not initialized', 'sqlite-run'); + const error = new SQLiteError('Plugin not initialized', 'sqlite-run'); + logger.error('[sqlite-run] Plugin not initialized:', { + operationId, + error: stringifyObject(error), + pluginState: stringifyObject(pluginState), + timestamp: new Date().toISOString() + }); + throw error; + } + + // Verify database is open + const isOpen = await pluginState.instance.isDBOpen({ database: options.database }); + if (!isOpen) { + const error = new SQLiteError('Database not open', 'sqlite-run'); + logger.error('[sqlite-run] Database not open:', { + operationId, + database: options.database, + timestamp: new Date().toISOString() + }); + throw error; } - const result = await pluginState.instance.run(options); - logger.debug('SQL run result:', result); + + logger.debug('[sqlite-run] Executing SQL with plugin:', { + operationId, + options: stringifyObject(options), + pluginState: stringifyObject(pluginState), + timestamp: new Date().toISOString() + }); + + // Add timeout promise + const timeoutPromise = new Promise((_, reject) => { + setTimeout(() => { + reject(new Error(`SQLite run operation timed out after ${LOCK_TIMEOUT_MS}ms`)); + }, LOCK_TIMEOUT_MS); + }); + + // Race between the operation and timeout + const result = await Promise.race([ + pluginState.instance.run(options), + timeoutPromise + ]); + + const duration = Date.now() - startTime; + logger.info('[sqlite-run] SQL execution successful:', { + operationId, + result: stringifyObject(result), + duration: `${duration}ms`, + timestamp: new Date().toISOString() + }); + return result; } catch (error) { - logger.error('SQL run failed:', error); + const duration = Date.now() - startTime; + const errorDetails = error instanceof Error ? { + name: error.name, + message: error.message, + stack: error.stack + } : stringifyObject(error); + + logger.error('[sqlite-run] SQL execution failed:', { + operationId, + error: errorDetails, + options: stringifyObject(options), + duration: `${duration}ms`, + timestamp: new Date().toISOString() + }); + + // Check for specific error types + if (error instanceof Error) { + const errorMsg = error.message.toLowerCase(); + if (errorMsg.includes('database is locked') || + errorMsg.includes('database is busy') || + errorMsg.includes('database is locked (5)')) { + logger.warn('[sqlite-run] Database lock detected:', { + operationId, + error: errorDetails, + timestamp: new Date().toISOString() + }); + } + } + throw error; } finally { + logger.debug('[sqlite-run] Ending database operation', { + operationId, + timestamp: new Date().toISOString() + }); endDatabaseOperation(); } }); diff --git a/package-lock.json b/package-lock.json index e378f29d..6d7180f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -209,9 +209,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.3.tgz", - "integrity": "sha512-V42wFfx1ymFte+ecf6iXghnnP8kWTO+ZLXIyZq+1LAXHHvTZdVxicn4yiVYdYMGaCO3tmqub11AorKkv+iodqw==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", + "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", "devOptional": true, "license": "MIT", "engines": { @@ -219,9 +219,9 @@ } }, "node_modules/@babel/core": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.3.tgz", - "integrity": "sha512-hyrN8ivxfvJ4i0fIJuV4EOlV0WDMz5Ui4StRTgVaAvWeiRCilXgwVvxJKtFQ3TKtHgJscB2YiXKGNJuVwhQMtA==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", + "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", "devOptional": true, "license": "MIT", "dependencies": { @@ -230,10 +230,10 @@ "@babel/generator": "^7.27.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.3", - "@babel/parser": "^7.27.3", + "@babel/helpers": "^7.27.4", + "@babel/parser": "^7.27.4", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.27.3", + "@babel/traverse": "^7.27.4", "@babel/types": "^7.27.3", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -260,13 +260,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.3.tgz", - "integrity": "sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.3", + "@babel/parser": "^7.27.5", "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", @@ -573,14 +573,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.3.tgz", - "integrity": "sha512-h/eKy9agOya1IGuLaZ9tEUgz+uIRXcbtOhRtUyyMf8JFmn1iT13vnl/IGVWSkdOCG/pC57U4S1jnAabAavTMwg==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", "devOptional": true, "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3" + "@babel/types": "^7.27.6" }, "engines": { "node": ">=6.9.0" @@ -689,9 +689,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.3.tgz", - "integrity": "sha512-xyYxRj6+tLNDTWi0KCBcZ9V7yg3/lwL9DWh9Uwh/RIVlIfFidggcgxKX3GCXwCiswwcGRawBKbEg2LG/Y8eJhw==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", "license": "MIT", "dependencies": { "@babel/types": "^7.27.3" @@ -1289,9 +1289,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.3.tgz", - "integrity": "sha512-+F8CnfhuLhwUACIJMLWnjz6zvzYM2r0yeIHKlbgfw7ml8rOMJsXNXV/hyRcb3nb493gRs4WvYpQAndWj/qQmkQ==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.5.tgz", + "integrity": "sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -1996,9 +1996,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.1.tgz", - "integrity": "sha512-B19lbbL7PMrKr52BNPjCqg1IyNUIjTcxKj8uX9zHO+PmWN93s19NDr/f69mIkEp2x9nmDJ08a7lgHaTTzvW7mw==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.5.tgz", + "integrity": "sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==", "devOptional": true, "license": "MIT", "dependencies": { @@ -2045,9 +2045,9 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.27.3.tgz", - "integrity": "sha512-bA9ZL5PW90YwNgGfjg6U+7Qh/k3zCEQJ06BFgAGRp/yMjw9hP9UGbGPtx3KSOkHGljEPCCxaE+PH4fUR2h1sDw==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.27.4.tgz", + "integrity": "sha512-D68nR5zxU64EUzV8i7T3R5XP0Xhrou/amNnddsRQssx6GrTLdZl1rLxyjtVZBd+v/NVX4AbTPOB5aU8thAZV1A==", "license": "MIT", "optional": true, "peer": true, @@ -2399,9 +2399,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.3.tgz", - "integrity": "sha512-7EYtGezsdiDMyY80+65EzwiGmcJqpmcZCojSXaRgdrBaGtWTgDZKq69cPIVped6MkIM78cTQ2GOiEYjwOlG4xw==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", + "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", "devOptional": true, "license": "MIT", "engines": { @@ -2424,15 +2424,15 @@ } }, "node_modules/@babel/traverse": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.3.tgz", - "integrity": "sha512-lId/IfN/Ye1CIu8xG7oKBHXd2iNb2aW1ilPszzGcJug6M8RCKfVNcYhpI5+bMvFYjK7lXIM0R+a+6r8xhHp2FQ==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", "devOptional": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.3", - "@babel/parser": "^7.27.3", + "@babel/parser": "^7.27.4", "@babel/template": "^7.27.2", "@babel/types": "^7.27.3", "debug": "^4.3.1", @@ -2444,16 +2444,16 @@ }, "node_modules/@babel/traverse--for-generate-function-map": { "name": "@babel/traverse", - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.3.tgz", - "integrity": "sha512-lId/IfN/Ye1CIu8xG7oKBHXd2iNb2aW1ilPszzGcJug6M8RCKfVNcYhpI5+bMvFYjK7lXIM0R+a+6r8xhHp2FQ==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", "license": "MIT", "optional": true, "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.3", - "@babel/parser": "^7.27.3", + "@babel/parser": "^7.27.4", "@babel/template": "^7.27.2", "@babel/types": "^7.27.3", "debug": "^4.3.1", @@ -2485,9 +2485,9 @@ } }, "node_modules/@babel/types": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.3.tgz", - "integrity": "sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -5185,9 +5185,9 @@ } }, "node_modules/@expo/cli": { - "version": "0.24.13", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.24.13.tgz", - "integrity": "sha512-2LSdbvYs+WmUljnplQXMCUyNzyX4H+F4l8uExfA1hud25Bl5kyaGrx1jjtgNxMTXmfmMjvgBdK798R50imEhkA==", + "version": "0.24.14", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.24.14.tgz", + "integrity": "sha512-o+QYyfIBhSRTgaywKTLJhm2Fg5PrSeUVCXS+uQySamgoMjLNhHa8QwE64mW/FmJr5hZLiqUEQxb60FK4JcyqXg==", "license": "MIT", "optional": true, "peer": true, @@ -5209,7 +5209,7 @@ "@expo/spawn-async": "^1.7.2", "@expo/ws-tunnel": "^1.0.1", "@expo/xcpretty": "^4.3.0", - "@react-native/dev-middleware": "0.79.2", + "@react-native/dev-middleware": "0.79.3", "@urql/core": "^5.0.6", "@urql/exchange-retry": "^1.3.0", "accepts": "^1.3.8", @@ -5224,7 +5224,7 @@ "debug": "^4.3.4", "env-editor": "^0.4.1", "freeport-async": "^2.0.0", - "getenv": "^1.0.0", + "getenv": "^2.0.0", "glob": "^10.4.2", "lan-network": "^0.1.6", "minimatch": "^9.0.0", @@ -5682,6 +5682,17 @@ } } }, + "node_modules/@expo/config-plugins/node_modules/getenv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-1.0.0.tgz", + "integrity": "sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/@expo/config-plugins/node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -5796,6 +5807,17 @@ "@babel/highlight": "^7.10.4" } }, + "node_modules/@expo/config/node_modules/getenv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-1.0.0.tgz", + "integrity": "sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/@expo/config/node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -5960,6 +5982,17 @@ "url": "https://dotenvx.com" } }, + "node_modules/@expo/env/node_modules/getenv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-1.0.0.tgz", + "integrity": "sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/@expo/fingerprint": { "version": "0.12.4", "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.12.4.tgz", @@ -5983,6 +6016,17 @@ "fingerprint": "bin/cli.js" } }, + "node_modules/@expo/fingerprint/node_modules/getenv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-1.0.0.tgz", + "integrity": "sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/@expo/fingerprint/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -6013,6 +6057,17 @@ "unique-string": "~2.0.0" } }, + "node_modules/@expo/image-utils/node_modules/getenv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-1.0.0.tgz", + "integrity": "sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/@expo/image-utils/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -6090,6 +6145,17 @@ "url": "https://dotenvx.com" } }, + "node_modules/@expo/metro-config/node_modules/getenv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-1.0.0.tgz", + "integrity": "sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/@expo/metro-config/node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -7323,6 +7389,21 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/transform/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/@jest/types": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", @@ -7594,6 +7675,19 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@npmcli/move-file/node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -7750,9 +7844,9 @@ } }, "node_modules/@pkgr/core": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.4.tgz", - "integrity": "sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.7.tgz", + "integrity": "sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==", "dev": true, "license": "MIT", "engines": { @@ -7821,9 +7915,9 @@ } }, "node_modules/@react-native/assets-registry": { - "version": "0.79.2", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.79.2.tgz", - "integrity": "sha512-5h2Z7/+/HL/0h88s0JHOdRCW4CXMCJoROxqzHqxdrjGL6EBD1DdaB4ZqkCOEVSW4Vjhir5Qb97C8i/MPWEYPtg==", + "version": "0.79.3", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.79.3.tgz", + "integrity": "sha512-Vy8DQXCJ21YSAiHxrNBz35VqVlZPpRYm50xRTWRf660JwHuJkFQG8cUkrLzm7AUriqUXxwpkQHcY+b0ibw9ejQ==", "license": "MIT", "optional": true, "peer": true, @@ -7832,24 +7926,24 @@ } }, "node_modules/@react-native/babel-plugin-codegen": { - "version": "0.79.2", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.79.2.tgz", - "integrity": "sha512-d+NB7Uosn2ZWd4O4+7ZkB6q1a+0z2opD/4+Bzhk/Tv6fc5FrSftK2Noqxvo3/bhbdGFVPxf0yvLE8et4W17x/Q==", + "version": "0.79.3", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.79.3.tgz", + "integrity": "sha512-Zb8F4bSEKKZfms5n1MQ0o5mudDcpAINkKiFuFTU0PErYGjY3kZ+JeIP+gS6KCXsckxCfMEKQwqKicP/4DWgsZQ==", "license": "MIT", "optional": true, "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", - "@react-native/codegen": "0.79.2" + "@react-native/codegen": "0.79.3" }, "engines": { "node": ">=18" } }, "node_modules/@react-native/babel-preset": { - "version": "0.79.2", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.79.2.tgz", - "integrity": "sha512-/HNu869oUq4FUXizpiNWrIhucsYZqu0/0spudJEzk9SEKar0EjVDP7zkg/sKK+KccNypDQGW7nFXT8onzvQ3og==", + "version": "0.79.3", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.79.3.tgz", + "integrity": "sha512-VHGNP02bDD2Ul1my0pLVwe/0dsEBHxR343ySpgnkCNEEm9C1ANQIL2wvnJrHZPcqfAkWfFQ8Ln3t+6fdm4A/Dg==", "license": "MIT", "optional": true, "peer": true, @@ -7895,7 +7989,7 @@ "@babel/plugin-transform-typescript": "^7.25.2", "@babel/plugin-transform-unicode-regex": "^7.24.7", "@babel/template": "^7.25.0", - "@react-native/babel-plugin-codegen": "0.79.2", + "@react-native/babel-plugin-codegen": "0.79.3", "babel-plugin-syntax-hermes-parser": "0.25.1", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" @@ -7908,9 +8002,9 @@ } }, "node_modules/@react-native/codegen": { - "version": "0.79.2", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.79.2.tgz", - "integrity": "sha512-8JTlGLuLi1p8Jx2N/enwwEd7/2CfrqJpv90Cp77QLRX3VHF2hdyavRIxAmXMwN95k+Me7CUuPtqn2X3IBXOWYg==", + "version": "0.79.3", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.79.3.tgz", + "integrity": "sha512-CZejXqKch/a5/s/MO5T8mkAgvzCXgsTkQtpCF15kWR9HN8T+16k0CsN7TXAxXycltoxiE3XRglOrZNEa/TiZUQ==", "license": "MIT", "optional": true, "peer": true, @@ -7929,14 +8023,14 @@ } }, "node_modules/@react-native/community-cli-plugin": { - "version": "0.79.2", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.79.2.tgz", - "integrity": "sha512-E+YEY2dL+68HyR2iahsZdyBKBUi9QyPyaN9vsnda1jNgCjNpSPk2yAF5cXsho+zKK5ZQna3JSeE1Kbi2IfGJbw==", + "version": "0.79.3", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.79.3.tgz", + "integrity": "sha512-N/+p4HQqN4yK6IRzn7OgMvUIcrmEWkecglk1q5nj+AzNpfIOzB+mqR20SYmnPfeXF+mZzYCzRANb3KiM+WsSDA==", "license": "MIT", "optional": true, "peer": true, "dependencies": { - "@react-native/dev-middleware": "0.79.2", + "@react-native/dev-middleware": "0.79.3", "chalk": "^4.0.0", "debug": "^2.2.0", "invariant": "^2.2.4", @@ -7977,9 +8071,9 @@ "peer": true }, "node_modules/@react-native/debugger-frontend": { - "version": "0.79.2", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.79.2.tgz", - "integrity": "sha512-cGmC7X6kju76DopSBNc+PRAEetbd7TWF9J9o84hOp/xL3ahxR2kuxJy0oJX8Eg8oehhGGEXTuMKHzNa3rDBeSg==", + "version": "0.79.3", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.79.3.tgz", + "integrity": "sha512-ImNDuEeKH6lEsLXms3ZsgIrNF94jymfuhPcVY5L0trzaYNo9ZFE9Ni2/18E1IbfXxdeIHrCSBJlWD6CTm7wu5A==", "license": "BSD-3-Clause", "optional": true, "peer": true, @@ -7988,15 +8082,15 @@ } }, "node_modules/@react-native/dev-middleware": { - "version": "0.79.2", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.79.2.tgz", - "integrity": "sha512-9q4CpkklsAs1L0Bw8XYCoqqyBSrfRALGEw4/r0EkR38Y/6fVfNfdsjSns0pTLO6h0VpxswK34L/hm4uK3MoLHw==", + "version": "0.79.3", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.79.3.tgz", + "integrity": "sha512-x88+RGOyG71+idQefnQg7wLhzjn/Scs+re1O5vqCkTVzRAc/f7SdHMlbmECUxJPd08FqMcOJr7/X3nsJBrNuuw==", "license": "MIT", "optional": true, "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.79.2", + "@react-native/debugger-frontend": "0.79.3", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^0.2.0", "connect": "^3.6.5", @@ -8060,9 +8154,9 @@ } }, "node_modules/@react-native/gradle-plugin": { - "version": "0.79.2", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.79.2.tgz", - "integrity": "sha512-6MJFemrwR0bOT0QM+2BxX9k3/pvZQNmJ3Js5pF/6owsA0cUDiCO57otiEU8Fz+UywWEzn1FoQfOfQ8vt2GYmoA==", + "version": "0.79.3", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.79.3.tgz", + "integrity": "sha512-imfpZLhNBc9UFSzb/MOy2tNcIBHqVmexh/qdzw83F75BmUtLb/Gs1L2V5gw+WI1r7RqDILbWk7gXB8zUllwd+g==", "license": "MIT", "optional": true, "peer": true, @@ -8071,9 +8165,9 @@ } }, "node_modules/@react-native/js-polyfills": { - "version": "0.79.2", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.79.2.tgz", - "integrity": "sha512-IaY87Ckd4GTPMkO1/Fe8fC1IgIx3vc3q9Tyt/6qS3Mtk9nC0x9q4kSR5t+HHq0/MuvGtu8HpdxXGy5wLaM+zUw==", + "version": "0.79.3", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.79.3.tgz", + "integrity": "sha512-PEBtg6Kox6KahjCAch0UrqCAmHiNLEbp2SblUEoFAQnov4DSxBN9safh+QSVaCiMAwLjvNfXrJyygZz60Dqz3Q==", "license": "MIT", "optional": true, "peer": true, @@ -8090,9 +8184,9 @@ "peer": true }, "node_modules/@react-native/virtualized-lists": { - "version": "0.79.2", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.79.2.tgz", - "integrity": "sha512-9G6ROJeP+rdw9Bvr5ruOlag11ET7j1z/En1riFFNo6W3xZvJY+alCuH1ttm12y9+zBm4n8jwCk4lGhjYaV4dKw==", + "version": "0.79.3", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.79.3.tgz", + "integrity": "sha512-/0rRozkn+iIHya2vnnvprDgT7QkfI54FLrACAN3BLP7MRlfOIGOrZsXpRLndnLBVnjNzkcre84i1RecjoXnwIA==", "license": "MIT", "optional": true, "peer": true, @@ -8471,9 +8565,9 @@ ] }, "node_modules/@scure/base": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.5.tgz", - "integrity": "sha512-9rE6EOVeIQzt5TSu4v+K523F8u6DhBsoZWPGKlnCshhlDhy0kJzUX4V+tr2dWmzF1GdekvThABoEQBGBQI7xZw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", + "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", "license": "MIT", "funding": { "url": "https://paulmillr.com/funding/" @@ -8856,9 +8950,9 @@ } }, "node_modules/@stencil/core": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.31.0.tgz", - "integrity": "sha512-Ei9MFJ6LPD9BMFs+klkHylbVOOYhG10Jv4bvoFf3GMH15kA41rSYkEdr4DiX84ZdErQE2qtFV/2SUyWoXh0AhA==", + "version": "4.33.1", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.33.1.tgz", + "integrity": "sha512-12k9xhAJBkpg598it+NRmaYIdEe6TSnsL/v6/KRXDcUyTK11VYwZQej2eHnMWtqot+znJ+GNTqb5YbiXi+5Low==", "license": "MIT", "bin": { "stencil": "bin/stencil" @@ -9482,9 +9576,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.17.51", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.51.tgz", - "integrity": "sha512-hccptBl7C8lHiKxTBsY6vYYmqpmw1E/aGR/8fmueE+B390L3pdMOpNSRvFO4ZnXzW5+p2HBXV0yNABd2vdk22Q==", + "version": "20.17.57", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.57.tgz", + "integrity": "sha512-f3T4y6VU4fVQDKVqJV4Uppy8c1p/sVvS3peyqxyWnzkqXFJLRU7Y1Bl7rMS1Qe9z0v4M6McY0Fp9yBsgHJUsWQ==", "license": "MIT", "dependencies": { "undici-types": "~6.19.2" @@ -10220,9 +10314,9 @@ } }, "node_modules/@veramo/did-provider-peer/node_modules/did-jwt": { - "version": "8.0.15", - "resolved": "https://registry.npmjs.org/did-jwt/-/did-jwt-8.0.15.tgz", - "integrity": "sha512-E+Qf+E0vUdAv2PcldxmvZwtPdmExaXkvwQA7tp3TKkCiK9aPNUrD7ZKSPi2lJQ2ZaGe3z0VKceQtGRl5Kolghg==", + "version": "8.0.16", + "resolved": "https://registry.npmjs.org/did-jwt/-/did-jwt-8.0.16.tgz", + "integrity": "sha512-iCduKLgY8F+JG6FcmaErfBD+f6RfIw44uTDZQRe4ISMDeCvySGKLN1nzM62eir7RbaruZgHbZ9qYKq4zBVbTFA==", "license": "Apache-2.0", "dependencies": { "@noble/ciphers": "^1.0.0", @@ -10237,9 +10331,9 @@ } }, "node_modules/@veramo/did-provider-peer/node_modules/did-jwt-vc": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/did-jwt-vc/-/did-jwt-vc-4.0.13.tgz", - "integrity": "sha512-T1IUneS7Rgpao8dOeZy7dMUvAvcLLn7T8YlWRk/8HsEpaVLDx5NrjRfbfDJU8FL8CI8aBIAhoDnPQO3PNV+BWg==", + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/did-jwt-vc/-/did-jwt-vc-4.0.14.tgz", + "integrity": "sha512-soL+dd3vW1QSIjuNcSLhDZXp1NFZk4pZbe1dM4oMZD3NDztGo/pgYRZOzt4oqGfwRYyhrH+7J1viQ8CUey3WGA==", "license": "ISC", "dependencies": { "did-jwt": "^8.0.0", @@ -10363,39 +10457,39 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.15.tgz", - "integrity": "sha512-nGRc6YJg/kxNqbv/7Tg4juirPnjHvuVdhcmDvQWVZXlLHjouq7VsKmV1hIxM/8yKM0VUfwT/Uzc0lO510ltZqw==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.16.tgz", + "integrity": "sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==", "license": "MIT", "dependencies": { "@babel/parser": "^7.27.2", - "@vue/shared": "3.5.15", + "@vue/shared": "3.5.16", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.15.tgz", - "integrity": "sha512-ZelQd9n+O/UCBdL00rlwCrsArSak+YLZpBVuNDio1hN3+wrCshYZEDUO3khSLAzPbF1oQS2duEoMDUHScUlYjA==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.16.tgz", + "integrity": "sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.15", - "@vue/shared": "3.5.15" + "@vue/compiler-core": "3.5.16", + "@vue/shared": "3.5.16" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.15.tgz", - "integrity": "sha512-3zndKbxMsOU6afQWer75Zot/aydjtxNj0T2KLg033rAFaQUn2PGuE32ZRe4iMhflbTcAxL0yEYsRWFxtPro8RQ==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.16.tgz", + "integrity": "sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==", "license": "MIT", "dependencies": { "@babel/parser": "^7.27.2", - "@vue/compiler-core": "3.5.15", - "@vue/compiler-dom": "3.5.15", - "@vue/compiler-ssr": "3.5.15", - "@vue/shared": "3.5.15", + "@vue/compiler-core": "3.5.16", + "@vue/compiler-dom": "3.5.16", + "@vue/compiler-ssr": "3.5.16", + "@vue/shared": "3.5.16", "estree-walker": "^2.0.2", "magic-string": "^0.30.17", "postcss": "^8.5.3", @@ -10403,13 +10497,13 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.15.tgz", - "integrity": "sha512-gShn8zRREZbrXqTtmLSCffgZXDWv8nHc/GhsW+mbwBfNZL5pI96e7IWcIq8XGQe1TLtVbu7EV9gFIVSmfyarPg==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.16.tgz", + "integrity": "sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.15", - "@vue/shared": "3.5.15" + "@vue/compiler-dom": "3.5.16", + "@vue/shared": "3.5.16" } }, "node_modules/@vue/devtools-api": { @@ -10664,53 +10758,53 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.15.tgz", - "integrity": "sha512-GaA5VUm30YWobCwpvcs9nvFKf27EdSLKDo2jA0IXzGS344oNpFNbEQ9z+Pp5ESDaxyS8FcH0vFN/XSe95BZtHQ==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.16.tgz", + "integrity": "sha512-FG5Q5ee/kxhIm1p2bykPpPwqiUBV3kFySsHEQha5BJvjXdZTUfmya7wP7zC39dFuZAcf/PD5S4Lni55vGLMhvA==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.15" + "@vue/shared": "3.5.16" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.15.tgz", - "integrity": "sha512-CZAlIOQ93nj0OPpWWOx4+QDLCMzBNY85IQR4Voe6vIID149yF8g9WQaWnw042f/6JfvLttK7dnyWlC1EVCRK8Q==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.16.tgz", + "integrity": "sha512-bw5Ykq6+JFHYxrQa7Tjr+VSzw7Dj4ldR/udyBZbq73fCdJmyy5MPIFR9IX/M5Qs+TtTjuyUTCnmK3lWWwpAcFQ==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.15", - "@vue/shared": "3.5.15" + "@vue/reactivity": "3.5.16", + "@vue/shared": "3.5.16" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.15.tgz", - "integrity": "sha512-wFplHKzKO/v998up2iCW3RN9TNUeDMhdBcNYZgs5LOokHntrB48dyuZHspcahKZczKKh3v6i164gapMPxBTKNw==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.16.tgz", + "integrity": "sha512-T1qqYJsG2xMGhImRUV9y/RseB9d0eCYZQ4CWca9ztCuiPj/XWNNN+lkNBuzVbia5z4/cgxdL28NoQCvC0Xcfww==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.15", - "@vue/runtime-core": "3.5.15", - "@vue/shared": "3.5.15", + "@vue/reactivity": "3.5.16", + "@vue/runtime-core": "3.5.16", + "@vue/shared": "3.5.16", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.15.tgz", - "integrity": "sha512-Gehc693kVTYkLt6QSYEjGvqvdK2zZ/gf/D5zkgmvBdeB30dNnVZS8yY7+IlBmHRd1rR/zwaqeu06Ij04ZxBscg==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.16.tgz", + "integrity": "sha512-BrX0qLiv/WugguGsnQUJiYOE0Fe5mZTwi6b7X/ybGB0vfrPH9z0gD/Y6WOR1sGCgX4gc25L1RYS5eYQKDMoNIg==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.15", - "@vue/shared": "3.5.15" + "@vue/compiler-ssr": "3.5.16", + "@vue/shared": "3.5.16" }, "peerDependencies": { - "vue": "3.5.15" + "vue": "3.5.16" } }, "node_modules/@vue/shared": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.15.tgz", - "integrity": "sha512-bKvgFJJL1ZX9KxMCTQY6xD9Dhe3nusd1OhyOb1cJYGqvAr0Vg8FIjHPMOEVbJ9GDT9HG+Bjdn4oS8ohKP8EvoA==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.16.tgz", + "integrity": "sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==", "license": "MIT" }, "node_modules/@vueuse/core": { @@ -11800,9 +11894,9 @@ } }, "node_modules/babel-preset-expo": { - "version": "13.1.11", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-13.1.11.tgz", - "integrity": "sha512-jigWjvhRVdm9UTPJ1wjLYJ0OJvD5vLZ8YYkEknEl6+9S1JWORO/y3xtHr/hNj5n34nOilZqdXrmNFcqKc8YTsg==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-13.2.0.tgz", + "integrity": "sha512-oNUeUZPMNRPmx/2jaKJLSQFP/MFI1M91vP+Gp+j8/FPl9p/ps603DNwCaRdcT/Vj3FfREdlIwRio1qDCjY0oAA==", "license": "MIT", "optional": true, "peer": true, @@ -11821,7 +11915,7 @@ "@babel/plugin-transform-runtime": "^7.24.7", "@babel/preset-react": "^7.22.15", "@babel/preset-typescript": "^7.23.0", - "@react-native/babel-preset": "0.79.2", + "@react-native/babel-preset": "0.79.3", "babel-plugin-react-native-web": "~0.19.13", "babel-plugin-syntax-hermes-parser": "^0.25.1", "babel-plugin-transform-flow-enums": "^0.0.2", @@ -12360,9 +12454,9 @@ "license": "MIT" }, "node_modules/browserslist": { - "version": "4.24.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", - "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", + "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", "devOptional": true, "funding": [ { @@ -12380,8 +12474,8 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001716", - "electron-to-chromium": "^1.5.149", + "caniuse-lite": "^1.0.30001718", + "electron-to-chromium": "^1.5.160", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, @@ -12623,6 +12717,19 @@ "node": ">=10" } }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/cacache/node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -12861,9 +12968,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001718", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", - "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", + "version": "1.0.30001721", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001721.tgz", + "integrity": "sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==", "devOptional": true, "funding": [ { @@ -12947,19 +13054,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/character-entities": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", @@ -13086,6 +13180,20 @@ "rimraf": "^3.0.2" } }, + "node_modules/chromium-edge-launcher/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "optional": true, + "peer": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/chromium-edge-launcher/node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -13553,6 +13661,22 @@ "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/config-file-ts": { "version": "0.2.8-rc1", "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.8-rc1.tgz", @@ -15330,18 +15454,6 @@ "lodash": "^4.17.14" } }, - "node_modules/electron-json-storage/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/electron-json-storage/node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -15355,17 +15467,6 @@ "rimraf": "bin.js" } }, - "node_modules/electron-json-storage/node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "license": "ISC", - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, "node_modules/electron-publish": { "version": "25.1.7", "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-25.1.7.tgz", @@ -15408,9 +15509,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.159", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.159.tgz", - "integrity": "sha512-CEvHptWAMV5p6GJ0Lq8aheyvVbfzVrv5mmidu1D3pidoVNkB3tTBsTMVtPJ+rzRK5oV229mCLz9Zj/hNvU8GBA==", + "version": "1.5.165", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.165.tgz", + "integrity": "sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==", "devOptional": true, "license": "ISC" }, @@ -15563,9 +15664,9 @@ } }, "node_modules/es-abstract": { - "version": "1.23.10", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.10.tgz", - "integrity": "sha512-MtUbM072wlJNyeYAe0mhzrD+M6DIJa96CZAOBBrhDbgKnB4MApIKefcyAB1eOdYn8cUNZgvwBvEzdoAYsxgEIw==", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", "dev": true, "license": "MIT", "dependencies": { @@ -15596,7 +15697,9 @@ "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", + "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", @@ -15611,6 +15714,7 @@ "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", @@ -15839,14 +15943,14 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.0.tgz", - "integrity": "sha512-BvQOvUhkVQM1i63iMETK9Hjud9QhqBnbtT1Zc642p9ynzBuCe5pybkOnvqZIBypXmMlsGcnU4HZ8sCTPfpAexA==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.1.tgz", + "integrity": "sha512-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg==", "dev": true, "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.11.0" + "synckit": "^0.11.7" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -16230,9 +16334,9 @@ "license": "MIT" }, "node_modules/ethr-did": { - "version": "3.0.35", - "resolved": "https://registry.npmjs.org/ethr-did/-/ethr-did-3.0.35.tgz", - "integrity": "sha512-vWTGIcdnzyTeahNw25P4eQEMo6gVQEVEg0Kit8spDPB6neUAk5HaJXfxG9i8gKPJBOgyVNkMQ/aPOgVhnSig3w==", + "version": "3.0.36", + "resolved": "https://registry.npmjs.org/ethr-did/-/ethr-did-3.0.36.tgz", + "integrity": "sha512-Sqstkq1vP8YdfD1aJsioAoYDi/pv1SxOgA8zPTy0lejxM7ec/9j5SW3ZzO3TW/69QFCZ3hhodJ7PleordUJnjw==", "license": "Apache-2.0", "dependencies": { "did-jwt": "^8.0.0", @@ -16264,9 +16368,9 @@ } }, "node_modules/ethr-did/node_modules/did-jwt": { - "version": "8.0.15", - "resolved": "https://registry.npmjs.org/did-jwt/-/did-jwt-8.0.15.tgz", - "integrity": "sha512-E+Qf+E0vUdAv2PcldxmvZwtPdmExaXkvwQA7tp3TKkCiK9aPNUrD7ZKSPi2lJQ2ZaGe3z0VKceQtGRl5Kolghg==", + "version": "8.0.16", + "resolved": "https://registry.npmjs.org/did-jwt/-/did-jwt-8.0.16.tgz", + "integrity": "sha512-iCduKLgY8F+JG6FcmaErfBD+f6RfIw44uTDZQRe4ISMDeCvySGKLN1nzM62eir7RbaruZgHbZ9qYKq4zBVbTFA==", "license": "Apache-2.0", "dependencies": { "@noble/ciphers": "^1.0.0", @@ -16341,28 +16445,28 @@ } }, "node_modules/expo": { - "version": "53.0.9", - "resolved": "https://registry.npmjs.org/expo/-/expo-53.0.9.tgz", - "integrity": "sha512-UFG68aVOpccg3s++S3pbtI3YCQCnlu/TFvhnQ5vaD3vhOox1Uk/f2O2T95jmwA/EvKvetqGj34lys3DNXvPqgQ==", + "version": "53.0.10", + "resolved": "https://registry.npmjs.org/expo/-/expo-53.0.10.tgz", + "integrity": "sha512-rN3HcQOeum4i+4Fq1+wBuTWbUjHZqTE7YgGGioOtY2WnhYt+4OSrTlxjRjp13AtkLuKSKkh34gkdFMlUepKlXA==", "license": "MIT", "optional": true, "peer": true, "dependencies": { "@babel/runtime": "^7.20.0", - "@expo/cli": "0.24.13", + "@expo/cli": "0.24.14", "@expo/config": "~11.0.10", "@expo/config-plugins": "~10.0.2", "@expo/fingerprint": "0.12.4", "@expo/metro-config": "0.20.14", "@expo/vector-icons": "^14.0.0", - "babel-preset-expo": "~13.1.11", + "babel-preset-expo": "~13.2.0", "expo-asset": "~11.1.5", "expo-constants": "~17.1.6", "expo-file-system": "~18.1.10", "expo-font": "~13.3.1", "expo-keep-awake": "~14.1.4", "expo-modules-autolinking": "2.1.10", - "expo-modules-core": "2.3.13", + "expo-modules-core": "2.4.0", "react-native-edge-to-edge": "1.6.0", "whatwg-url-without-unicode": "8.0.0-3" }, @@ -16562,9 +16666,9 @@ } }, "node_modules/expo/node_modules/expo-modules-core": { - "version": "2.3.13", - "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-2.3.13.tgz", - "integrity": "sha512-vmKHv7tEo2wUQoYDV6grhsLsQfD3DUnew5Up3yNnOE1gHGQE+zhV1SBYqaPMPB12OvpyD1mlfzGhu6r9PODnng==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-2.4.0.tgz", + "integrity": "sha512-Ko5eHBdvuMykjw9P9C9PF54/wBSsGOxaOjx92I5BwgKvEmUwN3UrXFV4CXzlLVbLfSYUQaLcB220xmPfgvT7Fg==", "license": "MIT", "optional": true, "peer": true, @@ -17538,9 +17642,9 @@ } }, "node_modules/getenv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/getenv/-/getenv-1.0.0.tgz", - "integrity": "sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-2.0.0.tgz", + "integrity": "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ==", "license": "MIT", "optional": true, "peer": true, @@ -18751,6 +18855,19 @@ "dev": true, "license": "MIT" }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -19400,6 +19517,23 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/jimp-compact": { "version": "0.16.1", "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", @@ -21066,9 +21200,9 @@ } }, "node_modules/markdownlint-cli/node_modules/ignore": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz", - "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { @@ -22702,15 +22836,15 @@ "license": "MIT" }, "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, "bin": { "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" } }, "node_modules/mkdirp-classic": { @@ -23127,9 +23261,9 @@ } }, "node_modules/nostr-tools": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/nostr-tools/-/nostr-tools-2.13.1.tgz", - "integrity": "sha512-EKcicym1ree14m8lU0b6sZIf46NcxOHvGwUWWAuxjhutOmJM5Pc9ylR1YqxbgpqDQpkEYQwv/d3GupK5CJj9ow==", + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nostr-tools/-/nostr-tools-2.14.1.tgz", + "integrity": "sha512-x89y2FsZhCrki8YeaAoT6XACf1xmAlSWJYpicZv65GNya2NOSi1d9b7RDB+BnQfLQxaJ6ldrgkdGG6JaM32pAw==", "license": "Unlicense", "dependencies": { "@noble/ciphers": "^0.5.1", @@ -24094,9 +24228,9 @@ } }, "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.4.tgz", + "integrity": "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==", "funding": [ { "type": "opencollective", @@ -24113,7 +24247,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -24268,24 +24402,6 @@ "node": ">=10" } }, - "node_modules/prebuild-install/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC" - }, - "node_modules/prebuild-install/node_modules/tar-fs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", - "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -24994,21 +25110,21 @@ "peer": true }, "node_modules/react-native": { - "version": "0.79.2", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.79.2.tgz", - "integrity": "sha512-AnGzb56JvU5YCL7cAwg10+ewDquzvmgrMddiBM0GAWLwQM/6DJfGd2ZKrMuKKehHerpDDZgG+EY64gk3x3dEkw==", + "version": "0.79.3", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.79.3.tgz", + "integrity": "sha512-EzH1+9gzdyEo9zdP6u7Sh3Jtf5EOMwzy+TK65JysdlgAzfEVfq4mNeXcAZ6SmD+CW6M7ARJbvXLyTD0l2S5rpg==", "license": "MIT", "optional": true, "peer": true, "dependencies": { "@jest/create-cache-key-function": "^29.7.0", - "@react-native/assets-registry": "0.79.2", - "@react-native/codegen": "0.79.2", - "@react-native/community-cli-plugin": "0.79.2", - "@react-native/gradle-plugin": "0.79.2", - "@react-native/js-polyfills": "0.79.2", - "@react-native/normalize-colors": "0.79.2", - "@react-native/virtualized-lists": "0.79.2", + "@react-native/assets-registry": "0.79.3", + "@react-native/codegen": "0.79.3", + "@react-native/community-cli-plugin": "0.79.3", + "@react-native/gradle-plugin": "0.79.3", + "@react-native/js-polyfills": "0.79.3", + "@react-native/normalize-colors": "0.79.3", + "@react-native/virtualized-lists": "0.79.3", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", @@ -25079,6 +25195,14 @@ "react-native": "*" } }, + "node_modules/react-native/node_modules/@react-native/normalize-colors": { + "version": "0.79.3", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.79.3.tgz", + "integrity": "sha512-T75NIQPRFCj6DFMxtcVMJTZR+3vHXaUMSd15t+CkJpc5LnyX91GVaPxpRSAdjFh7m3Yppl5MpdjV/fntImheYQ==", + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/react-native/node_modules/commander": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", @@ -26875,6 +26999,33 @@ "devOptional": true, "license": "MIT" }, + "node_modules/sharp/node_modules/tar-fs": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.9.tgz", + "integrity": "sha512-XF4w9Xp+ZQgifKakjZYmFdkLoSWd34VGKcsTCwlNWM7QG3ZbaxnTsaBwnjFZqHRf/rROxaR8rXnbtwdvaDI+lA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/sharp/node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -26897,9 +27048,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "devOptional": true, "license": "MIT", "engines": { @@ -27552,6 +27703,19 @@ "encoding": "^0.1.12" } }, + "node_modules/sqlite3/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "optional": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/sqlite3/node_modules/node-addon-api": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", @@ -27756,6 +27920,20 @@ "node": ">= 0.6" } }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/str2buf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/str2buf/-/str2buf-1.3.0.tgz", @@ -27798,9 +27976,9 @@ } }, "node_modules/streamx": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", - "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", + "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -28154,19 +28332,16 @@ } }, "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "devOptional": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">=8" } }, "node_modules/supports-hyperlinks": { @@ -28184,20 +28359,6 @@ "node": ">=8" } }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -28212,9 +28373,9 @@ } }, "node_modules/synckit": { - "version": "0.11.6", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.6.tgz", - "integrity": "sha512-2pR2ubZSV64f/vqm9eLPz/KOvR9Dm+Co/5ChLgeHl0yEDRc6h5hXHoxEQH8Y5Ljycozd3p1k5TTSVdzYGkPvLw==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.8.tgz", + "integrity": "sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==", "dev": true, "license": "MIT", "dependencies": { @@ -28283,31 +28444,22 @@ } }, "node_modules/tar-fs": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.9.tgz", - "integrity": "sha512-XF4w9Xp+ZQgifKakjZYmFdkLoSWd34VGKcsTCwlNWM7QG3ZbaxnTsaBwnjFZqHRf/rROxaR8rXnbtwdvaDI+lA==", - "devOptional": true, + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", + "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", "license": "MIT", "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" + "tar-stream": "^2.1.4" } }, - "node_modules/tar-fs/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" }, "node_modules/tar-stream": { "version": "2.2.0", @@ -28383,6 +28535,18 @@ "node": ">=8" } }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -29802,16 +29966,16 @@ "peer": true }, "node_modules/vue": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.15.tgz", - "integrity": "sha512-aD9zK4rB43JAMK/5BmS4LdPiEp8Fdh8P1Ve/XNuMF5YRf78fCyPE6FUbQwcaWQ5oZ1R2CD9NKE0FFOVpMR7gEQ==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.16.tgz", + "integrity": "sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.15", - "@vue/compiler-sfc": "3.5.15", - "@vue/runtime-dom": "3.5.15", - "@vue/server-renderer": "3.5.15", - "@vue/shared": "3.5.15" + "@vue/compiler-dom": "3.5.16", + "@vue/compiler-sfc": "3.5.16", + "@vue/runtime-dom": "3.5.16", + "@vue/server-renderer": "3.5.16", + "@vue/shared": "3.5.16" }, "peerDependencies": { "typescript": "*" @@ -30747,18 +30911,14 @@ "license": "ISC" }, "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", "license": "ISC", - "optional": true, - "peer": true, "dependencies": { + "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "signal-exit": "^3.0.2" } }, "node_modules/ws": { @@ -31063,9 +31223,9 @@ } }, "node_modules/zod": { - "version": "3.25.32", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.32.tgz", - "integrity": "sha512-OSm2xTIRfW8CV5/QKgngwmQW/8aPfGdaQFlrGoErlgg/Epm7cjb6K6VEyExfe65a3VybUOnu381edLb0dfJl0g==", + "version": "3.25.51", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.51.tgz", + "integrity": "sha512-TQSnBldh+XSGL+opiSIq0575wvDPqu09AqWe1F7JhUMKY+M91/aGlK4MhpVNO7MgYfHcVCB1ffwAUTJzllKJqg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/src/db/databaseUtil.ts b/src/db/databaseUtil.ts index 40d689f9..a4ea07cd 100644 --- a/src/db/databaseUtil.ts +++ b/src/db/databaseUtil.ts @@ -3,11 +3,19 @@ * That file will eventually be deleted. */ -import { PlatformServiceFactory } from "@/services/PlatformServiceFactory"; +import { PlatformServiceFactory } from "../services/PlatformServiceFactory"; import { MASTER_SETTINGS_KEY, Settings } from "./tables/settings"; -import { logger } from "@/utils/logger"; -import { DEFAULT_ENDORSER_API_SERVER } from "@/constants/app"; -import { QueryExecResult } from "@/interfaces/database"; +import { logger } from "../utils/logger"; +import { DEFAULT_ENDORSER_API_SERVER } from "../constants/app"; +import { QueryExecResult } from "../interfaces/database"; + +const formatLogObject = (obj: unknown): string => { + try { + return JSON.stringify(obj, null, 2); + } catch (error) { + return `[Object could not be stringified: ${error instanceof Error ? error.message : String(error)}]`; + } +}; export async function updateDefaultSettings( settingsChanges: Settings, @@ -23,10 +31,13 @@ export async function updateDefaultSettings( "id = ?", [MASTER_SETTINGS_KEY], ); + console.log("[databaseUtil] updateDefaultSettings", { sql, params }); const result = await platformService.dbExec(sql, params); + console.log("[databaseUtil] updateDefaultSettings result", { result }); return result.changes === 1; } catch (error) { logger.error("Error updating default settings:", error); + console.log("[databaseUtil] updateDefaultSettings error", { error }); if (error instanceof Error) { throw error; // Re-throw if it's already an Error with a message } else { @@ -79,48 +90,78 @@ const DEFAULT_SETTINGS: Settings = { // retrieves default settings export async function retrieveSettingsForDefaultAccount(): Promise { + console.log('[DatabaseUtil] Retrieving default account settings'); const platform = PlatformServiceFactory.getInstance(); + + console.log('[DatabaseUtil] Platform service state:', { + platformType: platform.constructor.name, + capabilities: platform.getCapabilities(), + timestamp: new Date().toISOString() + }); + const result = await platform.dbQuery("SELECT * FROM settings WHERE id = ?", [ MASTER_SETTINGS_KEY, ]); + if (!result) { + console.log('[DatabaseUtil] No settings found, returning defaults'); return DEFAULT_SETTINGS; - } else { - const settings = mapColumnsToValues( - result.columns, - result.values, - )[0] as Settings; - if (settings.searchBoxes) { - // @ts-expect-error - the searchBoxes field is a string in the DB - settings.searchBoxes = JSON.parse(settings.searchBoxes); - } - return settings; } + + const settings = mapColumnsToValues(result.columns, result.values)[0] as Settings; + if (settings.searchBoxes) { + // @ts-expect-error - the searchBoxes field is a string in the DB + settings.searchBoxes = JSON.parse(settings.searchBoxes); + } + + console.log('[DatabaseUtil] Retrieved settings:', { + settings: formatLogObject(settings), + timestamp: new Date().toISOString() + }); + + return settings; } export async function retrieveSettingsForActiveAccount(): Promise { + console.log('[DatabaseUtil] Retrieving active account settings'); const defaultSettings = await retrieveSettingsForDefaultAccount(); + + console.log('[DatabaseUtil] Default settings retrieved:', { + defaultSettings: formatLogObject(defaultSettings), + timestamp: new Date().toISOString() + }); + if (!defaultSettings.activeDid) { + console.log('[DatabaseUtil] No active DID, returning default settings'); return defaultSettings; - } else { - const platform = PlatformServiceFactory.getInstance(); - const result = await platform.dbQuery( - "SELECT * FROM settings WHERE accountDid = ?", - [defaultSettings.activeDid], - ); - const overrideSettings = result - ? (mapColumnsToValues(result.columns, result.values)[0] as Settings) - : {}; - const overrideSettingsFiltered = Object.fromEntries( - Object.entries(overrideSettings).filter(([_, v]) => v !== null), - ); - const settings = { ...defaultSettings, ...overrideSettingsFiltered }; - if (settings.searchBoxes) { - // @ts-expect-error - the searchBoxes field is a string in the DB - settings.searchBoxes = JSON.parse(settings.searchBoxes); - } - return settings; } + + const platform = PlatformServiceFactory.getInstance(); + const result = await platform.dbQuery( + "SELECT * FROM settings WHERE accountDid = ?", + [defaultSettings.activeDid], + ); + + const overrideSettings = result + ? (mapColumnsToValues(result.columns, result.values)[0] as Settings) + : {}; + + const overrideSettingsFiltered = Object.fromEntries( + Object.entries(overrideSettings).filter(([_, v]) => v !== null), + ); + + const settings = { ...defaultSettings, ...overrideSettingsFiltered }; + if (settings.searchBoxes) { + // @ts-expect-error - the searchBoxes field is a string in the DB + settings.searchBoxes = JSON.parse(settings.searchBoxes); + } + + console.log('[DatabaseUtil] Final active account settings:', { + settings: formatLogObject(settings), + timestamp: new Date().toISOString() + }); + + return settings; } let lastCleanupDate: string | null = null; diff --git a/src/services/platforms/ElectronPlatformService.ts b/src/services/platforms/ElectronPlatformService.ts index 3494f809..91b1c0e5 100644 --- a/src/services/platforms/ElectronPlatformService.ts +++ b/src/services/platforms/ElectronPlatformService.ts @@ -25,9 +25,20 @@ interface Migration { sql: string; } -export interface SQLiteQueryResult { +// Define the SQLite query result type +interface SQLiteQueryResult { + changes: number; + lastId: number; + rows?: unknown[]; values?: Record[]; - changes?: { changes: number; lastId?: number }; +} + +// Update the QueryExecResult type to include success and changes +interface ElectronQueryExecResult { + success: boolean; + changes: number; + lastId?: number; + rows?: unknown[]; } /** @@ -73,6 +84,15 @@ interface SQLiteOperations { }) => Promise<{ changes?: { changes: number; lastId?: number } }>; } +// Add at the top of the file after imports +const formatLogObject = (obj: unknown): string => { + try { + return JSON.stringify(obj, null, 2); + } catch (error) { + return `[Object could not be stringified: ${error instanceof Error ? error.message : String(error)}]`; + } +}; + /** * Platform service implementation for Electron (desktop) platform. * Provides native desktop functionality through Electron and Capacitor plugins for: @@ -710,13 +730,23 @@ export class ElectronPlatformService implements PlatformService { "Database is in a fatal error state. Please restart the app.", ); } + logger.debug('[ElectronPlatformService] [dbQuery] Enqueuing operation', { + sql: sql.substring(0, 100) + (sql.length > 100 ? '...' : ''), + paramCount: params.length, + timestamp: new Date().toISOString() + }); return this.enqueueOperation(async () => { try { // Get connection (will wait for existing connection if any) + console.log("[ElectronPlatformService] [dbQuery] Getting connection"); await this.getConnection(); - + console.log("[ElectronPlatformService] [dbQuery] Connection acquired"); // Execute query + console.log( + "[ElectronPlatformService] [dbQuery] Executing query", + { sql, params }, + ); const result = (await window.electron!.ipcRenderer.invoke( "sqlite-query", { @@ -725,8 +755,9 @@ export class ElectronPlatformService implements PlatformService { values: params, }, )) as SQLiteQueryResult; - logger.debug( + console.log( "[ElectronPlatformService] [dbQuery] Query executed successfully", + { result }, ); // Process results @@ -738,9 +769,14 @@ export class ElectronPlatformService implements PlatformService { ), }; + console.log( + "[ElectronPlatformService] [dbQuery] Query processed successfully", + { processedResult }, + ); + return processedResult; } catch (error) { - logger.error( + console.error( "[ElectronPlatformService] [dbQuery] Query failed:", error, ); @@ -759,6 +795,10 @@ export class ElectronPlatformService implements PlatformService { sql: string, params?: unknown[], ): Promise<{ changes: number; lastId?: number }> { + console.log("[ElectronPlatformService] [dbExec] Executing query", { + sql, + params, + }); if (this.dbFatalError) { throw new Error( "Database is in a fatal error state. Please restart the app.", @@ -768,9 +808,15 @@ export class ElectronPlatformService implements PlatformService { return this.enqueueOperation(async () => { try { // Get connection (will wait for existing connection if any) + console.log("[ElectronPlatformService] [dbExec] Getting connection"); await this.getConnection(); + console.log("[ElectronPlatformService] [dbExec] Connection acquired"); // Execute query + console.log( + "[ElectronPlatformService] [dbExec] Executing query", + { sql, params }, + ); const result = (await window.electron!.ipcRenderer.invoke( "sqlite-run", { @@ -779,16 +825,20 @@ export class ElectronPlatformService implements PlatformService { values: params, }, )) as SQLiteQueryResult; - logger.debug( + console.log( "[ElectronPlatformService] [dbExec] Query executed successfully", + { result }, ); return { - changes: result.changes?.changes || 0, - lastId: result.changes?.lastId, + changes: result.changes, + lastId: result.lastId, }; } catch (error) { - logger.error("[ElectronPlatformService] [dbExec] Query failed:", error); + console.error( + "[ElectronPlatformService] [dbExec] Query failed:", + error, + ); throw error; } finally { // Release connection after query @@ -821,4 +871,46 @@ export class ElectronPlatformService implements PlatformService { async close(): Promise { // Optionally implement close logic if needed } + + async run(sql: string, params: unknown[] = []): Promise { + logger.debug('[ElectronPlatformService] [dbRun] Executing SQL:', { + sql: sql.substring(0, 100) + (sql.length > 100 ? '...' : ''), + params: formatLogObject(params), + timestamp: new Date().toISOString() + }); + + try { + const result = (await window.electron!.ipcRenderer.invoke( + 'sqlite-run', + { + database: this.dbName, + statement: sql, + values: params, + }, + )) as SQLiteQueryResult; + + logger.debug('[ElectronPlatformService] [dbRun] SQL execution result:', { + result: formatLogObject(result), + timestamp: new Date().toISOString() + }); + + return { + success: true, + changes: result.changes, + lastId: result.lastId, + }; + } catch (error) { + logger.error('[ElectronPlatformService] [dbRun] SQL execution failed:', { + error: error instanceof Error ? { + name: error.name, + message: error.message, + stack: error.stack + } : formatLogObject(error), + sql, + params: formatLogObject(params), + timestamp: new Date().toISOString() + }); + throw error; + } + } } diff --git a/src/views/AccountViewView.vue b/src/views/AccountViewView.vue index cc608810..e9a84525 100644 --- a/src/views/AccountViewView.vue +++ b/src/views/AccountViewView.vue @@ -1237,7 +1237,9 @@ export default class AccountViewView extends Vue { * Initializes component state with values from the database or defaults. */ async initializeState() { + console.log("[AccountViewView] initializeState"); let settings = await databaseUtil.retrieveSettingsForActiveAccount(); + console.log("[AccountViewView] initializeState", { settings }); if (USE_DEXIE_DB) { await db.open(); settings = await retrieveSettingsForActiveAccount(); @@ -1949,6 +1951,11 @@ export default class AccountViewView extends Vue { current: this.apiServer, attempted: this.apiServerInput, }); + console.log("[AccountViewView] API server update failed", { + error, + current: this.apiServer, + attempted: this.apiServerInput, + }); this.$notify( { group: "alert",