From 03f6f4b2e38799afd8fa169b8ef037a2fb459746 Mon Sep 17 00:00:00 2001 From: Za-Pa-Al <235132485+Za-Pa-Al@users.noreply.github.com> Date: Thu, 16 Oct 2025 18:59:46 +0200 Subject: [PATCH 01/13] Color Coding, Window adjustments. Image caching. --- .vscode/launch.json | 18 + .vscode/tasks.json | 84 ++ README.md | 101 +- cleanup.bat | 26 + cleanup.ps1 | 48 + package-lock.json | 421 +++--- package.json | 5 +- src-tauri/Cargo.lock | 2292 +++++++++++++++++++++----------- src-tauri/Cargo.toml | 7 +- src-tauri/src/main.rs | 348 ++++- src-tauri/tauri.conf.json | 22 +- src/App.svelte | 4 +- src/lib/CacheDebugPanel.svelte | 190 +++ src/lib/ModCard.svelte | 371 ++++-- src/lib/StatusButton.svelte | 47 +- src/lib/baseWebInstaller.ts | 44 +- src/lib/imageCache.ts | 118 ++ src/lib/utils.ts | 25 +- src/main.ts | 2 +- src/pages/MainPage.svelte | 23 + src/pages/Mods.svelte | 160 ++- 21 files changed, 3218 insertions(+), 1138 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json create mode 100644 cleanup.bat create mode 100644 cleanup.ps1 create mode 100644 src/lib/CacheDebugPanel.svelte create mode 100644 src/lib/imageCache.ts diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..36935ab --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,18 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Tauri Development", + "type": "node", + "request": "launch", + "cwd": "${workspaceFolder}", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "tauri", "dev"], + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "autoAttachChildProcesses": false, + "skipFiles": ["/**"], + "preLaunchTask": "Kill Existing Processes" + } + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..1e48d29 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,84 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Kill Existing Processes", + "type": "shell", + "command": "${workspaceFolder}/cleanup.bat", + "group": "build", + "presentation": { + "echo": false, + "reveal": "silent", + "focus": false, + "panel": "shared", + "showReuseMessage": false, + "clear": false + }, + "problemMatcher": [] + }, + { + "label": "Cleanup (Detailed)", + "type": "shell", + "command": "${workspaceFolder}/cleanup.bat", + "group": "build", + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "new", + "showReuseMessage": false, + "clear": true + }, + "problemMatcher": [] + }, + { + "label": "Tauri Dev (Fast)", + "type": "shell", + "command": "npm", + "args": [ + "run", + "tauri", + "dev" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "new", + "showReuseMessage": true, + "clear": false + }, + "problemMatcher": [], + "isBackground": false, + "dependsOn": "Kill Existing Processes" + }, + { + "label": "Tauri Build", + "type": "shell", + "command": "npm", + "args": [ + "run", + "tauri", + "build" + ], + "group": "build", + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "new" + }, + "problemMatcher": [] + }, + { + "label": "Test Cleanup", + "type": "shell", + "command": "${workspaceFolder}/cleanup.bat", + "group": "build" + } + ] +} \ No newline at end of file diff --git a/README.md b/README.md index 93e4121..c04b59d 100644 --- a/README.md +++ b/README.md @@ -2,35 +2,94 @@

- - + +

--- -The RedManager is a general tool for installing/uninstalling/updating different features -of the [RedLoader](https://github.com/ToniMacaroni/RedLoader) ecosystem as well as general Sons of the Forest modding features. +The RedManager is a general tool for installing/uninstalling/updating different features of the [RedLoader](https://github.com/ToniMacaroni/RedLoader) ecosystem as well as general Sons of the Forest modding features. -**:arrow_forward:[DOWNLOAD FROM HERE](https://github.com/ToniMacaroni/RedManager/releases):arrow_backward:** -*This will take you to the releases page* +**:arrow_forward:[Original RedManager from ToniMacaroni](https://github.com/ToniMacaroni/RedManager):arrow_backward:** +# Installation +Download and execute RedModManager.exe. There are likely problems (crashing) if you execute it in the folder of file SonsOfTheForest.exe and folder _Redloader. Place it somewhere else. Might require .NET 6 Installation in that case. ---- +# Summary of Changes + +## Overview + +Enhancements to the RedModManager Tauri/Svelte application. + +**User-Facing Improvements** + +- **Visual Status System**: Immediate mod status recognition through color coding +- **Responsive Layout**: Optimal card display across all window sizes +- **Fast Image Loading**: Cached thumbnails with optimization +- **Window Memory**: Application remembers user's preferred size/position + +## Technical + +**Key Changes by Category** + +**🏗️ Backend Infrastructure (Rust/Tauri)** + +**Files Modified:** + +- [Cargo.toml](vscode-file://vscode-app/c:/Users/Alex/AppData/Local/Programs/Microsoft%20VS%20Code/resources/app/out/vs/code/electron-browser/workbench/workbench.html) - Added window state persistence plugin +- [main.rs](vscode-file://vscode-app/c:/Users/Alex/AppData/Local/Programs/Microsoft%20VS%20Code/resources/app/out/vs/code/electron-browser/workbench/workbench.html) - Major expansion with image caching system +- [tauri.conf.json](vscode-file://vscode-app/c:/Users/Alex/AppData/Local/Programs/Microsoft%20VS%20Code/resources/app/out/vs/code/electron-browser/workbench/workbench.html) - Window configuration and security updates + +**Major Features Added:** + +- **Window State Persistence**: Integrated [tauri-plugin-window-state v0.1](vscode-file://vscode-app/c:/Users/Alex/AppData/Local/Programs/Microsoft%20VS%20Code/resources/app/out/vs/code/electron-browser/workbench/workbench.html) for remembering user window size/position +- **Advanced Image Caching System**: Comprehensive image optimization and caching with: + - Smart server change detection (ETag/Last-Modified headers) + - Automatic image optimization (WebP conversion, thumbnail generation) + - 24-hour cache expiration with graceful fallbacks + - Memory and disk cache management +- **Updated Window Configuration**: 1400x900 default size, 600px minimum width + +**🎨 Frontend UI/UX Enhancements (Svelte)** + +**Files Modified:** + +- [ModCard.svelte](vscode-file://vscode-app/c:/Users/Alex/AppData/Local/Programs/Microsoft%20VS%20Code/resources/app/out/vs/code/electron-browser/workbench/workbench.html) - Complete redesign with conditional styling +- [StatusButton.svelte](vscode-file://vscode-app/c:/Users/Alex/AppData/Local/Programs/Microsoft%20VS%20Code/resources/app/out/vs/code/electron-browser/workbench/workbench.html) - Color-coded button system +- [Mods.svelte](vscode-file://vscode-app/c:/Users/Alex/AppData/Local/Programs/Microsoft%20VS%20Code/resources/app/out/vs/code/electron-browser/workbench/workbench.html) - Grid layout optimization and search improvements +- [App.svelte](vscode-file://vscode-app/c:/Users/Alex/AppData/Local/Programs/Microsoft%20VS%20Code/resources/app/out/vs/code/electron-browser/workbench/workbench.html) - TypeScript improvements + +**Major Features Added:** + +- **Responsive Grid System**: Auto-fit layout with 420px minimum columns, preventing card overlap +- **Color-Coded Status Indicators**: + - Install/Update buttons: Blue background (#0f1e2e) + - Uninstall buttons: Red background (#2d0a0a) + - Card backgrounds: Green for enabled mods, red for disabled +- **Optimized Image Display**: 220x120px forced dimensions with proper container overflow handling +- **Enhanced Search Interface**: Aligned with grid padding, improved button groups + +**📦 Development Infrastructure** + +**Files Added:** + +- [launch.json](vscode-file://vscode-app/c:/Users/Alex/AppData/Local/Programs/Microsoft%20VS%20Code/resources/app/out/vs/code/electron-browser/workbench/workbench.html) - Tauri development configuration +- [tasks.json](vscode-file://vscode-app/c:/Users/Alex/AppData/Local/Programs/Microsoft%20VS%20Code/resources/app/out/vs/code/electron-browser/workbench/workbench.html) - Build and cleanup tasks +- [cleanup.bat](vscode-file://vscode-app/c:/Users/Alex/AppData/Local/Programs/Microsoft%20VS%20Code/resources/app/out/vs/code/electron-browser/workbench/workbench.html) & [cleanup.ps1](vscode-file://vscode-app/c:/Users/Alex/AppData/Local/Programs/Microsoft%20VS%20Code/resources/app/out/vs/code/electron-browser/workbench/workbench.html) - Process cleanup scripts +- [imageCache.ts](vscode-file://vscode-app/c:/Users/Alex/AppData/Local/Programs/Microsoft%20VS%20Code/resources/app/out/vs/code/electron-browser/workbench/workbench.html) - Frontend image cache management +- [CacheDebugPanel.svelte](vscode-file://vscode-app/c:/Users/Alex/AppData/Local/Programs/Microsoft%20VS%20Code/resources/app/out/vs/code/electron-browser/workbench/workbench.html) - Development debugging tools + +**Features Added:** -## Getting Started +- **Automated Development Workflow**: VS Code tasks for building, running, and cleanup +- **Process Management**: Smart cleanup scripts for development server conflicts +- **Debug Tools**: Cache debugging panel with memory usage statistics -You are probably here to install the RedLoader. To do that: -1) Start the RedManager. -2) The manager should automatically detect your path. If not, you can set it manually. -3) Click on the "Install RedLoader" button. +**🔧 Performance & Stability** -If you want to double check the installation, check if the following files exist in your game directory: -- `_RedLoader` folder -- `dobby.dll` file -- `version.dll` file +**Key Improvements:** -## Additional Features -Beyond the above mentioned features, the RedManager can also: -- Clear any data from old loaders. -- *For modders*: Install the extended UnityExplorer. -- *For modders*: Setup the mod template and quickly create new projects. +- **Grid Position Stability**: Unique keys (mod.mod_id) prevent position shifting during operations +- **Optimized Refresh Logic**: Proper mod status synchronization with initModList() calls +- **Memory Management**: Intelligent image caching with size limits and automatic cleanup +- **Network Optimization**: Progressive image loading and preloading for better UX \ No newline at end of file diff --git a/cleanup.bat b/cleanup.bat new file mode 100644 index 0000000..c465b26 --- /dev/null +++ b/cleanup.bat @@ -0,0 +1,26 @@ +@echo off +echo [CLEANUP] Starting development process cleanup... + +REM Kill RedModManager processes +taskkill /F /IM RedModManager.exe >nul 2>&1 +if %errorlevel%==0 ( + echo [SUCCESS] RedModManager processes terminated +) else ( + echo [INFO] No RedModManager processes found +) + +REM Kill Cargo processes +taskkill /F /IM cargo.exe >nul 2>&1 +if %errorlevel%==0 ( + echo [SUCCESS] Cargo processes terminated +) else ( + echo [INFO] No Cargo processes found +) + +REM Kill processes using port 1420 +for /f "tokens=5" %%a in ('netstat -ano ^| findstr :1420') do ( + taskkill /F /PID %%a >nul 2>&1 +) + +echo [COMPLETE] Cleanup finished successfully! +echo. \ No newline at end of file diff --git a/cleanup.ps1 b/cleanup.ps1 new file mode 100644 index 0000000..0732184 --- /dev/null +++ b/cleanup.ps1 @@ -0,0 +1,48 @@ +# RedManager Cleanup Script +# This script terminates all processes that might interfere with development + +Write-Host "[CLEANUP] Starting development process cleanup..." -ForegroundColor Cyan + +# Kill RedModManager processes +$redManagerProcesses = Get-Process -Name "RedModManager" -ErrorAction SilentlyContinue +if ($redManagerProcesses) { + Write-Host " [TASK] Terminating RedModManager processes..." -ForegroundColor Yellow + $redManagerProcesses | Stop-Process -Force + Write-Host " [SUCCESS] $($redManagerProcesses.Count) RedModManager process(es) terminated" -ForegroundColor Green +} else { + Write-Host " [INFO] No RedModManager processes found" -ForegroundColor Green +} + +# Kill Node processes (only those related to this project) +$nodeProcesses = Get-Process -Name "node" -ErrorAction SilentlyContinue | Where-Object { + $_.Path -like "*RedManager*" -or $_.CommandLine -like "*tauri*dev*" +} +if ($nodeProcesses) { + Write-Host " [TASK] Terminating Node.js processes..." -ForegroundColor Yellow + $nodeProcesses | Stop-Process -Force + Write-Host " [SUCCESS] $($nodeProcesses.Count) Node.js process(es) terminated" -ForegroundColor Green +} else { + Write-Host " [INFO] No relevant Node.js processes found" -ForegroundColor Green +} + +# Kill Cargo processes +$cargoProcesses = Get-Process -Name "cargo" -ErrorAction SilentlyContinue +if ($cargoProcesses) { + Write-Host " [TASK] Terminating Cargo processes..." -ForegroundColor Yellow + $cargoProcesses | Stop-Process -Force + Write-Host " [SUCCESS] $($cargoProcesses.Count) Cargo process(es) terminated" -ForegroundColor Green +} else { + Write-Host " [INFO] No Cargo processes found" -ForegroundColor Green +} + +# Check for port 1420 usage +$portUsage = netstat -ano | findstr :1420 +if ($portUsage) { + Write-Host " [WARNING] Port 1420 may still be in use (TIME_WAIT connections)" -ForegroundColor Yellow + Write-Host " [INFO] This is normal and will clear automatically" -ForegroundColor Gray +} else { + Write-Host " [SUCCESS] Port 1420 is free" -ForegroundColor Green +} + +Write-Host "[COMPLETE] Cleanup finished! You can now start the development server." -ForegroundColor Green +Write-Host "" \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 1cc8280..d3fefee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -500,10 +500,11 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.19", @@ -604,10 +605,14 @@ } }, "node_modules/@tauri-apps/cli": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.4.0.tgz", - "integrity": "sha512-VXYr2i2iVFl98etQSQsqLzXgX96bnWiNZd1YADgatqwy/qecbd6Kl5ZAPB5R4ynsgE8A1gU7Fbzh7dCEQYFfmA==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.6.3.tgz", + "integrity": "sha512-q46umd6QLRKDd4Gg6WyZBGa2fWvk0pbeUA5vFomm4uOs1/17LIciHv2iQ4UD+2Yv5H7AO8YiE1t50V0POiEGEw==", "dev": true, + "license": "Apache-2.0 OR MIT", + "dependencies": { + "semver": ">=7.5.2" + }, "bin": { "tauri": "tauri.js" }, @@ -619,26 +624,27 @@ "url": "https://opencollective.com/tauri" }, "optionalDependencies": { - "@tauri-apps/cli-darwin-arm64": "1.4.0", - "@tauri-apps/cli-darwin-x64": "1.4.0", - "@tauri-apps/cli-linux-arm-gnueabihf": "1.4.0", - "@tauri-apps/cli-linux-arm64-gnu": "1.4.0", - "@tauri-apps/cli-linux-arm64-musl": "1.4.0", - "@tauri-apps/cli-linux-x64-gnu": "1.4.0", - "@tauri-apps/cli-linux-x64-musl": "1.4.0", - "@tauri-apps/cli-win32-arm64-msvc": "1.4.0", - "@tauri-apps/cli-win32-ia32-msvc": "1.4.0", - "@tauri-apps/cli-win32-x64-msvc": "1.4.0" + "@tauri-apps/cli-darwin-arm64": "1.6.3", + "@tauri-apps/cli-darwin-x64": "1.6.3", + "@tauri-apps/cli-linux-arm-gnueabihf": "1.6.3", + "@tauri-apps/cli-linux-arm64-gnu": "1.6.3", + "@tauri-apps/cli-linux-arm64-musl": "1.6.3", + "@tauri-apps/cli-linux-x64-gnu": "1.6.3", + "@tauri-apps/cli-linux-x64-musl": "1.6.3", + "@tauri-apps/cli-win32-arm64-msvc": "1.6.3", + "@tauri-apps/cli-win32-ia32-msvc": "1.6.3", + "@tauri-apps/cli-win32-x64-msvc": "1.6.3" } }, "node_modules/@tauri-apps/cli-darwin-arm64": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.4.0.tgz", - "integrity": "sha512-nA/ml0SfUt6/CYLVbHmT500Y+ijqsuv5+s9EBnVXYSLVg9kbPUZJJHluEYK+xKuOj6xzyuT/+rZFMRapmJD3jQ==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.6.3.tgz", + "integrity": "sha512-fQN6IYSL8bG4NvkdKE4sAGF4dF/QqqQq4hOAU+t8ksOzHJr0hUlJYfncFeJYutr/MMkdF7hYKadSb0j5EE9r0A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -648,13 +654,14 @@ } }, "node_modules/@tauri-apps/cli-darwin-x64": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.4.0.tgz", - "integrity": "sha512-ov/F6Zr+dg9B0PtRu65stFo2G0ow2TUlneqYYrkj+vA3n+moWDHfVty0raDjMLQbQt3rv3uayFMXGPMgble9OA==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.6.3.tgz", + "integrity": "sha512-1yTXZzLajKAYINJOJhZfmMhCzweHSgKQ3bEgJSn6t+1vFkOgY8Yx4oFgWcybrrWI5J1ZLZAl47+LPOY81dLcyA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -664,13 +671,14 @@ } }, "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.4.0.tgz", - "integrity": "sha512-zwjbiMncycXDV7doovymyKD7sCg53ouAmfgpUqEBOTY3vgBi9TwijyPhJOqoG5vUVWhouNBC08akGmE4dja15g==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.6.3.tgz", + "integrity": "sha512-CjTEr9r9xgjcvos09AQw8QMRPuH152B1jvlZt4PfAsyJNPFigzuwed5/SF7XAd8bFikA7zArP4UT12RdBxrx7w==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -680,13 +688,14 @@ } }, "node_modules/@tauri-apps/cli-linux-arm64-gnu": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.4.0.tgz", - "integrity": "sha512-5MCBcziqXC72mMXnkZU68mutXIR6zavDxopArE2gQtK841IlE06bIgtLi0kUUhlFJk2nhPRgiDgdLbrPlyt7fw==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.6.3.tgz", + "integrity": "sha512-G9EUUS4M8M/Jz1UKZqvJmQQCKOzgTb8/0jZKvfBuGfh5AjFBu8LHvlFpwkKVm1l4951Xg4ulUp6P9Q7WRJ9XSA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -696,13 +705,14 @@ } }, "node_modules/@tauri-apps/cli-linux-arm64-musl": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.4.0.tgz", - "integrity": "sha512-7J3pRB6n6uNYgIfCeKt2Oz8J7oSaz2s8GGFRRH2HPxuTHrBNCinzVYm68UhVpJrL3bnGkU0ziVZLsW/iaOGfUg==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.6.3.tgz", + "integrity": "sha512-MuBTHJyNpZRbPVG8IZBN8+Zs7aKqwD22tkWVBcL1yOGL4zNNTJlkfL+zs5qxRnHlUsn6YAlbW/5HKocfpxVwBw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -712,13 +722,14 @@ } }, "node_modules/@tauri-apps/cli-linux-x64-gnu": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.4.0.tgz", - "integrity": "sha512-Zh5gfAJxOv5AVWxcwuueaQ2vIAhlg0d6nZui6nMyfIJ8dbf3aZQ5ZzP38sYow5h/fbvgL+3GSQxZRBIa3c2E1w==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.6.3.tgz", + "integrity": "sha512-Uvi7M+NK3tAjCZEY1WGel+dFlzJmqcvu3KND+nqa22762NFmOuBIZ4KJR/IQHfpEYqKFNUhJfCGnpUDfiC3Oxg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -728,13 +739,14 @@ } }, "node_modules/@tauri-apps/cli-linux-x64-musl": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.4.0.tgz", - "integrity": "sha512-OLAYoICU3FaYiTdBsI+lQTKnDHeMmFMXIApN0M+xGiOkoIOQcV9CConMPjgmJQ867+NHRNgUGlvBEAh9CiJodQ==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.6.3.tgz", + "integrity": "sha512-rc6B342C0ra8VezB/OJom9j/N+9oW4VRA4qMxS2f4bHY2B/z3J9NPOe6GOILeg4v/CV62ojkLsC3/K/CeF3fqQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -744,13 +756,14 @@ } }, "node_modules/@tauri-apps/cli-win32-arm64-msvc": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-1.4.0.tgz", - "integrity": "sha512-gZ05GENFbI6CB5MlOUsLlU0kZ9UtHn9riYtSXKT6MYs8HSPRffPHaHSL0WxsJweWh9nR5Hgh/TUU8uW3sYCzCg==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-1.6.3.tgz", + "integrity": "sha512-cSH2qOBYuYC4UVIFtrc1YsGfc5tfYrotoHrpTvRjUGu0VywvmyNk82+ZsHEnWZ2UHmu3l3lXIGRqSWveLln0xg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -760,13 +773,14 @@ } }, "node_modules/@tauri-apps/cli-win32-ia32-msvc": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.4.0.tgz", - "integrity": "sha512-JsetT/lTx/Zq98eo8T5CiRyF1nKeX04RO8JlJrI3ZOYsZpp/A5RJvMd/szQ17iOzwiHdge+tx7k2jHysR6oBlQ==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.6.3.tgz", + "integrity": "sha512-T8V6SJQqE4PSWmYBl0ChQVmS6AR2hXFHURH2DwAhgSGSQ6uBXgwlYFcfIeQpBQA727K2Eq8X2hGfvmoySyHMRw==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -776,13 +790,14 @@ } }, "node_modules/@tauri-apps/cli-win32-x64-msvc": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.4.0.tgz", - "integrity": "sha512-z8Olcnwp5aYhzqUAarFjqF+oELCjuYWnB2HAJHlfsYNfDCAORY5kct3Fklz8PSsubC3U2EugWn8n42DwnThurg==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.6.3.tgz", + "integrity": "sha512-HUkWZ+lYHI/Gjkh2QjHD/OBDpqLVmvjZGpLK9losur1Eg974Jip6k+vsoTUxQBCBDfj30eDBct9E1FvXOspWeg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -855,12 +870,13 @@ } }, "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "dev": true, - "dependencies": { - "dequal": "^2.0.3" + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" } }, "node_modules/balanced-match": { @@ -879,22 +895,24 @@ } }, "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": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -1105,10 +1123,11 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1256,6 +1275,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -1323,15 +1343,13 @@ } }, "node_modules/magic-string": { - "version": "0.30.3", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.3.tgz", - "integrity": "sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==", + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/mdn-data": { @@ -1350,12 +1368,13 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -1432,9 +1451,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -1442,6 +1461,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -1512,10 +1532,11 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -1541,9 +1562,9 @@ } }, "node_modules/postcss": { - "version": "8.4.28", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", - "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -1559,10 +1580,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -1632,10 +1654,11 @@ } }, "node_modules/rollup": { - "version": "3.28.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.1.tgz", - "integrity": "sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==", + "version": "3.29.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", + "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", "dev": true, + "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, @@ -1724,10 +1747,11 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -1745,23 +1769,25 @@ } }, "node_modules/svelte": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.0.tgz", - "integrity": "sha512-kVsdPjDbLrv74SmLSUzAsBGquMs4MPgWGkGLpH+PjOYnFOziAvENVzgJmyOCV2gntxE32aNm8/sqNKD6LbIpeQ==", + "version": "4.2.20", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.20.tgz", + "integrity": "sha512-eeEgGc2DtiUil5ANdtd8vPwt9AgaMdnuUFnPft9F5oMvU/FHu5IHFic+p1dR/UOB7XU2mX2yHW+NcTch4DCh5Q==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.1", "@jridgewell/sourcemap-codec": "^1.4.15", "@jridgewell/trace-mapping": "^0.3.18", + "@types/estree": "^1.0.1", "acorn": "^8.9.0", "aria-query": "^5.3.0", - "axobject-query": "^3.2.1", + "axobject-query": "^4.0.0", "code-red": "^1.0.3", "css-tree": "^2.3.1", "estree-walker": "^3.0.3", "is-reference": "^3.0.1", "locate-character": "^3.0.0", - "magic-string": "^0.30.0", + "magic-string": "^0.30.4", "periscopic": "^3.1.0" }, "engines": { @@ -1895,6 +1921,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -1987,10 +2014,11 @@ } }, "node_modules/vite": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", - "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "version": "4.5.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.14.tgz", + "integrity": "sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.27", @@ -2330,9 +2358,9 @@ "dev": true }, "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true }, "@jridgewell/trace-mapping": { @@ -2401,90 +2429,91 @@ "integrity": "sha512-Jd6HPoTM1PZSFIzq7FB8VmMu3qSSyo/3lSwLpoapW+lQ41CL5Dow2KryLg+gyazA/58DRWI9vu/XpEeHK4uMdw==" }, "@tauri-apps/cli": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.4.0.tgz", - "integrity": "sha512-VXYr2i2iVFl98etQSQsqLzXgX96bnWiNZd1YADgatqwy/qecbd6Kl5ZAPB5R4ynsgE8A1gU7Fbzh7dCEQYFfmA==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.6.3.tgz", + "integrity": "sha512-q46umd6QLRKDd4Gg6WyZBGa2fWvk0pbeUA5vFomm4uOs1/17LIciHv2iQ4UD+2Yv5H7AO8YiE1t50V0POiEGEw==", "dev": true, "requires": { - "@tauri-apps/cli-darwin-arm64": "1.4.0", - "@tauri-apps/cli-darwin-x64": "1.4.0", - "@tauri-apps/cli-linux-arm-gnueabihf": "1.4.0", - "@tauri-apps/cli-linux-arm64-gnu": "1.4.0", - "@tauri-apps/cli-linux-arm64-musl": "1.4.0", - "@tauri-apps/cli-linux-x64-gnu": "1.4.0", - "@tauri-apps/cli-linux-x64-musl": "1.4.0", - "@tauri-apps/cli-win32-arm64-msvc": "1.4.0", - "@tauri-apps/cli-win32-ia32-msvc": "1.4.0", - "@tauri-apps/cli-win32-x64-msvc": "1.4.0" + "@tauri-apps/cli-darwin-arm64": "1.6.3", + "@tauri-apps/cli-darwin-x64": "1.6.3", + "@tauri-apps/cli-linux-arm-gnueabihf": "1.6.3", + "@tauri-apps/cli-linux-arm64-gnu": "1.6.3", + "@tauri-apps/cli-linux-arm64-musl": "1.6.3", + "@tauri-apps/cli-linux-x64-gnu": "1.6.3", + "@tauri-apps/cli-linux-x64-musl": "1.6.3", + "@tauri-apps/cli-win32-arm64-msvc": "1.6.3", + "@tauri-apps/cli-win32-ia32-msvc": "1.6.3", + "@tauri-apps/cli-win32-x64-msvc": "1.6.3", + "semver": ">=7.5.2" } }, "@tauri-apps/cli-darwin-arm64": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.4.0.tgz", - "integrity": "sha512-nA/ml0SfUt6/CYLVbHmT500Y+ijqsuv5+s9EBnVXYSLVg9kbPUZJJHluEYK+xKuOj6xzyuT/+rZFMRapmJD3jQ==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.6.3.tgz", + "integrity": "sha512-fQN6IYSL8bG4NvkdKE4sAGF4dF/QqqQq4hOAU+t8ksOzHJr0hUlJYfncFeJYutr/MMkdF7hYKadSb0j5EE9r0A==", "dev": true, "optional": true }, "@tauri-apps/cli-darwin-x64": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.4.0.tgz", - "integrity": "sha512-ov/F6Zr+dg9B0PtRu65stFo2G0ow2TUlneqYYrkj+vA3n+moWDHfVty0raDjMLQbQt3rv3uayFMXGPMgble9OA==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.6.3.tgz", + "integrity": "sha512-1yTXZzLajKAYINJOJhZfmMhCzweHSgKQ3bEgJSn6t+1vFkOgY8Yx4oFgWcybrrWI5J1ZLZAl47+LPOY81dLcyA==", "dev": true, "optional": true }, "@tauri-apps/cli-linux-arm-gnueabihf": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.4.0.tgz", - "integrity": "sha512-zwjbiMncycXDV7doovymyKD7sCg53ouAmfgpUqEBOTY3vgBi9TwijyPhJOqoG5vUVWhouNBC08akGmE4dja15g==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.6.3.tgz", + "integrity": "sha512-CjTEr9r9xgjcvos09AQw8QMRPuH152B1jvlZt4PfAsyJNPFigzuwed5/SF7XAd8bFikA7zArP4UT12RdBxrx7w==", "dev": true, "optional": true }, "@tauri-apps/cli-linux-arm64-gnu": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.4.0.tgz", - "integrity": "sha512-5MCBcziqXC72mMXnkZU68mutXIR6zavDxopArE2gQtK841IlE06bIgtLi0kUUhlFJk2nhPRgiDgdLbrPlyt7fw==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.6.3.tgz", + "integrity": "sha512-G9EUUS4M8M/Jz1UKZqvJmQQCKOzgTb8/0jZKvfBuGfh5AjFBu8LHvlFpwkKVm1l4951Xg4ulUp6P9Q7WRJ9XSA==", "dev": true, "optional": true }, "@tauri-apps/cli-linux-arm64-musl": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.4.0.tgz", - "integrity": "sha512-7J3pRB6n6uNYgIfCeKt2Oz8J7oSaz2s8GGFRRH2HPxuTHrBNCinzVYm68UhVpJrL3bnGkU0ziVZLsW/iaOGfUg==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.6.3.tgz", + "integrity": "sha512-MuBTHJyNpZRbPVG8IZBN8+Zs7aKqwD22tkWVBcL1yOGL4zNNTJlkfL+zs5qxRnHlUsn6YAlbW/5HKocfpxVwBw==", "dev": true, "optional": true }, "@tauri-apps/cli-linux-x64-gnu": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.4.0.tgz", - "integrity": "sha512-Zh5gfAJxOv5AVWxcwuueaQ2vIAhlg0d6nZui6nMyfIJ8dbf3aZQ5ZzP38sYow5h/fbvgL+3GSQxZRBIa3c2E1w==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.6.3.tgz", + "integrity": "sha512-Uvi7M+NK3tAjCZEY1WGel+dFlzJmqcvu3KND+nqa22762NFmOuBIZ4KJR/IQHfpEYqKFNUhJfCGnpUDfiC3Oxg==", "dev": true, "optional": true }, "@tauri-apps/cli-linux-x64-musl": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.4.0.tgz", - "integrity": "sha512-OLAYoICU3FaYiTdBsI+lQTKnDHeMmFMXIApN0M+xGiOkoIOQcV9CConMPjgmJQ867+NHRNgUGlvBEAh9CiJodQ==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.6.3.tgz", + "integrity": "sha512-rc6B342C0ra8VezB/OJom9j/N+9oW4VRA4qMxS2f4bHY2B/z3J9NPOe6GOILeg4v/CV62ojkLsC3/K/CeF3fqQ==", "dev": true, "optional": true }, "@tauri-apps/cli-win32-arm64-msvc": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-1.4.0.tgz", - "integrity": "sha512-gZ05GENFbI6CB5MlOUsLlU0kZ9UtHn9riYtSXKT6MYs8HSPRffPHaHSL0WxsJweWh9nR5Hgh/TUU8uW3sYCzCg==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-1.6.3.tgz", + "integrity": "sha512-cSH2qOBYuYC4UVIFtrc1YsGfc5tfYrotoHrpTvRjUGu0VywvmyNk82+ZsHEnWZ2UHmu3l3lXIGRqSWveLln0xg==", "dev": true, "optional": true }, "@tauri-apps/cli-win32-ia32-msvc": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.4.0.tgz", - "integrity": "sha512-JsetT/lTx/Zq98eo8T5CiRyF1nKeX04RO8JlJrI3ZOYsZpp/A5RJvMd/szQ17iOzwiHdge+tx7k2jHysR6oBlQ==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.6.3.tgz", + "integrity": "sha512-T8V6SJQqE4PSWmYBl0ChQVmS6AR2hXFHURH2DwAhgSGSQ6uBXgwlYFcfIeQpBQA727K2Eq8X2hGfvmoySyHMRw==", "dev": true, "optional": true }, "@tauri-apps/cli-win32-x64-msvc": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.4.0.tgz", - "integrity": "sha512-z8Olcnwp5aYhzqUAarFjqF+oELCjuYWnB2HAJHlfsYNfDCAORY5kct3Fklz8PSsubC3U2EugWn8n42DwnThurg==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.6.3.tgz", + "integrity": "sha512-HUkWZ+lYHI/Gjkh2QjHD/OBDpqLVmvjZGpLK9losur1Eg974Jip6k+vsoTUxQBCBDfj30eDBct9E1FvXOspWeg==", "dev": true, "optional": true }, @@ -2543,13 +2572,10 @@ } }, "axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", - "dev": true, - "requires": { - "dequal": "^2.0.3" - } + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true }, "balanced-match": { "version": "1.0.2", @@ -2564,9 +2590,9 @@ "dev": true }, "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, "requires": { "balanced-match": "^1.0.0", @@ -2574,12 +2600,12 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "buffer-crc32": { @@ -2740,9 +2766,9 @@ } }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -2903,12 +2929,12 @@ } }, "magic-string": { - "version": "0.30.3", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.3.tgz", - "integrity": "sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==", + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", "dev": true, "requires": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "mdn-data": { @@ -2924,12 +2950,12 @@ "dev": true }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" } }, @@ -2988,9 +3014,9 @@ "dev": true }, "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true }, "normalize-path": { @@ -3047,9 +3073,9 @@ } }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "picomatch": { @@ -3070,14 +3096,14 @@ } }, "postcss": { - "version": "8.4.28", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", - "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "requires": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" } }, "queue-microtask": { @@ -3117,9 +3143,9 @@ } }, "rollup": { - "version": "3.28.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.1.tgz", - "integrity": "sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==", + "version": "3.29.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", + "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", "dev": true, "requires": { "fsevents": "~2.3.2" @@ -3176,9 +3202,9 @@ } }, "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true }, "strip-indent": { @@ -3191,23 +3217,24 @@ } }, "svelte": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.0.tgz", - "integrity": "sha512-kVsdPjDbLrv74SmLSUzAsBGquMs4MPgWGkGLpH+PjOYnFOziAvENVzgJmyOCV2gntxE32aNm8/sqNKD6LbIpeQ==", + "version": "4.2.20", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.20.tgz", + "integrity": "sha512-eeEgGc2DtiUil5ANdtd8vPwt9AgaMdnuUFnPft9F5oMvU/FHu5IHFic+p1dR/UOB7XU2mX2yHW+NcTch4DCh5Q==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.1", "@jridgewell/sourcemap-codec": "^1.4.15", "@jridgewell/trace-mapping": "^0.3.18", + "@types/estree": "^1.0.1", "acorn": "^8.9.0", "aria-query": "^5.3.0", - "axobject-query": "^3.2.1", + "axobject-query": "^4.0.0", "code-red": "^1.0.3", "css-tree": "^2.3.1", "estree-walker": "^3.0.3", "is-reference": "^3.0.1", "locate-character": "^3.0.0", - "magic-string": "^0.30.0", + "magic-string": "^0.30.4", "periscopic": "^3.1.0" } }, @@ -3324,9 +3351,9 @@ } }, "vite": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", - "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "version": "4.5.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.14.tgz", + "integrity": "sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==", "dev": true, "requires": { "esbuild": "^0.18.10", diff --git a/package.json b/package.json index b540b93..9ed3a17 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "RedModManager", + "name": "red-mod-manager", "private": true, "version": "1.1.9", "type": "module", @@ -14,8 +14,7 @@ "@tauri-apps/api": "^1.4.0", "@types/lodash": "^4.17.15", "lodash": "^4.17.21", - "semver": "^7.5.4", - "tauri-plugin-upload-api": "github:tauri-apps/tauri-plugin-upload#v1" + "semver": "^7.5.4" }, "devDependencies": { "@iconify/json": "^2.2.302", diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 60a2e61..e2633c8 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1,43 +1,37 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "RedModManager" version = "0.0.0" dependencies = [ + "futures-util", + "image", "regex", + "reqwest", "serde", "serde_json", "tauri", "tauri-build", - "tauri-plugin-upload", + "tauri-plugin-window-state", "tokio", "windows 0.33.0", - "winreg 0.11.0", + "winreg 0.55.0", "zip", ] [[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aho-corasick" -version = "1.0.4" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -57,12 +51,6 @@ dependencies = [ "alloc-no-stdlib", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -74,9 +62,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.75" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "atk" @@ -99,41 +87,47 @@ dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.1.1", + "system-deps 6.2.2", ] [[package]] name = "autocfg" -version = "1.1.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] -name = "backtrace" -version = "0.3.69" +name = "base64" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.13.1" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64" -version = "0.21.2" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bit_field" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" +checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" [[package]] name = "bitflags" @@ -143,9 +137,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.0" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" [[package]] name = "block" @@ -164,9 +158,9 @@ dependencies = [ [[package]] name = "brotli" -version = "3.3.4" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" +checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -175,9 +169,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.3.4" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" +checksum = "a334ef7c9e23abf0ce748e8cd309037da93e606ad52eb372e4ce327a0dcfbdfd" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -185,9 +179,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.6.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" +checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" dependencies = [ "memchr", "serde", @@ -195,27 +189,27 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.13.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytemuck" -version = "1.13.1" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.4.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" dependencies = [ "serde", ] @@ -232,12 +226,11 @@ dependencies = [ [[package]] name = "bzip2-sys" -version = "0.1.11+1.0.8" +version = "0.1.13+1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" dependencies = [ "cc", - "libc", "pkg-config", ] @@ -262,7 +255,7 @@ checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" dependencies = [ "glib-sys", "libc", - "system-deps 6.1.1", + "system-deps 6.2.2", ] [[package]] @@ -272,16 +265,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "599aa35200ffff8f04c1925aa1acc92fa2e08874379ef42e210a80e527e60838" dependencies = [ "serde", - "toml 0.7.6", + "toml 0.7.8", ] [[package]] name = "cc" -version = "1.0.83" +version = "1.2.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7" dependencies = [ - "libc", + "find-msvc-tools", + "shlex", ] [[package]] @@ -312,9 +306,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.15.4" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b40ccee03b5175c18cde8f37e7d2a33bcef6f8ec8f7cc0d81090d1bb380949c9" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" dependencies = [ "smallvec", "target-lexicon", @@ -322,21 +316,20 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "chrono" -version = "0.4.26" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "num-traits", "serde", - "winapi", + "windows-link", ] [[package]] @@ -357,15 +350,14 @@ dependencies = [ [[package]] name = "cocoa-foundation" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "931d3837c286f56e3c58423ce4eba12d08db2374461a785c86f672b08b5650d6" +checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" dependencies = [ "bitflags 1.3.2", "block", "core-foundation", "core-graphics-types", - "foreign-types", "libc", "objc", ] @@ -378,9 +370,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "combine" -version = "4.6.6" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" dependencies = [ "bytes", "memchr", @@ -394,9 +386,9 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -404,9 +396,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "core-graphics" @@ -423,9 +415,9 @@ dependencies = [ [[package]] name = "core-graphics-types" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb142d41022986c1d8ff29103a1411c8a3dfad3552f87a4f8dc50d61d4f4e33" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ "bitflags 1.3.2", "core-foundation", @@ -434,41 +426,62 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.8" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] -name = "crossbeam-utils" -version = "0.8.16" +name = "crossbeam-deque" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ - "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", ] +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + [[package]] name = "crypto-common" version = "0.1.6" @@ -503,24 +516,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.29", + "syn 2.0.106", ] [[package]] name = "ctor" -version = "0.1.26" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" +checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn 1.0.109", + "syn 2.0.106", ] [[package]] name = "darling" -version = "0.20.3" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" dependencies = [ "darling_core", "darling_macro", @@ -528,49 +541,50 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.3" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.29", + "syn 2.0.106", ] [[package]] name = "darling_macro" -version = "0.20.3" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core", "quote", - "syn 2.0.29", + "syn 2.0.106", ] [[package]] name = "deranged" -version = "0.3.8" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" +checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" dependencies = [ - "serde", + "powerfmt", + "serde_core", ] [[package]] name = "derive_more" -version = "0.99.17" +version = "0.99.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" dependencies = [ "convert_case", "proc-macro2", "quote", "rustc_version", - "syn 1.0.109", + "syn 2.0.106", ] [[package]] @@ -610,38 +624,62 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "dtoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" +checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" [[package]] name = "dtoa-short" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbaceec3c6e4211c79e7b1800fb9680527106beb2f9c51904a3210c03a448c74" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" dependencies = [ "dtoa", ] [[package]] name = "dunce" -version = "1.0.4" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "either" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "embed-resource" -version = "2.2.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7f1e82a60222fc67bfd50d752a9c89da5cce4c39ed39decc84a443b07bbd69a" +checksum = "d506610004cfc74a6f5ee7e8c632b355de5eca1f03ee5e5e0ec11b77d4eb3d61" dependencies = [ "cc", + "memchr", "rustc_version", - "toml 0.7.6", + "toml 0.8.23", "vswhom", - "winreg 0.11.0", + "winreg 0.52.0", ] [[package]] @@ -652,51 +690,55 @@ checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" [[package]] name = "encoding_rs" -version = "0.8.33" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.2" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ - "errno-dragonfly", "libc", - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] -name = "errno-dragonfly" -version = "0.1.2" +name = "exr" +version = "1.73.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" dependencies = [ - "cc", - "libc", + "bit_field", + "half", + "lebe", + "miniz_oxide", + "rayon-core", + "smallvec", + "zune-inflate", ] [[package]] name = "fastrand" -version = "2.0.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fdeflate" -version = "0.3.0" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d329bdeac514ee06249dabc27877490f17f5d371ec693360768b838e19f3ae10" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" dependencies = [ "simd-adler32", ] @@ -713,26 +755,41 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.22" +version = "0.2.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" +checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", - "windows-sys 0.48.0", + "libredox", + "windows-sys 0.60.2", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" + [[package]] name = "flate2" -version = "1.0.27" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" +checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" dependencies = [ "crc32fast", "miniz_oxide", ] +[[package]] +name = "fluent-uri" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17c704e9dbe1ddd863da1e6ff3567795087b1eb201ce80d8fa81162e1516500d" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "fnv" version = "1.0.7" @@ -756,9 +813,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -773,42 +830,26 @@ dependencies = [ "new_debug_unreachable", ] -[[package]] -name = "futures" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", - "futures-sink", ] [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -817,40 +858,39 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.106", ] [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ - "futures-channel", "futures-core", "futures-io", "futures-macro", @@ -910,7 +950,7 @@ dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.1.1", + "system-deps 6.2.2", ] [[package]] @@ -927,7 +967,7 @@ dependencies = [ "libc", "pango-sys", "pkg-config", - "system-deps 6.1.1", + "system-deps 6.2.2", ] [[package]] @@ -941,7 +981,7 @@ dependencies = [ "gobject-sys", "libc", "pkg-config", - "system-deps 6.1.1", + "system-deps 6.2.2", ] [[package]] @@ -953,7 +993,7 @@ dependencies = [ "gdk-sys", "glib-sys", "libc", - "system-deps 6.1.1", + "system-deps 6.2.2", "x11", ] @@ -972,9 +1012,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.7" +version = "0.14.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" dependencies = [ "typenum", "version_check", @@ -993,20 +1033,36 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "r-efi", + "wasip2", ] [[package]] -name = "gimli" -version = "0.28.0" +name = "gif" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" +dependencies = [ + "color_quant", + "weezl", +] [[package]] name = "gio" @@ -1034,7 +1090,7 @@ dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.1.1", + "system-deps 6.2.2", "winapi", ] @@ -1080,26 +1136,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" dependencies = [ "libc", - "system-deps 6.1.1", + "system-deps 6.2.2", ] [[package]] name = "glob" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "globset" -version = "0.4.13" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d" +checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5" dependencies = [ "aho-corasick", "bstr", - "fnv", "log", - "regex", + "regex-automata", + "regex-syntax", ] [[package]] @@ -1110,7 +1166,7 @@ checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" dependencies = [ "glib-sys", "libc", - "system-deps 6.1.1", + "system-deps 6.2.2", ] [[package]] @@ -1151,7 +1207,7 @@ dependencies = [ "gobject-sys", "libc", "pango-sys", - "system-deps 6.1.1", + "system-deps 6.2.2", ] [[package]] @@ -1170,9 +1226,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.21" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" dependencies = [ "bytes", "fnv", @@ -1180,13 +1236,24 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 1.9.3", + "indexmap 2.11.4", "slab", "tokio", "tokio-util", "tracing", ] +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "zerocopy", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -1195,9 +1262,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.14.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" [[package]] name = "heck" @@ -1215,10 +1282,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] -name = "hermit-abi" -version = "0.3.2" +name = "heck" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hex" @@ -1228,9 +1295,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "html5ever" -version = "0.25.2" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148" +checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" dependencies = [ "log", "mac", @@ -1242,20 +1309,20 @@ dependencies = [ [[package]] name = "http" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", - "itoa 1.0.9", + "itoa 1.0.15", ] [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http", @@ -1270,9 +1337,9 @@ checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" [[package]] name = "httparse" -version = "1.8.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -1282,9 +1349,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ "bytes", "futures-channel", @@ -1295,9 +1362,9 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa 1.0.9", + "itoa 1.0.15", "pin-project-lite", - "socket2 0.4.9", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -1319,16 +1386,17 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.57" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", - "windows 0.48.0", + "windows-core", ] [[package]] @@ -1342,14 +1410,100 @@ dependencies = [ [[package]] name = "ico" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3804960be0bb5e4edb1e1ad67afd321a9ecfd875c3e65c099468fd2717d7cae" +checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" dependencies = [ "byteorder", "png", ] +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -1358,42 +1512,57 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.4.0" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "icu_normalizer", + "icu_properties", ] [[package]] name = "ignore" -version = "0.4.20" +version = "0.4.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492" +checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" dependencies = [ + "crossbeam-deque", "globset", - "lazy_static", "log", "memchr", - "regex", + "regex-automata", "same-file", - "thread_local", "walkdir", "winapi-util", ] [[package]] name = "image" -version = "0.24.7" +version = "0.24.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" dependencies = [ "bytemuck", "byteorder", "color_quant", - "num-rational", + "exr", + "gif", + "jpeg-decoder", "num-traits", + "png", + "qoi", + "tiff", ] [[package]] @@ -1409,38 +1578,39 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.0.0" +version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", - "hashbrown 0.14.0", + "hashbrown 0.16.0", "serde", + "serde_core", ] [[package]] name = "infer" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a898e4b7951673fce96614ce5751d13c40fc5674bc2d759288e46c3ab62598b3" +checksum = "f551f8c3a39f68f986517db0d1759de85881894fdc7db798bd2a9df9cb04b7fc" dependencies = [ "cfb", ] [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", ] [[package]] name = "ipnet" -version = "2.8.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "itoa" @@ -1450,9 +1620,9 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "javascriptcore-rs" @@ -1497,81 +1667,116 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +[[package]] +name = "jpeg-decoder" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" +dependencies = [ + "rayon", +] + [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ + "once_cell", "wasm-bindgen", ] [[package]] name = "json-patch" -version = "1.0.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f54898088ccb91df1b492cc80029a6fdf1c48ca0db7c6822a8babad69c94658" +checksum = "5b1fb8864823fad91877e6caea0baca82e49e8db50f8e5c9f9a453e27d3330fc" dependencies = [ + "jsonptr", "serde", "serde_json", "thiserror", - "treediff", ] [[package]] -name = "kuchiki" -version = "0.8.1" +name = "jsonptr" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c6e529149475ca0b2820835d3dce8fcc41c6b943ca608d32f35b449255e4627" +dependencies = [ + "fluent-uri", + "serde", + "serde_json", +] + +[[package]] +name = "kuchikiki" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ea8e9c6e031377cff82ee3001dc8026cdf431ed4e2e6b51f98ab8c73484a358" +checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8" dependencies = [ "cssparser", "html5ever", + "indexmap 1.9.3", "matches", "selectors", ] [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lebe" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" [[package]] name = "libc" -version = "0.2.147" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] -name = "line-wrap" -version = "0.1.1" +name = "libredox" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ - "safemem", + "bitflags 2.9.4", + "libc", + "redox_syscall", ] [[package]] name = "linux-raw-sys" -version = "0.4.5" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.20" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "loom" @@ -1605,13 +1810,13 @@ dependencies = [ [[package]] name = "markup5ever" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd" +checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016" dependencies = [ "log", - "phf 0.8.0", - "phf_codegen", + "phf 0.10.1", + "phf_codegen 0.10.0", "string_cache", "string_cache_codegen", "tendril", @@ -1619,11 +1824,11 @@ dependencies = [ [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] [[package]] @@ -1634,15 +1839,15 @@ checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" [[package]] name = "memchr" -version = "2.5.0" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memoffset" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ "autocfg", ] @@ -1655,32 +1860,31 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ - "adler", + "adler2", "simd-adler32", ] [[package]] name = "mio" -version = "0.8.8" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.48.0", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", ] [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -1722,9 +1926,9 @@ dependencies = [ [[package]] name = "new_debug_unreachable" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] name = "nodrop" @@ -1734,54 +1938,28 @@ checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" [[package]] name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[package]] -name = "num-integer" -version = "0.1.45" +version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "autocfg", - "num-traits", + "windows-sys 0.61.2", ] [[package]] -name = "num-rational" -version = "0.4.1" +name = "num-conv" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] name = "num-traits" -version = "0.2.16" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - [[package]] name = "num_enum" version = "0.5.11" @@ -1842,20 +2020,11 @@ dependencies = [ "objc", ] -[[package]] -name = "object" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" -version = "1.18.0" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "open" @@ -1869,11 +2038,11 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.56" +version = "0.10.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "729b745ad4a5575dd06a3e1af1414bd330ee561c01b3899eb584baeaa8def17e" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.9.4", "cfg-if", "foreign-types", "libc", @@ -1890,20 +2059,20 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.106", ] [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.91" +version = "0.9.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "866b5f16f90776b9bb8dc1e1802ac6f0513de3a7a7465867bfbc563dc737faac" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" dependencies = [ "cc", "libc", @@ -1913,20 +2082,14 @@ dependencies = [ [[package]] name = "os_pipe" -version = "1.1.4" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae859aa07428ca9a929b936690f8b12dc5f11dd8c6992a18ca93919f28bc177" +checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "pango" version = "0.15.10" @@ -1949,14 +2112,14 @@ dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.1.1", + "system-deps 6.2.2", ] [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -1964,28 +2127,28 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", + "redox_syscall", "smallvec", - "windows-targets", + "windows-link", ] [[package]] name = "pathdiff" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "phf" @@ -2004,9 +2167,17 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" dependencies = [ - "phf_macros 0.10.0", "phf_shared 0.10.0", - "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros 0.11.3", + "phf_shared 0.11.3", ] [[package]] @@ -2019,6 +2190,16 @@ dependencies = [ "phf_shared 0.8.0", ] +[[package]] +name = "phf_codegen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", +] + [[package]] name = "phf_generator" version = "0.8.0" @@ -2039,6 +2220,16 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared 0.11.3", + "rand 0.8.5", +] + [[package]] name = "phf_macros" version = "0.8.0" @@ -2055,16 +2246,15 @@ dependencies = [ [[package]] name = "phf_macros" -version = "0.10.0" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", - "proc-macro-hack", + "phf_generator 0.11.3", + "phf_shared 0.11.3", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.106", ] [[package]] @@ -2073,7 +2263,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" dependencies = [ - "siphasher", + "siphasher 0.3.11", ] [[package]] @@ -2082,14 +2272,23 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" dependencies = [ - "siphasher", + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher 1.0.1", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -2099,29 +2298,28 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "plist" -version = "1.5.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdc0001cfea3db57a2e24bc0d818e9e20e554b5f97fabb9bc231dc240269ae06" +checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" dependencies = [ - "base64 0.21.2", - "indexmap 1.9.3", - "line-wrap", + "base64 0.22.1", + "indexmap 2.11.4", "quick-xml", "serde", - "time 0.3.27", + "time 0.3.44", ] [[package]] name = "png" -version = "0.17.10" +version = "0.17.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -2130,11 +2328,29 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "potential_utf" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] [[package]] name = "precomputed-hash" @@ -2149,7 +2365,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", - "toml_edit", + "toml_edit 0.19.15", ] [[package]] @@ -2184,31 +2400,46 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + [[package]] name = "quick-xml" -version = "0.29.0" +version = "0.38.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81b9228215d82c7b61490fec1de287136b5de6f5700f6e58ea9ad61a7964ca51" +checksum = "42a232e7487fc2ef313d96dde7948e7a3c05101870d8985e4fd8d26aedd27b89" dependencies = [ "memchr", ] [[package]] name = "quote" -version = "1.0.33" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "rand" version = "0.7.3" @@ -2269,7 +2500,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.10", + "getrandom 0.2.16", ] [[package]] @@ -2297,96 +2528,101 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" [[package]] -name = "read-progress-stream" -version = "1.0.0" +name = "rayon" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6435842fc2fea44b528719eb8c32203bbc1bb2f5b619fbe0c0a3d8350fd8d2a8" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ - "bytes", - "futures", - "pin-project-lite", + "either", + "rayon-core", ] [[package]] -name = "redox_syscall" -version = "0.2.16" +name = "rayon-core" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ - "bitflags 1.3.2", + "crossbeam-deque", + "crossbeam-utils", ] [[package]] name = "redox_syscall" -version = "0.3.5" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.9.4", ] [[package]] name = "redox_users" -version = "0.4.3" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.10", - "redox_syscall 0.2.16", + "getrandom 0.2.16", + "libredox", "thiserror", ] [[package]] -name = "regex" -version = "1.9.3" +name = "ref-cast" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.3.6", - "regex-syntax 0.7.4", + "ref-cast-impl", ] [[package]] -name = "regex-automata" -version = "0.1.10" +name = "ref-cast-impl" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ - "regex-syntax 0.6.29", + "proc-macro2", + "quote", + "syn 2.0.106", ] [[package]] -name = "regex-automata" -version = "0.3.6" +name = "regex" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.4", + "regex-automata", + "regex-syntax", ] [[package]] -name = "regex-syntax" -version = "0.6.29" +name = "regex-automata" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] [[package]] name = "regex-syntax" -version = "0.7.4" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "reqwest" -version = "0.11.20" +version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ - "base64 0.21.2", + "base64 0.21.7", "bytes", "encoding_rs", "futures-core", @@ -2404,9 +2640,12 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", + "sync_wrapper", + "system-configuration", "tokio", "tokio-native-tls", "tokio-util", @@ -2443,51 +2682,48 @@ dependencies = [ "windows 0.37.0", ] -[[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] [[package]] name = "rustix" -version = "0.38.8" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ed4fa021d81c8392ce04db050a3da9a60299050b7ae1cf482d862b54a7218f" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.9.4", "errno", "libc", "linux-raw-sys", - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] -name = "rustversion" -version = "1.0.14" +name = "rustls-pemfile" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] [[package]] -name = "ryu" -version = "1.0.15" +name = "rustversion" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] -name = "safemem" -version = "0.3.3" +name = "ryu" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "same-file" @@ -2500,11 +2736,35 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.22" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.61.2", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", ] [[package]] @@ -2521,11 +2781,11 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.9.2" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.9.4", "core-foundation", "core-foundation-sys", "libc", @@ -2534,9 +2794,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", @@ -2555,7 +2815,7 @@ dependencies = [ "log", "matches", "phf 0.8.0", - "phf_codegen", + "phf_codegen 0.8.0", "precomputed-hash", "servo_arc", "smallvec", @@ -2564,60 +2824,74 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.18" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" dependencies = [ "serde", + "serde_core", ] [[package]] name = "serde" -version = "1.0.186" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f5db24220c009de9bd45e69fb2938f4b6d2df856aa9304ce377b3180f83b7c1" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.186" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ad697f7e0b65af4983a4ce8f56ed5b357e8d3c36651bf6a7e13639c17b8e670" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.106", ] [[package]] name = "serde_json" -version = "1.0.105" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ - "itoa 1.0.9", + "indexmap 2.11.4", + "itoa 1.0.15", + "memchr", "ryu", "serde", + "serde_core", ] [[package]] name = "serde_repr" -version = "0.1.16" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.106", ] [[package]] name = "serde_spanned" -version = "0.6.3" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ "serde", ] @@ -2629,45 +2903,47 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.9", + "itoa 1.0.15", "ryu", "serde", ] [[package]] name = "serde_with" -version = "3.3.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ca3b16a3d82c4088f343b7480a93550b3eabe1a358569c2dfe38bbcead07237" +checksum = "6093cd8c01b25262b84927e0f7151692158fab02d961e04c979d3903eba7ecc5" dependencies = [ - "base64 0.21.2", + "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.0.0", - "serde", + "indexmap 2.11.4", + "schemars 0.9.0", + "schemars 1.0.4", + "serde_core", "serde_json", "serde_with_macros", - "time 0.3.27", + "time 0.3.44", ] [[package]] name = "serde_with_macros" -version = "3.3.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e6be15c453eb305019bfa438b1593c731f36a289a7853f7707ee29e870b3b3c" +checksum = "a7e6c180db0816026a61afa1cff5344fb7ebded7e4d3062772179f2501481c27" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.106", ] [[package]] name = "serialize-to-javascript" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" dependencies = [ "serde", "serde_json", @@ -2676,13 +2952,13 @@ dependencies = [ [[package]] name = "serialize-to-javascript-impl" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.106", ] [[package]] @@ -2697,9 +2973,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -2708,21 +2984,58 @@ dependencies = [ [[package]] name = "sharded-slab" -version = "0.1.4" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ "lazy_static", ] [[package]] name = "shared_child" -version = "1.0.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0d94659ad3c2137fef23ae75b03d5241d633f8acded53d672decfa0e6e0caef" +checksum = "1e362d9935bc50f019969e2f9ecd66786612daae13e8f277be7bfb66e8bed3f7" +dependencies = [ + "libc", + "sigchld", + "windows-sys 0.60.2", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "sigchld" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47106eded3c154e70176fc83df9737335c94ce22f821c32d17ed1db1f83badb1" +dependencies = [ + "libc", + "os_pipe", + "signal-hook", +] + +[[package]] +name = "signal-hook" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", - "winapi", ] [[package]] @@ -2737,39 +3050,42 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + [[package]] name = "slab" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" -version = "1.11.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.4.9" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", - "winapi", + "windows-sys 0.52.0", ] [[package]] name = "socket2" -version = "0.5.3" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.60.2", ] [[package]] @@ -2802,9 +3118,9 @@ dependencies = [ [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "state" @@ -2817,35 +3133,34 @@ dependencies = [ [[package]] name = "string_cache" -version = "0.8.7" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" dependencies = [ "new_debug_unreachable", - "once_cell", "parking_lot", - "phf_shared 0.10.0", + "phf_shared 0.11.3", "precomputed-hash", "serde", ] [[package]] name = "string_cache_codegen" -version = "0.5.2" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" +checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", + "phf_generator 0.11.3", + "phf_shared 0.11.3", "proc-macro2", "quote", ] [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" @@ -2860,9 +3175,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.29" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -2870,36 +3185,74 @@ dependencies = [ ] [[package]] -name = "system-deps" -version = "5.0.0" +name = "sync_wrapper" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e" -dependencies = [ - "cfg-expr 0.9.1", - "heck 0.3.3", - "pkg-config", - "toml 0.5.11", - "version-compare 0.0.11", -] +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] -name = "system-deps" -version = "6.1.1" +name = "synstructure" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30c2de8a4d8f4b823d634affc9cd2a74ec98c53a756f317e529a48046cbf71f3" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ - "cfg-expr 0.15.4", - "heck 0.4.1", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "system-deps" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e" +dependencies = [ + "cfg-expr 0.9.1", + "heck 0.3.3", "pkg-config", - "toml 0.7.6", - "version-compare 0.1.1", + "toml 0.5.11", + "version-compare 0.0.11", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr 0.15.8", + "heck 0.5.0", + "pkg-config", + "toml 0.8.23", + "version-compare 0.2.0", ] [[package]] name = "tao" -version = "0.16.2" +version = "0.16.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6d198e01085564cea63e976ad1566c1ba2c2e4cc79578e35d9f05521505e31" +checksum = "48d298c441a1da46e28e8ad8ec205aab7fd8cd71b9d10e05454224eef422e1ae" dependencies = [ "bitflags 1.3.2", "cairo-rs", @@ -2938,26 +3291,26 @@ dependencies = [ "unicode-segmentation", "uuid", "windows 0.39.0", - "windows-implement", + "windows-implement 0.39.0", "x11-dl", ] [[package]] name = "tao-macros" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec114582505d158b669b136e6851f85840c109819d77c42bb7c0709f727d18c2" +checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.106", ] [[package]] name = "tar" -version = "0.4.40" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" +checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" dependencies = [ "filetime", "libc", @@ -2966,35 +3319,40 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.11" +version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "1.4.1" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fbe522898e35407a8e60dc3870f7579fea2fc262a6a6072eccdd37ae1e1d91e" +checksum = "3ae1f57c291a6ab8e1d2e6b8ad0a35ff769c9925deb8a89de85425ff08762d0c" dependencies = [ "anyhow", "bytes", "cocoa", "dirs-next", + "dunce", "embed_plist", "encoding_rs", "flate2", "futures-util", + "getrandom 0.2.16", "glib", "glob", "gtk", - "heck 0.4.1", + "heck 0.5.0", "http", "ignore", + "indexmap 1.9.3", + "log", "objc", "once_cell", "open", "os_pipe", "percent-encoding", + "plist", "rand 0.8.5", "raw-window-handle", "regex", @@ -3024,28 +3382,30 @@ dependencies = [ [[package]] name = "tauri-build" -version = "1.4.0" +version = "1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d2edd6a259b5591c8efdeb9d5702cb53515b82a6affebd55c7fd6d3a27b7d1b" +checksum = "2db08694eec06f53625cfc6fff3a363e084e5e9a238166d2989996413c346453" dependencies = [ "anyhow", "cargo_toml", - "heck 0.4.1", + "dirs-next", + "heck 0.5.0", "json-patch", "semver", "serde", "serde_json", "tauri-utils", "tauri-winres", + "walkdir", ] [[package]] name = "tauri-codegen" -version = "1.4.0" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54ad2d49fdeab4a08717f5b49a163bdc72efc3b1950b6758245fcde79b645e1a" +checksum = "53438d78c4a037ffe5eafa19e447eea599bedfb10844cb08ec53c2471ac3ac3f" dependencies = [ - "base64 0.21.2", + "base64 0.21.7", "brotli", "ico", "json-patch", @@ -3060,18 +3420,18 @@ dependencies = [ "sha2", "tauri-utils", "thiserror", - "time 0.3.27", + "time 0.3.44", "uuid", "walkdir", ] [[package]] name = "tauri-macros" -version = "1.4.0" +version = "1.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb12a2454e747896929338d93b0642144bb51e0dddbb36e579035731f0d76b7" +checksum = "233988ac08c1ed3fe794cd65528d48d8f7ed4ab3895ca64cdaa6ad4d00c45c0b" dependencies = [ - "heck 0.4.1", + "heck 0.5.0", "proc-macro2", "quote", "syn 1.0.109", @@ -3080,27 +3440,25 @@ dependencies = [ ] [[package]] -name = "tauri-plugin-upload" -version = "0.0.0" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#5b814f56e6368fdec46c4ddb04a07e0923ff995a" +name = "tauri-plugin-window-state" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa47eaa4047a7b51064caff32f0c6282e2c5adc6ceacdd493ecf1b01fa4b0eaa" dependencies = [ - "futures-util", + "bincode", + "bitflags 2.9.4", "log", - "read-progress-stream", - "reqwest", "serde", "serde_json", "tauri", "thiserror", - "tokio", - "tokio-util", ] [[package]] name = "tauri-runtime" -version = "0.14.0" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "108683199cb18f96d2d4134187bb789964143c845d2d154848dda209191fd769" +checksum = "8066855882f00172935e3fa7d945126580c34dcbabab43f5d4f0c2398a67d47b" dependencies = [ "gtk", "http", @@ -3119,9 +3477,9 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "0.14.0" +version = "0.14.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7aa256a1407a3a091b5d843eccc1a5042289baf0a43d1179d9f0fcfea37c1b" +checksum = "ce361fec1e186705371f1c64ae9dd2a3a6768bc530d0a2d5e75a634bb416ad4d" dependencies = [ "cocoa", "gtk", @@ -3139,21 +3497,22 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "1.4.0" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03fc02bb6072bb397e1d473c6f76c953cda48b4a2d0cce605df284aa74a12e84" +checksum = "c357952645e679de02cd35007190fcbce869b93ffc61b029f33fe02648453774" dependencies = [ "brotli", "ctor", "dunce", "glob", - "heck 0.4.1", + "heck 0.5.0", "html5ever", "infer", "json-patch", - "kuchiki", + "kuchikiki", + "log", "memchr", - "phf 0.10.1", + "phf 0.11.3", "proc-macro2", "quote", "semver", @@ -3163,7 +3522,7 @@ dependencies = [ "thiserror", "url", "walkdir", - "windows 0.39.0", + "windows-version", ] [[package]] @@ -3173,20 +3532,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5993dc129e544393574288923d1ec447c857f3f644187f4fbf7d9a875fbfc4fb" dependencies = [ "embed-resource", - "toml 0.7.6", + "toml 0.7.8", ] [[package]] name = "tempfile" -version = "3.8.0" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ - "cfg-if", "fastrand", - "redox_syscall 0.3.5", + "getrandom 0.3.4", + "once_cell", "rustix", - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] @@ -3208,32 +3567,42 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" [[package]] name = "thiserror" -version = "1.0.47" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.47" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.106", ] [[package]] name = "thread_local" -version = "1.1.7" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", - "once_cell", +] + +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", ] [[package]] @@ -3249,12 +3618,14 @@ dependencies = [ [[package]] name = "time" -version = "0.3.27" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb39ee79a6d8de55f48f2293a830e040392f1c5f16e336bdd1788cd0aadce07" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", - "itoa 1.0.9", + "itoa 1.0.15", + "num-conv", + "powerfmt", "serde", "time-core", "time-macros", @@ -3262,48 +3633,56 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.1" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.13" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "733d258752e9303d392b94b75230d07b0b9c489350c69b851fc6c065fde3e8f9" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ + "num-conv", "time-core", ] [[package]] -name = "tinyvec" -version = "1.6.0" +name = "tinystr" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ - "tinyvec_macros", + "displaydoc", + "zerovec", ] -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "tokio" -version = "1.32.0" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", "libc", "mio", - "num_cpus", + "parking_lot", "pin-project-lite", - "socket2 0.5.3", - "windows-sys 0.48.0", + "signal-hook-registry", + "socket2 0.6.1", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", ] [[package]] @@ -3318,16 +3697,15 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.8" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] @@ -3341,51 +3719,82 @@ dependencies = [ [[package]] name = "toml" -version = "0.7.6" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.19.15", +] + +[[package]] +name = "toml" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_edit 0.22.27", ] [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.19.14" +version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.0.0", + "indexmap 2.11.4", "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.5.40", ] +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap 2.11.4", + "serde", + "serde_spanned", + "toml_datetime", + "toml_write", + "winnow 0.7.13", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ - "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -3393,20 +3802,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.26" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.106", ] [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", "valuable", @@ -3414,25 +3823,25 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ - "lazy_static", "log", + "once_cell", "tracing-core", ] [[package]] name = "tracing-subscriber" -version = "0.3.17" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "regex", + "regex-automata", "sharded-slab", "smallvec", "thread_local", @@ -3441,59 +3850,35 @@ dependencies = [ "tracing-log", ] -[[package]] -name = "treediff" -version = "4.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52984d277bdf2a751072b5df30ec0377febdb02f7696d64c2d7d54630bac4303" -dependencies = [ - "serde_json", -] - [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" - -[[package]] -name = "unicode-bidi" -version = "0.3.13" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" - -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "unicode-segmentation" -version = "1.10.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "url" -version = "2.4.0" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", @@ -3507,20 +3892,28 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "uuid" -version = "1.4.1" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ - "getrandom 0.2.10", + "getrandom 0.3.4", + "js-sys", + "wasm-bindgen", ] [[package]] name = "valuable" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "vcpkg" @@ -3536,15 +3929,15 @@ checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" [[package]] name = "version-compare" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vswhom" @@ -3558,9 +3951,9 @@ dependencies = [ [[package]] name = "vswhom-sys" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3b17ae1f6c8a2b28506cd96d412eebf83b4a0ff2cbefeeb952f2f9dfa44ba18" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" dependencies = [ "cc", "libc", @@ -3568,9 +3961,9 @@ dependencies = [ [[package]] name = "walkdir" -version = "2.3.3" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", @@ -3599,52 +3992,64 @@ checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", + "once_cell", + "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.106", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.37" +version = "0.4.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3652,28 +4057,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.106", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasm-streams" -version = "0.3.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" dependencies = [ "futures-util", "js-sys", @@ -3684,9 +4092,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" dependencies = [ "js-sys", "wasm-bindgen", @@ -3736,7 +4144,7 @@ dependencies = [ "pango-sys", "pkg-config", "soup2-sys", - "system-deps 6.1.1", + "system-deps 6.2.2", ] [[package]] @@ -3748,7 +4156,7 @@ dependencies = [ "webview2-com-macros", "webview2-com-sys", "windows 0.39.0", - "windows-implement", + "windows-implement 0.39.0", ] [[package]] @@ -3777,6 +4185,12 @@ dependencies = [ "windows-metadata", ] +[[package]] +name = "weezl" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" + [[package]] name = "winapi" version = "0.3.9" @@ -3795,11 +4209,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "winapi", + "windows-sys 0.61.2", ] [[package]] @@ -3840,7 +4254,7 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" dependencies = [ - "windows-implement", + "windows-implement 0.39.0", "windows_aarch64_msvc 0.39.0", "windows_i686_gnu 0.39.0", "windows_i686_msvc 0.39.0", @@ -3854,7 +4268,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -3867,6 +4281,19 @@ dependencies = [ "windows-tokens", ] +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement 0.60.2", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + [[package]] name = "windows-implement" version = "0.39.0" @@ -3877,12 +4304,58 @@ dependencies = [ "windows-tokens", ] +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-metadata" version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.42.0" @@ -3904,7 +4377,43 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", ] [[package]] @@ -3922,12 +4431,54 @@ dependencies = [ "windows_x86_64_msvc 0.48.5", ] +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + [[package]] name = "windows-tokens" version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597" +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -3940,6 +4491,18 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + [[package]] name = "windows_aarch64_msvc" version = "0.33.0" @@ -3970,6 +4533,18 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + [[package]] name = "windows_i686_gnu" version = "0.33.0" @@ -4000,6 +4575,30 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + [[package]] name = "windows_i686_msvc" version = "0.33.0" @@ -4030,6 +4629,18 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + [[package]] name = "windows_x86_64_gnu" version = "0.33.0" @@ -4060,6 +4671,18 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -4072,6 +4695,18 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + [[package]] name = "windows_x86_64_msvc" version = "0.33.0" @@ -4102,23 +4737,34 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + [[package]] name = "winnow" -version = "0.5.15" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" dependencies = [ "memchr", ] [[package]] -name = "winreg" -version = "0.11.0" +name = "winnow" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a1a57ff50e9b408431e8f97d5456f2807f8eb2a2cd79b06068fc87f8ecf189" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" dependencies = [ - "cfg-if", - "winapi", + "memchr", ] [[package]] @@ -4131,11 +4777,43 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "winreg" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" +dependencies = [ + "cfg-if", + "windows-sys 0.59.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + [[package]] name = "wry" -version = "0.24.3" +version = "0.24.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33748f35413c8a98d45f7a08832d848c0c5915501803d1faade5a4ebcd258cea" +checksum = "c55c80b12287eb1ff7c365fc2f7a5037cb6181bd44c9fce81c8d1cf7605ffad6" dependencies = [ "base64 0.13.1", "block", @@ -4149,7 +4827,7 @@ dependencies = [ "gtk", "html5ever", "http", - "kuchiki", + "kuchikiki", "libc", "log", "objc", @@ -4166,7 +4844,7 @@ dependencies = [ "webkit2gtk-sys", "webview2-com", "windows 0.39.0", - "windows-implement", + "windows-implement 0.39.0", ] [[package]] @@ -4192,11 +4870,110 @@ dependencies = [ [[package]] name = "xattr" -version = "1.0.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4686009f71ff3e5c4dbcf1a282d0a44db3f021ba69350cd42086b3e5f1c6985" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" dependencies = [ "libc", + "rustix", +] + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", ] [[package]] @@ -4212,3 +4989,12 @@ dependencies = [ "thiserror", "time 0.1.45", ] + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index ade706a..6f4a4e3 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -14,13 +14,16 @@ tauri-build = { version = "1.4", features = [] } [dependencies] tauri = { version = "1.4", features = [ "shell-all", "http-all", "path-all", "dialog-all", "fs-all"] } +tauri-plugin-window-state = "0.1" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" zip = "0.5" -tauri-plugin-upload = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" } -tokio = "*" +tokio = { version = "1", features = ["full"] } regex = "*" winreg = "*" +reqwest = { version = "0.11", features = ["stream"] } +futures-util = "0.3" +image = "0.24" [dependencies.windows] version = "0.33.0" diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 235ff3f..adeb661 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -9,16 +9,18 @@ use std::io::{BufReader, BufRead}; use winreg::{RegKey, enums::*}; use regex::Regex; -use std::ffi::OsStr; -use std::iter::once; -use std::os::windows::ffi::OsStrExt; - -use std::{env, error::Error, path::Path, path::PathBuf, ptr::null_mut, slice}; +use std::{env, error::Error, path::Path, path::PathBuf, ptr::null_mut}; use windows::{ core, Win32::Storage::FileSystem::{GetFileVersionInfoSizeW, GetFileVersionInfoW, VerQueryValueW, VS_FIXEDFILEINFO}, }; +use tokio::io::AsyncWriteExt; +use futures_util::StreamExt; +use std::collections::hash_map::DefaultHasher; +use std::hash::{Hash, Hasher}; +use image::ImageFormat; + const SOTF_APP_ID: &str = "1326470"; #[tauri::command] @@ -150,7 +152,7 @@ fn unzip_file(source: &str, destination: &str) -> Result<(), String> { for i in 0..archive.len() { let mut file = archive.by_index(i).map_err(|e| e.to_string())?; - let outpath = file.sanitized_name(); + let outpath = file.mangled_name(); let outpath = format!("{}/{}", destination, outpath.to_str().ok_or("Invalid path")?); if file.is_dir() { @@ -174,6 +176,336 @@ fn unzip_file(source: &str, destination: &str) -> Result<(), String> { Ok(()) } +#[tauri::command] +async fn get_cached_image( + url: String, + app_handle: tauri::AppHandle, +) -> Result { + println!("get_cached_image: Processing URL: {}", url); + + // Create hash from URL for filename + let mut hasher = DefaultHasher::new(); + url.hash(&mut hasher); + let hash = hasher.finish(); + + // Get cache directory + let cache_dir = app_handle.path_resolver() + .app_cache_dir() + .ok_or("Could not get cache directory")?; + + let cache_dir = cache_dir.join("images"); + if !cache_dir.exists() { + std::fs::create_dir_all(&cache_dir).map_err(|e| e.to_string())?; + } + + println!("get_cached_image: Cache directory: {:?}", cache_dir); + + // Determine file extension from URL + let extension = if url.contains(".png") { "png" } + else if url.contains(".jpg") || url.contains(".jpeg") { "jpg" } + else if url.contains(".gif") { "gif" } + else if url.contains(".webp") { "webp" } + else { "jpg" }; // default + + let cached_file = cache_dir.join(format!("{}.{}", hash, extension)); + + // If file exists, return the path + if cached_file.exists() { + println!("get_cached_image: Found cached file: {:?}", cached_file); + return Ok(cached_file.to_string_lossy().to_string()); + } + + println!("get_cached_image: Downloading image from: {}", url); + + // Download and cache the image + let client = reqwest::Client::new(); + match client.get(&url).send().await { + Ok(response) => { + println!("get_cached_image: HTTP response status: {}", response.status()); + match response.bytes().await { + Ok(bytes) => { + println!("get_cached_image: Downloaded {} bytes", bytes.len()); + match tokio::fs::File::create(&cached_file).await { + Ok(mut file) => { + match file.write_all(&bytes).await { + Ok(_) => { + match file.flush().await { + Ok(_) => { + println!("get_cached_image: Successfully cached to: {:?}", cached_file); + Ok(cached_file.to_string_lossy().to_string()) + } + Err(e) => Err(format!("Failed to flush file: {}", e)) + } + } + Err(e) => Err(format!("Failed to write to file: {}", e)) + } + } + Err(e) => Err(format!("Failed to create file: {}", e)) + } + } + Err(e) => Err(format!("Failed to read response bytes: {}", e)) + } + } + Err(e) => Err(format!("Failed to download image: {}", e)) + } +} + +#[tauri::command] +async fn get_cached_image_data( + url: String, + app_handle: tauri::AppHandle, +) -> Result, String> { + // Create hash from URL for filename + let mut hasher = DefaultHasher::new(); + url.hash(&mut hasher); + let hash = hasher.finish(); + + // Get cache directory + let cache_dir = app_handle.path_resolver() + .app_cache_dir() + .ok_or("Could not get cache directory")?; + + let cache_dir = cache_dir.join("images"); + if !cache_dir.exists() { + std::fs::create_dir_all(&cache_dir).map_err(|e| e.to_string())?; + } + + // Use webp for optimized cached files + let cached_file = cache_dir.join(format!("{}_optimized.webp", hash)); + let metadata_file = cache_dir.join(format!("{}_metadata.txt", hash)); + + // Check if cached file exists and validate against server + if cached_file.exists() { + if let Ok(metadata) = std::fs::metadata(&cached_file) { + if let Ok(modified) = metadata.modified() { + let age = std::time::SystemTime::now() + .duration_since(modified) + .unwrap_or(std::time::Duration::from_secs(0)); + + // If file is less than 1 hour old, always use cache (no server check) + if age.as_secs() < 60 * 60 { + return std::fs::read(&cached_file).map_err(|e| e.to_string()); + } + + // For files 1-24 hours old, try server check but fallback gracefully + if age.as_secs() < 24 * 60 * 60 { + match check_server_file_changed(&url, &metadata_file).await { + Ok(false) => { + return std::fs::read(&cached_file).map_err(|e| e.to_string()); + } + Ok(true) => { + // Server file changed, updating cache + } + Err(_) => { + // Server check failed, but file is recent enough - use cache + return std::fs::read(&cached_file).map_err(|e| e.to_string()); + } + } + } else { + // File is older than 24 hours, force refresh + println!("♻️ Cache expired (age: {} hours), refreshing...", age.as_secs() / 3600); + } + } + } + } + + println!("⬇️ Downloading new image..."); + + // Download and cache the image + let client = reqwest::Client::builder() + .timeout(std::time::Duration::from_secs(10)) // 10 second timeout + .build() + .map_err(|e| format!("Failed to create HTTP client: {}", e))?; + + match client.get(&url).send().await { + Ok(response) => { + if !response.status().is_success() { + return Err(format!("HTTP error: {}", response.status())); + } + + // Store server metadata for future comparisons + if let Some(etag) = response.headers().get("etag") { + if let Ok(etag_str) = etag.to_str() { + let _ = std::fs::write(&metadata_file, format!("etag:{}", etag_str)); + } + } else if let Some(last_modified) = response.headers().get("last-modified") { + if let Ok(last_modified_str) = last_modified.to_str() { + let _ = std::fs::write(&metadata_file, format!("last-modified:{}", last_modified_str)); + } + } else { + // Store current timestamp as fallback + let timestamp = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap().as_secs(); + let _ = std::fs::write(&metadata_file, format!("timestamp:{}", timestamp)); + } + + match response.bytes().await { + Ok(bytes) => { + println!("📦 Downloaded {} KB", bytes.len() / 1024); + + // Process and optimize the image + match optimize_image(&bytes) { + Ok(optimized_bytes) => { + let reduction = if bytes.len() > 0 { + 100u64.saturating_sub((optimized_bytes.len() as u64 * 100) / bytes.len() as u64) + } else { + 0 + }; + println!("✨ Optimized to {} KB ({}% smaller)", + optimized_bytes.len() / 1024, reduction); + + // Save optimized version to cache + match std::fs::write(&cached_file, &optimized_bytes) { + Ok(_) => { + println!("💾 Cached successfully!"); + Ok(optimized_bytes) + } + Err(e) => { + println!("⚠️ Cache write failed: {}", e); + Ok(optimized_bytes) + } + } + } + Err(e) => { + println!("⚠️ Optimization failed, using original: {}", e); + // Fallback to original bytes if optimization fails + Ok(bytes.to_vec()) + } + } + } + Err(e) => Err(format!("Failed to read response bytes: {}", e)) + } + } + Err(e) => Err(format!("Failed to download image: {}", e)) + } +} + +// Helper function to optimize images +fn optimize_image(bytes: &[u8]) -> Result, String> { + // Load image from bytes + let img = image::load_from_memory(bytes) + .map_err(|e| format!("Failed to decode image: {}", e))?; + + // Resize to maximum 300x200 for faster loading and lower memory usage + // This matches the 140px height we set in CSS + let resized = img.thumbnail(300, 200); + + // Convert to WebP for better compression + let mut output = Vec::new(); + resized.write_to(&mut std::io::Cursor::new(&mut output), ImageFormat::WebP) + .map_err(|e| format!("Failed to encode image as WebP: {}", e))?; + + Ok(output) +} + +// Helper function to check if server file has changed +async fn check_server_file_changed(url: &str, metadata_file: &std::path::Path) -> Result { + // Read stored metadata if it exists + let stored_metadata = match std::fs::read_to_string(metadata_file) { + Ok(content) => content, + Err(_) => return Ok(true), // No metadata means we should download + }; + + // Create HTTP client with short timeout for HEAD request + let client = reqwest::Client::builder() + .timeout(std::time::Duration::from_secs(3)) // Shorter timeout + .build() + .map_err(|e| format!("Failed to create HTTP client: {}", e))?; + + // Make HEAD request to check server metadata + let response = match client.head(url).send().await { + Ok(resp) if resp.status().is_success() => resp, + _ => { + // HEAD failed silently, assume no change to avoid spam + return Ok(false); + } + }; + + // Check ETag first (most reliable) + if stored_metadata.starts_with("etag:") { + let stored_etag = &stored_metadata[5..]; + if let Some(server_etag) = response.headers().get("etag") { + if let Ok(server_etag_str) = server_etag.to_str() { + return Ok(stored_etag != server_etag_str); + } + } + } + + // Check Last-Modified header + if stored_metadata.starts_with("last-modified:") { + let stored_last_modified = &stored_metadata[14..]; + if let Some(server_last_modified) = response.headers().get("last-modified") { + if let Ok(server_last_modified_str) = server_last_modified.to_str() { + return Ok(stored_last_modified != server_last_modified_str); + } + } + } + + // If we have timestamp-based metadata, assume no change + Ok(false) +} + +#[tauri::command] +async fn clear_image_cache(app_handle: tauri::AppHandle) -> Result { + let cache_dir = app_handle.path_resolver() + .app_cache_dir() + .ok_or("Could not get cache directory")? + .join("images"); + + if cache_dir.exists() { + match std::fs::remove_dir_all(&cache_dir) { + Ok(_) => { + // Recreate the directory + std::fs::create_dir_all(&cache_dir).map_err(|e| e.to_string())?; + Ok("Cache cleared".to_string()) + } + Err(e) => Err(format!("Failed to clear cache: {}", e)) + } + } else { + Ok("Cache directory doesn't exist".to_string()) + } +} + +#[tauri::command] +async fn download_with_progress( + url: String, + file_path: String, + window: tauri::Window, +) -> Result<(), String> { + let client = reqwest::Client::new(); + let response = client.get(&url).send().await.map_err(|e| e.to_string())?; + + let total_size = response.content_length().unwrap_or(0); + + // Create the file + let mut file = tokio::fs::File::create(&file_path).await.map_err(|e| e.to_string())?; + let mut downloaded = 0u64; + let mut stream = response.bytes_stream(); + + while let Some(chunk) = stream.next().await { + let chunk = chunk.map_err(|e| e.to_string())?; + file.write_all(&chunk).await.map_err(|e| e.to_string())?; + + downloaded += chunk.len() as u64; + let progress = if total_size > 0 { + (downloaded as f64 / total_size as f64 * 100.0) as u32 + } else { + 0 + }; + + // Emit progress event + let _ = window.emit("download-progress", serde_json::json!({ + "downloaded": downloaded, + "total": total_size, + "progress": progress + })); + } + + file.flush().await.map_err(|e| e.to_string())?; + Ok(()) +} + #[tauri::command] fn unzip_handler(source: String, destination: String) -> Result<(), String> { unzip_file(&source, &destination) @@ -181,8 +513,8 @@ fn unzip_handler(source: String, destination: String) -> Result<(), String> { fn main() { tauri::Builder::default() - .invoke_handler(tauri::generate_handler![unzip_handler, get_steam_path, is_dotnet6_installed, get_file_version]) - .plugin(tauri_plugin_upload::init()) + .plugin(tauri_plugin_window_state::Builder::default().build()) + .invoke_handler(tauri::generate_handler![get_cached_image, get_cached_image_data, clear_image_cache, download_with_progress, unzip_handler, get_steam_path, is_dotnet6_installed, get_file_version]) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 60d3e7d..00cdee6 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -40,7 +40,7 @@ }, "fs": { "all": true, - "scope": ["**"] + "scope": ["**", "$CACHE/**"] }, "dialog": { "all": true @@ -50,7 +50,13 @@ }, "http": { "all": true, - "scope": ["https://github.com/*"] + "scope": [ + "https://github.com/*", + "https://api.sotf-mods.com/*", + "https://sotf-mods.com/*", + "https://files.sotf-mods.com/*", + "https://placehold.co/*" + ] } }, "bundle": { @@ -70,8 +76,16 @@ "fullscreen": false, "resizable": true, "title": "RedModManager", - "width": 800, - "height": 650 + "width": 1400, + "height": 900, + "minWidth": 600, + "minHeight": 400, + "decorations": true, + "skipTaskbar": false, + "alwaysOnTop": false, + "center": true, + "x": null, + "y": null } ] } diff --git a/src/App.svelte b/src/App.svelte index 4b40ef6..4e0b2fc 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -37,11 +37,11 @@ let activeTabComponent = tabs[0].component; - function selectTab(tabComponent) { + function selectTab(tabComponent: any) { activeTabComponent = tabComponent; } - function handleKeyPress(event: KeyboardEvent, tabComponent) { + function handleKeyPress(event: KeyboardEvent, tabComponent: any) { if (event.key === "Enter" || event.key === " ") { selectTab(tabComponent); } diff --git a/src/lib/CacheDebugPanel.svelte b/src/lib/CacheDebugPanel.svelte new file mode 100644 index 0000000..505ebf8 --- /dev/null +++ b/src/lib/CacheDebugPanel.svelte @@ -0,0 +1,190 @@ + + + + + + + +{#if isVisible} +
+
+

Image Cache Debug

+ +
+ +
+

Memory Cache:

+

Entries: {cacheInfo.entries}

+

Size: {(cacheInfo.size / 1024 / 1024).toFixed(2)} MB

+
+ +
+ + + +
+ +
+

Server Change Detection: ✅ Active

+

Fallback: 24h time-based

+

Cache Location: AppData/Local

+
+
+{/if} + + \ No newline at end of file diff --git a/src/lib/ModCard.svelte b/src/lib/ModCard.svelte index bf2982b..acc070b 100644 --- a/src/lib/ModCard.svelte +++ b/src/lib/ModCard.svelte @@ -6,17 +6,31 @@ import { ModDatabase, type Mod, type InstalledMod } from './mods'; import StatusButton from './StatusButton.svelte'; import { downloadAndInstall } from './utils'; + import ImageCache from './imageCache'; export let mod: Mod; export let isGrid: boolean = false; let isLibrary = false; let isImageLoaded = false; + let cachedImageUrl = ''; const dispatch = createEventDispatcher(); onMount(async () => { isLibrary = mod.type == "Library"; + + // Load cached image + if (mod.imageUrl) { + try { + cachedImageUrl = await ImageCache.getCachedImageUrl(mod.imageUrl); + } catch (error) { + // Use fallback image + cachedImageUrl = "https://placehold.co/300x200/252525/FFF?text=No+Image"; + } + } else { + cachedImageUrl = "https://placehold.co/300x200/252525/FFF?text=No+Image"; + } }); async function update() { @@ -102,70 +116,96 @@ } -
- {mod.name} ( ModDatabase.openModPage(mod)} class="site-link">view on site) - {mod.shortDescription?mod.shortDescription:""} -
- -
- Loading... - - Mod cover... +
+
+
+ {mod.name} +
-
- {#if mod.isInstalled && !isLibrary && !isGrid} - {#if mod.installedMod?.isEnabled} - - {:else} - - {/if} - {/if} - Author: {mod.user.name} - Version: {mod.latestVersion} - Updated: {mod.lastReleasedAt?formatDate(mod.lastReleasedAt):"-"} - Category: {mod.category?mod.category.name:"-"} + {mod.shortDescription?mod.shortDescription:""} +
+ +
+ + + Mod cover for {mod.name} ModDatabase.openModPage(mod)} + title="Click to view on site" + /> +
+
+ Author: {mod.user.name} + Version: {mod.latestVersion} + Updated: {mod.lastReleasedAt?formatDate(mod.lastReleasedAt):"-"} + Category: {mod.category?mod.category.name:"-"} + + +
+ {#if mod.isInstalled && !isLibrary} + + {:else} + {mod.isInstalled ? 'Installed' : ''} + {/if} +
+
-
- - {#if mod.isInstalled && !isLibrary && isGrid} - {#if mod.installedMod?.isEnabled} - - {:else} - - {/if} - {/if} -
- + +
+ +
\ No newline at end of file diff --git a/src/lib/StatusButton.svelte b/src/lib/StatusButton.svelte index 633f86d..6a5f648 100644 --- a/src/lib/StatusButton.svelte +++ b/src/lib/StatusButton.svelte @@ -26,6 +26,10 @@ display: flex; flex-direction: row; align-items: center; + width: 100%; /* Full width */ + max-width: none; /* No restrictions */ + margin: 0; /* No auto margins */ + box-sizing: border-box; } .horizontal > * { @@ -34,7 +38,46 @@ } .button-wrapper { - width: 100%; - flex: 1; + width: 100%; /* Full width of container */ + max-width: none; /* Remove width restrictions */ + margin: 0; /* No auto margins needed */ + display: block; + box-sizing: border-box; + } + + .install { + color: #a0a0a0 !important; /* More gray text */ + background-color: #0f1e2e !important; /* Darker blue background */ + border: 1px solid rgba(252,252,252,0.1) !important; /* Restore gray border */ + } + + .install:hover { + color: #a0a0a0 !important; /* Keep gray text on hover */ + background-color: #1a365d !important; /* Slightly lighter blue on hover */ + border: 1px solid rgba(252,252,252,0.1) !important; /* Keep gray border */ + } + + .uninstall { + color: #a0a0a0 !important; /* More gray text */ + background-color: #2d0a0a !important; /* Darker red background */ + border: 1px solid rgba(252,252,252,0.1) !important; /* Restore gray border */ + } + + .uninstall:hover { + color: #a0a0a0 !important; /* Keep gray text on hover */ + background-color: #4a1515 !important; /* Slightly lighter red on hover */ + border: 1px solid rgba(252,252,252,0.1) !important; /* Keep gray border */ + } + + .update { + color: #a0a0a0 !important; /* More gray text */ + background-color: #0f1e2e !important; /* Same blue as Install button */ + border: 1px solid rgba(252,252,252,0.1) !important; /* Gray border */ + } + + .update:hover { + color: #a0a0a0 !important; /* Keep gray text on hover */ + background-color: #1a365d !important; /* Same hover blue as Install button */ + border: 1px solid rgba(252,252,252,0.1) !important; /* Keep gray border */ } \ No newline at end of file diff --git a/src/lib/baseWebInstaller.ts b/src/lib/baseWebInstaller.ts index 1516f4f..5ec0531 100644 --- a/src/lib/baseWebInstaller.ts +++ b/src/lib/baseWebInstaller.ts @@ -2,9 +2,9 @@ import { BaseZipInstaller } from "./baseZipInstaller"; import { redLoaderInfo } from "./githubInfo"; import { getDirectoryPath, gameExePath, processName, processProgress } from "./store" import { get } from 'svelte/store' -import { fs, http } from "@tauri-apps/api"; -import { TempFileCache } from "./TempFileCache"; -import { download } from "tauri-plugin-upload-api"; +import { invoke } from '@tauri-apps/api/tauri'; +import { listen } from '@tauri-apps/api/event'; +import { TempFileCache } from "./tempFileCache"; export abstract class BaseWebInstaller extends BaseZipInstaller { @@ -21,7 +21,9 @@ export abstract class BaseWebInstaller extends BaseZipInstaller { const exeDir = await getDirectoryPath(); const selectedVersion = await redLoaderInfo.getLatest(); - await this.newInstall(exeDir, selectedVersion); + if (selectedVersion) { + await this.newInstall(exeDir, selectedVersion); + } } protected abstract getDownloadUrl(version: string): Promise; @@ -43,26 +45,20 @@ export abstract class BaseWebInstaller extends BaseZipInstaller { console.log(`Downloading ${downloadUrl} to ${tempPath}`); try { - let downloadProgress = 0; - - await download( - downloadUrl, - tempPath, - (progress, total) => { - downloadProgress += progress; - processProgress.set(downloadProgress / total * 100); - } - ); - - // let client = await http.getClient(); - // const response = await client.get(downloadUrl, { - // timeout: 30, - // responseType: http.ResponseType.Binary, - // }); - - // const binaryData = response.data; - - // await fs.writeBinaryFile(tempPath, binaryData); + // Set up progress listener + const unlisten = await listen('download-progress', (event) => { + const { progress } = event.payload as { progress: number }; + processProgress.set(progress); + }); + + // Start the download + await invoke('download_with_progress', { + url: downloadUrl, + filePath: tempPath + }); + + // Clean up listener + unlisten(); } catch (error) { console.log(error); return; diff --git a/src/lib/imageCache.ts b/src/lib/imageCache.ts new file mode 100644 index 0000000..50bec83 --- /dev/null +++ b/src/lib/imageCache.ts @@ -0,0 +1,118 @@ +import { invoke } from '@tauri-apps/api/tauri'; + +class ImageCache { + private static cache = new Map(); + private static loadingPromises = new Map>(); + + public static async getCachedImageUrl(url: string): Promise { + // Check memory cache first + if (this.cache.has(url)) { + return this.cache.get(url)!; + } + + // Check if we're already loading this URL + if (this.loadingPromises.has(url)) { + return this.loadingPromises.get(url)!; + } + + // Create loading promise + const loadingPromise = this.loadImageData(url); + this.loadingPromises.set(url, loadingPromise); + + try { + const result = await loadingPromise; + this.loadingPromises.delete(url); + return result; + } catch (error) { + this.loadingPromises.delete(url); + throw error; + } + } + + private static getShortUrl(url: string): string { + return url.split('/').pop()?.replace('_thumbnail.png', '') || url; + } + + private static async loadImageData(url: string): Promise { + try { + // Get cached image data as bytes from Rust backend + const imageBytes = await invoke('get_cached_image_data', { url }); + + // Convert to Uint8Array + const uint8Array = new Uint8Array(imageBytes); + + // Use FileReader API for proper base64 conversion + const blob = new Blob([uint8Array]); + + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = () => { + const dataUrl = reader.result as string; + + // Store in memory cache + this.cache.set(url, dataUrl); + resolve(dataUrl); + }; + reader.onerror = () => { + reject(new Error('Failed to convert to data URL')); + }; + + // Use readAsDataURL for automatic MIME type detection and base64 encoding + reader.readAsDataURL(blob); + }); + + } catch (error) { + console.error('ImageCache: Failed to process image:', error); + + // Don't cache error placeholders - let them retry next time + throw error; // This will show the placeholder in the UI but allow retry + } + } + + public static clearMemoryCache(): void { + this.cache.clear(); + } + + // Add method to clear both memory and disk cache + public static async clearAllCache(): Promise { + this.cache.clear(); + this.loadingPromises.clear(); + + try { + const result = await invoke('clear_image_cache'); + } catch (error) { + console.error('ImageCache: Failed to clear disk cache:', error); + } + } + + // Add method to get cache size for debugging + public static getCacheInfo(): { size: number, entries: number } { + let totalSize = 0; + for (const [url, dataUrl] of this.cache.entries()) { + totalSize += dataUrl.length; + } + return { size: totalSize, entries: this.cache.size }; + } + + // Add method to force refresh a specific image + public static async forceRefresh(url: string): Promise { + // Remove from both caches + this.cache.delete(url); + this.loadingPromises.delete(url); + + // Get fresh copy + return this.getCachedImageUrl(url); + } + + // Add method to preload images for better performance + public static async preloadImages(urls: string[]): Promise { + const promises = urls.slice(0, 10).map(url => + this.getCachedImageUrl(url).catch(error => { + // Ignore individual failures during preload + }) + ); + await Promise.all(promises); + } +} + +export default ImageCache; \ No newline at end of file diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 7ae8127..68b40ab 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -3,7 +3,7 @@ import { exists } from '@tauri-apps/api/fs'; import { dialog } from '@tauri-apps/api'; import { processName, processProgress } from './store'; import { TempFileCache } from './tempFileCache'; -import { download } from 'tauri-plugin-upload-api'; +import { listen } from '@tauri-apps/api/event'; export async function unzip(sourcePath: string, destinationPath: string) { try { @@ -29,17 +29,20 @@ export async function downloadAndInstall(destination: string, downloadUrl: strin console.log(`Downloading ${downloadUrl} to ${tempPath}`); try { - let downloadProgress = 0; - - await download( - downloadUrl, - tempPath, - (progress, total) => { - downloadProgress += progress; - processProgress.set(downloadProgress / total * 100); - } - ); + // Set up progress listener + const unlisten = await listen('download-progress', (event) => { + const { progress } = event.payload as { progress: number }; + processProgress.set(progress); + }); + // Start the download + await invoke('download_with_progress', { + url: downloadUrl, + filePath: tempPath + }); + + // Clean up listener + unlisten(); } catch (error) { console.log(error); return; diff --git a/src/main.ts b/src/main.ts index f3b9d05..b3929b2 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2,7 +2,7 @@ import "./styles.css"; import App from "./App.svelte"; const app = new App({ - target: document.getElementById("app"), + target: document.getElementById("app")!, }); export default app; diff --git a/src/pages/MainPage.svelte b/src/pages/MainPage.svelte index bf9dd98..4ac1de5 100644 --- a/src/pages/MainPage.svelte +++ b/src/pages/MainPage.svelte @@ -5,6 +5,7 @@ import { debugInstaller, loaderFeature, bieFeature, melonFeature } from "../lib/featureInstaller"; import { gameExePath, isPathValid, isDotnetInstalled, getDirectoryPath } from "../lib/store"; import { get } from "svelte/store"; + import ImageCache from "../lib/imageCache"; import redLogo from "/redlogo.png"; let features = [bieFeature, melonFeature, loaderFeature]; @@ -16,6 +17,15 @@ async function startGame() { await shell.open("steam://rungameid/1326470"); } + + async function clearImageCache() { + try { + await ImageCache.clearAllCache(); + // Cache cleared silently + } catch (error) { + console.error('Failed to clear image cache:', error); + } + }
@@ -26,6 +36,7 @@ {#each features as feature} {/each} + {/if}

@@ -48,4 +59,16 @@ /* transition: background-color 0.25s; */ /* color: #646cff; */ } + + .cache-button { + background-color: #2a2a2a; + color: #24c8db; + border: 1px solid #24c8db; + transition: background-color 0.25s, border-color 0.25s; + } + + .cache-button:hover { + background-color: #24c8db; + color: #1e1e1e; + } diff --git a/src/pages/Mods.svelte b/src/pages/Mods.svelte index 0f83277..52040ed 100644 --- a/src/pages/Mods.svelte +++ b/src/pages/Mods.svelte @@ -11,6 +11,7 @@ import InfiniteScroll from "../lib/InfiniteScroll.svelte"; import { debounce } from "lodash"; import SvgSpinnersBlocksWave from '~icons/svg-spinners/blocks-wave' + import ImageCache from "../lib/imageCache"; let filtered: Mod[] = []; let filterTerm: string = ""; @@ -55,8 +56,20 @@ await ModDatabase.initDatabase(); await fetchData(); + // Preload images for the first visible mods for faster display + if (filtered.length > 0) { + const imageUrls = filtered.slice(0, 10) + .map(mod => mod.imageUrl) + .filter(url => url && url.trim() !== ''); + + if (imageUrls.length > 0) { + ImageCache.preloadImages(imageUrls).catch(error => + console.warn('Failed to preload images:', error) + ); + } + } - isGrid = window.innerWidth > 1000; + isGrid = window.innerWidth > 720; /* Match 320px minimum + 2x48px padding + 320px for second card */ }); // async function filter() { @@ -120,32 +133,33 @@ async function refreshMods() { await ModDatabase.loadInstalledMods(); - if (onlineSelected) { - await toggleOnline(); - return; - } - - await toggleInstalled(); + // Update the installation status for all mods in the current list + await ModDatabase.initModList(filtered); + + // Trigger reactivity by reassigning the filtered array + filtered = [...filtered]; } - isGrid = window.innerWidth > 1000} /> -
+ isGrid = window.innerWidth > 720} /> +
{#if isPathValid} -
+
- - +
+ + +
- {#each filtered as mod} + {#each filtered as mod (mod.mod_id)} {/each} {#if isLoading} - + {/if} \ No newline at end of file From dc2e45b14846753adbd6a0e20659032976866908 Mon Sep 17 00:00:00 2001 From: Za-Pa-Al <235132485+Za-Pa-Al@users.noreply.github.com> Date: Fri, 17 Oct 2025 11:51:38 +0200 Subject: [PATCH 02/13] New Version. Tried circumventing .NET conflicts. --- README.md | 5 ++++- package-lock.json | 41 +++++++++++++-------------------------- package.json | 2 +- src-tauri/src/main.rs | 7 +++++++ src-tauri/tauri.conf.json | 2 +- 5 files changed, 26 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index c04b59d..e4c83b4 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,10 @@ The RedManager is a general tool for installing/uninstalling/updating different **:arrow_forward:[Original RedManager from ToniMacaroni](https://github.com/ToniMacaroni/RedManager):arrow_backward:** # Installation -Download and execute RedModManager.exe. There are likely problems (crashing) if you execute it in the folder of file SonsOfTheForest.exe and folder _Redloader. Place it somewhere else. Might require .NET 6 Installation in that case. +Download RedModManager.exe and place the .exe in a folder OTHER then directly in "Sons Of The Forest\". +If placed next to file "Sons Of The Forest\SonsOfTheForest.exe" and subsequently next to folder "Sons Of The Forest\_Redloader", the .dlls in "Sons Of The Forest\_Redloader\" will likely cause a startup crash due to .NET conflicts. + +For example you can safely place RedModManager.exe in "Sons Of The Forest\RedModManager\". # Summary of Changes diff --git a/package-lock.json b/package-lock.json index d3fefee..477dbfd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,17 @@ { - "name": "RedModManager", - "version": "1.1.9", + "name": "red-mod-manager", + "version": "1.2.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "RedModManager", - "version": "1.1.9", + "name": "red-mod-manager", + "version": "1.2.0", "dependencies": { "@tauri-apps/api": "^1.4.0", "@types/lodash": "^4.17.15", "lodash": "^4.17.21", - "semver": "^7.5.4", - "tauri-plugin-upload-api": "github:tauri-apps/tauri-plugin-upload#v1" + "semver": "^7.5.4" }, "devDependencies": { "@iconify/json": "^2.2.302", @@ -1902,14 +1901,6 @@ "node": ">=12" } }, - "node_modules/tauri-plugin-upload-api": { - "version": "0.0.0", - "resolved": "git+ssh://git@github.com/tauri-apps/tauri-plugin-upload.git#b53ebc6c2e716d95fd94b64d3b4b87cd57ae4feb", - "license": "MIT or APACHE-2.0", - "dependencies": { - "@tauri-apps/api": "1.4.0" - } - }, "node_modules/tinyexec": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", @@ -2070,12 +2061,13 @@ } }, "node_modules/vitefu": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", - "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", + "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", "dev": true, + "license": "MIT", "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" }, "peerDependenciesMeta": { "vite": { @@ -3285,13 +3277,6 @@ } } }, - "tauri-plugin-upload-api": { - "version": "git+ssh://git@github.com/tauri-apps/tauri-plugin-upload.git#b53ebc6c2e716d95fd94b64d3b4b87cd57ae4feb", - "from": "tauri-plugin-upload-api@github:tauri-apps/tauri-plugin-upload#v1", - "requires": { - "@tauri-apps/api": "1.4.0" - } - }, "tinyexec": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", @@ -3363,9 +3348,9 @@ } }, "vitefu": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", - "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", + "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", "dev": true, "requires": {} }, diff --git a/package.json b/package.json index 9ed3a17..c3f63a4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "red-mod-manager", "private": true, - "version": "1.1.9", + "version": "1.2.0", "type": "module", "scripts": { "dev": "vite", diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index adeb661..6e19a07 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -512,6 +512,13 @@ fn unzip_handler(source: String, destination: String) -> Result<(), String> { } fn main() { + // Startup check for _Redloader\dotnet in current directory + let cwd = std::env::current_dir().unwrap_or_default(); + let dotnet_path = cwd.join("_Redloader").join("dotnet"); + if dotnet_path.exists() { + println!("[WARNING] _Redloader\\dotnet detected in current directory. This may cause DLL conflicts or crashes. It is recommended to run RedModManager from its own folder."); + } + tauri::Builder::default() .plugin(tauri_plugin_window_state::Builder::default().build()) .invoke_handler(tauri::generate_handler![get_cached_image, get_cached_image_data, clear_image_cache, download_with_progress, unzip_handler, get_steam_path, is_dotnet6_installed, get_file_version]) diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 00cdee6..18de5d8 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -8,7 +8,7 @@ }, "package": { "productName": "RedModManager", - "version": "1.1.9" + "version": "1.2.0" }, "tauri": { "allowlist": { From 1de0f91fd35ee71a0c5bbe76754e5f6e6d74ead7 Mon Sep 17 00:00:00 2001 From: Za-Pa-Al <235132485+Za-Pa-Al@users.noreply.github.com> Date: Fri, 17 Oct 2025 12:10:35 +0200 Subject: [PATCH 03/13] Updated Badges --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e4c83b4..11c8622 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,9 @@

- - - + + +

--- @@ -95,4 +95,4 @@ Enhancements to the RedModManager Tauri/Svelte application. - **Grid Position Stability**: Unique keys (mod.mod_id) prevent position shifting during operations - **Optimized Refresh Logic**: Proper mod status synchronization with initModList() calls - **Memory Management**: Intelligent image caching with size limits and automatic cleanup -- **Network Optimization**: Progressive image loading and preloading for better UX \ No newline at end of file +- **Network Optimization**: Progressive image loading and preloading for better UX From c47f0673bef5f84774334d6580d61de11659ee52 Mon Sep 17 00:00:00 2001 From: Za-Pa-Al <235132485+Za-Pa-Al@users.noreply.github.com> Date: Fri, 17 Oct 2025 12:50:03 +0200 Subject: [PATCH 04/13] Include project layout diagram in README Added project layout diagram using Mermaid syntax. --- README.md | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/README.md b/README.md index 11c8622..ce551a4 100644 --- a/README.md +++ b/README.md @@ -96,3 +96,65 @@ Enhancements to the RedModManager Tauri/Svelte application. - **Optimized Refresh Logic**: Proper mod status synchronization with initModList() calls - **Memory Management**: Intelligent image caching with size limits and automatic cleanup - **Network Optimization**: Progressive image loading and preloading for better UX + +**Project Layout** + +```mermaid +graph LR +A["RedManager - Tauri/Svelte App"]:::main +A --> B["Frontend - Svelte (.svelte, .ts)"]:::frontend +A --> C["Backend - Rust/Tauri (.rs, .toml)"]:::backend +A --> D["Build/Distribution"]:::build + +B --> B1["src/App.svelte"]:::frontendLeaf +B --> B2["src/pages/MainPage.svelte"]:::frontendLeaf +B --> B3["src/pages/Mods.svelte"]:::frontendLeaf +B --> B4["src/lib/ModCard.svelte"]:::frontendLeaf +B --> B5["src/lib/StatusButton.svelte"]:::frontendLeaf +B --> B6["src/lib/imageCache.ts"]:::tsLeaf + +C --> C1["src-tauri/src/main.rs"]:::backendLeaf +C --> C2["src-tauri/Cargo.toml"]:::tomlLeaf +C --> C3["src-tauri/tauri.conf.json"]:::tomlLeaf + +D --> D1["src-tauri/target/release/RedModManager.exe"]:::buildLeaf +D --> D2["src-tauri/target/release/bundle/"]:::buildLeaf + +desc1[".svelte: Svelte UI components (Frontend, HTML/CSS/JS)"]:::desc +desc2[".ts: TypeScript logic (Frontend, JS/TS)"]:::desc +desc3[".rs: Rust backend code (Backend, Rust)"]:::desc +desc4[".toml/.json: Project configuration (Backend, TOML/JSON)"]:::desc +desc5[".exe/.bundle: Distributable files (Binary/Installer)"]:::desc + +B1 -.-> desc1 +B2 -.-> desc1 +B3 -.-> desc1 +B4 -.-> desc1 +B5 -.-> desc1 +B6 -.-> desc2 +C1 -.-> desc3 +C2 -.-> desc4 +C3 -.-> desc4 +D1 -.-> desc5 +D2 -.-> desc5 + +classDef main fill:#fff,stroke:#222,stroke-width:2px,color:#222; +classDef frontend fill:#e0f7fa,stroke:#222,stroke-width:2px,color:#222; +classDef frontendLeaf fill:#b2ebf2,stroke:#222,stroke-width:2px,color:#222; +classDef tsLeaf fill:#80deea,stroke:#222,stroke-width:2px,color:#222; +classDef backend fill:#e8eaf6,stroke:#222,stroke-width:2px,color:#222; +classDef backendLeaf fill:#c5cae9,stroke:#222,stroke-width:2px,color:#222; +classDef tomlLeaf fill:#b3b3e6,stroke:#222,stroke-width:2px,color:#222; +classDef build fill:#ffe0b2,stroke:#222,stroke-width:2px,color:#222; +classDef buildLeaf fill:#ffcc80,stroke:#222,stroke-width:2px,color:#222; +classDef desc fill:#fffde7,stroke:#222,stroke-width:1px,color:#222; +class A main; +class B frontend; +class C backend; +class D build; +class B1,B2,B3,B4,B5 frontendLeaf; +class B6 tsLeaf; +class C1 backendLeaf; +class C2,C3 tomlLeaf; +class D1,D2 buildLeaf; +class desc1,desc2,desc3,desc4,desc5 desc; From e6c0fa3872dded5b83cd946b820de9bdf119aafb Mon Sep 17 00:00:00 2001 From: Za-Pa-Al <235132485+Za-Pa-Al@users.noreply.github.com> Date: Fri, 17 Oct 2025 23:56:38 +0200 Subject: [PATCH 05/13] chore(release): bump version to v1.2.1 and update changelog --- CHANGELOG.md | 7 ++++++- package.json | 2 +- src-tauri/Cargo.toml | 7 ++++--- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 47f5d6d..aade49a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,4 +4,9 @@ - UI overhaul. - Fixed last updated indicator. - Fixed image covers not showing. -- Fixed wrong image covers for mods after searching. \ No newline at end of file +- Fixed wrong image covers for mods after searching. + +## v1.2.1 - 2025-10-17 + +- Align package and app versions (frontend `package.json` and `src-tauri/Cargo.toml`). +- Improve image caching: load from cache immediately and perform throttled background checks with limited concurrency. diff --git a/package.json b/package.json index c3f63a4..49fdb4a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "red-mod-manager", "private": true, - "version": "1.2.0", + "version": "1.2.1", "type": "module", "scripts": { "dev": "vite", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 6f4a4e3..7e2c6f6 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,11 +1,11 @@ [package] name = "RedModManager" -version = "0.0.0" +version = "1.2.1" description = "An installer and mod manager for the RedLoader mod loader." -authors = ["Toni Macaroni"] +authors = ["Toni Macaroni", "Za-Pa-Al"] license = "" repository = "" -edition = "2021" +edition = "2025" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -24,6 +24,7 @@ winreg = "*" reqwest = { version = "0.11", features = ["stream"] } futures-util = "0.3" image = "0.24" +once_cell = "1.19" [dependencies.windows] version = "0.33.0" From 12dbc9535b96842a09fb6075270ec06e04b7ed3f Mon Sep 17 00:00:00 2001 From: Za-Pa-Al <235132485+Za-Pa-Al@users.noreply.github.com> Date: Fri, 17 Oct 2025 23:58:29 +0200 Subject: [PATCH 06/13] docs(changelog): add commits since 1.1.9 to v1.2.1 entry --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index aade49a..d0e279c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,3 +10,13 @@ - Align package and app versions (frontend `package.json` and `src-tauri/Cargo.toml`). - Improve image caching: load from cache immediately and perform throttled background checks with limited concurrency. + +### Commits since 1.1.9 + +- 73fd304 chore(release): bump version to v1.2.1 and update changelog (alexanderzazworka-sketch, 2025-10-17) +- b18fddc Include project layout diagram in README (Za-Pa-Al, 2025-10-17) +- af35197 Updated Badges (Za-Pa-Al, 2025-10-17) +- a16179e New Version. Tried circumventing .NET conflicts. (alexanderzazworka-sketch, 2025-10-17) +- e8338e0 Color Coding, Window adjustments. Image caching. (alexanderzazworka-sketch, 2025-10-16) +- 1734efa lazy load image and api update (Julian Kittel, 2025-02-10) + From 24bbf3ec22ecf4239a5a122fa6287313dfb3601d Mon Sep 17 00:00:00 2001 From: Za-Pa-Al <235132485+Za-Pa-Al@users.noreply.github.com> Date: Sat, 18 Oct 2025 00:09:19 +0200 Subject: [PATCH 07/13] Improved image caching, fixed search focus, added unknown mods detection, added mod urls --- CHANGELOG.md | 29 ++-- src-tauri/Cargo.lock | 15 +- src-tauri/src/main.rs | 336 ++++++++++++++++++++++++++--------------- src/lib/ModCard.svelte | 68 +++++++-- src/lib/mods.ts | 72 +++++++-- src/pages/Mods.svelte | 28 +++- 6 files changed, 370 insertions(+), 178 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0e279c..c454dd7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,18 @@ +## v1.2.1 - 2025-10-17 + +- Align package and app versions (frontend `package.json` and `src-tauri/Cargo.toml`). +- Improve image caching: load from cache immediately and perform throttled background checks with limited concurrency. + +### v1.2.0 - 2025-10-16 + +- UI and window layout improvements, including color-coding for mod states (enabled/disabled/unknown). +- Image caching rework: immediate cache load, background validation (throttled) and optimized WebP storage. +- Lazy-loading of images and improved SOTF API integration for more reliable search results. +- Documentation and README updates (project layout diagram, badges). +- Misc fixes and versioning adjustments to address .NET compatibility issues. + +### <= v1.1.9 - 2025-02-10 + - Added infinite scroll instead of pre-fetching all mods. - Use sotf-mods api for searching with debounce. - Added icons for navigation bar. @@ -6,17 +21,3 @@ - Fixed image covers not showing. - Fixed wrong image covers for mods after searching. -## v1.2.1 - 2025-10-17 - -- Align package and app versions (frontend `package.json` and `src-tauri/Cargo.toml`). -- Improve image caching: load from cache immediately and perform throttled background checks with limited concurrency. - -### Commits since 1.1.9 - -- 73fd304 chore(release): bump version to v1.2.1 and update changelog (alexanderzazworka-sketch, 2025-10-17) -- b18fddc Include project layout diagram in README (Za-Pa-Al, 2025-10-17) -- af35197 Updated Badges (Za-Pa-Al, 2025-10-17) -- a16179e New Version. Tried circumventing .NET conflicts. (alexanderzazworka-sketch, 2025-10-17) -- e8338e0 Color Coding, Window adjustments. Image caching. (alexanderzazworka-sketch, 2025-10-16) -- 1734efa lazy load image and api update (Julian Kittel, 2025-02-10) - diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index e2633c8..2a62f72 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -4,10 +4,11 @@ version = 4 [[package]] name = "RedModManager" -version = "0.0.0" +version = "1.2.1" dependencies = [ "futures-util", "image", + "once_cell", "regex", "reqwest", "serde", @@ -17,7 +18,7 @@ dependencies = [ "tauri-plugin-window-state", "tokio", "windows 0.33.0", - "winreg 0.55.0", + "winreg 0.50.0", "zip", ] @@ -4787,16 +4788,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "winreg" -version = "0.55.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" -dependencies = [ - "cfg-if", - "windows-sys 0.59.0", -] - [[package]] name = "wit-bindgen" version = "0.46.0" diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 6e19a07..c251060 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -20,9 +20,52 @@ use futures_util::StreamExt; use std::collections::hash_map::DefaultHasher; use std::hash::{Hash, Hasher}; use image::ImageFormat; +use tokio::sync::Semaphore; +use std::sync::Arc; + +// Global semaphore to limit concurrent background image checks (max 3 at a time) +static BACKGROUND_CHECK_SEMAPHORE: once_cell::sync::Lazy> = + once_cell::sync::Lazy::new(|| Arc::new(Semaphore::new(3))); const SOTF_APP_ID: &str = "1326470"; +#[derive(serde::Serialize)] +pub struct ModFileEntry { + pub name: String, + pub path: String, + pub is_symlink: bool, + pub target: Option, +} + +#[tauri::command] +fn scan_mods_directory(dir_path: String) -> Result, String> { + let mut entries = Vec::new(); + let dir = std::path::Path::new(&dir_path); + let read_dir_iter = std::fs::read_dir(dir).map_err(|e| e.to_string())?; + + for entry in read_dir_iter { + let entry = entry.map_err(|e| e.to_string())?; + let path = entry.path(); + let name = entry.file_name().to_string_lossy().to_string(); + let metadata = std::fs::symlink_metadata(&path).map_err(|e| e.to_string())?; + let is_symlink = metadata.file_type().is_symlink(); + let target = if is_symlink { + std::fs::read_link(&path).ok().map(|p| p.to_string_lossy().to_string()) + } else { + None + }; + + entries.push(ModFileEntry { + name, + path: path.to_string_lossy().to_string(), + is_symlink, + target, + }); + } + + Ok(entries) +} + #[tauri::command] fn is_dotnet6_installed() -> Result { let hklm = RegKey::predef(HKEY_LOCAL_MACHINE); @@ -250,74 +293,80 @@ async fn get_cached_image( } } -#[tauri::command] -async fn get_cached_image_data( - url: String, - app_handle: tauri::AppHandle, -) -> Result, String> { - // Create hash from URL for filename - let mut hasher = DefaultHasher::new(); - url.hash(&mut hasher); - let hash = hasher.finish(); +// Helper function to optimize images +fn optimize_image(bytes: &[u8]) -> Result, String> { + // Load image from bytes + let img = image::load_from_memory(bytes) + .map_err(|e| format!("Failed to decode image: {}", e))?; - // Get cache directory - let cache_dir = app_handle.path_resolver() - .app_cache_dir() - .ok_or("Could not get cache directory")?; - - let cache_dir = cache_dir.join("images"); - if !cache_dir.exists() { - std::fs::create_dir_all(&cache_dir).map_err(|e| e.to_string())?; - } + // Resize to maximum 300x200 for faster loading and lower memory usage + // This matches the 140px height we set in CSS + let resized = img.thumbnail(300, 200); - // Use webp for optimized cached files - let cached_file = cache_dir.join(format!("{}_optimized.webp", hash)); - let metadata_file = cache_dir.join(format!("{}_metadata.txt", hash)); + // Convert to WebP for better compression + let mut output = Vec::new(); + resized.write_to(&mut std::io::Cursor::new(&mut output), ImageFormat::WebP) + .map_err(|e| format!("Failed to encode image as WebP: {}", e))?; - // Check if cached file exists and validate against server - if cached_file.exists() { - if let Ok(metadata) = std::fs::metadata(&cached_file) { - if let Ok(modified) = metadata.modified() { - let age = std::time::SystemTime::now() - .duration_since(modified) - .unwrap_or(std::time::Duration::from_secs(0)); - - // If file is less than 1 hour old, always use cache (no server check) - if age.as_secs() < 60 * 60 { - return std::fs::read(&cached_file).map_err(|e| e.to_string()); - } - - // For files 1-24 hours old, try server check but fallback gracefully - if age.as_secs() < 24 * 60 * 60 { - match check_server_file_changed(&url, &metadata_file).await { - Ok(false) => { - return std::fs::read(&cached_file).map_err(|e| e.to_string()); - } - Ok(true) => { - // Server file changed, updating cache - } - Err(_) => { - // Server check failed, but file is recent enough - use cache - return std::fs::read(&cached_file).map_err(|e| e.to_string()); - } - } - } else { - // File is older than 24 hours, force refresh - println!("♻️ Cache expired (age: {} hours), refreshing...", age.as_secs() / 3600); - } + Ok(output) +} + +// Helper function to check if server file has changed +async fn check_server_file_changed(url: &str, metadata_file: &std::path::Path) -> Result { + // Read stored metadata if it exists + let stored_metadata = match std::fs::read_to_string(metadata_file) { + Ok(content) => content, + Err(_) => return Ok(true), // No metadata means we should download + }; + + // Create HTTP client with short timeout for HEAD request + let client = reqwest::Client::builder() + .timeout(std::time::Duration::from_secs(3)) // Shorter timeout + .build() + .map_err(|e| format!("Failed to create HTTP client: {}", e))?; + + // Make HEAD request to check metadata + let response = client.head(url).send().await + .map_err(|e| format!("Failed to check server: {}", e))?; + + // Check ETag header + if stored_metadata.starts_with("etag:") { + let stored_etag = &stored_metadata[5..]; + if let Some(server_etag) = response.headers().get("etag") { + if let Ok(server_etag_str) = server_etag.to_str() { + return Ok(stored_etag != server_etag_str); } } } - println!("⬇️ Downloading new image..."); + // Check Last-Modified header + if stored_metadata.starts_with("last-modified:") { + let stored_last_modified = &stored_metadata[14..]; + if let Some(server_last_modified) = response.headers().get("last-modified") { + if let Ok(server_last_modified_str) = server_last_modified.to_str() { + return Ok(stored_last_modified != server_last_modified_str); + } + } + } + // If we can't determine, assume it changed + Ok(true) +} + +// Helper function to download and cache an image +async fn download_and_cache_image( + url: &str, + cached_file: &std::path::Path, + metadata_file: &std::path::Path, + show_progress: bool, +) -> Result, String> { // Download and cache the image let client = reqwest::Client::builder() .timeout(std::time::Duration::from_secs(10)) // 10 second timeout .build() .map_err(|e| format!("Failed to create HTTP client: {}", e))?; - match client.get(&url).send().await { + match client.get(url).send().await { Ok(response) => { if !response.status().is_success() { return Err(format!("HTTP error: {}", response.status())); @@ -326,49 +375,59 @@ async fn get_cached_image_data( // Store server metadata for future comparisons if let Some(etag) = response.headers().get("etag") { if let Ok(etag_str) = etag.to_str() { - let _ = std::fs::write(&metadata_file, format!("etag:{}", etag_str)); + let _ = std::fs::write(metadata_file, format!("etag:{}", etag_str)); } } else if let Some(last_modified) = response.headers().get("last-modified") { if let Ok(last_modified_str) = last_modified.to_str() { - let _ = std::fs::write(&metadata_file, format!("last-modified:{}", last_modified_str)); + let _ = std::fs::write(metadata_file, format!("last-modified:{}", last_modified_str)); } } else { // Store current timestamp as fallback let timestamp = std::time::SystemTime::now() .duration_since(std::time::UNIX_EPOCH) .unwrap().as_secs(); - let _ = std::fs::write(&metadata_file, format!("timestamp:{}", timestamp)); + let _ = std::fs::write(metadata_file, format!("timestamp:{}", timestamp)); } match response.bytes().await { Ok(bytes) => { - println!("📦 Downloaded {} KB", bytes.len() / 1024); + if show_progress { + println!("📦 Downloaded {} KB", bytes.len() / 1024); + } // Process and optimize the image match optimize_image(&bytes) { Ok(optimized_bytes) => { - let reduction = if bytes.len() > 0 { - 100u64.saturating_sub((optimized_bytes.len() as u64 * 100) / bytes.len() as u64) - } else { - 0 - }; - println!("✨ Optimized to {} KB ({}% smaller)", - optimized_bytes.len() / 1024, reduction); + if show_progress { + let reduction = if bytes.len() > 0 { + 100u64.saturating_sub((optimized_bytes.len() as u64 * 100) / bytes.len() as u64) + } else { + 0 + }; + println!("✨ Optimized to {} KB ({}% smaller)", + optimized_bytes.len() / 1024, reduction); + } // Save optimized version to cache - match std::fs::write(&cached_file, &optimized_bytes) { + match std::fs::write(cached_file, &optimized_bytes) { Ok(_) => { - println!("💾 Cached successfully!"); + if show_progress { + println!("💾 Cached successfully!"); + } Ok(optimized_bytes) } Err(e) => { - println!("⚠️ Cache write failed: {}", e); + if show_progress { + println!("⚠️ Cache write failed: {}", e); + } Ok(optimized_bytes) } } } Err(e) => { - println!("⚠️ Optimization failed, using original: {}", e); + if show_progress { + println!("⚠️ Optimization failed, using original: {}", e); + } // Fallback to original bytes if optimization fails Ok(bytes.to_vec()) } @@ -381,69 +440,96 @@ async fn get_cached_image_data( } } -// Helper function to optimize images -fn optimize_image(bytes: &[u8]) -> Result, String> { - // Load image from bytes - let img = image::load_from_memory(bytes) - .map_err(|e| format!("Failed to decode image: {}", e))?; - - // Resize to maximum 300x200 for faster loading and lower memory usage - // This matches the 140px height we set in CSS - let resized = img.thumbnail(300, 200); - - // Convert to WebP for better compression - let mut output = Vec::new(); - resized.write_to(&mut std::io::Cursor::new(&mut output), ImageFormat::WebP) - .map_err(|e| format!("Failed to encode image as WebP: {}", e))?; - - Ok(output) -} - -// Helper function to check if server file has changed -async fn check_server_file_changed(url: &str, metadata_file: &std::path::Path) -> Result { - // Read stored metadata if it exists - let stored_metadata = match std::fs::read_to_string(metadata_file) { - Ok(content) => content, - Err(_) => return Ok(true), // No metadata means we should download - }; +#[tauri::command] +async fn get_cached_image_data( + url: String, + app_handle: tauri::AppHandle, +) -> Result, String> { + // Create hash from URL for filename + let mut hasher = DefaultHasher::new(); + url.hash(&mut hasher); + let hash = hasher.finish(); - // Create HTTP client with short timeout for HEAD request - let client = reqwest::Client::builder() - .timeout(std::time::Duration::from_secs(3)) // Shorter timeout - .build() - .map_err(|e| format!("Failed to create HTTP client: {}", e))?; + // Get cache directory + let cache_dir = app_handle.path_resolver() + .app_cache_dir() + .ok_or("Could not get cache directory")?; + + let cache_dir = cache_dir.join("images"); + if !cache_dir.exists() { + std::fs::create_dir_all(&cache_dir).map_err(|e| e.to_string())?; + } - // Make HEAD request to check server metadata - let response = match client.head(url).send().await { - Ok(resp) if resp.status().is_success() => resp, - _ => { - // HEAD failed silently, assume no change to avoid spam - return Ok(false); - } - }; + // Use webp for optimized cached files + let cached_file = cache_dir.join(format!("{}_optimized.webp", hash)); + let metadata_file = cache_dir.join(format!("{}_metadata.txt", hash)); - // Check ETag first (most reliable) - if stored_metadata.starts_with("etag:") { - let stored_etag = &stored_metadata[5..]; - if let Some(server_etag) = response.headers().get("etag") { - if let Ok(server_etag_str) = server_etag.to_str() { - return Ok(stored_etag != server_etag_str); + // Check if cached file exists and validate against server + if cached_file.exists() { + if let Ok(metadata) = std::fs::metadata(&cached_file) { + if let Ok(modified) = metadata.modified() { + let age = std::time::SystemTime::now() + .duration_since(modified) + .unwrap_or(std::time::Duration::from_secs(0)); + + // If file is less than 7 days old, use cache immediately (no blocking on server check) + if age.as_secs() < 7 * 24 * 60 * 60 { + // Return cached file immediately + let cached_data = std::fs::read(&cached_file).map_err(|e| e.to_string())?; + + // Check when we last verified with server (using metadata file timestamp) + let should_check = if metadata_file.exists() { + if let Ok(meta) = std::fs::metadata(&metadata_file) { + if let Ok(modified) = meta.modified() { + let check_age = std::time::SystemTime::now() + .duration_since(modified) + .unwrap_or(std::time::Duration::from_secs(0)); + // Only check server if last check was more than 5 minutes ago + check_age.as_secs() >= 5 * 60 + } else { + true // Can't read timestamp, check to be safe + } + } else { + true // Can't read metadata, check to be safe + } + } else { + true // No metadata file, first check + }; + + // Only spawn background task if we haven't checked recently + if should_check { + // Always spawn background task to check and update cache if needed + // Use semaphore to limit concurrent checks to prevent overwhelming the system + let url_clone = url.clone(); + let cached_file_clone = cached_file.clone(); + let metadata_file_clone = metadata_file.clone(); + let semaphore = BACKGROUND_CHECK_SEMAPHORE.clone(); + + tokio::spawn(async move { + // Acquire semaphore permit (waits in queue if max 3 are already running) + let _permit = semaphore.acquire().await.unwrap(); + + if let Ok(true) = check_server_file_changed(&url_clone, &metadata_file_clone).await { + // Server file changed, update cache in background (silently) + let _ = download_and_cache_image(&url_clone, &cached_file_clone, &metadata_file_clone, false).await; + } + // Permit is automatically released when _permit is dropped + }); + } + + return Ok(cached_data); + } else { + // File is older than 7 days, force refresh + println!("♻️ Cache expired (age: {} days), refreshing...", age.as_secs() / (24 * 3600)); + } } } } - // Check Last-Modified header - if stored_metadata.starts_with("last-modified:") { - let stored_last_modified = &stored_metadata[14..]; - if let Some(server_last_modified) = response.headers().get("last-modified") { - if let Ok(server_last_modified_str) = server_last_modified.to_str() { - return Ok(stored_last_modified != server_last_modified_str); - } - } - } + println!("⬇️ Downloading new image..."); - // If we have timestamp-based metadata, assume no change - Ok(false) + // Use helper function to download and cache (show progress for initial downloads) + download_and_cache_image(&url, &cached_file, &metadata_file, true).await } #[tauri::command] @@ -521,7 +607,7 @@ fn main() { tauri::Builder::default() .plugin(tauri_plugin_window_state::Builder::default().build()) - .invoke_handler(tauri::generate_handler![get_cached_image, get_cached_image_data, clear_image_cache, download_with_progress, unzip_handler, get_steam_path, is_dotnet6_installed, get_file_version]) + .invoke_handler(tauri::generate_handler![get_cached_image, get_cached_image_data, clear_image_cache, download_with_progress, unzip_handler, get_steam_path, is_dotnet6_installed, get_file_version, scan_mods_directory]) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/src/lib/ModCard.svelte b/src/lib/ModCard.svelte index acc070b..70c517a 100644 --- a/src/lib/ModCard.svelte +++ b/src/lib/ModCard.svelte @@ -117,12 +117,21 @@
+ class:installed-enabled={mod.isInstalled && mod.installedMod?.isEnabled && !mod.isUnknownSource} + class:installed-disabled={mod.isInstalled && !mod.installedMod?.isEnabled && !mod.isUnknownSource} + class:unknown-source-enabled={mod.isUnknownSource && mod.isInstalled && mod.installedMod?.isEnabled} + class:unknown-source-disabled={mod.isUnknownSource && mod.isInstalled && !mod.installedMod?.isEnabled}>
{mod.name} - +
{mod.shortDescription?mod.shortDescription:""}
@@ -130,14 +139,23 @@
- Mod cover for {mod.name} ModDatabase.openModPage(mod)} - title="Click to view on site" - /> + {#if mod.isUnknownSource} + Unknown source mod + {:else} + Mod cover for {mod.name} ModDatabase.openModPage(mod)} + title="Click to view on sotf-mods" + /> + {/if}
Author: {mod.user.name} @@ -473,4 +491,32 @@ .installed-disabled .button-section { background-color: #2b0d0d !important; } + + /* Unknown source styling - enabled (dark yellow + dark green mix) */ + .unknown-source-enabled .feature-container { + background-color: #1f2410 !important; /* Mix of dark yellow (#2b2410) and dark green (#0d2b1a) */ + } + + .unknown-source-enabled .button-section { + background-color: #1f2410 !important; + } + + /* Unknown source styling - disabled (dark yellow + dark red mix) */ + .unknown-source-disabled .feature-container { + background-color: #2b180d !important; /* Mix of dark yellow (#2b2410) and dark red (#2b0d0d) */ + } + + .unknown-source-disabled .button-section { + background-color: #2b180d !important; + } + + /* Link buttons container */ + .link-buttons { + display: flex; + gap: 10px; + flex-wrap: wrap; + min-height: 16px; /* Reserve space for at least one line of links */ + align-items: flex-start; + justify-content: flex-start; /* Ensure links start from the left */ + } \ No newline at end of file diff --git a/src/lib/mods.ts b/src/lib/mods.ts index 179b06e..c2e4bf6 100644 --- a/src/lib/mods.ts +++ b/src/lib/mods.ts @@ -1,7 +1,15 @@ import { app, fs, path} from '@tauri-apps/api' +import { invoke } from '@tauri-apps/api/tauri'; import { getDirectoryPath, getLibsDir, getModsDir, processName, processProgress } from './store'; import { downloadAndInstall, showMessageBox } from './utils'; +type ModFileEntry = { + name: string; + path: string; + is_symlink: boolean; + target: string | null; +} + export type ModCategory = { name: String; slug: String; @@ -33,6 +41,7 @@ export type Mod = { isInstalled: boolean; installedMod?: InstalledMod; hasUpdate: boolean; + isUnknownSource?: boolean; } type RequestMeta = { @@ -54,6 +63,9 @@ export type ModManifest = { author: string; version: string; type: string; + url?: string; + description?: string; + gameVersion?: string; } export type InstalledMod = { @@ -141,28 +153,31 @@ export class ModDatabase { if( remoteMod ) { remoteMod.isInstalled = true; remoteMod.installedMod = m; + remoteMod.isUnknownSource = false; return remoteMod; } - - // return { - // name: m.modName, - // mod_id: m.manifest.id, - // user_name: m.manifest.author, - // latestVersion: m.manifest.version, - // isInstalled: true, - // installedMod: m - // } as Mod + // Mod not found on sotf-mods.com - create a fallback with unknown source flag return { name: m.modName, mod_id: m.manifest.id, + slug: '', + shortDescription: m.manifest.description || '', + isApproved: false, + category: { name: 'Unknown', slug: 'unknown' } as ModCategory, user: { name: m.manifest.author, slug: m.manifest.author } as ModAuthor, + imageUrl: '', latestVersion: m.manifest.version, + lastReleasedAt: '', + type: m.manifest.type || 'Mod', + dependencies: [], isInstalled: true, - installedMod: m + installedMod: m, + hasUpdate: false, + isUnknownSource: true } as Mod })); } @@ -192,7 +207,29 @@ export class ModDatabase { } public static openModPage(mod: Mod): void { - window.open(`https://sotf-mods.com/mods/${mod.user.slug}/${mod.slug}`); + // Open the sotf-mods.com page if available + if (mod.user?.slug && mod.slug) { + window.open(`https://sotf-mods.com/mods/${mod.user.slug}/${mod.slug}`); + } else { + console.warn('Cannot open sotf-mods page: mod not found on sotf-mods.com', mod); + } + } + + public static openModUrl(mod: Mod): void { + // Open the mod's custom URL from manifest if available + if (mod.installedMod?.manifest?.url && + mod.installedMod.manifest.url !== '...' && + mod.installedMod.manifest.url.trim() !== '') { + window.open(mod.installedMod.manifest.url); + } else { + console.warn('Cannot open mod URL: no URL in manifest', mod); + } + } + + public static hasModUrl(mod: Mod): boolean { + return !!(mod.installedMod?.manifest?.url && + mod.installedMod.manifest.url !== '...' && + mod.installedMod.manifest.url.trim() !== ''); } private static async initInstalledMod(folderPath: string, isEnabled: boolean): Promise { @@ -216,15 +253,22 @@ export class ModDatabase { let modPath = await path.join(await getDirectoryPath(), "Mods"); let libPath = await path.join(await getDirectoryPath(), "Libs"); - let files = await fs.readDir(modPath); - files = files.concat(await fs.readDir(libPath)); + + // Use symlink-aware scanning + let modFiles: ModFileEntry[] = await invoke('scan_mods_directory', { dirPath: modPath }); + let libFiles: ModFileEntry[] = await invoke('scan_mods_directory', { dirPath: libPath }); + let files = modFiles.concat(libFiles); for (let i = 0; i < files.length; i++) { let file = files[i]; + if(file.name?.endsWith(".dll") || file.name?.endsWith(".disabled")){ let isEnabled = file.name?.endsWith(".dll"); let folderName = file.name?.replace(".dll", "").replace(".disabled", ""); - let folderPath = await path.join(await path.dirname(file.path), folderName); + + // Use the actual path (resolves symlinks automatically if needed) + let basePath = await path.dirname(file.path); + let folderPath = await path.join(basePath, folderName); if(!(await fs.exists(folderPath))) { diff --git a/src/pages/Mods.svelte b/src/pages/Mods.svelte index 52040ed..30f58c1 100644 --- a/src/pages/Mods.svelte +++ b/src/pages/Mods.svelte @@ -101,7 +101,17 @@ filterTerm = e.target.value; page = 1; filtered = []; - await fetchData(); + + if (installedSelected) { + // For installed mods, fetch and filter locally + let allInstalled = await ModDatabase.getInstalledMods(); + filtered = allInstalled.filter(mod => + mod.name.toLowerCase().includes(filterTerm.toLowerCase()) + ); + } else { + // For online mods, use API search + await fetchData(); + } }, 600); async function toggleOnline() { @@ -122,7 +132,21 @@ installedSelected = true; isLoading = true; filtered = []; - filtered = await ModDatabase.getInstalledMods(); + + let allInstalled = await ModDatabase.getInstalledMods(); + + // Apply search filter if there is one + if (filterTerm && filterTerm.trim() !== '') { + filtered = allInstalled.filter(mod => + mod.name.toLowerCase().includes(filterTerm.toLowerCase()) + ); + } else { + filtered = allInstalled; + } + + // Sort installed mods by name + filtered.sort((a, b) => a.name.localeCompare(b.name)); + isLoading = false; // page = 1; // filtered = []; From e119e8fbc7d5eb3e4f656c95689779810061c02c Mon Sep 17 00:00:00 2001 From: Za-Pa-Al <235132485+Za-Pa-Al@users.noreply.github.com> Date: Sat, 18 Oct 2025 00:17:58 +0200 Subject: [PATCH 08/13] Fixed Cargo.toml edition --- src-tauri/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 7e2c6f6..9c29fac 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -5,7 +5,7 @@ description = "An installer and mod manager for the RedLoader mod loader." authors = ["Toni Macaroni", "Za-Pa-Al"] license = "" repository = "" -edition = "2025" +edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html From c8df5676e1501a4897a8be8450de31da5ffca772 Mon Sep 17 00:00:00 2001 From: Za-Pa-Al <235132485+Za-Pa-Al@users.noreply.github.com> Date: Sat, 18 Oct 2025 00:26:26 +0200 Subject: [PATCH 09/13] InfiniteScroll threshold={500} --- src-tauri/src/main.rs | 66 +++++++++++++++++---------------------- src-tauri/tauri.conf.json | 4 +-- src/pages/Mods.svelte | 2 +- 3 files changed, 32 insertions(+), 40 deletions(-) diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index c251060..cc5b0b1 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -466,20 +466,21 @@ async fn get_cached_image_data( // Check if cached file exists and validate against server if cached_file.exists() { - if let Ok(metadata) = std::fs::metadata(&cached_file) { - if let Ok(modified) = metadata.modified() { - let age = std::time::SystemTime::now() - .duration_since(modified) - .unwrap_or(std::time::Duration::from_secs(0)); + // Fast path: just read and return the cached file + // Avoid expensive metadata checks on every load + match std::fs::read(&cached_file) { + Ok(cached_data) => { + // Opportunistically spawn background check (non-blocking) + // Use try_acquire so we never block - if semaphore is full, skip this check + let url_clone = url.clone(); + let cached_file_clone = cached_file.clone(); + let metadata_file_clone = metadata_file.clone(); + let semaphore = BACKGROUND_CHECK_SEMAPHORE.clone(); - // If file is less than 7 days old, use cache immediately (no blocking on server check) - if age.as_secs() < 7 * 24 * 60 * 60 { - // Return cached file immediately - let cached_data = std::fs::read(&cached_file).map_err(|e| e.to_string())?; - + tokio::spawn(async move { // Check when we last verified with server (using metadata file timestamp) - let should_check = if metadata_file.exists() { - if let Ok(meta) = std::fs::metadata(&metadata_file) { + let should_check = if metadata_file_clone.exists() { + if let Ok(meta) = std::fs::metadata(&metadata_file_clone) { if let Ok(modified) = meta.modified() { let check_age = std::time::SystemTime::now() .duration_since(modified) @@ -487,41 +488,32 @@ async fn get_cached_image_data( // Only check server if last check was more than 5 minutes ago check_age.as_secs() >= 5 * 60 } else { - true // Can't read timestamp, check to be safe + false // Can't read timestamp, skip } } else { - true // Can't read metadata, check to be safe + false // Can't read metadata, skip } } else { true // No metadata file, first check }; - // Only spawn background task if we haven't checked recently if should_check { - // Always spawn background task to check and update cache if needed - // Use semaphore to limit concurrent checks to prevent overwhelming the system - let url_clone = url.clone(); - let cached_file_clone = cached_file.clone(); - let metadata_file_clone = metadata_file.clone(); - let semaphore = BACKGROUND_CHECK_SEMAPHORE.clone(); + // Acquire semaphore permit (waits in queue if max 3 are already running) + // This happens in the background, so it doesn't block returning the cached image + let _permit = semaphore.acquire().await.unwrap(); - tokio::spawn(async move { - // Acquire semaphore permit (waits in queue if max 3 are already running) - let _permit = semaphore.acquire().await.unwrap(); - - if let Ok(true) = check_server_file_changed(&url_clone, &metadata_file_clone).await { - // Server file changed, update cache in background (silently) - let _ = download_and_cache_image(&url_clone, &cached_file_clone, &metadata_file_clone, false).await; - } - // Permit is automatically released when _permit is dropped - }); + if let Ok(true) = check_server_file_changed(&url_clone, &metadata_file_clone).await { + // Server file changed, update cache in background (silently) + let _ = download_and_cache_image(&url_clone, &cached_file_clone, &metadata_file_clone, false).await; + } + // Permit is automatically released when _permit is dropped } - - return Ok(cached_data); - } else { - // File is older than 7 days, force refresh - println!("♻️ Cache expired (age: {} days), refreshing...", age.as_secs() / (24 * 3600)); - } + }); + + return Ok(cached_data); + } + Err(_) => { + // Cache file exists but can't read - fall through to re-download } } } diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 18de5d8..7999204 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -7,8 +7,8 @@ "withGlobalTauri": false }, "package": { - "productName": "RedModManager", - "version": "1.2.0" + "productName": "RedModManager", + "version": "1.2.1" }, "tauri": { "allowlist": { diff --git a/src/pages/Mods.svelte b/src/pages/Mods.svelte index 30f58c1..7fec937 100644 --- a/src/pages/Mods.svelte +++ b/src/pages/Mods.svelte @@ -188,7 +188,7 @@ {page++; fetchData()}} />
From dae0fbcf781ad1425f0a7ab278b054e453ad0d40 Mon Sep 17 00:00:00 2001 From: Za-Pa-Al <235132485+Za-Pa-Al@users.noreply.github.com> Date: Sat, 18 Oct 2025 00:34:43 +0200 Subject: [PATCH 10/13] 1.2.1 From ea915b797caf3fdc9fc0adefd3422010b62e5ff3 Mon Sep 17 00:00:00 2001 From: Za-Pa-Al <235132485+Za-Pa-Al@users.noreply.github.com> Date: Sat, 18 Oct 2025 01:10:05 +0200 Subject: [PATCH 11/13] Update badge link for latest version in README --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ce551a4..ee9051d 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,8 @@ - + +

--- From be5914bb71f8145f08d13e15021b194c97d42a0b Mon Sep 17 00:00:00 2001 From: Za-Pa-Al <235132485+Za-Pa-Al@users.noreply.github.com> Date: Sat, 18 Oct 2025 01:43:07 +0200 Subject: [PATCH 12/13] Revise README with installation and feature updates Updated installation instructions and added new features to the overview. --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ee9051d..7f109ee 100644 --- a/README.md +++ b/README.md @@ -14,10 +14,10 @@ The RedManager is a general tool for installing/uninstalling/updating different **:arrow_forward:[Original RedManager from ToniMacaroni](https://github.com/ToniMacaroni/RedManager):arrow_backward:** # Installation -Download RedModManager.exe and place the .exe in a folder OTHER then directly in "Sons Of The Forest\". -If placed next to file "Sons Of The Forest\SonsOfTheForest.exe" and subsequently next to folder "Sons Of The Forest\_Redloader", the .dlls in "Sons Of The Forest\_Redloader\" will likely cause a startup crash due to .NET conflicts. +Download RedModManager.exe from [Releases](https://github.com/Za-Pa-Al/RedManager/releases) and place the .exe in a folder OTHER then directly in Sons Of The Forest\\.
+For example you can safely place RedModManager.exe in Sons Of The Forest\RedModManager\\.
-For example you can safely place RedModManager.exe in "Sons Of The Forest\RedModManager\". +> **⚠️ IMPORTANT:** If placed in the same folder as Sons Of The Forest\\SonsOfTheForest.exe and subsequently in the same folder as Sons Of The Forest\\_Redloader, the .dlls in Sons Of The Forest\\_Redloader will likely cause a startup crash due to .NET conflicts. # Summary of Changes @@ -31,6 +31,8 @@ Enhancements to the RedModManager Tauri/Svelte application. - **Responsive Layout**: Optimal card display across all window sizes - **Fast Image Loading**: Cached thumbnails with optimization - **Window Memory**: Application remembers user's preferred size/position +- **Unknown Mods**: Unknown Mods are display in different color +- **Mod Urls**: Mod Urls are also displayed ## Technical From abb577ecf115c80b7585d2c91a050cc819779f4f Mon Sep 17 00:00:00 2001 From: Za-Pa-Al <235132485+Za-Pa-Al@users.noreply.github.com> Date: Sat, 18 Oct 2025 02:03:55 +0200 Subject: [PATCH 13/13] Update README title for clarity and context --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7f109ee..cc6b585 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# RedManager +# RedManager — Sons Of The Forest mod manager (fork)