diff options
123 files changed, 3831 insertions, 13123 deletions
@@ -1,4 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + # Node modules -node_modules/ -# Rust builds -target/ +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? @@ -50,3 +50,18 @@ If you want to add translations for a new language that does not exist in Flight ## Roadmap --> See https://github.com/R2NorthstarTools/FlightCore/issues/1 + +This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more. + +## Recommended IDE Setup + +- [VS Code](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer) + +## Type Support For `.vue` Imports in TS + +Since TypeScript cannot handle type information for `.vue` imports, they are shimmed to be a generic Vue component type by default. In most cases this is fine if you don't really care about component prop types outside of templates. However, if you wish to get actual prop types in `.vue` imports (for example to get props validation when using manual `h(...)` calls), you can enable Volar's Take Over mode by following these steps: + +1. Run `Extensions: Show Built-in Extensions` from VS Code's command palette, look for `TypeScript and JavaScript Language Features`, then right click and select `Disable (Workspace)`. By default, Take Over mode will enable itself if the default TypeScript extension is disabled. +2. Reload the VS Code window by running `Developer: Reload Window` from the command palette. + +You can learn more about Take Over mode [here](https://github.com/johnsoncodehk/volar/discussions/471). diff --git a/src-vue/index.html b/index.html index 143557b5..99f203f5 100644 --- a/src-vue/index.html +++ b/index.html @@ -1,11 +1,12 @@ -<!DOCTYPE html> +<!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> <link rel="icon" type="image/svg+xml" href="/vite.svg" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - <title>Vite + Vue + TS</title> + <title>Tauri + Vue + Typescript App</title> </head> + <body> <div id="app"></div> <script type="module" src="/src/main.ts"></script> diff --git a/package-lock.json b/package-lock.json index b0a4bd10..1ee2c792 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,36 +1,767 @@ { "name": "flightcore", + "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "flightcore", + "version": "0.1.0", "dependencies": { - "@tauri-apps/api": "^1.6.0" + "@tauri-apps/api": "^2", + "@tauri-apps/plugin-opener": "^2", + "vue": "^3.5.13" }, "devDependencies": { - "@tauri-apps/cli": "^1.6.0" + "@tauri-apps/cli": "^2", + "@vitejs/plugin-vue": "^5.2.1", + "typescript": "~5.6.2", + "vite": "^6.0.3", + "vue-tsc": "^2.1.10" } }, - "node_modules/@tauri-apps/api": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-1.6.0.tgz", - "integrity": "sha512-rqI++FWClU5I2UBp4HXFvl+sBWkdigBkxnpJDQUWttNyG7IZP4FwQGhTNL5EOw0vI8i6eSAJ5frLqO7n7jbJdg==", + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "license": "MIT", "engines": { - "node": ">= 14.6.0", - "npm": ">= 6.6.0", - "yarn": ">= 1.19.1" + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.3" }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.29.1.tgz", + "integrity": "sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.29.1.tgz", + "integrity": "sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.29.1.tgz", + "integrity": "sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.29.1.tgz", + "integrity": "sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.29.1.tgz", + "integrity": "sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.29.1.tgz", + "integrity": "sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.29.1.tgz", + "integrity": "sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.29.1.tgz", + "integrity": "sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.29.1.tgz", + "integrity": "sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.29.1.tgz", + "integrity": "sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.29.1.tgz", + "integrity": "sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.29.1.tgz", + "integrity": "sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.29.1.tgz", + "integrity": "sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.29.1.tgz", + "integrity": "sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.29.1.tgz", + "integrity": "sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.29.1.tgz", + "integrity": "sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.29.1.tgz", + "integrity": "sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.29.1.tgz", + "integrity": "sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.29.1.tgz", + "integrity": "sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tauri-apps/api": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.1.1.tgz", + "integrity": "sha512-fzUfFFKo4lknXGJq8qrCidkUcKcH2UHhfaaCNt4GzgzGaW2iS26uFOg4tS3H4P8D6ZEeUxtiD5z0nwFF0UN30A==", + "license": "Apache-2.0 OR MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/tauri" } }, "node_modules/@tauri-apps/cli": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.6.0.tgz", - "integrity": "sha512-DBBpBl6GhTzm8ImMbKkfaZ4fDTykWrC7Q5OXP4XqD91recmDEn2LExuvuiiS3HYe7uP8Eb5B9NPHhqJb+Zo7qQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.1.0.tgz", + "integrity": "sha512-K2VhcKqBhAeS5pNOVdnR/xQRU6jwpgmkSL2ejHXcl0m+kaTggT0WRDQnFtPq6NljA7aE03cvwsbCAoFG7vtkJw==", "dev": true, + "license": "Apache-2.0 OR MIT", "bin": { "tauri": "tauri.js" }, @@ -42,26 +773,27 @@ "url": "https://opencollective.com/tauri" }, "optionalDependencies": { - "@tauri-apps/cli-darwin-arm64": "1.6.0", - "@tauri-apps/cli-darwin-x64": "1.6.0", - "@tauri-apps/cli-linux-arm-gnueabihf": "1.6.0", - "@tauri-apps/cli-linux-arm64-gnu": "1.6.0", - "@tauri-apps/cli-linux-arm64-musl": "1.6.0", - "@tauri-apps/cli-linux-x64-gnu": "1.6.0", - "@tauri-apps/cli-linux-x64-musl": "1.6.0", - "@tauri-apps/cli-win32-arm64-msvc": "1.6.0", - "@tauri-apps/cli-win32-ia32-msvc": "1.6.0", - "@tauri-apps/cli-win32-x64-msvc": "1.6.0" + "@tauri-apps/cli-darwin-arm64": "2.1.0", + "@tauri-apps/cli-darwin-x64": "2.1.0", + "@tauri-apps/cli-linux-arm-gnueabihf": "2.1.0", + "@tauri-apps/cli-linux-arm64-gnu": "2.1.0", + "@tauri-apps/cli-linux-arm64-musl": "2.1.0", + "@tauri-apps/cli-linux-x64-gnu": "2.1.0", + "@tauri-apps/cli-linux-x64-musl": "2.1.0", + "@tauri-apps/cli-win32-arm64-msvc": "2.1.0", + "@tauri-apps/cli-win32-ia32-msvc": "2.1.0", + "@tauri-apps/cli-win32-x64-msvc": "2.1.0" } }, "node_modules/@tauri-apps/cli-darwin-arm64": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.6.0.tgz", - "integrity": "sha512-SNRwUD9nqGxY47mbY1CGTt/jqyQOU7Ps7Mx/mpgahL0FVUDiCEY/5L9QfEPPhEgccgcelEVn7i6aQHIkHyUtCA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.1.0.tgz", + "integrity": "sha512-ESc6J6CE8hl1yKH2vJ+ALF+thq4Be+DM1mvmTyUCQObvezNCNhzfS6abIUd3ou4x5RGH51ouiANeT3wekU6dCw==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "darwin" @@ -71,13 +803,14 @@ } }, "node_modules/@tauri-apps/cli-darwin-x64": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.6.0.tgz", - "integrity": "sha512-g2/uDR/eeH2arvuawA4WwaEOqv/7jDO/ZLNI3JlBjP5Pk8GGb3Kdy0ro1xQzF94mtk2mOnOXa4dMgAet4sUJ1A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.1.0.tgz", + "integrity": "sha512-TasHS442DFs8cSH2eUQzuDBXUST4ECjCd0yyP+zZzvAruiB0Bg+c8A+I/EnqCvBQ2G2yvWLYG8q/LI7c87A5UA==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "darwin" @@ -87,13 +820,14 @@ } }, "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.6.0.tgz", - "integrity": "sha512-EVwf4oRkQyG8BpSrk0gqO7oA0sDM2MdNDtJpMfleYFEgCxLIOGZKNqaOW3M7U+0Y4qikmG3TtRK+ngc8Ymtrjg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.1.0.tgz", + "integrity": "sha512-aP7ZBGNL4ny07Cbb6kKpUOSrmhcIK2KhjviTzYlh+pPhAptxnC78xQGD3zKQkTi2WliJLPmBYbOHWWQa57lQ9w==", "cpu": [ "arm" ], "dev": true, + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "linux" @@ -103,13 +837,14 @@ } }, "node_modules/@tauri-apps/cli-linux-arm64-gnu": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.6.0.tgz", - "integrity": "sha512-YdpY17cAySrhK9dX4BUVEmhAxE2o+6skIEFg8iN/xrDwRxhaNPI9I80YXPatUTX54Kx55T5++25VJG9+3iw83A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.1.0.tgz", + "integrity": "sha512-ZTdgD5gLeMCzndMT2f358EkoYkZ5T+Qy6zPzU+l5vv5M7dHVN9ZmblNAYYXmoOuw7y+BY4X/rZvHV9pcGrcanQ==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "linux" @@ -119,13 +854,14 @@ } }, "node_modules/@tauri-apps/cli-linux-arm64-musl": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.6.0.tgz", - "integrity": "sha512-4U628tuf2U8pMr4tIBJhEkrFwt+46dwhXrDlpdyWSZtnop5RJAVKHODm0KbWns4xGKfTW1F3r6sSv+2ZxLcISA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.1.0.tgz", + "integrity": "sha512-NzwqjUCilhnhJzusz3d/0i0F1GFrwCQbkwR6yAHUxItESbsGYkZRJk0yMEWkg3PzFnyK4cWTlQJMEU52TjhEzA==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "linux" @@ -135,13 +871,14 @@ } }, "node_modules/@tauri-apps/cli-linux-x64-gnu": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.6.0.tgz", - "integrity": "sha512-AKRzp76fVUaJyXj5KRJT9bJyhwZyUnRQU0RqIRqOtZCT5yr6qGP8rjtQ7YhCIzWrseBlOllc3Qvbgw3Yl0VQcA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.1.0.tgz", + "integrity": "sha512-TyiIpMEtZxNOQmuFyfJwaaYbg3movSthpBJLIdPlKxSAB2BW0VWLY3/ZfIxm/G2YGHyREkjJvimzYE0i37PnMA==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "linux" @@ -151,13 +888,14 @@ } }, "node_modules/@tauri-apps/cli-linux-x64-musl": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.6.0.tgz", - "integrity": "sha512-0edIdq6aMBTaRMIXddHfyAFL361JqulLLd2Wi2aoOie7DkQ2MYh6gv3hA7NB9gqFwNIGE+xtJ4BkXIP2tSGPlg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.1.0.tgz", + "integrity": "sha512-/dQd0TlaxBdJACrR72DhynWftzHDaX32eBtS5WBrNJ+nnNb+znM3gON6nJ9tSE9jgDa6n1v2BkI/oIDtypfUXw==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "linux" @@ -167,13 +905,14 @@ } }, "node_modules/@tauri-apps/cli-win32-arm64-msvc": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-1.6.0.tgz", - "integrity": "sha512-QwWpWk4ubcwJ1rljsRAmINgB2AwkyzZhpYbalA+MmzyYMREcdXWGkyixWbRZgqc6fEWEBmq5UG73qz5eBJiIKg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.1.0.tgz", + "integrity": "sha512-NdQJO7SmdYqOcE+JPU7bwg7+odfZMWO6g8xF9SXYCMdUzvM2Gv/AQfikNXz5yS7ralRhNFuW32i5dcHlxh4pDg==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "win32" @@ -183,13 +922,14 @@ } }, "node_modules/@tauri-apps/cli-win32-ia32-msvc": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.6.0.tgz", - "integrity": "sha512-Vtw0yxO9+aEFuhuxQ57ALG43tjECopRimRuKGbtZYDCriB/ty5TrT3QWMdy0dxBkpDTu3Rqsz30sbDzw6tlP3Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.1.0.tgz", + "integrity": "sha512-f5h8gKT/cB8s1ticFRUpNmHqkmaLutT62oFDB7N//2YTXnxst7EpMIn1w+QimxTvTk2gcx6EcW6bEk/y2hZGzg==", "cpu": [ "ia32" ], "dev": true, + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "win32" @@ -199,13 +939,14 @@ } }, "node_modules/@tauri-apps/cli-win32-x64-msvc": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.6.0.tgz", - "integrity": "sha512-h54FHOvGi7+LIfRchzgZYSCHB1HDlP599vWXQQJ/XnwJY+6Rwr2E5bOe/EhqoG8rbGkfK0xX3KPAvXPbUlmggg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.1.0.tgz", + "integrity": "sha512-P/+LrdSSb5Xbho1LRP4haBjFHdyPdjWvGgeopL96OVtrFpYnfC+RctB45z2V2XxqFk3HweDDxk266btjttfjGw==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 OR MIT", "optional": true, "os": [ "win32" @@ -213,6 +954,605 @@ "engines": { "node": ">= 10" } + }, + "node_modules/@tauri-apps/plugin-opener": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-opener/-/plugin-opener-2.2.2.tgz", + "integrity": "sha512-E/XIHKqGV+FT8PDdkfMETmgPUxcR79Rk8USuzbadD/ZdvsKCfQR5q+6rpZC9zEnG2wzi9lVQM4D3xwrtGGIB8A==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.0.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz", + "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.11.tgz", + "integrity": "sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.11" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.11.tgz", + "integrity": "sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.11.tgz", + "integrity": "sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.11", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", + "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/shared": "3.5.13", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", + "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", + "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.13", + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.11", + "postcss": "^8.4.48", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", + "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/language-core": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.1.10.tgz", + "integrity": "sha512-DAI289d0K3AB5TUG3xDp9OuQ71CnrujQwJrQnfuZDwo6eGNf0UoRlPuaVNO+Zrn65PC3j0oB2i7mNmVPggeGeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "~2.4.8", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^0.2.0", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz", + "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz", + "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", + "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.13", + "@vue/runtime-core": "3.5.13", + "@vue/shared": "3.5.13", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", + "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "vue": "3.5.13" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", + "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", + "license": "MIT" + }, + "node_modules/alien-signals": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.2.2.tgz", + "integrity": "sha512-cZIRkbERILsBOXTQmMrxc9hgpxglstn69zm+F1ARf4aPAzdAFYd6sBq87ErO0Fj3DV94tglcyHG5kQz9nDC/8A==", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.29.1.tgz", + "integrity": "sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.29.1", + "@rollup/rollup-android-arm64": "4.29.1", + "@rollup/rollup-darwin-arm64": "4.29.1", + "@rollup/rollup-darwin-x64": "4.29.1", + "@rollup/rollup-freebsd-arm64": "4.29.1", + "@rollup/rollup-freebsd-x64": "4.29.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.29.1", + "@rollup/rollup-linux-arm-musleabihf": "4.29.1", + "@rollup/rollup-linux-arm64-gnu": "4.29.1", + "@rollup/rollup-linux-arm64-musl": "4.29.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.29.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.29.1", + "@rollup/rollup-linux-riscv64-gnu": "4.29.1", + "@rollup/rollup-linux-s390x-gnu": "4.29.1", + "@rollup/rollup-linux-x64-gnu": "4.29.1", + "@rollup/rollup-linux-x64-musl": "4.29.1", + "@rollup/rollup-win32-arm64-msvc": "4.29.1", + "@rollup/rollup-win32-ia32-msvc": "4.29.1", + "@rollup/rollup-win32-x64-msvc": "4.29.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/source-map-js": { + "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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/vite": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.5.tgz", + "integrity": "sha512-akD5IAH/ID5imgue2DYhzsEwCi0/4VKY31uhMLEYJwPP4TiUp8pL5PIK+Wo7H8qT8JY9i+pVfPydcFPYD1EL7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "0.24.0", + "postcss": "^8.4.49", + "rollup": "^4.23.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", + "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-sfc": "3.5.13", + "@vue/runtime-dom": "3.5.13", + "@vue/server-renderer": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-tsc": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.1.10.tgz", + "integrity": "sha512-RBNSfaaRHcN5uqVqJSZh++Gy/YUzryuv9u1aFWhsammDJXNtUiJMNoJ747lZcQ68wUQFx6E73y4FY3D8E7FGMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "~2.4.8", + "@vue/language-core": "2.1.10", + "semver": "^7.5.4" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } } } } diff --git a/package.json b/package.json index b9a1cca1..ba3642e8 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,24 @@ { "name": "flightcore", + "private": true, + "version": "0.1.0", + "type": "module", "scripts": { + "dev": "vite", + "build": "vue-tsc --noEmit && vite build", + "preview": "vite preview", "tauri": "tauri" }, "dependencies": { - "@tauri-apps/api": "^1.6.0" + "vue": "^3.5.13", + "@tauri-apps/api": "^2", + "@tauri-apps/plugin-opener": "^2" }, "devDependencies": { - "@tauri-apps/cli": "^1.6.0" + "@vitejs/plugin-vue": "^5.2.1", + "typescript": "~5.6.2", + "vite": "^6.0.3", + "vue-tsc": "^2.1.10", + "@tauri-apps/cli": "^2" } } diff --git a/scripts/create-release-file.py b/scripts/create-release-file.py deleted file mode 100644 index 815fb6f9..00000000 --- a/scripts/create-release-file.py +++ /dev/null @@ -1,47 +0,0 @@ -# %% -import json -import datetime -import sys - -assert("--version" in sys.argv) - -version_number = sys.argv[2] -version_number_stripped_v = version_number.replace("v", "") - -PATH_TO_LINUX_SIG = f"./artifact/bundle/appimage/flight-core_{version_number_stripped_v}_amd64.AppImage.tar.gz.sig" -PATH_TO_WINDOWS_SIG = f"./artifact/bundle/msi/FlightCore_{version_number_stripped_v}_x64_en-US.msi.zip.sig" - -# Text to show in update notification -RELEASE_TEXT = "See the following link for release notes: https://github.com/R2NorthstarTools/FlightCore/releases" - -# Read signatures -with open(PATH_TO_LINUX_SIG, "rt") as f: - linux_sig = f.read() -with open(PATH_TO_WINDOWS_SIG, "rt") as f: - windows_sig = f.read() - - -current_datetime_string = str(datetime.datetime.utcnow().replace(microsecond=0).isoformat() + "Z") - -release_dict = { - "version": f"{version_number}", - "notes": f"{RELEASE_TEXT}", - "pub_date": current_datetime_string, - "platforms": { - "linux-x86_64": { - "signature": linux_sig, - "url": f"https://github.com/R2NorthstarTools/FlightCore/releases/download/{version_number}/flight-core_{version_number_stripped_v}_amd64.AppImage.tar.gz" - }, - "windows-x86_64": { - "signature": windows_sig, - "url": f"https://github.com/R2NorthstarTools/FlightCore/releases/download/{version_number}/FlightCore_{version_number_stripped_v}_x64_en-US.msi.zip" - } - } -} -json_string = json.dumps(release_dict, indent=4) -print(json_string) -# %% -RESULT_JSON_FILENAME = "latest-release.json" -with open(RESULT_JSON_FILENAME, "wt") as f: - f.write(json_string) -# %% diff --git a/src-tauri/.gitignore b/src-tauri/.gitignore new file mode 100644 index 00000000..b21bd681 --- /dev/null +++ b/src-tauri/.gitignore @@ -0,0 +1,7 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ + +# Generated by Tauri +# will have schema files for capabilities auto-completion +/gen/schemas diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index bf6d8e3a..1700ce57 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1,27 +1,27 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" -version = "0.20.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "aes" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", "cipher", @@ -30,9 +30,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.0.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -69,128 +69,120 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.89" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] -name = "arboard" -version = "3.2.1" +name = "arbitrary" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac57f2b058a76363e357c056e4f74f1945bf734d37b8b3ef49066c4787dde0fc" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" dependencies = [ - "clipboard-win", - "core-graphics", - "image", - "log", - "objc", - "objc-foundation", - "objc_id", - "parking_lot", - "thiserror", - "winapi", - "wl-clipboard-rs", - "x11rb", + "derive_arbitrary", ] [[package]] name = "arc-swap" -version = "1.6.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" [[package]] name = "async-broadcast" -version = "0.5.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" +checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" dependencies = [ "event-listener", + "event-listener-strategy", "futures-core", + "pin-project-lite", ] [[package]] name = "async-channel" -version = "1.9.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" dependencies = [ "concurrent-queue", - "event-listener", + "event-listener-strategy", "futures-core", + "pin-project-lite", ] [[package]] name = "async-executor" -version = "1.5.1" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" dependencies = [ - "async-lock", "async-task", "concurrent-queue", - "fastrand 1.9.0", + "fastrand", "futures-lite", "slab", ] [[package]] name = "async-fs" -version = "1.6.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" +checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" dependencies = [ "async-lock", - "autocfg", "blocking", "futures-lite", ] [[package]] name = "async-io" -version = "1.13.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" dependencies = [ "async-lock", - "autocfg", "cfg-if", "concurrent-queue", + "futures-io", "futures-lite", - "log", "parking", "polling", - "rustix 0.37.23", + "rustix", "slab", - "socket2 0.4.9", - "waker-fn", + "tracing", + "windows-sys 0.59.0", ] [[package]] name = "async-lock" -version = "2.7.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ "event-listener", + "event-listener-strategy", + "pin-project-lite", ] [[package]] name = "async-process" -version = "1.7.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9d28b1d97e08915212e2e45310d47854eafa69600756fc735fb788f75199c9" +checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" dependencies = [ + "async-channel", "async-io", "async-lock", - "autocfg", + "async-signal", + "async-task", "blocking", "cfg-if", "event-listener", "futures-lite", - "rustix 0.37.23", - "signal-hook", - "windows-sys 0.48.0", + "rustix", + "tracing", ] [[package]] @@ -201,94 +193,105 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", +] + +[[package]] +name = "async-signal" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.59.0", ] [[package]] name = "async-task" -version = "4.4.0" +version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.72" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "atk" -version = "0.15.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" dependencies = [ "atk-sys", - "bitflags 1.3.2", "glib", "libc", ] [[package]] name = "atk-sys" -version = "0.15.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.1.1", + "system-deps", ] [[package]] name = "atomic-waker" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.1.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" -version = "0.3.68" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[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 = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" - -[[package]] -name = "base64" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" @@ -304,9 +307,12 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.3.3" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +dependencies = [ + "serde", +] [[package]] name = "block" @@ -324,25 +330,32 @@ dependencies = [ ] [[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2", +] + +[[package]] name = "blocking" -version = "1.3.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" dependencies = [ "async-channel", - "async-lock", "async-task", - "atomic-waker", - "fastrand 1.9.0", + "futures-io", "futures-lite", - "log", + "piper", ] [[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", @@ -351,53 +364,37 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.3.4" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" +checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", ] [[package]] -name = "bstr" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" -dependencies = [ - "memchr", - "serde", -] - -[[package]] name = "bumpalo" -version = "3.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" - -[[package]] -name = "bytecount" -version = "0.6.7" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e5f035d16fc623ae5f74981db80a439803888314e3a555fd6f04acd51a3205" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.13.1" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" [[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.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" dependencies = [ "serde", ] @@ -425,46 +422,80 @@ dependencies = [ [[package]] name = "cairo-rs" -version = "0.15.12" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "cairo-sys-rs", "glib", "libc", - "thiserror", + "once_cell", + "thiserror 1.0.69", ] [[package]] name = "cairo-sys-rs" -version = "0.15.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" dependencies = [ "glib-sys", "libc", - "system-deps 6.1.1", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 1.0.69", ] [[package]] name = "cargo_toml" -version = "0.15.3" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "599aa35200ffff8f04c1925aa1acc92fa2e08874379ef42e210a80e527e60838" +checksum = "8a969e13a7589e9e3e4207e153bae624ade2b5622fb4684a4923b23ec3d57719" dependencies = [ "serde", - "toml 0.7.6", + "toml 0.8.2", ] [[package]] name = "cc" -version = "1.0.83" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" dependencies = [ "jobserver", "libc", + "shlex", ] [[package]] @@ -486,18 +517,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.9.1" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7" -dependencies = [ - "smallvec", -] - -[[package]] -name = "cfg-expr" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b40ccee03b5175c18cde8f37e7d2a33bcef6f8ec8f7cc0d81090d1bb380949c9" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" dependencies = [ "smallvec", "target-lexicon", @@ -510,10 +532,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] name = "chrono" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", @@ -521,7 +549,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] @@ -535,58 +563,40 @@ dependencies = [ ] [[package]] -name = "clipboard-win" -version = "4.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7191c27c2357d9b7ef96baac1773290d4ca63b24205b82a3fd8a0637afcf0362" -dependencies = [ - "error-code", - "str-buf", - "winapi", -] - -[[package]] name = "cocoa" -version = "0.24.1" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" +checksum = "f79398230a6e2c08f5c9760610eb6924b52aa9e7950a619602baba59dcbbdbb2" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "block", "cocoa-foundation", - "core-foundation", + "core-foundation 0.10.0", "core-graphics", - "foreign-types", + "foreign-types 0.5.0", "libc", "objc", ] [[package]] name = "cocoa-foundation" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "931d3837c286f56e3c58423ce4eba12d08db2374461a785c86f672b08b5650d6" +checksum = "e14045fb83be07b5acf1c0884b2180461635b433455fa35d1cd6f17f1450679d" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "block", - "core-foundation", + "core-foundation 0.10.0", "core-graphics-types", - "foreign-types", "libc", "objc", ] [[package]] -name = "color_quant" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -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", @@ -594,27 +604,27 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.2.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ "crossbeam-utils", ] [[package]] name = "const_format" -version = "0.2.33" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" dependencies = [ "const_format_proc_macros", ] [[package]] name = "const_format_proc_macros" -version = "0.2.33" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" dependencies = [ "proc-macro2", "quote", @@ -634,10 +644,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "time", + "version_check", +] + +[[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", +] + +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" dependencies = [ "core-foundation-sys", "libc", @@ -645,39 +675,39 @@ 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" -version = "0.22.3" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" dependencies = [ - "bitflags 1.3.2", - "core-foundation", + "bitflags 2.6.0", + "core-foundation 0.10.0", "core-graphics-types", - "foreign-types", + "foreign-types 0.5.0", "libc", ] [[package]] name = "core-graphics-types" -version = "0.1.2" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb142d41022986c1d8ff29103a1411c8a3dfad3552f87a4f8dc50d61d4f4e33" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 1.3.2", - "core-foundation", + "bitflags 2.6.0", + "core-foundation 0.10.0", "libc", ] [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] @@ -699,55 +729,46 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.8" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.15" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", - "memoffset 0.9.0", - "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crypto-common" @@ -783,24 +804,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "ctor" -version = "0.2.6" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d2b3721e861707777e3195b0158f950ae6dc4a27e4d02ff9f67e3eb3de199e" +checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "darling" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ "darling_core", "darling_macro", @@ -808,27 +829,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "darling_macro" -version = "0.20.3" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -863,27 +884,27 @@ dependencies = [ ] [[package]] -name = "derive-new" -version = "0.5.9" +name = "derive_arbitrary" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3418329ca0ad70234b9735dc4ceed10af4df60eff9c8e7b06cb5e520d92c3535" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.91", ] [[package]] name = "derive_more" -version = "0.99.17" +version = "0.99.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ "convert_case", "proc-macro2", "quote", "rustc_version", - "syn 1.0.109", + "syn 2.0.91", ] [[package]] @@ -907,16 +928,6 @@ dependencies = [ ] [[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] name = "dirs-sys" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -929,27 +940,53 @@ dependencies = [ ] [[package]] -name = "dirs-sys-next" -version = "0.1.2" +name = "dispatch" +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.91", +] + +[[package]] +name = "dlopen2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6" dependencies = [ + "dlopen2_derive", "libc", - "redox_users", + "once_cell", "winapi", ] [[package]] -name = "dispatch" -version = "0.2.0" +name = "dlopen2_derive" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" +checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] [[package]] -name = "downcast-rs" -version = "1.2.0" +name = "dpi" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" +dependencies = [ + "serde", +] [[package]] name = "dtoa" @@ -959,36 +996,43 @@ checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" [[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.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" [[package]] name = "either" -version = "1.9.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "embed-resource" -version = "2.2.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7f1e82a60222fc67bfd50d752a9c89da5cce4c39ed39decc84a443b07bbd69a" +checksum = "b68b6f9f63a0b6a38bc447d4ce84e2b388f3ec95c99c641c8ff0dd3ef89a6379" dependencies = [ "cc", + "memchr", "rustc_version", - "toml 0.7.6", + "toml 0.8.2", "vswhom", - "winreg 0.11.0", + "winreg 0.52.0", ] [[package]] @@ -999,18 +1043,24 @@ checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" [[package]] name = "encoding_rs" -version = "0.8.32" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] [[package]] +name = "endi" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" + +[[package]] name = "enumflags2" -version = "0.7.7" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c041f5090df68b32bcd905365fd51769c8b9d553fe87fde0b683534f10c01bd2" +checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" dependencies = [ "enumflags2_derive", "serde", @@ -1018,20 +1068,20 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.7" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" +checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "env_logger" -version = "0.10.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" dependencies = [ "humantime", "is-terminal", @@ -1047,62 +1097,57 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] -name = "errno" -version = "0.3.2" +name = "erased-serde" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" +checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d" dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys 0.48.0", + "serde", + "typeid", ] [[package]] -name = "errno-dragonfly" -version = "0.1.2" +name = "errno" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ - "cc", "libc", + "windows-sys 0.59.0", ] [[package]] -name = "error-code" -version = "2.3.1" +name = "event-listener" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" dependencies = [ - "libc", - "str-buf", + "concurrent-queue", + "parking", + "pin-project-lite", ] [[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "fastrand" -version = "1.9.0" +name = "event-listener-strategy" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" dependencies = [ - "instant", + "event-listener", + "pin-project-lite", ] [[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", ] @@ -1113,20 +1158,20 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" dependencies = [ - "memoffset 0.9.0", + "memoffset", "rustc_version", ] [[package]] name = "filetime" -version = "0.2.21" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.2.16", - "windows-sys 0.48.0", + "libredox", + "windows-sys 0.59.0", ] [[package]] @@ -1142,16 +1187,10 @@ dependencies = [ ] [[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[package]] name = "flate2" -version = "1.0.26" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "miniz_oxide", @@ -1171,7 +1210,7 @@ dependencies = [ "libthermite", "log", "octocrab", - "open 5.3.0", + "open", "pretty_env_logger", "rand 0.8.5", "regex", @@ -1186,12 +1225,12 @@ dependencies = [ "sysinfo", "tauri", "tauri-build", - "tauri-plugin-store", + "tauri-plugin-opener", "tokio", "ts-rs", "winapi", "winreg 0.52.0", - "zip", + "zip 0.6.6", "zip-extract", ] @@ -1207,7 +1246,28 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared", + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", ] [[package]] @@ -1217,10 +1277,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -1237,9 +1303,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.28" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1252,9 +1318,9 @@ dependencies = [ [[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", @@ -1262,15 +1328,15 @@ dependencies = [ [[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", @@ -1279,53 +1345,51 @@ 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-lite" -version = "1.13.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" dependencies = [ - "fastrand 1.9.0", + "fastrand", "futures-core", "futures-io", - "memchr", "parking", "pin-project-lite", - "waker-fn", ] [[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.90", + "syn 2.0.91", ] [[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", @@ -1350,11 +1414,10 @@ dependencies = [ [[package]] name = "gdk" -version = "0.15.4" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" dependencies = [ - "bitflags 1.3.2", "cairo-rs", "gdk-pixbuf", "gdk-sys", @@ -1366,35 +1429,35 @@ dependencies = [ [[package]] name = "gdk-pixbuf" -version = "0.15.11" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" dependencies = [ - "bitflags 1.3.2", "gdk-pixbuf-sys", "gio", "glib", "libc", + "once_cell", ] [[package]] name = "gdk-pixbuf-sys" -version = "0.15.10" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" dependencies = [ "gio-sys", "glib-sys", "gobject-sys", "libc", - "system-deps 6.1.1", + "system-deps", ] [[package]] name = "gdk-sys" -version = "0.15.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -1404,47 +1467,48 @@ dependencies = [ "libc", "pango-sys", "pkg-config", - "system-deps 6.1.1", + "system-deps", ] [[package]] name = "gdkwayland-sys" -version = "0.15.3" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cca49a59ad8cfdf36ef7330fe7bdfbe1d34323220cc16a0de2679ee773aee2c2" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" dependencies = [ "gdk-sys", "glib-sys", "gobject-sys", "libc", "pkg-config", - "system-deps 6.1.1", + "system-deps", ] [[package]] -name = "gdkx11-sys" -version = "0.15.1" +name = "gdkx11" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" dependencies = [ - "gdk-sys", - "glib-sys", + "gdk", + "gdkx11-sys", + "gio", + "glib", "libc", - "system-deps 6.1.1", "x11", ] [[package]] -name = "generator" -version = "0.7.5" +name = "gdkx11-sys" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" dependencies = [ - "cc", + "gdk-sys", + "glib-sys", "libc", - "log", - "rustversion", - "windows 0.48.0", + "system-deps", + "x11", ] [[package]] @@ -1458,16 +1522,6 @@ dependencies = [ ] [[package]] -name = "gethostname" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" -dependencies = [ - "libc", - "winapi", -] - -[[package]] name = "getrandom" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1480,9 +1534,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", @@ -1493,83 +1547,87 @@ dependencies = [ [[package]] name = "gimli" -version = "0.27.3" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "gio" -version = "0.15.12" +version = "0.18.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" dependencies = [ - "bitflags 1.3.2", "futures-channel", "futures-core", "futures-io", + "futures-util", "gio-sys", "glib", "libc", "once_cell", - "thiserror", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", ] [[package]] name = "gio-sys" -version = "0.15.10" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.1.1", + "system-deps", "winapi", ] [[package]] name = "glib" -version = "0.15.12" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "futures-channel", "futures-core", "futures-executor", "futures-task", + "futures-util", + "gio-sys", "glib-macros", "glib-sys", "gobject-sys", "libc", + "memchr", "once_cell", "smallvec", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "glib-macros" -version = "0.15.13" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" dependencies = [ - "anyhow", "heck 0.4.1", - "proc-macro-crate", + "proc-macro-crate 2.0.2", "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.91", ] [[package]] name = "glib-sys" -version = "0.15.10" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" dependencies = [ "libc", - "system-deps 6.1.1", + "system-deps", ] [[package]] @@ -1579,37 +1637,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] -name = "globset" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aca8bbd8e0707c1887a8bbb7e6b40e228f251ff5d62c8220a4a7a53c73aff006" -dependencies = [ - "aho-corasick", - "bstr", - "fnv", - "log", - "regex", -] - -[[package]] name = "gobject-sys" -version = "0.15.10" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" dependencies = [ "glib-sys", "libc", - "system-deps 6.1.1", + "system-deps", ] [[package]] name = "gtk" -version = "0.15.5" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" dependencies = [ "atk", - "bitflags 1.3.2", "cairo-rs", "field-offset", "futures-channel", @@ -1620,16 +1664,15 @@ dependencies = [ "gtk-sys", "gtk3-macros", "libc", - "once_cell", "pango", "pkg-config", ] [[package]] name = "gtk-sys" -version = "0.15.3" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" dependencies = [ "atk-sys", "cairo-sys-rs", @@ -1640,36 +1683,35 @@ dependencies = [ "gobject-sys", "libc", "pango-sys", - "system-deps 6.1.1", + "system-deps", ] [[package]] name = "gtk3-macros" -version = "0.15.6" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "684c0456c086e8e7e9af73ec5b84e35938df394712054550e81558d21c44ab0d" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" dependencies = [ - "anyhow", - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.91", ] [[package]] name = "h2" -version = "0.3.20" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", "futures-core", "futures-sink", "futures-util", - "http 0.2.9", - "indexmap 1.9.3", + "http 0.2.12", + "indexmap 2.7.0", "slab", "tokio", "tokio-util", @@ -1684,18 +1726,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" - -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "heck" @@ -1711,9 +1744,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.3.9" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" [[package]] name = "hex" @@ -1731,6 +1764,15 @@ dependencies = [ ] [[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] name = "hostname" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1757,77 +1799,71 @@ 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.14", ] [[package]] name = "http" -version = "1.0.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", - "itoa 1.0.9", + "itoa 1.0.14", ] [[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 0.2.9", + "http 0.2.12", "pin-project-lite", ] [[package]] name = "http-body" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.0.0", + "http 1.2.0", ] [[package]] name = "http-body-util" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http 1.0.0", - "http-body 1.0.0", + "http 1.2.0", + "http-body 1.0.1", "pin-project-lite", ] [[package]] -name = "http-range" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" - -[[package]] name = "httparse" -version = "1.8.0" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" @@ -1837,22 +1873,22 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[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", "futures-core", "futures-util", "h2", - "http 0.2.9", - "http-body 0.4.5", + "http 0.2.12", + "http-body 0.4.6", "httparse", "httpdate", - "itoa 1.0.9", + "itoa 1.0.14", "pin-project-lite", - "socket2 0.4.9", + "socket2", "tokio", "tower-service", "tracing", @@ -1861,18 +1897,19 @@ dependencies = [ [[package]] name = "hyper" -version = "1.1.0" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5aa53871fc917b1a9ed87b683a5d86db645e23acb32c2e0785a353e522fb75" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.0.0", - "http-body 1.0.0", + "http 1.2.0", + "http-body 1.0.1", "httparse", - "itoa 1.0.9", + "itoa 1.0.14", "pin-project-lite", + "smallvec", "tokio", "want", ] @@ -1884,11 +1921,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" dependencies = [ "futures-util", - "http 1.0.0", - "hyper 1.1.0", + "http 1.2.0", + "hyper 1.5.2", "hyper-util", "log", - "rustls 0.22.2", + "rustls 0.22.4", "rustls-native-certs", "rustls-pki-types", "tokio", @@ -1898,11 +1935,11 @@ dependencies = [ [[package]] name = "hyper-timeout" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3203a961e5c83b6f5498933e78b6b263e208c197b63e9c6c53cc82ffd3f63793" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "hyper 1.1.0", + "hyper 1.5.2", "hyper-util", "pin-project-lite", "tokio", @@ -1916,7 +1953,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper 0.14.27", + "hyper 0.14.32", "native-tls", "tokio", "tokio-native-tls", @@ -1930,7 +1967,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.1.0", + "hyper 1.5.2", "hyper-util", "native-tls", "tokio", @@ -1940,36 +1977,35 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.3" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.0.0", - "http-body 1.0.0", - "hyper 1.1.0", + "http 1.2.0", + "http-body 1.0.1", + "hyper 1.5.2", "pin-project-lite", - "socket2 0.5.5", + "socket2", "tokio", - "tower", "tower-service", "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.57" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows 0.48.0", + "windows-core 0.52.0", ] [[package]] @@ -1992,51 +2028,148 @@ dependencies = [ ] [[package]] -name = "ident_case" -version = "1.0.1" +name = "icu_collections" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] [[package]] -name = "idna" -version = "0.4.0" +name = "icu_locid" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", ] [[package]] -name = "ignore" -version = "0.4.20" +name = "icu_locid_transform" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" dependencies = [ - "globset", - "lazy_static", - "log", - "memchr", - "regex", - "same-file", - "thread_local", - "walkdir", - "winapi-util", + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", ] [[package]] -name = "image" -version = "0.24.6" +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527909aa81e20ac3a44803521443a765550f09b5130c2c2fa1ea59c2f8f50a3a" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" dependencies = [ - "bytemuck", - "byteorder", - "color_quant", - "num-rational", - "num-traits", - "png", - "tiff", + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", ] [[package]] @@ -2052,19 +2185,20 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.5" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown 0.15.2", + "serde", ] [[package]] name = "infer" -version = "0.13.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f551f8c3a39f68f986517db0d1759de85881894fdc7db798bd2a9df9cb04b7fc" +checksum = "bc150e5ce2330295b8616ce0e3f53250e53af31759a9dbedad1621ba29151847" dependencies = [ "cfb", ] @@ -2080,35 +2214,24 @@ dependencies = [ [[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 = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.48.0", -] - -[[package]] name = "ipnet" -version = "2.8.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "iri-string" -version = "0.7.0" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21859b667d66a4c1dacd9df0863b3efb65785474255face87f5bca39dd8407c0" +checksum = "dc0f0a572e8ffe56e2ff4f769f32ffe919282c3916799f8b68688b6030063bea" dependencies = [ "memchr", "serde", @@ -2125,13 +2248,13 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.9" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" dependencies = [ "hermit-abi", - "rustix 0.38.6", - "windows-sys 0.48.0", + "libc", + "windows-sys 0.52.0", ] [[package]] @@ -2152,15 +2275,15 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "javascriptcore-rs" -version = "0.16.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" dependencies = [ "bitflags 1.3.2", "glib", @@ -2169,28 +2292,30 @@ dependencies = [ [[package]] name = "javascriptcore-rs-sys" -version = "0.4.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 5.0.0", + "system-deps", ] [[package]] name = "jni" -version = "0.20.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" dependencies = [ "cesu8", + "cfg-if", "combine", "jni-sys", "log", - "thiserror", + "thiserror 1.0.69", "walkdir", + "windows-sys 0.45.0", ] [[package]] @@ -2201,38 +2326,33 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.26" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] [[package]] -name = "jpeg-decoder" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" - -[[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ + "once_cell", "wasm-bindgen", ] [[package]] name = "json-patch" -version = "1.2.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ff1e1486799e3f64129f8ccad108b38290df9cd7015cd31bed17239f0789d6" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" dependencies = [ + "jsonptr", "serde", "serde_json", - "thiserror", - "treediff", + "thiserror 1.0.69", ] [[package]] @@ -2247,21 +2367,42 @@ dependencies = [ ] [[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] name = "jsonwebtoken" -version = "9.2.0" +version = "9.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7ea04a7c5c055c175f189b6dc6ba036fd62306b58c66c9f6389036c503a3f4" +checksum = "b9ae10193d25051e74945f1ea2d0b42e03cc3b890f7e4cc5faa44997d808193f" dependencies = [ - "base64 0.21.2", + "base64 0.21.7", "js-sys", "pem", - "ring 0.17.7", + "ring", "serde", "serde_json", "simple_asn1", ] [[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.6.0", + "serde", + "unicode-segmentation", +] + +[[package]] name = "keyvalues-parser" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2269,7 +2410,7 @@ checksum = "7e4c8354918309196302015ac9cae43362f1a13d0d5c5539a33b4c2fd2cd6d25" dependencies = [ "pest", "pest_derive", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2280,7 +2421,7 @@ checksum = "0447866c47c00f8bd1949618e8f63017cf93e985b4684dc28d784527e2882390" dependencies = [ "keyvalues-parser", "serde", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2298,86 +2439,112 @@ dependencies = [ [[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 = "libappindicator" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] [[package]] name = "libc" -version = "0.2.153" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", + "redox_syscall", +] [[package]] name = "libthermite" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c27ac02c14161a4b0db739b37618d929d7f2af320c1f993e3d674599f77b79e7" +checksum = "878f5ca735da1a3365239d6fcb3a403c5cd347896e9a45d864b9fbfad727298e" dependencies = [ "flate2", "json5", - "lazy_static", "regex", "serde", "serde_json", "tar", - "thiserror", + "thiserror 1.0.69", "tracing", "ureq", - "zip", -] - -[[package]] -name = "line-wrap" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" -dependencies = [ - "safemem", + "zip 2.2.2", ] [[package]] name = "linux-raw-sys" -version = "0.3.8" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] -name = "linux-raw-sys" -version = "0.4.5" +name = "litemap" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", ] [[package]] -name = "log" -version = "0.4.22" +name = "lockfree-object-pool" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" [[package]] -name = "loom" -version = "0.5.6" +name = "log" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" -dependencies = [ - "cfg-if", - "generator", - "scoped-tls", - "serde", - "serde_json", - "tracing", - "tracing-subscriber", -] +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "mac" @@ -2386,19 +2553,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" [[package]] -name = "mac-notification-sys" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abc434554ad0e640d772f7f262aa28e61d485212533d3673abe5f3d1729bd42a" -dependencies = [ - "cc", - "dirs-next", - "objc-foundation", - "objc_id", - "time", -] - -[[package]] name = "malloc_buf" version = "0.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2422,15 +2576,6 @@ dependencies = [ ] [[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - -[[package]] name = "matches" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2438,33 +2583,15 @@ checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" [[package]] name = "memchr" -version = "2.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" - -[[package]] -name = "memoffset" -version = "0.6.5" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg", -] +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memoffset" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" -dependencies = [ - "autocfg", -] - -[[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", ] @@ -2476,46 +2603,52 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "minisign-verify" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "933dca44d65cdd53b355d0b73d380a2ff5da71f87f036053188bf1eab6a19881" - -[[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" dependencies = [ - "adler", + "adler2", "simd-adler32", ] [[package]] name = "mio" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi", "libc", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] [[package]] +name = "muda" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdae9c00e61cc0579bcac625e8ad22104c60548a025bfc972dc83868a28e1484" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror 1.0.69", + "windows-sys 0.59.0", +] + +[[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -2529,15 +2662,17 @@ dependencies = [ [[package]] name = "ndk" -version = "0.6.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "jni-sys", + "log", "ndk-sys", "num_enum", - "thiserror", + "raw-window-handle", + "thiserror 1.0.69", ] [[package]] @@ -2548,42 +2683,29 @@ checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" [[package]] name = "ndk-sys" -version = "0.3.0" +version = "0.6.0+11769913" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" dependencies = [ "jni-sys", ] [[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 = "nix" -version = "0.24.3" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "cfg-if", "libc", - "memoffset 0.6.5", -] - -[[package]] -name = "nix" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "libc", - "memoffset 0.7.1", - "static_assertions", + "memoffset", ] [[package]] @@ -2593,29 +2715,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" [[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "notify-rust" -version = "4.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bfa211d18e360f08e36c364308f394b5eb23a6629150690e109a916dc6f610e" -dependencies = [ - "log", - "mac-notification-sys", - "serde", - "tauri-winrt-notification", - "zbus", -] - -[[package]] name = "ntapi" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2625,22 +2724,11 @@ dependencies = [ ] [[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-bigint" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -2653,53 +2741,41 @@ checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.1" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", - "num-integer", "num-traits", ] [[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_enum" -version = "0.5.11" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" dependencies = [ "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.5.11" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 2.0.2", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.91", ] [[package]] @@ -2709,43 +2785,231 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ "malloc_buf", - "objc_exception", ] [[package]] -name = "objc-foundation" -version = "0.1.1" +name = "objc-sys" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" dependencies = [ - "block", - "objc", - "objc_id", + "cc", ] [[package]] -name = "objc_exception" -version = "0.1.2" +name = "objc2" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" dependencies = [ - "cc", + "objc-sys", + "objc2-encode", ] [[package]] -name = "objc_id" -version = "0.1.1" +name = "objc2-app-kit" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "objc", + "bitflags 2.6.0", + "block2", + "libc", + "objc2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2", + "objc2", + "objc2-contacts", + "objc2-foundation", +] + +[[package]] +name = "objc2-encode" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.6.0", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2", + "objc2", + "objc2-app-kit", + "objc2-foundation", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-image", + "objc2-core-location", + "objc2-foundation", + "objc2-link-presentation", + "objc2-quartz-core", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68bc69301064cebefc6c4c90ce9cba69225239e4b8ff99d445a2b5563797da65" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-app-kit", + "objc2-foundation", ] [[package]] name = "object" -version = "0.31.1" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] @@ -2758,17 +3022,17 @@ checksum = "68a8a3df00728324ad654ecd1ed449a60157c55b7ff8c109af3a35989687c367" dependencies = [ "arc-swap", "async-trait", - "base64 0.22.0", + "base64 0.22.1", "bytes", "cfg-if", "chrono", "either", "futures", "futures-util", - "http 1.0.0", - "http-body 1.0.0", + "http 1.2.0", + "http-body 1.0.1", "http-body-util", - "hyper 1.1.0", + "hyper 1.5.2", "hyper-rustls", "hyper-timeout", "hyper-util", @@ -2791,25 +3055,15 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" - -[[package]] -name = "open" -version = "3.2.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2078c0039e6a54a0c42c28faa984e115fb4c2d5bf2208f77d1961002df8576f8" -dependencies = [ - "pathdiff", - "windows-sys 0.42.0", -] +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "open" -version = "5.3.0" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a877bf6abd716642a53ef1b89fb498923a4afca5c754f9050b4d081c05c4b3" +checksum = "3ecd52f0b8d15c40ce4820aa251ed5de032e5d91fab27f7db2f40d42a8bdf69c" dependencies = [ "is-wsl", "libc", @@ -2818,13 +3072,13 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.55" +version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" +checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "cfg-if", - "foreign-types", + "foreign-types 0.3.2", "libc", "once_cell", "openssl-macros", @@ -2839,7 +3093,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -2850,9 +3104,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.90" +version = "0.9.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ "cc", "libc", @@ -2878,38 +3132,22 @@ dependencies = [ [[package]] name = "os_info" -version = "3.7.0" +version = "3.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "006e42d5b888366f1880eda20371fedde764ed2213dc8496f49622fa0c99cd5e" +checksum = "eb6651f4be5e39563c4fe5cc8326349eb99a25d805a3493f791d5bfd0269e430" dependencies = [ "log", "serde", - "winapi", -] - -[[package]] -name = "os_pipe" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae859aa07428ca9a929b936690f8b12dc5f11dd8c6992a18ca93919f28bc177" -dependencies = [ - "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[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" +version = "0.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" dependencies = [ - "bitflags 1.3.2", + "gio", "glib", "libc", "once_cell", @@ -2918,27 +3156,27 @@ dependencies = [ [[package]] name = "pango-sys" -version = "0.15.10" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.1.1", + "system-deps", ] [[package]] name = "parking" -version = "2.1.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -2946,15 +3184,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", + "redox_syscall", "smallvec", - "windows-targets 0.48.1", + "windows-targets 0.52.6", ] [[package]] @@ -2970,9 +3208,9 @@ dependencies = [ [[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 = "pbkdf2" @@ -2988,35 +3226,36 @@ dependencies = [ [[package]] name = "pem" -version = "3.0.3" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8fcc794035347fb64beda2d3b462595dd2753e3f268d89c5aae77e8cf2c310" +checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" dependencies = [ - "base64 0.21.2", + "base64 0.22.1", "serde", ] [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.2" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1acb4a4365a13f749a93f1a094a7805e5cfa0955373a9de860d962eaa3a5fe5a" +checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" dependencies = [ - "thiserror", + "memchr", + "thiserror 2.0.9", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.7.2" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "666d00490d4ac815001da55838c500eafb0320019bbaa44444137c48b443a853" +checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" dependencies = [ "pest", "pest_generator", @@ -3024,22 +3263,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.2" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ca01446f50dbda87c1786af8770d535423fa8a53aec03b8f4e3d7eb10e0929" +checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "pest_meta" -version = "2.7.2" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56af0a30af74d0445c0bf6d9d051c979b516a1a5af790d251daee76005420a48" +checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" dependencies = [ "once_cell", "pest", @@ -3047,16 +3286,6 @@ dependencies = [ ] [[package]] -name = "petgraph" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" -dependencies = [ - "fixedbitset", - "indexmap 2.2.5", -] - -[[package]] name = "phf" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3160,7 +3389,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -3192,29 +3421,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.4" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.4" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -3223,30 +3452,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "plist" -version = "1.5.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdc0001cfea3db57a2e24bc0d818e9e20e554b5f97fabb9bc231dc240269ae06" +checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" dependencies = [ - "base64 0.21.2", - "indexmap 1.9.3", - "line-wrap", - "quick-xml 0.29.0", + "base64 0.22.1", + "indexmap 2.7.0", + "quick-xml", "serde", "time", ] [[package]] name = "png" -version = "0.17.9" +version = "0.17.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59871cc5b6cce7eaccca5a802b4173377a1c2ba90654246789a8fa2334426d11" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -3257,18 +3496,17 @@ dependencies = [ [[package]] name = "polling" -version = "2.8.0" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" dependencies = [ - "autocfg", - "bitflags 1.3.2", "cfg-if", "concurrent-queue", - "libc", - "log", + "hermit-abi", "pin-project-lite", - "windows-sys 0.48.0", + "rustix", + "tracing", + "windows-sys 0.59.0", ] [[package]] @@ -3279,9 +3517,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "precomputed-hash" @@ -3306,7 +3547,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", - "toml_edit", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime", + "toml_edit 0.20.2", ] [[package]] @@ -3350,27 +3601,18 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.23.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11bafc859c6815fbaffbbbf4229ecb767ac913fecb27f9ad4343662e9ef099ea" -dependencies = [ - "memchr", -] - -[[package]] -name = "quick-xml" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81b9228215d82c7b61490fec1de287136b5de6f5700f6e58ea9ad61a7964ca51" +checksum = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2" dependencies = [ "memchr", ] [[package]] name = "quote" -version = "1.0.35" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -3435,7 +3677,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.15", ] [[package]] @@ -3458,15 +3700,15 @@ dependencies = [ [[package]] name = "raw-window-handle" -version = "0.5.2" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" [[package]] name = "rayon" -version = "1.8.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -3484,76 +3726,52 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", ] [[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", - "thiserror", + "getrandom 0.2.15", + "libredox", + "thiserror 1.0.69", ] [[package]] name = "regex" -version = "1.10.6" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.4", - "regex-syntax 0.8.2", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.4.4" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b7fa1134405e2ec9353fd416b17f8dacd46c473d7d3fd1cf202706a14eb792a" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.8.2" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "remove-markdown-links" @@ -3570,15 +3788,15 @@ version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ - "base64 0.21.2", + "base64 0.21.7", "bytes", "encoding_rs", "futures-core", "futures-util", "h2", - "http 0.2.9", - "http-body 0.4.5", - "hyper 0.14.27", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", "hyper-tls 0.5.0", "ipnet", "js-sys", @@ -3592,35 +3810,33 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 0.1.2", "system-configuration", "tokio", "tokio-native-tls", - "tokio-util", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", - "wasm-streams", "web-sys", "winreg 0.50.0", ] [[package]] name = "reqwest" -version = "0.12.4" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ - "base64 0.22.0", + "base64 0.22.1", "bytes", "futures-channel", "futures-core", "futures-util", - "http 1.0.0", - "http-body 1.0.0", + "http 1.2.0", + "http-body 1.0.1", "http-body-util", - "hyper 1.1.0", + "hyper 1.5.2", "hyper-tls 0.6.0", "hyper-util", "ipnet", @@ -3631,150 +3847,103 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls-pemfile 2.0.0", + "rustls-pemfile 2.2.0", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 1.0.2", "tokio", "tokio-native-tls", + "tokio-util", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", + "wasm-streams", "web-sys", - "winreg 0.52.0", -] - -[[package]] -name = "rfd" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0149778bd99b6959285b0933288206090c50e2327f47a9c463bfdbf45c8823ea" -dependencies = [ - "block", - "dispatch", - "glib-sys", - "gobject-sys", - "gtk-sys", - "js-sys", - "lazy_static", - "log", - "objc", - "objc-foundation", - "objc_id", - "raw-window-handle", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows 0.37.0", -] - -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin 0.5.2", - "untrusted 0.7.1", - "web-sys", - "winapi", + "windows-registry", ] [[package]] name = "ring" -version = "0.17.7" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", - "getrandom 0.2.10", + "cfg-if", + "getrandom 0.2.15", "libc", - "spin 0.9.8", - "untrusted 0.9.0", - "windows-sys 0.48.0", + "spin", + "untrusted", + "windows-sys 0.52.0", ] [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[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.37.23" +version = "0.38.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "errno", - "io-lifetimes", "libc", - "linux-raw-sys 0.3.8", - "windows-sys 0.48.0", -] - -[[package]] -name = "rustix" -version = "0.38.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee020b1716f0a80e2ace9b03441a749e402e86712f15f16fe8a8f75afac732f" -dependencies = [ - "bitflags 2.3.3", - "errno", - "libc", - "linux-raw-sys 0.4.5", - "windows-sys 0.48.0", + "linux-raw-sys", + "windows-sys 0.59.0", ] [[package]] name = "rustls" -version = "0.21.6" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1feddffcfcc0b33f5c6ce9a29e341e4cd59c3f78e7ee45f4a40c038b1d6cbb" +checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" dependencies = [ "log", - "ring 0.16.20", - "rustls-webpki 0.101.2", - "sct", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", ] [[package]] name = "rustls" -version = "0.22.2" +version = "0.23.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" +checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" dependencies = [ "log", - "ring 0.17.7", + "once_cell", + "ring", "rustls-pki-types", - "rustls-webpki 0.102.2", + "rustls-webpki", "subtle", "zeroize", ] [[package]] name = "rustls-native-certs" -version = "0.7.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" +checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" dependencies = [ "openssl-probe", - "rustls-pemfile 2.0.0", + "rustls-pemfile 2.2.0", "rustls-pki-types", "schannel", "security-framework", @@ -3786,73 +3955,40 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.2", + "base64 0.21.7", ] [[package]] name = "rustls-pemfile" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e4980fa29e4c4b212ffb3db068a564cbf560e51d3944b7c88bd8bf5bec64f4" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.21.2", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a716eb65e3158e90e17cd93d855216e27bde02745ab842f2cab4a39dba1bacf" - -[[package]] -name = "rustls-webpki" -version = "0.100.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6207cd5ed3d8dca7816f8f3725513a34609c0c765bf652b8c3cb4cfd87db46b" -dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", -] - -[[package]] -name = "rustls-webpki" -version = "0.101.2" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "513722fd73ad80a71f72b61009ea1b584bcfa1483ca93949c8f290298837fa59" -dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", -] +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" [[package]] name = "rustls-webpki" -version = "0.102.2" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ - "ring 0.17.7", + "ring", "rustls-pki-types", - "untrusted 0.9.0", + "untrusted", ] [[package]] -name = "rustversion" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" - -[[package]] name = "ryu" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" - -[[package]] -name = "safemem" -version = "0.3.3" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -3865,34 +4001,45 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.22" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] -name = "scoped-tls" -version = "1.0.1" +name = "schemars" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" +checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] [[package]] -name = "scopeguard" -version = "1.2.0" +name = "schemars_derive" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.91", +] [[package]] -name = "sct" -version = "0.7.0" +name = "scopeguard" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" -dependencies = [ - "ring 0.16.20", - "untrusted 0.7.1", -] +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "secrecy" @@ -3905,12 +4052,12 @@ dependencies = [ [[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", - "core-foundation", + "bitflags 2.6.0", + "core-foundation 0.9.4", "core-foundation-sys", "libc", "security-framework-sys", @@ -3918,9 +4065,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "1863fd3768cd83c56a7f60faa4dc0d403f1b6df0a38c3c25f44b7894e45370d5" dependencies = [ "core-foundation-sys", "libc", @@ -3948,9 +4095,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" dependencies = [ "serde", ] @@ -3963,7 +4110,7 @@ checksum = "00421ed8fa0c995f07cde48ba6c89e80f2b312f74ff637326f392fbfd23abe02" dependencies = [ "httpdate", "native-tls", - "reqwest 0.12.4", + "reqwest 0.12.9", "sentry-backtrace", "sentry-contexts", "sentry-core 0.32.3", @@ -4079,7 +4226,7 @@ dependencies = [ "rand 0.8.5", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "time", "url", "uuid", @@ -4096,7 +4243,7 @@ dependencies = [ "rand 0.8.5", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "time", "url", "uuid", @@ -4104,32 +4251,53 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.215" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" dependencies = [ "serde_derive", ] [[package]] +name = "serde-untagged" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2676ba99bd82f75cae5cbd2c8eda6fa0b8760f18978ea840e980dd5567b5c5b6" +dependencies = [ + "erased-serde", + "serde", + "typeid", +] + +[[package]] name = "serde_derive" -version = "1.0.215" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", ] [[package]] name = "serde_json" -version = "1.0.133" +version = "1.0.134" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" dependencies = [ - "indexmap 2.2.5", - "itoa 1.0.9", + "itoa 1.0.14", "memchr", "ryu", "serde", @@ -4137,30 +4305,30 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebd154a240de39fdebcf5775d2675c204d7c13cf39a4c697be6493c8e734337c" +checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" dependencies = [ - "itoa 1.0.9", + "itoa 1.0.14", "serde", ] [[package]] name = "serde_repr" -version = "0.1.16" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "serde_spanned" -version = "0.6.3" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -4172,22 +4340,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.9", + "itoa 1.0.14", "ryu", "serde", ] [[package]] name = "serde_with" -version = "3.1.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21e47d95bc83ed33b2ecf84f4187ad1ab9685d18ff28db000c99deac8ce180e3" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" dependencies = [ - "base64 0.21.2", + "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", + "indexmap 2.7.0", "serde", + "serde_derive", "serde_json", "serde_with_macros", "time", @@ -4195,14 +4365,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.1.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea3cee93715c2e266b9338b7544da68a9f24e227722ba482bd1c024367c77c65" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -4239,9 +4409,9 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", @@ -4250,9 +4420,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -4260,39 +4430,16 @@ dependencies = [ ] [[package]] -name = "sharded-slab" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shared_child" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0d94659ad3c2137fef23ae75b03d5241d633f8acded53d672decfa0e6e0caef" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "signal-hook" -version = "0.3.17" +name = "shlex" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" -dependencies = [ - "libc", - "signal-hook-registry", -] +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -4311,108 +4458,112 @@ checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" dependencies = [ "num-bigint", "num-traits", - "thiserror", + "thiserror 1.0.69", "time", ] [[package]] name = "siphasher" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] [[package]] name = "smallvec" -version = "1.11.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "snafu" -version = "0.8.1" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ed22871b3fe6eff9f1b48f6cbd54149ff8e9acd740dea9146092435f9c43bd3" +checksum = "223891c85e2a29c3fe8fb900c1fae5e69c2e42415e3177752e8718475efa5019" dependencies = [ "snafu-derive", ] [[package]] name = "snafu-derive" -version = "0.8.1" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4651148226ec36010993fcba6c3381552e8463e9f3e337b75af202b0688b5274" +checksum = "03c3c6b7927ffe7ecaa769ee0e3994da3b8cafc8f444578982c83ecb161af917" dependencies = [ - "heck 0.4.1", + "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "socket2" -version = "0.4.9" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", - "winapi", + "windows-sys 0.52.0", ] [[package]] -name = "socket2" -version = "0.5.5" +name = "softbuffer" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "18051cdd562e792cad055119e0cdb2cfc137e44e3987532e0f9659a77931bb08" dependencies = [ - "libc", - "windows-sys 0.48.0", + "bytemuck", + "cfg_aliases", + "core-graphics", + "foreign-types 0.5.0", + "js-sys", + "log", + "objc2", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall", + "wasm-bindgen", + "web-sys", + "windows-sys 0.59.0", ] [[package]] -name = "soup2" -version = "0.2.1" +name = "soup3" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" dependencies = [ - "bitflags 1.3.2", + "futures-channel", "gio", "glib", "libc", - "once_cell", - "soup2-sys", + "soup3-sys", ] [[package]] -name = "soup2-sys" -version = "0.2.0" +name = "soup3-sys" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" dependencies = [ - "bitflags 1.3.2", "gio-sys", "glib-sys", "gobject-sys", "libc", - "system-deps 5.0.0", + "system-deps", ] [[package]] name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" @@ -4424,15 +4575,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] -name = "state" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" -dependencies = [ - "loom", -] - -[[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -4440,25 +4582,19 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "steamlocate" -version = "2.0.0-beta.2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3b6a4810c4e7fecb0123a9a8ba99b335c17d92e636c265ef99108ee4734c812" +checksum = "cb96708f2e7cadc6c5bde3f3e12e3d6565bbd4d8b9e3da057035881c33136d9d" dependencies = [ "crc", - "dirs", + "home", "keyvalues-parser", "keyvalues-serde", "serde", - "winreg 0.51.0", + "winreg 0.52.0", ] [[package]] -name = "str-buf" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" - -[[package]] name = "string_cache" version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -4486,15 +4622,26 @@ dependencies = [ [[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 = "subtle" -version = "2.5.0" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "swift-rs" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] [[package]] name = "syn" @@ -4509,9 +4656,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.90" +version = "2.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035" dependencies = [ "proc-macro2", "quote", @@ -4525,16 +4672,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] -name = "sys-locale" -version = "0.2.4" +name = "sync_wrapper" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8a11bd9c338fdba09f7881ab41551932ad42e405f61d01e8406baea71c07aee" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ - "js-sys", - "libc", - "wasm-bindgen", - "web-sys", - "windows-sys 0.45.0", + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", ] [[package]] @@ -4559,7 +4713,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -4575,54 +4729,34 @@ dependencies = [ [[package]] name = "system-deps" -version = "5.0.0" +version = "6.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" dependencies = [ - "cfg-expr 0.9.1", - "heck 0.3.3", - "pkg-config", - "toml 0.5.11", - "version-compare 0.0.11", -] - -[[package]] -name = "system-deps" -version = "6.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30c2de8a4d8f4b823d634affc9cd2a74ec98c53a756f317e529a48046cbf71f3" -dependencies = [ - "cfg-expr 0.15.4", - "heck 0.4.1", + "cfg-expr", + "heck 0.5.0", "pkg-config", - "toml 0.7.6", - "version-compare 0.1.1", + "toml 0.8.2", + "version-compare", ] [[package]] name = "tao" -version = "0.16.2" +version = "0.30.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6d198e01085564cea63e976ad1566c1ba2c2e4cc79578e35d9f05521505e31" +checksum = "6682a07cf5bab0b8a2bd20d0a542917ab928b5edb75ebd4eda6b05cbaab872da" dependencies = [ - "bitflags 1.3.2", - "cairo-rs", - "cc", + "bitflags 2.6.0", "cocoa", - "core-foundation", + "core-foundation 0.10.0", "core-graphics", "crossbeam-channel", "dispatch", - "gdk", - "gdk-pixbuf", - "gdk-sys", + "dlopen2", + "dpi", "gdkwayland-sys", "gdkx11-sys", - "gio", - "glib", - "glib-sys", "gtk", - "image", "instant", "jni", "lazy_static", @@ -4634,34 +4768,33 @@ dependencies = [ "objc", "once_cell", "parking_lot", - "png", "raw-window-handle", "scopeguard", - "serde", "tao-macros", "unicode-segmentation", - "uuid", - "windows 0.39.0", - "windows-implement", + "url", + "windows 0.58.0", + "windows-core 0.58.0", + "windows-version", "x11-dl", ] [[package]] name = "tao-macros" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b27a4bcc5eb524658234589bdffc7e7bfb996dbae6ce9393bfd39cb4159b445" +checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.91", ] [[package]] name = "tar" -version = "0.4.39" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec96d2ffad078296368d46ff1cb309be1c23c513b4ab0e22a45de0185275ac96" +checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" dependencies = [ "filetime", "libc", @@ -4670,99 +4803,89 @@ 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.6.8" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77567d2b3b74de4588d544147142d02297f3eaa171a25a065252141d8597a516" +checksum = "e545de0a2dfe296fa67db208266cd397c5a55ae782da77973ef4c4fac90e9f2c" dependencies = [ "anyhow", - "base64 0.21.2", "bytes", - "cocoa", - "dirs-next", + "dirs", "dunce", "embed_plist", - "encoding_rs", - "flate2", "futures-util", - "getrandom 0.2.10", - "glib", + "getrandom 0.2.15", "glob", "gtk", "heck 0.5.0", - "http 0.2.9", - "ignore", - "indexmap 1.9.3", - "minisign-verify", - "nix 0.26.2", - "notify-rust", - "objc", - "once_cell", - "open 3.2.0", - "os_info", - "os_pipe", + "http 1.2.0", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", "percent-encoding", - "rand 0.8.5", + "plist", "raw-window-handle", - "regex", - "reqwest 0.11.27", - "rfd", - "semver", + "reqwest 0.12.9", "serde", "serde_json", "serde_repr", "serialize-to-javascript", - "shared_child", - "state", - "sys-locale", - "tar", + "swift-rs", + "tauri-build", "tauri-macros", "tauri-runtime", "tauri-runtime-wry", "tauri-utils", - "tempfile", - "thiserror", - "time", + "thiserror 2.0.9", "tokio", + "tray-icon", "url", - "uuid", + "urlpattern", "webkit2gtk", "webview2-com", - "windows 0.39.0", - "zip", + "window-vibrancy", + "windows 0.58.0", ] [[package]] name = "tauri-build" -version = "1.5.2" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab30cba12974d0f9b09794f61e72cad6da2142d3ceb81e519321bab86ce53312" +checksum = "7bd2a4bcfaf5fb9f4be72520eefcb61ae565038f8ccba2a497d8c28f463b8c01" dependencies = [ "anyhow", "cargo_toml", - "dirs-next", + "dirs", + "glob", "heck 0.5.0", "json-patch", + "schemars", "semver", "serde", "serde_json", "tauri-utils", "tauri-winres", + "toml 0.8.2", "walkdir", ] [[package]] name = "tauri-codegen" -version = "1.4.4" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1aed706708ff1200ec12de9cfbf2582b5d8ec05f6a7293911091effbd22036b" +checksum = "bf79faeecf301d3e969b1fae977039edb77a4c1f25cc0a961be298b54bff97cf" dependencies = [ - "base64 0.21.2", + "base64 0.22.1", "brotli", "ico", "json-patch", @@ -4770,98 +4893,130 @@ dependencies = [ "png", "proc-macro2", "quote", - "regex", "semver", "serde", "serde_json", "sha2", + "syn 2.0.91", "tauri-utils", - "thiserror", + "thiserror 2.0.9", "time", + "url", "uuid", "walkdir", ] [[package]] name = "tauri-macros" -version = "1.4.5" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b88f831d2973ae4f81a706a0004e67dac87f2e4439973bbe98efbd73825d8ede" +checksum = "c52027c8c5afb83166dacddc092ee8fff50772f9646d461d8c33ee887e447a03" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.91", "tauri-codegen", "tauri-utils", ] [[package]] -name = "tauri-plugin-store" -version = "0.0.0" -source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v1#4aeee08cde4cf8253b7b52c2204655ac8bb6769d" +name = "tauri-plugin" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e753f2a30933a9bbf0a202fa47d7cc4a3401f06e8d6dcc53b79aa62954828c79" dependencies = [ - "log", + "anyhow", + "glob", + "plist", + "schemars", + "serde", + "serde_json", + "tauri-utils", + "toml 0.8.2", + "walkdir", +] + +[[package]] +name = "tauri-plugin-opener" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63ac39033ef1bb4d52da4878c3d8ab6d80b0a569d69208c884e6d4d54eb427b9" +dependencies = [ + "dunce", + "glob", + "objc2-app-kit", + "objc2-foundation", + "open", + "schemars", "serde", "serde_json", "tauri", - "thiserror", + "tauri-plugin", + "thiserror 2.0.9", + "url", + "windows 0.58.0", + "zbus", ] [[package]] name = "tauri-runtime" -version = "0.14.4" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3068ed62b63dedc705558f4248c7ecbd5561f0f8050949859ea0db2326f26012" +checksum = "cce18d43f80d4aba3aa8a0c953bbe835f3d0f2370aca75e8dbb14bd4bab27958" dependencies = [ + "dpi", "gtk", - "http 0.2.9", - "http-range", - "rand 0.8.5", + "http 1.2.0", + "jni", "raw-window-handle", "serde", "serde_json", "tauri-utils", - "thiserror", + "thiserror 2.0.9", "url", - "uuid", - "webview2-com", - "windows 0.39.0", + "windows 0.58.0", ] [[package]] name = "tauri-runtime-wry" -version = "0.14.9" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c3db170233096aa30330feadcd895bf9317be97e624458560a20e814db7955" +checksum = "9f442a38863e10129ffe2cec7bd09c2dcf8a098a3a27801a476a304d5bb991d2" dependencies = [ - "arboard", - "cocoa", "gtk", + "http 1.2.0", + "jni", + "log", + "objc2", + "objc2-app-kit", + "objc2-foundation", "percent-encoding", - "rand 0.8.5", "raw-window-handle", + "softbuffer", + "tao", "tauri-runtime", "tauri-utils", - "uuid", + "url", "webkit2gtk", "webview2-com", - "windows 0.39.0", + "windows 0.58.0", "wry", ] [[package]] name = "tauri-utils" -version = "1.6.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2826db448309d382dac14d520f0c0a40839b87b57b977e59cf5f296b3ace6a93" +checksum = "9271a88f99b4adea0dc71d0baca4505475a0bbd139fb135f62958721aaa8fe54" dependencies = [ "brotli", + "cargo_metadata", "ctor", "dunce", "glob", - "heck 0.5.0", "html5ever", + "http 1.2.0", "infer", "json-patch", "kuchikiki", @@ -4870,14 +5025,20 @@ dependencies = [ "phf 0.11.2", "proc-macro2", "quote", + "regex", + "schemars", "semver", "serde", + "serde-untagged", "serde_json", "serde_with", - "thiserror", + "swift-rs", + "thiserror 2.0.9", + "toml 0.8.2", "url", + "urlpattern", + "uuid", "walkdir", - "windows-version", ] [[package]] @@ -4887,30 +5048,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5993dc129e544393574288923d1ec447c857f3f644187f4fbf7d9a875fbfc4fb" dependencies = [ "embed-resource", - "toml 0.7.6", -] - -[[package]] -name = "tauri-winrt-notification" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5bff1d532fead7c43324a0fa33643b8621a47ce2944a633be4cb6c0240898f" -dependencies = [ - "quick-xml 0.23.1", - "windows 0.39.0", + "toml 0.7.8", ] [[package]] name = "tempfile" -version = "3.7.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5486094ee78b2e5038a6382ed7645bc084dc2ec433426ca4c3cb61e2007b8998" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", - "fastrand 2.0.0", - "redox_syscall 0.3.5", - "rustix 0.38.6", - "windows-sys 0.48.0", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", ] [[package]] @@ -4926,9 +5077,9 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.2.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" dependencies = [ "winapi-util", ] @@ -4941,53 +5092,52 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" [[package]] name = "thiserror" -version = "1.0.58" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", ] [[package]] -name = "thiserror-impl" -version = "1.0.58" +name = "thiserror" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.90", + "thiserror-impl 2.0.9", ] [[package]] -name = "thread_local" -version = "1.1.7" +name = "thiserror-impl" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "cfg-if", - "once_cell", + "proc-macro2", + "quote", + "syn 2.0.91", ] [[package]] -name = "tiff" -version = "0.8.1" +name = "thiserror-impl" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7449334f9ff2baf290d55d73983a7d6fa15e01198faef72af07e2a8db851e471" +checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" dependencies = [ - "flate2", - "jpeg-decoder", - "weezl", + "proc-macro2", + "quote", + "syn 2.0.91", ] [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", - "itoa 1.0.9", + "itoa 1.0.14", "num-conv", "powerfmt", "serde", @@ -5003,34 +5153,29 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", ] [[package]] -name = "tinyvec" -version = "1.6.0" +name = "tinystr" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 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.39.2" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", "bytes", @@ -5039,7 +5184,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.5", + "socket2", "tokio-macros", "windows-sys 0.52.0", ] @@ -5052,7 +5197,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] @@ -5071,44 +5216,46 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" dependencies = [ - "rustls 0.22.2", + "rustls 0.22.4", "rustls-pki-types", "tokio", ] [[package]] name = "tokio-util" -version = "0.7.8" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] name = "toml" -version = "0.5.11" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" dependencies = [ "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.19.15", ] [[package]] name = "toml" -version = "0.7.6" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_edit 0.20.2", ] [[package]] @@ -5122,11 +5269,24 @@ dependencies = [ [[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.2.5", + "indexmap 2.7.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.7.0", "serde", "serde_spanned", "toml_datetime", @@ -5152,15 +5312,15 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0da193277a4e2c33e59e09b5861580c33dd0a637c3883d0fa74ba40c0374af2e" +checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" dependencies = [ - "bitflags 2.3.3", + "bitflags 2.6.0", "bytes", "futures-util", - "http 1.0.0", - "http-body 1.0.0", + "http 1.2.0", + "http-body 1.0.1", "http-body-util", "iri-string", "pin-project-lite", @@ -5172,23 +5332,22 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[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", "log", "pin-project-lite", "tracing-attributes", @@ -5197,124 +5356,109 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.26" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", ] [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", ] [[package]] -name = "tracing-log" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" -dependencies = [ - "lazy_static", - "log", - "tracing-core", -] - -[[package]] name = "tracing-subscriber" -version = "0.3.17" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", "tracing-core", - "tracing-log", ] [[package]] -name = "tree_magic_mini" -version = "3.0.3" +name = "tray-icon" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91adfd0607cacf6e4babdb870e9bec4037c1c4b151cfd279ccefc5e0c7feaa6d" +checksum = "d48a05076dd272615d03033bf04f480199f7d1b66a8ac64d75c625fc4a70c06b" dependencies = [ - "bytecount", - "fnv", - "lazy_static", - "nom", + "core-graphics", + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", "once_cell", - "petgraph", -] - -[[package]] -name = "treediff" -version = "4.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52984d277bdf2a751072b5df30ec0377febdb02f7696d64c2d7d54630bac4303" -dependencies = [ - "serde_json", + "png", + "serde", + "thiserror 1.0.69", + "windows-sys 0.59.0", ] [[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 = "ts-rs" -version = "10.0.0" +version = "10.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a2f31991cee3dce1ca4f929a8a04fdd11fd8801aac0f2030b0fa8a0a3fef6b9" +checksum = "e640d9b0964e9d39df633548591090ab92f7a4567bc31d3891af23471a3365c6" dependencies = [ "lazy_static", - "thiserror", + "thiserror 2.0.9", "ts-rs-macros", ] [[package]] name = "ts-rs-macros" -version = "10.0.0" +version = "10.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea0b99e8ec44abd6f94a18f28f7934437809dd062820797c52401298116f70e" +checksum = "0e9d8656589772eeec2cf7a8264d9cda40fb28b9bc53118ceb9e8c07f8f38730" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "termcolor", ] [[package]] +name = "typeid" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e" + +[[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "uds_windows" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce65604324d3cce9b966701489fbd0cf318cb1f7bd9dd07ac9a4ee6fb791930d" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" dependencies = [ + "memoffset", "tempfile", "winapi", ] @@ -5329,43 +5473,63 @@ dependencies = [ ] [[package]] -name = "unicode-bidi" -version = "0.3.13" +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" [[package]] -name = "unicode-ident" -version = "1.0.11" +name = "unic-common" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" [[package]] -name = "unicode-normalization" -version = "0.1.22" +name = "unic-ucd-ident" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" dependencies = [ - "tinyvec", + "unic-char-property", + "unic-char-range", + "unic-ucd-version", ] [[package]] -name = "unicode-segmentation" -version = "1.10.1" +name = "unic-ucd-version" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] [[package]] -name = "unicode-xid" -version = "0.2.4" +name = "unicode-ident" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] -name = "untrusted" -version = "0.7.1" +name = "unicode-segmentation" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "untrusted" @@ -5375,26 +5539,26 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "2.7.1" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b11c96ac7ee530603dcdf68ed1557050f374ce55a5a07193ebf8cbc9f8927e9" +checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" dependencies = [ - "base64 0.21.2", + "base64 0.22.1", "flate2", "log", "native-tls", "once_cell", - "rustls 0.21.6", - "rustls-webpki 0.100.1", + "rustls 0.23.20", + "rustls-pki-types", "url", "webpki-roots", ] [[package]] name = "url" -version = "2.4.0" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", @@ -5403,18 +5567,42 @@ dependencies = [ ] [[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] name = "utf-8" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[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.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ - "getrandom 0.2.10", + "getrandom 0.2.15", "serde", ] @@ -5432,21 +5620,15 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version-compare" -version = "0.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -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" @@ -5469,16 +5651,10 @@ dependencies = [ ] [[package]] -name = "waker-fn" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" - -[[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", @@ -5507,46 +5683,47 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.37" +version = "0.4.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5554,28 +5731,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.91", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "wasm-streams" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" dependencies = [ "futures-util", "js-sys", @@ -5585,69 +5762,10 @@ dependencies = [ ] [[package]] -name = "wayland-client" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" -dependencies = [ - "bitflags 1.3.2", - "downcast-rs", - "libc", - "nix 0.24.3", - "wayland-commons", - "wayland-scanner", - "wayland-sys", -] - -[[package]] -name = "wayland-commons" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902" -dependencies = [ - "nix 0.24.3", - "once_cell", - "smallvec", - "wayland-sys", -] - -[[package]] -name = "wayland-protocols" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" -dependencies = [ - "bitflags 1.3.2", - "wayland-client", - "wayland-commons", - "wayland-scanner", -] - -[[package]] -name = "wayland-scanner" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" -dependencies = [ - "proc-macro2", - "quote", - "xml-rs", -] - -[[package]] -name = "wayland-sys" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4" -dependencies = [ - "pkg-config", -] - -[[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" dependencies = [ "js-sys", "wasm-bindgen", @@ -5655,9 +5773,9 @@ dependencies = [ [[package]] name = "webkit2gtk" -version = "0.18.2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370" +checksum = "76b1bc1e54c581da1e9f179d0b38512ba358fb1af2d634a1affe42e37172361a" dependencies = [ "bitflags 1.3.2", "cairo-rs", @@ -5673,20 +5791,18 @@ dependencies = [ "javascriptcore-rs", "libc", "once_cell", - "soup2", + "soup3", "webkit2gtk-sys", ] [[package]] name = "webkit2gtk-sys" -version = "0.18.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" +checksum = "62daa38afc514d1f8f12b8693d30d5993ff77ced33ce30cd04deebc267a6d57c" dependencies = [ - "atk-sys", "bitflags 1.3.2", "cairo-sys-rs", - "gdk-pixbuf-sys", "gdk-sys", "gio-sys", "glib-sys", @@ -5694,66 +5810,57 @@ dependencies = [ "gtk-sys", "javascriptcore-rs-sys", "libc", - "pango-sys", "pkg-config", - "soup2-sys", - "system-deps 6.1.1", + "soup3-sys", + "system-deps", ] [[package]] name = "webpki-roots" -version = "0.23.1" +version = "0.26.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b03058f88386e5ff5310d9111d53f48b17d732b401aeb83a8d5190f2ac459338" +checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" dependencies = [ - "rustls-webpki 0.100.1", + "rustls-pki-types", ] [[package]] name = "webview2-com" -version = "0.19.1" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178" +checksum = "6f61ff3d9d0ee4efcb461b14eb3acfda2702d10dc329f339303fc3e57215ae2c" dependencies = [ "webview2-com-macros", "webview2-com-sys", - "windows 0.39.0", + "windows 0.58.0", + "windows-core 0.58.0", "windows-implement", + "windows-interface", ] [[package]] name = "webview2-com-macros" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" +checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.91", ] [[package]] name = "webview2-com-sys" -version = "0.19.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7" +checksum = "a3a3e2eeb58f82361c93f9777014668eb3d07e7d174ee4c819575a9208011886" dependencies = [ - "regex", - "serde", - "serde_json", - "thiserror", - "windows 0.39.0", - "windows-bindgen", - "windows-metadata", + "thiserror 1.0.69", + "windows 0.58.0", + "windows-core 0.58.0", ] [[package]] -name = "weezl" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" - -[[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -5771,20 +5878,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - -[[package]] -name = "winapi-wsapoll" -version = "0.1.1" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c17110f57155602a80dca10be03852116403c9ff3cd25b079d666f2aa3df6e" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "winapi", + "windows-sys 0.59.0", ] [[package]] @@ -5794,99 +5892,111 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows" -version = "0.37.0" +name = "window-vibrancy" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" +checksum = "3ea403deff7b51fff19e261330f71608ff2cdef5721d72b64180bb95be7c4150" dependencies = [ - "windows_aarch64_msvc 0.37.0", - "windows_i686_gnu 0.37.0", - "windows_i686_msvc 0.37.0", - "windows_x86_64_gnu 0.37.0", - "windows_x86_64_msvc 0.37.0", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", ] [[package]] name = "windows" -version = "0.39.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ - "windows-implement", - "windows_aarch64_msvc 0.39.0", - "windows_i686_gnu 0.39.0", - "windows_i686_msvc 0.39.0", - "windows_x86_64_gnu 0.39.0", - "windows_x86_64_msvc 0.39.0", + "windows-core 0.52.0", + "windows-targets 0.52.6", ] [[package]] name = "windows" -version = "0.48.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ - "windows-targets 0.48.1", + "windows-core 0.58.0", + "windows-targets 0.52.6", ] [[package]] -name = "windows" +name = "windows-core" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-core", - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] -name = "windows-bindgen" -version = "0.39.0" +name = "windows-core" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68003dbd0e38abc0fb85b939240f4bce37c43a5981d3df37ccbaaa981b47cb41" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" dependencies = [ - "windows-metadata", - "windows-tokens", + "windows-implement", + "windows-interface", + "windows-result", + "windows-strings", + "windows-targets 0.52.6", ] [[package]] -name = "windows-core" -version = "0.52.0" +name = "windows-implement" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ - "windows-targets 0.52.0", + "proc-macro2", + "quote", + "syn 2.0.91", ] [[package]] -name = "windows-implement" -version = "0.39.0" +name = "windows-interface" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ - "syn 1.0.109", - "windows-tokens", + "proc-macro2", + "quote", + "syn 2.0.91", ] [[package]] -name = "windows-metadata" -version = "0.39.0" +name = "windows-registry" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] [[package]] -name = "windows-sys" -version = "0.42.0" +name = "windows-result" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", ] [[package]] @@ -5904,7 +6014,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.1", + "windows-targets 0.48.5", ] [[package]] @@ -5913,7 +6023,16 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "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]] @@ -5933,47 +6052,42 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "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-tokens" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597" - -[[package]] name = "windows-version" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75aa004c988e080ad34aff5739c39d0312f4684699d6d71fc8a198d057b8b9b4" +checksum = "6998aa457c9ba8ff2fb9f13e9d2a930dabcea28f1d0ab94d687d8b3654844515" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] @@ -5984,27 +6098,15 @@ checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -6014,27 +6116,15 @@ checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" - -[[package]] -name = "windows_i686_gnu" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" - -[[package]] -name = "windows_i686_gnu" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -6044,27 +6134,21 @@ checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" - -[[package]] -name = "windows_i686_msvc" -version = "0.37.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] -name = "windows_i686_msvc" -version = "0.39.0" +name = "windows_i686_gnullvm" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -6074,27 +6158,15 @@ checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.39.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -6104,15 +6176,15 @@ checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -6122,27 +6194,15 @@ checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -6152,37 +6212,27 @@ checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.5.3" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46aab759304e4d7b2075a9aecba26228bb073ee8c50db796b2c72c676b5d807" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" dependencies = [ "memchr", ] [[package]] name = "winreg" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a1a57ff50e9b408431e8f97d5456f2807f8eb2a2cd79b06068fc87f8ecf189" -dependencies = [ - "cfg-if", - "winapi", -] - -[[package]] -name = "winreg" version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" @@ -6193,78 +6243,67 @@ dependencies = [ [[package]] name = "winreg" -version = "0.51.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "937f3df7948156640f46aacef17a70db0de5917bda9c92b0f751f3a955b588fc" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" dependencies = [ "cfg-if", "windows-sys 0.48.0", ] [[package]] -name = "winreg" -version = "0.52.0" +name = "write16" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" [[package]] -name = "wl-clipboard-rs" -version = "0.7.0" +name = "writeable" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "981a303dfbb75d659f6612d05a14b2e363c103d24f676a2d44a00d18507a1ad9" -dependencies = [ - "derive-new", - "libc", - "log", - "nix 0.24.3", - "os_pipe", - "tempfile", - "thiserror", - "tree_magic_mini", - "wayland-client", - "wayland-protocols", -] +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "wry" -version = "0.24.10" +version = "0.47.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00711278ed357350d44c749c286786ecac644e044e4da410d466212152383b45" +checksum = "61ce51277d65170f6379d8cda935c80e3c2d1f0ff712a123c8bddb11b31a4b73" dependencies = [ - "base64 0.13.1", - "block", - "cocoa", - "core-graphics", + "base64 0.22.1", + "block2", + "cookie", "crossbeam-channel", + "dpi", "dunce", - "gdk", - "gio", - "glib", + "gdkx11", "gtk", "html5ever", - "http 0.2.9", + "http 1.2.0", + "javascriptcore-rs", + "jni", "kuchikiki", "libc", - "log", - "objc", - "objc_id", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", "once_cell", - "serde", - "serde_json", + "percent-encoding", + "raw-window-handle", "sha2", - "soup2", - "tao", - "thiserror", + "soup3", + "tao-macros", + "thiserror 1.0.69", "url", "webkit2gtk", "webkit2gtk-sys", "webview2-com", - "windows 0.39.0", - "windows-implement", + "windows 0.58.0", + "windows-core 0.58.0", + "windows-version", + "x11-dl", ] [[package]] @@ -6289,57 +6328,55 @@ dependencies = [ ] [[package]] -name = "x11rb" -version = "0.10.1" +name = "xattr" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "592b4883219f345e712b3209c62654ebda0bb50887f330cbd018d0f654bfd507" +checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ - "gethostname", - "nix 0.24.3", - "winapi", - "winapi-wsapoll", - "x11rb-protocol", + "libc", + "linux-raw-sys", + "rustix", ] [[package]] -name = "x11rb-protocol" -version = "0.10.0" +name = "xdg-home" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56b245751c0ac9db0e006dc812031482784e434630205a93c73cfefcaabeac67" +checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" dependencies = [ - "nix 0.24.3", + "libc", + "windows-sys 0.59.0", ] [[package]] -name = "xattr" -version = "0.2.3" +name = "yoke" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" dependencies = [ - "libc", + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", ] [[package]] -name = "xdg-home" -version = "1.0.0" +name = "yoke-derive" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2769203cd13a0c6015d515be729c526d041e9cf2c0cc478d57faee85f40c6dcd" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ - "nix 0.26.2", - "winapi", + "proc-macro2", + "quote", + "syn 2.0.91", + "synstructure", ] [[package]] -name = "xml-rs" -version = "0.8.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" - -[[package]] name = "zbus" -version = "3.14.1" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31de390a2d872e4cd04edd71b425e29853f786dc99317ed72d73d6fcf5ebb948" +checksum = "7b8e3d6ae3342792a6cc2340e4394334c7402f3d793b390d2c5494a4032b3030" dependencies = [ "async-broadcast", "async-executor", @@ -6351,7 +6388,6 @@ dependencies = [ "async-task", "async-trait", "blocking", - "byteorder", "derivative", "enumflags2", "event-listener", @@ -6359,8 +6395,7 @@ dependencies = [ "futures-sink", "futures-util", "hex", - "nix 0.26.2", - "once_cell", + "nix", "ordered-stream", "rand 0.8.5", "serde", @@ -6369,7 +6404,7 @@ dependencies = [ "static_assertions", "tracing", "uds_windows", - "winapi", + "windows-sys 0.52.0", "xdg-home", "zbus_macros", "zbus_names", @@ -6378,11 +6413,11 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "3.14.1" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d1794a946878c0e807f55a397187c11fc7a038ba5d868e7db4f3bd7760bc9d" +checksum = "b7a3e850ff1e7217a3b7a07eba90d37fe9bb9e89a310f718afcde5885ca9b6d7" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "regex", @@ -6392,9 +6427,9 @@ dependencies = [ [[package]] name = "zbus_names" -version = "2.6.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb80bb776dbda6e23d705cf0123c3b95df99c4ebeaec6c2599d4a5419902b4a9" +checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" dependencies = [ "serde", "static_assertions", @@ -6402,10 +6437,74 @@ dependencies = [ ] [[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", + "synstructure", +] + +[[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] [[package]] name = "zip" @@ -6428,14 +6527,45 @@ dependencies = [ ] [[package]] +name = "zip" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae9c1ea7b3a5e1f4b922ff856a129881167511563dc219869afe3787fc0c1a45" +dependencies = [ + "arbitrary", + "crc32fast", + "crossbeam-utils", + "displaydoc", + "flate2", + "indexmap 2.7.0", + "memchr", + "thiserror 2.0.9", + "zopfli", +] + +[[package]] name = "zip-extract" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e109e5a291403b4c1e514d39f8a22d3f98d257e691a52bb1f16051bb1ffed63e" dependencies = [ "log", - "thiserror", - "zip", + "thiserror 1.0.69", + "zip 0.6.6", +] + +[[package]] +name = "zopfli" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5019f391bac5cf252e93bbcc53d039ffd62c7bfb7c150414d61369afe57e946" +dependencies = [ + "bumpalo", + "crc32fast", + "lockfree-object-pool", + "log", + "once_cell", + "simd-adler32", ] [[package]] @@ -6459,24 +6589,22 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.8+zstd.1.5.5" +version = "2.0.13+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" dependencies = [ "cc", - "libc", "pkg-config", ] [[package]] name = "zvariant" -version = "3.15.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44b291bee0d960c53170780af148dca5fa260a63cdd24f1962fa82e03e53338c" +checksum = "4e09e8be97d44eeab994d752f341e67b3b0d80512a8b315a0671d47232ef1b65" dependencies = [ - "byteorder", + "endi", "enumflags2", - "libc", "serde", "static_assertions", "zvariant_derive", @@ -6484,11 +6612,11 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "3.15.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934d7a7dfc310d6ee06c87ffe88ef4eca7d3e37bb251dece2ef93da8f17d8ecd" +checksum = "72a5857e2856435331636a9fbb415b09243df4521a267c5bedcd5289b4d5799e" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 1.0.109", @@ -6497,9 +6625,9 @@ dependencies = [ [[package]] name = "zvariant_utils" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200" +checksum = "00bedb16a193cc12451873fee2a1bc6550225acece0e36f333e68326c73c8172" dependencies = [ "proc-macro2", "quote", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 04fb84df..56e42487 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -5,25 +5,25 @@ description = "Mod-manager for Northstar" authors = ["https://github.com/R2NorthstarTools/FlightCore/graphs/contributors"] license = "MIT" repository = "https://github.com/R2NorthstarTools/FlightCore" -default-run = "flightcore" edition = "2021" -rust-version = "1.66" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -[profile.release] -# Keeps line tables in built binary -# c.f.: https://doc.rust-lang.org/cargo/reference/profiles.html#debug -# This is done to see line numbers in stack trace on sentry.io -debug = 1 +[lib] +# The `_lib` suffix may seem redundant but it is necessary +# to make the lib name unique and wouldn't conflict with the bin name. +# This seems to be only an issue on Windows, see https://github.com/rust-lang/cargo/issues/8519 +name = "tauri_app_lib" +crate-type = ["staticlib", "cdylib", "rlib"] [build-dependencies] -tauri-build = { version = "1.5", features = [] } +tauri-build = { version = "2", features = [] } [dependencies] serde_json = "1.0" serde = { version = "1.0", features = ["derive"] } -tauri = { version = "1.6", features = ["api-all", "dialog", "updater"] } +tauri = { version = "2", features = [] } +tauri-plugin-opener = "2" tokio = { version = "1", features = ["full"] } # Sentry (crash) logging sentry = "0.32" @@ -42,8 +42,6 @@ regex = "1.10" sysinfo = "0.30.13" # HTTP requests reqwest = { version = "0.11", features = ["blocking"] } -# Persistent store for settings -tauri-plugin-store = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" } # JSON5 parsing support (allows comments in JSON) json5 = "0.4.1" # Async recursion for recursive mod install @@ -78,11 +76,3 @@ remove-markdown-links = "1.0.0" # Windows API stuff winapi = "0.3.9" winreg = "0.52.0" - -[features] -# by default Tauri runs in production mode -# when `tauri dev` runs it is executed with `cargo run --no-default-features` if `devPath` is an URL -default = ["custom-protocol"] -# this feature is used used for production builds where `devPath` points to the filesystem -# DO NOT remove this -custom-protocol = ["tauri/custom-protocol"] diff --git a/src-tauri/bindings/CommitHead.ts b/src-tauri/bindings/CommitHead.ts deleted file mode 100644 index cdc00e39..00000000 --- a/src-tauri/bindings/CommitHead.ts +++ /dev/null @@ -1,4 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Repo } from "./Repo"; - -export type CommitHead = { sha: string, ref: string, repo: Repo, }; diff --git a/src-tauri/bindings/FlightCoreVersion.ts b/src-tauri/bindings/FlightCoreVersion.ts deleted file mode 100644 index b0b3d0cd..00000000 --- a/src-tauri/bindings/FlightCoreVersion.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -export type FlightCoreVersion = { tag_name: string, published_at: string, }; diff --git a/src-tauri/bindings/InstallProgress.ts b/src-tauri/bindings/InstallProgress.ts deleted file mode 100644 index c7c92542..00000000 --- a/src-tauri/bindings/InstallProgress.ts +++ /dev/null @@ -1,4 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { InstallState } from "./InstallState"; - -export type InstallProgress = { current_downloaded: bigint, total_size: bigint, state: InstallState, }; diff --git a/src-tauri/bindings/InstallState.ts b/src-tauri/bindings/InstallState.ts deleted file mode 100644 index d2a91860..00000000 --- a/src-tauri/bindings/InstallState.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -export type InstallState = "Downloading" | "Extracting" | "Done"; diff --git a/src-tauri/bindings/InstallType.ts b/src-tauri/bindings/InstallType.ts deleted file mode 100644 index 6ad43cb7..00000000 --- a/src-tauri/bindings/InstallType.ts +++ /dev/null @@ -1,6 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -/** - * Defines how Titanfall2 was installed (Steam, Origin, ...) - */ -export type InstallType = "STEAM" | "ORIGIN" | "EAPLAY" | "UNKNOWN"; diff --git a/src-tauri/bindings/NorthstarLaunchOptions.ts b/src-tauri/bindings/NorthstarLaunchOptions.ts deleted file mode 100644 index 6133f6c0..00000000 --- a/src-tauri/bindings/NorthstarLaunchOptions.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -export type NorthstarLaunchOptions = { launch_via_steam: boolean, bypass_checks: boolean, }; diff --git a/src-tauri/bindings/NorthstarMod.ts b/src-tauri/bindings/NorthstarMod.ts deleted file mode 100644 index cddd97d2..00000000 --- a/src-tauri/bindings/NorthstarMod.ts +++ /dev/null @@ -1,6 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -/** - * Object holding various information about a Northstar mod - */ -export type NorthstarMod = { name: string, version: string | null, thunderstore_mod_string: string | null, enabled: boolean, directory: string, }; diff --git a/src-tauri/bindings/NorthstarThunderstoreRelease.ts b/src-tauri/bindings/NorthstarThunderstoreRelease.ts deleted file mode 100644 index 10991793..00000000 --- a/src-tauri/bindings/NorthstarThunderstoreRelease.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -export type NorthstarThunderstoreRelease = { package: string, version: string, }; diff --git a/src-tauri/bindings/NorthstarThunderstoreReleaseWrapper.ts b/src-tauri/bindings/NorthstarThunderstoreReleaseWrapper.ts deleted file mode 100644 index 1da6a7da..00000000 --- a/src-tauri/bindings/NorthstarThunderstoreReleaseWrapper.ts +++ /dev/null @@ -1,4 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { NorthstarThunderstoreRelease } from "./NorthstarThunderstoreRelease"; - -export type NorthstarThunderstoreReleaseWrapper = { label: string, value: NorthstarThunderstoreRelease, }; diff --git a/src-tauri/bindings/Project.ts b/src-tauri/bindings/Project.ts deleted file mode 100644 index 5ab3c2b5..00000000 --- a/src-tauri/bindings/Project.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -export type Project = "FlightCore" | "Northstar"; diff --git a/src-tauri/bindings/PullRequestType.ts b/src-tauri/bindings/PullRequestType.ts deleted file mode 100644 index fdadddb0..00000000 --- a/src-tauri/bindings/PullRequestType.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -export type PullRequestType = "Mods" | "Launcher"; diff --git a/src-tauri/bindings/PullsApiResponseElement.ts b/src-tauri/bindings/PullsApiResponseElement.ts deleted file mode 100644 index c9a146d4..00000000 --- a/src-tauri/bindings/PullsApiResponseElement.ts +++ /dev/null @@ -1,4 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { CommitHead } from "./CommitHead"; - -export type PullsApiResponseElement = { number: bigint, title: string, url: string, head: CommitHead, html_url: string, labels: Array<string>, }; diff --git a/src-tauri/bindings/ReleaseInfo.ts b/src-tauri/bindings/ReleaseInfo.ts deleted file mode 100644 index 09a39ba5..00000000 --- a/src-tauri/bindings/ReleaseInfo.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -export type ReleaseInfo = { name: string, published_at: string, body: string, }; diff --git a/src-tauri/bindings/Repo.ts b/src-tauri/bindings/Repo.ts deleted file mode 100644 index 8430eb32..00000000 --- a/src-tauri/bindings/Repo.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -export type Repo = { full_name: string, }; diff --git a/src-tauri/bindings/Tag.ts b/src-tauri/bindings/Tag.ts deleted file mode 100644 index f51b3f26..00000000 --- a/src-tauri/bindings/Tag.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -export type Tag = { name: string, }; diff --git a/src-tauri/bindings/TagWrapper.ts b/src-tauri/bindings/TagWrapper.ts deleted file mode 100644 index d2f0009d..00000000 --- a/src-tauri/bindings/TagWrapper.ts +++ /dev/null @@ -1,7 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { Tag } from "./Tag"; - -/** - * Wrapper type needed for frontend - */ -export type TagWrapper = { label: string, value: Tag, }; diff --git a/src-tauri/bindings/ThunderstoreMod.ts b/src-tauri/bindings/ThunderstoreMod.ts deleted file mode 100644 index 88eafa4c..00000000 --- a/src-tauri/bindings/ThunderstoreMod.ts +++ /dev/null @@ -1,4 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { ThunderstoreModVersion } from "./ThunderstoreModVersion"; - -export type ThunderstoreMod = { name: string, full_name: string, owner: string, package_url: string, date_created: string, date_updated: string, uuid4: string, rating_score: number, is_pinned: boolean, is_deprecated: boolean, has_nsfw_content: boolean, categories: Array<string>, versions: Array<ThunderstoreModVersion>, }; diff --git a/src-tauri/bindings/ThunderstoreModVersion.ts b/src-tauri/bindings/ThunderstoreModVersion.ts deleted file mode 100644 index b01af408..00000000 --- a/src-tauri/bindings/ThunderstoreModVersion.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. - -export type ThunderstoreModVersion = { name: string, full_name: string, description: string, icon: string, version_number: string, dependencies: Array<string>, download_url: string, downloads: number, date_created: string, website_url: string, is_active: boolean, uuid4: string, file_size: bigint, }; diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json new file mode 100644 index 00000000..4cdbf49a --- /dev/null +++ b/src-tauri/capabilities/default.json @@ -0,0 +1,10 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "Capability for the main window", + "windows": ["main"], + "permissions": [ + "core:default", + "opener:default" + ] +} diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png Binary files differindex dd1c8674..6be5e50e 100644 --- a/src-tauri/icons/128x128.png +++ b/src-tauri/icons/128x128.png diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png Binary files differindex 63dda405..e81becee 100644 --- a/src-tauri/icons/128x128@2x.png +++ b/src-tauri/icons/128x128@2x.png diff --git a/src-tauri/icons/32x32.png b/src-tauri/icons/32x32.png Binary files differindex 9e6a9619..a437dd51 100644 --- a/src-tauri/icons/32x32.png +++ b/src-tauri/icons/32x32.png diff --git a/src-tauri/icons/Square107x107Logo.png b/src-tauri/icons/Square107x107Logo.png Binary files differindex 44bdc5cb..0ca4f271 100644 --- a/src-tauri/icons/Square107x107Logo.png +++ b/src-tauri/icons/Square107x107Logo.png diff --git a/src-tauri/icons/Square142x142Logo.png b/src-tauri/icons/Square142x142Logo.png Binary files differindex 4639579a..b81f8203 100644 --- a/src-tauri/icons/Square142x142Logo.png +++ b/src-tauri/icons/Square142x142Logo.png diff --git a/src-tauri/icons/Square150x150Logo.png b/src-tauri/icons/Square150x150Logo.png Binary files differindex fc585b6c..624c7bfb 100644 --- a/src-tauri/icons/Square150x150Logo.png +++ b/src-tauri/icons/Square150x150Logo.png diff --git a/src-tauri/icons/Square284x284Logo.png b/src-tauri/icons/Square284x284Logo.png Binary files differindex 7fdac591..c021d2ba 100644 --- a/src-tauri/icons/Square284x284Logo.png +++ b/src-tauri/icons/Square284x284Logo.png diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png Binary files differindex 1aeabb2b..62197002 100644 --- a/src-tauri/icons/Square30x30Logo.png +++ b/src-tauri/icons/Square30x30Logo.png diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png Binary files differindex 6c21253c..f9bc0483 100644 --- a/src-tauri/icons/Square310x310Logo.png +++ b/src-tauri/icons/Square310x310Logo.png diff --git a/src-tauri/icons/Square44x44Logo.png b/src-tauri/icons/Square44x44Logo.png Binary files differindex 91f14623..d5fbfb2a 100644 --- a/src-tauri/icons/Square44x44Logo.png +++ b/src-tauri/icons/Square44x44Logo.png diff --git a/src-tauri/icons/Square71x71Logo.png b/src-tauri/icons/Square71x71Logo.png Binary files differindex 9ab108b2..63440d79 100644 --- a/src-tauri/icons/Square71x71Logo.png +++ b/src-tauri/icons/Square71x71Logo.png diff --git a/src-tauri/icons/Square89x89Logo.png b/src-tauri/icons/Square89x89Logo.png Binary files differindex 8b24346c..f3f705af 100644 --- a/src-tauri/icons/Square89x89Logo.png +++ b/src-tauri/icons/Square89x89Logo.png diff --git a/src-tauri/icons/StoreLogo.png b/src-tauri/icons/StoreLogo.png Binary files differindex 750a8c9a..45563882 100644 --- a/src-tauri/icons/StoreLogo.png +++ b/src-tauri/icons/StoreLogo.png diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns Binary files differindex cdf5f46c..12a5bcee 100644 --- a/src-tauri/icons/icon.icns +++ b/src-tauri/icons/icon.icns diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico Binary files differindex 5d387285..b3636e4b 100644 --- a/src-tauri/icons/icon.ico +++ b/src-tauri/icons/icon.ico diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png Binary files differindex 3ab5b770..e1cd2619 100644 --- a/src-tauri/icons/icon.png +++ b/src-tauri/icons/icon.png diff --git a/src-tauri/src/constants.rs b/src-tauri/src/constants.rs deleted file mode 100644 index 3ad2d6e8..00000000 --- a/src-tauri/src/constants.rs +++ /dev/null @@ -1,60 +0,0 @@ -// This file stores various global constants values -use const_format::concatcp; -use std::time::Duration; - -/// FlightCore user agent for web requests -pub const APP_USER_AGENT: &str = concatcp!("FlightCore/", env!("CARGO_PKG_VERSION")); - -/// URL of the Northstar masterserver -pub const MASTER_SERVER_URL: &str = "https://northstar.tf"; - -/// server list endpoint -pub const SERVER_BROWSER_ENDPOINT: &str = "/client/servers"; - -/// List of core Northstar mods -pub const CORE_MODS: [&str; 3] = [ - "Northstar.Client", - "Northstar.Custom", - "Northstar.CustomServers", -]; - -/// List of Thunderstoremods that shouldn't be installable -/// as they behave different than common Squirrel mods -pub const BLACKLISTED_MODS: [&str; 3] = [ - "northstar-Northstar", - "northstar-NorthstarReleaseCandidate", - "ebkr-r2modman", -]; - -/// List of Thunderstoremods that have some specific install requirements that makes them different from standard mods -pub const MODS_WITH_SPECIAL_REQUIREMENTS: [&str; 1] = ["NanohmProtogen-VanillaPlus"]; - -/// Order in which the sections for release notes should be displayed -pub const SECTION_ORDER: [&str; 11] = [ - "feat", "fix", "docs", "style", "refactor", "build", "test", "i18n", "ci", "chore", "other", -]; - -/// Statistics (players and servers counts) refresh delay -pub const REFRESH_DELAY: Duration = Duration::from_secs(5 * 60); - -/// Flightcore repo name and org name on GitHub -pub const FLIGHTCORE_REPO_NAME: &str = "R2NorthstarTools/FlightCore"; - -/// Northstar release repo name and org name on GitHub -pub const NORTHSTAR_RELEASE_REPO_NAME: &str = "R2Northstar/Northstar"; - -/// NorthstarLauncher repo name on GitHub -pub const NORTHSTAR_LAUNCHER_REPO_NAME: &str = "NorthstarLauncher"; - -/// NorthstarMods repo name on GitHub -pub const NORTHSTAR_MODS_REPO_NAME: &str = "NorthstarMods"; - -/// URL to launcher commits API URL -pub const NS_LAUNCHER_COMMITS_API_URL: &str = - "https://api.github.com/repos/R2Northstar/NorthstarLauncher/commits"; - -/// Filename of DLL that Northstar uses -pub const NORTHSTAR_DLL: &str = "Northstar.dll"; - -/// Profile that Northstar defaults to and ships with -pub const NORTHSTAR_DEFAULT_PROFILE: &str = "R2Northstar"; diff --git a/src-tauri/src/development/mod.rs b/src-tauri/src/development/mod.rs deleted file mode 100644 index 7184904c..00000000 --- a/src-tauri/src/development/mod.rs +++ /dev/null @@ -1,84 +0,0 @@ -use crate::constants::NS_LAUNCHER_COMMITS_API_URL; -use crate::github::{ - pull_requests::{check_github_api, download_zip_into_memory, get_launcher_download_link}, - CommitInfo, -}; - -#[tauri::command] -pub async fn install_git_main(game_install_path: &str) -> Result<String, String> { - // Get list of commits - let commits: Vec<CommitInfo> = serde_json::from_value( - check_github_api(NS_LAUNCHER_COMMITS_API_URL) - .await - .expect("Failed request"), - ) - .unwrap(); - - // Get latest commit... - let latest_commit_sha = commits[0].sha.clone(); - // ...and according artifact download URL - let download_url = get_launcher_download_link(latest_commit_sha.clone()).await?; - - let archive = match download_zip_into_memory(download_url).await { - Ok(archive) => archive, - Err(err) => return Err(err.to_string()), - }; - - let extract_directory = format!( - "{}/___flightcore-temp/download-dir/launcher-pr-{}", - game_install_path, latest_commit_sha - ); - match std::fs::create_dir_all(extract_directory.clone()) { - Ok(_) => (), - Err(err) => { - return Err(format!( - "Failed creating temporary download directory: {}", - err - )) - } - }; - - let target_dir = std::path::PathBuf::from(extract_directory.clone()); // Doesn't need to exist - match zip_extract::extract(std::io::Cursor::new(archive), &target_dir, true) { - Ok(()) => (), - Err(err) => { - return Err(format!("Failed unzip: {}", err)); - } - }; - - // Copy only necessary files from temp dir - // Copy: - // - NorthstarLauncher.exe - // - Northstar.dll - let files_to_copy = vec!["NorthstarLauncher.exe", "Northstar.dll"]; - for file_name in files_to_copy { - let source_file_path = format!("{}/{}", extract_directory, file_name); - let destination_file_path = format!("{}/{}", game_install_path, file_name); - match std::fs::copy(source_file_path, destination_file_path) { - Ok(_result) => (), - Err(err) => { - return Err(format!( - "Failed to copy necessary file {} from temp dir: {}", - file_name, err - )) - } - }; - } - - // delete extract directory - match std::fs::remove_dir_all(&extract_directory) { - Ok(()) => (), - Err(err) => { - return Err(format!( - "Failed to delete temporary download directory: {}", - err - )) - } - } - - log::info!( - "All done with installing launcher from {}", - latest_commit_sha - ); - Ok(latest_commit_sha) -} diff --git a/src-tauri/src/github/mod.rs b/src-tauri/src/github/mod.rs deleted file mode 100644 index 9bc3f834..00000000 --- a/src-tauri/src/github/mod.rs +++ /dev/null @@ -1,312 +0,0 @@ -pub mod pull_requests; -pub mod release_notes; - -use crate::constants::{ - APP_USER_AGENT, FLIGHTCORE_REPO_NAME, NORTHSTAR_RELEASE_REPO_NAME, SECTION_ORDER, -}; -use regex::Regex; -use serde::{Deserialize, Serialize}; -use std::collections::HashMap; -use ts_rs::TS; - -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -pub struct Tag { - name: String, -} - -#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, TS)] -#[ts(export)] -pub enum Project { - FlightCore, - Northstar, -} - -/// Wrapper type needed for frontend -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -pub struct TagWrapper { - label: String, - value: Tag, -} - -#[derive(Debug, Deserialize)] -pub struct CommitInfo { - pub sha: String, - commit: Commit, - author: Option<CommitAuthor>, -} - -#[derive(Debug, Deserialize)] -struct Commit { - message: String, -} - -#[derive(Debug, Deserialize)] -struct CommitAuthor { - login: String, -} - -#[derive(Debug, Deserialize)] -struct Comparison { - commits: Vec<CommitInfo>, -} - -/// Get a list of tags on the FlightCore repo -#[tauri::command] -pub fn get_list_of_tags(project: Project) -> Result<Vec<TagWrapper>, String> { - // Set the repository name. - - // Create a `reqwest` client with a user agent. - let client = reqwest::blocking::Client::builder() - .user_agent(APP_USER_AGENT) - .build() - .unwrap(); - - // Switch repo to fetch from based on project - let repo_name = match project { - Project::FlightCore => FLIGHTCORE_REPO_NAME, - Project::Northstar => NORTHSTAR_RELEASE_REPO_NAME, - }; - - // Fetch the list of tags for the repository as a `Vec<Tag>`. - let tags_url = format!("https://api.github.com/repos/{}/tags", repo_name); - let tags: Vec<Tag> = client.get(tags_url).send().unwrap().json().unwrap(); - - // Map each `Tag` element to a `TagWrapper` element with the desired label and `Tag` value. - let tag_wrappers: Vec<TagWrapper> = tags - .into_iter() - .map(|tag| TagWrapper { - label: tag.name.clone(), - value: tag, - }) - .collect(); - - Ok(tag_wrappers) -} - -/// Use GitHub API to compare two tags of the same repo against each other and get the resulting changes -#[tauri::command] -pub fn compare_tags(project: Project, first_tag: Tag, second_tag: Tag) -> Result<String, String> { - match project { - Project::FlightCore => compare_tags_flightcore(first_tag, second_tag), - Project::Northstar => compare_tags_northstar(first_tag, second_tag), - } -} - -pub fn compare_tags_flightcore(first_tag: Tag, second_tag: Tag) -> Result<String, String> { - // Fetch the list of commits between the two tags. - - // Create a `reqwest` client with a user agent. - let client = reqwest::blocking::Client::builder() - .user_agent(APP_USER_AGENT) - .build() - .unwrap(); - - let repo = "R2NorthstarTools/FlightCore"; - - let mut full_patch_notes = "".to_string(); - - let mut patch_notes: Vec<String> = [].to_vec(); - println!("{}", repo); - // let repo = "R2Northstar/NorthstarLauncher"; - let comparison_url = format!( - "https://api.github.com/repos/{}/compare/{}...{}", - repo, first_tag.name, second_tag.name - ); - - let comparison: Comparison = client.get(comparison_url).send().unwrap().json().unwrap(); - let commits = comparison.commits; - - // Display the list of commits. - println!( - "Commits between {} and {}:", - first_tag.name, second_tag.name - ); - - // Iterate over all commits in the diff - for commit in commits { - println!( - " * {} : {}", - commit.sha, - commit.commit.message.split('\n').next().unwrap() - ); - patch_notes.push( - commit - .commit - .message - .split('\n') - .next() - .unwrap() - .to_string(), - ); - } - - full_patch_notes += &generate_flightcore_release_notes(patch_notes); - - Ok(full_patch_notes.to_string()) -} - -/// Generate release notes in the format used for FlightCore -fn generate_flightcore_release_notes(commits: Vec<String>) -> String { - let grouped_commits = group_commits_by_type(commits); - let mut release_notes = String::new(); - - // Go over commit types and generate notes - for commit_type in SECTION_ORDER { - if let Some(commit_list) = grouped_commits.get(commit_type) { - if !commit_list.is_empty() { - let section_title = match commit_type { - "feat" => "**Features:**", - "fix" => "**Bug Fixes:**", - "docs" => "**Documentation:**", - "style" => "**Code style changes:**", - "refactor" => "**Code Refactoring:**", - "build" => "**Build:**", - "ci" => "**Continuous integration changes:**", - "test" => "**Tests:**", - "chore" => "**Chores:**", - "i18n" => "**Translations:**", - _ => "**Other:**", - }; - - release_notes.push_str(&format!("{}\n", section_title)); - - for commit_message in commit_list { - release_notes.push_str(&format!("- {}\n", commit_message)); - } - - release_notes.push('\n'); - } - } - } - - let release_notes = release_notes.trim_end_matches('\n').to_string(); - release_notes -} - -/// Group semantic commit messages by type -/// Commmit messages that are not formatted accordingly are marked as "other" -fn group_commits_by_type(commits: Vec<String>) -> HashMap<String, Vec<String>> { - let mut grouped_commits: HashMap<String, Vec<String>> = HashMap::new(); - let mut other_commits: Vec<String> = vec![]; - - for commit in commits { - let commit_parts: Vec<&str> = commit.splitn(2, ':').collect(); - if commit_parts.len() == 2 { - let commit_type = commit_parts[0].to_lowercase(); - let commit_description = commit_parts[1].trim().to_string(); - - // Check if known commit type - if SECTION_ORDER.contains(&commit_type.as_str()) { - let commit_list = grouped_commits.entry(commit_type.to_string()).or_default(); - commit_list.push(commit_description); - } else { - // otherwise add to list of "other" - other_commits.push(commit.to_string()); - } - } else { - other_commits.push(commit.to_string()); - } - } - grouped_commits.insert("other".to_string(), other_commits); - - grouped_commits -} - -/// Compares two tags on Northstar repo and generates release notes over the diff in tags -/// over the 3 major repos (Northstar, NorthstarLauncher, NorthstarMods) -pub fn compare_tags_northstar(first_tag: Tag, second_tag: Tag) -> Result<String, String> { - // Fetch the list of commits between the two tags. - - // Create a `reqwest` client with a user agent. - let client = reqwest::blocking::Client::builder() - .user_agent(APP_USER_AGENT) - .build() - .unwrap(); - - let repos = [ - "R2Northstar/Northstar", - "R2Northstar/NorthstarLauncher", - "R2Northstar/NorthstarMods", - ]; - - let mut full_patch_notes = "".to_string(); - let mut authors_set = std::collections::HashSet::new(); - - for repo in repos { - full_patch_notes += &format!("{}\n\n", repo); - - let mut patch_notes: Vec<String> = [].to_vec(); - println!("{}", repo); - // let repo = "R2Northstar/NorthstarLauncher"; - let comparison_url = format!( - "https://api.github.com/repos/{}/compare/{}...{}", - repo, first_tag.name, second_tag.name - ); - - log::info!("Compare URL: {}", comparison_url.clone()); - let comparison: Comparison = client.get(&comparison_url).send().unwrap().json().unwrap(); - let commits = comparison.commits; - - // Display the list of commits. - println!( - "Commits between {} and {}:", - first_tag.name, second_tag.name - ); - - // - for commit in commits { - println!( - " * {} : {}", - commit.sha, - turn_pr_number_into_link(commit.commit.message.split('\n').next().unwrap(), repo) - ); - patch_notes.push(turn_pr_number_into_link( - commit.commit.message.split('\n').next().unwrap(), - repo, - )); - - // Store authors in set - if commit.author.is_some() { - authors_set.insert(commit.author.unwrap().login); - } - } - - full_patch_notes += &patch_notes.join("\n"); - full_patch_notes += "\n\n\n"; - } - - // Convert the set to a sorted vector. - let mut sorted_vec: Vec<String> = authors_set.into_iter().collect(); - sorted_vec.sort_by_key(|a| a.to_lowercase()); - - // Define a string to prepend to each element. - let prefix = "@"; - - // Create a new list with the prefix prepended to each element. - let prefixed_list: Vec<String> = sorted_vec.iter().map(|s| prefix.to_owned() + s).collect(); - - full_patch_notes += "**Contributors:**\n"; - full_patch_notes += &prefixed_list.join(" "); - - Ok(full_patch_notes.to_string()) -} - -/// Takes the commit title and repo slug and formats it as -/// `[commit title(SHORTENED_REPO#NUMBER)](LINK)` -fn turn_pr_number_into_link(input: &str, repo: &str) -> String { - // Extract `Mods/Launcher` from repo title - let last_line = repo - .split('/') - .next_back() - .unwrap() - .trim_start_matches("Northstar"); - // Extract PR number - let re = Regex::new(r"#(\d+)").unwrap(); - - // Generate pull request link - let pull_link = format!("https://github.com/{}/pull/", repo); - re.replace_all(input, format!("[{}#$1]({}$1)", last_line, pull_link)) - .to_string() -} diff --git a/src-tauri/src/github/pull_requests.rs b/src-tauri/src/github/pull_requests.rs deleted file mode 100644 index de733feb..00000000 --- a/src-tauri/src/github/pull_requests.rs +++ /dev/null @@ -1,398 +0,0 @@ -use crate::constants::{APP_USER_AGENT, NORTHSTAR_LAUNCHER_REPO_NAME, NORTHSTAR_MODS_REPO_NAME}; -use crate::repair_and_verify::check_is_valid_game_path; -use crate::GameInstall; -use anyhow::anyhow; -use serde::{Deserialize, Serialize}; -use std::fs::File; -use std::io; -use std::io::prelude::*; -use std::path::Path; -use ts_rs::TS; - -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -struct Repo { - full_name: String, -} - -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -struct CommitHead { - sha: String, - #[serde(rename = "ref")] - gh_ref: String, - repo: Repo, -} - -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -pub struct PullsApiResponseElement { - number: u64, - title: String, - url: String, - head: CommitHead, - html_url: String, - labels: Vec<String>, -} - -// GitHub API response JSON elements as structs -#[derive(Debug, Deserialize, Clone)] -struct WorkflowRun { - id: u64, - head_sha: String, -} -#[derive(Debug, Deserialize, Clone)] -struct ActionsRunsResponse { - workflow_runs: Vec<WorkflowRun>, -} - -#[derive(Debug, Deserialize, Clone)] -struct Artifact { - id: u64, - name: String, - workflow_run: WorkflowRun, -} - -#[derive(Debug, Deserialize, Clone)] -struct ArtifactsResponse { - artifacts: Vec<Artifact>, -} - -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -pub enum PullRequestType { - Mods, - Launcher, -} - -/// Parse pull requests from specified URL -pub async fn get_pull_requests( - repo: PullRequestType, -) -> Result<Vec<PullsApiResponseElement>, anyhow::Error> { - let repo = match repo { - PullRequestType::Mods => NORTHSTAR_MODS_REPO_NAME, - PullRequestType::Launcher => NORTHSTAR_LAUNCHER_REPO_NAME, - }; - - // Grab list of PRs - let octocrab = octocrab::instance(); - let page = octocrab - .pulls("R2Northstar", repo) - .list() - .state(octocrab::params::State::Open) - .per_page(50) // Only grab 50 PRs - .page(1u32) - .send() - .await?; - - // Iterate over pull request elements and insert into struct - let mut all_pull_requests: Vec<PullsApiResponseElement> = vec![]; - for item in page.items { - let repo = Repo { - full_name: item - .head - .repo - .ok_or(anyhow!("repo not found"))? - .full_name - .ok_or(anyhow!("full_name not found"))?, - }; - - let head = CommitHead { - sha: item.head.sha, - gh_ref: item.head.ref_field, - repo, - }; - - // Get labels and their names and put the into vector - let label_names: Vec<String> = item - .labels - .unwrap_or_else(Vec::new) - .into_iter() - .map(|label| label.name) - .collect(); - - // TODO there's probably a way to automatically serialize into the struct but I don't know yet how to - let elem = PullsApiResponseElement { - number: item.number, - title: item.title.ok_or(anyhow!("title not found"))?, - url: item.url, - head, - html_url: item - .html_url - .ok_or(anyhow!("html_url not found"))? - .to_string(), - labels: label_names, - }; - - all_pull_requests.push(elem); - } - - Ok(all_pull_requests) -} - -/// Gets either launcher or mods PRs -#[tauri::command] -pub async fn get_pull_requests_wrapper( - install_type: PullRequestType, -) -> Result<Vec<PullsApiResponseElement>, String> { - match get_pull_requests(install_type).await { - Ok(res) => Ok(res), - Err(err) => Err(err.to_string()), - } -} - -pub async fn check_github_api(url: &str) -> Result<serde_json::Value, Box<dyn std::error::Error>> { - let client = reqwest::Client::new(); - let res = client - .get(url) - .header(reqwest::header::USER_AGENT, APP_USER_AGENT) - .send() - .await - .unwrap() - .text() - .await - .unwrap(); - - let json: serde_json::Value = serde_json::from_str(&res).expect("JSON was not well-formatted"); - - Ok(json) -} - -/// Downloads a file from given URL into an array in memory -pub async fn download_zip_into_memory(download_url: String) -> Result<Vec<u8>, anyhow::Error> { - let client = reqwest::Client::builder() - .user_agent(APP_USER_AGENT) - .build()?; - - let response = client.get(download_url).send().await?; - - if !response.status().is_success() { - return Err(anyhow!("Request unsuccessful: {}", response.status())); - } - - let bytes = response.bytes().await?; - Ok(bytes.to_vec()) -} - -/// Gets GitHub download link of a mods PR -fn get_mods_download_link(pull_request: PullsApiResponseElement) -> Result<String, anyhow::Error> { - // {pr object} -> number == pr_number - // -> head -> ref - // -> repo -> full_name - - // Use repo and branch name to get download link - let download_url = format!( - "https://github.com/{}/archive/refs/heads/{}.zip", - pull_request.head.repo.full_name, // repo name - pull_request.head.gh_ref, // branch name - ); - - Ok(download_url) -} - -/// Gets `nightly.link` artifact download link of a launcher commit -#[tauri::command] -pub async fn get_launcher_download_link(commit_sha: String) -> Result<String, String> { - // Iterate over the first 10 pages of - for i in 1..=10 { - // Crossreference with runs API - let runs_response: ActionsRunsResponse = match check_github_api(&format!( - "https://api.github.com/repos/R2Northstar/NorthstarLauncher/actions/runs?page={}", - i - )) - .await - { - Ok(result) => serde_json::from_value(result).unwrap(), - Err(err) => return Err(format!("{}", err)), - }; - - // Cross-reference commit sha against workflow runs - for workflow_run in &runs_response.workflow_runs { - // If head commit sha of CI run matches the one passed to this function, grab CI output - if workflow_run.head_sha == commit_sha { - // Check artifacts - let api_url = format!("https://api.github.com/repos/R2Northstar/NorthstarLauncher/actions/runs/{}/artifacts", workflow_run.id); - let artifacts_response: ArtifactsResponse = serde_json::from_value( - check_github_api(&api_url).await.expect("Failed request"), - ) - .unwrap(); - - let multiple_artifacts = artifacts_response.artifacts.len() > 1; - - // Iterate over artifacts - for artifact in artifacts_response.artifacts { - if multiple_artifacts && !artifact.name.starts_with("NorthstarLauncher-MSVC") { - continue; - } - - // Make sure artifact and CI run commit head sha match - if artifact.workflow_run.head_sha == workflow_run.head_sha { - // Download artifact - return Ok(format!("https://nightly.link/R2Northstar/NorthstarLauncher/actions/artifacts/{}.zip", artifact.id)); - } - } - } - } - } - - Err(format!( - "Couldn't grab download link for \"{}\". Corresponding PR might be too old and therefore no CI build has been detected. Maybe ask author to update?", - commit_sha - )) -} - -/// Adds a batch file that allows for launching Northstar with mods PR profile -fn add_batch_file(game_install_path: &str) { - let batch_path = format!("{}/r2ns-launch-mod-pr-version.bat", game_install_path); - let path = Path::new(&batch_path); - let display = path.display(); - - // Open a file in write-only mode, returns `io::Result<File>` - let mut file = match File::create(path) { - Err(why) => panic!("couldn't create {}: {}", display, why), - Ok(file) => file, - }; - - // Write the string to `file`, returns `io::Result<()>` - let batch_file_content = - "NorthstarLauncher.exe -profile=R2Northstar-PR-test-managed-folder\r\n"; - - match file.write_all(batch_file_content.as_bytes()) { - Err(why) => panic!("couldn't write to {}: {}", display, why), - Ok(_) => log::info!("successfully wrote to {}", display), - } -} - -/// Downloads selected launcher PR and extracts it into game install path -#[tauri::command] -pub async fn apply_launcher_pr( - pull_request: PullsApiResponseElement, - game_install: GameInstall, -) -> Result<(), String> { - // Exit early if wrong game path - check_is_valid_game_path(&game_install.game_path)?; - - // get download link - let download_url = match get_launcher_download_link(pull_request.head.sha.clone()).await { - Ok(res) => res, - Err(err) => { - return Err(format!( - "Couldn't grab download link for PR \"{}\". {}", - pull_request.number, err - )) - } - }; - - let archive = match download_zip_into_memory(download_url).await { - Ok(archive) => archive, - Err(err) => return Err(err.to_string()), - }; - - let extract_directory = format!( - "{}/___flightcore-temp/download-dir/launcher-pr-{}", - game_install.game_path, pull_request.number - ); - match std::fs::create_dir_all(extract_directory.clone()) { - Ok(_) => (), - Err(err) => { - return Err(format!( - "Failed creating temporary download directory: {}", - err - )) - } - }; - - let target_dir = std::path::PathBuf::from(extract_directory.clone()); // Doesn't need to exist - match zip_extract::extract(io::Cursor::new(archive), &target_dir, true) { - Ok(()) => (), - Err(err) => { - return Err(format!("Failed unzip: {}", err)); - } - }; - - // Copy only necessary files from temp dir - // Copy: - // - NorthstarLauncher.exe - // - Northstar.dll - let files_to_copy = vec!["NorthstarLauncher.exe", "Northstar.dll"]; - for file_name in files_to_copy { - let source_file_path = format!("{}/{}", extract_directory, file_name); - let destination_file_path = format!("{}/{}", game_install.game_path, file_name); - match std::fs::copy(source_file_path, destination_file_path) { - Ok(_result) => (), - Err(err) => { - return Err(format!( - "Failed to copy necessary file {} from temp dir: {}", - file_name, err - )) - } - }; - } - - // delete extract directory - match std::fs::remove_dir_all(&extract_directory) { - Ok(()) => (), - Err(err) => { - return Err(format!( - "Failed to delete temporary download directory: {}", - err - )) - } - } - - log::info!("All done with installing launcher PR"); - Ok(()) -} - -/// Downloads selected mods PR and extracts it into profile in game install path -#[tauri::command] -pub async fn apply_mods_pr( - pull_request: PullsApiResponseElement, - game_install: GameInstall, -) -> Result<(), String> { - // Exit early if wrong game path - check_is_valid_game_path(&game_install.game_path)?; - - let download_url = match get_mods_download_link(pull_request) { - Ok(url) => url, - Err(err) => return Err(err.to_string()), - }; - - let archive = match download_zip_into_memory(download_url).await { - Ok(archive) => archive, - Err(err) => return Err(err.to_string()), - }; - - let profile_folder = format!( - "{}/R2Northstar-PR-test-managed-folder", - game_install.game_path - ); - - // Delete previously managed folder - if std::fs::remove_dir_all(profile_folder.clone()).is_err() { - if std::path::Path::new(&profile_folder).exists() { - log::error!("Failed removing previous dir"); - } else { - log::warn!("Failed removing folder that doesn't exist. Probably cause first run"); - } - }; - - // Create profile folder - match std::fs::create_dir_all(profile_folder.clone()) { - Ok(()) => (), - Err(err) => return Err(err.to_string()), - } - - let target_dir = std::path::PathBuf::from(format!("{}/mods", profile_folder)); // Doesn't need to exist - match zip_extract::extract(io::Cursor::new(archive), &target_dir, true) { - Ok(()) => (), - Err(err) => { - return Err(format!("Failed unzip: {}", err)); - } - }; - // Add batch file to launch right profile - add_batch_file(&game_install.game_path); - - log::info!("All done with installing mods PR"); - Ok(()) -} diff --git a/src-tauri/src/github/release_notes.rs b/src-tauri/src/github/release_notes.rs deleted file mode 100644 index 4adfb24b..00000000 --- a/src-tauri/src/github/release_notes.rs +++ /dev/null @@ -1,244 +0,0 @@ -use rand::prelude::SliceRandom; -use serde::{Deserialize, Serialize}; -use std::vec::Vec; -use ts_rs::TS; - -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -pub struct ReleaseInfo { - pub name: String, - pub published_at: String, - pub body: String, -} - -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -pub struct FlightCoreVersion { - tag_name: String, - published_at: String, -} - -/// Gets newest FlighCore version from GitHub -#[tauri::command] -pub async fn get_newest_flightcore_version() -> Result<FlightCoreVersion, String> { - // Get newest version number from GitHub API - log::info!("Checking GitHub API"); - let octocrab = octocrab::instance(); - let page = octocrab - .repos("R2NorthstarTools", "FlightCore") - .releases() - .list() - // Optional Parameters - .per_page(1) - .page(1u32) - // Send the request - .send() - .await - .map_err(|err| err.to_string())?; - - // Get newest element - let latest_release_item = &page.items[0]; - - let flightcore_version = FlightCoreVersion { - tag_name: latest_release_item.tag_name.clone(), - published_at: latest_release_item.published_at.unwrap().to_rfc3339(), - }; - log::info!("Done checking GitHub API"); - - Ok(flightcore_version) -} - -/// Checks if installed FlightCore version is up-to-date -/// false -> FlightCore install is up-to-date -/// true -> FlightCore install is outdated -#[tauri::command] -pub async fn check_is_flightcore_outdated() -> Result<bool, String> { - let newest_flightcore_release = get_newest_flightcore_version().await?; - // Parse version number excluding leading `v` - let newest_version = semver::Version::parse(&newest_flightcore_release.tag_name[1..]).unwrap(); - - // Get version of installed FlightCore - let current_version = env!("CARGO_PKG_VERSION"); - let current_version = semver::Version::parse(current_version).unwrap(); - - #[cfg(debug_assertions)] - let is_outdated = current_version < newest_version; - #[cfg(not(debug_assertions))] - let is_outdated = current_version != newest_version; - - // If outdated, check how new the update is - if is_outdated { - // Time to wait (2h) h * m * s - let threshold_seconds = 2 * 60 * 60; - - // Get current time - let current_time = chrono::Utc::now(); - - // Get latest release time from GitHub API response - let result = chrono::DateTime::parse_from_rfc3339(&newest_flightcore_release.published_at) - .unwrap() - .with_timezone(&chrono::Utc); - - // Check if current time is outside of threshold - let diff = current_time - result; - if diff.num_seconds() < threshold_seconds { - // User would be outdated but the newest release is recent - // therefore we do not wanna show outdated warning. - return Ok(false); - } - return Ok(true); - } - - Ok(is_outdated) -} - -#[tauri::command] -pub async fn get_northstar_release_notes() -> Result<Vec<ReleaseInfo>, String> { - let octocrab = octocrab::instance(); - let page = octocrab - .repos("R2Northstar", "Northstar") - .releases() - .list() - // Optional Parameters - .per_page(25) - .page(1u32) - // Send the request - .send() - .await - .map_err(|err| err.to_string())?; - - // TODO there's probably a way to automatically serialize into the struct but I don't know yet how to - let mut release_info_vector: Vec<ReleaseInfo> = vec![]; - for item in page.items { - let release_info = ReleaseInfo { - name: item.name.ok_or(String::from("Release name not found"))?, - published_at: item - .published_at - .ok_or(String::from("Release date not found"))? - .to_rfc3339(), - body: item.body.ok_or(String::from("Release body not found"))?, - }; - release_info_vector.push(release_info); - } - - log::info!("Done checking GitHub API"); - - Ok(release_info_vector) -} - -/// Checks latest GitHub release and generates a announcement message for Discord based on it -#[tauri::command] -pub async fn generate_release_note_announcement() -> Result<String, String> { - let octocrab = octocrab::instance(); - let page = octocrab - .repos("R2Northstar", "Northstar") - .releases() - .list() - // Optional Parameters - .per_page(1) - .page(1u32) - // Send the request - .send() - .await - .unwrap(); - - // Get newest element - let latest_release_item = &page.items[0]; - - // Extract the URL to the GitHub release note - let github_release_link = latest_release_item.html_url.clone(); - - // Extract release version number - let current_ns_version = &latest_release_item.tag_name; - - // Extract changelog and format it - let changelog = remove_markdown_links::remove_markdown_links( - latest_release_item - .body - .as_ref() - .unwrap() - .split("**Contributors:**") - .next() - .unwrap() - .trim(), - ); - - // Strings to insert for different sections - // Hardcoded for now - let general_info = "REPLACE ME"; - let modders_info = "Mod compatibility should not be impacted"; - let server_hosters_info = "REPLACE ME"; - - let mut rng = rand::thread_rng(); - let attributes = vec![ - "adorable", - "amazing", - "beautiful", - "blithsome", - "brilliant", - "compassionate", - "dazzling", - "delightful", - "distinguished", - "elegant", - "enigmatic", - "enthusiastic", - "fashionable", - "fortuitous", - "friendly", - "generous", - "gleeful", - "gorgeous", - "handsome", - "lively", - "lovely", - "lucky", - "lustrous", - "marvelous", - "merry", - "mirthful", - "phantasmagorical", - "pretty", - "propitious", - "ravishing", - "sincere", - "sophisticated fellow", - "stupendous", - "vivacious", - "wonderful", - "zestful", - ]; - - let selected_attribute = attributes.choose(&mut rng).unwrap(); - - // Build announcement string - let return_string = format!( - r"Hello {selected_attribute} people <3 -**Northstar `{current_ns_version}` is out!** - -{general_info} - -__**Modders:**__ - -{modders_info} - -__**Server hosters:**__ - -{server_hosters_info} - -__**Changelog:**__ -``` -{changelog} -``` -{github_release_link} - -Checkout #installation on how to install/update Northstar -(the process is the same for both, using a Northstar installer like FlightCore, Viper, or VTOL is recommended over manual installation) - -If you do notice any bugs, please open an issue on Github or drop a message in the thread below -" - ); - - // Return built announcement message - Ok(return_string.to_string()) -} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs new file mode 100644 index 00000000..4a277ef3 --- /dev/null +++ b/src-tauri/src/lib.rs @@ -0,0 +1,14 @@ +// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ +#[tauri::command] +fn greet(name: &str) -> String { + format!("Hello, {}! You've been greeted from Rust!", name) +} + +#[cfg_attr(mobile, tauri::mobile_entry_point)] +pub fn run() { + tauri::Builder::default() + .plugin(tauri_plugin_opener::init()) + .invoke_handler(tauri::generate_handler![greet]) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index a9f484f5..2abccd9e 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -1,221 +1,6 @@ -#![cfg_attr( - all(not(debug_assertions), target_os = "windows"), - windows_subsystem = "windows" -)] - -use std::{env, time::Duration}; - -mod constants; -mod development; -mod github; -mod mod_management; -mod northstar; -mod platform_specific; -mod repair_and_verify; -mod thunderstore; -mod util; - -use serde::{Deserialize, Serialize}; -#[cfg(target_os = "windows")] -use tauri::api::dialog::blocking::MessageDialogBuilder; -#[cfg(target_os = "windows")] -use tauri::api::dialog::{MessageDialogButtons, MessageDialogKind}; -use tauri::Manager; -use tokio::time::sleep; -use ts_rs::TS; - -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -struct NorthstarThunderstoreRelease { - package: String, - version: String, -} - -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -pub struct NorthstarThunderstoreReleaseWrapper { - label: String, - value: NorthstarThunderstoreRelease, -} +// Prevents additional console window on Windows in release, DO NOT REMOVE!! +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] fn main() { - // Setup logger - let mut log_builder = pretty_env_logger::formatted_builder(); - log_builder.parse_filters("info"); - let logger = sentry_log::SentryLogger::with_dest(log_builder.build()); - - log::set_boxed_logger(Box::new(logger)).unwrap(); - log::set_max_level(log::LevelFilter::Info); - - // Only enable Sentry crash logs on release - #[cfg(not(debug_assertions))] - let _guard = sentry::init(( - "https://f833732deb2240b0b2dc4abce97d0f1d@o1374052.ingest.sentry.io/6692177", - sentry::ClientOptions { - release: sentry::release_name!(), - attach_stacktrace: true, - ..Default::default() - }, - )); - - let tauri_builder_res = tauri::Builder::default() - .plugin(tauri_plugin_store::Builder::default().build()) - .setup(|app| { - let app_handle = app.app_handle(); - tauri::async_runtime::spawn(async move { - loop { - sleep(Duration::from_millis(2000)).await; - // println!("sending backend ping"); - app_handle.emit_all("backend-ping", "ping").unwrap(); - } - }); - let app_handle = app.app_handle(); - tauri::async_runtime::spawn(async move { - loop { - sleep(Duration::from_millis(2000)).await; - app_handle - .emit_all( - "ea-app-running-ping", - util::check_ea_app_or_origin_running(), - ) - .unwrap(); - } - }); - let app_handle = app.app_handle(); - tauri::async_runtime::spawn(async move { - loop { - sleep(Duration::from_millis(2000)).await; - app_handle - .emit_all("northstar-running-ping", util::check_northstar_running()) - .unwrap(); - } - }); - - // Emit updated player and server count to GUI - let app_handle = app.app_handle(); - tauri::async_runtime::spawn(async move { - loop { - sleep(constants::REFRESH_DELAY).await; - app_handle - .emit_all( - "northstar-statistics", - util::get_server_player_count().await, - ) - .unwrap(); - } - }); - - Ok(()) - }) - .manage(()) - .invoke_handler(tauri::generate_handler![ - development::install_git_main, - github::compare_tags, - github::get_list_of_tags, - github::pull_requests::apply_launcher_pr, - github::pull_requests::apply_mods_pr, - github::pull_requests::get_launcher_download_link, - github::pull_requests::get_pull_requests_wrapper, - github::release_notes::check_is_flightcore_outdated, - github::release_notes::generate_release_note_announcement, - github::release_notes::get_newest_flightcore_version, - github::release_notes::get_northstar_release_notes, - mod_management::delete_northstar_mod, - mod_management::delete_thunderstore_mod, - mod_management::get_installed_mods_and_properties, - mod_management::install_mod_wrapper, - mod_management::set_mod_enabled_status, - northstar::check_is_northstar_outdated, - northstar::get_available_northstar_versions, - northstar::get_northstar_version_number, - northstar::install::find_game_install_location, - northstar::install::install_northstar_wrapper, - northstar::install::update_northstar, - northstar::launch_northstar, - northstar::profile::clone_profile, - northstar::profile::delete_profile, - northstar::profile::fetch_profiles, - northstar::profile::validate_profile, - platform_specific::check_cgnat, - platform_specific::get_host_os, - platform_specific::get_local_northstar_proton_wrapper_version, - platform_specific::install_northstar_proton_wrapper, - platform_specific::uninstall_northstar_proton_wrapper, - repair_and_verify::clean_up_download_folder_wrapper, - repair_and_verify::disable_all_but_core, - repair_and_verify::get_log_list, - repair_and_verify::verify_game_files, - repair_and_verify::verify_install_location, - thunderstore::query_thunderstore_packages_api, - util::close_application, - util::force_panic, - util::get_flightcore_version_number, - util::get_server_player_count, - util::is_debug_mode, - util::kill_northstar, - util::open_repair_window, - ]) - .run(tauri::generate_context!()); - - match tauri_builder_res { - Ok(()) => (), - Err(err) => { - // Failed to launch system native web view - - // Log error on Linux - #[cfg(not(target_os = "windows"))] - { - log::error!("{err}"); - } - - // On Windows we can show an error window using Windows API to show how to install WebView2 - #[cfg(target_os = "windows")] - { - log::error!("WebView2 not installed: {err}"); - let dialog = MessageDialogBuilder::new( - "WebView2 not found", - "FlightCore requires WebView2 to run.\n\nClick OK to open installation instructions." - ) - .kind(MessageDialogKind::Error) - .buttons(MessageDialogButtons::Ok); - - if dialog.show() { - // Open the installation instructions URL in the user's default web browser - open::that("https://github.com/R2NorthstarTools/FlightCore/blob/main/docs/TROUBLESHOOTING.md#flightcore-wont-launch").unwrap(); - } - } - } - }; -} - -/// Defines how Titanfall2 was installed (Steam, Origin, ...) -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -pub enum InstallType { - STEAM, - ORIGIN, - EAPLAY, - UNKNOWN, -} - -/// Object holding information of the Titanfall2 install, including -/// - Install path -/// - Active profile -/// - Type of installation (Steam, Origin, ...) -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct GameInstall { - pub game_path: String, - pub profile: String, - pub install_type: InstallType, -} - -/// Object holding various information about a Northstar mod -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -pub struct NorthstarMod { - pub name: String, - pub version: Option<String>, - pub thunderstore_mod_string: Option<String>, - pub enabled: bool, - pub directory: String, + tauri_app_lib::run() } diff --git a/src-tauri/src/mod_management/legacy.rs b/src-tauri/src/mod_management/legacy.rs deleted file mode 100644 index 1e9f90f5..00000000 --- a/src-tauri/src/mod_management/legacy.rs +++ /dev/null @@ -1,213 +0,0 @@ -use crate::constants::BLACKLISTED_MODS; -use crate::mod_management::{ - delete_mod_folder, get_installed_mods_and_properties, ParsedThunderstoreModString, -}; -use crate::GameInstall; -use crate::NorthstarMod; -use anyhow::{anyhow, Result}; -use serde::{Deserialize, Serialize}; -use std::{io::Read, path::PathBuf}; - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct ModJson { - #[serde(rename = "Name")] - name: String, - #[serde(rename = "ThunderstoreModString")] - thunderstore_mod_string: Option<String>, - #[serde(rename = "Version")] - version: Option<String>, -} - -/// Parses `manifest.json` for Thunderstore mod string -fn parse_for_thunderstore_mod_string(nsmod_path: &str) -> Result<String, anyhow::Error> { - let manifest_json_path = format!("{}/manifest.json", nsmod_path); - let ts_author_txt_path = format!("{}/thunderstore_author.txt", nsmod_path); - - // Check if `manifest.json` exists and parse - let data = std::fs::read_to_string(manifest_json_path)?; - let thunderstore_manifest: super::ThunderstoreManifest = json5::from_str(&data)?; - - // Check if `thunderstore_author.txt` exists and parse - let mut file = std::fs::File::open(ts_author_txt_path)?; - let mut thunderstore_author = String::new(); - file.read_to_string(&mut thunderstore_author)?; - - // Build mod string - let thunderstore_mod_string = format!( - "{}-{}-{}", - thunderstore_author, thunderstore_manifest.name, thunderstore_manifest.version_number - ); - - Ok(thunderstore_mod_string) -} - -/// Parse `mods` folder for installed mods. -pub fn parse_installed_mods( - game_install: &GameInstall, -) -> Result<Vec<NorthstarMod>, anyhow::Error> { - let ns_mods_folder = format!("{}/{}/mods/", game_install.game_path, game_install.profile); - - let paths = match std::fs::read_dir(ns_mods_folder) { - Ok(paths) => paths, - Err(_err) => return Err(anyhow!("No mods folder found")), - }; - - let mut directories: Vec<PathBuf> = Vec::new(); - let mut mods: Vec<NorthstarMod> = Vec::new(); - - // Get list of folders in `mods` directory - for path in paths { - log::info!("{path:?}"); - let my_path = path.unwrap().path(); - log::info!("{my_path:?}"); - - let md = std::fs::metadata(my_path.clone()).unwrap(); - if md.is_dir() { - directories.push(my_path); - } - } - - // Iterate over folders and check if they are Northstar mods - for directory in directories { - let directory_str = directory.to_str().unwrap().to_string(); - // Check if mod.json exists - let mod_json_path = format!("{}/mod.json", directory_str); - if !std::path::Path::new(&mod_json_path).exists() { - continue; - } - - // Parse mod.json and get mod name - - // Read file into string and parse it - let data = std::fs::read_to_string(mod_json_path.clone())?; - let parsed_mod_json: ModJson = match json5::from_str(&data) { - Ok(parsed_json) => parsed_json, - Err(err) => { - log::warn!("Failed parsing {} with {}", mod_json_path, err.to_string()); - continue; - } - }; - // Get Thunderstore mod string if it exists - let thunderstore_mod_string = match parsed_mod_json.thunderstore_mod_string { - // Attempt legacy method for getting Thunderstore string first - Some(ts_mod_string) => Some(ts_mod_string), - // Legacy method failed - None => match parse_for_thunderstore_mod_string(&directory_str) { - Ok(thunderstore_mod_string) => Some(thunderstore_mod_string), - Err(_err) => None, - }, - }; - // Get directory path - let mod_directory = directory.to_str().unwrap().to_string(); - - let ns_mod = NorthstarMod { - name: parsed_mod_json.name, - version: parsed_mod_json.version, - thunderstore_mod_string, - enabled: false, // Placeholder - directory: mod_directory, - }; - - mods.push(ns_mod); - } - - // Return found mod names - Ok(mods) -} - -/// Deletes all legacy packages that match in author and mod name -/// regardless of version -/// -/// "legacy package" refers to a Thunderstore package installed into the `mods` folder -/// by extracting Northstar mods contained inside and then adding `manifest.json` and `thunderstore_author.txt` -/// to indicate which Thunderstore package they are part of -pub fn delete_legacy_package_install( - thunderstore_mod_string: &str, - game_install: &GameInstall, -) -> Result<(), String> { - let thunderstore_mod_string: ParsedThunderstoreModString = - thunderstore_mod_string.parse().unwrap(); - let found_installed_legacy_mods = match parse_installed_mods(game_install) { - Ok(res) => res, - Err(err) => return Err(err.to_string()), - }; - - for legacy_mod in found_installed_legacy_mods { - if legacy_mod.thunderstore_mod_string.is_none() { - continue; // Not a thunderstore mod - } - - let current_mod_ts_string: ParsedThunderstoreModString = legacy_mod - .clone() - .thunderstore_mod_string - .unwrap() - .parse() - .unwrap(); - - if thunderstore_mod_string.author_name == current_mod_ts_string.author_name - && thunderstore_mod_string.mod_name == current_mod_ts_string.mod_name - { - // They match, delete - delete_mod_folder(&legacy_mod.directory)?; - } - } - - Ok(()) -} - -/// Deletes all NorthstarMods related to a Thunderstore mod -pub fn delete_thunderstore_mod( - game_install: GameInstall, - thunderstore_mod_string: String, -) -> Result<(), String> { - // Prevent deleting core mod - for core_ts_mod in BLACKLISTED_MODS { - if thunderstore_mod_string == core_ts_mod { - return Err(format!("Cannot remove core mod {thunderstore_mod_string}")); - } - } - - let parsed_ts_mod_string: ParsedThunderstoreModString = - thunderstore_mod_string.parse().unwrap(); - - // Get installed mods - let installed_ns_mods = get_installed_mods_and_properties(game_install)?; - - // List of mod folders to remove - let mut mod_folders_to_remove: Vec<String> = Vec::new(); - - // Get folder name based on Thundestore mod string - for installed_ns_mod in installed_ns_mods { - if installed_ns_mod.thunderstore_mod_string.is_none() { - // Not a Thunderstore mod - continue; - } - - let installed_ns_mod_ts_string: ParsedThunderstoreModString = installed_ns_mod - .thunderstore_mod_string - .unwrap() - .parse() - .unwrap(); - - // Installed mod matches specified Thunderstore mod string - if parsed_ts_mod_string.author_name == installed_ns_mod_ts_string.author_name - && parsed_ts_mod_string.mod_name == installed_ns_mod_ts_string.mod_name - { - // Add folder to list of folder to remove - mod_folders_to_remove.push(installed_ns_mod.directory); - } - } - - if mod_folders_to_remove.is_empty() { - return Err(format!( - "No mods removed as no Northstar mods matching {thunderstore_mod_string} were found to be installed." - )); - } - - // Delete given folders - for mod_folder in mod_folders_to_remove { - delete_mod_folder(&mod_folder)?; - } - - Ok(()) -} diff --git a/src-tauri/src/mod_management/mod.rs b/src-tauri/src/mod_management/mod.rs deleted file mode 100644 index 52ef1180..00000000 --- a/src-tauri/src/mod_management/mod.rs +++ /dev/null @@ -1,797 +0,0 @@ -// This file contains various mod management functions - -use crate::constants::{BLACKLISTED_MODS, CORE_MODS, MODS_WITH_SPECIAL_REQUIREMENTS}; -use async_recursion::async_recursion; -use thermite::prelude::ThermiteError; - -use crate::NorthstarMod; -use anyhow::{anyhow, Result}; -use serde::{Deserialize, Serialize}; -use std::error::Error; -use std::str::FromStr; -use std::string::ToString; -use std::{fs, path::PathBuf}; - -mod legacy; -mod plugins; -use crate::GameInstall; - -#[derive(Debug, Clone)] -pub struct ParsedThunderstoreModString { - author_name: String, - mod_name: String, - version: String, -} - -impl std::str::FromStr for ParsedThunderstoreModString { - type Err = &'static str; // todo use an better error management - - fn from_str(s: &str) -> Result<Self, Self::Err> { - // Check whether Thunderstore string passes regex - let re = regex::Regex::new(r"^[a-zA-Z0-9_]+-[a-zA-Z0-9_]+-\d+\.\d+\.\d++$").unwrap(); - if !re.is_match(s) { - return Err("Incorrect format"); - } - - let mut parts = s.split('-'); - - let author_name = parts.next().ok_or("None value on author_name")?.to_string(); - let mod_name = parts.next().ok_or("None value on mod_name")?.to_string(); - let version = parts.next().ok_or("None value on version")?.to_string(); - - Ok(ParsedThunderstoreModString { - author_name, - mod_name, - version, - }) - } -} - -impl std::fmt::Display for ParsedThunderstoreModString { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}-{}-{}", self.author_name, self.mod_name, self.version) - } -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct ThunderstoreManifest { - name: String, - version_number: String, -} - -/// A wrapper around a temporary file handle and its path. -/// -/// This struct is designed to be used for temporary files that should be automatically deleted -/// when the `TempFile` instance goes out of scope. -#[derive(Debug)] -pub struct TempFile(fs::File, PathBuf); - -impl TempFile { - pub fn new(file: fs::File, path: PathBuf) -> Self { - Self(file, path) - } - - pub fn file(&self) -> &fs::File { - &self.0 - } -} - -impl Drop for TempFile { - fn drop(&mut self) { - _ = fs::remove_file(&self.1) - } -} - -impl std::ops::Deref for TempFile { - type Target = fs::File; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -/// Installs the specified mod -#[tauri::command] -pub async fn install_mod_wrapper( - game_install: GameInstall, - thunderstore_mod_string: String, -) -> Result<(), String> { - match fc_download_mod_and_install(&game_install, &thunderstore_mod_string).await { - Ok(()) => (), - Err(err) => { - log::warn!("{err}"); - return Err(err); - } - }; - match crate::repair_and_verify::clean_up_download_folder(&game_install, false) { - Ok(()) => Ok(()), - Err(err) => { - log::info!("Failed to delete download folder due to {}", err); - // Failure to delete download folder is not an error in mod install - // As such ignore. User can still force delete if need be - Ok(()) - } - } -} - -/// Returns a serde json object of the parsed `enabledmods.json` file -pub fn get_enabled_mods(game_install: &GameInstall) -> Result<serde_json::value::Value, String> { - let enabledmods_json_path = format!( - "{}/{}/enabledmods.json", - game_install.game_path, game_install.profile - ); - - // Check for JSON file - if !std::path::Path::new(&enabledmods_json_path).exists() { - return Err("enabledmods.json not found".to_string()); - } - - // Read file - let data = match std::fs::read_to_string(enabledmods_json_path) { - Ok(data) => data, - Err(err) => return Err(err.to_string()), - }; - - // Parse JSON - let res: serde_json::Value = match serde_json::from_str(&data) { - Ok(result) => result, - Err(err) => return Err(format!("Failed to read JSON due to: {}", err)), - }; - - // Return parsed data - Ok(res) -} - -/// Gets all currently installed and enabled/disabled mods to rebuild `enabledmods.json` -pub fn rebuild_enabled_mods_json(game_install: &GameInstall) -> Result<(), String> { - let enabledmods_json_path = format!( - "{}/{}/enabledmods.json", - game_install.game_path, game_install.profile - ); - let mods_and_properties = get_installed_mods_and_properties(game_install.clone())?; - - // Create new mapping - let mut my_map = serde_json::Map::new(); - - // Build mapping - for ns_mod in mods_and_properties.into_iter() { - my_map.insert(ns_mod.name, serde_json::Value::Bool(ns_mod.enabled)); - } - - // Turn into serde object - let obj = serde_json::Value::Object(my_map); - - // Write to file - std::fs::write( - enabledmods_json_path, - serde_json::to_string_pretty(&obj).unwrap(), - ) - .unwrap(); - - Ok(()) -} - -/// Set the status of a passed mod to enabled/disabled -#[tauri::command] -pub fn set_mod_enabled_status( - game_install: GameInstall, - mod_name: String, - is_enabled: bool, -) -> Result<(), String> { - let enabledmods_json_path = format!( - "{}/{}/enabledmods.json", - game_install.game_path, game_install.profile - ); - - // Parse JSON - let mut res: serde_json::Value = match get_enabled_mods(&game_install) { - Ok(res) => res, - Err(err) => { - log::warn!("Couldn't parse `enabledmod.json`: {}", err); - log::warn!("Rebuilding file."); - - rebuild_enabled_mods_json(&game_install)?; - - // Then try again - get_enabled_mods(&game_install)? - } - }; - - // Check if key exists - if res.get(mod_name.clone()).is_none() { - // If it doesn't exist, rebuild `enabledmod.json` - log::info!("Value not found in `enabledmod.json`. Rebuilding file"); - rebuild_enabled_mods_json(&game_install)?; - - // Then try again - res = get_enabled_mods(&game_install)?; - } - - // Update value - res[mod_name] = serde_json::Value::Bool(is_enabled); - - // Save the JSON structure into the output file - std::fs::write( - enabledmods_json_path, - serde_json::to_string_pretty(&res).unwrap(), - ) - .unwrap(); - - Ok(()) -} - -/// Resembles the bare minimum keys in Northstar `mods.json` -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct ModJson { - #[serde(rename = "Name")] - name: String, - #[serde(rename = "Version")] - version: Option<String>, -} - -/// Parse `mods` folder for installed mods. -pub fn parse_mods_in_package( - package_mods_path: PathBuf, - thunderstore_mod_string: ParsedThunderstoreModString, -) -> Result<Vec<NorthstarMod>, anyhow::Error> { - let paths = match std::fs::read_dir(package_mods_path) { - Ok(paths) => paths, - Err(_err) => return Err(anyhow!("No mods folder found")), - }; - - let mut directories: Vec<PathBuf> = Vec::new(); - let mut mods: Vec<NorthstarMod> = Vec::new(); - - // Get list of folders in `mods` directory - for path in paths { - let my_path = path?.path(); - let md = std::fs::metadata(my_path.clone())?; - if md.is_dir() { - directories.push(my_path); - } - } - - // Iterate over folders and check if they are Northstar mods - for directory in directories { - let directory_str = directory.to_str().unwrap().to_string(); - // Check if mod.json exists - let mod_json_path = format!("{}/mod.json", directory_str); - if !std::path::Path::new(&mod_json_path).exists() { - continue; - } - - // Read file into string and parse it - let data = std::fs::read_to_string(mod_json_path.clone())?; - let parsed_mod_json: ModJson = match json5::from_str(&data) { - Ok(parsed_json) => parsed_json, - Err(err) => { - log::warn!("Failed parsing {} with {}", mod_json_path, err.to_string()); - continue; - } - }; - - // Get directory path - let mod_directory = directory.to_str().unwrap().to_string(); - - let ns_mod = NorthstarMod { - name: parsed_mod_json.name, - version: parsed_mod_json.version, - thunderstore_mod_string: Some(thunderstore_mod_string.to_string()), - enabled: false, // Placeholder - directory: mod_directory, - }; - - mods.push(ns_mod); - } - - // Return found mod names - Ok(mods) -} - -/// Parse `packages` folder for installed mods. -pub fn parse_installed_package_mods( - game_install: &GameInstall, -) -> Result<Vec<NorthstarMod>, anyhow::Error> { - let mut collected_mods: Vec<NorthstarMod> = Vec::new(); - - let packages_folder = format!( - "{}/{}/packages/", - game_install.game_path, game_install.profile - ); - - let packages_dir = match fs::read_dir(packages_folder) { - Ok(res) => res, - Err(err) => { - // We couldn't read directory, probably cause it doesn't exist yet. - // In that case we just say no package mods installed. - log::warn!("{err}"); - return Ok(vec![]); - } - }; - - // Iteratore over folders in `packages` dir - for entry in packages_dir { - let entry_path = entry?.path(); - let entry_str = entry_path.file_name().unwrap().to_str().unwrap(); - - // Use the struct's from_str function to verify format - if entry_path.is_dir() { - let package_thunderstore_string = match ParsedThunderstoreModString::from_str(entry_str) - { - Ok(res) => res, - Err(err) => { - log::warn!( - "Not a Thunderstore mod string \"{}\" cause: {}", - entry_path.display(), - err - ); - continue; - } - }; - let manifest_path = entry_path.join("manifest.json"); - let mods_path = entry_path.join("mods"); - - // Ensure `manifest.json` and `mods/` dir exist - if manifest_path.exists() && mods_path.is_dir() { - let mods = - match parse_mods_in_package(mods_path, package_thunderstore_string.clone()) { - Ok(res) => res, - Err(err) => { - log::warn!("Failed parsing cause: {err}"); - continue; - } - }; - collected_mods.extend(mods); - } - } - } - - Ok(collected_mods) -} - -/// Gets list of installed mods and their properties -/// - name -/// - is enabled? -#[tauri::command] -pub fn get_installed_mods_and_properties( - game_install: GameInstall, -) -> Result<Vec<NorthstarMod>, String> { - // Get installed mods from packages - let mut found_installed_mods = match parse_installed_package_mods(&game_install) { - Ok(res) => res, - Err(err) => return Err(err.to_string()), - }; - // Get installed legacy mods - let found_installed_legacy_mods = match legacy::parse_installed_mods(&game_install) { - Ok(res) => res, - Err(err) => return Err(err.to_string()), - }; - - // Combine list of package and legacy mods - found_installed_mods.extend(found_installed_legacy_mods); - - // Get enabled mods as JSON - let enabled_mods: serde_json::Value = match get_enabled_mods(&game_install) { - Ok(enabled_mods) => enabled_mods, - Err(_) => serde_json::from_str("{}").unwrap(), // `enabledmods.json` not found, create empty object - }; - - let mut installed_mods = Vec::new(); - let binding = serde_json::Map::new(); // Empty map in case treating as object fails - let mapping = enabled_mods.as_object().unwrap_or(&binding); - - // Use list of installed mods and set enabled based on `enabledmods.json` - for mut current_mod in found_installed_mods { - let current_mod_enabled = match mapping.get(¤t_mod.name) { - Some(enabled) => enabled.as_bool().unwrap(), - None => true, // Northstar considers mods not in mapping as enabled. - }; - current_mod.enabled = current_mod_enabled; - installed_mods.push(current_mod); - } - - Ok(installed_mods) -} - -async fn get_ns_mod_download_url(thunderstore_mod_string: &str) -> Result<String, String> { - // TODO: This will crash the thread if not internet connection exist. `match` should be used instead - let index = thermite::api::get_package_index().unwrap().to_vec(); - - // Parse mod string - let parsed_ts_mod_string: ParsedThunderstoreModString = match thunderstore_mod_string.parse() { - Ok(res) => res, - Err(_) => return Err("Failed to parse mod string".to_string()), - }; - - // Encode as URL - let ts_mod_string_url = format!( - "{}/{}/{}", - parsed_ts_mod_string.author_name, - parsed_ts_mod_string.mod_name, - parsed_ts_mod_string.version - ); - - for ns_mod in index { - // Iterate over all versions of a given mod - for ns_mod in ns_mod.versions.values() { - if ns_mod.url.contains(&ts_mod_string_url) { - return Ok(ns_mod.url.clone()); - } - } - } - - Err("Could not find mod on Thunderstore".to_string()) -} - -/// Returns a vector of modstrings containing the dependencies of a given mod -async fn get_mod_dependencies(thunderstore_mod_string: &str) -> Result<Vec<String>, anyhow::Error> { - log::info!("Attempting to get dependencies for: {thunderstore_mod_string}"); - - let index = thermite::api::get_package_index()?.to_vec(); - - // String replace works but more care should be taken in the future - let ts_mod_string_url = thunderstore_mod_string.replace('-', "/"); - - // Iterate over index - for ns_mod in index { - // Iterate over all versions of a given mod - for ns_mod in ns_mod.versions.values() { - if ns_mod.url.contains(&ts_mod_string_url) { - return Ok(ns_mod.deps.clone()); - } - } - } - Ok(Vec::<String>::new()) -} - -/// Deletes all versions of Thunderstore package except the specified one -fn delete_older_versions( - thunderstore_mod_string: &str, - game_install: &GameInstall, -) -> Result<(), String> { - let thunderstore_mod_string: ParsedThunderstoreModString = - thunderstore_mod_string.parse().unwrap(); - log::info!( - "Deleting other versions of {}", - thunderstore_mod_string.to_string() - ); - let packages_folder = format!( - "{}/{}/packages", - game_install.game_path, game_install.profile - ); - - // Get folders in packages dir - let paths = match std::fs::read_dir(&packages_folder) { - Ok(paths) => paths, - Err(_err) => return Err(format!("Failed to read directory {}", &packages_folder)), - }; - - let mut directories: Vec<PathBuf> = Vec::new(); - - // Get list of folders in `mods` directory - for path in paths { - let my_path = path.unwrap().path(); - - let md = std::fs::metadata(my_path.clone()).unwrap(); - if md.is_dir() { - directories.push(my_path); - } - } - - for directory in directories { - let folder_name = directory.file_name().unwrap().to_str().unwrap(); - let ts_mod_string_from_folder: ParsedThunderstoreModString = match folder_name.parse() { - Ok(res) => res, - Err(err) => { - // Failed parsing folder name as Thunderstore mod string - // This means it doesn't follow the `AUTHOR-MOD-VERSION` naming structure - // This folder could've been manually created by the user or another application - // As parsing failed we cannot determine the Thunderstore package it is part of hence we skip it - log::warn!("{err}"); - continue; - } - }; - // Check which match `AUTHOR-MOD` and do NOT match `AUTHOR-MOD-VERSION` - if ts_mod_string_from_folder.author_name == thunderstore_mod_string.author_name - && ts_mod_string_from_folder.mod_name == thunderstore_mod_string.mod_name - && ts_mod_string_from_folder.version != thunderstore_mod_string.version - { - delete_package_folder(&directory.display().to_string())?; - } - } - - Ok(()) -} - -/// Checks whether some mod is correctly formatted -/// Currently checks whether -/// - Some `mod.json` exists under `mods/*/mod.json` -fn fc_sanity_check(input: &&fs::File) -> Result<(), Box<dyn Error + Send + Sync + 'static>> { - let mut archive = match zip::read::ZipArchive::new(*input) { - Ok(archive) => archive, - Err(_) => { - return Err(Box::new(ThermiteError::UnknownError( - "Failed reading zip file".into(), - ))) - } - }; - - let mut has_mods = false; - let mut mod_json_exists = false; - - // Checks for `mods/*/mod.json` - for i in 0..archive.len() { - let file = match archive.by_index(i) { - Ok(file) => file, - Err(_) => continue, - }; - let file_path = file.mangled_name(); - if file_path.starts_with("mods/") { - has_mods = true; - if let Some(name) = file_path.file_name() { - if name == "mod.json" { - let parent_path = file_path.parent().unwrap(); - if parent_path.parent().unwrap().to_str().unwrap() == "mods" { - mod_json_exists = true; - } - } - } - } - - if file_path.starts_with("plugins/") { - if let Some(name) = file_path.file_name() { - if name.to_str().unwrap().contains(".dll") { - log::warn!("Plugin detected, prompting user"); - if !plugins::plugin_prompt() { - return Err(Box::new(ThermiteError::UnknownError( - "Plugin detected and install denied".into(), - ))); - } - } - } - } - } - - if has_mods && mod_json_exists { - Ok(()) - } else { - Err(Box::new(ThermiteError::UnknownError( - "Mod not correctly formatted".into(), - ))) - } -} - -// Copied from `libtermite` source code and modified -// Should be replaced with a library call to libthermite in the future -/// Download and install mod to the specified target. -#[async_recursion] -pub async fn fc_download_mod_and_install( - game_install: &GameInstall, - thunderstore_mod_string: &str, -) -> Result<(), String> { - log::info!("Attempting to install \"{thunderstore_mod_string}\" to {game_install:?}"); - // Get mods and download directories - let download_directory = format!( - "{}/___flightcore-temp/download-dir/", - game_install.game_path - ); - - // Early return on empty string - if thunderstore_mod_string.is_empty() { - return Err("Passed empty string".to_string()); - } - - let deps = match get_mod_dependencies(thunderstore_mod_string).await { - Ok(deps) => deps, - Err(err) => return Err(err.to_string()), - }; - log::info!("Mod dependencies: {deps:?}"); - - // Recursively install dependencies - for dep in deps { - match fc_download_mod_and_install(game_install, &dep).await { - Ok(()) => (), - Err(err) => { - if err == "Cannot install Northstar as a mod!" { - continue; // For Northstar as a dependency, we just skip it - } else { - return Err(err); - } - } - }; - } - - // Prevent installing Northstar as a mod - // While it would fail during install anyway, having explicit error message is nicer - for blacklisted_mod in BLACKLISTED_MODS { - if thunderstore_mod_string.contains(blacklisted_mod) { - return Err("Cannot install Northstar as a mod!".to_string()); - } - } - - // Prevent installing mods that have specific install requirements - for special_mod in MODS_WITH_SPECIAL_REQUIREMENTS { - if thunderstore_mod_string.contains(special_mod) { - return Err(format!( - "{} has special install requirements and cannot be installed with FlightCore", - thunderstore_mod_string - )); - } - } - - // Get download URL for the specified mod - let download_url = get_ns_mod_download_url(thunderstore_mod_string).await?; - - // Create download directory - match std::fs::create_dir_all(download_directory.clone()) { - Ok(()) => (), - Err(err) => return Err(err.to_string()), - }; - - let path = format!( - "{}/___flightcore-temp/download-dir/{thunderstore_mod_string}.zip", - game_install.game_path - ); - - // Download the mod - let temp_file = TempFile::new( - std::fs::File::options() - .read(true) - .write(true) - .truncate(true) - .create(true) - .open(&path) - .map_err(|e| e.to_string())?, - (&path).into(), - ); - match thermite::core::manage::download(temp_file.file(), download_url) { - Ok(_written_bytes) => (), - Err(err) => return Err(err.to_string()), - }; - - // Get directory to install to made up of packages directory and Thunderstore mod string - let install_directory = format!( - "{}/{}/packages/", - game_install.game_path, game_install.profile - ); - - // Extract the mod to the mods directory - match thermite::core::manage::install_with_sanity( - thunderstore_mod_string, - temp_file.file(), - std::path::Path::new(&install_directory), - fc_sanity_check, - ) { - Ok(_) => (), - Err(err) => { - log::warn!("libthermite couldn't install mod {thunderstore_mod_string} due to {err:?}",); - return match err { - ThermiteError::SanityError(e) => Err( - format!("Mod failed sanity check during install. It's probably not correctly formatted. {}", e) - ), - _ => Err(err.to_string()), - }; - } - }; - - // Successful package install - match legacy::delete_legacy_package_install(thunderstore_mod_string, game_install) { - Ok(()) => (), - Err(err) => { - // Catch error but ignore - log::warn!("Failed deleting legacy versions due to: {}", err); - } - }; - - match delete_older_versions(thunderstore_mod_string, game_install) { - Ok(()) => (), - Err(err) => { - // Catch error but ignore - log::warn!("Failed deleting older versions due to: {}", err); - } - }; - - Ok(()) -} - -/// Deletes a given Northstar mod folder -fn delete_mod_folder(ns_mod_directory: &str) -> Result<(), String> { - let ns_mod_dir_path = std::path::Path::new(&ns_mod_directory); - - // Safety check: Check whether `mod.json` exists and exit early if not - // If it does not exist, we might not be dealing with a Northstar mod - let mod_json_path = ns_mod_dir_path.join("mod.json"); - if !mod_json_path.exists() { - // If it doesn't exist, return an error - return Err(format!("mod.json does not exist in {}", ns_mod_directory)); - } - - match std::fs::remove_dir_all(ns_mod_directory) { - Ok(()) => Ok(()), - Err(err) => Err(format!("Failed deleting mod: {err}")), - } -} - -/// Deletes a Northstar mod based on its name -#[tauri::command] -pub fn delete_northstar_mod(game_install: GameInstall, nsmod_name: String) -> Result<(), String> { - // Prevent deleting core mod - for core_mod in CORE_MODS { - if nsmod_name == core_mod { - return Err(format!("Cannot remove core mod {nsmod_name}")); - } - } - - // Get installed mods - let installed_ns_mods = get_installed_mods_and_properties(game_install)?; - - // Get folder name based on northstarmods - for installed_ns_mod in installed_ns_mods { - // Installed mod matches specified mod - if installed_ns_mod.name == nsmod_name { - // Delete folder - return delete_mod_folder(&installed_ns_mod.directory); - } - } - - Err(format!("Mod {nsmod_name} not found to be installed")) -} - -/// Deletes a given Thunderstore package -fn delete_package_folder(ts_package_directory: &str) -> Result<(), String> { - let ns_mod_dir_path = std::path::Path::new(&ts_package_directory); - - // Safety check: Check whether `manifest.json` exists and exit early if not - // If it does not exist, we might not be dealing with a Thunderstore package - let mod_json_path = ns_mod_dir_path.join("manifest.json"); - if !mod_json_path.exists() { - // If it doesn't exist, return an error - return Err(format!( - "manifest.json does not exist in {}", - ts_package_directory - )); - } - - match std::fs::remove_dir_all(ts_package_directory) { - Ok(()) => Ok(()), - Err(err) => Err(format!("Failed deleting package: {err}")), - } -} - -/// Deletes all NorthstarMods related to a Thunderstore mod -#[tauri::command] -pub fn delete_thunderstore_mod( - game_install: GameInstall, - thunderstore_mod_string: String, -) -> Result<(), String> { - // Check packages - let packages_folder = format!( - "{}/{}/packages", - game_install.game_path, game_install.profile - ); - if std::path::Path::new(&packages_folder).exists() { - for entry in fs::read_dir(packages_folder).unwrap() { - let entry = entry.unwrap(); - - // Check if it's a folder and skip if otherwise - if !entry.file_type().unwrap().is_dir() { - log::warn!("Skipping \"{}\", not a file", entry.path().display()); - continue; - } - - let entry_path = entry.path(); - let package_folder_ts_string = entry_path.file_name().unwrap().to_string_lossy(); - - if package_folder_ts_string != thunderstore_mod_string { - // Not the mod folder we are looking for, try the next one\ - continue; - } - - // All checks passed, this is the matching mod - return delete_package_folder(&entry.path().display().to_string()); - } - } - - // Try legacy mod installs as fallback - legacy::delete_thunderstore_mod(game_install, thunderstore_mod_string) -} diff --git a/src-tauri/src/mod_management/plugins.rs b/src-tauri/src/mod_management/plugins.rs deleted file mode 100644 index e2427a16..00000000 --- a/src-tauri/src/mod_management/plugins.rs +++ /dev/null @@ -1,26 +0,0 @@ -use tauri::api::dialog::blocking::MessageDialogBuilder; -use tauri::api::dialog::{MessageDialogButtons, MessageDialogKind}; - -/// Prompt on plugin -/// Returns: -/// - true: user accepted plugin install -/// - false: user denied plugin install -pub fn plugin_prompt() -> bool { - let dialog = MessageDialogBuilder::new( - "Plugin in package detected", - "This mod contains a plugin. Plugins have unrestricted access to your computer! - \nMake sure you trust the author! - \n - \nPress 'Ok' to continue or 'Cancel' to abort mod installation", - ) - .kind(MessageDialogKind::Warning) - .buttons(MessageDialogButtons::OkCancel); - - if dialog.show() { - log::info!("Accepted plugin install"); - true - } else { - log::warn!("Plugin install cancelled"); - false - } -} diff --git a/src-tauri/src/northstar/install.rs b/src-tauri/src/northstar/install.rs deleted file mode 100644 index 0953fa38..00000000 --- a/src-tauri/src/northstar/install.rs +++ /dev/null @@ -1,358 +0,0 @@ -use anyhow::Result; -use serde::{Deserialize, Serialize}; -use std::time::Duration; -use std::{cell::RefCell, time::Instant}; -use ts_rs::TS; - -use crate::constants::{CORE_MODS, NORTHSTAR_DEFAULT_PROFILE, NORTHSTAR_DLL}; -use crate::{ - util::{extract, move_dir_all}, - GameInstall, InstallType, -}; - -#[cfg(target_os = "windows")] -use crate::platform_specific::windows; - -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -enum InstallState { - Downloading, - Extracting, - Done, -} - -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -struct InstallProgress { - current_downloaded: u64, - total_size: u64, - state: InstallState, -} - -/// Installs Northstar to the given path -#[tauri::command] -pub async fn install_northstar_wrapper( - window: tauri::Window, - game_install: GameInstall, - northstar_package_name: Option<String>, - version_number: Option<String>, -) -> Result<bool, String> { - log::info!("Running Northstar install"); - - // Get Northstar package name (`Northstar` vs `NorthstarReleaseCandidate`) - let northstar_package_name = northstar_package_name - .map(|name| { - if name.len() <= 1 { - "Northstar".to_string() - } else { - name - } - }) - .unwrap_or("Northstar".to_string()); - - match install_northstar(window, game_install, northstar_package_name, version_number).await { - Ok(_) => Ok(true), - Err(err) => { - log::error!("{}", err); - Err(err) - } - } -} - -/// Update Northstar install in the given path -#[tauri::command] -pub async fn update_northstar( - window: tauri::Window, - game_install: GameInstall, - northstar_package_name: Option<String>, -) -> Result<bool, String> { - log::info!("Updating Northstar"); - - // Simply re-run install with up-to-date version for upate - install_northstar_wrapper(window, game_install, northstar_package_name, None).await -} - -/// Copied from `papa` source code and modified -///Install N* from the provided mod -/// -///Checks cache, else downloads the latest version -async fn do_install( - window: tauri::Window, - nmod: &thermite::model::ModVersion, - game_install: GameInstall, -) -> Result<()> { - let filename = format!("northstar-{}.zip", nmod.version); - let temp_dir = format!("{}/___flightcore-temp", game_install.game_path); - let download_directory = format!("{}/download-dir", temp_dir); - let extract_directory = format!("{}/extract-dir", temp_dir); - - log::info!("Attempting to create temporary directory {}", temp_dir); - std::fs::create_dir_all(download_directory.clone())?; - std::fs::create_dir_all(extract_directory.clone())?; - - let download_path = format!("{}/{}", download_directory, filename); - log::info!("Download path: {download_path}"); - - let last_emit = RefCell::new(Instant::now()); // Keep track of the last time a signal was emitted - let mut nfile = std::fs::File::options() - .read(true) - .write(true) - .truncate(true) - .create(true) - .open(download_path)?; - thermite::core::manage::download_with_progress( - &mut nfile, - &nmod.url, - |delta, current, total| { - if delta != 0 { - // Only emit a signal once every 100ms - // This way we don't bombard the frontend with events on fast download speeds - let time_since_last_emit = Instant::now().duration_since(*last_emit.borrow()); - if time_since_last_emit >= Duration::from_millis(100) { - window - .emit( - "northstar-install-download-progress", - InstallProgress { - current_downloaded: current, - total_size: total, - state: InstallState::Downloading, - }, - ) - .unwrap(); - *last_emit.borrow_mut() = Instant::now(); - } - } - }, - )?; - - window - .emit( - "northstar-install-download-progress", - InstallProgress { - current_downloaded: 0, - total_size: 0, - state: InstallState::Extracting, - }, - ) - .unwrap(); - - log::info!("Extracting Northstar..."); - extract(nfile, std::path::Path::new(&extract_directory))?; - - // Prepare Northstar for Installation - log::info!("Preparing Northstar..."); - if game_install.profile != NORTHSTAR_DEFAULT_PROFILE { - // We are using a non standard Profile, we must: - // - move the DLL - // - rename the Profile - - // Move DLL into the default R2Northstar Profile - let old_dll_path = format!("{}/{}", extract_directory, NORTHSTAR_DLL); - let new_dll_path = format!( - "{}/{}/{}", - extract_directory, NORTHSTAR_DEFAULT_PROFILE, NORTHSTAR_DLL - ); - std::fs::rename(old_dll_path, new_dll_path)?; - - // rename default R2Northstar Profile to the profile we want to use - let old_profile_path = format!("{}/{}/", extract_directory, NORTHSTAR_DEFAULT_PROFILE); - let new_profile_path = format!("{}/{}/", extract_directory, game_install.profile); - std::fs::rename(old_profile_path, new_profile_path)?; - } - - log::info!("Installing Northstar..."); - - // Delete previous version here - for core_mod in CORE_MODS { - let path_to_delete_string = format!( - "{}/{}/mods/{}/", - game_install.game_path, game_install.profile, core_mod - ); - log::info!("Preparing to remove {}", path_to_delete_string); - - // Check if folder exists - let path_to_delete = std::path::Path::new(&path_to_delete_string); - - // Check if path even exists before we attempt to remove - if !path_to_delete.exists() { - log::info!("{} does not exist. Skipping", path_to_delete_string); - continue; - } - - if !path_to_delete.is_dir() { - log::error!( - "{} exists but is a file? This should never happen", - path_to_delete_string - ); - continue; - } - - // Safety check for mod.json - // Just so that we won't ever have a https://github.com/ValveSoftware/steam-for-linux/issues/3671 moment - let mod_json_path = format!("{}/mod.json", path_to_delete_string); - let mod_json_path = std::path::Path::new(&mod_json_path); - - if !mod_json_path.exists() { - log::error!("Missing mod.json for {path_to_delete_string} this shouldn't happen"); - continue; - } - - // Finally delete file - match std::fs::remove_dir_all(path_to_delete) { - Ok(()) => { - log::info!("Succesfully removed") - } - Err(err) => { - log::error!("Failed removing {} due to {}", path_to_delete_string, err) - } - }; - } - - for entry in std::fs::read_dir(extract_directory).unwrap() { - let entry = entry.unwrap(); - let destination = format!( - "{}/{}", - game_install.game_path, - entry.path().file_name().unwrap().to_str().unwrap() - ); - - log::info!("Installing {}", entry.path().display()); - if !entry.file_type().unwrap().is_dir() { - std::fs::rename(entry.path(), destination)?; - } else { - move_dir_all(entry.path(), destination)?; - } - } - - // Delete old copy - log::info!("Delete temporary directory"); - std::fs::remove_dir_all(temp_dir).unwrap(); - - log::info!("Done installing Northstar!"); - window - .emit( - "northstar-install-download-progress", - InstallProgress { - current_downloaded: 0, - total_size: 0, - state: InstallState::Done, - }, - ) - .unwrap(); - - Ok(()) -} - -pub async fn install_northstar( - window: tauri::Window, - game_install: GameInstall, - northstar_package_name: String, - version_number: Option<String>, -) -> Result<String, String> { - let index = match thermite::api::get_package_index() { - Ok(res) => res.to_vec(), - Err(err) => { - log::warn!("Failed fetching package index due to: {err}"); - return Err("Failed to connect to Thunderstore.".to_string()); - } - }; - let nmod = index - .iter() - .find(|f| f.name.to_lowercase() == northstar_package_name.to_lowercase()) - .ok_or_else(|| panic!("Couldn't find Northstar on thunderstore???")) - .unwrap(); - - // Use passed version or latest if no version was passed - let version = version_number.as_ref().unwrap_or(&nmod.latest); - - let game_path = game_install.game_path.clone(); - log::info!("Install path \"{}\"", game_path); - - match do_install(window, nmod.versions.get(version).unwrap(), game_install).await { - Ok(_) => (), - Err(err) => { - if game_path - .to_lowercase() - .contains(&r"C:\Program Files\".to_lowercase()) - // default is `C:\Program Files\EA Games\Titanfall2` - { - return Err( - "Cannot install to default EA App install path, please move Titanfall2 to a different install location.".to_string(), - ); - } else { - return Err(err.to_string()); - } - } - } - - Ok(nmod.latest.clone()) -} - -/// Attempts to find the game install location -#[tauri::command] -pub fn find_game_install_location() -> Result<GameInstall, String> { - // Attempt parsing Steam library directly - match steamlocate::SteamDir::locate() { - Ok(steamdir) => { - #[cfg(target_os = "linux")] - { - let snap_dir = match std::env::var("SNAP_USER_DATA") { - Ok(snap_dir) => std::path::PathBuf::from(snap_dir), - Err(_) => match dirs::home_dir() { - Some(path) => path, - None => std::path::PathBuf::new(), - } - .join("snap"), - }; - - if steamdir.path().starts_with(snap_dir) { - log::warn!("Found Steam installed via Snap, you may encounter issues"); - } - } - - match steamdir.find_app(thermite::TITANFALL2_STEAM_ID) { - Ok(Some((app, library))) => { - let app_path = library - .path() - .join("steamapps") - .join("common") - .join(app.install_dir) - .into_os_string() - .into_string() - .unwrap(); - - let game_install = GameInstall { - game_path: app_path, - profile: "R2Northstar".to_string(), - install_type: InstallType::STEAM, - }; - return Ok(game_install); - } - Ok(None) => log::info!("Couldn't locate your Titanfall 2 Steam install."), - Err(err) => log::info!( - "Something went wrong while trying to find Titanfall 2 {}", - err - ), - } - } - Err(err) => log::info!("Couldn't locate Steam on this computer! {}", err), - } - - // (On Windows only) try parsing Windows registry for Origin install path - #[cfg(target_os = "windows")] - match windows::origin_install_location_detection() { - Ok(game_path) => { - let game_install = GameInstall { - game_path, - profile: "R2Northstar".to_string(), - install_type: InstallType::ORIGIN, - }; - return Ok(game_install); - } - Err(err) => { - log::info!("{}", err); - } - }; - - Err("Could not auto-detect game install location! Please enter it manually.".to_string()) -} diff --git a/src-tauri/src/northstar/mod.rs b/src-tauri/src/northstar/mod.rs deleted file mode 100644 index 9953d742..00000000 --- a/src-tauri/src/northstar/mod.rs +++ /dev/null @@ -1,276 +0,0 @@ -//! This module deals with handling things around Northstar such as -//! - getting version number -pub mod install; -pub mod profile; - -use crate::util::check_ea_app_or_origin_running; -use crate::{constants::CORE_MODS, platform_specific::get_host_os, GameInstall, InstallType}; -use crate::{NorthstarThunderstoreRelease, NorthstarThunderstoreReleaseWrapper}; -use anyhow::anyhow; -use serde::{Deserialize, Serialize}; -use ts_rs::TS; - -#[derive(Serialize, Deserialize, Debug, Clone, TS)] -#[ts(export)] -pub struct NorthstarLaunchOptions { - launch_via_steam: bool, - bypass_checks: bool, -} - -/// Gets list of available Northstar versions from Thunderstore -#[tauri::command] -pub async fn get_available_northstar_versions( -) -> Result<Vec<NorthstarThunderstoreReleaseWrapper>, ()> { - let northstar_package_name = "Northstar"; - let index = thermite::api::get_package_index().unwrap().to_vec(); - let nsmod = index - .iter() - .find(|f| f.name.to_lowercase() == northstar_package_name.to_lowercase()) - .ok_or_else(|| panic!("Couldn't find Northstar on thunderstore???")) - .unwrap(); - - let mut releases: Vec<NorthstarThunderstoreReleaseWrapper> = vec![]; - for (_version_string, nsmod_version_obj) in nsmod.versions.iter() { - let current_elem = NorthstarThunderstoreRelease { - package: nsmod_version_obj.name.clone(), - version: nsmod_version_obj.version.clone(), - }; - let current_elem_wrapped = NorthstarThunderstoreReleaseWrapper { - label: format!( - "{} v{}", - nsmod_version_obj.name.clone(), - nsmod_version_obj.version.clone() - ), - value: current_elem, - }; - - releases.push(current_elem_wrapped); - } - - releases.sort_by(|a, b| { - // Parse version number - let a_ver = semver::Version::parse(&a.value.version).unwrap(); - let b_ver = semver::Version::parse(&b.value.version).unwrap(); - b_ver.partial_cmp(&a_ver).unwrap() // Sort newest first - }); - - Ok(releases) -} - -/// Checks if installed Northstar version is up-to-date -/// false -> Northstar install is up-to-date -/// true -> Northstar install is outdated -#[tauri::command] -pub async fn check_is_northstar_outdated( - game_install: GameInstall, - northstar_package_name: Option<String>, -) -> Result<bool, String> { - let northstar_package_name = match northstar_package_name { - Some(northstar_package_name) => { - if northstar_package_name.len() <= 1 { - "Northstar".to_string() - } else { - northstar_package_name - } - } - None => "Northstar".to_string(), - }; - - let index = match thermite::api::get_package_index() { - Ok(res) => res.to_vec(), - Err(err) => return Err(format!("Couldn't check if Northstar up-to-date: {err}")), - }; - let nmod = index - .iter() - .find(|f| f.name.to_lowercase() == northstar_package_name.to_lowercase()) - .expect("Couldn't find Northstar on thunderstore???"); - // .ok_or_else(|| anyhow!("Couldn't find Northstar on thunderstore???"))?; - - let version_number = match get_northstar_version_number(game_install) { - Ok(version_number) => version_number, - Err(err) => { - log::warn!("{}", err); - // If we fail to get new version just assume we are up-to-date - return Err(err); - } - }; - - // Release candidate version numbers are different between `mods.json` and Thunderstore - let version_number = crate::util::convert_release_candidate_number(version_number); - - if version_number != nmod.latest { - log::info!("Installed Northstar version outdated"); - Ok(true) - } else { - log::info!("Installed Northstar version up-to-date"); - Ok(false) - } -} - -/// Check version number of a mod -pub fn check_mod_version_number(path_to_mod_folder: &str) -> Result<String, anyhow::Error> { - let data = std::fs::read_to_string(format!("{path_to_mod_folder}/mod.json"))?; - let parsed_json: serde_json::Value = serde_json::from_str(&data)?; - - let mod_version_number = match parsed_json.get("Version").and_then(|value| value.as_str()) { - Some(version_number) => version_number, - None => return Err(anyhow!("No version number found")), - }; - - log::info!("{}", mod_version_number); - - Ok(mod_version_number.to_string()) -} - -/// Returns the current Northstar version number as a string -#[tauri::command] -pub fn get_northstar_version_number(game_install: GameInstall) -> Result<String, String> { - log::info!("{}", game_install.game_path); - - // TODO: - // Check if NorthstarLauncher.exe exists and check its version number - let initial_version_number = match check_mod_version_number(&format!( - "{}/{}/mods/{}", - game_install.game_path, game_install.profile, CORE_MODS[0] - )) { - Ok(version_number) => version_number, - Err(err) => return Err(err.to_string()), - }; - - for core_mod in CORE_MODS { - let current_version_number = match check_mod_version_number(&format!( - "{}/{}/mods/{}", - game_install.game_path, game_install.profile, core_mod - )) { - Ok(version_number) => version_number, - Err(err) => return Err(err.to_string()), - }; - if current_version_number != initial_version_number { - // We have a version number mismatch - return Err("Found version number mismatch".to_string()); - } - } - log::info!("All mods same version"); - - Ok(initial_version_number) -} - -/// Launches Northstar -#[tauri::command] -pub fn launch_northstar( - game_install: GameInstall, - launch_options: NorthstarLaunchOptions, -) -> Result<String, String> { - dbg!(game_install.clone()); - - if launch_options.launch_via_steam { - return launch_northstar_steam(game_install); - } - - let host_os = get_host_os(); - - // Explicitly fail early certain (currently) unsupported install setups - if host_os != "windows" { - if !matches!(game_install.install_type, InstallType::STEAM) { - return Err(format!( - "Not yet implemented for \"{}\" with Titanfall2 installed via \"{:?}\"", - get_host_os(), - game_install.install_type - )); - } - - return launch_northstar_steam(game_install); - } - - // Only check guards if bypassing checks is not enabled - if !launch_options.bypass_checks { - // Some safety checks before, should have more in the future - if get_northstar_version_number(game_install.clone()).is_err() { - return Err(anyhow!("Not all checks were met").to_string()); - } - - // Require EA App or Origin to be running to launch Northstar - let ea_app_is_running = check_ea_app_or_origin_running(); - if !ea_app_is_running { - return Err( - anyhow!("EA App not running, start EA App before launching Northstar").to_string(), - ); - } - } - - // Switch to Titanfall2 directory for launching - // NorthstarLauncher.exe expects to be run from that folder - if std::env::set_current_dir(game_install.game_path.clone()).is_err() { - // We failed to get to Titanfall2 directory - return Err(anyhow!("Couldn't access Titanfall2 directory").to_string()); - } - - // Only Windows with Steam or Origin are supported at the moment - if host_os == "windows" - && (matches!(game_install.install_type, InstallType::STEAM) - || matches!(game_install.install_type, InstallType::ORIGIN) - || matches!(game_install.install_type, InstallType::UNKNOWN)) - { - let ns_exe_path = format!("{}/NorthstarLauncher.exe", game_install.game_path); - let ns_profile_arg = format!("-profile={}", game_install.profile); - - let mut output = std::process::Command::new("C:\\Windows\\System32\\cmd.exe") - .args(["/C", "start", "", &ns_exe_path, &ns_profile_arg]) - .spawn() - .expect("failed to execute process"); - output.wait().expect("failed waiting on child process"); - return Ok("Launched game".to_string()); - } - - Err(format!( - "Not yet implemented for {:?} on {}", - game_install.install_type, - get_host_os() - )) -} - -/// Prepare Northstar and Launch through Steam using the Browser Protocol -pub fn launch_northstar_steam(game_install: GameInstall) -> Result<String, String> { - if !matches!(game_install.install_type, InstallType::STEAM) { - return Err("Titanfall2 was not installed via Steam".to_string()); - } - - match steamlocate::SteamDir::locate() { - Ok(steamdir) => { - if get_host_os() != "windows" { - match steamdir.compat_tool_mapping() { - Ok(map) => match map.get(&thermite::TITANFALL2_STEAM_ID) { - Some(_) => {} - None => { - return Err( - "Titanfall2 was not configured to use a compatibility tool" - .to_string(), - ); - } - }, - Err(_) => { - return Err("Could not get compatibility tool mapping".to_string()); - } - } - } - } - Err(_) => { - return Err("Couldn't access Titanfall2 directory".to_string()); - } - } - - // Switch to Titanfall2 directory to set everything up - if std::env::set_current_dir(game_install.game_path).is_err() { - // We failed to get to Titanfall2 directory - return Err("Couldn't access Titanfall2 directory".to_string()); - } - - match open::that(format!( - "steam://run/{}//-profile={} --northstar/", - thermite::TITANFALL2_STEAM_ID, - game_install.profile - )) { - Ok(()) => Ok("Started game".to_string()), - Err(_err) => Err("Failed to launch Titanfall 2 via Steam".to_string()), - } -} diff --git a/src-tauri/src/northstar/profile.rs b/src-tauri/src/northstar/profile.rs deleted file mode 100644 index 26a32d6b..00000000 --- a/src-tauri/src/northstar/profile.rs +++ /dev/null @@ -1,121 +0,0 @@ -use crate::util::copy_dir_all; -use crate::GameInstall; - -// These folders are part of Titanfall 2 and -// should NEVER be used as a Profile -const SKIP_PATHS: [&str; 8] = [ - "___flightcore-temp", - "__overlay", - "bin", - "Core", - "r2", - "vpk", - "platform", - "Support", -]; - -// A profile may have one of these to be detected -const MAY_CONTAIN: [&str; 10] = [ - "mods/", - "plugins/", - "packages/", - "logs/", - "runtime/", - "save_data/", - "Northstar.dll", - "enabledmods.json", - "placeholder.playerdata.pdata", - "LEGAL.txt", -]; - -/// Returns a list of Profile names -/// All the returned Profiles can be found relative to the game path -#[tauri::command] -pub fn fetch_profiles(game_install: GameInstall) -> Result<Vec<String>, String> { - let mut profiles: Vec<String> = Vec::new(); - - for content in MAY_CONTAIN { - let pattern = format!("{}/*/{}", game_install.game_path, content); - for e in glob::glob(&pattern).expect("Failed to read glob pattern") { - let path = e.unwrap(); - let mut ancestors = path.ancestors(); - - ancestors.next(); - - let profile_path = std::path::Path::new(ancestors.next().unwrap()); - let profile_name = profile_path - .file_name() - .unwrap() - .to_os_string() - .into_string() - .unwrap(); - - if !profiles.contains(&profile_name) { - profiles.push(profile_name); - } - } - } - - Ok(profiles) -} - -/// Validates if a given profile is actually a valid profile -#[tauri::command] -pub fn validate_profile(game_install: GameInstall, profile: String) -> bool { - // Game files are never a valid profile - // Prevent users with messed up installs from making it even worse - if SKIP_PATHS.contains(&profile.as_str()) { - return false; - } - - log::info!("Validating Profile {}", profile); - - let profile_path = format!("{}/{}", game_install.game_path, profile); - let profile_dir = std::path::Path::new(profile_path.as_str()); - - profile_dir.is_dir() -} - -#[tauri::command] -pub fn delete_profile(game_install: GameInstall, profile: String) -> Result<(), String> { - // Check if the Profile actually exists - if !validate_profile(game_install.clone(), profile.clone()) { - return Err(format!("{} is not a valid Profile", profile)); - } - - log::info!("Deleting Profile {}", profile); - - let profile_path = format!("{}/{}", game_install.game_path, profile); - - match std::fs::remove_dir_all(profile_path) { - Ok(()) => Ok(()), - Err(err) => Err(format!("Failed to delete Profile: {}", err)), - } -} - -/// Clones a profile by simply duplicating the folder under a new name -#[tauri::command] -pub fn clone_profile( - game_install: GameInstall, - old_profile: String, - new_profile: String, -) -> Result<(), String> { - // Check if the old Profile already exists - if !validate_profile(game_install.clone(), old_profile.clone()) { - return Err(format!("{} is not a valid Profile", old_profile)); - } - - // Check that new Profile does not already exist - if validate_profile(game_install.clone(), new_profile.clone()) { - return Err(format!("{} already exists", new_profile)); - } - - log::info!("Cloning Profile {} to {}", old_profile, new_profile); - - let old_profile_path = format!("{}/{}", game_install.game_path, old_profile); - let new_profile_path = format!("{}/{}", game_install.game_path, new_profile); - - copy_dir_all(old_profile_path, new_profile_path).unwrap(); - - Ok(()) -} diff --git a/src-tauri/src/platform_specific/linux.rs b/src-tauri/src/platform_specific/linux.rs deleted file mode 100644 index fcac5b67..00000000 --- a/src-tauri/src/platform_specific/linux.rs +++ /dev/null @@ -1,98 +0,0 @@ -// Linux specific code - -fn get_proton_dir() -> Result<String, String> { - let steam_dir = match steamlocate::SteamDir::locate() { - Ok(result) => result, - Err(_) => return Err("Unable to find Steam directory".to_string()), - }; - let compat_dir = format!("{}/compatibilitytools.d", steam_dir.path().display()); - - Ok(compat_dir) -} - -/// Downloads and installs NS proton -/// Assumes Steam install -pub fn install_ns_proton() -> Result<(), String> { - // Get latest NorthstarProton release - let latest = match thermite::core::latest_release() { - Ok(result) => result, - Err(_) => return Err("Failed to fetch latest NorthstarProton release".to_string()), - }; - - let temp_dir = std::env::temp_dir(); - let path = format!("{}/nsproton-{}.tar.gz", temp_dir.display(), latest); - let archive = match std::fs::File::create(path.clone()) { - Ok(result) => result, - Err(_) => return Err("Failed to allocate NorthstarProton archive on disk".to_string()), - }; - - // Download the latest Proton release - log::info!("Downloading NorthstarProton to {}", path); - match thermite::core::download_ns_proton(latest, archive) { - Ok(_) => {} - Err(_) => return Err("Failed to download NorthstarProton".to_string()), - } - - log::info!("Finished Download"); - - let compat_dir = get_proton_dir()?; - - match std::fs::create_dir_all(compat_dir.clone()) { - Ok(_) => {} - Err(_) => return Err("Failed to create compatibilitytools directory".to_string()), - } - - let finished = match std::fs::File::open(path.clone()) { - Ok(result) => result, - Err(_) => return Err("Failed to open NorthstarProton archive".to_string()), - }; - - // Extract to Proton dir - log::info!("Installing NorthstarProton to {}", compat_dir); - match thermite::core::install_ns_proton(&finished, compat_dir) { - Ok(_) => {} - Err(_) => return Err("Failed to create install NorthstarProton".to_string()), - } - log::info!("Finished Installation"); - drop(finished); - - // We installed NSProton, lets ignore this if it fails - let _ = std::fs::remove_file(path); - - Ok(()) -} - -/// Remove NS Proton -pub fn uninstall_ns_proton() -> Result<(), String> { - let compat_dir = get_proton_dir()?; - let pattern = format!("{}/NorthstarProton*", compat_dir); - for e in glob::glob(&pattern).expect("Failed to read glob pattern") { - match e { - Ok(path) => match std::fs::remove_dir_all(path.clone()) { - Ok(_) => {} - Err(_) => return Err(format!("Failed to remove {}", path.display())), - }, - Err(e) => return Err(format!("Found unprocessable entry {}", e)), - } - } - - Ok(()) -} - -/// Get the latest installed NS Proton version -pub fn get_local_ns_proton_version() -> Result<String, String> { - let compat_dir = get_proton_dir().unwrap(); - let pattern = format!("{}/NorthstarProton*/version", compat_dir); - - if let Some(e) = glob::glob(&pattern) - .expect("Failed to read glob pattern") - .next() - { - let version_content = std::fs::read_to_string(e.unwrap()).unwrap(); - let version = version_content.split(' ').nth(1).unwrap().to_string(); - - return Ok(version); - } - - Err("Northstar Proton is not installed".to_string()) -} diff --git a/src-tauri/src/platform_specific/mod.rs b/src-tauri/src/platform_specific/mod.rs deleted file mode 100644 index 4e0514d4..00000000 --- a/src-tauri/src/platform_specific/mod.rs +++ /dev/null @@ -1,50 +0,0 @@ -#[cfg(target_os = "windows")] -pub mod windows; - -#[cfg(target_os = "linux")] -pub mod linux; - -/// Returns identifier of host OS FlightCore is running on -#[tauri::command] -pub fn get_host_os() -> String { - std::env::consts::OS.to_string() -} - -/// On Linux attempts to install NorthstarProton -/// On Windows simply returns an error message -#[tauri::command] -pub async fn install_northstar_proton_wrapper() -> Result<(), String> { - #[cfg(target_os = "linux")] - return linux::install_ns_proton().map_err(|err| err.to_string()); - - #[cfg(target_os = "windows")] - Err("Not supported on Windows".to_string()) -} - -#[tauri::command] -pub async fn uninstall_northstar_proton_wrapper() -> Result<(), String> { - #[cfg(target_os = "linux")] - return linux::uninstall_ns_proton(); - - #[cfg(target_os = "windows")] - Err("Not supported on Windows".to_string()) -} - -#[tauri::command] -pub async fn get_local_northstar_proton_wrapper_version() -> Result<String, String> { - #[cfg(target_os = "linux")] - return linux::get_local_ns_proton_version(); - - #[cfg(target_os = "windows")] - Err("Not supported on Windows".to_string()) -} - -/// Check whether the current device might be behind a CGNAT -#[tauri::command] -pub async fn check_cgnat() -> Result<String, String> { - #[cfg(target_os = "linux")] - return Err("Not supported on Linux".to_string()); - - #[cfg(target_os = "windows")] - windows::check_cgnat().await -} diff --git a/src-tauri/src/platform_specific/windows.rs b/src-tauri/src/platform_specific/windows.rs deleted file mode 100644 index fc6aab5d..00000000 --- a/src-tauri/src/platform_specific/windows.rs +++ /dev/null @@ -1,104 +0,0 @@ -/// Windows specific code -use anyhow::{anyhow, Result}; -use std::net::Ipv4Addr; - -#[cfg(target_os = "windows")] -use winreg::{enums::HKEY_LOCAL_MACHINE, RegKey}; - -use crate::repair_and_verify::check_is_valid_game_path; - -/// Gets Titanfall2 install location on Origin -pub fn origin_install_location_detection() -> Result<String, anyhow::Error> { - #[cfg(target_os = "windows")] - { - let hklm = RegKey::predef(HKEY_LOCAL_MACHINE); - match hklm.open_subkey("SOFTWARE\\Respawn\\Titanfall2") { - Ok(tf) => { - let game_path_str: String = tf.get_value("Install Dir")?; - - match check_is_valid_game_path(&game_path_str) { - Ok(()) => { - return Ok(game_path_str.to_string()); - } - Err(err) => { - log::warn!("{err}"); - } - } - } - Err(err) => { - log::warn!("{err}"); - } - } - } - - Err(anyhow!("No Origin / EA App install path found")) -} - -/// Check whether the current device might be behind a CGNAT -pub async fn check_cgnat() -> Result<String, String> { - // Use external service to grap IP - let url = "https://api.ipify.org"; - let response = reqwest::get(url).await.unwrap().text().await.unwrap(); - - // Check if valid IPv4 address and return early if not - if response.parse::<Ipv4Addr>().is_err() { - return Err(format!("Not valid IPv4 address: {}", response)); - } - - let hops_count = run_tracert(&response)?; - Ok(format!("Counted {} hops to {}", hops_count, response)) -} - -/// Count number of hops in tracert output -fn count_hops(output: &str) -> usize { - // Split the output into lines - let lines: Vec<&str> = output.lines().collect(); - - // Filter lines that appear to represent hops - let hop_lines: Vec<&str> = lines - .iter() - .filter(|&line| line.contains("ms") || line.contains("*")) // TODO check if it contains just the `ms` surrounded by whitespace, otherwise it might falsely pick up some domain names as well - .cloned() - .collect(); - - // Return the number of hops - hop_lines.len() -} - -/// Run `tracert` -fn run_tracert(target_ip: &str) -> Result<usize, String> { - // Ensure valid IPv4 address to avoid prevent command injection - assert!(target_ip.parse::<Ipv4Addr>().is_ok()); - - // Execute the `tracert` command - let output = match std::process::Command::new("tracert") - .arg("-4") // Force IPv4 - .arg("-d") // Prevent resolving intermediate IP addresses - .arg("-w") // Set timeout to 1 second - .arg("1000") - .arg("-h") // Set max hop count - .arg("5") - .arg(target_ip) - .output() - { - Ok(res) => res, - Err(err) => return Err(format!("Failed running tracert: {}", err)), - }; - - // Check if the command was successful - if output.status.success() { - // Convert the output to a string - let stdout = - std::str::from_utf8(&output.stdout).expect("Invalid UTF-8 sequence in command output"); - println!("{}", stdout); - - // Count the number of hops - let hop_count = count_hops(stdout); - Ok(hop_count) - } else { - let stderr = std::str::from_utf8(&output.stderr) - .expect("Invalid UTF-8 sequence in command error output"); - println!("{}", stderr); - Err(format!("Failed collecting tracert output: {}", stderr)) - } -} diff --git a/src-tauri/src/repair_and_verify/mod.rs b/src-tauri/src/repair_and_verify/mod.rs deleted file mode 100644 index 3c861609..00000000 --- a/src-tauri/src/repair_and_verify/mod.rs +++ /dev/null @@ -1,137 +0,0 @@ -use crate::mod_management::{get_enabled_mods, rebuild_enabled_mods_json, set_mod_enabled_status}; -/// Contains various functions to repair common issues and verifying installation -use crate::{constants::CORE_MODS, GameInstall}; - -/// Checks if is valid Titanfall2 install based on certain conditions -#[tauri::command] -pub async fn verify_install_location(game_path: String) -> bool { - match check_is_valid_game_path(&game_path) { - Ok(()) => true, - Err(err) => { - log::warn!("{}", err); - false - } - } -} - -/// Checks whether the provided path is a valid Titanfall2 gamepath by checking against a certain set of criteria -pub fn check_is_valid_game_path(game_install_path: &str) -> Result<(), String> { - let path_to_titanfall2_exe = format!("{game_install_path}/Titanfall2.exe"); - let is_correct_game_path = std::path::Path::new(&path_to_titanfall2_exe).exists(); - log::info!("Titanfall2.exe exists in path? {}", is_correct_game_path); - - // Exit early if wrong game path - if !is_correct_game_path { - return Err(format!("Incorrect game path \"{game_install_path}\"")); // Return error cause wrong game path - } - Ok(()) -} - -/// Verifies Titanfall2 game files -#[tauri::command] -pub fn verify_game_files(game_install: GameInstall) -> Result<String, String> { - dbg!(game_install); - Err("TODO, not yet implemented".to_string()) -} - -/// Disables all mods except core ones -/// Enables core mods if disabled -#[tauri::command] -pub fn disable_all_but_core(game_install: GameInstall) -> Result<(), String> { - // Rebuild `enabledmods.json` first to ensure all mods are added - rebuild_enabled_mods_json(&game_install)?; - - let current_mods = get_enabled_mods(&game_install)?; - - // Disable all mods, set core mods to enabled - for (key, _value) in current_mods.as_object().unwrap() { - if CORE_MODS.contains(&key.as_str()) { - // This is a core mod, we do not want to disable it - set_mod_enabled_status(game_install.clone(), key.to_string(), true)?; - } else { - // Not a core mod - set_mod_enabled_status(game_install.clone(), key.to_string(), false)?; - } - } - - Ok(()) -} - -/// Installs the specified mod -#[tauri::command] -pub async fn clean_up_download_folder_wrapper( - game_install: GameInstall, - force: bool, -) -> Result<(), String> { - match clean_up_download_folder(&game_install, force) { - Ok(()) => Ok(()), - Err(err) => Err(err.to_string()), - } -} - -/// Deletes download folder -/// If `force` is FALSE, bails on non-empty folder -/// If `force` is TRUE, deletes folder even if non-empty -pub fn clean_up_download_folder( - game_install: &GameInstall, - force: bool, -) -> Result<(), anyhow::Error> { - const TEMPORARY_DIRECTORIES: [&str; 4] = [ - "___flightcore-temp-download-dir", - "___flightcore-temp/download-dir", - "___flightcore-temp/extract-dir", - "___flightcore-temp", - ]; - - for directory in TEMPORARY_DIRECTORIES { - // Get download directory - let download_directory = format!("{}/{}/", game_install.game_path, directory); - - // Check if files in folder - let download_dir_contents = match std::fs::read_dir(download_directory.clone()) { - Ok(contents) => contents, - Err(_) => continue, - }; - - let mut count = 0; - download_dir_contents.for_each(|_| count += 1); - - if count > 0 && !force { - // Skip folder if not empty - log::warn!("Folder not empty, not deleting: {directory}"); - continue; - } - - // Delete folder - std::fs::remove_dir_all(download_directory)?; - } - Ok(()) -} - -/// Get list of Northstar logs -#[tauri::command] -pub fn get_log_list(game_install: GameInstall) -> Result<Vec<std::path::PathBuf>, String> { - let ns_log_folder = format!("{}/{}/logs", game_install.game_path, game_install.profile); - - // List files in logs folder - let paths = match std::fs::read_dir(ns_log_folder) { - Ok(paths) => paths, - Err(_err) => return Err("No logs folder found".to_string()), - }; - - // Stores paths of log files - let mut log_files: Vec<std::path::PathBuf> = Vec::new(); - - for path in paths { - let path = path.unwrap().path(); - if path.display().to_string().contains("nslog") { - log_files.push(path); - } - } - - if !log_files.is_empty() { - Ok(log_files) - } else { - Err("No logs found".to_string()) - } -} diff --git a/src-tauri/src/thunderstore/mod.rs b/src-tauri/src/thunderstore/mod.rs deleted file mode 100644 index fc2acb02..00000000 --- a/src-tauri/src/thunderstore/mod.rs +++ /dev/null @@ -1,86 +0,0 @@ -//! For interacting with Thunderstore API -use crate::constants::{APP_USER_AGENT, BLACKLISTED_MODS}; -use serde::{Deserialize, Serialize}; -use std::collections::HashSet; -use ts_rs::TS; - -#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize, TS)] -#[ts(export)] -pub struct ThunderstoreMod { - pub name: String, - pub full_name: String, - pub owner: String, - pub package_url: String, - pub date_created: String, - pub date_updated: String, - pub uuid4: String, - pub rating_score: i32, - pub is_pinned: bool, - pub is_deprecated: bool, - pub has_nsfw_content: bool, - pub categories: Vec<String>, - pub versions: Vec<ThunderstoreModVersion>, -} - -#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize, TS)] -#[ts(export)] -pub struct ThunderstoreModVersion { - pub name: String, - pub full_name: String, - pub description: String, - pub icon: String, - pub version_number: String, - pub dependencies: Vec<String>, - pub download_url: String, - pub downloads: i32, - pub date_created: String, - pub website_url: String, - pub is_active: bool, - pub uuid4: String, - pub file_size: i64, -} - -/// Performs actual fetch from Thunderstore and returns response -async fn fetch_thunderstore_packages() -> Result<String, reqwest::Error> { - log::info!("Fetching Thunderstore API"); - - // Fetches - let url = "https://northstar.thunderstore.io/api/v1/package/"; - - let client = reqwest::Client::new(); - client - .get(url) - .header(reqwest::header::USER_AGENT, APP_USER_AGENT) - .send() - .await? - .text() - .await -} - -/// Queries Thunderstore packages API -#[tauri::command] -pub async fn query_thunderstore_packages_api() -> Result<Vec<ThunderstoreMod>, String> { - let res = match fetch_thunderstore_packages().await { - Ok(res) => res, - Err(err) => { - let warn_response = format!("Couldn't fetch from Thunderstore: {err}"); - log::warn!("{warn_response}"); - return Err(warn_response); - } - }; - - // Parse response - let parsed_json: Vec<ThunderstoreMod> = match serde_json::from_str(&res) { - Ok(res) => res, - Err(err) => return Err(err.to_string()), - }; - - // Remove some mods from listing - let to_remove_set: HashSet<&str> = BLACKLISTED_MODS.iter().copied().collect(); - let filtered_packages = parsed_json - .into_iter() - .filter(|package| !to_remove_set.contains(&package.full_name.as_ref())) - .collect::<Vec<ThunderstoreMod>>(); - - Ok(filtered_packages) -} diff --git a/src-tauri/src/util.rs b/src-tauri/src/util.rs deleted file mode 100644 index 1d355997..00000000 --- a/src-tauri/src/util.rs +++ /dev/null @@ -1,324 +0,0 @@ -//! This module contains various utility/helper functions that do not fit into any other module - -use anyhow::{Context, Result}; -use serde::{Deserialize, Serialize}; -use zip::ZipArchive; - -use crate::constants::{APP_USER_AGENT, MASTER_SERVER_URL, SERVER_BROWSER_ENDPOINT}; - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct NorthstarServer { - #[serde(rename = "playerCount")] - pub player_count: i32, -} - -/// This function's only use is to force a `panic!()` -// This must NOT be async to ensure crashing whole application. -#[tauri::command] -pub fn force_panic() { - panic!("Force panicked!"); -} - -/// Returns true if built in debug mode -#[tauri::command] -pub async fn is_debug_mode() -> bool { - cfg!(debug_assertions) -} - -/// Returns the current version number as a string -#[tauri::command] -pub async fn get_flightcore_version_number() -> String { - let version = env!("CARGO_PKG_VERSION"); - if cfg!(debug_assertions) { - // Debugging enabled - format!("v{} (debug mode)", version) - } else { - // Debugging disabled - format!("v{}", version) - } -} - -/// Spawns repair window -#[tauri::command] -pub async fn open_repair_window(handle: tauri::AppHandle) -> Result<(), String> { - // Spawn new window - let repair_window = match tauri::WindowBuilder::new( - &handle, - "RepairWindow", - tauri::WindowUrl::App("/#/repair".into()), - ) - .build() - { - Ok(res) => res, - Err(err) => return Err(err.to_string()), - }; - - // Set window title - match repair_window.set_title("FlightCore Repair Window") { - Ok(()) => (), - Err(err) => return Err(err.to_string()), - }; - Ok(()) -} - -/// Closes all windows and exits application -#[tauri::command] -pub async fn close_application<R: tauri::Runtime>(app: tauri::AppHandle<R>) -> Result<(), String> { - app.exit(0); // Close application - Ok(()) -} - -/// Fetches `/client/servers` endpoint from master server -async fn fetch_server_list() -> Result<String, anyhow::Error> { - let url = format!("{MASTER_SERVER_URL}{SERVER_BROWSER_ENDPOINT}"); - let client = reqwest::Client::new(); - let res = client - .get(url) - .header(reqwest::header::USER_AGENT, APP_USER_AGENT) - .send() - .await? - .text() - .await?; - - Ok(res) -} - -/// Gets server and playercount from master server API -#[tauri::command] -pub async fn get_server_player_count() -> Result<(i32, usize), String> { - let res = match fetch_server_list().await { - Ok(res) => res, - Err(err) => return Err(err.to_string()), - }; - - let ns_servers: Vec<NorthstarServer> = - serde_json::from_str(&res).expect("JSON was not well-formatted"); - - // Get server count - let server_count = ns_servers.len(); - - // Sum up player count - let total_player_count: i32 = ns_servers.iter().map(|server| server.player_count).sum(); - - log::info!("total_player_count: {}", total_player_count); - log::info!("server_count: {}", server_count); - - Ok((total_player_count, server_count)) -} - -#[tauri::command] -pub async fn kill_northstar() -> Result<(), String> { - if !check_northstar_running() { - return Err("Northstar is not running".to_string()); - } - - let s = sysinfo::System::new_all(); - - for process in s.processes_by_exact_name("Titanfall2.exe") { - log::info!("Killing Process {}", process.pid()); - process.kill(); - } - - for process in s.processes_by_exact_name("NorthstarLauncher.exe") { - log::info!("Killing Process {}", process.pid()); - process.kill(); - } - - Ok(()) -} - -/// Copied from `papa` source code and modified -///Extract N* zip file to target game path -// fn extract(ctx: &Ctx, zip_file: File, target: &Path) -> Result<()> { -pub fn extract(zip_file: std::fs::File, target: &std::path::Path) -> Result<()> { - let mut archive = ZipArchive::new(&zip_file).context("Unable to open zip archive")?; - for i in 0..archive.len() { - let mut f = archive.by_index(i).unwrap(); - - //This should work fine for N* because the dir structure *should* always be the same - if f.enclosed_name().unwrap().starts_with("Northstar") { - let out = target.join( - f.enclosed_name() - .unwrap() - .strip_prefix("Northstar") - .unwrap(), - ); - - if (*f.name()).ends_with('/') { - log::info!("Create directory {}", f.name()); - std::fs::create_dir_all(target.join(f.name())) - .context("Unable to create directory")?; - continue; - } else if let Some(p) = out.parent() { - std::fs::create_dir_all(p).context("Unable to create directory")?; - } - - let mut outfile = std::fs::OpenOptions::new() - .create(true) - .write(true) - .truncate(true) - .open(&out)?; - - log::info!("Write file {}", out.display()); - - std::io::copy(&mut f, &mut outfile).context("Unable to write to file")?; - } - } - - Ok(()) -} - -pub fn check_ea_app_or_origin_running() -> bool { - let s = sysinfo::System::new_all(); - let x = s.processes_by_name("Origin.exe").next().is_some() - || s.processes_by_name("EADesktop.exe").next().is_some(); - x -} - -/// Checks if Northstar process is running -pub fn check_northstar_running() -> bool { - let s = sysinfo::System::new_all(); - let x = s - .processes_by_name("NorthstarLauncher.exe") - .next() - .is_some() - || s.processes_by_name("Titanfall2.exe").next().is_some(); - x -} - -/// Copies a folder and all its contents to a new location -pub fn copy_dir_all( - src: impl AsRef<std::path::Path>, - dst: impl AsRef<std::path::Path>, -) -> std::io::Result<()> { - std::fs::create_dir_all(&dst)?; - for entry in std::fs::read_dir(src)? { - let entry = entry?; - let ty = entry.file_type()?; - if ty.is_dir() { - copy_dir_all(entry.path(), dst.as_ref().join(entry.file_name()))?; - } else { - std::fs::copy(entry.path(), dst.as_ref().join(entry.file_name()))?; - } - } - Ok(()) -} - -/// Moves a folders file structure to a new location -/// Old folders are not removed -pub fn move_dir_all( - src: impl AsRef<std::path::Path>, - dst: impl AsRef<std::path::Path>, -) -> std::io::Result<()> { - std::fs::create_dir_all(&dst)?; - for entry in std::fs::read_dir(src)? { - let entry = entry?; - let ty = entry.file_type()?; - if ty.is_dir() { - move_dir_all(entry.path(), dst.as_ref().join(entry.file_name()))?; - std::fs::remove_dir(entry.path())?; - } else { - std::fs::rename(entry.path(), dst.as_ref().join(entry.file_name()))?; - } - } - Ok(()) -} - -/// Helps with converting release candidate numbers which are different on Thunderstore -/// due to restrictions imposed by the platform -pub fn convert_release_candidate_number(version_number: String) -> String { - let release_candidate_suffix = "-rc"; - - if !version_number.contains(release_candidate_suffix) { - // Not an release-candidate version number, nothing to do, return early - return version_number; - } - - // Version number is guaranteed to contain `-rc` - let re = regex::Regex::new(r"(\d+)\.(\d+)\.(\d+)-rc(\d+)").unwrap(); - if let Some(captures) = re.captures(&version_number) { - // Extract versions - let major_version: u32 = captures[1].parse().unwrap(); - let minor_version: u32 = captures[2].parse().unwrap(); - let patch_version: u32 = captures[3].parse().unwrap(); - let release_candidate: u32 = captures[4].parse().unwrap(); - - // Zero pad - let padded_release_candidate = format!("{:02}", release_candidate); - - // Combine - let combined_patch_version = format!("{}{}", patch_version, padded_release_candidate); - - // Strip leading zeroes - let trimmed_combined_patch_version = combined_patch_version.trim_start_matches('0'); - - // Combine all - let version_number = format!( - "{}.{}.{}", - major_version, minor_version, trimmed_combined_patch_version - ); - return version_number; - } - - // We should never end up here - panic!(); -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_not_release_candidate() { - let input = "1.2.3".to_string(); - let output = convert_release_candidate_number(input.clone()); - let expected_output = input; - assert_eq!(output, expected_output); - } - - #[test] - fn test_basic_release_candidate_number_conversion() { - let input = "1.2.3-rc4".to_string(); - let output = convert_release_candidate_number(input); - let expected_output = "1.2.304"; - assert_eq!(output, expected_output); - } - - #[test] - fn test_leading_zero_release_candidate_number_conversion() { - let input = "1.2.0-rc3".to_string(); - let output = convert_release_candidate_number(input); - let expected_output = "1.2.3"; - assert_eq!(output, expected_output); - } - - #[test] - fn test_double_patch_digit_release_candidate_number_conversion() { - // let input = "v1.2.34-rc5".to_string(); - // let output = convert_release_candidate_number(input); - // let expected_output = "v1.2.3405"; - let input = "1.19.10-rc1".to_string(); - let output = convert_release_candidate_number(input); - let expected_output = "1.19.1001"; - - assert_eq!(output, expected_output); - } - - #[test] - fn test_double_digit_release_candidate_number_conversion() { - let input = "1.2.3-rc45".to_string(); - let output = convert_release_candidate_number(input); - let expected_output = "1.2.345"; - - assert_eq!(output, expected_output); - } - - #[test] - fn test_double_digit_patch_and_rc_number_conversion() { - let input = "1.2.34-rc56".to_string(); - let output = convert_release_candidate_number(input); - let expected_output = "1.2.3456"; - - assert_eq!(output, expected_output); - } -} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 30dbdfcb..0fbb614c 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,74 +1,35 @@ { - "$schema": "../node_modules/@tauri-apps/cli/schema.json", + "$schema": "https://schema.tauri.app/config/2", + "productName": "FlightCore", + "version": "2.26.2", + "identifier": "com.github.r2northstartools.flightcore", "build": { - "beforeBuildCommand": "cd src-vue && npm run build", - "beforeDevCommand": "cd src-vue && npm run dev", - "devPath": "http://localhost:5173/", - "distDir": "../src-vue/dist" + "beforeDevCommand": "npm run dev", + "devUrl": "http://localhost:1420/", + "beforeBuildCommand": "npm run build", + "frontendDist": "../dist" }, - "package": { - "productName": "FlightCore", - "version": "2.26.2" - }, - "tauri": { - "allowlist": { - "all": true - }, - "bundle": { - "active": true, - "category": "DeveloperTool", - "copyright": "", - "deb": { - "depends": [] - }, - "externalBin": [], - "icon": [ - "icons/32x32.png", - "icons/128x128.png", - "icons/128x128@2x.png", - "icons/icon.icns", - "icons/icon.ico" - ], - "identifier": "com.github.r2northstartools.flightcore", - "longDescription": "", - "macOS": { - "entitlements": null, - "exceptionDomain": "", - "frameworks": [], - "providerShortName": null, - "signingIdentity": null - }, - "resources": [], - "shortDescription": "", - "targets": "all", - "windows": { - "certificateThumbprint": null, - "digestAlgorithm": "sha256", - "timestampUrl": "" - } - }, - "security": { - "csp": null - }, - "updater": { - "active": true, - "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IEVBNjM3NzJGRDgxMTU4NUUKUldSZVdCSFlMM2RqNmdhK3pIZjhEYWg2WnZGSFJqdkhLSHNOSjNhaW5VQVFLaHV3YWFDTnFKWWQK", - "endpoints": [ - "https://github.com/R2NorthstarTools/FlightCore/releases/latest/download/latest-release.json" - ], - "dialog": true - }, + "app": { "windows": [ { - "fullscreen": false, - "resizable": true, - "decorations": false, "title": "FlightCore", - "height": 600, - "minHeight": 300, "width": 1010, - "minWidth": 600 + "height": 600 } + ], + "security": { + "csp": null + } + }, + "bundle": { + "active": true, + "targets": "all", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" ] } } diff --git a/src-vue/.gitignore b/src-vue/.gitignore deleted file mode 100644 index a547bf36..00000000 --- a/src-vue/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/src-vue/README.md b/src-vue/README.md deleted file mode 100644 index e6d7ea6e..00000000 --- a/src-vue/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# FlightCore UI - -This folder holds FlightCore's interface repository. - -This is a [Vue (v4)](https://vuejs.org/) project, using [Element Plus](https://element-plus.org/en-US/) component library. - -## Development - -```shell -# Install dependencies -npm install - -# Run in development mode -npm run dev - -# Build for production -npm run build -``` diff --git a/src-vue/package-lock.json b/src-vue/package-lock.json deleted file mode 100644 index b67fa7d8..00000000 --- a/src-vue/package-lock.json +++ /dev/null @@ -1,1391 +0,0 @@ -{ - "name": "src-vue", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "src-vue", - "version": "0.0.0", - "dependencies": { - "@element-plus/icons-vue": "^2.0.9", - "element-plus": "^2.7.8", - "marked": "^14.1.3", - "tauri-plugin-store-api": "github:tauri-apps/tauri-plugin-store#v1", - "vue": "^3.4.35", - "vue-i18n": "^9.13.1", - "vue-router": "^4.4.3", - "vuex": "^4.0.2" - }, - "devDependencies": { - "@vitejs/plugin-vue": "^3.1.0", - "typescript": "^5.6.3", - "vite": "^3.1.0", - "vue-tsc": "^2.1.10" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", - "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", - "dependencies": { - "@babel/types": "^7.25.2" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", - "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@ctrl/tinycolor": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz", - "integrity": "sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@element-plus/icons-vue": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz", - "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==", - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", - "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", - "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", - "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==", - "dependencies": { - "@floating-ui/utils": "^0.1.1" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", - "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", - "dependencies": { - "@floating-ui/core": "^1.4.1", - "@floating-ui/utils": "^0.1.1" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz", - "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" - }, - "node_modules/@intlify/core-base": { - "version": "9.13.1", - "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.13.1.tgz", - "integrity": "sha512-+bcQRkJO9pcX8d0gel9ZNfrzU22sZFSA0WVhfXrf5jdJOS24a+Bp8pozuS9sBI9Hk/tGz83pgKfmqcn/Ci7/8w==", - "dependencies": { - "@intlify/message-compiler": "9.13.1", - "@intlify/shared": "9.13.1" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - } - }, - "node_modules/@intlify/message-compiler": { - "version": "9.13.1", - "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.13.1.tgz", - "integrity": "sha512-SKsVa4ajYGBVm7sHMXd5qX70O2XXjm55zdZB3VeMFCvQyvLew/dLvq3MqnaIsTMF1VkkOb9Ttr6tHcMlyPDL9w==", - "dependencies": { - "@intlify/shared": "9.13.1", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - } - }, - "node_modules/@intlify/shared": { - "version": "9.13.1", - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.13.1.tgz", - "integrity": "sha512-u3b6BKGhE6j/JeRU6C/RL2FgyJfy6LakbtfeVF8fJXURpZZTzfh3e05J0bu0XPw447Q6/WUp3C4ajv4TMS4YsQ==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "node_modules/@popperjs/core": { - "name": "@sxzz/popperjs-es", - "version": "2.11.7", - "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", - "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@tauri-apps/api": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-1.5.3.tgz", - "integrity": "sha512-zxnDjHHKjOsrIzZm6nO5Xapb/BxqUq1tc7cGkFXsFkGTsSWgCPH1D8mm0XS9weJY2OaR73I3k3S+b7eSzJDfqA==", - "engines": { - "node": ">= 14.6.0", - "npm": ">= 6.6.0", - "yarn": ">= 1.19.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/tauri" - } - }, - "node_modules/@types/lodash": { - "version": "4.14.196", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.196.tgz", - "integrity": "sha512-22y3o88f4a94mKljsZcanlNWPzO0uBsBdzLAngf2tp533LzZcQzb6+eZPJ+vCTt+bqF2XnvT9gejTLsAcJAJyQ==" - }, - "node_modules/@types/lodash-es": { - "version": "4.17.8", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.8.tgz", - "integrity": "sha512-euY3XQcZmIzSy7YH5+Unb3b2X12Wtk54YWINBvvGQ5SmMvwb11JQskGsfkH/5HXK77Kr8GF0wkVDIxzAisWtog==", - "dependencies": { - "@types/lodash": "*" - } - }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", - "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" - }, - "node_modules/@vitejs/plugin-vue": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz", - "integrity": "sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==", - "dev": true, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^3.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@volar/language-core": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.8.tgz", - "integrity": "sha512-K/GxMOXGq997bO00cdFhTNuR85xPxj0BEEAy+BaqqayTmy9Tmhfgmq2wpJcVspRhcwfgPoE2/mEJa26emUhG/g==", - "dev": true, - "dependencies": { - "@volar/source-map": "2.4.8" - } - }, - "node_modules/@volar/source-map": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.8.tgz", - "integrity": "sha512-jeWJBkC/WivdelMwxKkpFL811uH/jJ1kVxa+c7OvG48DXc3VrP7pplSWPP2W1dLMqBxD+awRlg55FQQfiup4cA==", - "dev": true - }, - "node_modules/@volar/typescript": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.8.tgz", - "integrity": "sha512-6xkIYJ5xxghVBhVywMoPMidDDAFT1OoQeXwa27HSgJ6AiIKRe61RXLoik+14Z7r0JvnblXVsjsRLmCr42SGzqg==", - "dev": true, - "dependencies": { - "@volar/language-core": "2.4.8", - "path-browserify": "^1.0.1", - "vscode-uri": "^3.0.8" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.35.tgz", - "integrity": "sha512-gKp0zGoLnMYtw4uS/SJRRO7rsVggLjvot3mcctlMXunYNsX+aRJDqqw/lV5/gHK91nvaAAlWFgdVl020AW1Prg==", - "dependencies": { - "@babel/parser": "^7.24.7", - "@vue/shared": "3.4.35", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.35.tgz", - "integrity": "sha512-pWIZRL76/oE/VMhdv/ovZfmuooEni6JPG1BFe7oLk5DZRo/ImydXijoZl/4kh2406boRQ7lxTYzbZEEXEhj9NQ==", - "dependencies": { - "@vue/compiler-core": "3.4.35", - "@vue/shared": "3.4.35" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.35.tgz", - "integrity": "sha512-xacnRS/h/FCsjsMfxBkzjoNxyxEyKyZfBch/P4vkLRvYJwe5ChXmZZrj8Dsed/752H2Q3JE8kYu9Uyha9J6PgA==", - "dependencies": { - "@babel/parser": "^7.24.7", - "@vue/compiler-core": "3.4.35", - "@vue/compiler-dom": "3.4.35", - "@vue/compiler-ssr": "3.4.35", - "@vue/shared": "3.4.35", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.10", - "postcss": "^8.4.40", - "source-map-js": "^1.2.0" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.35.tgz", - "integrity": "sha512-7iynB+0KB1AAJKk/biENTV5cRGHRdbdaD7Mx3nWcm1W8bVD6QmnH3B4AHhQQ1qZHhqFwzEzMwiytXm3PX1e60A==", - "dependencies": { - "@vue/compiler-dom": "3.4.35", - "@vue/shared": "3.4.35" - } - }, - "node_modules/@vue/compiler-vue2": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", - "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", - "dev": true, - "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.2.0" - } - }, - "node_modules/@vue/devtools-api": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.3.tgz", - "integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==" - }, - "node_modules/@vue/language-core": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.1.10.tgz", - "integrity": "sha512-DAI289d0K3AB5TUG3xDp9OuQ71CnrujQwJrQnfuZDwo6eGNf0UoRlPuaVNO+Zrn65PC3j0oB2i7mNmVPggeGeQ==", - "dev": true, - "dependencies": { - "@volar/language-core": "~2.4.8", - "@vue/compiler-dom": "^3.5.0", - "@vue/compiler-vue2": "^2.7.16", - "@vue/shared": "^3.5.0", - "alien-signals": "^0.2.0", - "minimatch": "^9.0.3", - "muggle-string": "^0.4.1", - "path-browserify": "^1.0.1" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@vue/language-core/node_modules/@vue/compiler-core": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.12.tgz", - "integrity": "sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.12", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" - } - }, - "node_modules/@vue/language-core/node_modules/@vue/compiler-dom": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.12.tgz", - "integrity": "sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==", - "dev": true, - "dependencies": { - "@vue/compiler-core": "3.5.12", - "@vue/shared": "3.5.12" - } - }, - "node_modules/@vue/language-core/node_modules/@vue/shared": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz", - "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==", - "dev": true - }, - "node_modules/@vue/reactivity": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.35.tgz", - "integrity": "sha512-Ggtz7ZZHakriKioveJtPlStYardwQH6VCs9V13/4qjHSQb/teE30LVJNrbBVs4+aoYGtTQKJbTe4CWGxVZrvEw==", - "dependencies": { - "@vue/shared": "3.4.35" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.35.tgz", - "integrity": "sha512-D+BAjFoWwT5wtITpSxwqfWZiBClhBbR+bm0VQlWYFOadUUXFo+5wbe9ErXhLvwguPiLZdEF13QAWi2vP3ZD5tA==", - "dependencies": { - "@vue/reactivity": "3.4.35", - "@vue/shared": "3.4.35" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.35.tgz", - "integrity": "sha512-yGOlbos+MVhlS5NWBF2HDNgblG8e2MY3+GigHEyR/dREAluvI5tuUUgie3/9XeqhPE4LF0i2wjlduh5thnfOqw==", - "dependencies": { - "@vue/reactivity": "3.4.35", - "@vue/runtime-core": "3.4.35", - "@vue/shared": "3.4.35", - "csstype": "^3.1.3" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.35.tgz", - "integrity": "sha512-iZ0e/u9mRE4T8tNhlo0tbA+gzVkgv8r5BX6s1kRbOZqfpq14qoIvCZ5gIgraOmYkMYrSEZgkkojFPr+Nyq/Mnw==", - "dependencies": { - "@vue/compiler-ssr": "3.4.35", - "@vue/shared": "3.4.35" - }, - "peerDependencies": { - "vue": "3.4.35" - } - }, - "node_modules/@vue/shared": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.35.tgz", - "integrity": "sha512-hvuhBYYDe+b1G8KHxsQ0diDqDMA8D9laxWZhNAjE83VZb5UDaXl9Xnz7cGdDSyiHM90qqI/CyGMcpBpiDy6VVQ==" - }, - "node_modules/@vueuse/core": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", - "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", - "dependencies": { - "@types/web-bluetooth": "^0.0.16", - "@vueuse/metadata": "9.13.0", - "@vueuse/shared": "9.13.0", - "vue-demi": "*" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/core/node_modules/vue-demi": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", - "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", - "hasInstallScript": true, - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/@vueuse/metadata": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", - "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", - "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", - "dependencies": { - "vue-demi": "*" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared/node_modules/vue-demi": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", - "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", - "hasInstallScript": true, - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/alien-signals": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.2.0.tgz", - "integrity": "sha512-StlonZhBBrsPPwrDjiPAiVTf/rolxffLxVPT60Qv/t88BZ81BvUVzHgGqEFvJ1ii8HXtm1+zU2Icr59tfWEcag==", - "dev": true - }, - "node_modules/async-validator": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", - "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "node_modules/dayjs": { - "version": "1.11.9", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", - "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" - }, - "node_modules/de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true - }, - "node_modules/element-plus": { - "version": "2.7.8", - "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.7.8.tgz", - "integrity": "sha512-h6dx2XihAbQaud0v+6O7Fy0b0G3YNplNVH7QnK3csTcvQd4y4raiyMRQpf9EKbRbTMdNrFsqAZrs9ok9DMcJHg==", - "dependencies": { - "@ctrl/tinycolor": "^3.4.1", - "@element-plus/icons-vue": "^2.3.1", - "@floating-ui/dom": "^1.0.1", - "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", - "@types/lodash": "^4.14.182", - "@types/lodash-es": "^4.17.6", - "@vueuse/core": "^9.1.0", - "async-validator": "^4.2.5", - "dayjs": "^1.11.3", - "escape-html": "^1.0.3", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "lodash-unified": "^1.0.2", - "memoize-one": "^6.0.0", - "normalize-wheel-es": "^1.2.0" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/esbuild": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", - "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.15.18", - "@esbuild/linux-loong64": "0.15.18", - "esbuild-android-64": "0.15.18", - "esbuild-android-arm64": "0.15.18", - "esbuild-darwin-64": "0.15.18", - "esbuild-darwin-arm64": "0.15.18", - "esbuild-freebsd-64": "0.15.18", - "esbuild-freebsd-arm64": "0.15.18", - "esbuild-linux-32": "0.15.18", - "esbuild-linux-64": "0.15.18", - "esbuild-linux-arm": "0.15.18", - "esbuild-linux-arm64": "0.15.18", - "esbuild-linux-mips64le": "0.15.18", - "esbuild-linux-ppc64le": "0.15.18", - "esbuild-linux-riscv64": "0.15.18", - "esbuild-linux-s390x": "0.15.18", - "esbuild-netbsd-64": "0.15.18", - "esbuild-openbsd-64": "0.15.18", - "esbuild-sunos-64": "0.15.18", - "esbuild-windows-32": "0.15.18", - "esbuild-windows-64": "0.15.18", - "esbuild-windows-arm64": "0.15.18" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", - "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", - "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", - "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", - "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", - "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", - "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", - "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", - "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", - "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", - "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", - "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", - "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", - "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", - "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", - "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", - "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", - "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", - "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", - "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", - "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "node_modules/lodash-unified": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", - "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", - "peerDependencies": { - "@types/lodash-es": "*", - "lodash": "*", - "lodash-es": "*" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/marked": { - "version": "14.1.3", - "resolved": "https://registry.npmjs.org/marked/-/marked-14.1.3.tgz", - "integrity": "sha512-ZibJqTULGlt9g5k4VMARAktMAjXoVnnr+Y3aCqW1oDftcV4BA3UmrBifzXoZyenHRk75csiPu9iwsTj4VNBT0g==", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/muggle-string": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", - "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/normalize-wheel-es": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", - "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" - }, - "node_modules/postcss": { - "version": "8.4.40", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.40.tgz", - "integrity": "sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/rollup": { - "version": "2.79.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", - "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", - "dev": true, - "license": "MIT", - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tauri-plugin-store-api": { - "version": "0.0.0", - "resolved": "git+ssh://git@github.com/tauri-apps/tauri-plugin-store.git#02243686d0507d2aeeb2924cd889dd0bcb47ecef", - "license": "MIT or APACHE-2.0", - "dependencies": { - "@tauri-apps/api": "1.5.3" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", - "devOptional": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/vite": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.11.tgz", - "integrity": "sha512-K/jGKL/PgbIgKCiJo5QbASQhFiV02X9Jh+Qq0AKCRCRKZtOTVi4t6wh75FDpGf2N9rYOnzH87OEFQNaFy6pdxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.15.9", - "postcss": "^8.4.18", - "resolve": "^1.22.1", - "rollup": "^2.79.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vscode-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", - "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", - "dev": true - }, - "node_modules/vue": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.35.tgz", - "integrity": "sha512-+fl/GLmI4GPileHftVlCdB7fUL4aziPcqTudpTGXCT8s+iZWuOCeNEB5haX6Uz2IpRrbEXOgIFbe+XciCuGbNQ==", - "dependencies": { - "@vue/compiler-dom": "3.4.35", - "@vue/compiler-sfc": "3.4.35", - "@vue/runtime-dom": "3.4.35", - "@vue/server-renderer": "3.4.35", - "@vue/shared": "3.4.35" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vue-i18n": { - "version": "9.13.1", - "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.13.1.tgz", - "integrity": "sha512-mh0GIxx0wPtPlcB1q4k277y0iKgo25xmDPWioVVYanjPufDBpvu5ySTjP5wOrSvlYQ2m1xI+CFhGdauv/61uQg==", - "dependencies": { - "@intlify/core-base": "9.13.1", - "@intlify/shared": "9.13.1", - "@vue/devtools-api": "^6.5.0" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - }, - "peerDependencies": { - "vue": "^3.0.0" - } - }, - "node_modules/vue-router": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.3.tgz", - "integrity": "sha512-sv6wmNKx2j3aqJQDMxLFzs/u/mjA9Z5LCgy6BE0f7yFWMjrPLnS/sPNn8ARY/FXw6byV18EFutn5lTO6+UsV5A==", - "dependencies": { - "@vue/devtools-api": "^6.6.3" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/vue-tsc": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.1.10.tgz", - "integrity": "sha512-RBNSfaaRHcN5uqVqJSZh++Gy/YUzryuv9u1aFWhsammDJXNtUiJMNoJ747lZcQ68wUQFx6E73y4FY3D8E7FGMA==", - "dev": true, - "dependencies": { - "@volar/typescript": "~2.4.8", - "@vue/language-core": "2.1.10", - "semver": "^7.5.4" - }, - "bin": { - "vue-tsc": "bin/vue-tsc.js" - }, - "peerDependencies": { - "typescript": ">=5.0.0" - } - }, - "node_modules/vuex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.1.0.tgz", - "integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==", - "dependencies": { - "@vue/devtools-api": "^6.0.0-beta.11" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } -} diff --git a/src-vue/package.json b/src-vue/package.json deleted file mode 100644 index be8d155f..00000000 --- a/src-vue/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "src-vue", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vue-tsc --noEmit && vite build", - "preview": "vite preview" - }, - "dependencies": { - "@element-plus/icons-vue": "^2.0.9", - "element-plus": "^2.7.8", - "marked": "^14.1.3", - "tauri-plugin-store-api": "github:tauri-apps/tauri-plugin-store#v1", - "vue": "^3.4.35", - "vue-i18n": "^9.13.1", - "vue-router": "^4.4.3", - "vuex": "^4.0.2" - }, - "devDependencies": { - "@vitejs/plugin-vue": "^3.1.0", - "typescript": "^5.6.3", - "vite": "^3.1.0", - "vue-tsc": "^2.1.10" - } -} diff --git a/src-vue/src/App.vue b/src-vue/src/App.vue deleted file mode 100644 index 9db6c488..00000000 --- a/src-vue/src/App.vue +++ /dev/null @@ -1,213 +0,0 @@ -<script lang="ts"> -import ChangelogView from './views/ChangelogView.vue'; -import DeveloperView from './views/DeveloperView.vue'; -import PlayView from './views/PlayView.vue'; -import ModsView from './views/ModsView.vue'; -import SettingsView from './views/SettingsView.vue'; -import { appWindow } from '@tauri-apps/api/window'; -import { store } from './plugins/store'; -import { Store } from 'tauri-plugin-store-api'; -import { invoke } from "@tauri-apps/api"; -import NotificationButton from "./components/NotificationButton.vue"; - -export default { - components: { - NotificationButton, - ChangelogView, - DeveloperView, - PlayView, - SettingsView, - ModsView - }, - data() { - return {} - }, - mounted: async function() { - store.commit('initialize'); - - // Initialize interface language - const persistentStore = new Store('flight-core-settings.json'); - let lang: string | null = await persistentStore.get('lang'); - if (lang === null) { - lang = navigator.language.substring(0, 2); - persistentStore.set('lang', lang); - await persistentStore.save(); - } - this.$root!.$i18n.locale = lang; - }, - methods: { - minimize() { - appWindow.minimize() - }, - close() { - invoke("close_application"); - } - }, - computed: { - bgStyle(): string { - // @ts-ignore - const shouldBlur = this.$route.path !== "/"; - return `filter: brightness(0.8) ${shouldBlur ? 'blur(5px)' : ''};`; - } - } -} -</script> - -<template> - <div class="app-inner"> - <div id="fc_bg__container" :style="bgStyle"/> - - <nav id="fc_menu-bar" v-if="$route.path !== '/repair'"><!-- Hide menu bar in repair view --> - <!-- Navigation items --> - <el-menu - :default-active="$route.path" - router - mode="horizontal" - id="fc__menu_items" - data-tauri-drag-region - > - <el-menu-item index="/">{{ $t('menu.play') }}</el-menu-item> - <el-menu-item index="/mods">{{ $t('menu.mods') }}</el-menu-item> - <el-menu-item index="/changelog">{{ $t('menu.changelog') }}</el-menu-item> - <el-menu-item index="/settings">{{ $t('menu.settings') }}</el-menu-item> - <el-menu-item index="/dev" v-if="$store.state.developer_mode">{{ $t('menu.dev') }}</el-menu-item> - </el-menu> - - <!-- Window controls --> - <div id="fc_window__controls"> - <NotificationButton /> - <el-button color="white" icon="SemiSelect" @click="minimize" circle /> - <el-button color="white" icon="CloseBold" @click="close" circle /> - </div> - </nav> - - <router-view></router-view> - </div> -</template> - -<style> -#fc_menu-bar { - position: fixed; - z-index: 1; - top: 0; - width: 100%; - height: var(--fc-menu_height); -} - -#fc__menu_bar::before { - position: absolute; - content: ""; - inset: 0; /* same as { top: 0; right: 0; bottom: 0; left: 0; } */ - background-image: linear-gradient(to bottom, red, orange); - z-index: 1; - opacity: 0; - transition: opacity 1s linear; -} - -#fc__menu_bar:hover::before { - opacity: 1; -} - -/* Borders reset */ -#fc__menu_bar, #fc__menu_items { - border: none !important; -} -.app-inner { - height: 100%; - width: 100%; -} - -/* Header item */ -#fc__menu_items { - height: 100%; - background-color: transparent; - float: left; - width: calc(100% - 168px); /* window controls container width */ -} - -#fc__menu_items .el-menu-item, #fc__menu_items .el-sub-menu__title { - color: #b4b6b9; - border-color: white; -} - -#fc__menu_items > .el-menu-item { - text-transform: uppercase; - border: none !important; - font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', '微软雅黑', Arial, sans-serif; - font-weight: bold; - font-size: large; - background-color: transparent !important; - - border-width: 2px !important; - border-style: solid !important; - border-color: transparent !important; - border-radius: 10px !important; - transition: none; -} - -#fc__menu_items .el-menu-item:hover, #fc__menu_items .el-sub-menu__title { - color: #c6c9ce; - background-color: transparent; -} - -#fc__menu_items .el-menu-item:focus-visible { - border-color: rgb(160, 207, 255) !important; -} - -#fc__menu_items .el-menu-item.is-active, #fc__menu_items .el-sub-menu.is-active > .el-sub-menu__title { - color: white !important; -} - -.app-inner > .fc__mods__container { - overflow-y: auto; - height: calc(100% - var(--fc-menu_height)); -} - -/* Header menu */ -.developer_build { - background: repeating-linear-gradient( - 45deg, - rgba(0, 0, 0, 0.2), - rgba(0, 0, 0, 0.2) 20px, - rgba(0, 0, 0, 0.3) 20px, - rgba(0, 0, 0, 0.3) 40px - ); -} - -/* Window controls */ -#fc_window__controls { - float: right; - height: 100%; -} - -#fc_window__controls > button, -#fc_window__controls > .el-dropdown > button, -#fc_window__controls > .el-dropdown > .el-badge > button { - color: white; - font-size: 20px; - margin: auto 5px; - background: none; - border: none; - height: 100%; -} - -#fc_window__controls > button:hover, -#fc_window__controls > .el-dropdown > button:hover, -#fc_window__controls > .el-dropdown > .el-badge > button:hover { - color: #c6c9ce; -} - -#fc_window__controls > button:active, -#fc_window__controls > .el-dropdown > button:active { - color: #56585a; -} - -#fc_window__controls > button:last-of-type { - margin-right: 15px; -} - -sup { - border: none !important; -} - -</style> diff --git a/src-vue/src/assets/mp_colony020033.jpg b/src-vue/src/assets/mp_colony020033.jpg Binary files differdeleted file mode 100644 index ed44eca9..00000000 --- a/src-vue/src/assets/mp_colony020033.jpg +++ /dev/null diff --git a/src-vue/src/assets/thunderstore-icon.png b/src-vue/src/assets/thunderstore-icon.png Binary files differdeleted file mode 100644 index c286ab11..00000000 --- a/src-vue/src/assets/thunderstore-icon.png +++ /dev/null diff --git a/src-vue/src/assets/wallpaperflare.com_wallpaper.jpg b/src-vue/src/assets/wallpaperflare.com_wallpaper.jpg Binary files differdeleted file mode 100644 index 74a840cd..00000000 --- a/src-vue/src/assets/wallpaperflare.com_wallpaper.jpg +++ /dev/null diff --git a/src-vue/src/components/InstallProgressBar.vue b/src-vue/src/components/InstallProgressBar.vue deleted file mode 100644 index 21901ac0..00000000 --- a/src-vue/src/components/InstallProgressBar.vue +++ /dev/null @@ -1,102 +0,0 @@ -<script lang="ts"> -import { defineComponent } from 'vue'; -import { appWindow } from '@tauri-apps/api/window'; -import { InstallProgress } from '../../../src-tauri/bindings/InstallProgress'; - -export default defineComponent({ - name: 'InstallProgressBar', - computed: { - progressBarStyle(): string { - return !this.install_or_update ? 'hide-progress' : ''; - } - }, - data() { - return { - percentage: 0, - color: '#409EFF', - install_or_update: false, - status: "unknown", - current_downloaded: -1, - total_size: -1, - }; - }, - methods: { - formatBytes(bytes: number, decimals = 2) { - if (bytes === 0) return '0 Bytes'; - const k = 1000; - const dm = decimals < 0 ? 0 : decimals; - const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; - const i = Math.floor(Math.log(bytes) / Math.log(k)); - return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; - }, - formatText() { - if (this.status == "Downloading") { - const current_downloaded_string = this.formatBytes(this.current_downloaded); - const total_size_string = this.formatBytes(this.total_size); - const status = this.$t("generic.downloading"); - return `${status}: ${current_downloaded_string}/${total_size_string}`; - } - if (this.status == "Extracting") { - return this.$t("generic.extracting"); - } - return "Inactive"; // Needed to keep same size format when progress bar is hidden - } - }, - mounted() { - appWindow.listen<InstallProgress>( - 'northstar-install-download-progress', - ({ event, payload }) => { - this.install_or_update = true; - let progress = payload; - this.status = progress.state; - if (progress.state == "Downloading") { - this.percentage = ((Number(progress.current_downloaded) / Number(progress.total_size)) * 100); - this.color = '#409EFF'; - this.current_downloaded = Number(progress.current_downloaded); - this.total_size = Number(progress.total_size); - } - if (progress.state == "Extracting") { - this.percentage = 100; - this.color = '#67C23A'; - } - if (progress.state == "Done") { - // Clear state again - this.install_or_update = false - } - } - ); - } -}); -</script> - -<template> - <el-progress - :class="progressBarStyle" - :format="formatText" - :percentage="percentage" - :color="color" - :indeterminate="status === 'Extracting'" - :duration="1" - > - </el-progress> -</template> - -<style scoped> -.el-progress { - margin-top: 10px; -} - -/* Set progress bar width */ -.el-progress:deep(.el-progress-bar) { - width: 200px; - flex-grow: initial; -} - -.el-progress:deep(.el-progress__text) { - line-height: 1.2; -} - -.hide-progress { - opacity: 0; -} -</style> diff --git a/src-vue/src/components/LanguageSelector.vue b/src-vue/src/components/LanguageSelector.vue deleted file mode 100644 index 0c47e674..00000000 --- a/src-vue/src/components/LanguageSelector.vue +++ /dev/null @@ -1,75 +0,0 @@ -<template> - <el-select v-model="value" class="m-2" - :placeholder="$t('settings.language_select')" size="large" - @change="onChange" - > - <el-option - v-for="item in options" - :key="item.value" - :label="item.label" - :value="item.value" - /> - </el-select> -</template> - -<script lang="ts"> -import { defineComponent } from 'vue'; -import { Store } from 'tauri-plugin-store-api'; -const persistentStore = new Store('flight-core-settings.json'); - -export default defineComponent({ - name: 'LanguageSelector', - data: () => ({ - value: '', - options: [ - { - value: 'en', - label: 'English' - }, - { - value: 'fr', - label: 'Français' - }, - { - value: 'de', - label: 'Deutsch' - }, - { - value: 'es', - label: 'Español' - }, - { - value: 'pl', - label: 'polski' - }, - { - value: 'ru', - label: 'русский' - }, - { - value: 'it', - label: 'Italiano' - }, - { - value: 'da', - label: 'Dansk' - }, - { - value: 'zh_Hans', - label: '简体中文' - }, - ] - }), - mounted: async function () { - const lang: string = await persistentStore.get('lang') as string; - this.value = lang; - }, - methods: { - async onChange(value: string) { - this.$root!.$i18n.locale = value; - persistentStore.set('lang', value); - await persistentStore.save(); - } - } -}) -</script> diff --git a/src-vue/src/components/LocalModCard.vue b/src-vue/src/components/LocalModCard.vue deleted file mode 100644 index 697cced1..00000000 --- a/src-vue/src/components/LocalModCard.vue +++ /dev/null @@ -1,120 +0,0 @@ -<template> - <el-card shadow="hover"> - <div class="name"> - {{ mod.name }} <span v-if="mod.version != null">(v{{ mod.version }})</span> - <img - v-if="mod.thunderstore_mod_string != null" - :title="$t('mods.local.part_of_ts_mod') + '\n' + mod.thunderstore_mod_string" - src="/src/assets/thunderstore-icon.png" - class="image" - height="16" - /> - </div> - <div> - <el-switch - style="--el-switch-on-color: #13ce66; --el-switch-off-color: #8957e5" - v-model="mod.enabled" - :before-change="() => updateWhichModsEnabled(mod)" - :loading="global_load_indicator" - class="switch" - /> - <el-popconfirm - :title="$t('mods.local.delete_confirm')" - :confirm-button-text="$t('generic.yes')" - :cancel-button-text="$t('generic.no')" - @confirm="deleteMod(mod)" - > - <template #reference> - <el-button type="danger"> - {{ $t('mods.local.delete') }} - </el-button> - </template> - </el-popconfirm> - </div> - </el-card> -</template> - -<script lang="ts"> -import { defineComponent } from "vue"; -import { invoke } from "@tauri-apps/api"; -import { NorthstarMod } from "../../../src-tauri/bindings/NorthstarMod"; -import { showErrorNotification, showNotification } from "../utils/ui"; - -export default defineComponent({ - name: "LocalModCard", - props: { - mod: { - required: true, - type: Object as () => NorthstarMod - } - }, - data() { - return { - global_load_indicator: false, - }; - }, - methods: { - async updateWhichModsEnabled(mod: NorthstarMod) { - this.global_load_indicator = true; - - // enable/disable specific mod - try { - await invoke("set_mod_enabled_status", { - gameInstall: this.$store.state.game_install, - modName: mod.name, - // Need to set it to the opposite of current state, - // as current state is only updated after command is run - isEnabled: !mod.enabled, - }) - } - catch (error) { - showErrorNotification(`${error}`); - this.global_load_indicator = false; - return false; - } - - this.global_load_indicator = false; - return true; - }, - async deleteMod(mod: NorthstarMod) { - await invoke("delete_northstar_mod", { gameInstall: this.$store.state.game_install, nsmodName: mod.name }) - .then((message) => { - // Just a visual indicator that it worked - showNotification(this.$t('mods.local.success_deleting', { modName: mod.name })); - }) - .catch((error) => { - showErrorNotification(error); - }) - .finally(() => { - this.$store.commit('loadInstalledMods'); - }); - }, - } -}); -</script> - -<style scoped> - /* - This is a hack to style the card body - since it doesn't work with scoped styles - */ - :deep(.el-card__body) { - display: flex !important; - align-items: center; - width: 100%; - justify-content: space-between; - } - - .name { - display: flex; - } - - .image { - margin: 0 5px; - } - - .switch { - padding-left: 5px; - padding-right: 5px; - } -</style> diff --git a/src-vue/src/components/ModsMenu.vue b/src-vue/src/components/ModsMenu.vue deleted file mode 100644 index 66ecc71a..00000000 --- a/src-vue/src/components/ModsMenu.vue +++ /dev/null @@ -1,141 +0,0 @@ -<template> - <nav class="fc_mods__menu"> - <el-menu - default-active="1" - text-color="#fff" - > - <h5>{{ $t('menu.mods') }}</h5> - <el-menu-item index="1" @click="$emit('showLocalMods', true)"> - <el-icon><Folder /></el-icon> - <span>{{ $t('mods.menu.local') }}</span> - </el-menu-item> - - <!-- Display a badge if there are some outdated Thunderstore mods --> - <el-menu-item v-if="outdatedThunderstoreModsCount !== 0" index="2" @click="$emit('showLocalMods', false)"> - <el-badge :value="outdatedThunderstoreModsCount" class="item" type="warning"> - <el-icon><Connection /></el-icon> - <span>{{ $t('mods.menu.online') }}</span> - </el-badge> - </el-menu-item> - <el-menu-item v-else index="2" @click="$emit('showLocalMods', false)"> - <el-icon><Connection /></el-icon> - <span>{{ $t('mods.menu.online') }}</span> - </el-menu-item> - - <!-- Search inputs --> - <h5>{{ $t('mods.menu.filter') }}</h5> - <el-input v-model="$store.state.search.searchValue" :placeholder="$t('mods.menu.search')" clearable /> - <el-select - v-if="!showingLocalMods" - v-model="$store.state.search.sortValue" - :placeholder="$t('mods.menu.sort_mods')" - > - <el-option - v-for="item of sortValues" - :key="item.value" - :label="item.label" - :value="item.value" - /> - </el-select> - <el-select - v-if="!showingLocalMods" - v-model="$store.state.search.selectedCategories" - multiple - :placeholder="$t('mods.menu.select_categories')" - > - <el-option - v-for="item in $store.state.thunderstoreModsCategories" - :key="item" - :label="item" - :value="item" - /> - </el-select> - - </el-menu> - </nav> -</template> - -<script lang="ts"> -import { defineComponent } from 'vue' -import { SortOptions } from '../utils/SortOptions.d'; -import { isThunderstoreModOutdated } from "../utils/thunderstore/version"; -import { ThunderstoreMod } from "../../../src-tauri/bindings/ThunderstoreMod"; - -export default defineComponent({ - name: 'ModsMenu', - props: { - showingLocalMods: { - required: true, - type: Boolean - } - }, - mounted() { - this.$store.state.search.sortValue = this.sortValues[3].value; - }, - computed: { - outdatedThunderstoreModsCount(): number { - return this.$store.state.thunderstoreMods - .filter((mod: ThunderstoreMod) => isThunderstoreModOutdated(mod)) - .length; - }, - sortValues(): { label: string, value: string }[] { - return Object.keys(SortOptions).map((key: string) => ({ - value: key, - label: this.$t('mods.menu.sort.' + Object.values(SortOptions)[Object.keys(SortOptions).indexOf(key)]) - })); - } - } -}) -</script> - -<style scoped> -.fc_mods__menu { - display: flex; - max-width: 222px; - min-width: 222px; - padding: 10px; -} - -.fc_mods__menu h5 { - margin: 8px 0 16px 5px; -} - -.fc_mods__menu h5:not(:first-child) { - margin-top: 32px; -} - -.fc_mods__menu > .el-menu { - background-color: transparent; - border: none; - width: 100%; -} - -.fc_mods__menu > .el-menu > .el-menu-item { - height: 32px; - margin-bottom: 5px; - border-radius: 5px; - color: #e2e6e7; -} - -.fc_mods__menu > .el-menu > .el-menu-item:hover { - background-color: #4e4e4e3b; -} - -.fc_mods__menu > .el-menu > .el-menu-item.is-active { - color: white; - background-color: #4e4e4e7a; -} - -.el-select { - width: 100%; - margin-top: 5px; -} - -/* Outdated thunderstore mods count */ -.el-badge { - width: 100%; -} -.el-badge:deep(.el-badge__content) { - top: 28px !important; -} -</style> diff --git a/src-vue/src/components/NotificationButton.vue b/src-vue/src/components/NotificationButton.vue deleted file mode 100644 index 3835032d..00000000 --- a/src-vue/src/components/NotificationButton.vue +++ /dev/null @@ -1,81 +0,0 @@ -<template> - <el-dropdown trigger="click" placement="bottom-end" max-height="280" popper-class="fc_popper"> - <el-badge v-if="notifications.length != 0" :value="notifications.length" :max="9" class="item" type="primary"> - <el-button color="white" icon="BellFilled" circle /> - </el-badge> - <el-button v-else color="white" icon="BellFilled" circle /> - <template #dropdown> - <el-dropdown-menu :key="counter"> - <el-alert - v-if="notifications.length != 0" - v-for="(notification, i) in notifications" - :key="i" - :title="notification.title" - :description="notification.text" - :type="notification.type" - show-icon - style="width: 300px" - @close.stop="removeNotification(i)" - /> - <el-result - v-else - icon="success" - :title="i18n.global.tc('notification.no_new.title')" - :sub-title="i18n.global.tc('notification.no_new.text')" - > - <template #icon> - </template> - </el-result> - </el-dropdown-menu> - </template> - </el-dropdown> -</template> - -<script lang="ts"> -import { defineComponent } from 'vue'; -import {Notification} from '../plugins/modules/notifications'; -import {i18n} from "../main"; - -export default defineComponent({ - name: 'NotificationButton', - data: () => ({ - // This variable is used as a key for the dropdown menu, so we can force it to refresh when a item is deleted. - counter: 0 - }), - computed: { - i18n() { - return i18n - }, - notifications(): Notification[] { - return this.$store.state.notifications.notifications; - } - }, - methods: { - removeNotification(index: number) { - this.$store.commit('removeNotification', index); - // By refreshing the notifications list, we ensure the first notification get the index 0, ensuring this list - // is synchronized with the store list. - this.counter += 1; - } - } -}) -</script> - -<style scoped> -.el-dropdown { - height: 100%; - max-height: 300px; -} - -.el-button { - margin: auto 25px auto 0 !important; -} - -.el-alert { - margin: 5px 10px 5px 5px; -} - -.el-badge:deep(sup) { - transform: translate(-10px, 5px) !important; -} -</style> diff --git a/src-vue/src/components/PlayButton.vue b/src-vue/src/components/PlayButton.vue deleted file mode 100644 index 57b408c2..00000000 --- a/src-vue/src/components/PlayButton.vue +++ /dev/null @@ -1,157 +0,0 @@ -<script lang="ts"> -import { defineComponent } from 'vue'; -import { NorthstarState } from '../utils/NorthstarState'; -import { ReleaseCanal } from '../utils/ReleaseCanal'; - -export default defineComponent({ - name: 'PlayButton', - computed: { - currentCanal: { - get(): ReleaseCanal { - return this.$store.state.northstar_release_canal; - }, - set(value: ReleaseCanal) { - if (value !== this.currentCanal) { - this.$store.commit('toggleReleaseCandidate'); - } - } - }, - playButtonLabel(): string { - if (this.$store.state.northstar_is_running) { - return this.$t("play.button.northstar_is_running"); - } - - switch (this.$store.state.northstar_state) { - case NorthstarState.GAME_NOT_FOUND: - return this.$t("play.button.select_game_dir"); - case NorthstarState.INSTALL: - return this.$t("play.button.install"); - case NorthstarState.INSTALLING: - return this.$t("play.button.installing"); - case NorthstarState.MUST_UPDATE: - return this.$t("play.button.update"); - case NorthstarState.UPDATING: - return this.$t("play.button.updating"); - case NorthstarState.READY_TO_PLAY: - return this.$t("play.button.ready_to_play"); - - default: - return ""; - } - }, - northstarIsRunning(): boolean { - return this.$store.state.northstar_is_running; - }, - options(): { key: string, value: string }[] { - return Object.keys(ReleaseCanal).map(function (v) { - return { - key: v, - value: Object.keys(ReleaseCanal)[Object.values(ReleaseCanal).indexOf(v)] - } - }); - }, - selectOptions(): { label: string, options: { value: ReleaseCanal, label: string }[] }[] { - return [ - { - label: 'Beta', - options: [ - { - value: ReleaseCanal.RELEASE_CANDIDATE, - label: this.$t('channels.names.NorthstarReleaseCandidate'), - }, - ] - }, - { - label: 'Stable', - options: [ - { - value: ReleaseCanal.RELEASE, - label: 'Northstar', - }, - ] - } - ]; - }, - showReleaseSwitch(): boolean { - return this.$store.state.enableReleasesSwitch; - }, - - /** - * Button has rounded edges on its right only if releases switching is enabled. - */ - buttonRadiusStyle(): string { - return this.showReleaseSwitch - ? 'border-radius: 2px 0 0 2px;' - : 'border-radius: 2px'; - }, - }, - methods: { - async launchGame() { - this.$store.commit('launchGame'); - } - } -}); -</script> - -<template> - <nav> - <el-button :disabled="northstarIsRunning" - type="primary" size="large" @click="launchGame" - class="fc_launch__button" :style="buttonRadiusStyle"> - {{ playButtonLabel }} - </el-button> - <el-select v-if="showReleaseSwitch" :disabled="northstarIsRunning" - v-model="currentCanal" placeholder="Select"> - <el-option-group - v-for="group in selectOptions" - :key="group.label" - :label="group.label" - > - <el-option - v-for="item in group.options" - :key="item.value" - :label="item.label" - :value="item.value" - /> - </el-option-group> - </el-select> - </nav> -</template> - -<style scoped> -nav { - margin-right: 20px; -} - -button { - text-transform: uppercase; - padding: 30px; - font-size: 15px; - margin-right: 0; -} - -.fc_launch__button:focus { - background-color: var(--el-color-primary); - border-color: var(--el-color-primary); -} - -/* Release canal selector */ -.el-select { - width: 31px; - border-left: 1px solid rgb(176, 205, 255); -} - -.el-select:deep(.el-select__wrapper) { - padding: 0 9px 0 0; - background-color: var(--el-color-primary); - border: none; - border-radius: 0 2px 2px 0; - height: 62px; - box-shadow: none !important; - --el-disabled-bg-color: #a0cfff; -} - -.el-select:deep(.el-icon) { - color: white !important; -} -</style> diff --git a/src-vue/src/components/PullRequestsSelector.vue b/src-vue/src/components/PullRequestsSelector.vue deleted file mode 100644 index bd17ed14..00000000 --- a/src-vue/src/components/PullRequestsSelector.vue +++ /dev/null @@ -1,181 +0,0 @@ -<template> - <div> - <el-collapse @change="onChange"> - <el-collapse-item name="1" @keydown.space="launcherSearchSpace"> - <template #title> - Launcher PRs - <el-input class="pr_search_input" v-model="launcherSearch" placeholder="Filter pull requests" @click.stop="() => false"></el-input> - </template> - - <p v-if="pull_requests_launcher.length === 0"> - <el-progress - :show-text="false" - :percentage="100" - status="warning" - :indeterminate="true" - :duration="1" - style="margin: 15px" - /> - </p> - <el-card - v-else-if="filtered_launcher_pull_requests.length !== 0" - shadow="hover" - v-for="pull_request in filtered_launcher_pull_requests" - v-bind:key="pull_request.url" - > - <el-button type="primary" @click="installLauncherPR(pull_request)">Install</el-button> - <el-button type="primary" @click="downloadLauncherPR(pull_request)">Download</el-button> - <a target="_blank" :href="pull_request.html_url"> - {{ pull_request.number }}: {{ pull_request.title }} - </a> - <el-tag v-for="label in pull_request.labels">{{ label }}</el-tag> - </el-card> - <div v-else class="no_matching_pr"> - No matching PR found. - </div> - </el-collapse-item> - - <el-collapse-item name="2" @keydown.space="modsSearchSpace"> - <template #title> - Mods PRs - <el-input class="pr_search_input" v-model="modsSearch" placeholder="Filter pull requests" @click.stop="() => false"></el-input> - </template> - <div style="margin: 15px"> - <el-alert title="Warning" type="warning" :closable="false" show-icon> - Mod PRs are installed into a separate profile. Make sure to launch via - 'r2ns-launch-mod-pr-version.bat' or via '-profile=R2Northstar-PR-test-managed-folder' to actually - run the PR version! - </el-alert> - </div> - <p v-if="pull_requests_mods.length === 0"> - <el-progress - :show-text="false" - :percentage="100" - status="warning" - :indeterminate="true" - :duration="1" - style="margin: 15px" - /> - </p> - <el-card - v-else-if="filtered_mods_pull_requests.length !== 0" - shadow="hover" - v-for="pull_request in filtered_mods_pull_requests" - v-bind:key="pull_request.url" - > - <el-button type="primary" @click="installModsPR(pull_request)">Install</el-button> - <el-button type="primary" @click="downloadModsPR(pull_request)">Download</el-button> - <a target="_blank" :href="pull_request.html_url"> - {{ pull_request.number }}: {{ pull_request.title }} - </a> - <el-tag v-for="label in pull_request.labels">{{ label }}</el-tag> - </el-card> - <div v-else class="no_matching_pr"> - No matching PR found. - </div> - </el-collapse-item> - </el-collapse> - </div> -</template> - -<script lang="ts"> -import { defineComponent } from 'vue' -import { PullRequestType } from '../../../src-tauri/bindings/PullRequestType'; -import { PullsApiResponseElement } from '../../../src-tauri/bindings/PullsApiResponseElement'; -import { fuzzy_filter } from "../utils/filter"; - -export default defineComponent({ - name: 'PullRequestsSelector', - data: () => ({ - launcherSearch: '', - modsSearch: '' - }), - computed: { - pull_requests_launcher(): PullsApiResponseElement[] { - return this.$store.state.pullrequests.pull_requests_launcher; - }, - pull_requests_mods(): PullsApiResponseElement[] { - return this.$store.state.pullrequests.pull_requests_mods; - }, - - filtered_launcher_pull_requests(): PullsApiResponseElement[] { - if (this.launcherSearch.length === 0) { - return this.pull_requests_launcher; - } - - return this.pull_requests_launcher.filter(pr => - // Check PR id and title - fuzzy_filter(pr.number.toString(), this.launcherSearch) || fuzzy_filter(pr.title, this.launcherSearch)); - }, - filtered_mods_pull_requests(): PullsApiResponseElement[] { - if (this.modsSearch.length === 0) { - return this.pull_requests_mods; - } - - return this.pull_requests_mods.filter(pr => - // Check PR id and title - fuzzy_filter(pr.number.toString(), this.modsSearch) || fuzzy_filter(pr.title, this.modsSearch)); - }, - }, - methods: { - onChange(e: Object) { - const openedCollapseNames = Object.values(e); - if (openedCollapseNames.includes('1') && this.pull_requests_launcher.length === 0) { - this.getPullRequests('Launcher'); - } - if (openedCollapseNames.includes('2') && this.pull_requests_mods.length === 0) { - this.getPullRequests('Mods'); - } - }, - launcherSearchSpace(e: KeyboardEvent) { - e.preventDefault(); - this.launcherSearch += ' '; - }, - modsSearchSpace(e: KeyboardEvent) { - e.preventDefault(); - this.modsSearch += ' '; - }, - async getPullRequests(pull_request_type: PullRequestType) { - this.$store.commit('getPullRequests', pull_request_type); - }, - async downloadLauncherPR(pull_request: PullsApiResponseElement) { - this.$store.commit('downloadLauncherPR', pull_request); - }, - async downloadModsPR(pull_request: PullsApiResponseElement) { - this.$store.commit('downloadModsPR', pull_request); - }, - async installLauncherPR(pull_request: PullsApiResponseElement) { - this.$store.commit('installLauncherPR', pull_request); - }, - async installModsPR(pull_request: PullsApiResponseElement) { - this.$store.commit('installModsPR', pull_request); - }, - } -}) -</script> - -<style scoped> -.el-collapse { - border-radius: var(--el-border-radius-base); - overflow: hidden; -} - -:deep(.el-collapse-item__header) { - padding-left: 10px; - font-size: 14px; -} - -.el-collapse:deep(.el-collapse-item__arrow) { - margin: 0 8px; -} - -.pr_search_input { - width: 200px; - margin: 0 0 0 auto; -} - -.no_matching_pr { - margin: 0 auto; - width: max-content; -} -</style> diff --git a/src-vue/src/components/ThunderstoreModCard.vue b/src-vue/src/components/ThunderstoreModCard.vue deleted file mode 100644 index 11be7545..00000000 --- a/src-vue/src/components/ThunderstoreModCard.vue +++ /dev/null @@ -1,319 +0,0 @@ -<template> - <el-card :body-style="getBodyStyle" :style="getCardStyle"> - <img - :src="latestVersion.icon" - class="image" - /> - <div style="padding: 0 10px 10px;"> - <span class="statContainer"> - <el-icon class="no-inherit"> - <Download /> - </el-icon> - {{ modDownloadsCount }} - </span> - - <span class="statContainer"> - {{ mod.rating_score }} - <el-icon class="no-inherit"> - <Star /> - </el-icon> - </span> - <br /> - - <div class="name hide-text-overflow">{{ mod.name }}</div> - <div class="author hide-text-overflow">{{ $t('mods.card.by') }} {{ mod.owner }}</div> - <div class="desc"> - {{ latestVersion.description }} - </div> - - <span style="display: flex"> - <el-button - :type="modButtonType" - style="flex: 6" - :loading="isBeingInstalled || isBeingUpdated" - @click.stop="installMod(mod)" - > - {{ $t(modButtonText) }} - </el-button> - - <!-- Information dropdown menu --> - <el-button v-if="!modIsRemovable" - link type="info" class="infoBtn" @click="openURL(mod.package_url)"> - <el-icon> - <InfoFilled /> - </el-icon> - </el-button> - - <el-dropdown v-else> - <el-icon class="infoBtn moreBtn"> - <MoreFilled /> - </el-icon> - <template #dropdown> - <el-dropdown-menu> - <el-dropdown-item @click="openURL(mod.package_url)"> - {{ $t('mods.card.more_info') }} - </el-dropdown-item> - <el-dropdown-item @click="deleteMod(mod)"> - {{ $t('mods.card.remove') }} - </el-dropdown-item> - </el-dropdown-menu> - </template> - </el-dropdown> - </span> - </div> - </el-card> -</template> - -<script lang="ts"> -import { defineComponent } from "vue"; -import { ThunderstoreMod } from "../../../src-tauri/bindings/ThunderstoreMod"; -import { ThunderstoreModVersion } from "../../../src-tauri/bindings/ThunderstoreModVersion"; -import { invoke, shell } from "@tauri-apps/api"; -import { ThunderstoreModStatus } from "../utils/thunderstore/ThunderstoreModStatus"; -import { NorthstarMod } from "../../../src-tauri/bindings/NorthstarMod"; -import { NorthstarState } from "../utils/NorthstarState"; -import { ElMessageBox } from "element-plus"; -import { showErrorNotification, showNotification } from "../utils/ui"; - -export default defineComponent({ - name: "ThunderstoreModCard", - props: { - mod: { - required: true, - type: Object as () => ThunderstoreMod - } - }, - data: () => ({ - isBeingInstalled: false, - isBeingUpdated: false - }), - computed: { - getBodyStyle(): Object { - return this.mod.is_deprecated ? { 'background-color': 'rgba(255, 0, 0, 0.42)' } : {}; - }, - - getCardStyle(): Object { - return this.mod.is_deprecated ? { 'border': '1px solid red' } : {}; - }, - - latestVersion(): ThunderstoreModVersion { - return this.mod.versions[0]; - }, - - /** - * Returns the status of a given mod. - */ - modStatus(): ThunderstoreModStatus { - if (this.isBeingInstalled) { - return ThunderstoreModStatus.BEING_INSTALLED; - } - if (this.isBeingUpdated) { - return ThunderstoreModStatus.BEING_UPDATED; - } - - // Ensure mod is up-to-date. - const tsModPrefix = this.getThunderstoreDependencyStringPrefix(this.latestVersion.full_name); - const matchingMods: NorthstarMod[] = this.$store.state.installed_mods.filter((mod: NorthstarMod) => { - if (!mod.thunderstore_mod_string) return false; - return this.getThunderstoreDependencyStringPrefix(mod.thunderstore_mod_string!) === tsModPrefix; - }); - if (matchingMods.length !== 0) { - // There shouldn't be several mods with same dependency string, but we never know... - const matchingMod = matchingMods[0]; - // A mod is outdated if its dependency strings differs from Thunderstore dependency string - // (no need for semver check here) - return matchingMod.thunderstore_mod_string === this.latestVersion.full_name - ? ThunderstoreModStatus.INSTALLED - : ThunderstoreModStatus.OUTDATED; - } - - return ThunderstoreModStatus.NOT_INSTALLED; - }, - - /** - * Returns button text associated to a mod. - */ - modButtonText(): string { - switch (this.modStatus) { - case ThunderstoreModStatus.BEING_INSTALLED: - return "mods.card.button.being_installed"; - case ThunderstoreModStatus.BEING_UPDATED: - return "mods.card.button.being_updated"; - case ThunderstoreModStatus.INSTALLED: - return "mods.card.button.installed"; - case ThunderstoreModStatus.NOT_INSTALLED: - return "mods.card.button.install"; - case ThunderstoreModStatus.OUTDATED: - return "mods.card.button.outdated"; - } - }, - - /** - * Returns button type associated to a mod. - */ - modButtonType(): string { - switch (this.modStatus) { - case ThunderstoreModStatus.BEING_INSTALLED: - return "primary"; - case ThunderstoreModStatus.INSTALLED: - return "success"; - case ThunderstoreModStatus.NOT_INSTALLED: - return "primary"; - case ThunderstoreModStatus.OUTDATED: - case ThunderstoreModStatus.BEING_UPDATED: - return "warning"; - } - }, - - /** - * Tells if a Thunderstore mod can be removed. - * This is used to tell if we should display the "Remove mod" option. - **/ - modIsRemovable(): boolean { - return [ThunderstoreModStatus.INSTALLED, ThunderstoreModStatus.OUTDATED] - .includes(this.modStatus); - }, - - /** - * This computes the total count of downloads of a given mod, by adding - * download count of each of its releases. - */ - modDownloadsCount(): number { - let totalDownloads = 0; - this.mod.versions.map((version: ThunderstoreModVersion) => totalDownloads += version.downloads); - return totalDownloads; - }, - }, - methods: { - /** - * This opens an URL in user's favorite web browser. - * This is used to open Thunderstore mod pages. - */ - openURL(url: string): void { - shell.open(url); - }, - - /** - * Strips off a Thunderstore dependency string from its version - * (e.g. "taskinoz-WallrunningTitans-1.0.0" to - * "taskinoz-WallrunningTitans"). - */ - getThunderstoreDependencyStringPrefix(dependency: string): string { - const dependencyStringMembers = dependency.split('-'); - return `${dependencyStringMembers[0]}-${dependencyStringMembers[1]}`; - }, - - async deleteMod(mod: ThunderstoreMod) { - - // Show pop-up to confirm delete - ElMessageBox.confirm( - this.$t('mods.card.remove_dialog_text'), - this.$t('mods.card.remove_dialog_title'), - { - confirmButtonText: this.$t('generic.yes'), - cancelButtonText: this.$t('generic.cancel'), - type: 'warning', - } - ) - .then(async () => { // Deletion confirmed - await invoke<string>("delete_thunderstore_mod", { gameInstall: this.$store.state.game_install, thunderstoreModString: this.latestVersion.full_name }) - .then((message) => { - showNotification(this.$t('mods.card.remove_success', { modName: mod.name }), message); - }) - .catch((error) => { - showErrorNotification(error); - }) - .finally(() => { - this.$store.commit('loadInstalledMods'); - }); - }) - .catch(() => { // Deletion cancelled - console.log("Deleting Thunderstore mod cancelled.") - }) - }, - - async installMod(mod: ThunderstoreMod) { - // set internal state according to current installation state - if (this.modStatus === ThunderstoreModStatus.OUTDATED) { - this.isBeingUpdated = true; - } else { - this.isBeingInstalled = true; - } - - // Capture translation method in a context, so it can be used outside Vue component context. - // (see https://github.com/R2NorthstarTools/FlightCore/issues/384) - (async (translate: Function) => { - await invoke<string>("install_mod_wrapper", { gameInstall: this.$store.state.game_install, thunderstoreModString: this.latestVersion.full_name }).then((message) => { - showNotification(translate('mods.card.install_success', { modName: mod.name }), message); - }) - .catch((error) => { - showErrorNotification(error); - }) - .finally(() => { - this.isBeingInstalled = false; - this.isBeingUpdated = false; - this.$store.commit('loadInstalledMods'); - }); - // @ts-ignore - })(this.$i18n.t); - - }, - } -}); -</script> - -<style scoped> -.el-card { - display: inline-block; - max-width: 178px; - margin: 5px; - --el-card-padding: 0; -} - -.deprecated { - background-color: red !important; -} - -.author { - font-size: 14px; - font-style: italic; -} - -.hide-text-overflow { - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; -} - -.desc { - font-size: 12px; - margin: 8px 0 16px; - height: 57px; - text-overflow: ellipsis; - overflow: hidden; -} - -.statContainer { - font-size: 14px; -} - -.statContainer:nth-child(2) { - float: right; -} - -.infoBtn { - width: 20px; - padding: 0 !important; - font-size: 20px; - border: none; -} - -.moreBtn { - margin-left: 10px; - height: auto; -} - -.image { - background-color: lightgray; -} -</style> diff --git a/src-vue/src/i18n/lang/da.json b/src-vue/src/i18n/lang/da.json deleted file mode 100644 index 33486bce..00000000 --- a/src-vue/src/i18n/lang/da.json +++ /dev/null @@ -1,166 +0,0 @@ -{ - "menu": { - "changelog": "Ændringslog", - "mods": "Mods", - "settings": "Indstillinger", - "dev": "Dev", - "play": "Spil" - }, - "generic": { - "yes": "Ja", - "no": "Nej", - "error": "Fejl", - "cancel": "afbryd", - "informationShort": "Info", - "downloading": "Henter", - "success": "Succes", - "extracting": "Udpakker", - "done": "Færdig" - }, - "play": { - "button": { - "select_game_dir": "Vælg Titanfall2 spil mappe", - "install": "Installere", - "installing": "Installer...", - "update": "Opdater", - "updating": "Opdatere...", - "ready_to_play": "Start spil", - "northstar_is_running": "Spillet køre" - }, - "unknown_version": "Ukendt version", - "see_patch_notes": "Se patch noter", - "players": "Spillere", - "servers": "Servere", - "northstar_running": "Northstar køre", - "ea_app_running": "EA appen køre", - "unable_to_load_playercount": "Kan ikke hente antallet af spillere" - }, - "mods": { - "local": { - "no_mods": "Ingen mods blev fundet.", - "delete_confirm": "Er du sikker på at du vil slette dette mod?", - "delete": "Slet", - "success_deleting": "Sletningen af {modName} lykkedes", - "part_of_ts_mod": "Dette Northstar mod er en del af et Thunderstore mod" - }, - "online": { - "no_match": "Der er ikke fundet nogen matchende mod.", - "try_another_search": "Prøv en anden søgning!" - }, - "menu": { - "local": "Lokal", - "online": "Online", - "filter": "Filter", - "search": "Søg", - "sort_mods": "Sorter mods", - "select_categories": "Vælg kategorier", - "sort": { - "name_asc": "navn (A til Z)", - "name_desc": "navn (Z til A)", - "date_asc": "Dato (fra ældste)", - "most_downloaded": "Mest hentet", - "top_rated": "bedst bedømt", - "date_desc": "Dato (fra nyeste)" - } - }, - "card": { - "button": { - "being_installed": "Installerer...", - "being_updated": "Opdaterer...", - "installed": "Installeret", - "install": "Installere", - "outdated": "Opdater" - }, - "by": "af", - "more_info": "Mere info", - "remove": "Fjern mod", - "remove_dialog_title": "Advarsel", - "remove_success": "Fjernet {modName}", - "install_success": "Installeret {modName}", - "remove_dialog_text": "Fjern Thunderstore mod?" - } - }, - "settings": { - "manage_install": "Administrer installation", - "choose_folder": "Vælg installationsmappe", - "open_game_folder": "Åben mappe", - "nb_ts_mods_per_page": "Antal Thunderstore-mods pr. side", - "nb_ts_mods_reset": "Nulstil til standard", - "language": "Sprog", - "language_select": "Vælg dit yndlingssprog", - "about": "Om:", - "flightcore_version": "FlightCore version:", - "testing": "Tester:", - "enable_test_channels": "Aktiver testudgivelseskanaler", - "dev_mode_enabled_title": "Pas på!", - "dev_mode_enabled_text": "Udviklertilstand aktiveret.", - "show_deprecated_mods": "Vis forældede Thunderstore-mods", - "show_deprecated_mods_desc2": "Pas på, sådanne mods er normalt forældet af en god grund.", - "profile": { - "active": "Aktiv profil", - "edit": "Rediger profiler", - "dialog": { - "title": "Profiler" - } - }, - "repair": { - "title": "Reparere", - "open_window": "Åbn reparationsvinduet", - "window": { - "title": "FlightCore reparationsvinduet", - "disable_all_but_core": "Deaktiver alle undtagen kernemods", - "disable_all_but_core_success": "Deaktiverede alle mods undtagen kernemods", - "disable_modsettings": "Deaktiver ModSettings mod", - "disable_modsettings_success": "Deaktiver ModSettings mod", - "force_reinstall_ns": "Tving geninstallation Northstar", - "force_delete_temp_dl": "Tving sletning af midlertidig download-mappe", - "delete_persistent_store": "Slet FlightCore persistent indhold", - "reinstall_title": "Tving geninstallation af Northstar", - "reinstall_text": "Vent lidt", - "reinstall_success": "Northstar blev geninstalleret", - "warning": "Dette vindue indeholder forskellige funktioner til at reparere almindelige problemer med Northstar og FlightCore.", - "kill_northstar_process": "Dræb, der kører Northstar/Titanfall2-processen" - } - }, - "nb_ts_mods_per_page_desc1": "Dette har en indvirkning på skærmydelsen, når du gennemser Thunderstore-mods.", - "nb_ts_mods_per_page_desc2": "Indstil denne værdi til 0 for at deaktivere paginering.", - "show_deprecated_mods_desc1": "Dette giver dig mulighed for at se forældede mods i online-mods-samlingen." - }, - "notification": { - "game_folder": { - "new": { - "title": "Ny spil mappe", - "text": "Spilmappen blev opdateret." - }, - "wrong": { - "title": "Forkert mappe", - "text": "Den valgte mappe er ikke en gyldig Titanfall2 Installation." - }, - "not_found": { - "title": "Titanfall2 ikke fundet!", - "text": "Vælg venligst installationsstedet manuelt" - } - }, - "profile": { - "invalid": { - "title": "Ugyldig profil", - "text": "Den profil, du forsøgte at skifte til, er ikke længere gyldig." - } - }, - "flightcore_outdated": { - "title": "FlightCore forældet!", - "text": "Opdater venligst FlightCore.\nKører forældet version {oldVersion}.\nNyeste er {newVersion}!" - } - }, - "channels": { - "release": { - "switch": { - "text": "Skiftet udgivelseskanal til \"{canal}\"." - } - }, - "names": { - "Northstar": "Northstar", - "NorthstarReleaseCandidate": "Northstar udgivelseskandidat" - } - } -} diff --git a/src-vue/src/i18n/lang/de.json b/src-vue/src/i18n/lang/de.json deleted file mode 100644 index a360c124..00000000 --- a/src-vue/src/i18n/lang/de.json +++ /dev/null @@ -1,177 +0,0 @@ -{ - "menu": { - "play": "Spielen", - "changelog": "Versionhistorie", - "mods": "Mods", - "settings": "Einstellungen", - "dev": "Dev" - }, - "generic": { - "yes": "Ja", - "no": "Nein", - "error": "Fehler", - "cancel": "Abbrechen", - "informationShort": "Info", - "downloading": "Herunterladen", - "extracting": "Extrahieren", - "done": "Fertig", - "success": "Erfolg", - "confirm": "Bestätigen" - }, - "play": { - "button": { - "northstar_is_running": "Spiel läuft", - "select_game_dir": "Titanfall2 ordner wählen", - "install": "Installieren", - "installing": "Installiert...", - "update": "Aktualisieren", - "updating": "Aktualisiert...", - "ready_to_play": "Spiel starten" - }, - "unknown_version": "Unbekannte Version", - "see_patch_notes": "Siehe Patch-Notizen", - "players": "Spieler", - "servers": "Server", - "unable_to_load_playercount": "Spielerzahl konnte nicht geladen werden", - "northstar_running": "Northstar läuft:", - "ea_app_running": "EA App läuft:" - }, - "mods": { - "local": { - "no_mods": "Keine Mods gefunden.", - "delete_confirm": "Bist du dir sicher, dass du diesen Mod löschen möchtest?", - "delete": "Löschen", - "part_of_ts_mod": "Dieser Northstar Mod ist teil eines Thunderstore Mods", - "success_deleting": "{modName} erfolgreich gelöscht" - }, - "online": { - "no_match": "Keine passenden Mods gefunden.", - "try_another_search": "Versuche eine andere Suchanfrage!" - }, - "menu": { - "local": "Lokal", - "online": "Online", - "filter": "Filter", - "search": "Suche", - "sort_mods": "Mods sortieren", - "select_categories": "Kategorien wählen", - "sort": { - "name_asc": "Nach Name (A to Z)", - "name_desc": "Nach Name (Z to A)", - "date_asc": "Nach Datum (älteste zuerst)", - "date_desc": "Nach Datum (neuste zuerst)", - "most_downloaded": "Am meisten heruntergeladen", - "top_rated": "Am besten bewerted" - } - }, - "card": { - "button": { - "being_installed": "Installiert...", - "being_updated": "Aktualisiert...", - "installed": "Installiert", - "install": "Installieren", - "outdated": "Aktualisieren" - }, - "by": "von", - "more_info": "Mehr Info", - "remove": "Mod entfernen", - "remove_dialog_title": "Warnung", - "remove_dialog_text": "Thunderstore Mod entfernen?", - "remove_success": "{modName} entfernt", - "install_success": "{modName} installiert" - } - }, - "settings": { - "manage_install": "Installation verwalten", - "choose_folder": "Installationsordner wählen", - "open_game_folder": "Ordner öffnen", - "nb_ts_mods_per_page": "Anzahl an Thunderstore Mods pro Seite", - "nb_ts_mods_per_page_desc1": "Ändern dieser Einstellung kann die Leistung beim Suchen von Thunderstore Mods beeinflussen.", - "nb_ts_mods_per_page_desc2": "Setze diesen Wert auf 0 um alle Mods auf einer einzelnen Seite anzuzeigen.", - "nb_ts_mods_reset": "Standard wiederherstellen", - "language": "Sprache", - "language_select": "Bevorzugte Sprache wählen", - "about": "Über:", - "flightcore_version": "FlightCore Version:", - "testing": "Testen:", - "enable_test_channels": "Testversionen aktivieren", - "dev_mode_enabled_title": "Vorsicht!", - "dev_mode_enabled_text": "Entwicklermodus aktiviert.", - "repair": { - "title": "Reparieren", - "open_window": "Reparierfenster öffnen", - "window": { - "title": "FlightCore Reparierfenster", - "warning": "Dieses Fenster enthält verschiedene Funktionen um gängige Probleme mit Northstar und FlightCore zu beheben.", - "disable_all_but_core": "Alle außer notwendige Mods deaktivieren", - "disable_all_but_core_success": "Alle außer notwendige Mods wurden deaktiviert", - "force_reinstall_ns": "Northstar reinstallieren", - "force_delete_temp_dl": "Temporären FlightCore Downloadordner löschen", - "delete_persistent_store": "FlightCore Einstellungen zurücksetzen", - "kill_northstar_process": "Laufenden Northstar/Titanfall2 Prozess beenden", - "reinstall_title": "Northstar wird neu installiert", - "reinstall_text": "Bitte warten", - "reinstall_success": "Northstar erfolgreich neu installiert", - "disable_modsettings_success": "Der Mod ModSettings wurde deaktiviert", - "disable_modsettings": "Deaktiviere den ModSettings Mod" - } - }, - "show_deprecated_mods_desc1": "Damit werden veraltete Mods in der Online-Mods-Ansicht sichtbar.", - "show_deprecated_mods_desc2": "Aber Vorsicht, solche Mods sind normalerweise aus gutem Grund als veraltet markiert.", - "show_deprecated_mods": "Veraltete Thunderstore mods anzeigen", - "profile": { - "dialog": { - "title": "Profile", - "delete_confirm": "Sind Sie sich sicher, dass Sie dieses Profil löschen möchten?", - "delete": "Löschen", - "clone": "Duplizieren", - "create_empty": "Neues Profil", - "new_profile_name": "Neuen Profilnamen eingeben" - }, - "active": "Aktives Profil", - "edit": "Profile bearbeiten" - } - }, - "notification": { - "game_folder": { - "new": { - "title": "Neuer Spielordner", - "text": "Spielordner erfolgreich aktualisiert." - }, - "wrong": { - "title": "Falscher Ordner", - "text": "Der gewählte Ordner enthält keine valide Titanfall2 Installation." - }, - "not_found": { - "title": "Titanfall2 nicht gefunden!", - "text": "Bitte wähle den Installationsordner manuell aus" - } - }, - "flightcore_outdated": { - "title": "FlightCore veraltet!", - "text": "Bitte aktualisiere FlightCore.\nDu hast die veraltetet Version {oldVersion}.\nNeuste Version ist {newVersion}!" - }, - "profile": { - "invalid": { - "text": "Das Profil auf das Sie wechseln möchten ist nicht länger gültig.", - "title": "Ungültiges Profil" - } - }, - "no_new": { - "title": "Aktuell", - "text": "Hier gibt es nichts zu sehen!" - }, - "date_prefix": "auf" - }, - "channels": { - "release": { - "switch": { - "text": "Releasekanal zu \"{canal}\" gewechselt." - } - }, - "names": { - "Northstar": "Northstar", - "NorthstarReleaseCandidate": "Northstar Release Candidate" - } - } -} diff --git a/src-vue/src/i18n/lang/en.json b/src-vue/src/i18n/lang/en.json deleted file mode 100644 index 4c3da49f..00000000 --- a/src-vue/src/i18n/lang/en.json +++ /dev/null @@ -1,200 +0,0 @@ -{ - "menu": { - "play": "Play", - "changelog": "Changelog", - "mods": "Mods", - "settings": "Settings", - "dev": "Dev" - }, - - "generic": { - "yes": "Yes", - "no": "No", - "error": "Error", - "confirm": "Confirm", - "cancel": "Cancel", - "informationShort": "Info", - "downloading": "Downloading", - "extracting": "Extracting", - "done": "Done", - "success": "Success" - }, - - "play": { - "button": { - "northstar_is_running": "Game is running", - "select_game_dir": "Select Titanfall2 game folder", - "install": "Install", - "installing": "Installing...", - "update": "Update", - "updating": "Updating...", - "ready_to_play": "Launch game" - }, - - "unknown_version": "Unknown version", - "see_patch_notes": "see patch notes", - "players": "players", - "servers": "servers", - "unable_to_load_playercount": "Unable to load playercount", - "northstar_running": "Northstar is running:", - "ea_app_running": "EA App is running:" - }, - - "mods": { - "local": { - "no_mods": "No mods were found.", - "delete_confirm": "Are you sure to delete this mod?", - "delete": "Delete", - "part_of_ts_mod": "This Northstar mod is part of a Thunderstore mod", - "success_deleting": "Success deleting {modName}" - }, - - "online": { - "no_match": "No matching mod has been found.", - "try_another_search": "Try another search!" - }, - - "menu": { - "local": "Local", - "online": "Online", - "filter": "Filter", - "search": "Search", - "sort_mods": "Sort mods", - "select_categories": "Select categories", - - "sort": { - "name_asc": "By name (A to Z)", - "name_desc": "By name (Z to A)", - "date_asc": "By date (from oldest)", - "date_desc": "By date (from newest)", - "most_downloaded": "Most downloaded", - "top_rated": "Top rated" - } - }, - - "card": { - "button": { - "being_installed": "Installing...", - "being_updated": "Updating...", - "installed": "Installed", - "install": "Install", - "outdated": "Update" - }, - - "by": "by", - "more_info": "More info", - "remove": "Remove mod", - "remove_dialog_title": "Warning", - "remove_dialog_text": "Delete Thunderstore mod?", - "remove_success": "Removed {modName}", - "install_success": "Installed {modName}" - } - }, - - "settings": { - "manage_install": "Manage installation", - "choose_folder": "Choose installation folder", - "open_game_folder": "Open Folder", - "nb_ts_mods_per_page": "Number of Thunderstore mods per page", - "nb_ts_mods_per_page_desc1": "This has an impact on display performances when browsing Thunderstore mods.", - "nb_ts_mods_per_page_desc2": "Set this value to 0 to disable pagination.", - "nb_ts_mods_reset": "Reset to default", - "language": "Language", - "language_select": "Select your favorite language", - "about": "About:", - "flightcore_version": "FlightCore version:", - "testing": "Testing:", - "enable_test_channels": "Enable testing release channels", - "dev_mode_enabled_title": "Watch out!", - "dev_mode_enabled_text": "Developer mode enabled.", - "show_deprecated_mods": "Show deprecated Thunderstore mods", - "show_deprecated_mods_desc1": "This allows you to see deprecated mods in the online mods collection.", - "show_deprecated_mods_desc2": "Watch out, such mods are usually deprecated for a good reason.", - "show_nsfw_mods": "Show NSFW Thunderstore mods", - - "profile": { - "active": "Active Profile", - "edit": "Edit Profiles", - - "dialog": { - "title": "Profiles", - "delete_confirm": "Are you sure to delete this profile?", - "delete": "Delete", - "clone": "Clone", - "new_profile_name": "Enter the new Profile name", - "create_empty": "New Profile" - } - }, - - "repair": { - "title": "Repair", - "open_window": "Open repair window", - - "window": { - "title": "FlightCore repair window", - "warning": "This window contains various functionality to repair common issues with Northstar and FlightCore.", - "disable_all_but_core": "Disable all but core mods", - "disable_all_but_core_success": "Disabled all mods but core", - "disable_modsettings": "Disable ModSettings mod", - "disable_modsettings_success": "Disabled ModSettings mod", - "force_reinstall_ns": "Force reinstall Northstar", - "force_delete_temp_dl": "Force delete temp download folder", - "delete_persistent_store": "Delete FlightCore persistent store", - "kill_northstar_process": "Kill running Northstar/Titanfall2 process", - "reinstall_title": "Force reinstalling Northstar", - "reinstall_text": "Please wait", - "reinstall_success": "Successfully reinstalled Northstar" - } - } - }, - - "notification": { - "date_prefix": "at", - "no_new": { - "title": "Up-to-date", - "text": "Nothing to see here!" - }, - - "game_folder": { - "new": { - "title": "New game folder", - "text": "Game folder was successfully updated." - }, - - "wrong": { - "title": "Wrong folder", - "text": "Selected folder is not a valid Titanfall2 install." - }, - - "not_found": { - "title": "Titanfall2 not found!", - "text": "Please manually select install location" - } - }, - - "profile": { - "invalid": { - "title": "Invalid Profile", - "text": "The profile you tried to switch to is no longer valid." - } - }, - - "flightcore_outdated": { - "title": "FlightCore outdated!", - "text": "Please update FlightCore.\nRunning outdated version {oldVersion}.\nNewest is {newVersion}!" - } - }, - - "channels": { - "release": { - "switch": { - "text": "Switched release channel to \"{canal}\"." - } - }, - - "names": { - "Northstar": "Northstar", - "NorthstarReleaseCandidate": "Northstar release candidate" - } - } -} diff --git a/src-vue/src/i18n/lang/es.json b/src-vue/src/i18n/lang/es.json deleted file mode 100644 index 2b4d255c..00000000 --- a/src-vue/src/i18n/lang/es.json +++ /dev/null @@ -1,175 +0,0 @@ -{ - "menu": { - "mods": "Modificaciones", - "settings": "Opciones", - "dev": "Desarrollador", - "play": "Jugar", - "changelog": "Cambios" - }, - "generic": { - "yes": "Sí", - "no": "No", - "error": "Error", - "cancel": "Cancelar", - "informationShort": "Información", - "extracting": "Extrayendo", - "done": "Listo", - "success": "Éxito", - "downloading": "Descargando", - "confirm": "Confirmar" - }, - "play": { - "button": { - "northstar_is_running": "El juego ya se está ejecutando", - "install": "Instalar", - "update": "Actualizar", - "select_game_dir": "Seleccione carpeta base de Titanfall 2", - "ready_to_play": "Jugar ahora", - "installing": "Instalando...", - "updating": "Actualizando..." - }, - "ea_app_running": "La aplicación de EA ya se está ejecutando:", - "unknown_version": "Versión Desconocida", - "see_patch_notes": "Ver las notas del parche", - "players": "jugadores", - "servers": "servidores", - "northstar_running": "Northstar ya se está ejecutando:", - "unable_to_load_playercount": "Cantidad de jugadores no disponible" - }, - "mods": { - "local": { - "no_mods": "No hay mods encontrados.", - "delete_confirm": "¿Estás segur@ que quieres eliminar este mod?", - "delete": "Eliminar", - "success_deleting": "{modName} Ha sido eliminado correctamente", - "part_of_ts_mod": "Este mod de Northstar es parte de un mod de la ThunderStore" - }, - "online": { - "no_match": "No hay mods coincidentes.", - "try_another_search": "Intente otra busqueda!" - }, - "menu": { - "local": "Local", - "online": "En línea", - "filter": "FIltro", - "search": "Búsqueda", - "sort_mods": "Ordenar mods", - "select_categories": "Seleccionar categorías", - "sort": { - "name_asc": "Por nombre (de la A a la Z)", - "date_asc": "Por fecha (desde la más antigua)", - "date_desc": "Por fecha (desde la más reciente)", - "most_downloaded": "Los más descargados", - "top_rated": "Mejor valorados", - "name_desc": "Por nombre (de la Z a la A)" - } - }, - "card": { - "button": { - "being_installed": "Instalando...", - "being_updated": "Actualizando...", - "installed": "Instalado", - "outdated": "Actualizar", - "install": "Instalar" - }, - "by": "por", - "remove": "Quitar mod", - "remove_dialog_title": "Advertencia", - "remove_dialog_text": "Eliminar mod de la ThunderStore?", - "install_success": "{modName} Instalado", - "more_info": "Mas información", - "remove_success": "{modName} Ha sido eliminado" - } - }, - "settings": { - "manage_install": "Administrar instalación", - "choose_folder": "Elegir carpeta de instalación", - "open_game_folder": "Abrir carpeta", - "nb_ts_mods_per_page": "Numero de mods por página de ThunderStore", - "nb_ts_mods_per_page_desc2": "Poner valor en 0 para desactivar la paginación.", - "nb_ts_mods_reset": "Reestablecer por defecto", - "language": "Idioma", - "language_select": "Seleccionar idioma favorito", - "about": "Acerca de:", - "flightcore_version": "Versión de FlightCore:", - "testing": "Probando:", - "enable_test_channels": "Activar liberación de canales", - "dev_mode_enabled_title": "¡Cuidado!", - "dev_mode_enabled_text": "Modo de desarrollador activado.", - "show_deprecated_mods_desc1": "Esto permite ver mods obsoletos de la colección online de ThunderStore.", - "show_deprecated_mods_desc2": "Cuidado, estos mods suelen estar obsoletos por una buena razón.", - "profile": { - "active": "Perfil activo", - "edit": "Editar perfiles", - "dialog": { - "title": "Perfiles", - "delete_confirm": "Eliminar Perfil?", - "delete": "Eliminar", - "clone": "Duplicar" - } - }, - "repair": { - "title": "Reparar", - "window": { - "title": "Ventana de reparación de FlightCore", - "disable_all_but_core": "Desactivar todos los mods excepto los principales", - "disable_all_but_core_success": "Desactivados todos los mods excepto el núcleo", - "disable_modsettings": "Desactivar ModSettings", - "disable_modsettings_success": "ModSettings desactivado", - "force_reinstall_ns": "Forzar reinstalación de Northstar", - "force_delete_temp_dl": "Forzar la eliminación de la carpeta temporal de descargas", - "delete_persistent_store": "Borrar el almacén persistente de FlightCore", - "reinstall_title": "Forzar la reinstalación de Northstar", - "reinstall_text": "Espere, por favor", - "reinstall_success": "Northstar reinstalado con éxito", - "warning": "Esta ventana tiene varias funciones para reparar problemas comunes con Northstar y FlightCore.", - "kill_northstar_process": "Finalizar proceso de Northstar/Titanfall 2" - }, - "open_window": "Abrir la ventana de reparación" - }, - "nb_ts_mods_per_page_desc1": "Esto puede tener impactos en fluidez al buscar mods en la ThunderStore.", - "show_deprecated_mods": "Mostrar mods the ThunderStore obsoletos" - }, - "notification": { - "game_folder": { - "new": { - "title": "Nueva carpeta de juego", - "text": "La carpeta de juego fue actualizada exitosamente." - }, - "wrong": { - "title": "Carpeta equivocada", - "text": "La carpeta seleccionada no es una carpeta de Titanfall2 válida." - }, - "not_found": { - "title": "Titanfall 2 no encontrado!", - "text": "Por favor seleccione manualmente el lugar de instalación" - } - }, - "profile": { - "invalid": { - "title": "Perfil inválido", - "text": "El perfil de cambio anterior ya no es válido." - } - }, - "flightcore_outdated": { - "title": "FlightCore desactualizado!", - "text": "Por favor actualize FlightCore.\nEsta versión esta desactualizada {oldVersion}\nLa versión mas nueva es {newVersion}!" - }, - "no_new": { - "title": "Al día", - "text": "Nada que ver aquí!" - }, - "date_prefix": "en" - }, - "channels": { - "release": { - "switch": { - "text": "El canal seleccionado se cambió a \"{canal}\"." - } - }, - "names": { - "Northstar": "Northstar", - "NorthstarReleaseCandidate": "Candidato de nueva versión de Northstar" - } - } -} diff --git a/src-vue/src/i18n/lang/fr.json b/src-vue/src/i18n/lang/fr.json deleted file mode 100644 index efc0815b..00000000 --- a/src-vue/src/i18n/lang/fr.json +++ /dev/null @@ -1,177 +0,0 @@ -{ - "menu": { - "play": "Jouer", - "changelog": "Notes", - "mods": "Mods", - "settings": "Paramètres", - "dev": "Dev" - }, - "generic": { - "yes": "Oui", - "no": "Non", - "error": "Erreur", - "cancel": "Annuler", - "informationShort": "Info", - "downloading": "Téléchargement", - "extracting": "Extraction", - "done": "Fait", - "success": "Succès", - "confirm": "Confirmed" - }, - "play": { - "button": { - "northstar_is_running": "En cours d'utilisation", - "select_game_dir": "Sélectionner le dossier du jeu", - "install": "Installer", - "installing": "Installation...", - "update": "Mettre à jour", - "updating": "Mise à jour...", - "ready_to_play": "Jouer" - }, - "unknown_version": "Version inconnue", - "see_patch_notes": "voir les notes de version", - "players": "joueurs", - "servers": "serveurs", - "unable_to_load_playercount": "Impossible de charger les statistiques", - "northstar_running": "Northstar est en cours d'exécution :", - "ea_app_running": "EA App est en cours d'exécution :" - }, - "mods": { - "local": { - "no_mods": "Aucun mod trouvé.", - "delete_confirm": "Êtes-vous certain de vouloir supprimer ce mod ?", - "delete": "Supprimer", - "part_of_ts_mod": "Ce mod Northstar fait partie d'un mod Thunderstore", - "success_deleting": "Succès de la suppression de {modName}" - }, - "online": { - "no_match": "Aucun mod correspondant n'a été trouvé.", - "try_another_search": "Essayez une autre recherche !" - }, - "menu": { - "local": "Local", - "online": "En ligne", - "filter": "Filtrer", - "search": "Chercher", - "sort_mods": "Trier les mods", - "select_categories": "Choisir les catégories", - "sort": { - "name_asc": "Par nom (de A à Z)", - "name_desc": "Par nom (de Z à A)", - "date_asc": "Par date (du plus vieux)", - "date_desc": "Par date (du plus récent)", - "most_downloaded": "Plus téléchargés", - "top_rated": "Mieux notés" - } - }, - "card": { - "button": { - "being_installed": "Installation...", - "being_updated": "Mise à jour...", - "installed": "Installé", - "install": "Installer", - "outdated": "Mettre à jour" - }, - "by": "par", - "more_info": "Plus d'informations", - "remove": "Supprimer le mod", - "remove_dialog_title": "Attention", - "remove_dialog_text": "Voulez-vous vraiment supprimer ce mod Thunderstore ?", - "remove_success": "{modName} supprimé", - "install_success": "{modName} installé" - } - }, - "settings": { - "manage_install": "Gérer l'installation", - "choose_folder": "Choisir le dossier d'installation du jeu", - "open_game_folder": "Ouvrir le dossier du jeu", - "nb_ts_mods_per_page": "Nombre de mods Thunderstore par page", - "nb_ts_mods_per_page_desc1": "Ce paramètre a un impact sur les performances d'affichage des mods Thunderstore.", - "nb_ts_mods_per_page_desc2": "Réglez-le sur 0 pour désactiver la pagination.", - "nb_ts_mods_reset": "Valeur par défaut", - "language": "Langue", - "language_select": "Sélectionnez votre langue", - "about": "À propos", - "flightcore_version": "Version de FlightCore :", - "testing": "Tests :", - "enable_test_channels": "Activer le test de versions de pré-production", - "dev_mode_enabled_title": "Attention !", - "dev_mode_enabled_text": "Mode développeur activé.", - "repair": { - "title": "Dépannage", - "open_window": "Ouvrir la fenêtre de dépannage", - "window": { - "title": "Fenêtre de dépannage FlightCore", - "warning": "Cette fenêtre contient plusieurs fonctionnalité de résolution de problèmes courants avec Northstar et FlightCore.", - "disable_all_but_core": "Désactiver tous les mods (sauf ceux de Northstar)", - "disable_all_but_core_success": "Tous les mods sauf ceux de Northstar ont été désactivés", - "force_reinstall_ns": "Forcer la réinstallation de Northstar", - "force_delete_temp_dl": "Supprimer le dossier de téléchargement temporaire", - "delete_persistent_store": "Supprimer l'espace de stockage local de FlightCore", - "reinstall_title": "Forcer la réinstallation de Northstar", - "reinstall_text": "Veuillez patienter", - "reinstall_success": "Northstar réinstallé avec succès", - "disable_modsettings": "Désactiver le mod ModSettings", - "disable_modsettings_success": "Mod ModSettings désactivé", - "kill_northstar_process": "Arrêter le processus en cous de Northstar/Titanfall2" - } - }, - "show_deprecated_mods": "Montrer les mods Thunderstore dépréciés", - "show_deprecated_mods_desc1": "Ce paramètre vous permet d'afficher les mods Thunderstore dépréciés dans la collection de mods.", - "show_deprecated_mods_desc2": "Attention, les mods dépréciés le sont généralement pour une bonne raison.", - "profile": { - "active": "Profile actif", - "edit": "Éditer les profiles", - "dialog": { - "title": "Profiles", - "clone": "Cloner", - "delete": "Supprimer", - "delete_confirm": "Voulez-vous vraiment supprimer ce profil ?", - "create_empty": "nouveau profil", - "new_profile_name": "Entrez le nouveau nom du profil" - } - } - }, - "notification": { - "date_prefix": "à", - "no_new": { - "title": "Vous êtes à jour", - "text": "Rien à voir par ici !" - }, - "game_folder": { - "new": { - "title": "Nouveau dossier", - "text": "Le dossier du jeu a bien été mis à jour." - }, - "wrong": { - "title": "Mauvais dossier", - "text": "Le dossier sélectionné ne contient pas d'installation de Titanfall2." - }, - "not_found": { - "title": "Titanfall2 non trouvé !", - "text": "Veuillez sélectionner manuellement le dossier du jeu." - } - }, - "flightcore_outdated": { - "title": "Mise à jour disponible !", - "text": "Veuillez mettre à jour FlightCore.\nVersion actuelle : {oldVersion}.\nNouvelle version : {newVersion} !" - }, - "profile": { - "invalid": { - "text": "Le profile sur lequel vous essayez de basculer n'est plus valide.", - "title": "Profile invalide" - } - } - }, - "channels": { - "release": { - "switch": { - "text": "Le canal de téléchargement a été réglé sur \"{canal}\"." - } - }, - "names": { - "Northstar": "Northstar", - "NorthstarReleaseCandidate": "Version de pré-release" - } - } -} diff --git a/src-vue/src/i18n/lang/it.json b/src-vue/src/i18n/lang/it.json deleted file mode 100644 index 9da8ce8d..00000000 --- a/src-vue/src/i18n/lang/it.json +++ /dev/null @@ -1,175 +0,0 @@ -{ - "generic": { - "yes": "Si", - "no": "No", - "error": "Errore", - "cancel": "Cancella", - "downloading": "Scaricando", - "extracting": "Estraendo", - "done": "Fatto", - "success": "Successo", - "informationShort": "Info", - "confirm": "Conferma" - }, - "play": { - "unknown_version": "Versione sconosciuta", - "unable_to_load_playercount": "Impossibile caricare numero giocatori", - "northstar_running": "Northstar sta andando:", - "origin_running": "Origin sta andando:", - "see_patch_notes": "guarda le note della patch", - "players": "Giocatori", - "servers": "Server", - "button": { - "northstar_is_running": "Il Gioco sta andando", - "install": "Installa", - "installing": "Installazione...", - "update": "Aggiorna", - "updating": "Aggiornamento...", - "ready_to_play": "Gioca", - "select_game_dir": "Seleziona la cartella di Titanfall 2" - }, - "ea_app_running": "EA App sta andando:" - }, - "mods": { - "local": { - "no_mods": "Nessuna mod è stata trovata.", - "delete_confirm": "Sei sicuro di voler eliminare questa mod?", - "part_of_ts_mod": "Questa Northstar mod è parte di una Thunderstore mod", - "success_deleting": "{modName} Eliminata con successo", - "delete": "Elimina" - }, - "online": { - "no_match": "Nessuna mod corrispondente trovata.", - "try_another_search": "Prova un'altra ricerca!" - }, - "menu": { - "local": "Locale", - "filter": "Filtra", - "online": "Online", - "search": "Cerca", - "sort_mods": "Sorteggia mods", - "select_categories": "Seleziona categorie", - "sort": { - "name_asc": "Per nome (da A alla Z)", - "name_desc": "Per nome (da Z alla A)", - "date_asc": "Per data (dal più vecchio)", - "date_desc": "Per data (dal più recente)", - "most_downloaded": "Più scaricate", - "top_rated": "Più votate" - } - }, - "card": { - "button": { - "being_updated": "Aggiornando...", - "installed": "Installato", - "being_installed": "Installando...", - "install": "Installa", - "outdated": "Aggiorna" - }, - "by": "per", - "more_info": "Più informazioni", - "remove": "Rimuovi mod", - "remove_dialog_title": "Attenzione", - "remove_dialog_text": "Eliminare Thunderstore mod?", - "remove_success": "{modName} Rimossa", - "install_success": "{modName} Installata" - } - }, - "menu": { - "mods": "Mods", - "settings": "Impostazioni", - "dev": "Dev", - "play": "Gioca", - "changelog": "Note" - }, - "notification": { - "game_folder": { - "wrong": { - "title": "Cartella errata", - "text": "La cartella selezionata non ha un'installazione di Titanfall2 valida." - }, - "new": { - "title": "Nuova cartella di gioco", - "text": "Cartella di gioco aggiornata con successo." - }, - "not_found": { - "title": "Titanfall2 non trovato!", - "text": "Per favore selezionare manualmente la posizione dell'installazione" - } - }, - "flightcore_outdated": { - "title": "FlightCore fuori data!", - "text": "Per favore aggiorna FlightCore.\nVersione in uso {oldVersion} fuori data.\nLa più recente è {newVersion}!" - }, - "no_new": { - "text": "Niente da vedere qui!", - "title": "Aggiornato" - }, - "profile": { - "invalid": { - "text": "Il profilo a cui hai provato ad accedere non è più valido.", - "title": "Profilo non valido" - } - } - }, - "settings": { - "manage_install": "Gestisci l'installazione", - "choose_folder": "Scegli la cartella dell'installazione", - "open_game_folder": "Apri Cartella", - "nb_ts_mods_per_page": "Numero di Thunderstore mods per pagina", - "nb_ts_mods_per_page_desc1": "Questo ha un impatto sulle performazioni schermo mentre si navigano le Thunderstore mods.", - "nb_ts_mods_per_page_desc2": "Cambiare questo valore a 0 per disattivare la paginazione.", - "nb_ts_mods_reset": "Resetta a default", - "language": "Lingua", - "language_select": "Seleziona la tua lingua preferito", - "about": "Al riguardo:", - "flightcore_version": "Versione FlighCore:", - "testing": "Testando:", - "enable_test_channels": "Abilita i canali del test di rilascio", - "dev_mode_enabled_title": "Attenzione!", - "dev_mode_enabled_text": "Modalità Sviluppatore attivata.", - "repair": { - "title": "Ripara", - "open_window": "Apri finestra di riparazione", - "window": { - "title": "Finestra riparazione di FlightCore", - "warning": "Questa finestra contiene varie funzionalità per riparare problemi comuni con Northstar e FlightCore.", - "disable_all_but_core": "Disattiva tutte le mods (eccetto quelle di Northstar)", - "disable_all_but_core_success": "Disattivate tutte le mods (eccetto quelle di Northstar)", - "force_reinstall_ns": "Forza reinstallazione di Northstar", - "force_delete_temp_dl": "Forza l'eliminazione della cartella dei download temporanei", - "delete_persistent_store": "Elimina lo spazio d'archiviazione persistente di FlightCore", - "reinstall_title": "Reinstallando Northstar forzatamente", - "reinstall_text": "Attendere per favore", - "reinstall_success": "Northstar reinstallato con successo", - "kill_northstar_process": "Ferma il processo Northstar/Titanfall2 in esecuzione", - "disable_modsettings_success": "ModSettings disabilitata", - "disable_modsettings": "Disabilita la mod ModSettings" - } - }, - "profile": { - "active": "Profilo attivo", - "dialog": { - "clone": "Clona", - "delete": "Elimina", - "delete_confirm": "Sei sicuro di voler eliminare questo profilo?", - "title": "Profili" - }, - "edit": "Modifica profilo" - }, - "show_deprecated_mods": "Mostra mod di Thunderstore deprecate", - "show_deprecated_mods_desc2": "Fai attenzione, alcune mod di solito sono deprecate per un buon motivo.", - "show_deprecated_mods_desc1": "Permette di vedere le mod deprecate nella collezione online." - }, - "channels": { - "release": { - "switch": { - "text": "Cambiato il canale di rilascio a \"{canal}\"." - } - }, - "names": { - "Northstar": "Northstar", - "NorthstarReleaseCandidate": "Northstar versione pre-rilascio" - } - } -} diff --git a/src-vue/src/i18n/lang/pl.json b/src-vue/src/i18n/lang/pl.json deleted file mode 100644 index 175d6eb3..00000000 --- a/src-vue/src/i18n/lang/pl.json +++ /dev/null @@ -1,177 +0,0 @@ -{ - "menu": { - "changelog": "Dziennik zmian", - "mods": "Mody", - "settings": "Ustawienia", - "dev": "Dev", - "play": "Graj" - }, - "generic": { - "yes": "Tak", - "no": "Nie", - "error": "Błąd", - "cancel": "Anuluj", - "downloading": "Pobieranie", - "extracting": "Wypakowywanie", - "done": "Gotowe", - "success": "Sukces", - "informationShort": "Informacja", - "confirm": "Potwierdź" - }, - "play": { - "button": { - "northstar_is_running": "Gra jest uruchomiona", - "select_game_dir": "Wybierz folder gry Titanfall2", - "install": "Zainstaluj", - "update": "Aktualizuj", - "updating": "Aktualizowanie...", - "ready_to_play": "Uruchom grę", - "installing": "Instalowanie..." - }, - "unknown_version": "Nieznana wersja", - "see_patch_notes": "zobacz listę zmian", - "players": "gracze", - "servers": "serwery", - "northstar_running": "Northstar jest uruchomiony:", - "ea_app_running": "EA App jest uruchomiony:", - "unable_to_load_playercount": "Nie można załadować liczby graczy" - }, - "mods": { - "local": { - "no_mods": "Nie znaleziono żadnych modów.", - "delete_confirm": "Czy na pewno chcesz usunąć ten mod?", - "delete": "Usuń", - "success_deleting": "Sukces usuwania {modName}", - "part_of_ts_mod": "Ten mod Northstar jest częścią moda Thunderstore" - }, - "online": { - "no_match": "Nie znaleziono pasującego moda.", - "try_another_search": "Spróbuj innego wyszukiwania!" - }, - "menu": { - "local": "Lokalne", - "online": "Online", - "filter": "Filtry", - "search": "Szukaj", - "sort_mods": "Sortowanie modów", - "select_categories": "Wybierz kategorie", - "sort": { - "name_asc": "Według nazwy (od A do Z)", - "name_desc": "Według nazwy (od Z do A)", - "date_desc": "Według daty (od najnowszej)", - "most_downloaded": "Najczęściej pobierane", - "top_rated": "Najwyżej ocenione", - "date_asc": "Według daty (od najstarszej)" - } - }, - "card": { - "button": { - "being_installed": "Instalowanie...", - "being_updated": "Aktualizowanie...", - "installed": "Zainstalowano", - "install": "Zainstaluj", - "outdated": "Aktualizuj" - }, - "by": "od", - "more_info": "Więcej informacji", - "remove": "Usuń moda", - "remove_dialog_title": "Ostrzeżenie", - "remove_dialog_text": "Usunąć mod Thunderstore?", - "remove_success": "Usunięto {modName}", - "install_success": "Zainstalowano {modName}" - } - }, - "settings": { - "manage_install": "Zarządzaj instalacją", - "choose_folder": "Wybierz folder instalacyjny", - "nb_ts_mods_per_page": "Liczba modów Thunderstore na stronie", - "nb_ts_mods_per_page_desc2": "Ustaw tę wartość na 0, aby wyłączyć paginację.", - "nb_ts_mods_reset": "Przywrócenie ustawień domyślnych", - "language": "Język", - "language_select": "Wybierz swój ulubiony język", - "about": "O:", - "flightcore_version": "Wersja FlightCore:", - "testing": "Testy:", - "enable_test_channels": "Włączenie kanałów wydań testowych", - "dev_mode_enabled_title": "Uważaj!", - "dev_mode_enabled_text": "Tryb deweloperski włączony.", - "repair": { - "title": "Naprawa", - "open_window": "Otwórz okno naprawy", - "window": { - "disable_all_but_core": "Wyłączenie wszystkich modów poza podstawowymi", - "disable_all_but_core_success": "Wyłączone wszystkie mody oprócz podstawowych", - "force_reinstall_ns": "Wymuś reinstalację Northstara", - "force_delete_temp_dl": "Wymuś usunięcie folderu tymczasowego pobierania", - "delete_persistent_store": "Usuń stały magazyn FlightCore", - "reinstall_title": "Wymuszona reinstalacja Northstara", - "reinstall_text": "Proszę czekać", - "reinstall_success": "Pomyślnie przeinstalowano Northstar", - "title": "Okno naprawy FlightCore", - "warning": "To okno zawiera różne funkcje do naprawy typowych problemów z Northstar i FlightCore.", - "disable_modsettings": "Wyłącz moda ModSettings", - "disable_modsettings_success": "Wyłączono moda ModSettings", - "kill_northstar_process": "Zamknij uruchomiony proces Northstar/Titanfall2" - } - }, - "nb_ts_mods_per_page_desc1": "Ma to wpływ na wydajność wyświetlania podczas przeglądania modów Thunderstore.", - "open_game_folder": "Otwórz folder", - "show_deprecated_mods_desc2": "Ostrożnie, mody są zazwyczaj oznaczone jako przestarzałe nie bez powodu.", - "show_deprecated_mods": "Pokaż przestarzałe mody Thunderstore", - "show_deprecated_mods_desc1": "Pozwala to zobaczyć przestarzałe mody w kolekcji modów online.", - "profile": { - "active": "Aktywny profil", - "dialog": { - "title": "Profile", - "delete": "Usuń", - "clone": "Klonuj", - "new_profile_name": "Wprowadź nową nazwę profilu", - "create_empty": "Nowy profil", - "delete_confirm": "Czy na pewno chcesz usunąć ten profil?" - }, - "edit": "Edytuj profile" - } - }, - "notification": { - "game_folder": { - "new": { - "title": "Nowy folder z grą", - "text": "Folder gry został pomyślnie zaktualizowany." - }, - "wrong": { - "title": "Niewłaściwy folder", - "text": "Wybrany folder nie jest poprawną instalacją Titanfall2." - }, - "not_found": { - "title": "Nie znaleziono Titanfall2!", - "text": "Proszę ręcznie wybrać lokalizację instalacji" - } - }, - "flightcore_outdated": { - "title": "FlightCore nieaktualny!", - "text": "Proszę zaktualizować FlightCore.\nUruchomiono przestarzałą wersję {oldVersion}.\nNajnowsza to {newVersion}!" - }, - "profile": { - "invalid": { - "title": "Nieprawidłowy profil", - "text": "Profil, na który próbowano się przełączyć, nie jest już prawidłowy." - } - }, - "no_new": { - "title": "Aktualny", - "text": "Nie ma tu nic do obejrzenia!" - }, - "date_prefix": "na" - }, - "channels": { - "release": { - "switch": { - "text": "Przełączono kanał wydań na \"{canal}\"." - } - }, - "names": { - "Northstar": "Northstar", - "NorthstarReleaseCandidate": "Kandydat do wydania Northstar" - } - } -} diff --git a/src-vue/src/i18n/lang/ru.json b/src-vue/src/i18n/lang/ru.json deleted file mode 100644 index b0261299..00000000 --- a/src-vue/src/i18n/lang/ru.json +++ /dev/null @@ -1,178 +0,0 @@ -{ - "generic": { - "yes": "Да", - "no": "Нет", - "extracting": "Распаковывание", - "done": "Готово", - "success": "Успешно", - "error": "Ошибка", - "cancel": "Отмена", - "informationShort": "Информация", - "downloading": "Скачивание", - "confirm": "Подтвердить" - }, - "menu": { - "mods": "Моды", - "play": "Играть", - "settings": "Настройки", - "dev": "Разработчик", - "changelog": "Обновления" - }, - "play": { - "button": { - "northstar_is_running": "Игра запущена", - "install": "Установить", - "installing": "Установка...", - "updating": "Обновление...", - "ready_to_play": "Запустить игру", - "update": "Обновить", - "select_game_dir": "Выберите папку с Titanfall 2" - }, - "unknown_version": "Неизвестная версия", - "players": "игроков", - "servers": "серверов", - "unable_to_load_playercount": "Не можем загрузить количество игроков", - "northstar_running": "Northstar запущен:", - "ea_app_running": "EA App запущен:", - "see_patch_notes": "просмотреть список изменений" - }, - "mods": { - "local": { - "delete_confirm": "Вы уверены, что хотите удалить этот мод?", - "delete": "Удалить", - "success_deleting": "{modName} Успешно удален", - "no_mods": "Моды не найдены.", - "part_of_ts_mod": "Этот мод Northstar является частью мода на Thunderstore" - }, - "online": { - "no_match": "Не найдено совпадающих модов.", - "try_another_search": "Попробуйте другой запрос!" - }, - "menu": { - "online": "Онлайн", - "filter": "Фильтр", - "search": "Поиск", - "sort_mods": "Сортировать моды", - "sort": { - "name_asc": "По имени (от A до Z)", - "name_desc": "По имени (от Z до A)", - "date_asc": "По дате (со старейшего)", - "date_desc": "По дате (с новейшего)", - "top_rated": "Самый популярный", - "most_downloaded": "Самый загружаемый" - }, - "local": "Установленные", - "select_categories": "Выбрать категории" - }, - "card": { - "button": { - "being_installed": "Установка...", - "being_updated": "Обновление...", - "installed": "Установлен", - "install": "Установить", - "outdated": "Обновить" - }, - "by": "от", - "remove": "Удалить мод", - "remove_dialog_title": "Внимание", - "remove_dialog_text": "Удалить мод Thunderstore?", - "remove_success": "{modName} Удален", - "more_info": "Подробнее", - "install_success": "{modName} Установлен" - } - }, - "settings": { - "manage_install": "Управлять установкой", - "choose_folder": "Выберите папку установки", - "open_game_folder": "Открыть папку", - "nb_ts_mods_reset": "Вернуть по умолчанию", - "language": "Язык", - "language_select": "Выберите свой любимый язык", - "testing": "Тестирование:", - "enable_test_channels": "Включить каналы с тестовыми релизами", - "dev_mode_enabled_title": "Осторожно!", - "repair": { - "open_window": "Открыть окно фиксов", - "window": { - "title": "Окно фиксов FlightCore", - "force_reinstall_ns": "Принудительно переустановить Northstar", - "delete_persistent_store": "Удалить постоянное хранилище FlightCore", - "reinstall_title": "Принудительно переустанавливаем Northstar", - "reinstall_text": "Пожалуйста, подождите", - "disable_all_but_core_success": "Выключены все моды кроме главных", - "disable_all_but_core": "Выключить все моды, кроме главных", - "warning": "Это окно содержит различные функции для устранения часто возникающих проблем с Northstar и FlightCore.", - "force_delete_temp_dl": "Принудительно удалить папку с временными загрузками", - "reinstall_success": "Northstar успешно переустановлен", - "disable_modsettings": "Выключить мод ModSettings", - "disable_modsettings_success": "Выключен мод ModSettings", - "kill_northstar_process": "Закрыть запущенный Northstar/Titanfall 2" - }, - "title": "Фиксы" - }, - "nb_ts_mods_per_page_desc1": "Это влияет на производительность при просмотре модов с Thunderstore.", - "about": "Информация:", - "nb_ts_mods_per_page": "Количество модов Thunderstore на каждую страницу", - "nb_ts_mods_per_page_desc2": "Установите это значение на 0, чтобы отключить страницы.", - "flightcore_version": "Версия FlightCore:", - "dev_mode_enabled_text": "Включен режим разработчика.", - "show_deprecated_mods": "Показать устаревшие моды Thunderstore", - "show_deprecated_mods_desc1": "Это позволяет вам видеть устаревшие моды в меню онлайн модов.", - "show_deprecated_mods_desc2": "Внимание, такие моды обычно устаревшие по хорошей причине.", - "profile": { - "active": "Активный Профиль", - "edit": "Редактировать Профили", - "dialog": { - "title": "Профили", - "clone": "Копировать", - "delete": "Удалить", - "delete_confirm": "Вы уверены, что хотите удалить этот профиль?", - "new_profile_name": "Введите новое имя профиля", - "create_empty": "Новый профиль" - } - }, - "show_nsfw_mods": "Показывать NSFW-моды с Thunderstore" - }, - "notification": { - "game_folder": { - "new": { - "title": "Новая папка игры", - "text": "Папка игры успешно обновлена." - }, - "wrong": { - "title": "Неправильная папка", - "text": "Выбранная папка не является папкой с Titanfall 2." - }, - "not_found": { - "title": "Titanfall 2 не найден!", - "text": "Пожалуйста, вручную выберите место установки" - } - }, - "flightcore_outdated": { - "title": "FlightCore устарел!", - "text": "Пожалуйста, обновите FlightCore\nСейчас запущена старая версия - {oldVersion}.\nНовейшая версия - {newVersion}!" - }, - "profile": { - "invalid": { - "title": "Некорректный Профиль", - "text": "Профиль, на который вы пытаетесь переключиться, больше не является корректным." - } - }, - "no_new": { - "text": "Смотреть здесь нечего!", - "title": "Нет уведомлений" - }, - "date_prefix": "в" - }, - "channels": { - "release": { - "switch": { - "text": "Релизный канал переключен на \"{canal}\"." - } - }, - "names": { - "Northstar": "Northstar", - "NorthstarReleaseCandidate": "Пре-релизная версия Northstar" - } - } -} diff --git a/src-vue/src/i18n/lang/zh_Hans.json b/src-vue/src/i18n/lang/zh_Hans.json deleted file mode 100644 index dca36f98..00000000 --- a/src-vue/src/i18n/lang/zh_Hans.json +++ /dev/null @@ -1,169 +0,0 @@ -{ - "menu": { - "mods": "模组", - "settings": "设置", - "dev": "开发者模式", - "play": "开始游玩", - "changelog": "更新日志" - }, - "generic": { - "error": "错误", - "cancel": "取消", - "yes": "是", - "no": "否", - "informationShort": "信息", - "downloading": "下载中", - "extracting": "解压中", - "done": "完成", - "success": "成功", - "confirm": "确认" - }, - "play": { - "button": { - "northstar_is_running": "游戏正在运行", - "select_game_dir": "选择Titanfall 2游戏目录", - "install": "安装", - "installing": "安装中...", - "update": "升级", - "ready_to_play": "启动游戏", - "updating": "升级中..." - }, - "unknown_version": "未知版本", - "see_patch_notes": "参阅相关补丁说明", - "servers": "服务器", - "players": "玩家", - "unable_to_load_playercount": "加载玩家数量失败", - "ea_app_running": "EA App运行状态:", - "northstar_running": "Northstar运行状态:" - }, - "mods": { - "local": { - "no_mods": "未找到模组。", - "delete_confirm": "你确定要删除该模组吗?", - "delete": "删除", - "part_of_ts_mod": "该Northstar模组来源于Thunderstore", - "success_deleting": "成功删除 {modName}" - }, - "online": { - "try_another_search": "尝试其他搜索方式!", - "no_match": "未找到相匹配的模组。" - }, - "menu": { - "local": "本地", - "search": "搜索", - "sort_mods": "模组排序", - "select_categories": "标签选择", - "sort": { - "date_desc": "日期降序", - "date_asc": "日期升序", - "name_desc": "按名称(Z到A)", - "most_downloaded": "最多下载", - "top_rated": "最高评分", - "name_asc": "按名称(A到Z)" - }, - "online": "线上", - "filter": "筛选" - }, - "card": { - "button": { - "being_installed": "安装中...", - "being_updated": "升级中...", - "installed": "已安装", - "install": "安装", - "outdated": "升级" - }, - "by": "作者:", - "remove": "移除模组", - "remove_dialog_title": "警告", - "remove_success": "已移除{modName}", - "install_success": "已安装 {modName}", - "more_info": "更多信息", - "remove_dialog_text": "删除该来自Thunderstore的模组?" - } - }, - "settings": { - "manage_install": "安装管理", - "choose_folder": "选择安装目录", - "open_game_folder": "打开文件夹", - "nb_ts_mods_per_page": "Thunderstore每页显示多少个模组", - "nb_ts_mods_per_page_desc2": "该值设为0时将不再显示页码。", - "nb_ts_mods_reset": "重置为默认值", - "language": "语言", - "language_select": "请选择你需要的语言", - "about": "关于:", - "flightcore_version": "FlightCore 版本:", - "testing": "测试选项:", - "enable_test_channels": "开启测试版本选项", - "nb_ts_mods_per_page_desc1": "该数值对加载Thunderstore页面时的速度有影响。", - "dev_mode_enabled_title": "看上面!", - "dev_mode_enabled_text": "开发者模式已启用。", - "show_deprecated_mods": "显示已弃用的Thunderstore模组", - "show_deprecated_mods_desc1": "该选项会使您可以在线上模组合集中看到已弃用的模组。", - "show_deprecated_mods_desc2": "请注意,这类模组被弃用一般是有原因的。", - "repair": { - "title": "修复", - "window": { - "title": "FlightCore 修复工具", - "warning": "此工具包含修复Northstar和FlightCore各种常见问题的功能。", - "disable_all_but_core": "除了核心模组以外禁用其他模组", - "disable_all_but_core_success": "已禁用除核心模组以外的所有模组", - "disable_modsettings": "禁用ModSettings模组", - "disable_modsettings_success": "已禁用ModSettings模组", - "force_delete_temp_dl": "强制删除临时下载目录", - "delete_persistent_store": "删除FlightCore永久存储文件", - "reinstall_text": "请耐心等待", - "reinstall_success": "成功重装Northstar", - "force_reinstall_ns": "强制重装Northstar", - "reinstall_title": "正在强制重装Northstar", - "kill_northstar_process": "终止正在运行的 Northstar/Titanfall2 进程" - }, - "open_window": "打开修复工具" - }, - "profile": { - "active": "当前用户配置", - "edit": "编辑用户配置", - "dialog": { - "title": "用户配置", - "delete_confirm": "你确定要删除此配置文件吗?", - "delete": "删除" - } - } - }, - "notification": { - "game_folder": { - "new": { - "title": "新的游戏目录", - "text": "已成功更新游戏目录。" - }, - "wrong": { - "title": "错误的文件夹", - "text": "所选文件夹不是有效的Titanfall2安装目录。" - }, - "not_found": { - "title": "未找到Titanfall2!", - "text": "请手动选择安装目录" - } - }, - "flightcore_outdated": { - "title": "FlightCore需要更新!", - "text": "请更新FlightCore.\n正在运行旧版本 {oldVersion}.\n最新版本为 {newVersion}!" - }, - "profile": { - "invalid": { - "title": "无效用户配置", - "text": "您尝试切换到的用户配置已失效。" - } - } - }, - "channels": { - "release": { - "switch": { - "text": "将资源版本切换至 \"{canal}\"." - } - }, - "names": { - "NorthstarReleaseCandidate": "Northstar测试版本", - "Northstar": "Northstar" - } - } -} diff --git a/src-vue/src/main.ts b/src-vue/src/main.ts deleted file mode 100644 index 73219c9d..00000000 --- a/src-vue/src/main.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { createApp } from 'vue' -import { createI18n } from "vue-i18n"; -import App from './App.vue' -import ElementPlus from "element-plus"; -import * as ElementPlusIconsVue from '@element-plus/icons-vue' -import { store } from './plugins/store'; -import PlayView from "./views/PlayView.vue"; -import ChangelogView from "./views/ChangelogView.vue"; -import ModsView from "./views/ModsView.vue"; -import SettingsView from "./views/SettingsView.vue"; -import DeveloperView from "./views/DeveloperView.vue"; -import RepairView from "./views/RepairView.vue"; -import {createRouter, createWebHashHistory} from "vue-router"; -import en from "./i18n/lang/en.json"; -import fr from "./i18n/lang/fr.json"; -import da from "./i18n/lang/da.json"; -import de from "./i18n/lang/de.json"; -import es from "./i18n/lang/es.json"; -import pl from "./i18n/lang/pl.json"; -import ru from "./i18n/lang/ru.json"; -import it from "./i18n/lang/it.json"; -import zh_Hans from "./i18n/lang/zh_Hans.json"; - - -const app = createApp(App); - -// internationalization -export const i18n = createI18n({ - locale: 'en', - fallbackLocale: 'en', - messages: { - en, fr, da, de, es, pl, ru, it, zh_Hans - } -}); -app.use(i18n); - -// styles -import 'element-plus/theme-chalk/index.css'; -import './style.css' - -app.use(ElementPlus); - -// icons -for (const [key, component] of Object.entries(ElementPlusIconsVue)) { - app.component(key, component); -} - -// style -app.use( store, '$store' ); - - -// routes -const routes = [ - { path: '/', name: 'Main', component: async () => PlayView}, - { path: '/changelog', name: 'Changelog', component: async () => ChangelogView}, - { path: '/mods', name: 'Mods', component: async () => ModsView}, - { path: '/settings', name: 'Settings', component: async () => SettingsView}, - { path: '/dev', name: 'Dev', component: async () => DeveloperView}, - { path: '/repair', name: 'Repair', component: async () => RepairView}, -]; -export const router = createRouter({ - history: createWebHashHistory(), - routes, // short for `routes: routes` -}); -app.use(router); - - -app.mount('#app') diff --git a/src-vue/src/plugins/modules/notifications.ts b/src-vue/src/plugins/modules/notifications.ts deleted file mode 100644 index ed57f8af..00000000 --- a/src-vue/src/plugins/modules/notifications.ts +++ /dev/null @@ -1,31 +0,0 @@ -type NotificationType = 'success' | 'warning' | 'info' | 'error'; - -export interface Notification { - title: string; - text: string; - type: NotificationType; -} - -interface NotificationsStoreState { - notifications: Notification[]; -} - - -/** - * This notification module is meant to host the list of notifications that have been fired while the application was - * not focused. - * This list is then used by the [NotificationButton] component to display notifications to user. - **/ -export const notificationsModule = { - state: () => ({ - notifications: [] - }) as NotificationsStoreState, - mutations: { - addNotification(state: NotificationsStoreState, payload: Notification) { - state.notifications.push(payload); - }, - removeNotification(state: NotificationsStoreState, index: number): void { - state.notifications.splice(index, 1); - } - } - } diff --git a/src-vue/src/plugins/modules/pull_requests.ts b/src-vue/src/plugins/modules/pull_requests.ts deleted file mode 100644 index 4caec0b0..00000000 --- a/src-vue/src/plugins/modules/pull_requests.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { invoke, shell } from "@tauri-apps/api"; -import { PullsApiResponseElement } from "../../../../src-tauri/bindings/PullsApiResponseElement"; -import { PullRequestType } from '../../../../src-tauri/bindings/PullRequestType'; -import { store } from "../store"; -import { showErrorNotification, showNotification } from "../../utils/ui"; - -interface PullRequestStoreState { - searchValue: string, - pull_requests_launcher: PullsApiResponseElement[], - pull_requests_mods: PullsApiResponseElement[], -} - -export const pullRequestModule = { - state: () => ({ - pull_requests_launcher: [], - pull_requests_mods: [], - }), - mutations: { - async getPullRequests(state: PullRequestStoreState, pull_request_type: PullRequestType) { - await invoke<PullsApiResponseElement[]>("get_pull_requests_wrapper", { installType: pull_request_type }) - .then((message) => { - switch (pull_request_type) { - case "Mods": - state.pull_requests_mods = message; - break; - - case "Launcher": - state.pull_requests_launcher = message; - break; - - default: - console.error("We should never end up here"); - } - }) - .catch((error) => { - showErrorNotification(error); - }); - }, - async downloadLauncherPR(state: PullRequestStoreState, pull_request: PullsApiResponseElement) { - await invoke<string>("get_launcher_download_link", { commitSha: pull_request.head.sha }) - .then((url) => { - // Open URL in default HTTPS handler (i.e. default browser) - shell.open(url); - }) - .catch((error) => { - showErrorNotification(error); - }); - }, - async downloadModsPR(state: PullRequestStoreState, pull_request: PullsApiResponseElement) { - let url = `https://github.com/${pull_request.head.repo.full_name}/archive/refs/heads/${pull_request.head.ref}.zip` - shell.open(url); - }, - async installLauncherPR(state: PullRequestStoreState, pull_request: PullsApiResponseElement) { - // Send notification telling the user to wait for the process to finish - const notification = showNotification(`Installing launcher PR ${pull_request.number}`, 'Please wait', 'info', 0); - - await invoke("apply_launcher_pr", { pullRequest: pull_request, gameInstall: store.state.game_install }) - .then((message) => { - console.log(message); - // Show user notification if mod install completed. - showNotification(`Done`, `Installed ${pull_request.number}: "${pull_request.title}"`); - }) - .catch((error) => { - showErrorNotification(error); - }) - .finally(() => { - // Clear old notification - notification.close(); - }); - }, - async installModsPR(state: PullRequestStoreState, pull_request: PullsApiResponseElement) { - // Send notification telling the user to wait for the process to finish - const notification = showNotification(`Installing mods PR ${pull_request.number}`, 'Please wait', 'info', 0); - - await invoke("apply_mods_pr", { pullRequest: pull_request, gameInstall: store.state.game_install }) - .then((message) => { - // Show user notification if mod install completed. - showNotification( - `Done`, - `Installed ${pull_request.number}: "${pull_request.title}"\nMake sure to launch via batch file or by specifying correct profile!`, - 'success', - 7000 - ); - }) - .catch((error) => { - showErrorNotification(error); - }) - .finally(() => { - // Clear old notification - notification.close(); - }); - }, - } -} diff --git a/src-vue/src/plugins/modules/search.ts b/src-vue/src/plugins/modules/search.ts deleted file mode 100644 index 9614b0be..00000000 --- a/src-vue/src/plugins/modules/search.ts +++ /dev/null @@ -1,20 +0,0 @@ -interface SearchStoreState { - searchValue: string -} - -export const searchModule = { - state: () => ({ - // This is the treated value of search input - searchValue: '', - // Selected mod categories - selectedCategories: [], - showDeprecatedMods: false, - showNsfwMods: false, - sortValue: {label: '', value: ''} - }), - getters: { - searchWords(state: SearchStoreState): string { - return state.searchValue.toLowerCase(); - } - } - } diff --git a/src-vue/src/plugins/store.ts b/src-vue/src/plugins/store.ts deleted file mode 100644 index b61ac573..00000000 --- a/src-vue/src/plugins/store.ts +++ /dev/null @@ -1,529 +0,0 @@ -import { createStore } from 'vuex'; -import { listen, Event as TauriEvent } from "@tauri-apps/api/event"; -import { Tabs } from "../utils/Tabs"; -import { InstallType } from "../../../src-tauri/bindings/InstallType"; -import { invoke } from "@tauri-apps/api"; -import { GameInstall } from "../utils/GameInstall"; -import { ReleaseCanal } from "../utils/ReleaseCanal"; -import { FlightCoreVersion } from "../../../src-tauri/bindings/FlightCoreVersion"; -import { NotificationHandle } from 'element-plus'; -import { NorthstarState } from '../utils/NorthstarState'; -import { appDir } from '@tauri-apps/api/path'; -import { open } from '@tauri-apps/api/dialog'; -import { Store } from 'tauri-plugin-store-api'; -import { router } from "../main"; -import { ReleaseInfo } from "../../../src-tauri/bindings/ReleaseInfo"; -import { ThunderstoreMod } from "../../../src-tauri/bindings/ThunderstoreMod"; -import { NorthstarMod } from "../../../src-tauri/bindings/NorthstarMod"; -import { NorthstarLaunchOptions } from "../../../src-tauri/bindings/NorthstarLaunchOptions" -import { searchModule } from './modules/search'; -import { i18n } from '../main'; -import { pullRequestModule } from './modules/pull_requests'; -import { showErrorNotification, showNotification } from '../utils/ui'; -import { notificationsModule } from './modules/notifications'; - -const persistentStore = new Store('flight-core-settings.json'); - - -export interface FlightCoreStore { - developer_mode: boolean, - game_install: GameInstall, - - flightcore_version: string, - - installed_northstar_version: string, - northstar_state: NorthstarState, - northstar_release_canal: ReleaseCanal, - enableReleasesSwitch: boolean, - releaseNotes: ReleaseInfo[], - - thunderstoreMods: ThunderstoreMod[], - thunderstoreModsCategories: string[], - installed_mods: NorthstarMod[], - available_profiles: string[], - - northstar_is_running: boolean, - origin_is_running: boolean, - - player_count: number, - server_count: number, - - // user custom settings - mods_per_page: number, -} - -let notification_handle: NotificationHandle; - - -export const store = createStore<FlightCoreStore>({ - modules: { - search: searchModule, - pullrequests: pullRequestModule, - notifications: notificationsModule - }, - state(): FlightCoreStore { - return { - developer_mode: false, - game_install: {game_path: undefined, profile: undefined, install_type: "UNKNOWN"} as unknown as GameInstall, - - available_profiles: [], - - flightcore_version: "", - - installed_northstar_version: "", - northstar_state: NorthstarState.GAME_NOT_FOUND, - northstar_release_canal: ReleaseCanal.RELEASE, - enableReleasesSwitch: false, - releaseNotes: [], - - thunderstoreMods: [], - thunderstoreModsCategories: [], - installed_mods: [], - - northstar_is_running: false, - origin_is_running: false, - - player_count: -1, - server_count: -1, - - mods_per_page: 20, - } - }, - mutations: { - checkNorthstarUpdates(state) { - _get_northstar_version_number(state); - }, - async toggleDebugMode(_state) { - let menu_bar_handle = document.querySelector('#fc_menu-bar'); - if (menu_bar_handle !== null) { - menu_bar_handle.classList.toggle('developer_build'); - } - }, - async toggleDeveloperMode(state) { - state.developer_mode = !state.developer_mode; - - // Reset tab when closing dev mode. - if (!state.developer_mode) { - store.commit('updateCurrentTab', Tabs.PLAY); - } - - // Save dev mode state in persistent store - await persistentStore.set('dev_mode', state.developer_mode); - await persistentStore.save(); - }, - initialize(state) { - _initializeApp(state); - _checkForFlightCoreUpdates(state); - _initializeListeners(state); - }, - updateCurrentTab(state: any, newTab: Tabs) { - router.push({ path: newTab }); - }, - async updateGamePath(state: FlightCoreStore) { - // Open a selection dialog for directories - const selected = await open({ - directory: true, - multiple: false, - defaultPath: await appDir(), - }); - if (Array.isArray(selected)) { - // user selected multiple directories - alert("Please only select a single directory"); - } else if (selected === null) { - // user cancelled the selection - } else { - // user selected a single directory - - // Verify if valid Titanfall2 install location - let is_valid_titanfall2_install = await invoke("verify_install_location", { gamePath: selected }) as boolean; - if (is_valid_titanfall2_install) { - state.game_install.game_path = selected; - showNotification( - i18n.global.tc('notification.game_folder.new.title'), - i18n.global.tc('notification.game_folder.new.text') - ); - try { - notification_handle.close(); - } - catch { - console.warn("Nothing to close"); - } - state.game_install.install_type = "UNKNOWN"; - - // Save change in persistent store - await persistentStore.set('game-install', { value: state.game_install }); - await persistentStore.save(); // explicit save to disk - - // We can no longer be sure if our last profile is valid, lets reset to be sure - state.game_install.profile = "R2Northstar"; - - // Check for Northstar install - store.commit('checkNorthstarUpdates'); - - // Since we are in a new game directory, lets see if there are any profiles - store.commit('fetchProfiles'); - - } - else { - // Not valid Titanfall2 install - showErrorNotification( - i18n.global.tc('notification.game_folder.wrong.text'), - i18n.global.tc('notification.game_folder.wrong.title') - ); - } - } - }, - async launchGame(state: any, launch_options: NorthstarLaunchOptions = { launch_via_steam: false, bypass_checks: false}) { - - if (launch_options.bypass_checks) { - await invoke("launch_northstar", { gameInstall: state.game_install, launchOptions: launch_options }) - .then((message) => { - console.log("Launched with bypassed checks"); - console.log(message); - }) - .catch((error) => { - console.error(error); - alert(error); - }); - - return; - } - - // TODO update installation if release track was switched - switch (state.northstar_state) { - // Install northstar if it wasn't detected. - case NorthstarState.INSTALL: - let install_northstar_result = invoke("install_northstar_wrapper", { gameInstall: state.game_install, northstarPackageName: state.northstar_release_canal }); - state.northstar_state = NorthstarState.INSTALLING; - - await install_northstar_result.then((message) => { - console.log(message); - }) - .catch((error) => { - console.error(error); - alert(error); - }); - - _get_northstar_version_number(state); - break; - - // Update northstar if it is outdated. - case NorthstarState.MUST_UPDATE: - // Updating is the same as installing, simply overwrites the existing files - let reinstall_northstar_result = invoke("install_northstar_wrapper", { gameInstall: state.game_install, northstarPackageName: state.northstar_release_canal }); - state.northstar_state = NorthstarState.UPDATING; - - await reinstall_northstar_result.then((message) => { - console.log(message); - }) - .catch((error) => { - console.error(error); - alert(error); - }); - - _get_northstar_version_number(state); - break; - - // Game is ready to play. - case NorthstarState.READY_TO_PLAY: - await invoke("launch_northstar", { gameInstall: state.game_install, launchOptions: launch_options }) - .then((message) => { - console.log(message); - // NorthstarState.RUNNING - }) - .catch((error) => { - console.error(error); - showErrorNotification(error); - }); - break; - - case NorthstarState.GAME_NOT_FOUND: - store.commit('updateGamePath'); - break; - } - }, - async launchGameSteam(state: any, launch_options: NorthstarLaunchOptions = { launch_via_steam: true, bypass_checks: false}) { - await invoke("launch_northstar", { gameInstall: state.game_install, launchOptions: launch_options }) - .then((message) => { - showNotification('Success'); - }) - .catch((error) => { - console.error(error); - showErrorNotification(error); - }); - - return; - }, - async fetchReleaseNotes(state: FlightCoreStore) { - if (state.releaseNotes.length !== 0) return; - await invoke<ReleaseInfo[]>("get_northstar_release_notes") - .then((message) => { - state.releaseNotes = message; - }) - .catch((error) => { - showErrorNotification(error); - }); - }, - async fetchThunderstoreMods(state: FlightCoreStore) { - // To check if some Thunderstore mods are already installed/outdated, we need to load locally-installed mods. - await store.commit('loadInstalledMods'); - if (state.thunderstoreMods.length !== 0) return; - - let mods: ThunderstoreMod[] = []; - await invoke<ThunderstoreMod[]>("query_thunderstore_packages_api") - .then((message) => { - mods = message; - }) - .catch((error) => { - showErrorNotification(error); - console.error(error); - return; - }); - - if (mods == undefined) { - return; - } - - // Remove some mods from listing - state.thunderstoreMods = mods; - - // Retrieve categories from mods - state.thunderstoreModsCategories = mods - .map((mod: ThunderstoreMod) => mod.categories) - .filter((modCategories: string[]) => modCategories.length !== 0) - .reduce((accumulator: string[], modCategories: string[]) => { - accumulator.push( ...modCategories.filter((cat: string) => !accumulator.includes(cat)) ); - return accumulator; - }, []) - .sort(); - }, - async loadInstalledMods(state: FlightCoreStore) { - // If there's no game path, prevent looking for installed mods. - if (state.game_install.game_path === undefined) { - console.warn('Cannot load installed mods since no game path is selected.'); - return; - } - - // Clear installed mod list first so we don't end up with leftovers - state.installed_mods = []; - - // Call back-end for installed mods - await invoke("get_installed_mods_and_properties", { gameInstall: state.game_install }) - .then((message) => { - state.installed_mods = (message as NorthstarMod[]); - }) - .catch((error) => { - console.error(error); - showErrorNotification(error); - }); - }, - async toggleReleaseCandidate(state: FlightCoreStore) { - // Flip between RELEASE and RELEASE_CANDIDATE - state.northstar_release_canal = state.northstar_release_canal === ReleaseCanal.RELEASE - ? ReleaseCanal.RELEASE_CANDIDATE - : ReleaseCanal.RELEASE; - - // Save change in persistent store - await persistentStore.set('northstar-release-canal', { value: state.northstar_release_canal }); - await persistentStore.save(); // explicit save to disk - - // Update current state so that update check etc can be performed - store.commit("checkNorthstarUpdates"); - - // Display notification to highlight change - showNotification( - i18n.global.tc(`channels.names.${state.northstar_release_canal}`), - i18n.global.tc('channels.release.switch.text', {canal: state.northstar_release_canal}), - ); - }, - async fetchProfiles(state: FlightCoreStore) { - // To fetch profiles we need a valid game path - if (!state.game_install.game_path) { - return; - } - - - await invoke("fetch_profiles", { gameInstall: state.game_install }) - .then((message) => { - state.available_profiles = message as string[]; - }) - .catch((error) => { - console.error(error); - showErrorNotification(error); - }); - } - } -}); - -/** - * This is called when application root component has been mounted. - * It invokes all Rust methods that are needed to initialize UI. - */ -async function _initializeApp(state: any) { - // Display dev view if dev mode was previously enabled. - const devModeEnabled: boolean = await persistentStore.get('dev_mode') ?? false; - const debugModeEnabled: boolean = await invoke("is_debug_mode"); - if (devModeEnabled) { - store.commit('toggleDeveloperMode'); - } - if (debugModeEnabled) { - store.commit('toggleDebugMode'); - } - - // Disable context menu in release build. - if (!debugModeEnabled) { - document.addEventListener('contextmenu', event => event.preventDefault()); - } - - // Grab Northstar release canal value from store if exists - var persistent_northstar_release_canal = (await persistentStore.get('northstar-release-canal')) as any; - if (persistent_northstar_release_canal) { // For some reason, the plugin-store doesn't throw an eror but simply returns `null` when key not found - // Put value from peristent store into current store - state.northstar_release_canal = persistent_northstar_release_canal.value as string; - } - else { - console.log("Value not found in store"); - } - - // Grab "Enable releases switching" setting from store if possible - const valueFromStore: { value: boolean } | null = await persistentStore.get('northstar-releases-switching'); - if (valueFromStore) { - state.enableReleasesSwitch = valueFromStore.value; - } - - // Grab "Thunderstore mods per page" setting from store if possible - const perPageFromStore: { value: number } | null = await persistentStore.get('thunderstore-mods-per-page'); - if (perPageFromStore && perPageFromStore.value) { - state.mods_per_page = perPageFromStore.value; - } - - // Get FlightCore version number - state.flightcore_version = await invoke("get_flightcore_version_number"); - - var result = undefined; - var persistent_game_install = (await persistentStore.get('game-install')) as any; - - if ( // Safety checks for value from store - persistent_game_install - && persistent_game_install.value !== undefined - && persistent_game_install.value.game_path !== undefined - && persistent_game_install.value.install_type !== undefined - ) { // For some reason, the plugin-store doesn't throw an eror but simply returns `null` when key not found - - // Add profile to existing storage - if (persistent_game_install.value.profile === undefined) { - persistent_game_install.value.profile = "R2Northstar" - } - - let game_install = persistent_game_install.value as GameInstall; - // check if valid path - let is_valid_titanfall2_install = await invoke("verify_install_location", { gamePath: game_install.game_path }) as boolean; - if (is_valid_titanfall2_install) { - // Use value from peristent store - result = game_install; - } - - } - - if (result === undefined) { // No (valid) value found in persistent store - result = await invoke("find_game_install_location") - .catch((err) => { - // Gamepath not found or other error - console.error(err); - notification_handle = showNotification( - i18n.global.tc('notification.game_folder.not_found.title'), - i18n.global.tc('notification.game_folder.not_found.text'), - 'error', - 0 // Duration `0` means the notification will not auto-vanish - ); - }); - } - - if (result !== undefined) { // Found some form of value for gameinstall - - const typedResult: GameInstall = result as GameInstall; - - // Save change in persistent store - await persistentStore.set('game-install', { value: typedResult }); - await persistentStore.save(); // explicit save to disk - - // Update UI store - state.game_install = typedResult; - - // Check installed Northstar version if found - await _get_northstar_version_number(state); - } - - await invoke<[number, number]>("get_server_player_count") - .then((message) => { - state.player_count = message[0]; - state.server_count = message[1]; - }) - .catch((error) => { - console.warn("Failed getting player/server count"); - console.warn(error); - }); -} - -async function _checkForFlightCoreUpdates(state: FlightCoreStore) { - // Check if FlightCore up-to-date - let flightcore_is_outdated = await invoke("check_is_flightcore_outdated") as boolean; - - if (flightcore_is_outdated) { - let newest_flightcore_version = await invoke("get_newest_flightcore_version") as FlightCoreVersion; - showNotification( - i18n.global.tc('notification.flightcore_outdated.title'), - i18n.global.tc('notification.flightcore_outdated.text', {oldVersion: state.flightcore_version, newVersion: newest_flightcore_version.tag_name}), - 'warning', - 0 // Duration `0` means the notification will not auto-vanish - ); - } -} - -/** - * This registers callbacks listening to events from Rust-backend. - * Those events include Origin and Northstar running state. - */ -function _initializeListeners(state: any) { - listen("ea-app-running-ping", function (evt: TauriEvent<any>) { - state.origin_is_running = evt.payload as boolean; - }); - - listen("northstar-running-ping", function (evt: TauriEvent<any>) { - state.northstar_is_running = evt.payload as boolean; - }); - - listen("northstar-statistics", function (evt: TauriEvent<{Ok: [number, number]}>) { - state.player_count = evt.payload.Ok[0]; - state.server_count = evt.payload.Ok[1]; - }); -} - -/** - * This retrieves Northstar version tag, and stores it in application - * state, for it to be displayed in UI. - */ -async function _get_northstar_version_number(state: any) { - state.installed_northstar_version = ""; - - await invoke("get_northstar_version_number", { gameInstall: state.game_install }) - .then((message) => { - let northstar_version_number: string = message as string; - state.installed_northstar_version = northstar_version_number; - state.northstar_state = NorthstarState.READY_TO_PLAY; - - invoke("check_is_northstar_outdated", { gameInstall: state.game_install, northstarPackageName: state.northstar_release_canal }) - .then((message) => { - if (message) { - state.northstar_state = NorthstarState.MUST_UPDATE; - } - }) - .catch((error) => { - console.error(error); - alert(error); - }); - }) - .catch((error) => { - state.northstar_state = NorthstarState.INSTALL; - }) -} diff --git a/src-vue/src/style.css b/src-vue/src/style.css deleted file mode 100644 index d322a0dd..00000000 --- a/src-vue/src/style.css +++ /dev/null @@ -1,56 +0,0 @@ -* { - box-sizing: border-box; -} - -html, body { - height: 100%; - width: 100%; -} - -body { - margin: 0; - font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', '微软雅黑', Arial, sans-serif; - --fc-menu_height: 50px; - user-select: none; -} - -#app { - position: relative; - height: 100%; - width: 100%; -} - -#fc_bg__container { - background: url(/src/assets/mp_colony020033.jpg) center no-repeat; - background-size: cover; - height: 100%; - width: 100%; - position: fixed; - filter: brightness(0.8); - scale: 1.03; -} - -.el-scrollbar { - --el-scrollbar-opacity: 0.5; - --el-scrollbar-hover-opacity: 0.7; -} - -.fc-container { - position: relative; - padding-top: var(--fc-menu_height); - height: 100%; - color: white; -} - -.noModMessage { - color: white; - margin: 30px 15px; -} - -.fc_popper { - width: auto !important; -} - -.el-popconfirm { - word-break: break-word; -} diff --git a/src-vue/src/utils/GameInstall.ts b/src-vue/src/utils/GameInstall.ts deleted file mode 100644 index 162d2860..00000000 --- a/src-vue/src/utils/GameInstall.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface GameInstall { - game_path: string; - profile: string, - install_type: string; -} diff --git a/src-vue/src/utils/NorthstarState.ts b/src-vue/src/utils/NorthstarState.ts deleted file mode 100644 index 2c8756b1..00000000 --- a/src-vue/src/utils/NorthstarState.ts +++ /dev/null @@ -1,8 +0,0 @@ -export enum NorthstarState { - GAME_NOT_FOUND = "GAME_NOT_FOUND", - INSTALL = "INSTALL", - INSTALLING = "INSTALLING", - MUST_UPDATE = "MUST_UPDATE", - UPDATING = "UPDATING", - READY_TO_PLAY = "READY_TO_PLAY" -}
\ No newline at end of file diff --git a/src-vue/src/utils/ReleaseCanal.ts b/src-vue/src/utils/ReleaseCanal.ts deleted file mode 100644 index 9363aa25..00000000 --- a/src-vue/src/utils/ReleaseCanal.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum ReleaseCanal { - RELEASE = <any>'Northstar', - RELEASE_CANDIDATE = <any>'NorthstarReleaseCandidate' -} diff --git a/src-vue/src/utils/SortOptions.d.ts b/src-vue/src/utils/SortOptions.d.ts deleted file mode 100644 index b6f180d2..00000000 --- a/src-vue/src/utils/SortOptions.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -export enum SortOptions { - NAME_ASC = 'name_asc', - NAME_DESC = 'name_desc', - DATE_ASC = 'date_asc', - DATE_DESC = 'date_desc', - MOST_DOWNLOADED = 'most_downloaded', - TOP_RATED = 'top_rated' -} diff --git a/src-vue/src/utils/Tabs.ts b/src-vue/src/utils/Tabs.ts deleted file mode 100644 index 5d31379c..00000000 --- a/src-vue/src/utils/Tabs.ts +++ /dev/null @@ -1,8 +0,0 @@ -export enum Tabs { - PLAY = '/', - CHANGELOG = '/changelog', - SETTINGS = '/settings', - DEV = '/dev', - MODS = '/mods', - REPAIR = '/repair', -} diff --git a/src-vue/src/utils/filter.ts b/src-vue/src/utils/filter.ts deleted file mode 100644 index b85b9623..00000000 --- a/src-vue/src/utils/filter.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Implements a fuzzy filter - * Iterates through chars of `search_term` and checks if each char exists in consecutive order in `text`. - * For example, this means that `text="Gecko"` and `search_term="geo"` will return `true` - * but using `text="Gecko"` and `search_term="goe"` will return `false` - * - * Implements a subset of "fuzzy string searching" - * https://en.wikipedia.org/wiki/Approximate_string_matching - */ -function fuzzy_filter(text: string, search_term: string): boolean { - const lowercase_text = text.toLowerCase(); - const lowercase_search_term = search_term.toLowerCase(); - - let previousIndex = -1; - for (let i = 0; i < lowercase_search_term.length; i++) { - const char = lowercase_search_term[i]; - const currentIndex = lowercase_text.indexOf(char, previousIndex + 1); - if (currentIndex === -1) { - return false; - } - previousIndex = currentIndex; - } - - return true; -} -export { fuzzy_filter }; diff --git a/src-vue/src/utils/thunderstore/ThunderstoreModStatus.ts b/src-vue/src/utils/thunderstore/ThunderstoreModStatus.ts deleted file mode 100644 index f2351226..00000000 --- a/src-vue/src/utils/thunderstore/ThunderstoreModStatus.ts +++ /dev/null @@ -1,7 +0,0 @@ -export enum ThunderstoreModStatus { - INSTALLED, - BEING_INSTALLED, - BEING_UPDATED, - NOT_INSTALLED, - OUTDATED -} diff --git a/src-vue/src/utils/thunderstore/version.ts b/src-vue/src/utils/thunderstore/version.ts deleted file mode 100644 index a111e08c..00000000 --- a/src-vue/src/utils/thunderstore/version.ts +++ /dev/null @@ -1,33 +0,0 @@ -import {ThunderstoreMod} from "../../../../src-tauri/bindings/ThunderstoreMod"; -import {NorthstarMod} from "../../../../src-tauri/bindings/NorthstarMod"; -import {store} from "../../plugins/store"; - -/** - * Strips off a Thunderstore dependency string from its version - * (e.g. "taskinoz-WallrunningTitans-1.0.0" to - * "taskinoz-WallrunningTitans"). - **/ -function getThunderstoreDependencyStringPrefix(dependency: string): string { - const dependencyStringMembers = dependency.split('-'); - return `${dependencyStringMembers[0]}-${dependencyStringMembers[1]}`; -} - -function isThunderstoreModOutdated(mod: ThunderstoreMod): boolean { - // Ensure mod is up-to-date. - const tsModPrefix = getThunderstoreDependencyStringPrefix(mod.versions[0].full_name); - const matchingMods: NorthstarMod[] = store.state.installed_mods.filter((mod: NorthstarMod) => { - if (!mod.thunderstore_mod_string) return false; - return getThunderstoreDependencyStringPrefix(mod.thunderstore_mod_string!) === tsModPrefix; - }); - if (matchingMods.length !== 0) { - // There shouldn't be several mods with same dependency string, but we never know... - const matchingMod = matchingMods[0]; - // A mod is outdated if its dependency strings differs from Thunderstore dependency string - // (no need for semver check here). - // This assumes mod versions list is sorted from newest to oldest version. - return matchingMod.thunderstore_mod_string !== mod.versions[0].full_name; - } - return false; -} - -export { isThunderstoreModOutdated }; diff --git a/src-vue/src/utils/ui.ts b/src-vue/src/utils/ui.ts deleted file mode 100644 index f5183bcc..00000000 --- a/src-vue/src/utils/ui.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { ElNotification, NotificationHandle } from "element-plus"; -import { appWindow, UserAttentionType } from '@tauri-apps/api/window'; -import { i18n } from "../main"; -import { store } from "../plugins/store"; - -/** - * Displays content to the user in the form of a notification appearing on screen bottom right. - * If the app is not focused when this is invoked, a notification is added to the notifications menu. - **/ -function showNotification( - title: string, - message: string = '', - type: 'success' | 'warning' | 'error' | 'info' = 'success', - duration: number = 4500 -): NotificationHandle { - if (!document.hasFocus()) { - const date = new Date(); - const titleWithDate = `${title} (${i18n.global.tc('notification.date_prefix')} ${('0' + date.getHours()).slice(-2)}:${('0' + date.getMinutes()).slice(-2)})`; - store.commit('addNotification', {title: titleWithDate, text: message, type}); - appWindow.requestUserAttention(UserAttentionType.Informational); - } - - return ElNotification({ - title, message, type, duration, - position: 'bottom-right', - }); -} - -/** - * Helper method displaying an error message to the user. - **/ -function showErrorNotification( - error: string, - title: string = i18n.global.tc('generic.error') -): NotificationHandle { - return showNotification(title, error, 'error'); -} - -export {showNotification, showErrorNotification}; diff --git a/src-vue/src/views/ChangelogView.vue b/src-vue/src/views/ChangelogView.vue deleted file mode 100644 index f75d869c..00000000 --- a/src-vue/src/views/ChangelogView.vue +++ /dev/null @@ -1,82 +0,0 @@ -<template> - <div class="fc-container"> - <div v-if="releases.length === 0" class="fc__changelog__container"> - <el-progress :show-text="false" :percentage="50" :indeterminate="true" /> - </div> - <el-scrollbar v-else> - <el-timeline> - <el-timeline-item - v-for="release in releases" - v-bind:key="release.name" - :timestamp="formatDate(release.published_at)" - placement="top" - > - <el-card> - <h4>{{ release.name }}</h4> - <p v-html="formatRelease(release.body)"></p> - </el-card> - </el-timeline-item> - </el-timeline> - </el-scrollbar> - </div> -</template> - -<script lang="ts"> -import { defineComponent } from 'vue'; -import { ReleaseInfo } from "../../../src-tauri/bindings/ReleaseInfo"; -import { marked } from "marked"; - - -export default defineComponent({ - name: "ChangelogView", - async mounted() { - this.$store.commit('fetchReleaseNotes'); - }, - computed: { - releases(): ReleaseInfo[] { - return this.$store.state.releaseNotes; - } - }, - methods: { - // Transforms a Markdown document into an HTML document. - // Taken from Viper launcher: - // https://github.com/0neGal/viper/blob/5106d9ed409a3cc91a7755f961fab1bf91d8b7fb/src/app/launcher.js#L26 - formatRelease(releaseBody: string) { - // GitHub authors' links formatting - let content: string = releaseBody.replaceAll(/\@(\S+)/g, `<a target="_blank" href="https://github.com/$1">@$1</a>`); - - // PR's links formatting - content = content.replaceAll(/\[(\S*)\#(\S+)\]\(([^)]+)\)/g, `<a target="_blank" href="$3">$1#$2</a>`); - - return marked.parse(content, { breaks: true }); - }, - // Formats an ISO-formatted date into a human-readable string. - formatDate(timestamp: string): string { - return new Date(timestamp).toLocaleDateString(); - } - } -}); -</script> - -<style> -.el-scrollbar__view { - padding: 20px 30px; -} - -.el-table .el-scrollbar__view { - padding: 0; -} - -.fc__changelog__container { - padding: 20px 30px; -} - -.el-timeline-item__timestamp { - color: white !important; - user-select: none !important; -} - -.el-card__body * { - max-width: 100%; -} -</style> diff --git a/src-vue/src/views/DeveloperView.vue b/src-vue/src/views/DeveloperView.vue deleted file mode 100644 index 19214157..00000000 --- a/src-vue/src/views/DeveloperView.vue +++ /dev/null @@ -1,369 +0,0 @@ -<template> - <div class="fc-container"> - <el-scrollbar> - <el-alert title="Warning" type="warning" :closable="false" show-icon> - This page is designed for developers. Some of the buttons here can break your Northstar install if you do not know what you're doing! - </el-alert> - - <h3>Basic:</h3> - - <el-button type="primary" @click="disableDevMode"> - Disable developer mode - </el-button> - - <el-button type="primary" @click="crashApplication"> - Panic button - </el-button> - - <h3>Linux:</h3> - - <el-button type="primary" @click="installNSProton"> - Install NSProton - </el-button> - - <el-button type="primary" @click="uninstallNSProton"> - Remove NSProton - </el-button> - - <el-button type="primary" @click="getLocalNSProtonVersion"> - Get local NSProton Version - </el-button> - - <h3>Testing:</h3> - - <el-button type="primary" @click="launchGameWithoutChecks"> - Launch Northstar (bypass all checks) - </el-button> - - <el-button type="primary" @click="launchGameViaSteam"> - Launch Northstar via Steam - </el-button> - - <el-button type="primary" @click="installLauncherGitMain"> - Install launcher from main branch - </el-button> - - <br /> - <br /> - - <el-button type="primary" @click="getAvailableNorthstarVersions"> - Get available versions - </el-button> - - <el-select v-model="selected_ns_version" class="m-2" placeholder="Versions"> - <el-option - v-for="item in ns_versions" - :key="item.value" - :label="item.label" - :value="item" - /> - </el-select> - - <el-button type="primary" @click="installNorthstarVersion"> - Install - </el-button> - - <h3>Repair:</h3> - - <el-button type="primary" @click="checkCgnat"> - Run tracert and collect hop count - </el-button> - - <el-button type="primary" @click="getInstalledMods"> - Get installed mods - </el-button> - - <h3>Testing</h3> - <pull-requests-selector /> - - <h3>Mod install:</h3> - - <el-input v-model="mod_to_install_field_string" placeholder="Please input Thunderstore dependency string (example: AuthorName-ModName-1.2.3)" clearable /> - - <el-button type="primary" @click="installMod"> - Install mod - </el-button> - - <h3>Release management</h3> - <el-select v-model="selected_project" placeholder="Select"> - <el-option - v-for="item in project" - :key="item.value" - :label="item.label" - :value="item.value" - /> - </el-select> - <el-button type="primary" @click="getTags"> - Get tags - </el-button> - - <el-select v-model="firstTag" class="m-2" placeholder="First tag"> - <el-option - v-for="item in ns_release_tags" - :key="item.value" - :label="item.label" - :value="item" - /> - </el-select> - <el-select v-model="secondTag" class="m-2" placeholder="Second tag"> - <el-option - v-for="item in ns_release_tags" - :key="item.value" - :label="item.label" - :value="item" - /> - </el-select> - - <el-button type="primary" @click="compareTags"> - Compare Tags - </el-button> - - <el-button type="primary" @click="copyReleaseNotesToClipboard"> - Copy to clipboard - </el-button> - - <el-input - v-model="release_notes_text" - type="textarea" - :rows="5" - placeholder="Output" - /> - - <h3>Release announcements</h3> - - <el-button type="primary" @click="generateReleaseAnnouncementMessage"> - Generate release announcement - </el-button> - - <el-input - v-model="discord_release_announcement_text" - type="textarea" - :rows="5" - placeholder="Output" - /> - </el-scrollbar> - </div> -</template> - -<script lang="ts"> -import { defineComponent } from "vue"; -import { invoke } from "@tauri-apps/api"; -import { NorthstarLaunchOptions } from "../../../src-tauri/bindings/NorthstarLaunchOptions"; -import { TagWrapper } from "../../../src-tauri/bindings/TagWrapper"; -import { NorthstarThunderstoreReleaseWrapper } from "../../../src-tauri/bindings/NorthstarThunderstoreReleaseWrapper"; -import PullRequestsSelector from "../components/PullRequestsSelector.vue"; -import { showErrorNotification, showNotification } from "../utils/ui"; -import { Project } from "../../../src-tauri/bindings/Project" - -export default defineComponent({ - name: "DeveloperView", - components: { - PullRequestsSelector - }, - data() { - return { - mod_to_install_field_string: "", - release_notes_text: "", - discord_release_announcement_text: "", - first_tag: { label: '', value: { name: '' } }, - second_tag: { label: '', value: { name: '' } }, - ns_release_tags: [] as TagWrapper[], - ns_versions: [] as NorthstarThunderstoreReleaseWrapper[], - selected_ns_version: { label: '', value: { package: '', version: '' } } as NorthstarThunderstoreReleaseWrapper, - selected_project: "FlightCore", - project: [ - { - value: 'FlightCore', - label: 'FlightCore', - }, - { - value: 'Northstar', - label: 'Northstar', - } - ], - } - }, - computed: { - firstTag: { - get(): TagWrapper { - return this.first_tag; - }, - set(value: TagWrapper) { - this.first_tag = value; - } - }, - secondTag: { - get(): TagWrapper { - return this.second_tag; - }, - set(value: TagWrapper) { - this.second_tag = value; - } - }, - }, - methods: { - disableDevMode() { - this.$store.commit('toggleDeveloperMode'); - }, - async crashApplication() { - await invoke("force_panic"); - showErrorNotification("Never should have been able to get here!"); - }, - async launchGameWithoutChecks() { - let launch_options: NorthstarLaunchOptions = { bypass_checks: true, launch_via_steam: false }; - this.$store.commit('launchGame', launch_options); - }, - async launchGameViaSteam() { - let launch_options: NorthstarLaunchOptions = { bypass_checks: false, launch_via_steam: true }; - this.$store.commit('launchGameSteam', launch_options); - }, - async getInstalledMods() { - await invoke("get_installed_mods_and_properties", { gameInstall: this.$store.state.game_install }).then((message) => { - // Simply console logging for now - // In the future we should display the installed mods somewhere - console.log(message); - - // Just a visual indicator that it worked - showNotification('Success'); - }) - .catch((error) => { - showErrorNotification(error); - }); - }, - async installMod() { - let mod_to_install = this.mod_to_install_field_string; - await invoke<string>("install_mod_wrapper", { gameInstall: this.$store.state.game_install, thunderstoreModString: mod_to_install }).then((message) => { - // Show user notification if mod install completed. - showNotification(`Installed ${mod_to_install}`, message); - }) - .catch((error) => { - showErrorNotification(error); - }); - }, - async getTags() { - await invoke<TagWrapper[]>("get_list_of_tags", { project: this.selected_project }) - .then((message) => { - this.ns_release_tags = message; - showNotification("Done", "Fetched tags"); - this.first_tag = this.ns_release_tags[1]; - this.second_tag = this.ns_release_tags[0]; - this.compareTags(); - }) - .catch((error) => { - showErrorNotification(error); - }); - }, - async compareTags() { - await invoke<string>("compare_tags", { project: this.selected_project, firstTag: this.firstTag.value, secondTag: this.secondTag.value }) - .then((message) => { - this.release_notes_text = message; - showNotification("Done", "Generated release notes"); - this.copyReleaseNotesToClipboard(); - }) - .catch((error) => { - showErrorNotification(error); - }); - }, - async installLauncherGitMain() { - - const notification = showNotification(`Installing git main`, 'Please wait', 'info', 0); - - await invoke<string>("install_git_main", { gameInstallPath: this.$store.state.game_install.game_path }) - .then((message) => { - this.release_notes_text = message; - showNotification("Done", `Installed launcher build from ${message}`); - }) - .catch((error) => { - showErrorNotification(error); - }) - .finally(() => { - // Clear old notification - notification.close(); - }); - }, - async getAvailableNorthstarVersions() { - await invoke<NorthstarThunderstoreReleaseWrapper[]>("get_available_northstar_versions") - .then((message) => { - this.ns_versions = message; - showNotification("Done", "Fetched all available Northstar versions"); - }) - .catch((error) => { - showErrorNotification(error); - }); - }, - async installNorthstarVersion() { - // Send notification telling the user to wait for the process to finish - const notification = showNotification( - `Installing Northstar version v${this.selected_ns_version.value.version}`, - "Please wait", - 'info', - 0 - ); - - let install_northstar_result = invoke("install_northstar_wrapper", { gameInstall: this.$store.state.game_install, northstarPackageName: this.selected_ns_version.value.package, versionNumber: this.selected_ns_version.value.version }); - - await install_northstar_result - .then((message) => { - // Send notification - showNotification(this.$t('generic.done'), this.$t('settings.repair.window.reinstall_success')); - this.$store.commit('checkNorthstarUpdates'); - }) - .catch((error) => { - showErrorNotification(error); - console.error(error); - }) - .finally(() => { - // Clear old notification - notification.close(); - }); - }, - async installNSProton() { - showNotification(`Started NSProton install`); - await invoke("install_northstar_proton_wrapper") - .then((message) => { showNotification(`Done`); }) - .catch((error) => { showNotification(`Error`, error, "error"); }) - }, - async uninstallNSProton() { - await invoke("uninstall_northstar_proton_wrapper") - .then((message) => { showNotification(`Done`); }) - .catch((error) => { showNotification(`Error`, error, "error"); }) - }, - async getLocalNSProtonVersion() { - await invoke("get_local_northstar_proton_wrapper_version") - .then((message) => { showNotification(`NSProton Version`, message as string); }) - .catch((error) => { showNotification(`Error`, error, "error"); }) - }, - async checkCgnat() { - await invoke<string>("check_cgnat") - .then((message) => { - showNotification(message); - }) - .catch((error) => { - showErrorNotification(error); - }); - }, - async copyReleaseNotesToClipboard() { - navigator.clipboard.writeText(this.release_notes_text) - .then(() => { - showNotification("Copied to clipboard"); - }) - .catch(() => { - showErrorNotification("Failed copying to clipboard"); - }); - }, - async generateReleaseAnnouncementMessage() { - await invoke<string>("generate_release_note_announcement", { }) - .then((message) => { - this.discord_release_announcement_text = message; - showNotification("Done", "Generated announcement"); - }) - .catch((error) => { - showErrorNotification(error); - }); - }, - } -}); -</script> - -<style scoped> -</style> diff --git a/src-vue/src/views/ModsView.vue b/src-vue/src/views/ModsView.vue deleted file mode 100644 index a821dcda..00000000 --- a/src-vue/src/views/ModsView.vue +++ /dev/null @@ -1,54 +0,0 @@ -<template> - <div class="fc-container" style="display: flex"> - <!-- Local mods/Thunderstore mods menu --> - <mods-menu - :showingLocalMods="show_local_mods" - @showLocalMods="(v) => show_local_mods = v" - /> - - <!-- Mods content --> - <div class="fc_mods__container"> - <local-mods-view - v-if="show_local_mods" - /> - - <thunderstore-mods-view - v-else - clearable - /> - </div> - </div> -</template> - -<script lang="ts"> -import { defineComponent } from "vue"; -import ThunderstoreModsView from "./mods/ThunderstoreModsView.vue"; -import LocalModsView from "./mods/LocalModsView.vue"; -import ModsMenu from "../components/ModsMenu.vue"; - -export default defineComponent({ - name: "ModsView", - components: { - ModsMenu, - LocalModsView, - ThunderstoreModsView - }, - data() { - return { - show_local_mods: true, - } - }, - mounted() { - // Fetch Thunderstore mods to eventually display outdated mods count - this.$store.commit('fetchThunderstoreMods'); - } -}); -</script> - -<style scoped> -.fc_mods__container { - display: flex; - width: 100%; - flex-direction: column; -} -</style> diff --git a/src-vue/src/views/PlayView.vue b/src-vue/src/views/PlayView.vue deleted file mode 100644 index 30171e48..00000000 --- a/src-vue/src/views/PlayView.vue +++ /dev/null @@ -1,124 +0,0 @@ -<script lang="ts"> -import { Tabs } from "../utils/Tabs"; -import PlayButton from '../components/PlayButton.vue'; -import { defineComponent } from "vue"; -import InstallProgressBar from "../components/InstallProgressBar.vue"; - -export default defineComponent({ - components: { - PlayButton, - InstallProgressBar - }, - computed: { - northstarIsRunning(): boolean { - return this.$store.state.northstar_is_running; - }, - northstarVersion(): string { - return this.$store.state.installed_northstar_version; - }, - playerCount(): number { - return this.$store.state.player_count; - }, - serverCount(): number { - return this.$store.state.server_count; - }, - }, - methods: { - showChangelogPage() { - this.$store.commit('updateCurrentTab', Tabs.CHANGELOG); - } - } -}); -</script> - -<template> - <div class="fc_launch__container"> - <div class="fc_title">Northstar</div> - <div class="fc_northstar__version__container"> - {{ northstarVersion === '' ? $t('play.unknown_version') : `v${northstarVersion}` }} - <div v-if="northstarVersion !== ''" class="fc_changelog__link" @click="showChangelogPage"> - ({{ $t('play.see_patch_notes') }}) - </div> - <div v-if="playerCount >= 0" class="fc-stats__container"> - {{ playerCount }} {{ $t('play.players') }}, - {{ serverCount }} {{ $t('play.servers') }} - </div> - <div v-else="playerCount >= 0" class="fc-stats__container"> - {{ $t('play.unable_to_load_playercount') }} - </div> - </div> - - <!-- Align play button and services state container --> - <div style="display: flex"> - <PlayButton /> - <div v-if="$store.state.developer_mode" id="fc_services__status"> - <div> - <div class="fc_version__line">{{ $t('play.northstar_running') }}</div> - <div class="fc_version__line fc_version__line__boolean"> {{ northstarIsRunning }}</div> - </div> - <div> - <div class="fc_version__line">{{ $t('play.ea_app_running') }}</div> - <div class="fc_version__line fc_version__line__boolean">{{ $store.state.origin_is_running }}</div> - </div> - </div> - </div> - <InstallProgressBar /> - </div> -</template> - -<style scoped> -.fc_launch__container { - margin: 50px 50px 30px 50px; - position: fixed; - bottom: 0; -} - -/* Titles */ -.fc_title { - color: white; - font-size: 50px; - font-weight: bold; -} - -/* Northstar version + changelog link */ -.fc_northstar__version__container { - margin-bottom: 20px; - color: rgb(168, 168, 168); -} - -.fc-stats__container { - margin-top: 3px; -} - -.fc_northstar__version, -.fc_changelog__link { - display: inline-block; -} - -.fc_changelog__link { - margin-left: 3px; - text-decoration: underline; - cursor: pointer; -} - - -.fc_launch__button:focus { - background-color: var(--el-color-primary); - border-color: var(--el-color-primary); -} - -#fc_services__status { - color: #e8edef; - align-self: end; -} - -.fc_version__line { - display: inline-block; -} - -.fc_version__line__boolean { - margin-left: 5px; - margin-bottom: 5px; - color: #b4b6b9; -} -</style> diff --git a/src-vue/src/views/RepairView.vue b/src-vue/src/views/RepairView.vue deleted file mode 100644 index 341dff2d..00000000 --- a/src-vue/src/views/RepairView.vue +++ /dev/null @@ -1,153 +0,0 @@ -<template> - <div class="fc-container"> - <el-scrollbar> - <el-alert :title="$t('generic.informationShort')" type="info" :closable="false" show-icon> - {{ $t('settings.repair.window.warning') }} - </el-alert> - - <h1>{{ $t('settings.repair.title') }}</h1> - - <h2>Northstar</h2> - - <el-button type="primary" @click="disableAllModsButCore"> - {{ $t('settings.repair.window.disable_all_but_core') }} - </el-button> - - <el-button type="primary" @click="forceInstallNorthstar"> - {{ $t('settings.repair.window.force_reinstall_ns') }} - </el-button> - - <el-button type="primary" @click="killNorthstar"> - {{ $t('settings.repair.window.kill_northstar_process') }} - </el-button> - - <el-button type="primary" @click="disableModsettingsMod"> - {{ $t('settings.repair.window.disable_modsettings') }} - </el-button> - - <h2>FlightCore</h2> - - <el-button type="primary" @click="cleanUpDownloadFolder"> - {{ $t('settings.repair.window.force_delete_temp_dl') }} - </el-button> - - <el-button type="primary" @click="clearFlightCorePersistentStore"> - {{ $t('settings.repair.window.delete_persistent_store') }} - </el-button> - </el-scrollbar> - </div> -</template> - -<script lang="ts"> -import { defineComponent } from "vue"; -import { GameInstall } from "../utils/GameInstall"; -import { InstallProgress } from "../../../src-tauri/bindings/InstallProgress"; -import { invoke } from "@tauri-apps/api"; -import { ReleaseCanal } from "../utils/ReleaseCanal"; -import { Store } from 'tauri-plugin-store-api'; -import { showErrorNotification, showNotification } from "../utils/ui"; -import { appWindow } from "@tauri-apps/api/window"; -const persistentStore = new Store('flight-core-settings.json'); - -export default defineComponent({ - name: "RepairView", - computed: { - lang(): string { - return this.$root!.$i18n.locale; - } - }, - methods: { - async disableAllModsButCore() { - await invoke("disable_all_but_core", { gameInstall: this.$store.state.game_install }) - .then((message) => { - showNotification(this.$t('generic.success'), this.$t('settings.repair.window.disable_all_but_core_success')); - }) - .catch((error) => { - showErrorNotification(error); - }); - }, - async forceInstallNorthstar() { - // Send notification telling the user to wait for the process to finish - const notification = showNotification( - this.$t('settings.repair.window.reinstall_title'), - this.$t('settings.repair.window.reinstall_text'), - 'info', - 0 - ); - - let install_northstar_result = invoke("install_northstar_wrapper", { gameInstall: this.$store.state.game_install, northstarPackageName: ReleaseCanal.RELEASE }); - - appWindow.listen<InstallProgress>( - 'northstar-install-download-progress', - ({ event, payload }) => { - let typed_payload = payload; - console.log("current_downloaded:", typed_payload.current_downloaded); - console.log("total_size: ", typed_payload.total_size); - console.log("state: ", typed_payload.state); - } - ); - await install_northstar_result - .then((message) => { - // Send notification - showNotification(this.$t('generic.done'), this.$t('settings.repair.window.reinstall_success')); - this.$store.commit('checkNorthstarUpdates'); - }) - .catch((error) => { - showErrorNotification(error); - console.error(error); - }) - .finally(() => { - // Clear old notification - notification.close(); - }); - }, - async cleanUpDownloadFolder() { - await invoke("clean_up_download_folder_wrapper", { gameInstall: this.$store.state.game_install, force: true }).then((message) => { - // Show user notification if task completed. - showNotification(this.$t('generic.done'), this.$t('generic.done')); - }) - .catch((error) => { - showErrorNotification(error); - }); - }, - async clearFlightCorePersistentStore() { - // Clear store... - await persistentStore.clear(); - // ...and save - await persistentStore.save(); - }, - async disableModsettingsMod() { - await invoke("set_mod_enabled_status", { gameInstall: this.$store.state.game_install, modName: "Mod Settings", isEnabled: false }) - .then((message) => { - showNotification(this.$t('generic.success'), this.$t('settings.repair.window.disable_modsettings_success')); - }) - .catch((error) => { - showErrorNotification(error); - }); - }, - async killNorthstar() { - await invoke("kill_northstar") - .then((message) => { - // Just a visual indicator that it worked - showNotification('Success'); - }) - .catch((error) => { - showErrorNotification(error); - }); - }, - }, - watch: { - // Lang value is propagated to repair view after it's mounted, so we need to watch - // its value, and update window title accordingly. - lang(newv: string) { - appWindow.setTitle(this.$t('settings.repair.window.title')); - } - } -}); -</script> - -<style scoped> -.fc-container { - padding-top: 0px; -} -</style> diff --git a/src-vue/src/views/SettingsView.vue b/src-vue/src/views/SettingsView.vue deleted file mode 100644 index 5ead665b..00000000 --- a/src-vue/src/views/SettingsView.vue +++ /dev/null @@ -1,393 +0,0 @@ -<template> - <el-dialog - v-model="showProfileDialog" - :title="$t('settings.profile.dialog.title')" - width="75%" - > - <el-table :data="availableProfiles" > - <el-table-column prop="name" label="Name" /> - <el-table-column align="right"> - <template #default="scope"> - <el-popconfirm - v-if="scope.row.name != 'R2Northstar'" - :title="$t('settings.profile.dialog.delete_confirm')" - :confirm-button-text="$t('generic.yes')" - :cancel-button-text="$t('generic.no')" - @confirm="deleteProfile(scope.row.name)" - > - <template #reference> - <el-button type="danger"> - {{ $t('settings.profile.dialog.delete') }} - </el-button> - </template> - </el-popconfirm> - <el-button @click="cloneProfileDialog(scope.row.name)"> - {{ $t('settings.profile.dialog.clone') }} - </el-button> - </template> - </el-table-column> - </el-table> - </el-dialog> - - <div class="fc-container"> - <el-scrollbar> - <div class="fc_settings__container"> - <!-- Game folder location --> - <div class="fc_parameter__panel"> - <h3>{{ $t('settings.manage_install') }}</h3> - <el-input - v-model="$store.state.game_install.game_path" - :placeholder="$t('settings.choose_folder')" - @click="updateGamePath" - > - <template #prepend> - <el-button icon="Folder" @click="updateGamePath"/> - </template> - <template #append> - <el-button @click="openGameInstallFolder"> - {{ $t('settings.open_game_folder') }} - </el-button> - </template> - </el-input> - </div> - - <!-- Northstar Active Profile --> - <div class="fc_parameter__panel" v-if="$store.state.developer_mode"> - <h3>{{ $t('settings.profile.active') }}</h3> - <el-dropdown trigger="click" :disabled="!availableProfiles.length"> - <el-button> - {{ activeProfile }} <el-icon class="el-icon--right" v-if="availableProfiles.length"><arrow-down /></el-icon> - </el-button> - <template #dropdown> - <el-dropdown-menu> - <el-dropdown-item v-for="profile in $store.state.available_profiles" @click="switchProfile(profile)">{{ profile }}</el-dropdown-item> - <el-dropdown-item divided @click="showProfileDialog = true">{{ $t('settings.profile.edit') }}</el-dropdown-item> - </el-dropdown-menu> - </template> - </el-dropdown> - </div> - - <!-- Thunderstore mods per page configuration --> - <div class="fc_parameter__panel"> - <h3>{{ $t('settings.nb_ts_mods_per_page') }}</h3> - <h6> - {{ $t('settings.nb_ts_mods_per_page_desc1') }}<br> - {{ $t('settings.nb_ts_mods_per_page_desc2') }} - </h6> - <el-input - v-model="modsPerPage" - type="number" - > - <template #append> - <el-button @click="modsPerPage = 20"> - {{ $t('settings.nb_ts_mods_reset') }} - </el-button> - </template> - </el-input> - </div> - - <div class="fc_parameter__panel"> - <h3>{{ $t('settings.show_deprecated_mods') }}</h3> - <h6> - {{ $t('settings.show_deprecated_mods_desc1') }}<br/> - {{ $t('settings.show_deprecated_mods_desc2') }} - </h6> - <span> - {{ $t('settings.show_deprecated_mods') }} - <el-switch v-model="showDeprecatedMods"></el-switch> - </span> - </div> - - <!-- Interface localization --> - <div class="fc_parameter__panel"> - <h3>{{ $t('settings.language') }}</h3> - <language-selector/> - </div> - - <!-- Repair window --> - <div class="fc_parameter__panel"> - <h3>{{ $t('settings.repair.title') }}</h3> - <el-button type="primary" @click="openRepairWindow"> - {{ $t('settings.repair.open_window') }} - </el-button> - </div> - - <div class="fc_parameter__panel"> - <h3>{{ $t('settings.show_nsfw_mods') }}</h3> - <span> - {{ $t('settings.show_nsfw_mods') }} - <el-switch v-model="showNsfwMods"></el-switch> - </span> - </div> - - <!-- About section --> - <div class="fc_parameter__panel"> - <h3>{{ $t('settings.about') }}</h3> - <div class="fc_northstar__version" @click="activateDeveloperMode"> - {{ $t('settings.flightcore_version') }} {{ flightcoreVersion === '' ? 'Unknown version' : `${flightcoreVersion}` }} - </div> - </div> - - <!-- Testing section --> - <div class="fc_parameter__panel"> - <h3>{{ $t('settings.testing') }}</h3> - <span> - {{ $t('settings.enable_test_channels') }} - <el-switch v-model="enableReleasesSwitch"></el-switch> - </span> - </div> - </div> - </el-scrollbar> - </div> -</template> - -<script lang="ts"> -import { defineComponent } from "vue"; -import { invoke } from "@tauri-apps/api"; -import { ReleaseCanal } from "../utils/ReleaseCanal"; -import { Store } from 'tauri-plugin-store-api'; -import { showErrorNotification, showNotification } from "../utils/ui"; -import LanguageSelector from "../components/LanguageSelector.vue"; -const persistentStore = new Store('flight-core-settings.json'); -import { open } from '@tauri-apps/api/shell'; -import { i18n } from '../main'; -import { ElMessageBox } from 'element-plus' - -export default defineComponent({ - name: "SettingsView", - components: { - LanguageSelector - }, - data() { - return { - developerModeClicks: 0, - showProfileDialog: false, - } - }, - computed: { - showNsfwMods: { - get(): boolean { - return this.$store.state.search.showNsfwMods; - }, - set(value: boolean) { - this.$store.state.search.showNsfwMods = value; - } - }, - showDeprecatedMods: { - get(): boolean { - return this.$store.state.search.showDeprecatedMods; - }, - set(value: boolean) { - this.$store.state.search.showDeprecatedMods = value; - } - }, - flightcoreVersion(): string { - return this.$store.state.flightcore_version; - }, - enableReleasesSwitch: { - get(): boolean { - return this.$store.state.enableReleasesSwitch; - }, - async set(value: boolean): Promise<void> { - this.$store.state.enableReleasesSwitch = value; - persistentStore.set('northstar-releases-switching', { value }); - await persistentStore.save(); // explicit save to disk - - // When disabling switch, we switch release canal to stable release, to avoid users being - // stuck with release candidate after disabling release switching. - if (!value && this.$store.state.northstar_release_canal !== ReleaseCanal.RELEASE) { - this.$store.commit('toggleReleaseCandidate'); - } - } - }, - modsPerPage: { - get(): number { - return this.$store.state.mods_per_page; - }, - async set(value: number) { - this.$store.state.mods_per_page = value; - persistentStore.set('thunderstore-mods-per-page', { value }); - await persistentStore.save(); // explicit save to disk - } - }, - activeProfile(): String { - return this.$store.state.game_install.profile || "None"; - }, - availableProfiles(): Object[] { - let profiles = this.$store.state.available_profiles - - // convert string array to object array so we can fill a table - let data = profiles.reduce( - (a: Object[], v: string) => [...a, {"name": v}], - [] - ); - - return data; - } - }, - methods: { - activateDeveloperMode() { - this.developerModeClicks += 1; - if (this.developerModeClicks >= 6 && !this.$store.state.developer_mode) { - this.$store.commit('toggleDeveloperMode'); - showNotification( - this.$t('settings.dev_mode_enabled_title'), - this.$t('settings.dev_mode_enabled_text'), - 'info' - ); - this.developerModeClicks = 0; - } - }, - async updateGamePath() { - this.$store.commit('updateGamePath'); - }, - async openRepairWindow() { - await invoke("open_repair_window") - .then((message) => { }) - .catch((error) => { - showErrorNotification(error); - }); - }, - async openGameInstallFolder() { - // Verify the game path is actually set - if (!this.$store.state.game_install.game_path) { - showErrorNotification( - i18n.global.tc('notification.game_folder.not_found.text'), - i18n.global.tc('notification.game_folder.not_found.title') - ); - return; - } - - // Opens the folder in default file explorer application - await open(`${this.$store.state.game_install.game_path}`); - }, - async switchProfile(value: string) { - let store = this.$store; - let state = store.state; - - await invoke("validate_profile", { gameInstall: state.game_install, profile: value }) - .then(async (message) => { - if (!message) - { - // Profile is no longer valid, inform the user... - showErrorNotification( - i18n.global.tc('notification.profile.invalid.text'), - i18n.global.tc('notification.profile.invalid.title') - ); - - // ...and refresh - store.commit('fetchProfiles'); - return; - } - - state.game_install.profile = value; - - // Check for Northstar updates - store.commit('checkNorthstarUpdates'); - - // Save change in persistent store - await persistentStore.set('game-install', { value: state.game_install }); - await persistentStore.save(); // explicit save to disk - }) - .catch((error) => { - console.error(error); - showErrorNotification(error); - }); - }, - async cloneProfileDialog(profile: string) { - ElMessageBox.prompt( - i18n.global.tc("settings.profile.dialog.new_profile_name"), - i18n.global.tc("settings.profile.dialog.title"), - { - confirmButtonText: i18n.global.tc("generic.confirm"), - cancelButtonText: i18n.global.tc("generic.cancel"), - } - ).then(async ({ value }) => { - await this.cloneProfile(profile, value); - }).catch(() => { - // Nothing to do here - }) - }, - async cloneProfile(old_profile: string, new_profile: string) { - let store = this.$store; - await invoke("clone_profile", { - gameInstall: store.state.game_install, - oldProfile: old_profile, - newProfile: new_profile - }).then(async (message) => { - store.commit('fetchProfiles'); - showNotification('Success'); - }).catch((error) => { - console.error(error); - showErrorNotification(error); - }); - }, - async deleteProfile(profile: string) { - let store = this.$store; - await invoke("delete_profile", { - gameInstall: store.state.game_install, - profile: profile, - }).then(async (message) => { - if (profile == store.state.game_install.profile) - { - // trying to delete the active profile, lets switch to the default profile - await this.switchProfile("R2Northstar"); - } - store.commit('fetchProfiles'); - showNotification('Success'); - }).catch((error) => { - console.error(error); - showErrorNotification(error); - }); - }, - }, - mounted() { - document.querySelector('input')!.disabled = true; - this.$store.commit('fetchProfiles'); - }, - unmounted() { - if (('' + this.modsPerPage) === '') { - console.warn('Incorrect value for modsPerPage, resetting it to 20.'); - this.modsPerPage = 20; - } - } -}); -</script> - -<style scoped> -.fc_settings__container { - max-width: 1200px; - margin: 0 auto; -} - -h3:first-of-type { - margin-top: 0; - margin-bottom: 1em; - text-transform: uppercase; - font-weight: unset; -} - -.el-input, -.el-select { - width: 50%; -} - -.el-switch { - margin-left: 50px; -} - - -/* Parameter panel styles */ -.fc_parameter__panel { - margin-bottom: 30px; -} - -.fc_parameter__panel h3 { - margin-bottom: 5px; -} - -.fc_parameter__panel h6 { - margin-top: 0; - margin-bottom: 12px; -} -</style> diff --git a/src-vue/src/views/mods/LocalModsView.vue b/src-vue/src/views/mods/LocalModsView.vue deleted file mode 100644 index 3979ca14..00000000 --- a/src-vue/src/views/mods/LocalModsView.vue +++ /dev/null @@ -1,72 +0,0 @@ -<template> - <!-- Message displayed if no mod matched searched words --> - <div v-if="mods.length === 0" class="noModMessage"> - {{ $t('mods.local.no_mods') }} - </div> - - <el-scrollbar v-else> - <el-button class="disableModsBtn" type="primary" @click="disableAllModsButCore"> - {{ $t('settings.repair.window.disable_all_but_core') }} - </el-button> - <local-mod-card v-for="mod of mods" v-bind:key="mod.name" :mod="mod" /> - </el-scrollbar> -</template> - -<script lang="ts"> -import { defineComponent } from 'vue'; -import { invoke } from "@tauri-apps/api"; -import { NorthstarMod } from "../../../../src-tauri/bindings/NorthstarMod"; -import { fuzzy_filter } from "../../utils/filter"; -import { showErrorNotification, showNotification } from "../../utils/ui"; -import LocalModCard from "../../components/LocalModCard.vue"; - -export default defineComponent({ - name: 'LocalModsView', - components: { LocalModCard }, - computed: { - installedMods(): NorthstarMod[] { - return this.$store.state.installed_mods; - }, - searchValue(): string { - return this.$store.getters.searchWords; - }, - mods(): NorthstarMod[] { - if (this.searchValue.length === 0) { - return this.installedMods; - } - - return this.installedMods.filter((mod: NorthstarMod) => { - return fuzzy_filter(mod.name, this.searchValue); - }); - } - }, - data() { - return { - global_load_indicator: false, - }; - }, - methods: { - async disableAllModsButCore() { - await invoke("disable_all_but_core", { gameInstall: this.$store.state.game_install }) - .then((message) => { - showNotification(this.$t('generic.success'), this.$t('settings.repair.window.disable_all_but_core_success')); - this.$store.commit('loadInstalledMods'); - }) - .catch((error) => { - showErrorNotification(error); - }); - }, - }, - mounted() { - this.$store.commit('loadInstalledMods'); - } -}) -</script> - -<style scoped> -.disableModsBtn { - margin-bottom: 10px; - top: 10px; - position: sticky; -} -</style> diff --git a/src-vue/src/views/mods/ThunderstoreModsView.vue b/src-vue/src/views/mods/ThunderstoreModsView.vue deleted file mode 100644 index 1ec684a6..00000000 --- a/src-vue/src/views/mods/ThunderstoreModsView.vue +++ /dev/null @@ -1,309 +0,0 @@ -<template>
- <div class="fc-container" style="padding: 0">
- <div v-if="mods.length === 0" class="fc__changelog__container">
- <el-progress :show-text="false" :percentage="50" :indeterminate="true" />
- </div>
-
- <!-- Message displayed if no mod matched searched words -->
- <div v-else-if="filteredMods.length === 0" class="noModMessage">
- {{ $t('mods.online.no_match') }}<br/>
- {{ $t('mods.online.try_another_search') }}
- </div>
-
- <el-scrollbar v-else class="container" ref="scrollbar">
- <div class="card-container">
- <div class="pagination_container" v-if="shouldDisplayPagination">
- <el-pagination
- :currentPage="currentPageIndex + 1"
- layout="prev, pager, next"
- :page-size="modsPerPage"
- :total="modsList.length"
- @update:current-page="onPaginationChange"
- />
- </div>
-
- <!-- Mod cards -->
- <thunderstore-mod-card v-for="mod of currentPageMods" v-bind:key="mod.name" :mod="mod" />
- </div>
-
- <!-- Bottom pagination -->
- <div class="card-container">
- <div class="pagination_container">
- <el-pagination
- class="fc_bottom__pagination"
- v-if="shouldDisplayPagination"
- :currentPage="currentPageIndex + 1"
- layout="prev, pager, next"
- :page-size="modsPerPage"
- :total="modsList.length"
- @update:current-page="onPaginationChange"
- @current-change="scrollTop"
- />
- </div>
- </div>
- </el-scrollbar>
- </div>
-</template>
-
-<script lang="ts">
-import { defineComponent, ref } from 'vue';
-import { ThunderstoreMod } from "../../../../src-tauri/bindings/ThunderstoreMod";
-import ThunderstoreModCard from "../../components/ThunderstoreModCard.vue";
-import { ElScrollbar, ScrollbarInstance } from "element-plus";
-import { SortOptions } from "../../utils/SortOptions.d";
-import { ThunderstoreModVersion } from "../../../../src-tauri/bindings/ThunderstoreModVersion";
-import { fuzzy_filter } from "../../utils/filter";
-import { isThunderstoreModOutdated } from "../../utils/thunderstore/version";
-
-
-export default defineComponent({
- name: "ThunderstoreModsView",
- components: { ThunderstoreModCard },
- async mounted() {
- this.$store.commit('fetchThunderstoreMods');
- },
- computed: {
- showDeprecatedMods(): boolean {
- return this.$store.state.search.showDeprecatedMods;
- },
- showNsfwMods(): boolean {
- return this.$store.state.search.showNsfwMods;
- },
- searchValue(): string {
- return this.$store.getters.searchWords;
- },
- selectedCategories(): Object[] {
- return this.$store.state.search.selectedCategories;
- },
- modSorting(): SortOptions {
- return Object.values(SortOptions)[Object.keys(SortOptions).indexOf(this.$store.state.search.sortValue)];
- },
- mods(): ThunderstoreMod[] {
- return this.$store.state.thunderstoreMods;
- },
- filteredMods(): ThunderstoreMod[] {
- if (this.searchValue.length === 0 && this.selectedCategories.length === 0) {
- return this.mods;
- }
-
- return this.mods.filter((mod: ThunderstoreMod) => {
- // Filter with search words (only if search field isn't empty)
- const inputMatches: boolean = this.searchValue.length === 0
- || (
- fuzzy_filter(mod.name, this.searchValue) ||
- fuzzy_filter(mod.owner, this.searchValue) ||
- mod.versions[0].description.toLowerCase().includes(this.searchValue)
- );
-
- // Filter out deprecated mods
- const showDeprecated = !mod.is_deprecated || this.showDeprecatedMods;
-
- // Filter out NSFW mods
- const showNsfw = !mod.has_nsfw_content || this.showNsfwMods;
-
- // Filter with categories (only if some categories are selected)
- const categoriesMatch: boolean = this.selectedCategories.length === 0
- || mod.categories
- .filter((category: string) => this.selectedCategories.includes(category))
- .length === this.selectedCategories.length;
-
- return inputMatches && categoriesMatch && showDeprecated && showNsfw;
- });
- },
- modsList(): ThunderstoreMod[] {
- // Use filtered mods if user is searching, vanilla list otherwise.
- const mods: ThunderstoreMod[] = this.searchValue.length !== 0 || this.selectedCategories.length !== 0
- ? this.filteredMods
- : this.mods
- .filter(mod => this.showDeprecatedMods || !mod.is_deprecated)
- .filter(mod => this.showNsfwMods || !mod.has_nsfw_content);
-
- // Sort mods regarding user selected algorithm.
- let compare: (a: ThunderstoreMod, b: ThunderstoreMod) => number;
- switch (this.modSorting) {
- case SortOptions.NAME_ASC:
- compare = (a: ThunderstoreMod, b: ThunderstoreMod) => a.name.localeCompare(b.name);
- break;
- case SortOptions.NAME_DESC:
- compare = (a: ThunderstoreMod, b: ThunderstoreMod) => -1 * a.name.localeCompare(b.name);
- break;
- case SortOptions.DATE_ASC:
- compare = (a: ThunderstoreMod, b: ThunderstoreMod) => a.date_updated.localeCompare(b.date_updated);
- break;
- case SortOptions.DATE_DESC:
- compare = (a: ThunderstoreMod, b: ThunderstoreMod) => -1 * a.date_updated.localeCompare(b.date_updated);
- break;
- case SortOptions.MOST_DOWNLOADED:
- compare = (a: ThunderstoreMod, b: ThunderstoreMod) => {
- const aTotal = a.versions.reduce((prev, next) => {
- return { downloads: prev.downloads + next.downloads } as ThunderstoreModVersion;
- }).downloads;
- const bTotal = b.versions.reduce((prev, next) => {
- return { downloads: prev.downloads + next.downloads } as ThunderstoreModVersion;
- }).downloads;
- return -1 * (aTotal - bTotal);
- };
- break;
- case SortOptions.TOP_RATED:
- compare = (a: ThunderstoreMod, b: ThunderstoreMod) => -1 * (a.rating_score - b.rating_score);
- break;
- default:
- throw new Error('Unknown mod sorting.');
- }
-
- // Always display outdated mods first
- // (regardless of actual sort order)
- const sortedMods = mods.sort(compare);
- return sortedMods.sort((a, b) => {
- if (isThunderstoreModOutdated(a)) {
- return -1;
- } else if (isThunderstoreModOutdated(b)) {
- return 1;
- } else {
- return compare(a, b);
- }
- })
- },
- modsPerPage(): number {
- return parseInt(this.$store.state.mods_per_page);
- },
- currentPageMods(): ThunderstoreMod[] {
- // User might want to display all mods on one page.
- const perPageValue = this.modsPerPage != 0 ? this.modsPerPage : this.modsList.length;
-
- const startIndex = this.currentPageIndex * perPageValue;
- const endIndexCandidate = startIndex + perPageValue;
- const endIndex = endIndexCandidate > this.modsList.length ? this.modsList.length : endIndexCandidate;
- return this.modsList.slice(startIndex, endIndex);
- },
- shouldDisplayPagination(): boolean {
- return this.modsPerPage != 0 && this.modsList.length > this.modsPerPage;
- }
- },
- data() {
- return {
- modsBeingInstalled: [] as string[],
- currentPageIndex: 0
- };
- },
- methods: {
- /**
- * This updates current pagination and scrolls view to the top.
- */
- onPaginationChange(index: number) {
- this.currentPageIndex = index - 1;
- },
- scrollTop(index: number) {
- setTimeout(() => {
- (this.$refs.scrollbar as ScrollbarInstance).scrollTo({ top: 0, behavior: 'smooth' });
- }, 100)
- }
- },
- watch: {
- searchValue(_: string, __: string) {
- if (this.currentPageIndex !== 0) {
- this.currentPageIndex = 0;
- }
- },
- selectedCategories(_: string[], __: string[]) {
- if (this.currentPageIndex !== 0) {
- this.currentPageIndex = 0;
- }
- }
- }
-});
-</script>
-
-<style scoped>
-.fc__changelog__container {
- padding: 20px 30px;
-}
-
-.fc-container:deep(.el-scrollbar__view) {
- padding-left: 0;
- padding-right: 0;
-}
-
-.el-timeline-item__timestamp {
- color: white !important;
- user-select: none !important;
-}
-
-.search {
- display: inline-block;
- margin: 0 0 0 10px !important;
-}
-
-.card-container {
- margin: 0 auto;
-}
-
-.pagination_container {
- margin: 5px auto;
- padding: 0 5px;
- max-width: 1000px;
- justify-content: center;
- display: flex;
-}
-
-.el-pagination {
- margin: 0;
-}
-
-.fc_bottom__pagination {
- padding-bottom: 20px !important;
- padding-right: 10px;
-}
-
-/* Card container dynamic size */
-
-.card-container {
- --thunderstore-mod-card-width: 178px;
- --thunderstore-mod-card-margin: 5px;
- --thunderstore-mod-card-columns-count: 1;
-
- width: calc(var(--thunderstore-mod-card-width) * var(--thunderstore-mod-card-columns-count) + var(--thunderstore-mod-card-margin) * 2 * var(--thunderstore-mod-card-columns-count));
-}
-
-@media (min-width: 628px) {
- .card-container {
- --thunderstore-mod-card-columns-count: 2;
- }
-}
-
-@media (min-width: 836px) {
- .card-container {
- --thunderstore-mod-card-columns-count: 3;
- }
-}
-
-@media (min-width: 1006px) {
- .card-container {
- --thunderstore-mod-card-columns-count: 4;
- }
-}
-
-@media (min-width: 1196px) {
- .card-container {
- --thunderstore-mod-card-columns-count: 5;
- }
-}
-
-@media (min-width: 1386px) {
- .card-container {
- --thunderstore-mod-card-columns-count: 6;
- }
-}
-
-@media (min-width: 1576px) {
- .card-container {
- --thunderstore-mod-card-columns-count: 7;
- }
-}
-
-@media (min-width: 1766px) {
- .card-container {
- --thunderstore-mod-card-columns-count: 8;
- }
-}
-</style>
diff --git a/src-vue/src/vite-env.d.ts b/src-vue/src/vite-env.d.ts deleted file mode 100644 index 323c78a6..00000000 --- a/src-vue/src/vite-env.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -/// <reference types="vite/client" /> - -declare module '*.vue' { - import type { DefineComponent } from 'vue' - const component: DefineComponent<{}, {}, any> - export default component -} diff --git a/src-vue/src/vuex-shim.d.ts b/src-vue/src/vuex-shim.d.ts deleted file mode 100644 index 40438a97..00000000 --- a/src-vue/src/vuex-shim.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { ComponentCustomProperties } from 'vue'
-import { Store } from 'vuex'
-
-declare module '@vue/runtime-core' {
- interface ComponentCustomProperties {
- $store: Store<FlightCoreStore>
- }
-}
diff --git a/src-vue/tsconfig.json b/src-vue/tsconfig.json deleted file mode 100644 index 7f0f0012..00000000 --- a/src-vue/tsconfig.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "useDefineForClassFields": true, - "module": "ESNext", - "moduleResolution": "Node", - "strict": true, - "jsx": "preserve", - "sourceMap": true, - "resolveJsonModule": true, - "isolatedModules": true, - "esModuleInterop": true, - "lib": ["ESNext", "DOM", "ES2018"], - "skipLibCheck": true - }, - "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], - "references": [{ "path": "./tsconfig.node.json" }] -} diff --git a/src-vue/vite.config.ts b/src-vue/vite.config.ts deleted file mode 100644 index 7da61d04..00000000 --- a/src-vue/vite.config.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { defineConfig } from 'vite' -import vue from '@vitejs/plugin-vue' - -// https://vitejs.dev/config/ -export default defineConfig({ - // prevent vite from obscuring rust errors - clearScreen: false, - // Tauri expects a fixed port, fail if that port is not available - server: { - strictPort: true, - }, - // to make use of `TAURI_PLATFORM`, `TAURI_ARCH`, `TAURI_FAMILY`, - // `TAURI_PLATFORM_VERSION`, `TAURI_PLATFORM_TYPE` and `TAURI_DEBUG` - // env variables - envPrefix: ['VITE_', 'TAURI_'], - build: { - // Tauri supports es2021 - target: ['es2021', 'chrome100', 'safari13'], - // don't minify for debug builds - minify: !process.env.TAURI_DEBUG ? 'esbuild' : false, - // produce sourcemaps for debug builds - sourcemap: !!process.env.TAURI_DEBUG, - }, - plugins: [vue()] -}) diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 00000000..0426defe --- /dev/null +++ b/src/App.vue @@ -0,0 +1,151 @@ +<script setup lang="ts"> +import { ref } from "vue"; +import { invoke } from "@tauri-apps/api/core"; + +const greetMsg = ref(""); +const name = ref(""); + +async function greet() { + // Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ + greetMsg.value = await invoke("greet", { name: name.value }); +} +</script> + +<template> + <main class="container"> + <h1>Welcome to Tauri + Vue</h1> + + <div class="row"> + </div> + <p>Click on the Tauri, Vite, and Vue logos to learn more.</p> + + <form class="row" @submit.prevent="greet"> + <input id="greet-input" v-model="name" placeholder="Enter a name..." /> + <button type="submit">Greet</button> + </form> + <p>{{ greetMsg }}</p> + </main> +</template> + +<style scoped> +.logo.vite:hover { + filter: drop-shadow(0 0 2em #747bff); +} + +.logo.vue:hover { + filter: drop-shadow(0 0 2em #249b73); +} + +</style> +<style> +:root { + font-family: Inter, Avenir, Helvetica, Arial, sans-serif; + font-size: 16px; + line-height: 24px; + font-weight: 400; + + color: #0f0f0f; + background-color: #f6f6f6; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +.container { + margin: 0; + padding-top: 10vh; + display: flex; + flex-direction: column; + justify-content: center; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: 0.75s; +} + +.logo.tauri:hover { + filter: drop-shadow(0 0 2em #24c8db); +} + +.row { + display: flex; + justify-content: center; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} + +a:hover { + color: #535bf2; +} + +h1 { + text-align: center; +} + +input, +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + color: #0f0f0f; + background-color: #ffffff; + transition: border-color 0.25s; + box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2); +} + +button { + cursor: pointer; +} + +button:hover { + border-color: #396cd8; +} +button:active { + border-color: #396cd8; + background-color: #e8e8e8; +} + +input, +button { + outline: none; +} + +#greet-input { + margin-right: 5px; +} + +@media (prefers-color-scheme: dark) { + :root { + color: #f6f6f6; + background-color: #2f2f2f; + } + + a:hover { + color: #24c8db; + } + + input, + button { + color: #ffffff; + background-color: #0f0f0f98; + } + button:active { + background-color: #0f0f0f69; + } +} + +</style> diff --git a/src/assets/vue.svg b/src/assets/vue.svg new file mode 100644 index 00000000..770e9d33 --- /dev/null +++ b/src/assets/vue.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>
\ No newline at end of file diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 00000000..b670de8b --- /dev/null +++ b/src/main.ts @@ -0,0 +1,4 @@ +import { createApp } from "vue"; +import App from "./App.vue"; + +createApp(App).mount("#app"); diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 00000000..fc812394 --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1,7 @@ +/// <reference types="vite/client" /> + +declare module "*.vue" { + import type { DefineComponent } from "vue"; + const component: DefineComponent<{}, {}, any>; + export default component; +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..f82888f3 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "preserve", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/src-vue/tsconfig.node.json b/tsconfig.node.json index 9d31e2ae..42872c59 100644 --- a/src-vue/tsconfig.node.json +++ b/tsconfig.node.json @@ -1,8 +1,9 @@ { "compilerOptions": { "composite": true, + "skipLibCheck": true, "module": "ESNext", - "moduleResolution": "Node", + "moduleResolution": "bundler", "allowSyntheticDefaultImports": true }, "include": ["vite.config.ts"] diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 00000000..a55076c3 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,32 @@ +import { defineConfig } from "vite"; +import vue from "@vitejs/plugin-vue"; + +// @ts-expect-error process is a nodejs global +const host = process.env.TAURI_DEV_HOST; + +// https://vitejs.dev/config/ +export default defineConfig(async () => ({ + plugins: [vue()], + + // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` + // + // 1. prevent vite from obscuring rust errors + clearScreen: false, + // 2. tauri expects a fixed port, fail if that port is not available + server: { + port: 1420, + strictPort: true, + host: host || false, + hmr: host + ? { + protocol: "ws", + host, + port: 1421, + } + : undefined, + watch: { + // 3. tell vite to ignore watching `src-tauri` + ignored: ["**/src-tauri/**"], + }, + }, +})); |