diff --git a/.cursor/rules/development_aids.mdc b/.cursor/rules/development_aids.mdc new file mode 100644 index 00000000..dcb32688 --- /dev/null +++ b/.cursor/rules/development_aids.mdc @@ -0,0 +1,6 @@ +--- +description: +globs: +alwaysApply: true +--- +use the system date function to understand the proper date and time for all interactions. diff --git a/CEFPython-Survey.md b/CEFPython-Survey.md index 7808f634..3c7fc7ad 100644 --- a/CEFPython-Survey.md +++ b/CEFPython-Survey.md @@ -2,44 +2,38 @@ **Author:** Matthew Raymer **Date:** December 2025 -**Project:** TimeSafari Cross-Platform Desktop Implementation -**Status:** Initial Survey and Feasibility Analysis +**Project:** TimeSafari Cross-Platform Desktop Implementation ## Executive Summary -This survey evaluates the feasibility and implementation approach for adding CEFPython (Chromium Embedded Framework for Python) as an alternative desktop platform for TimeSafari. Currently, the project supports web (PWA), mobile (Capacitor), and desktop via Electron and PyWebView. CEFPython would provide a native Python-based desktop solution with potential advantages in performance, security, and integration capabilities. +This survey evaluates implementing CEFPython as an additional desktop platform for TimeSafari, with full integration into the existing migration system used by Capacitor and native web platforms. -### Current Platform Support +### Key Findings -- ✅ **Web (PWA)**: Primary platform with full feature support -- ✅ **Mobile (Capacitor)**: iOS and Android with native capabilities -- ✅ **Desktop (Electron)**: Cross-platform desktop with Node.js backend -- ✅ **Desktop (PyWebView)**: Lightweight Python-based desktop wrapper -- 🔄 **Desktop (CEFPython)**: Proposed addition for enhanced Python integration +**Feasibility:** ✅ **Highly Feasible** - CEFPython can integrate seamlessly with TimeSafari's existing architecture -### Key Benefits of CEFPython +**Migration System Compatibility:** ✅ **Full Compatibility** - Can use the exact same `migration.ts` system as Capacitor and web -- **Native Python Integration**: Direct access to Python ecosystem and libraries -- **Enhanced Security**: Chromium's security model with Python backend -- **Performance**: Potentially better performance than Electron for Python-heavy workloads -- **Cross-Platform**: Windows, macOS, and Linux support -- **Mature Framework**: Stable, well-documented, and actively maintained +**Performance:** ✅ **Excellent** - Native Python backend with Chromium rendering engine + +**Security:** ✅ **Strong** - Chromium's security model with Python backend isolation --- -## 1. Technical Architecture Analysis +## 1. Architecture Overview -### 1.1 Current Architecture Overview +### 1.1 Current Platform Architecture TimeSafari uses a sophisticated cross-platform architecture with shared codebase and platform-specific implementations: -```skeleton +```typescript src/ ├── main.common.ts # Shared initialization ├── main.web.ts # Web/PWA entry point -├── main.capacitor.ts # Mobile entry point -├── main.electron.ts # Electron desktop entry -├── main.pywebview.ts # PyWebView desktop entry +├── main.capacitor.ts # Mobile entry point +├── main.electron.ts # Electron entry point +├── main.pywebview.ts # PyWebView entry point +├── main.cefpython.ts # NEW: CEFPython entry point ├── services/ │ ├── PlatformService.ts # Platform abstraction interface │ ├── PlatformServiceFactory.ts @@ -47,549 +41,117 @@ src/ │ ├── WebPlatformService.ts │ ├── CapacitorPlatformService.ts │ ├── ElectronPlatformService.ts -│ └── PyWebViewPlatformService.ts -└── pywebview/ # Existing Python integration - └── main.py +│ ├── PyWebViewPlatformService.ts +│ └── CEFPythonPlatformService.ts # NEW +└── cefpython/ # NEW: CEFPython backend + ├── main.py + ├── handlers/ + │ ├── database.py # SQLite with migration support + │ ├── crypto.py # Cryptographic operations + │ └── api.py # API server integration + └── bridge/ + └── javascript_bridge.py # JS-Python communication ``` -### 1.2 Proposed CEFPython Architecture - -```typescript -// New CEFPython entry point -src/main.cefpython.ts -src/cefpython/ -├── main.py # CEFPython application entry -├── handlers/ -│ ├── database.py # SQLite database operations -│ ├── crypto.py # Cryptographic operations -│ ├── file_system.py # File system operations -│ └── api.py # API server integration -├── bridge/ -│ ├── javascript_bridge.py # JS-Python communication -│ └── message_handler.py # Message routing -└── utils/ - ├── config.py # Configuration management - └── logger.py # Logging utilities -``` +### 1.2 Migration System Integration -### 1.3 Platform Service Integration +**Key Insight:** CEFPython can use the exact same migration system as Capacitor and web platforms: ```typescript -// New CEFPython platform service -src/services/platforms/CEFPythonPlatformService.ts - -export class CEFPythonPlatformService implements PlatformService { - // Implement platform-specific methods - async dbQuery(sql: string): Promise { - // Bridge to Python SQLite operations - } - - async getCameraStream(): Promise { - // Use CEFPython's camera API - } - - async showNotification(title: string, options: any): Promise { - // Native Python notification system - } -} -``` - ---- - -## 2. Implementation Requirements - -### 2.1 Core Dependencies - -#### Python Dependencies - -```python -# requirements-cefpython.txt -cefpython3>=66.1 -flask>=2.0.0 # For local API server -sqlite3 # Built-in database support -cryptography>=3.4.0 # Enhanced crypto operations -pillow>=8.0.0 # Image processing -requests>=2.25.0 # HTTP client -python-dotenv>=0.19.0 # Environment management -``` - -#### JavaScript Dependencies - -```json -// package.json additions -{ - "devDependencies": { - "@types/cefpython": "^1.0.0", // Type definitions - "cefpython-bridge": "^1.0.0" // JS-Python bridge utilities - } -} -``` - -### 2.2 Build Configuration - -#### Vite Configuration - -```typescript -// vite.config.cefpython.mts -import { defineConfig } from "vite"; -import { createBuildConfig } from "./vite.config.common.mts"; - -export default defineConfig(async () => createBuildConfig('cefpython')); -``` - -#### Build Scripts -```json -// package.json scripts -{ - "scripts": { - "build:cefpython": "vite build --config vite.config.cefpython.mts", - "cefpython:dev": "vite build --config vite.config.cefpython.mts && python src/cefpython/main.py --dev", - "cefpython:build": "vite build --config vite.config.cefpython.mts && python -m PyInstaller --name TimeSafari-CEF src/cefpython/main.py", - "cefpython:package-linux": "npm run build:cefpython && python -m PyInstaller --name TimeSafari-CEF --onefile src/cefpython/main.py", - "cefpython:package-win": "npm run build:cefpython && python -m PyInstaller --name TimeSafari-CEF --onefile --windowed src/cefpython/main.py", - "cefpython:package-mac": "npm run build:cefpython && python -m PyInstaller --name TimeSafari-CEF --onefile --windowed src/cefpython/main.py" - } -} -``` - -### 2.3 Entry Point Implementation - -```typescript -// src/main.cefpython.ts +// src/main.cefpython.ts - CEFPython entry point import { initializeApp } from "./main.common"; +import { runMigrations } from "./db-sql/migration"; +import { CEFPythonPlatformService } from "./services/platforms/CEFPythonPlatformService"; -// CEFPython-specific initialization const app = initializeApp(); -// Configure for CEFPython environment -app.config.globalProperties.$platform = 'cefpython'; -app.config.globalProperties.$isDesktop = true; +// Initialize CEFPython platform service +const platformService = new CEFPythonPlatformService(); + +// Run migrations using the same system as Capacitor +async function initializeDatabase() { + const sqlExec = (sql: string) => platformService.dbExecute(sql); + const sqlQuery = (sql: string) => platformService.dbQuery(sql); + const extractMigrationNames = (result: any) => { + const names = result.values?.map((row: any) => row.name) || []; + return new Set(names); + }; + + await runMigrations(sqlExec, sqlQuery, extractMigrationNames); +} -app.mount("#app"); +// Initialize database before mounting app +initializeDatabase().then(() => { + app.mount("#app"); +}); ``` --- -## 3. CEFPython Application Structure - -### 3.1 Main Application Entry - -```python -# src/cefpython/main.py -import sys -import os -import webview -from cefpython3 import cefpython as cef -from pathlib import Path -import threading -import json -import logging - -from .handlers.database import DatabaseHandler -from .handlers.crypto import CryptoHandler -from .handlers.file_system import FileSystemHandler -from .handlers.api import APIHandler -from .bridge.javascript_bridge import JavaScriptBridge -from .utils.config import Config -from .utils.logger import setup_logger - -class TimeSafariCEF: - def __init__(self): - self.config = Config() - self.logger = setup_logger() - self.bridge = JavaScriptBridge() - - # Initialize handlers - self.db_handler = DatabaseHandler() - self.crypto_handler = CryptoHandler() - self.fs_handler = FileSystemHandler() - self.api_handler = APIHandler() - - # CEF settings - self.settings = { - "debug": True, - "log_severity": cef.LOGSEVERITY_INFO, - "log_file": "cef.log", - "remote_debugging_port": 9222, - "windowless_rendering_enabled": False, - "context_menu": { - "enabled": True, - "navigation": True, - "print": True, - "view_source": True, - "external_browser": True, - } - } - - def initialize_cef(self): - """Initialize CEF with custom settings""" - sys.excepthook = cef.ExceptHook - cef.Initialize(settings=self.settings) - - # Register JavaScript bindings - self.bridge.register_handlers({ - 'database': self.db_handler, - 'crypto': self.crypto_handler, - 'filesystem': self.fs_handler, - 'api': self.api_handler - }) - - def create_window(self): - """Create the main application window""" - window_info = cef.WindowInfo() - window_info.SetAsChild(0, [0, 0, 1200, 800]) - - # Load the built web application - dist_path = Path(__file__).parent.parent.parent / 'dist' - index_path = dist_path / 'index.html' - - if not index_path.exists(): - raise FileNotFoundError(f"Built application not found at {index_path}") - - # Create browser - self.browser = cef.CreateBrowserSync( - window_info, - url=f"file://{index_path.absolute()}" - ) - - # Set up message handling - self.browser.SetClientHandler(ClientHandler()) - - def run(self): - """Run the CEF application""" - try: - self.initialize_cef() - self.create_window() - cef.MessageLoop() - except Exception as e: - self.logger.error(f"CEF application error: {e}") - raise - finally: - cef.Shutdown() - -class ClientHandler: - """Handle browser client events""" - - def OnLoadingStateChange(self, browser, is_loading, can_go_back, can_go_forward): - if not is_loading: - # Inject custom JavaScript bridge - browser.ExecuteJavascript(""" - window.cefBridge = { - call: function(handler, method, ...args) { - return new Promise((resolve, reject) => { - // Implementation for JS-Python bridge - }); - } - }; - """) - -def main(): - """Main entry point""" - app = TimeSafariCEF() - app.run() - -if __name__ == '__main__': - main() -``` - -### 3.2 JavaScript Bridge Implementation - -```python -# src/cefpython/bridge/javascript_bridge.py -import json -import logging -from typing import Dict, Any, Callable - -class JavaScriptBridge: - """Bridge between JavaScript and Python""" - - def __init__(self): - self.logger = logging.getLogger(__name__) - self.handlers: Dict[str, Any] = {} - self.callbacks: Dict[str, Callable] = {} - - def register_handlers(self, handlers: Dict[str, Any]): - """Register Python handlers for JavaScript calls""" - self.handlers.update(handlers) - self.logger.info(f"Registered handlers: {list(handlers.keys())}") - - def handle_js_call(self, handler_name: str, method_name: str, args: list, callback_id: str): - """Handle JavaScript calls to Python""" - try: - if handler_name not in self.handlers: - raise ValueError(f"Handler '{handler_name}' not found") - - handler = self.handlers[handler_name] - method = getattr(handler, method_name, None) - - if not method: - raise ValueError(f"Method '{method_name}' not found in handler '{handler_name}'") - - # Execute the method - result = method(*args) - - # Return result to JavaScript - self._send_result_to_js(callback_id, result, None) - - except Exception as e: - self.logger.error(f"Error handling JS call: {e}") - self._send_result_to_js(callback_id, None, str(e)) - - def _send_result_to_js(self, callback_id: str, result: Any, error: str = None): - """Send result back to JavaScript""" - response = { - 'callbackId': callback_id, - 'result': result, - 'error': error - } - - # This would be implemented to send data back to the browser - # Implementation depends on CEF's messaging system - pass -``` +## 2. Python Backend Implementation -### 3.3 Database Handler +### 2.1 Database Handler with Migration Support ```python # src/cefpython/handlers/database.py import sqlite3 -import json -import logging from pathlib import Path from typing import List, Dict, Any class DatabaseHandler: - """Handle SQLite database operations""" - def __init__(self): - self.logger = logging.getLogger(__name__) self.db_path = self._get_db_path() - self.connection = None - self._initialize_db() + self.connection = sqlite3.connect(str(self.db_path)) + self.connection.row_factory = sqlite3.Row + + # Configure for better performance + self.connection.execute("PRAGMA journal_mode=WAL;") + self.connection.execute("PRAGMA synchronous=NORMAL;") - def _get_db_path(self) -> Path: - """Get database file path""" - # Use user data directory for persistent storage - if sys.platform == "win32": - base_path = Path.home() / "AppData" / "Local" / "TimeSafari" - elif sys.platform == "darwin": - base_path = Path.home() / "Library" / "Application Support" / "TimeSafari" + def query(self, sql: str, params: List[Any] = None) -> Dict[str, Any]: + """Execute SQL query and return results in Capacitor-compatible format""" + cursor = self.connection.cursor() + + if params: + cursor.execute(sql, params) else: - base_path = Path.home() / ".local" / "share" / "timesafari" + cursor.execute(sql) - base_path.mkdir(parents=True, exist_ok=True) - return base_path / "timesafari.db" - - def _initialize_db(self): - """Initialize database connection and tables""" - try: - self.connection = sqlite3.connect(str(self.db_path)) - self.connection.row_factory = sqlite3.Row - - # Create tables if they don't exist - self._create_tables() - self.logger.info(f"Database initialized at {self.db_path}") - - except Exception as e: - self.logger.error(f"Database initialization error: {e}") - raise + if sql.strip().upper().startswith('SELECT'): + columns = [description[0] for description in cursor.description] + rows = [] + for row in cursor.fetchall(): + rows.append(dict(zip(columns, row))) + return {'values': rows} # Match Capacitor format + else: + self.connection.commit() + return {'affected_rows': cursor.rowcount} - def _create_tables(self): - """Create database tables""" - tables = [ - """ - CREATE TABLE IF NOT EXISTS contacts ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - did TEXT UNIQUE NOT NULL, - name TEXT, - image TEXT, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP - ) - """, - """ - CREATE TABLE IF NOT EXISTS settings ( - key TEXT PRIMARY KEY, - value TEXT NOT NULL, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP - ) - """, - """ - CREATE TABLE IF NOT EXISTS logs ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - level TEXT NOT NULL, - message TEXT NOT NULL, - timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP - ) - """ - ] - + def execute(self, sql: string, params: List[Any] = None) -> Dict[str, Any]: + """Execute SQL statement (for INSERT, UPDATE, DELETE, CREATE)""" cursor = self.connection.cursor() - for table_sql in tables: - cursor.execute(table_sql) + + if params: + cursor.execute(sql, params) + else: + cursor.execute(sql) + self.connection.commit() - - def query(self, sql: str, params: List[Any] = None) -> List[Dict[str, Any]]: - """Execute SQL query and return results""" - try: - cursor = self.connection.cursor() - - if params: - cursor.execute(sql, params) - else: - cursor.execute(sql) - - if sql.strip().upper().startswith('SELECT'): - # Return query results - columns = [description[0] for description in cursor.description] - rows = [] - for row in cursor.fetchall(): - rows.append(dict(zip(columns, row))) - return rows - else: - # Execute non-query statement - self.connection.commit() - return [{'affected_rows': cursor.rowcount}] - - except Exception as e: - self.logger.error(f"Database query error: {e}") - self.connection.rollback() - raise - - def close(self): - """Close database connection""" - if self.connection: - self.connection.close() -``` - -### 3.4 Crypto Handler - -```python -# src/cefpython/handlers/crypto.py -import hashlib -import hmac -import secrets -import base64 -from cryptography.hazmat.primitives import hashes, serialization -from cryptography.hazmat.primitives.asymmetric import rsa, padding -from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes -from cryptography.hazmat.backends import default_backend -import logging - -class CryptoHandler: - """Handle cryptographic operations""" - - def __init__(self): - self.logger = logging.getLogger(__name__) - - def generate_key_pair(self) -> Dict[str, str]: - """Generate RSA key pair""" - try: - private_key = rsa.generate_private_key( - public_exponent=65537, - key_size=2048, - backend=default_backend() - ) - - public_key = private_key.public_key() - - # Serialize keys - private_pem = private_key.private_bytes( - encoding=serialization.Encoding.PEM, - format=serialization.PrivateFormat.PKCS8, - encryption_algorithm=serialization.NoEncryption() - ) - - public_pem = public_key.public_bytes( - encoding=serialization.Encoding.PEM, - format=serialization.PublicFormat.SubjectPublicKeyInfo - ) - - return { - 'private_key': private_pem.decode('utf-8'), - 'public_key': public_pem.decode('utf-8') + + return { + 'changes': { + 'changes': cursor.rowcount, + 'lastId': cursor.lastrowid } - - except Exception as e: - self.logger.error(f"Key generation error: {e}") - raise - - def sign_data(self, data: str, private_key_pem: str) -> str: - """Sign data with private key""" - try: - private_key = serialization.load_pem_private_key( - private_key_pem.encode('utf-8'), - password=None, - backend=default_backend() - ) - - signature = private_key.sign( - data.encode('utf-8'), - padding.PSS( - mgf=padding.MGF1(hashes.SHA256()), - salt_length=padding.PSS.MAX_LENGTH - ), - hashes.SHA256() - ) - - return base64.b64encode(signature).decode('utf-8') - - except Exception as e: - self.logger.error(f"Signing error: {e}") - raise - - def verify_signature(self, data: str, signature: str, public_key_pem: str) -> bool: - """Verify signature with public key""" - try: - public_key = serialization.load_pem_public_key( - public_key_pem.encode('utf-8'), - backend=default_backend() - ) - - signature_bytes = base64.b64decode(signature) - - public_key.verify( - signature_bytes, - data.encode('utf-8'), - padding.PSS( - mgf=padding.MGF1(hashes.SHA256()), - salt_length=padding.PSS.MAX_LENGTH - ), - hashes.SHA256() - ) - - return True - - except Exception as e: - self.logger.error(f"Signature verification error: {e}") - return False - - def generate_random_bytes(self, length: int) -> str: - """Generate random bytes""" - return base64.b64encode(secrets.token_bytes(length)).decode('utf-8') - - def hash_data(self, data: str, algorithm: str = 'sha256') -> str: - """Hash data using specified algorithm""" - if algorithm == 'sha256': - return hashlib.sha256(data.encode('utf-8')).hexdigest() - elif algorithm == 'sha512': - return hashlib.sha512(data.encode('utf-8')).hexdigest() - else: - raise ValueError(f"Unsupported hash algorithm: {algorithm}") + } ``` ---- - -## 4. Platform Service Implementation - -### 4.1 CEFPython Platform Service +### 2.2 Platform Service Implementation ```typescript // src/services/platforms/CEFPythonPlatformService.ts import { PlatformService } from '../PlatformService'; -import { Contact } from '@/db/tables/contacts'; -import { PlanData } from '@/interfaces/records'; -import { logger } from '@/utils/logger'; +import { runMigrations } from '@/db-sql/migration'; export class CEFPythonPlatformService implements PlatformService { private bridge: any; @@ -601,804 +163,376 @@ export class CEFPythonPlatformService implements PlatformService { } } + // Database operations using the same interface as Capacitor async dbQuery(sql: string, params?: any[]): Promise { - try { - const result = await this.bridge.call('database', 'query', sql, params || []); - return result; - } catch (error) { - logger.error('[CEFPython] Database query error:', error); - throw error; - } - } - - async getCameraStream(): Promise { - // CEFPython can access system camera through CEF APIs - // This would need to be implemented in the Python backend - throw new Error('Camera access not yet implemented in CEFPython'); - } - - async showNotification(title: string, options: any): Promise { - try { - await this.bridge.call('notifications', 'show', title, options); - } catch (error) { - logger.error('[CEFPython] Notification error:', error); - throw error; - } - } - - async saveFile(data: any, filename: string): Promise { - try { - await this.bridge.call('filesystem', 'save_file', data, filename); - } catch (error) { - logger.error('[CEFPython] File save error:', error); - throw error; - } - } - - async loadFile(filename: string): Promise { - try { - return await this.bridge.call('filesystem', 'load_file', filename); - } catch (error) { - logger.error('[CEFPython] File load error:', error); - throw error; - } - } - - async getSystemInfo(): Promise { - try { - return await this.bridge.call('system', 'get_info'); - } catch (error) { - logger.error('[CEFPython] System info error:', error); - throw error; - } + const result = await this.bridge.call('database', 'query', sql, params || []); + return result; } - isCapacitor(): boolean { - return false; + async dbExecute(sql: string, params?: any[]): Promise { + const result = await this.bridge.call('database', 'execute', sql, params || []); + return result; } - isElectron(): boolean { - return false; + // Migration system integration + async runMigrations(): Promise { + const sqlExec: (sql: string) => Promise = this.dbExecute.bind(this); + const sqlQuery: (sql: string) => Promise = this.dbQuery.bind(this); + const extractMigrationNames: (result: any) => Set = (result) => { + const names = result.values?.map((row: any) => row.name) || []; + return new Set(names); + }; + + await runMigrations(sqlExec, sqlQuery, extractMigrationNames); } + // Platform detection isCEFPython(): boolean { return true; } - isWeb(): boolean { - return false; - } -} -``` - -### 4.2 Platform Service Factory Update - -```typescript -// src/services/PlatformServiceFactory.ts -import { PlatformService } from './PlatformService'; -import { WebPlatformService } from './platforms/WebPlatformService'; -import { CapacitorPlatformService } from './platforms/CapacitorPlatformService'; -import { ElectronPlatformService } from './platforms/ElectronPlatformService'; -import { PyWebViewPlatformService } from './platforms/PyWebViewPlatformService'; -import { CEFPythonPlatformService } from './platforms/CEFPythonPlatformService'; - -export function createPlatformService(platform: string): PlatformService { - switch (platform) { - case 'web': - return new WebPlatformService(); - case 'capacitor': - return new CapacitorPlatformService(); - case 'electron': - return new ElectronPlatformService(); - case 'pywebview': - return new PyWebViewPlatformService(); - case 'cefpython': - return new CEFPythonPlatformService(); - default: - throw new Error(`Unsupported platform: ${platform}`); + getCapabilities(): PlatformCapabilities { + return { + hasCamera: true, + hasFileSystem: true, + hasNotifications: true, + hasSQLite: true, + hasCrypto: true + }; } } ``` --- -## 5. Build and Packaging +## 3. Migration System Compatibility -### 5.1 PyInstaller Configuration +### 3.1 Key Advantage -```python -# src/cefpython/cefpython.spec -# -*- mode: python ; coding: utf-8 -*- - -block_cipher = None - -a = Analysis( - ['main.py'], - pathex=[], - binaries=[], - datas=[ - ('../../dist', 'dist'), # Include built web app - ('../../assets', 'assets'), # Include assets - ], - hiddenimports=[ - 'cefpython3', - 'flask', - 'cryptography', - 'pillow', - 'requests', - 'python-dotenv', - ], - hookspath=[], - hooksconfig={}, - runtime_hooks=[], - excludes=[], - win_no_prefer_redirects=False, - win_private_assemblies=False, - cipher=block_cipher, - noarchive=False, -) - -pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) - -exe = EXE( - pyz, - a.scripts, - a.binaries, - a.zipfiles, - a.datas, - [], - name='TimeSafari-CEF', - debug=False, - bootloader_ignore_signals=False, - strip=False, - upx=True, - upx_exclude=[], - runtime_tmpdir=None, - console=False, - disable_windowed_traceback=False, - argv_emulation=False, - target_arch=None, - codesign_identity=None, - entitlements_file=None, - icon='../../assets/icon.ico' # Application icon -) -``` - -### 5.2 Build Scripts +**CEFPython can use the exact same migration system as Capacitor:** -```bash -#!/bin/bash -# scripts/build-cefpython.sh - -set -e +```typescript +// Both Capacitor and CEFPython use the same migration.ts +import { runMigrations } from '@/db-sql/migration'; -echo "Building TimeSafari CEFPython application..." +// Capacitor implementation +const sqlExec: (sql: string) => Promise = this.db.execute.bind(this.db); +const sqlQuery: (sql: string) => Promise = this.db.query.bind(this.db); -# Build the web application -echo "Building web application..." -npm run build:cefpython +// CEFPython implementation +const sqlExec: (sql: string) => Promise = this.dbExecute.bind(this); +const sqlQuery: (sql: string) => Promise = this.dbQuery.bind(this); -# Create virtual environment if it doesn't exist -if [ ! -d ".venv-cefpython" ]; then - echo "Creating virtual environment..." - python3 -m venv .venv-cefpython -fi +// Both use the same migration runner +await runMigrations(sqlExec, sqlQuery, extractMigrationNames); +``` -# Activate virtual environment -source .venv-cefpython/bin/activate +### 3.2 Database Format Compatibility -# Install Python dependencies -echo "Installing Python dependencies..." -pip install -r requirements-cefpython.txt +The Python database handler returns data in the same format as Capacitor: -# Build executable -echo "Building executable..." -python -m PyInstaller src/cefpython/cefpython.spec +```python +# Python returns Capacitor-compatible format +def query(self, sql: str, params: List[Any] = None) -> Dict[str, Any]: + # ... execute query ... + return { + 'values': [ + {'name': '001_initial', 'executed_at': '2025-01-01'}, + {'name': '002_add_contacts', 'executed_at': '2025-01-02'} + ] + } +``` -echo "Build complete! Executable available in dist/TimeSafari-CEF" +This matches the Capacitor format: +```typescript +// Capacitor returns same format +const result = await this.db.query("SELECT name FROM migrations"); +// result = { values: [{ name: '001_initial' }, { name: '002_add_contacts' }] } ``` --- -## 6. Development Workflow - -### 6.1 Development Environment Setup - -```bash -# Development setup script -#!/bin/bash -# scripts/setup-cefpython-dev.sh - -echo "Setting up CEFPython development environment..." +## 4. Build Configuration -# Install system dependencies (Ubuntu/Debian) -sudo apt-get update -sudo apt-get install -y \ - python3-dev \ - python3-pip \ - python3-venv \ - build-essential \ - libssl-dev \ - libffi-dev +### 4.1 Vite Configuration -# Create virtual environment -python3 -m venv .venv-cefpython -source .venv-cefpython/bin/activate - -# Install Python dependencies -pip install -r requirements-cefpython.txt - -# Install development dependencies -pip install -r requirements-cefpython-dev.txt +```typescript +// vite.config.cefpython.mts +import { defineConfig } from 'vite'; +import { createBuildConfig } from './vite.config.common.mts'; -echo "CEFPython development environment ready!" +export default defineConfig({ + ...createBuildConfig('cefpython'), + + define: { + 'process.env.VITE_PLATFORM': JSON.stringify('cefpython'), + 'process.env.VITE_PWA_ENABLED': JSON.stringify(false), + __IS_MOBILE__: JSON.stringify(false), + __USE_QR_READER__: JSON.stringify(true) + } +}); ``` -### 6.2 Development Workflow +### 4.2 Package.json Scripts ```json -// package.json development scripts { "scripts": { - "dev:cefpython": "concurrently \"npm run dev:web\" \"npm run dev:cefpython-server\"", - "dev:cefpython-server": "python src/cefpython/main.py --dev --port 8080", - "test:cefpython": "python -m pytest tests/cefpython/", - "lint:cefpython": "flake8 src/cefpython/", - "format:cefpython": "black src/cefpython/" + "build:cefpython": "vite build --config vite.config.cefpython.mts", + "dev:cefpython": "concurrently \"npm run dev:web\" \"python src/cefpython/main.py --dev\"", + "test:cefpython": "python -m pytest tests/cefpython/" } } ``` -### 6.3 Testing Strategy - -```python -# tests/cefpython/test_handlers.py -import pytest -import tempfile -import os -from src.cefpython.handlers.database import DatabaseHandler -from src.cefpython.handlers.crypto import CryptoHandler - -class TestDatabaseHandler: - @pytest.fixture - def db_handler(self): - """Create temporary database for testing""" - with tempfile.NamedTemporaryFile(suffix='.db', delete=False) as tmp: - db_path = tmp.name - - handler = DatabaseHandler() - handler.db_path = db_path - yield handler - - # Cleanup - os.unlink(db_path) - - def test_query_execution(self, db_handler): - """Test basic SQL query execution""" - result = db_handler.query("SELECT 1 as test") - assert result[0]['test'] == 1 - - def test_table_creation(self, db_handler): - """Test table creation""" - db_handler.query(""" - CREATE TABLE test_table ( - id INTEGER PRIMARY KEY, - name TEXT - ) - """) - - result = db_handler.query("SELECT name FROM sqlite_master WHERE type='table' AND name='test_table'") - assert len(result) == 1 +### 4.3 Python Requirements -class TestCryptoHandler: - @pytest.fixture - def crypto_handler(self): - return CryptoHandler() - - def test_key_generation(self, crypto_handler): - """Test RSA key pair generation""" - keys = crypto_handler.generate_key_pair() - assert 'private_key' in keys - assert 'public_key' in keys - assert keys['private_key'].startswith('-----BEGIN PRIVATE KEY-----') - assert keys['public_key'].startswith('-----BEGIN PUBLIC KEY-----') - - def test_signature_verification(self, crypto_handler): - """Test data signing and verification""" - keys = crypto_handler.generate_key_pair() - data = "test data" - - signature = crypto_handler.sign_data(data, keys['private_key']) - assert crypto_handler.verify_signature(data, signature, keys['public_key']) +```txt +# requirements-cefpython.txt +cefpython3>=66.1 +cryptography>=3.4.0 +requests>=2.25.0 +pyinstaller>=4.0 +pytest>=6.0.0 ``` --- -## 7. Performance and Security Analysis +## 5. Platform Service Factory Integration -### 7.1 Performance Comparison +### 5.1 Updated Factory -| Metric | Electron | PyWebView | CEFPython | Notes | -|--------|----------|-----------|-----------|-------| -| **Memory Usage** | ~100-150MB | ~50-80MB | ~80-120MB | CEFPython uses Chromium engine | -| **Startup Time** | 2-4 seconds | 1-2 seconds | 1-3 seconds | Faster than Electron | -| **Bundle Size** | ~150-200MB | ~30-50MB | ~80-120MB | Includes Chromium runtime | -| **CPU Usage** | Medium | Low | Medium | Chromium overhead | -| **Python Integration** | Via IPC | Direct | Direct | Native Python access | +```typescript +// src/services/PlatformServiceFactory.ts +import { CEFPythonPlatformService } from './platforms/CEFPythonPlatformService'; -### 7.2 Security Considerations +export function createPlatformService(platform: string): PlatformService { + switch (platform) { + case 'web': + return new WebPlatformService(); + case 'capacitor': + return new CapacitorPlatformService(); + case 'electron': + return new ElectronPlatformService(); + case 'pywebview': + return new PyWebViewPlatformService(); + case 'cefpython': + return new CEFPythonPlatformService(); // NEW + default: + throw new Error(`Unsupported platform: ${platform}`); + } +} +``` -#### Advantages +--- -- ✅ **Chromium Security**: Uses Chromium's security model -- ✅ **Sandboxing**: Process isolation between browser and Python -- ✅ **Regular Updates**: Chromium security updates -- ✅ **HTTPS Enforcement**: Built-in security policies +## 6. Performance and Security Analysis -#### Considerations +### 6.1 Performance Comparison -- ⚠️ **Native Code**: Python backend has system access -- ⚠️ **File System Access**: Direct file system operations -- ⚠️ **Network Access**: Full network capabilities -- ⚠️ **Dependency Security**: Python package vulnerabilities +| Metric | Electron | PyWebView | CEFPython | Notes | +|--------|----------|-----------|-----------|-------| +| **Memory Usage** | 150-200MB | 80-120MB | 100-150MB | CEFPython more efficient than Electron | +| **Startup Time** | 3-5s | 2-3s | 2-4s | Similar to PyWebView | +| **Database Performance** | Good | Good | Excellent | Native SQLite | +| **Crypto Performance** | Good | Good | Excellent | Native Python crypto | +| **Bundle Size** | 120-150MB | 50-80MB | 80-120MB | Smaller than Electron | -### 7.3 Security Implementation +### 6.2 Security Features ```python -# src/cefpython/security/security_manager.py -import os -import sys -import logging -from pathlib import Path -from typing import List, Dict, Any - +# src/cefpython/utils/security.py class SecurityManager: - """Manage application security policies""" - def __init__(self): - self.logger = logging.getLogger(__name__) - self.allowed_paths = self._get_allowed_paths() - self.blocked_domains = self._get_blocked_domains() - - def _get_allowed_paths(self) -> List[Path]: - """Get list of allowed file system paths""" - user_data_dir = self._get_user_data_dir() - return [ - user_data_dir, - user_data_dir / 'database', - user_data_dir / 'logs', - user_data_dir / 'cache' - ] - - def _get_blocked_domains(self) -> List[str]: - """Get list of blocked network domains""" - return [ - 'localhost', - '127.0.0.1', - # Add other blocked domains as needed - ] - - def validate_file_access(self, file_path: Path) -> bool: - """Validate if file access is allowed""" - try: - file_path = Path(file_path).resolve() - - # Check if path is within allowed directories - for allowed_path in self.allowed_paths: - if file_path.is_relative_to(allowed_path): - return True - - self.logger.warning(f"Blocked file access attempt: {file_path}") - return False - - except Exception as e: - self.logger.error(f"File access validation error: {e}") - return False + self.blocked_domains = set(['malicious-site.com']) + self.allowed_schemes = {'https', 'http', 'file'} def validate_network_access(self, url: str) -> bool: """Validate if network access is allowed""" - try: - from urllib.parse import urlparse - parsed = urlparse(url) - - # Check blocked domains - if parsed.hostname in self.blocked_domains: - self.logger.warning(f"Blocked network access attempt: {url}") - return False - - # Allow HTTPS only for external domains - if parsed.scheme != 'https' and parsed.hostname != 'localhost': - self.logger.warning(f"Blocked non-HTTPS access: {url}") - return False - - return True - - except Exception as e: - self.logger.error(f"Network access validation error: {e}") + from urllib.parse import urlparse + parsed = urlparse(url) + + # Check blocked domains + if parsed.hostname in self.blocked_domains: return False - - def sanitize_input(self, data: Any) -> Any: - """Sanitize user input""" - if isinstance(data, str): - # Basic input sanitization - return data.strip() - return data -``` - ---- - -## 8. Integration with Existing Features - -### 8.1 Database Integration - -```typescript -// src/db/index.ts - CEFPython integration -import { PlatformServiceFactory } from '@/services/PlatformServiceFactory'; - -export async function initializeDatabase() { - const platformService = PlatformServiceFactory.getInstance(); - - if (platformService.isCEFPython()) { - // Use CEFPython database handler - return await platformService.dbQuery(` - CREATE TABLE IF NOT EXISTS accounts ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - did TEXT UNIQUE NOT NULL, - name TEXT, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP - ) - `); - } else { - // Use existing database implementation - // ... existing code ... - } -} -``` - -### 8.2 Crypto Integration - -```typescript -// src/libs/crypto/index.ts - CEFPython integration -import { PlatformServiceFactory } from '@/services/PlatformServiceFactory'; - -export async function generateKeyPair() { - const platformService = PlatformServiceFactory.getInstance(); - - if (platformService.isCEFPython()) { - // Use CEFPython crypto handler - return await platformService.cryptoCall('generate_key_pair'); - } else { - // Use existing crypto implementation - // ... existing code ... - } -} -``` - -### 8.3 File System Integration - -```typescript -// src/services/fileService.ts - CEFPython integration -import { PlatformServiceFactory } from './PlatformServiceFactory'; - -export class FileService { - private platformService = PlatformServiceFactory.getInstance(); - - async saveFile(data: any, filename: string): Promise { - if (this.platformService.isCEFPython()) { - return await this.platformService.saveFile(data, filename); - } else { - // Use existing file system implementation - // ... existing code ... - } - } - - async loadFile(filename: string): Promise { - if (this.platformService.isCEFPython()) { - return await this.platformService.loadFile(filename); - } else { - // Use existing file system implementation - // ... existing code ... - } - } -} -``` - ---- - -## 9. Deployment and Distribution - -### 9.1 Cross-Platform Build Scripts - -```bash -#!/bin/bash -# scripts/build-all-platforms.sh - -set -e - -echo "Building TimeSafari for all platforms..." - -# Build web application -echo "Building web application..." -npm run build:web - -# Build CEFPython for different platforms -echo "Building CEFPython applications..." - -# Linux -echo "Building for Linux..." -docker run --rm -v $(pwd):/app -w /app python:3.9 bash -c " - pip install -r requirements-cefpython.txt - python -m PyInstaller --name TimeSafari-CEF-Linux --onefile src/cefpython/main.py -" - -# Windows (requires Windows environment or cross-compilation) -echo "Building for Windows..." -# This would need to be run on Windows or using cross-compilation tools - -# macOS -echo "Building for macOS..." -python3 -m PyInstaller --name TimeSafari-CEF-Mac --onefile --windowed src/cefpython/main.py - -echo "Build complete!" -``` - -### 9.2 CI/CD Integration - -```yaml -# .github/workflows/cefpython-build.yml -name: CEFPython Build - -on: - push: - branches: [ main, develop ] - pull_request: - branches: [ main ] - -jobs: - build-cefpython: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.9' - - - name: Set up Node.js - uses: actions/setup-node@v3 - with: - node-version: '18' - cache: 'npm' - - - name: Install Node.js dependencies - run: npm ci - - - name: Build web application - run: npm run build:cefpython - - - name: Install Python dependencies - run: | - python -m pip install --upgrade pip - pip install -r requirements-cefpython.txt - - - name: Run tests - run: | - npm run test:cefpython - python -m pytest tests/cefpython/ - - - name: Build CEFPython application - run: python -m PyInstaller --name TimeSafari-CEF --onefile src/cefpython/main.py - - - name: Upload artifacts - uses: actions/upload-artifact@v3 - with: - name: timesafari-cefpython - path: dist/TimeSafari-CEF + + # Allow HTTPS only for external domains + if parsed.scheme != 'https' and parsed.hostname != 'localhost': + return False + + return True ``` --- -## 10. Migration Strategy +## 7. Migration Strategy -### 10.1 Phase 1: Foundation (Week 1-2) +### 7.1 Phase 1: Foundation (Week 1-2) **Objectives:** - Set up CEFPython development environment - Create basic application structure -- Implement core handlers (database, crypto, file system) +- Implement database handler with migration support - Establish JavaScript-Python bridge **Deliverables:** - [ ] Basic CEFPython application that loads TimeSafari web app - [ ] Database handler with SQLite integration -- [ ] Crypto handler with RSA operations -- [ ] File system handler for basic operations +- [ ] Migration system integration - [ ] JavaScript bridge for communication -### 10.2 Phase 2: Platform Integration (Week 3-4) +### 7.2 Phase 2: Platform Integration (Week 3-4) **Objectives:** - Implement CEFPython platform service -- Integrate with existing platform service factory -- Add platform-specific features -- Implement security manager +- Integrate with existing migration system +- Test database operations with real data +- Validate migration compatibility **Deliverables:** - [ ] CEFPython platform service implementation -- [ ] Integration with existing platform detection -- [ ] Security manager with access controls -- [ ] Basic feature parity with other platforms +- [ ] Migration system integration +- [ ] Database compatibility testing +- [ ] Performance benchmarking -### 10.3 Phase 3: Feature Parity (Week 5-6) +### 7.3 Phase 3: Feature Integration (Week 5-6) **Objectives:** -- Implement all TimeSafari features in CEFPython -- Add advanced handlers (API, notifications, camera) -- Optimize performance and memory usage -- Add comprehensive error handling +- Integrate with existing platform features +- Implement API server integration +- Add security features +- Test with real user workflows **Deliverables:** -- [ ] Full feature parity with other platforms -- [ ] Performance optimizations -- [ ] Comprehensive error handling and logging -- [ ] Advanced handlers for all features +- [ ] Full feature compatibility +- [ ] API integration +- [ ] Security implementation +- [ ] User workflow testing -### 10.4 Phase 4: Testing and Polish (Week 7-8) +### 7.4 Phase 4: Polish and Distribution (Week 7-8) **Objectives:** -- Comprehensive testing across platforms -- Performance benchmarking -- Security audit -- Documentation and deployment +- Optimize performance +- Add build and distribution scripts +- Create documentation +- Prepare for release **Deliverables:** -- [ ] Comprehensive test suite -- [ ] Performance benchmarks -- [ ] Security audit report -- [ ] Complete documentation -- [ ] Deployment scripts for all platforms +- [ ] Performance optimization +- [ ] Build automation +- [ ] Documentation +- [ ] Release-ready application --- -## 11. Risk Assessment and Mitigation +## 8. Risk Assessment -### 11.1 Technical Risks +### 8.1 Technical Risks | Risk | Probability | Impact | Mitigation | |------|-------------|--------|------------| -| **CEFPython Compatibility** | Medium | High | Test with current CEFPython version, maintain compatibility matrix | -| **Performance Issues** | Medium | Medium | Benchmark early, optimize critical paths, monitor memory usage | -| **Security Vulnerabilities** | Low | High | Regular security updates, code review, penetration testing | -| **Cross-Platform Issues** | Medium | Medium | Test on all target platforms, use CI/CD for automated testing | +| **CEFPython compatibility issues** | Medium | High | Use stable CEFPython version, test thoroughly | +| **Migration system integration** | Low | High | Follow existing patterns, extensive testing | +| **Performance issues** | Low | Medium | Benchmark early, optimize as needed | +| **Security vulnerabilities** | Low | High | Implement security manager, regular audits | -### 11.2 Development Risks +### 8.2 Development Risks | Risk | Probability | Impact | Mitigation | |------|-------------|--------|------------| -| **Learning Curve** | High | Medium | Allocate extra time for learning, provide training resources | -| **Integration Complexity** | Medium | High | Incremental integration, comprehensive testing, rollback plan | -| **Maintenance Overhead** | Medium | Medium | Good documentation, automated testing, clear code organization | - -### 11.3 Mitigation Strategies - -#### Technical Mitigation -- **Compatibility Testing**: Regular testing with CEFPython updates -- **Performance Monitoring**: Continuous performance benchmarking -- **Security Audits**: Regular security reviews and updates -- **Cross-Platform Testing**: Automated testing on all platforms - -#### Development Mitigation -- **Incremental Development**: Small, testable increments -- **Comprehensive Testing**: Unit, integration, and end-to-end tests -- **Documentation**: Clear documentation for all components -- **Code Review**: Regular code reviews for quality assurance +| **Python/CEF knowledge gap** | Medium | Medium | Training, documentation, pair programming | +| **Integration complexity** | Medium | Medium | Incremental development, extensive testing | +| **Build system complexity** | Low | Medium | Automated build scripts, CI/CD | --- -## 12. Success Metrics - -### 12.1 Technical Metrics - -| Metric | Target | Measurement | -|--------|--------|-------------| -| **Startup Time** | < 3 seconds | Average startup time across platforms | -| **Memory Usage** | < 120MB | Peak memory usage during normal operation | -| **Bundle Size** | < 120MB | Final executable size | -| **Feature Parity** | 100% | All features working identically to other platforms | -| **Test Coverage** | > 90% | Code coverage for CEFPython components | +## 9. Success Metrics -### 12.2 User Experience Metrics +### 9.1 Technical Metrics -| Metric | Target | Measurement | -|--------|--------|-------------| -| **Performance** | No regression | User-perceived performance vs other platforms | -| **Stability** | 99.9% uptime | Application stability during normal use | -| **Usability** | Identical UX | User experience consistency across platforms | +- [ ] **Migration Compatibility:** 100% compatibility with existing migration system +- [ ] **Performance:** < 150MB memory usage, < 4s startup time +- [ ] **Security:** Pass security audit, no critical vulnerabilities +- [ ] **Reliability:** 99%+ uptime, < 1% error rate -### 12.3 Development Metrics +### 9.2 Development Metrics -| Metric | Target | Measurement | -|--------|--------|-------------| -| **Build Time** | < 10 minutes | Time to build CEFPython application | -| **Deployment Time** | < 5 minutes | Time to deploy to all platforms | -| **Maintenance Effort** | < 20% increase | Additional maintenance effort vs current platforms | +- [ ] **Code Quality:** 90%+ test coverage, < 5% code duplication +- [ ] **Documentation:** Complete API documentation, user guides +- [ ] **Build Automation:** Automated builds, CI/CD pipeline +- [ ] **Release Readiness:** Production-ready application --- -## 13. Conclusion and Recommendations +## 10. Conclusion -### 13.1 Feasibility Assessment +### 10.1 Recommendation -**✅ Highly Feasible** - CEFPython implementation is technically feasible and aligns well with TimeSafari's architecture. The existing platform service pattern provides a clean integration path. +**✅ PROCEED WITH IMPLEMENTATION** -### 13.2 Key Benefits +CEFPython provides an excellent opportunity to add a robust desktop platform to TimeSafari with: -1. **Native Python Integration**: Direct access to Python ecosystem for advanced features -2. **Enhanced Security**: Chromium's security model with Python backend -3. **Performance**: Potentially better performance than Electron for Python workloads -4. **Cross-Platform**: Consistent experience across Windows, macOS, and Linux -5. **Mature Framework**: Stable, well-documented, and actively maintained +1. **Full Migration System Compatibility:** Can use the exact same migration system as Capacitor and web +2. **Native Performance:** Python backend with Chromium rendering +3. **Security:** Chromium's security model with Python backend isolation +4. **Development Efficiency:** Follows established patterns and architecture -### 13.3 Implementation Recommendations +### 10.2 Implementation Priority -1. **Start with Foundation**: Begin with basic CEFPython setup and core handlers -2. **Incremental Integration**: Add features incrementally with comprehensive testing -3. **Performance Focus**: Monitor and optimize performance from the start -4. **Security First**: Implement security manager early and maintain throughout -5. **Documentation**: Maintain comprehensive documentation for all components +**High Priority:** +- Database handler with migration support +- JavaScript-Python bridge +- Platform service integration +- Basic application structure -### 13.4 Timeline Recommendation +**Medium Priority:** +- Crypto handler integration +- API server integration +- Security features +- Performance optimization -**Recommended Timeline**: 8 weeks (2 months) -- **Phase 1**: Foundation (2 weeks) -- **Phase 2**: Platform Integration (2 weeks) -- **Phase 3**: Feature Parity (2 weeks) -- **Phase 4**: Testing and Polish (2 weeks) +**Low Priority:** +- Advanced features +- Build automation +- Documentation +- Distribution packaging -### 13.5 Resource Requirements +### 10.3 Timeline -- **1 Senior Developer**: Full-time for 8 weeks -- **1 QA Engineer**: Part-time for testing and validation -- **Development Environment**: Standard development setup with Python 3.9+ -- **Testing Infrastructure**: Multi-platform testing environment +**Total Duration:** 8 weeks (2 months) +**Team Size:** 1-2 developers +**Risk Level:** Medium +**Confidence:** 85% -### 13.6 Next Steps - -1. **Approval**: Get stakeholder approval for the implementation -2. **Environment Setup**: Set up CEFPython development environment -3. **Team Training**: Provide CEFPython training to development team -4. **Pilot Implementation**: Start with Phase 1 foundation work -5. **Regular Reviews**: Weekly progress reviews and milestone checkpoints +The implementation leverages TimeSafari's existing architecture and migration system, making it a natural addition to the platform ecosystem while providing users with a high-performance desktop option. --- -## Appendix - -### A. CEFPython Resources +## 11. Next Steps -- [CEFPython Documentation](https://cefpython.readthedocs.io/) -- [CEFPython GitHub Repository](https://github.com/cztomczak/cefpython) -- [Chromium Embedded Framework](https://bitbucket.org/chromiumembedded/cef) -- [PyInstaller Documentation](https://pyinstaller.readthedocs.io/) +1. **Immediate Actions:** + - Set up development environment + - Create basic CEFPython application structure + - Implement database handler with migration support -### B. Related Technologies +2. **Week 1-2:** + - Complete foundation implementation + - Test migration system integration + - Validate database operations -- **PyWebView**: Current Python desktop solution -- **Electron**: Current Node.js desktop solution -- **Capacitor**: Mobile solution -- **Vue.js**: Frontend framework -- **TypeScript**: Development language +3. **Week 3-4:** + - Implement platform service + - Integrate with existing features + - Begin performance testing -### C. Security References +4. **Week 5-6:** + - Complete feature integration + - Security implementation + - User workflow testing -- [CEFPython Security](https://cefpython.readthedocs.io/en/latest/security.html) -- [Chromium Security](https://www.chromium.org/Home/chromium-security/) -- [Python Security Best Practices](https://python-security.readthedocs.io/) - ---- +5. **Week 7-8:** + - Performance optimization + - Build automation + - Documentation and release preparation -**Document Version**: 1.0 -**Last Updated**: December 2025 -**Next Review**: January 2026 \ No newline at end of file +This implementation will provide TimeSafari users with a robust, secure, and high-performance desktop application that seamlessly integrates with the existing ecosystem. \ No newline at end of file diff --git a/GiftedDialog-Decomposition-Plan.md b/GiftedDialog-Decomposition-Plan.md index a3a3da62..b8d6c72f 100644 --- a/GiftedDialog-Decomposition-Plan.md +++ b/GiftedDialog-Decomposition-Plan.md @@ -29,6 +29,7 @@ The GiftedDialog component (1060 lines) is a complex Vue component that handles: These components handle pure presentation with minimal business logic: #### 1. PersonCard.vue ✅ + - **Purpose**: Display individual person entities with selection capability - **Features**: - Person avatar using EntityIcon @@ -39,6 +40,7 @@ These components handle pure presentation with minimal business logic: - **Emits**: `person-selected` #### 2. ProjectCard.vue ✅ + - **Purpose**: Display individual project entities with selection capability - **Features**: - Project icon using ProjectIcon @@ -48,6 +50,7 @@ These components handle pure presentation with minimal business logic: - **Emits**: `project-selected` #### 3. EntitySummaryButton.vue ✅ + - **Purpose**: Display selected entity with edit capability in step 2 - **Features**: - Entity avatar (person or project) @@ -58,6 +61,7 @@ These components handle pure presentation with minimal business logic: - **Emits**: `edit-requested` #### 4. AmountInput.vue ✅ + - **Purpose**: Specialized numeric input with increment/decrement controls - **Features**: - Increment/decrement buttons with validation @@ -72,6 +76,7 @@ These components handle pure presentation with minimal business logic: These components handle layout and entity organization: #### 5. EntityGrid.vue ✅ + - **Purpose**: Unified grid layout for displaying people or projects - **Features**: - Responsive grid layout for people/projects @@ -84,6 +89,7 @@ These components handle layout and entity organization: - **Emits**: `entity-selected` #### 6. SpecialEntityCard.vue ✅ + - **Purpose**: Handle special entities like "You" and "Unnamed" - **Features**: - Special icon display (hand, question mark) @@ -94,6 +100,7 @@ These components handle layout and entity organization: - **Emits**: `entity-selected` #### 7. ShowAllCard.vue ✅ + - **Purpose**: Handle "Show All" navigation functionality - **Features**: - Router-link integration @@ -108,6 +115,7 @@ These components handle layout and entity organization: These components handle major UI sections: #### 8. EntitySelectionStep.vue ✅ + - **Purpose**: Complete step 1 entity selection interface - **Features**: - Dynamic step labeling based on context @@ -121,6 +129,7 @@ These components handle major UI sections: - **Emits**: `entity-selected`, `cancel` #### 9. GiftDetailsStep.vue ✅ + - **Purpose**: Complete step 2 gift details form interface - **Features**: - Entity summary display with edit capability @@ -137,6 +146,7 @@ These components handle major UI sections: ### Phase 4: Refactor Main Component (FINAL) #### 9. GiftedDialog.vue (PLANNED REFACTOR) + - **Purpose**: Orchestrate sub-components and manage overall state - **Responsibilities**: - Step navigation logic @@ -150,6 +160,7 @@ These components handle major UI sections: ### ✅ Completed Components **Phase 1: Display Components** + 1. **PersonCard.vue** - Individual person display with selection 2. **ProjectCard.vue** - Individual project display with selection 3. **EntitySummaryButton.vue** - Selected entity display with edit capability @@ -183,6 +194,7 @@ These components handle major UI sections: ## Benefits of This Approach ### 1. Incremental Refactoring + - Each phase can be implemented and tested independently - Reduces risk of breaking existing functionality - Allows for gradual improvement over time diff --git a/package-lock.json b/package-lock.json index 32c3ce63..ccb238b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "timesafari", - "version": "0.4.8", + "version": "0.5.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "timesafari", - "version": "0.4.8", + "version": "0.5.1", "dependencies": { "@capacitor-community/sqlite": "6.0.2", "@capacitor-mlkit/barcode-scanning": "^6.0.0", @@ -205,9 +205,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", - "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.7.tgz", + "integrity": "sha512-xgu/ySj2mTiUFmdE9yCMfBxLp4DHd5DwmbbD05YAuICfodYT3VvRxbrh81LGQ/8UpSdtMdfKMn3KouYDX59DGQ==", "devOptional": true, "license": "MIT", "engines": { @@ -215,22 +215,22 @@ } }, "node_modules/@babel/core": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", - "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.7.tgz", + "integrity": "sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==", "devOptional": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.3", + "@babel/generator": "^7.27.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.4", - "@babel/parser": "^7.27.4", + "@babel/helpers": "^7.27.6", + "@babel/parser": "^7.27.7", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.27.4", - "@babel/types": "^7.27.3", + "@babel/traverse": "^7.27.7", + "@babel/types": "^7.27.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -390,22 +390,47 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", - "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "resolve": "^1.22.10" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "devOptional": true, + "license": "MIT" + }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", @@ -685,12 +710,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", - "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.7.tgz", + "integrity": "sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.3" + "@babel/types": "^7.27.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -1335,17 +1360,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", - "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.7.tgz", + "integrity": "sha512-CuLkokN1PEZ0Fsjtq+001aog/C2drDK9nTfK/NRK0n6rBin6cBrvM+zfQjDE+UllhR6/J4a6w8Xq9i4yi3mQrw==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.27.1", + "@babel/traverse": "^7.27.7", "globals": "^11.1.0" }, "engines": { @@ -1383,13 +1408,14 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz", - "integrity": "sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.7.tgz", + "integrity": "sha512-pg3ZLdIKWCP0CrJm0O4jYjVthyBeioVfvz9nwt6o5paUxsgJ/8GucSMAIaj6M7xA4WY+SrvtGu2LijzkdyecWQ==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.7" }, "engines": { "node": ">=6.9.0" @@ -1749,16 +1775,17 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.3.tgz", - "integrity": "sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.7.tgz", + "integrity": "sha512-201B1kFTWhckclcXpWHc8uUpYziDX/Pl4rxl0ZX0DiCZ3jknwfSUALL3QCYeeXXB37yWxJbo+g+Vfq8pAaHi3w==", "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.3", - "@babel/plugin-transform-parameters": "^7.27.1" + "@babel/plugin-transform-destructuring": "^7.27.7", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.27.7" }, "engines": { "node": ">=6.9.0" @@ -1818,9 +1845,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", - "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -2420,17 +2447,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", - "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.7.tgz", + "integrity": "sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==", "devOptional": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.3", - "@babel/parser": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/parser": "^7.27.7", "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3", + "@babel/types": "^7.27.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2440,18 +2467,18 @@ }, "node_modules/@babel/traverse--for-generate-function-map": { "name": "@babel/traverse", - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", - "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.7.tgz", + "integrity": "sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==", "license": "MIT", "optional": true, "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.3", - "@babel/parser": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/parser": "^7.27.7", "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3", + "@babel/types": "^7.27.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2481,9 +2508,9 @@ } }, "node_modules/@babel/types": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", - "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.7.tgz", + "integrity": "sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -3835,9 +3862,9 @@ } }, "node_modules/@electron/asar/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -4524,9 +4551,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -5147,9 +5174,9 @@ } }, "node_modules/@expo/cli": { - "version": "0.24.14", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.24.14.tgz", - "integrity": "sha512-o+QYyfIBhSRTgaywKTLJhm2Fg5PrSeUVCXS+uQySamgoMjLNhHa8QwE64mW/FmJr5hZLiqUEQxb60FK4JcyqXg==", + "version": "0.24.15", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.24.15.tgz", + "integrity": "sha512-RDZS30OSnbXkSPnBXdyPL29KbltjOmegE23bZZDiGV23WOReWcPgRc5U7Fd8eLPhtRjHBKlBpNJMTed5Ntr/uw==", "license": "MIT", "optional": true, "peer": true, @@ -5158,20 +5185,20 @@ "@babel/runtime": "^7.20.0", "@expo/code-signing-certificates": "^0.0.5", "@expo/config": "~11.0.10", - "@expo/config-plugins": "~10.0.2", + "@expo/config-plugins": "~10.0.3", "@expo/devcert": "^1.1.2", "@expo/env": "~1.0.5", "@expo/image-utils": "^0.7.4", "@expo/json-file": "^9.1.4", - "@expo/metro-config": "~0.20.14", + "@expo/metro-config": "~0.20.15", "@expo/osascript": "^2.2.4", "@expo/package-manager": "^1.8.4", "@expo/plist": "^0.3.4", - "@expo/prebuild-config": "^9.0.6", + "@expo/prebuild-config": "^9.0.7", "@expo/spawn-async": "^1.7.2", "@expo/ws-tunnel": "^1.0.1", "@expo/xcpretty": "^4.3.0", - "@react-native/dev-middleware": "0.79.3", + "@react-native/dev-middleware": "0.79.4", "@urql/core": "^5.0.6", "@urql/exchange-retry": "^1.3.0", "accepts": "^1.3.8", @@ -5602,20 +5629,20 @@ } }, "node_modules/@expo/config-plugins": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-10.0.2.tgz", - "integrity": "sha512-TzUn3pPdpwCS0yYaSlZOClgDmCX8N4I2lfgitX5oStqmvpPtB+vqtdyqsVM02fQ2tlJIAqwBW+NHaHqqy8Jv7g==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-10.0.3.tgz", + "integrity": "sha512-fjCckkde67pSDf48x7wRuPsgQVIqlDwN7NlOk9/DFgQ1hCH0L5pGqoSmikA1vtAyiA83MOTpkGl3F3wyATyUog==", "license": "MIT", "optional": true, "peer": true, "dependencies": { - "@expo/config-types": "^53.0.3", + "@expo/config-types": "^53.0.4", "@expo/json-file": "~9.1.4", "@expo/plist": "^0.3.4", "@expo/sdk-runtime-versions": "^1.0.0", "chalk": "^4.1.2", "debug": "^4.3.5", - "getenv": "^1.0.0", + "getenv": "^2.0.0", "glob": "^10.4.2", "resolve-from": "^5.0.0", "semver": "^7.5.4", @@ -5644,17 +5671,6 @@ } } }, - "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", @@ -5956,9 +5972,9 @@ } }, "node_modules/@expo/fingerprint": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.13.0.tgz", - "integrity": "sha512-3IwpH0p3uO8jrJSLOUNDzJVh7VEBod0emnCBq0hD72sy6ICmzauM6Xf4he+2Tip7fzImCJRd63GaehV+CCtpvA==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.13.1.tgz", + "integrity": "sha512-MgZ5uIvvwAnjWeQoj4D3RnBXjD1GNOpCvhp2jtZWdQ8yEokhDEJGoHjsMT8/NCB5m2fqP5sv2V5nPzC7CN1YjQ==", "license": "MIT", "optional": true, "peer": true, @@ -5969,6 +5985,7 @@ "debug": "^4.3.4", "find-up": "^5.0.0", "getenv": "^2.0.0", + "glob": "^10.4.2", "ignore": "^5.3.1", "minimatch": "^9.0.0", "p-limit": "^3.1.0", @@ -5979,6 +5996,56 @@ "fingerprint": "bin/cli.js" } }, + "node_modules/@expo/fingerprint/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/fingerprint/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/fingerprint/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "optional": true, + "peer": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "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", @@ -6055,9 +6122,9 @@ } }, "node_modules/@expo/metro-config": { - "version": "0.20.14", - "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.20.14.tgz", - "integrity": "sha512-tYDDubuZycK+NX00XN7BMu73kBur/evOPcKfxc+UBeFfgN2EifOITtdwSUDdRsbtJ2OnXwMY1HfRUG3Lq3l4cw==", + "version": "0.20.15", + "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.20.15.tgz", + "integrity": "sha512-m8i58IQ7I8iOdVRfOhFmhPMHuhgeTVfQp1+mxW7URqPZaeVbuDVktPqOiNoHraKBoGPLKMUSsD+qdUuJVL3wMg==", "license": "MIT", "optional": true, "peer": true, @@ -6066,7 +6133,7 @@ "@babel/generator": "^7.20.5", "@babel/parser": "^7.20.0", "@babel/types": "^7.20.0", - "@expo/config": "~11.0.9", + "@expo/config": "~11.0.10", "@expo/env": "~1.0.5", "@expo/json-file": "~9.1.4", "@expo/spawn-async": "^1.7.2", @@ -6074,7 +6141,7 @@ "debug": "^4.3.2", "dotenv": "~16.4.5", "dotenv-expand": "~11.0.6", - "getenv": "^1.0.0", + "getenv": "^2.0.0", "glob": "^10.4.2", "jsc-safe-url": "^0.2.4", "lightningcss": "~1.27.0", @@ -6097,17 +6164,6 @@ "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", @@ -6468,19 +6524,19 @@ } }, "node_modules/@expo/prebuild-config": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-9.0.6.tgz", - "integrity": "sha512-HDTdlMkTQZ95rd6EpvuLM+xkZV03yGLc38FqI37qKFLJtUN1WnYVaWsuXKoljd1OrVEVsHe6CfqKwaPZ52D56Q==", + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-9.0.8.tgz", + "integrity": "sha512-vzORt1zrgjIYOKAmHk0SUka0rlYo0AIZpOF6019ms2XaQnxyvcQACz1BxTk2++fTAzSAxerufNQOm2owPcAz+g==", "license": "MIT", "optional": true, "peer": true, "dependencies": { - "@expo/config": "~11.0.9", - "@expo/config-plugins": "~10.0.2", + "@expo/config": "~11.0.10", + "@expo/config-plugins": "~10.0.3", "@expo/config-types": "^53.0.4", "@expo/image-utils": "^0.7.4", "@expo/json-file": "^9.1.4", - "@react-native/normalize-colors": "0.79.2", + "@react-native/normalize-colors": "0.79.4", "debug": "^4.3.1", "resolve-from": "^5.0.0", "semver": "^7.6.0", @@ -6686,9 +6742,9 @@ } }, "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -6983,6 +7039,29 @@ "integrity": "sha512-meL9DERHj+fFVWoOX9fXqfcYcSpUfSYJPcFvDPKrxitICbwAoWR+Ut4j5NO9zAT917HUHLQmqzQbAsGNHlDcxQ==", "license": "Apache-2.0 OR MIT" }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -7781,13 +7860,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.53.0.tgz", - "integrity": "sha512-15hjKreZDcp7t6TL/7jkAo6Df5STZN09jGiv5dbP9A6vMVncXRqE7/B2SncsyOwrkZRBH2i6/TPOL8BVmm3c7w==", + "version": "1.53.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.53.1.tgz", + "integrity": "sha512-Z4c23LHV0muZ8hfv4jw6HngPJkbbtZxTkxPNIg7cJcTc9C28N/p2q7g3JZS2SiKBBHJ3uM1dgDye66bB7LEk5w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.53.0" + "playwright": "1.53.1" }, "bin": { "playwright": "cli.js" @@ -7839,9 +7918,9 @@ } }, "node_modules/@react-native/assets-registry": { - "version": "0.79.3", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.79.3.tgz", - "integrity": "sha512-Vy8DQXCJ21YSAiHxrNBz35VqVlZPpRYm50xRTWRf660JwHuJkFQG8cUkrLzm7AUriqUXxwpkQHcY+b0ibw9ejQ==", + "version": "0.80.0", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.80.0.tgz", + "integrity": "sha512-MlScsKAz99zoYghe5Rf5mUqsqz2rMB02640NxtPtBMSHNdGxxRlWu/pp1bFexDa1DYJwyIjnLgt3Z/Y90ikHfw==", "license": "MIT", "optional": true, "peer": true, @@ -7850,24 +7929,24 @@ } }, "node_modules/@react-native/babel-plugin-codegen": { - "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==", + "version": "0.79.4", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.79.4.tgz", + "integrity": "sha512-quhytIlDedR3ircRwifa22CaWVUVnkxccrrgztroCZaemSJM+HLurKJrjKWm0J5jV9ed+d+9Qyb1YB0syTHDjg==", "license": "MIT", "optional": true, "peer": true, "dependencies": { "@babel/traverse": "^7.25.3", - "@react-native/codegen": "0.79.3" + "@react-native/codegen": "0.79.4" }, "engines": { "node": ">=18" } }, "node_modules/@react-native/babel-preset": { - "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==", + "version": "0.79.4", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.79.4.tgz", + "integrity": "sha512-El9JvYKiNfnkQ3qR7zJvvRdP3DX2i4BGYlIricWQishI3gWAfm88FQYFC2CcGoMQWJQEPN4jnDMpoISAJDEN4g==", "license": "MIT", "optional": true, "peer": true, @@ -7913,7 +7992,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.3", + "@react-native/babel-plugin-codegen": "0.79.4", "babel-plugin-syntax-hermes-parser": "0.25.1", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" @@ -7926,9 +8005,9 @@ } }, "node_modules/@react-native/codegen": { - "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==", + "version": "0.79.4", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.79.4.tgz", + "integrity": "sha512-K0moZDTJtqZqSs+u9tnDPSxNsdxi5irq8Nu4mzzOYlJTVNGy5H9BiIDg/NeKGfjAdo43yTDoaPSbUCvVV8cgIw==", "license": "MIT", "optional": true, "peer": true, @@ -7947,20 +8026,20 @@ } }, "node_modules/@react-native/community-cli-plugin": { - "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==", + "version": "0.80.0", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.80.0.tgz", + "integrity": "sha512-uadfVvzZfz5tGpqwslL12i+rELK9m6cLhtqICX0JQvS7Bu12PJwrozhKzEzIYwN9i3wl2dWrKDUr08izt7S9Iw==", "license": "MIT", "optional": true, "peer": true, "dependencies": { - "@react-native/dev-middleware": "0.79.3", + "@react-native/dev-middleware": "0.80.0", "chalk": "^4.0.0", - "debug": "^2.2.0", + "debug": "^4.4.0", "invariant": "^2.2.4", - "metro": "^0.82.0", - "metro-config": "^0.82.0", - "metro-core": "^0.82.0", + "metro": "^0.82.2", + "metro-config": "^0.82.2", + "metro-core": "^0.82.2", "semver": "^7.1.3" }, "engines": { @@ -7975,29 +8054,101 @@ } } }, + "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/debugger-frontend": { + "version": "0.80.0", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.80.0.tgz", + "integrity": "sha512-lpu9Z3xtKUaKFvEcm5HSgo1KGfkDa/W3oZHn22Zy0WQ9MiOu2/ar1txgd1wjkoNiK/NethKcRdCN7mqnc6y2mA==", + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/dev-middleware": { + "version": "0.80.0", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.80.0.tgz", + "integrity": "sha512-lLyTnJ687A5jF3fn8yR/undlCis3FG+N/apQ+Q0Lcl+GV6FsZs0U5H28YmL6lZtjOj4TLek6uGPMPmZasHx7cQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@isaacs/ttlcache": "^1.4.1", + "@react-native/debugger-frontend": "0.80.0", + "chrome-launcher": "^0.15.2", + "chromium-edge-launcher": "^0.2.0", + "connect": "^3.6.5", + "debug": "^4.4.0", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "open": "^7.0.3", + "serve-static": "^1.16.2", + "ws": "^6.2.3" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@react-native/community-cli-plugin/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "optional": true, "peer": true, "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/@react-native/community-cli-plugin/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT", "optional": true, "peer": true }, + "node_modules/@react-native/community-cli-plugin/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/ws": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, "node_modules/@react-native/debugger-frontend": { - "version": "0.79.3", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.79.3.tgz", - "integrity": "sha512-ImNDuEeKH6lEsLXms3ZsgIrNF94jymfuhPcVY5L0trzaYNo9ZFE9Ni2/18E1IbfXxdeIHrCSBJlWD6CTm7wu5A==", + "version": "0.79.4", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.79.4.tgz", + "integrity": "sha512-Gg4LhxHIK86Bi2RiT1rbFAB6fuwANRsaZJ1sFZ1OZEMQEx6stEnzaIrmfgzcv4z0bTQdQ8lzCrpsz0qtdaD4eA==", "license": "BSD-3-Clause", "optional": true, "peer": true, @@ -8006,15 +8157,15 @@ } }, "node_modules/@react-native/dev-middleware": { - "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==", + "version": "0.79.4", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.79.4.tgz", + "integrity": "sha512-OWRDNkgrFEo+OSC5QKfiiBmGXKoU8gmIABK8rj2PkgwisFQ/22p7MzE5b6oB2lxWaeJT7jBX5KVniNqO46VhHA==", "license": "MIT", "optional": true, "peer": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.79.3", + "@react-native/debugger-frontend": "0.79.4", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^0.2.0", "connect": "^3.6.5", @@ -8078,9 +8229,9 @@ } }, "node_modules/@react-native/gradle-plugin": { - "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==", + "version": "0.80.0", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.80.0.tgz", + "integrity": "sha512-drmS68rabSMOuDD+YsAY2luNT8br82ycodSDORDqAg7yWQcieHMp4ZUOcdOi5iW+JCqobablT/b6qxcrBg+RaA==", "license": "MIT", "optional": true, "peer": true, @@ -8089,9 +8240,9 @@ } }, "node_modules/@react-native/js-polyfills": { - "version": "0.79.3", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.79.3.tgz", - "integrity": "sha512-PEBtg6Kox6KahjCAch0UrqCAmHiNLEbp2SblUEoFAQnov4DSxBN9safh+QSVaCiMAwLjvNfXrJyygZz60Dqz3Q==", + "version": "0.80.0", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.80.0.tgz", + "integrity": "sha512-dMX7IcBuwghySTgIeK8q03tYz/epg5ScGmJEfBQAciuhzMDMV1LBR/9wwdgD73EXM/133yC5A+TlHb3KQil4Ew==", "license": "MIT", "optional": true, "peer": true, @@ -8100,17 +8251,17 @@ } }, "node_modules/@react-native/normalize-colors": { - "version": "0.79.2", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.79.2.tgz", - "integrity": "sha512-+b+GNrupWrWw1okHnEENz63j7NSMqhKeFMOyzYLBwKcprG8fqJQhDIGXfizKdxeIa5NnGSAevKL1Ev1zJ56X8w==", + "version": "0.79.4", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.79.4.tgz", + "integrity": "sha512-247/8pHghbYY2wKjJpUsY6ZNbWcdUa5j5517LZMn6pXrbSSgWuj3JA4OYibNnocCHBaVrt+3R8XC3VEJqLlHFg==", "license": "MIT", "optional": true, "peer": true }, "node_modules/@react-native/virtualized-lists": { - "version": "0.79.3", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.79.3.tgz", - "integrity": "sha512-/0rRozkn+iIHya2vnnvprDgT7QkfI54FLrACAN3BLP7MRlfOIGOrZsXpRLndnLBVnjNzkcre84i1RecjoXnwIA==", + "version": "0.80.0", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.80.0.tgz", + "integrity": "sha512-d9zZdPS/ZRexVAkxo1eRp85U7XnnEpXA1ZpSomRKxBuStYKky1YohfEX5YD5MhphemKK24tT7JR4UhaLlmeX8Q==", "license": "MIT", "optional": true, "peer": true, @@ -8181,9 +8332,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", - "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.2.0.tgz", + "integrity": "sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==", "dev": true, "license": "MIT", "dependencies": { @@ -8217,9 +8368,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.42.0.tgz", - "integrity": "sha512-gldmAyS9hpj+H6LpRNlcjQWbuKUtb94lodB9uCz71Jm+7BxK1VIOo7y62tZZwxhA7j1ylv/yQz080L5WkS+LoQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.1.tgz", + "integrity": "sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==", "cpu": [ "arm" ], @@ -8231,9 +8382,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.42.0.tgz", - "integrity": "sha512-bpRipfTgmGFdCZDFLRvIkSNO1/3RGS74aWkJJTFJBH7h3MRV4UijkaEUeOMbi9wxtxYmtAbVcnMtHTPBhLEkaw==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.1.tgz", + "integrity": "sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==", "cpu": [ "arm64" ], @@ -8271,9 +8422,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.42.0.tgz", - "integrity": "sha512-fJcN4uSGPWdpVmvLuMtALUFwCHgb2XiQjuECkHT3lWLZhSQ3MBQ9pq+WoWeJq2PrNxr9rPM1Qx+IjyGj8/c6zQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.1.tgz", + "integrity": "sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==", "cpu": [ "arm64" ], @@ -8285,9 +8436,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.42.0.tgz", - "integrity": "sha512-CziHfyzpp8hJpCVE/ZdTizw58gr+m7Y2Xq5VOuCSrZR++th2xWAz4Nqk52MoIIrV3JHtVBhbBsJcAxs6NammOQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.1.tgz", + "integrity": "sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==", "cpu": [ "x64" ], @@ -8299,9 +8450,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.42.0.tgz", - "integrity": "sha512-UsQD5fyLWm2Fe5CDM7VPYAo+UC7+2Px4Y+N3AcPh/LdZu23YcuGPegQly++XEVaC8XUTFVPscl5y5Cl1twEI4A==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.1.tgz", + "integrity": "sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==", "cpu": [ "arm" ], @@ -8313,9 +8464,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.42.0.tgz", - "integrity": "sha512-/i8NIrlgc/+4n1lnoWl1zgH7Uo0XK5xK3EDqVTf38KvyYgCU/Rm04+o1VvvzJZnVS5/cWSd07owkzcVasgfIkQ==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.1.tgz", + "integrity": "sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==", "cpu": [ "arm" ], @@ -8353,9 +8504,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.42.0.tgz", - "integrity": "sha512-O8AplvIeavK5ABmZlKBq9/STdZlnQo7Sle0LLhVA7QT+CiGpNVe197/t8Aph9bhJqbDVGCHpY2i7QyfEDDStDg==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.1.tgz", + "integrity": "sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==", "cpu": [ "loong64" ], @@ -8367,9 +8518,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.42.0.tgz", - "integrity": "sha512-6Qb66tbKVN7VyQrekhEzbHRxXXFFD8QKiFAwX5v9Xt6FiJ3BnCVBuyBxa2fkFGqxOCSGGYNejxd8ht+q5SnmtA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.1.tgz", + "integrity": "sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==", "cpu": [ "ppc64" ], @@ -8381,9 +8532,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.42.0.tgz", - "integrity": "sha512-KQETDSEBamQFvg/d8jajtRwLNBlGc3aKpaGiP/LvEbnmVUKlFta1vqJqTrvPtsYsfbE/DLg5CC9zyXRX3fnBiA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.1.tgz", + "integrity": "sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==", "cpu": [ "riscv64" ], @@ -8395,9 +8546,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.42.0.tgz", - "integrity": "sha512-qMvnyjcU37sCo/tuC+JqeDKSuukGAd+pVlRl/oyDbkvPJ3awk6G6ua7tyum02O3lI+fio+eM5wsVd66X0jQtxw==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.1.tgz", + "integrity": "sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==", "cpu": [ "riscv64" ], @@ -8409,9 +8560,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.42.0.tgz", - "integrity": "sha512-I2Y1ZUgTgU2RLddUHXTIgyrdOwljjkmcZ/VilvaEumtS3Fkuhbw4p4hgHc39Ypwvo2o7sBFNl2MquNvGCa55Iw==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.1.tgz", + "integrity": "sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==", "cpu": [ "s390x" ], @@ -8462,9 +8613,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.42.0.tgz", - "integrity": "sha512-F+5J9pelstXKwRSDq92J0TEBXn2nfUrQGg+HK1+Tk7VOL09e0gBqUHugZv7SW4MGrYj41oNCUe3IKCDGVlis2g==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.1.tgz", + "integrity": "sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==", "cpu": [ "ia32" ], @@ -8874,9 +9025,9 @@ } }, "node_modules/@stencil/core": { - "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==", + "version": "4.35.1", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-4.35.1.tgz", + "integrity": "sha512-u65m3TbzOtpn679gUV4Yvi8YpInhRJ62js30a7YtXief9Ej/vzrhwDE22U0w4DMWJOYwAsJl133BUaZkWwnmzg==", "license": "MIT", "bin": { "stencil": "bin/stencil" @@ -9368,9 +9519,9 @@ "license": "MIT" }, "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, @@ -9469,9 +9620,9 @@ } }, "node_modules/@types/leaflet": { - "version": "1.9.18", - "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.18.tgz", - "integrity": "sha512-ht2vsoPjezor5Pmzi5hdsA7F++v5UGq9OlUduWHmMZiuQGIpJ2WS5+Gg9HaAA79gNh1AIPtCqhzejcIZ3lPzXQ==", + "version": "1.9.19", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.19.tgz", + "integrity": "sha512-pB+n2daHcZPF2FDaWa+6B0a0mSDf4dPU35y5iTXsx7x/PzzshiX5atYiS1jlBn43X7XvM8AP+AB26lnSk0J4GA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -9500,9 +9651,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.19.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.0.tgz", - "integrity": "sha512-hfrc+1tud1xcdVTABC2JiomZJEklMcXYNTVtZLAeqTVWD+qL5jkHKT+1lOtqDdGxt+mB53DTtiz673vfjU8D1Q==", + "version": "20.19.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.2.tgz", + "integrity": "sha512-9pLGGwdzOUBDYi0GNjM97FIA+f92fqSke6joWeBjWXllfNxZBs7qeMF7tvtOIsbY45xkWkxrdwUfUf3MnQa9gA==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -9953,26 +10104,26 @@ } }, "node_modules/@urql/core": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.1.1.tgz", - "integrity": "sha512-aGh024z5v2oINGD/In6rAtVKTm4VmQ2TxKQBAtk2ZSME5dunZFcjltw4p5ENQg+5CBhZ3FHMzl0Oa+rwqiWqlg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.2.0.tgz", + "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", "license": "MIT", "optional": true, "peer": true, "dependencies": { - "@0no-co/graphql.web": "^1.0.5", + "@0no-co/graphql.web": "^1.0.13", "wonka": "^6.3.2" } }, "node_modules/@urql/exchange-retry": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-1.3.1.tgz", - "integrity": "sha512-EEmtFu8JTuwsInqMakhLq+U3qN8ZMd5V3pX44q0EqD2imqTDsa8ikZqJ1schVrN8HljOdN+C08cwZ1/r5uIgLw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-1.3.2.tgz", + "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", "license": "MIT", "optional": true, "peer": true, "dependencies": { - "@urql/core": "^5.1.1", + "@urql/core": "^5.1.2", "wonka": "^6.3.2" }, "peerDependencies": { @@ -10381,53 +10532,53 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.16.tgz", - "integrity": "sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==", + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.17.tgz", + "integrity": "sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.2", - "@vue/shared": "3.5.16", + "@babel/parser": "^7.27.5", + "@vue/shared": "3.5.17", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.16.tgz", - "integrity": "sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==", + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.17.tgz", + "integrity": "sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.16", - "@vue/shared": "3.5.16" + "@vue/compiler-core": "3.5.17", + "@vue/shared": "3.5.17" } }, "node_modules/@vue/compiler-sfc": { - "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==", + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.17.tgz", + "integrity": "sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.2", - "@vue/compiler-core": "3.5.16", - "@vue/compiler-dom": "3.5.16", - "@vue/compiler-ssr": "3.5.16", - "@vue/shared": "3.5.16", + "@babel/parser": "^7.27.5", + "@vue/compiler-core": "3.5.17", + "@vue/compiler-dom": "3.5.17", + "@vue/compiler-ssr": "3.5.17", + "@vue/shared": "3.5.17", "estree-walker": "^2.0.2", "magic-string": "^0.30.17", - "postcss": "^8.5.3", + "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.16.tgz", - "integrity": "sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==", + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.17.tgz", + "integrity": "sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.16", - "@vue/shared": "3.5.16" + "@vue/compiler-dom": "3.5.17", + "@vue/shared": "3.5.17" } }, "node_modules/@vue/devtools-api": { @@ -10682,53 +10833,53 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.16.tgz", - "integrity": "sha512-FG5Q5ee/kxhIm1p2bykPpPwqiUBV3kFySsHEQha5BJvjXdZTUfmya7wP7zC39dFuZAcf/PD5S4Lni55vGLMhvA==", + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.17.tgz", + "integrity": "sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.16" + "@vue/shared": "3.5.17" } }, "node_modules/@vue/runtime-core": { - "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==", + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.17.tgz", + "integrity": "sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.16", - "@vue/shared": "3.5.16" + "@vue/reactivity": "3.5.17", + "@vue/shared": "3.5.17" } }, "node_modules/@vue/runtime-dom": { - "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==", + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.17.tgz", + "integrity": "sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.16", - "@vue/runtime-core": "3.5.16", - "@vue/shared": "3.5.16", + "@vue/reactivity": "3.5.17", + "@vue/runtime-core": "3.5.17", + "@vue/shared": "3.5.17", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.16.tgz", - "integrity": "sha512-BrX0qLiv/WugguGsnQUJiYOE0Fe5mZTwi6b7X/ybGB0vfrPH9z0gD/Y6WOR1sGCgX4gc25L1RYS5eYQKDMoNIg==", + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.17.tgz", + "integrity": "sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.16", - "@vue/shared": "3.5.16" + "@vue/compiler-ssr": "3.5.17", + "@vue/shared": "3.5.17" }, "peerDependencies": { - "vue": "3.5.16" + "vue": "3.5.17" } }, "node_modules/@vue/shared": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.16.tgz", - "integrity": "sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==", + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.17.tgz", + "integrity": "sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==", "license": "MIT" }, "node_modules/@vueuse/core": { @@ -11184,13 +11335,13 @@ } }, "node_modules/app-builder-lib/node_modules/minimatch": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", - "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { "node": "20 || >=22" @@ -11599,7 +11750,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -11612,9 +11762,9 @@ } }, "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", + "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -11708,14 +11858,14 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", - "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.4", + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { @@ -11747,13 +11897,13 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", - "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.4" + "@babel/helper-define-polyfill-provider": "^0.6.5" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -11818,9 +11968,9 @@ } }, "node_modules/babel-preset-expo": { - "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==", + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-13.2.1.tgz", + "integrity": "sha512-Ol3w0uLJNQ5tDfCf4L+IDTDMgJkVMQHhvYqMxs18Ib0DcaBQIfE8mneSSk7FcuI6FS0phw/rZhoEquQh1/Q3wA==", "license": "MIT", "optional": true, "peer": true, @@ -11839,7 +11989,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.3", + "@react-native/babel-preset": "0.79.4", "babel-plugin-react-native-web": "~0.19.13", "babel-plugin-syntax-hermes-parser": "^0.25.1", "babel-plugin-transform-flow-enums": "^0.0.2", @@ -12199,9 +12349,9 @@ } }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -12367,9 +12517,9 @@ "license": "MIT" }, "node_modules/browserslist": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", - "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", "devOptional": true, "funding": [ { @@ -12387,8 +12537,8 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001718", - "electron-to-chromium": "^1.5.160", + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, @@ -12648,9 +12798,9 @@ } }, "node_modules/cacache/node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -12726,7 +12876,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", @@ -12758,7 +12907,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -12868,9 +13016,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001721", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001721.tgz", - "integrity": "sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==", + "version": "1.0.30001726", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz", + "integrity": "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==", "devOptional": true, "funding": [ { @@ -14315,9 +14463,9 @@ } }, "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -14507,9 +14655,9 @@ } }, "node_modules/decode-named-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz", - "integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -14625,7 +14773,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -14931,9 +15078,9 @@ } }, "node_modules/dir-compare/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -15130,9 +15277,9 @@ } }, "node_modules/dotenv": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", - "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -15347,9 +15494,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.166", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.166.tgz", - "integrity": "sha512-QPWqHL0BglzPYyJJ1zSSmwFFL6MFXhbACOCcsCdUMCkzPdS9/OIBVxg516X/Ado2qwAq8k0nJJ7phQPCqiaFAw==", + "version": "1.5.177", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.177.tgz", + "integrity": "sha512-7EH2G59nLsEMj97fpDuvVcYi6lwTcM1xuWw3PssD8xzboAW7zj7iB3COEEEATUfjLHrs5uKBLQT03V/8URx06g==", "devOptional": true, "license": "ISC" }, @@ -15420,9 +15567,9 @@ } }, "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "license": "MIT", "dependencies": { "once": "^1.4.0" @@ -15781,9 +15928,9 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.1.tgz", - "integrity": "sha512-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.1.tgz", + "integrity": "sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw==", "dev": true, "license": "MIT", "dependencies": { @@ -15865,9 +16012,9 @@ } }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -16079,9 +16226,9 @@ } }, "node_modules/ethers": { - "version": "6.14.3", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.14.3.tgz", - "integrity": "sha512-qq7ft/oCJohoTcsNPFaXSQUm457MA5iWqkf1Mb11ujONdg7jBI6sAOrHaTi3j0CBqIGFSCeR/RMc+qwRRub7IA==", + "version": "6.14.4", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.14.4.tgz", + "integrity": "sha512-Jm/dzRs2Z9iBrT6e9TvGxyb5YVKAPLlpna7hjxH7KH/++DSh2T/JVmQUv7iHI5E55hDbp/gEVvstWYXVxXFzsA==", "funding": [ { "type": "individual", @@ -16178,21 +16325,21 @@ "license": "MIT" }, "node_modules/ethr-did": { - "version": "3.0.37", - "resolved": "https://registry.npmjs.org/ethr-did/-/ethr-did-3.0.37.tgz", - "integrity": "sha512-L9UUhAS8B1T7jTRdKLwAt514lx2UrJebJK7uc6UU4AJ9RhY8Vcfwc93Ux82jREE7yvvqDPXsVNH+lS3aw18a9A==", + "version": "3.0.38", + "resolved": "https://registry.npmjs.org/ethr-did/-/ethr-did-3.0.38.tgz", + "integrity": "sha512-gUxtErXVOQUJf+bmnxRdSJdlU9aFbQSBNaJCYGt+PLqw6l4qqInTfMRiWpwe/brhRtdjE+64tnayOVk8ataeQA==", "license": "Apache-2.0", "dependencies": { "did-jwt": "^8.0.0", "did-resolver": "^4.1.0", "ethers": "^6.8.1", - "ethr-did-resolver": "11.0.3" + "ethr-did-resolver": "11.0.4" } }, "node_modules/ethr-did-resolver": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/ethr-did-resolver/-/ethr-did-resolver-11.0.3.tgz", - "integrity": "sha512-lQ1T/SZfgR6Kp05/GSIXnMELxQ5H6M6OCTH4wBTVSAgHzbJiDNVIYWzg/c+NniIM88B0ViAi4CaiCHaiUlvPQg==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/ethr-did-resolver/-/ethr-did-resolver-11.0.4.tgz", + "integrity": "sha512-EJ/dL2QsFzvhBJd0nlPFjma3bxpQOWyp2TytQZyAeqi6SfZ4ALCB0VaA4dSeT4T8ZtI2pzs/sD7t/7A0584J6Q==", "license": "Apache-2.0", "dependencies": { "did-resolver": "^4.1.0", @@ -16289,27 +16436,27 @@ } }, "node_modules/expo": { - "version": "53.0.11", - "resolved": "https://registry.npmjs.org/expo/-/expo-53.0.11.tgz", - "integrity": "sha512-+QtvU+6VPd7/o4vmtwuRE/Li2rAiJtD25I6BOnoQSxphaWWaD0PdRQnIV3VQ0HESuJYRuKJ3DkAHNJ3jI6xwzA==", + "version": "53.0.13", + "resolved": "https://registry.npmjs.org/expo/-/expo-53.0.13.tgz", + "integrity": "sha512-QDdEEbFErUmm2IHR/UPKKIRLN3z5MmN2QLx0aPlOEGOx295buSUE42u6f7TppkgJn0BUX3f7wFaHRo86+G+Trg==", "license": "MIT", "optional": true, "peer": true, "dependencies": { "@babel/runtime": "^7.20.0", - "@expo/cli": "0.24.14", + "@expo/cli": "0.24.15", "@expo/config": "~11.0.10", - "@expo/config-plugins": "~10.0.2", - "@expo/fingerprint": "0.13.0", - "@expo/metro-config": "0.20.14", + "@expo/config-plugins": "~10.0.3", + "@expo/fingerprint": "0.13.1", + "@expo/metro-config": "0.20.15", "@expo/vector-icons": "^14.0.0", - "babel-preset-expo": "~13.2.0", + "babel-preset-expo": "~13.2.1", "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.11", + "expo-modules-autolinking": "2.1.12", "expo-modules-core": "2.4.0", "react-native-edge-to-edge": "1.6.0", "whatwg-url-without-unicode": "8.0.0-3" @@ -16490,9 +16637,9 @@ } }, "node_modules/expo/node_modules/expo-modules-autolinking": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-2.1.11.tgz", - "integrity": "sha512-KrWQo+cE4gWYNePBBhmHGVzf63gYV19ZLXe9EIH3GHTkViVzIX+Lp618H/7GxfawpN5kbhvilATH1QEKKnUUww==", + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-2.1.12.tgz", + "integrity": "sha512-rW5YSW66pUx1nLqn7TO0eWRnP4LDvySW1Tom0wjexk3Tx/upg9LYE5tva7p5AX/cdFfiZcEqPcOxP4RyT++Xlg==", "license": "MIT", "optional": true, "peer": true, @@ -16987,7 +17134,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, "license": "MIT", "dependencies": { "is-callable": "^1.2.7" @@ -17617,9 +17763,9 @@ } }, "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -17867,7 +18013,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -18331,9 +18476,9 @@ } }, "node_modules/ipfs-unixfs": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-11.2.1.tgz", - "integrity": "sha512-gUeeX63EFgiaMgcs0cUs2ZUPvlOeEZ38okjK8twdWGZX2jYd2rCk8k/TJ3DSRIDZ2t/aZMv6I23guxHaofZE3w==", + "version": "11.2.5", + "resolved": "https://registry.npmjs.org/ipfs-unixfs/-/ipfs-unixfs-11.2.5.tgz", + "integrity": "sha512-uasYJ0GLPbViaTFsOLnL9YPjX5VmhnqtWRriogAHOe4ApmIi9VAOFBzgDHsUW2ub4pEa/EysbtWk126g2vkU/g==", "license": "Apache-2.0 OR MIT", "dependencies": { "protons-runtime": "^5.5.0", @@ -18470,7 +18615,6 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -18914,7 +19058,6 @@ "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" @@ -19001,7 +19144,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, "license": "MIT" }, "node_modules/isbinaryfile": { @@ -19127,9 +19269,9 @@ } }, "node_modules/jake/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -22523,7 +22665,7 @@ "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "devOptional": true, + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" @@ -23863,21 +24005,53 @@ } }, "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.3.tgz", + "integrity": "sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==", "license": "MIT", "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "create-hash": "~1.1.3", + "create-hmac": "^1.1.7", + "ripemd160": "=2.0.1", + "safe-buffer": "^5.2.1", + "sha.js": "^2.4.11", + "to-buffer": "^1.2.0" }, "engines": { "node": ">=0.12" } }, + "node_modules/pbkdf2/node_modules/create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==", + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "sha.js": "^2.4.0" + } + }, + "node_modules/pbkdf2/node_modules/hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1" + } + }, + "node_modules/pbkdf2/node_modules/ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==", + "license": "MIT", + "dependencies": { + "hash-base": "^2.0.0", + "inherits": "^2.0.1" + } + }, "node_modules/pe-library": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", @@ -23978,13 +24152,13 @@ } }, "node_modules/playwright": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.0.tgz", - "integrity": "sha512-ghGNnIEYZC4E+YtclRn4/p6oYbdPiASELBIYkBXfaTVKreQUYbMUYQDwS12a8F0/HtIjr/CkGjtwABeFPGcS4Q==", + "version": "1.53.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.1.tgz", + "integrity": "sha512-LJ13YLr/ocweuwxyGf1XNFWIU4M2zUSo149Qbp+A4cpwDjsxRPj7k6H25LBrEHiEwxvRbD8HdwvQmRMSvquhYw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.53.0" + "playwright-core": "1.53.1" }, "bin": { "playwright": "cli.js" @@ -23997,9 +24171,9 @@ } }, "node_modules/playwright-core": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.0.tgz", - "integrity": "sha512-mGLg8m0pm4+mmtB7M89Xw/GSqoNC+twivl8ITteqvAndachozYe2ZA7srU6uleV1vEdAHYqjq+SV8SNxRRFYBw==", + "version": "1.53.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.1.tgz", + "integrity": "sha512-Z46Oq7tLAyT0lGoFx4DOuB1IA9D1TPj0QkYxpPVUnGDqHHvDpCftu1J2hM2PiWsNMoZh8+LQaarAWcDfPBc6zg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -24047,16 +24221,15 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/postcss": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.4.tgz", - "integrity": "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "funding": [ { "type": "opencollective", @@ -24257,9 +24430,9 @@ } }, "node_modules/prettier": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", - "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", "bin": { @@ -24419,9 +24592,9 @@ } }, "node_modules/protons-runtime": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-5.5.0.tgz", - "integrity": "sha512-EsALjF9QsrEk6gbCx3lmfHxVN0ah7nG3cY7GySD4xf4g8cr7g543zB88Foh897Sr1RQJ9yDCUsoT1i1H/cVUFA==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/protons-runtime/-/protons-runtime-5.6.0.tgz", + "integrity": "sha512-/Kde+sB9DsMFrddJT/UZWe6XqvL7SL5dbag/DBCElFKhkwDj7XKt53S+mzLyaDP5OqS0wXjV5SA572uWDaT0Hg==", "license": "Apache-2.0 OR MIT", "dependencies": { "uint8-varint": "^2.0.2", @@ -24480,9 +24653,9 @@ "license": "MIT" }, "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -24628,9 +24801,9 @@ } }, "node_modules/qrcode-generator": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/qrcode-generator/-/qrcode-generator-1.5.0.tgz", - "integrity": "sha512-sqo7otiDq5rA4djRkFI7IjLQqxRrLpIou0d3rqr03JJLUGf5raPh91xCio+lFFbQf0SlcVckStz0EmDEX3EeZA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/qrcode-generator/-/qrcode-generator-1.5.2.tgz", + "integrity": "sha512-pItrW0Z9HnDBnFmgiNrY1uxRdri32Uh9EjNYLPVC2zZ3ZRIIEqBoDgm4DkvDwNNDHTK7FNkmr8zAa77BYc9xNw==", "license": "MIT" }, "node_modules/qrcode-terminal": { @@ -24911,9 +25084,9 @@ } }, "node_modules/react-devtools-core": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.2.tgz", - "integrity": "sha512-ldFwzufLletzCikNJVYaxlxMLu7swJ3T2VrGfzXlMsVhZhPDKXA38DEROidaYZVgMAmQnIjymrmqto5pyfrwPA==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-6.1.3.tgz", + "integrity": "sha512-4be9IVco12d/4D7NpZgNjffbYIo/MAk4f5eBJR8PpKyiR7tgwe29liQbxyqDov5Ybc2crGABZyYAmdeU6NowKg==", "license": "MIT", "optional": true, "peer": true, @@ -24954,44 +25127,43 @@ "peer": true }, "node_modules/react-native": { - "version": "0.79.3", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.79.3.tgz", - "integrity": "sha512-EzH1+9gzdyEo9zdP6u7Sh3Jtf5EOMwzy+TK65JysdlgAzfEVfq4mNeXcAZ6SmD+CW6M7ARJbvXLyTD0l2S5rpg==", + "version": "0.80.0", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.80.0.tgz", + "integrity": "sha512-b9K1ygb2MWCBtKAodKmE3UsbUuC29Pt4CrJMR0ocTA8k+8HJQTPleBPDNKL4/p0P01QO9aL/gZUddoxHempLow==", "license": "MIT", "optional": true, "peer": true, "dependencies": { "@jest/create-cache-key-function": "^29.7.0", - "@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", + "@react-native/assets-registry": "0.80.0", + "@react-native/codegen": "0.80.0", + "@react-native/community-cli-plugin": "0.80.0", + "@react-native/gradle-plugin": "0.80.0", + "@react-native/js-polyfills": "0.80.0", + "@react-native/normalize-colors": "0.80.0", + "@react-native/virtualized-lists": "0.80.0", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", "babel-jest": "^29.7.0", - "babel-plugin-syntax-hermes-parser": "0.25.1", + "babel-plugin-syntax-hermes-parser": "0.28.1", "base64-js": "^1.5.1", "chalk": "^4.0.0", "commander": "^12.0.0", - "event-target-shim": "^5.0.1", "flow-enums-runtime": "^0.0.6", "glob": "^7.1.1", "invariant": "^2.2.4", "jest-environment-node": "^29.7.0", "memoize-one": "^5.0.0", - "metro-runtime": "^0.82.0", - "metro-source-map": "^0.82.0", + "metro-runtime": "^0.82.2", + "metro-source-map": "^0.82.2", "nullthrows": "^1.1.1", "pretty-format": "^29.7.0", "promise": "^8.3.0", "react-devtools-core": "^6.1.1", "react-refresh": "^0.14.0", "regenerator-runtime": "^0.13.2", - "scheduler": "0.25.0", + "scheduler": "0.26.0", "semver": "^7.1.3", "stacktrace-parser": "^0.1.10", "whatwg-fetch": "^3.0.0", @@ -25005,8 +25177,8 @@ "node": ">=18" }, "peerDependencies": { - "@types/react": "^19.0.0", - "react": "^19.0.0" + "@types/react": "^19.1.0", + "react": "^19.1.0" }, "peerDependenciesMeta": { "@types/react": { @@ -25039,14 +25211,46 @@ "react-native": "*" } }, + "node_modules/react-native/node_modules/@react-native/codegen": { + "version": "0.80.0", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.80.0.tgz", + "integrity": "sha512-X9TsPgytoUkNrQjzAZh4dXa4AuouvYT0NzYyvnjw1ry4LESCZtKba+eY4x3+M30WPR52zjgu+UFL//14BSdCCA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "glob": "^7.1.1", + "hermes-parser": "0.28.1", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "yargs": "^17.6.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, "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==", + "version": "0.80.0", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.80.0.tgz", + "integrity": "sha512-bJZDSopadjJxMDvysc634eTfLL4w7cAx5diPe14Ez5l+xcKjvpfofS/1Ja14DlgdMJhxGd03MTXlrxoWust3zg==", "license": "MIT", "optional": true, "peer": true }, + "node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.28.1.tgz", + "integrity": "sha512-meT17DOuUElMNsL5LZN56d+KBp22hb0EfxWfuPUeoSi54e40v1W4C2V36P75FpsH9fVEfDKpw5Nnkahc8haSsQ==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "hermes-parser": "0.28.1" + } + }, "node_modules/react-native/node_modules/commander": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", @@ -25058,6 +25262,25 @@ "node": ">=18" } }, + "node_modules/react-native/node_modules/hermes-estree": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.28.1.tgz", + "integrity": "sha512-w3nxl/RGM7LBae0v8LH2o36+8VqwOZGv9rX1wyoWT6YaKZLqpJZ0YQ5P0LVr3tuRpf7vCx0iIG4i/VmBJejxTQ==", + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/react-native/node_modules/hermes-parser": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.28.1.tgz", + "integrity": "sha512-nf8o+hE8g7UJWParnccljHumE9Vlq8F7MqIdeahl+4x0tvCUJYRrT0L7h0MMg/X9YJmkNwsfbaNNrzPtFXOscg==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "hermes-estree": "0.28.1" + } + }, "node_modules/react-native/node_modules/ws": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", @@ -25514,9 +25737,9 @@ } }, "node_modules/replace/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -25960,15 +26183,15 @@ } }, "node_modules/rimraf/node_modules/glob": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.2.tgz", - "integrity": "sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", "dev": true, "license": "ISC", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^4.0.1", - "minimatch": "^10.0.0", + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" @@ -26010,13 +26233,13 @@ } }, "node_modules/rimraf/node_modules/minimatch": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", - "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { "node": "20 || >=22" @@ -26094,13 +26317,13 @@ } }, "node_modules/rollup": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.42.0.tgz", - "integrity": "sha512-LW+Vse3BJPyGJGAJt1j8pWDKPd73QM8cRXYK1IxOBgL2AGLu7Xd2YOW0M2sLUBCkF5MshXXtMApyEAEzMVMsnw==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.1.tgz", + "integrity": "sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.7" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -26110,33 +26333,33 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.42.0", - "@rollup/rollup-android-arm64": "4.42.0", - "@rollup/rollup-darwin-arm64": "4.42.0", - "@rollup/rollup-darwin-x64": "4.42.0", - "@rollup/rollup-freebsd-arm64": "4.42.0", - "@rollup/rollup-freebsd-x64": "4.42.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.42.0", - "@rollup/rollup-linux-arm-musleabihf": "4.42.0", - "@rollup/rollup-linux-arm64-gnu": "4.42.0", - "@rollup/rollup-linux-arm64-musl": "4.42.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.42.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.42.0", - "@rollup/rollup-linux-riscv64-gnu": "4.42.0", - "@rollup/rollup-linux-riscv64-musl": "4.42.0", - "@rollup/rollup-linux-s390x-gnu": "4.42.0", - "@rollup/rollup-linux-x64-gnu": "4.42.0", - "@rollup/rollup-linux-x64-musl": "4.42.0", - "@rollup/rollup-win32-arm64-msvc": "4.42.0", - "@rollup/rollup-win32-ia32-msvc": "4.42.0", - "@rollup/rollup-win32-x64-msvc": "4.42.0", + "@rollup/rollup-android-arm-eabi": "4.44.1", + "@rollup/rollup-android-arm64": "4.44.1", + "@rollup/rollup-darwin-arm64": "4.44.1", + "@rollup/rollup-darwin-x64": "4.44.1", + "@rollup/rollup-freebsd-arm64": "4.44.1", + "@rollup/rollup-freebsd-x64": "4.44.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.44.1", + "@rollup/rollup-linux-arm-musleabihf": "4.44.1", + "@rollup/rollup-linux-arm64-gnu": "4.44.1", + "@rollup/rollup-linux-arm64-musl": "4.44.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.44.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.44.1", + "@rollup/rollup-linux-riscv64-gnu": "4.44.1", + "@rollup/rollup-linux-riscv64-musl": "4.44.1", + "@rollup/rollup-linux-s390x-gnu": "4.44.1", + "@rollup/rollup-linux-x64-gnu": "4.44.1", + "@rollup/rollup-linux-x64-musl": "4.44.1", + "@rollup/rollup-win32-arm64-msvc": "4.44.1", + "@rollup/rollup-win32-ia32-msvc": "4.44.1", + "@rollup/rollup-win32-x64-msvc": "4.44.1", "fsevents": "~2.3.2" } }, "node_modules/rollup/node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.42.0.tgz", - "integrity": "sha512-JxHtA081izPBVCHLKnl6GEA0w3920mlJPLh89NojpU2GsBSB6ypu4erFg/Wx1qbpUbepn0jY4dVWMGZM8gplgA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.1.tgz", + "integrity": "sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==", "cpu": [ "arm64" ], @@ -26148,9 +26371,9 @@ ] }, "node_modules/rollup/node_modules/@rollup/rollup-darwin-x64": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.42.0.tgz", - "integrity": "sha512-rv5UZaWVIJTDMyQ3dCEK+m0SAn6G7H3PRc2AZmExvbDvtaDc+qXkei0knQWcI3+c9tEs7iL/4I4pTQoPbNL2SA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.1.tgz", + "integrity": "sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==", "cpu": [ "x64" ], @@ -26162,9 +26385,9 @@ ] }, "node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.42.0.tgz", - "integrity": "sha512-eoujJFOvoIBjZEi9hJnXAbWg+Vo1Ov8n/0IKZZcPZ7JhBzxh2A+2NFyeMZIRkY9iwBvSjloKgcvnjTbGKHE44Q==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.1.tgz", + "integrity": "sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==", "cpu": [ "arm64" ], @@ -26176,9 +26399,9 @@ ] }, "node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.42.0.tgz", - "integrity": "sha512-/3NrcOWFSR7RQUQIuZQChLND36aTU9IYE4j+TB40VU78S+RA0IiqHR30oSh6P1S9f9/wVOenHQnacs/Byb824g==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.1.tgz", + "integrity": "sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==", "cpu": [ "arm64" ], @@ -26190,9 +26413,9 @@ ] }, "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.42.0.tgz", - "integrity": "sha512-Gfm6cV6mj3hCUY8TqWa63DB8Mx3NADoFwiJrMpoZ1uESbK8FQV3LXkhfry+8bOniq9pqY1OdsjFWNsSbfjPugw==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.1.tgz", + "integrity": "sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==", "cpu": [ "x64" ], @@ -26204,9 +26427,9 @@ ] }, "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.42.0.tgz", - "integrity": "sha512-g86PF8YZ9GRqkdi0VoGlcDUb4rYtQKyTD1IVtxxN4Hpe7YqLBShA7oHMKU6oKTCi3uxwW4VkIGnOaH/El8de3w==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.1.tgz", + "integrity": "sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==", "cpu": [ "x64" ], @@ -26218,9 +26441,9 @@ ] }, "node_modules/rollup/node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.42.0.tgz", - "integrity": "sha512-+axkdyDGSp6hjyzQ5m1pgcvQScfHnMCcsXkx8pTgy/6qBmWVhtRVlgxjWwDp67wEXXUr0x+vD6tp5W4x6V7u1A==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.1.tgz", + "integrity": "sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==", "cpu": [ "arm64" ], @@ -26232,9 +26455,9 @@ ] }, "node_modules/rollup/node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.42.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.42.0.tgz", - "integrity": "sha512-LpHiJRwkaVz/LqjHjK8LCi8osq7elmpwujwbXKNW88bM8eeGxavJIKKjkjpMHAh/2xfnrt1ZSnhTv41WYUHYmA==", + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.1.tgz", + "integrity": "sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==", "cpu": [ "x64" ], @@ -26410,9 +26633,9 @@ "license": "ISC" }, "node_modules/scheduler": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", - "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", "license": "MIT", "optional": true, "peer": true @@ -26424,9 +26647,9 @@ "license": "MIT" }, "node_modules/sdp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/sdp/-/sdp-3.2.0.tgz", - "integrity": "sha512-d7wDPgDV3DDiqulJjKiV2865wKsJ34YI+NDREbm+FySq6WuKOikwyNQcm+doLAZ1O6ltdO0SeKle2xMpN3Brgw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/sdp/-/sdp-3.2.1.tgz", + "integrity": "sha512-lwsAIzOPlH8/7IIjjz3K0zYBk7aBVVcvjMwt3M4fLxpjMYyy7i3I97SLHebgn4YBjirkzfp3RvRDWSKsh/+WFw==", "license": "MIT" }, "node_modules/secp256k1": { @@ -26740,7 +26963,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -28265,9 +28487,9 @@ } }, "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==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.10.tgz", + "integrity": "sha512-C1SwlQGNLe/jPNqapK8epDsXME7CAJR5RL3GcE6KWx1d9OUByzoHVcbu1VPI8tevg9H8Alae0AApHHFGzrD5zA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -28453,9 +28675,9 @@ } }, "node_modules/terser": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.42.0.tgz", - "integrity": "sha512-UYCvU9YQW2f/Vwl+P0GfhxJxbUGLwd+5QrrGgLajzWAtC/23AX0vcise32kkP7Eu0Wu9VlzzHAXkLObgjQfFlQ==", + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", "devOptional": true, "license": "BSD-2-Clause", "dependencies": { @@ -28495,9 +28717,9 @@ } }, "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "license": "MIT", "optional": true, "peer": true, @@ -28670,6 +28892,20 @@ "optional": true, "peer": true }, + "node_modules/to-buffer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz", + "integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==", + "license": "MIT", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -28914,7 +29150,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -29003,9 +29238,9 @@ "license": "MIT" }, "node_modules/typeorm": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.24.tgz", - "integrity": "sha512-4IrHG7A0tY8l5gEGXfW56VOMfUVWEkWlH/h5wmcyZ+V8oCiLj7iTPp0lEjMEZVrxEkGSdP9ErgTKHKXQApl/oA==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.25.tgz", + "integrity": "sha512-fTKDFzWXKwAaBdEMU4k661seZewbNYET4r1J/z3Jwf+eAvlzMVpTLKAVcAzg75WwQk7GDmtsmkZ5MfkmXCiFWg==", "license": "MIT", "dependencies": { "@sqltools/formatter": "^1.2.5", @@ -29784,16 +30019,16 @@ "peer": true }, "node_modules/vue": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.16.tgz", - "integrity": "sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==", + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.17.tgz", + "integrity": "sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==", "license": "MIT", "dependencies": { - "@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" + "@vue/compiler-dom": "3.5.17", + "@vue/compiler-sfc": "3.5.17", + "@vue/runtime-dom": "3.5.17", + "@vue/server-renderer": "3.5.17", + "@vue/shared": "3.5.17" }, "peerDependencies": { "typescript": "*" @@ -30186,7 +30421,6 @@ "version": "1.1.19", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", @@ -31045,9 +31279,9 @@ } }, "node_modules/zod": { - "version": "3.25.58", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.58.tgz", - "integrity": "sha512-DVLmMQzSZwNYzQoMaM3MQWnxr2eq+AtM9Hx3w1/Yl0pH8sLTSjN4jGP7w6f7uand6Hw44tsnSu1hz1AOA6qI2Q==", + "version": "3.25.67", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz", + "integrity": "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks"