Bump tauri to v2 (#3018)

* Bump tauri to v2

* Switch to virtual typed list for content page

* Fix unexpected hang on windows

* Fix ads window scaling issues on some devices

* Use DPR from browser

* Fix link opens, bump version, fix lint
This commit is contained in:
Geometrically
2024-12-14 19:23:47 -07:00
committed by GitHub
parent 7f445e9b8c
commit f2e653b732
16 changed files with 878 additions and 502 deletions

931
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -19,6 +19,3 @@ strip = true # Remove debug symbols
[profile.dev.package.sqlx-macros]
opt-level = 3
[patch.crates-io]
wry = { git = "https://github.com/modrinth/wry", rev = "27fb16b" }

View File

@@ -1,7 +1,7 @@
{
"name": "@modrinth/app-frontend",
"private": true,
"version": "0.8.9",
"version": "0.9.0",
"type": "module",
"scripts": {
"dev": "vite",
@@ -16,12 +16,12 @@
"@modrinth/ui": "workspace:*",
"@modrinth/utils": "workspace:*",
"@sentry/vue": "^8.27.0",
"@tauri-apps/api": "^2.0.0-rc.3",
"@tauri-apps/plugin-dialog": "^2.0.0-rc.0",
"@tauri-apps/plugin-os": "^2.0.0-rc.0",
"@tauri-apps/plugin-shell": "^2.0.0-rc.0",
"@tauri-apps/plugin-updater": "^2.0.0-rc.0",
"@tauri-apps/plugin-window-state": "^2.0.0-rc.0",
"@tauri-apps/api": "^2.1.1",
"@tauri-apps/plugin-dialog": "^2.2.0",
"@tauri-apps/plugin-os": "^2.2.0",
"@tauri-apps/plugin-opener": "^2.2.1",
"@tauri-apps/plugin-updater": "^2.3.0",
"@tauri-apps/plugin-window-state": "^2.2.0",
"@vintl/vintl": "^4.4.1",
"dayjs": "^1.11.10",
"floating-vue": "^5.2.2",
@@ -35,8 +35,8 @@
"vue-virtual-scroller": "v2.0.0-beta.8"
},
"devDependencies": {
"@formatjs/cli": "^6.2.12",
"@eslint/compat": "^1.1.1",
"@formatjs/cli": "^6.2.12",
"@nuxt/eslint-config": "^0.5.6",
"@vitejs/plugin-vue": "^5.0.4",
"autoprefixer": "^10.4.19",

View File

@@ -56,7 +56,7 @@ import dayjs from 'dayjs'
import PromotionWrapper from '@/components/ui/PromotionWrapper.vue'
import { hide_ads_window, show_ads_window } from '@/helpers/ads.js'
import FriendsList from '@/components/ui/friends/FriendsList.vue'
import { open as openURL } from '@tauri-apps/plugin-shell'
import { openUrl } from '@tauri-apps/plugin-opener'
const themeStore = useTheming()
@@ -191,6 +191,7 @@ async function setupApp() {
get_opening_command().then(handleCommand)
checkUpdates()
fetchCredentials()
}
const stateFailed = ref(false)
@@ -283,8 +284,6 @@ onMounted(() => {
install.setIncompatibilityWarningModal(incompatibilityWarningModal)
install.setInstallConfirmModal(installConfirmModal)
install.setModInstallModal(modInstallModal)
fetchCredentials()
})
const accounts = ref(null)
@@ -330,10 +329,9 @@ function handleClick(e) {
!target.classList.contains('router-link-active') &&
!target.href.startsWith('http://localhost') &&
!target.href.startsWith('https://tauri.localhost') &&
!target.href.startsWith('http://tauri.localhost') &&
target.target !== '_blank'
!target.href.startsWith('http://tauri.localhost')
) {
openURL(target.href)
openUrl(target.href)
}
e.preventDefault()
break
@@ -359,13 +357,13 @@ function handleAuxClick(e) {
<template>
<SplashScreen v-if="!stateFailed" ref="splashScreen" data-tauri-drag-region />
<Suspense>
<AppSettingsModal ref="settingsModal" />
</Suspense>
<Suspense>
<InstanceCreationModal ref="installationModal" />
</Suspense>
<div v-if="stateInitialized" class="app-grid-layout relative">
<Suspense>
<AppSettingsModal ref="settingsModal" />
</Suspense>
<Suspense>
<InstanceCreationModal ref="installationModal" />
</Suspense>
<div
class="app-grid-navbar bg-bg-raised flex flex-col p-[1rem] pt-0 gap-[0.5rem] z-10 w-[--left-bar-width]"
>

View File

@@ -4,20 +4,29 @@ import { ChevronRightIcon } from '@modrinth/assets'
import { init_ads_window, open_ads_link, record_ads_click } from '@/helpers/ads.js'
const adsWrapper = ref(null)
let devicePixelRatioWatcher = null
function initDevicePixelRatioWatcher() {
if (devicePixelRatioWatcher) {
devicePixelRatioWatcher.removeEventListener('change', updateAdPosition)
}
devicePixelRatioWatcher = window.matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`)
devicePixelRatioWatcher.addEventListener('change', updateAdPosition)
}
onMounted(() => {
updateAdPosition()
window.addEventListener('resize', updateAdPosition)
initDevicePixelRatioWatcher()
})
function updateAdPosition() {
if (adsWrapper.value) {
const rect = adsWrapper.value.getBoundingClientRect()
const x = rect.left + window.scrollX
const y = rect.top + window.scrollY
init_ads_window(x, y, 300, 250, true)
init_ads_window(true)
initDevicePixelRatioWatcher()
}
}

View File

@@ -1,11 +1,11 @@
import { invoke } from '@tauri-apps/api/core'
export async function init_ads_window(x, y, width, height, overrideShown = false) {
return await invoke('plugin:ads|init_ads_window', { x, y, width, height, overrideShown })
export async function init_ads_window(overrideShown = false) {
return await invoke('plugin:ads|init_ads_window', { overrideShown, dpr: window.devicePixelRatio })
}
export async function show_ads_window() {
return await invoke('plugin:ads|show_ads_window')
return await invoke('plugin:ads|show_ads_window', { dpr: window.devicePixelRatio })
}
export async function hide_ads_window(reset) {

View File

@@ -1,6 +1,6 @@
[package]
name = "theseus_gui"
version = "0.8.9"
version = "0.9.0"
description = "The Modrinth App is a desktop application for managing your Minecraft mods"
license = "GPL-3.0-only"
repository = "https://github.com/modrinth/code/apps/app/"
@@ -8,7 +8,7 @@ edition = "2021"
build = "build.rs"
[build-dependencies]
tauri-build = { version = "2.0.0-rc", features = ["codegen"] }
tauri-build = { version = "2.0.3", features = ["codegen"] }
[dependencies]
theseus = { path = "../../packages/app-lib", features = ["tauri"] }
@@ -16,14 +16,14 @@ theseus = { path = "../../packages/app-lib", features = ["tauri"] }
serde_json = "1.0"
serde = { version = "1.0", features = ["derive"] }
tauri = { version = "2.0.0-rc", features = ["devtools", "macos-private-api", "protocol-asset", "unstable"] }
tauri-plugin-window-state = "2.0.0-rc"
tauri-plugin-deep-link = "2.0.0-rc"
tauri-plugin-os = "2.0.0-rc"
tauri-plugin-shell = "2.0.0-rc"
tauri-plugin-dialog = "2.0.0-rc"
tauri-plugin-updater = { version = "2.0.0-rc" }
tauri-plugin-single-instance = { version = "2.0.0-rc" }
tauri = { version = "2.1.1", features = ["devtools", "macos-private-api", "protocol-asset", "unstable"] }
tauri-plugin-window-state = "2.2.0"
tauri-plugin-deep-link = "2.2.0"
tauri-plugin-os = "2.2.0"
tauri-plugin-opener = "2.2.1"
tauri-plugin-dialog = "2.2.0"
tauri-plugin-updater = { version = "2.3.0" }
tauri-plugin-single-instance = { version = "2.2.0" }
tokio = { version = "1", features = ["full"] }
thiserror = "1.0"
@@ -59,7 +59,7 @@ objc = "0.2.7"
rand = "0.8.5"
[target.'cfg(target_os = "linux")'.dependencies]
tauri-plugin-updater = { version = "2.0.0-rc", optional = true, features = ["native-tls-vendored", "zip"], default-features = false }
tauri-plugin-updater = { version = "2.3.0", optional = true, features = ["native-tls-vendored", "zip"], default-features = false }
[features]
# by default Tauri runs in production mode

View File

@@ -6,7 +6,7 @@
"permissions": [
"dialog:allow-open",
"dialog:allow-confirm",
"shell:allow-open",
"opener:default",
"os:allow-platform",
"os:allow-version",
"os:allow-os-type",

View File

@@ -9,7 +9,7 @@
"fix": "cargo fmt && cargo clippy --fix"
},
"devDependencies": {
"@tauri-apps/cli": "2.0.0-rc.16"
"@tauri-apps/cli": "2.1.0"
},
"dependencies": {
"@modrinth/app-frontend": "workspace:*",

View File

@@ -1,15 +1,13 @@
use std::collections::HashSet;
use std::time::{Duration, Instant};
use tauri::plugin::TauriPlugin;
use tauri::{LogicalPosition, LogicalSize, Manager, Runtime};
use tauri_plugin_shell::ShellExt;
use tauri::{Manager, PhysicalPosition, PhysicalSize, Runtime};
use tauri_plugin_opener::OpenerExt;
use theseus::settings;
use tokio::sync::RwLock;
pub struct AdsState {
pub shown: bool,
pub size: Option<LogicalSize<f32>>,
pub position: Option<LogicalPosition<f32>>,
pub last_click: Option<Instant>,
pub malicious_origins: HashSet<String>,
}
@@ -21,8 +19,6 @@ pub fn init<R: Runtime>() -> TauriPlugin<R> {
.setup(|app, _api| {
app.manage(RwLock::new(AdsState {
shown: true,
size: None,
position: None,
last_click: None,
malicious_origins: HashSet::new(),
}));
@@ -54,14 +50,30 @@ pub fn init<R: Runtime>() -> TauriPlugin<R> {
.build()
}
fn get_webview_position<R: Runtime>(
app: &tauri::AppHandle<R>,
dpr: f32,
) -> crate::api::Result<(PhysicalPosition<f32>, PhysicalSize<f32>)> {
let main_window = app.get_window("main").unwrap();
let width = 300.0 * dpr;
let height = 250.0 * dpr;
let main_window_size = main_window.inner_size()?;
let x = (main_window_size.width as f32) - width;
let y = (main_window_size.height as f32) - height;
Ok((
PhysicalPosition::new(x, y),
PhysicalSize::new(width, height),
))
}
#[tauri::command]
#[cfg(not(target_os = "linux"))]
pub async fn init_ads_window<R: Runtime>(
app: tauri::AppHandle<R>,
x: f32,
y: f32,
width: f32,
height: f32,
dpr: f32,
override_shown: bool,
) -> crate::api::Result<()> {
use tauri::WebviewUrl;
@@ -69,37 +81,40 @@ pub async fn init_ads_window<R: Runtime>(
let state = app.state::<RwLock<AdsState>>();
let mut state = state.write().await;
state.size = Some(LogicalSize::new(width, height));
state.position = Some(LogicalPosition::new(x, y));
if override_shown {
state.shown = true;
}
if let Some(webview) = app.webviews().get("ads-window") {
if state.shown {
let _ = webview.set_position(LogicalPosition::new(x, y));
let _ = webview.set_size(LogicalSize::new(width, height));
}
} else if let Some(window) = app.get_window("main") {
let _ = window.add_child(
tauri::webview::WebviewBuilder::new(
"ads-window",
WebviewUrl::External(
AD_LINK.parse().unwrap(),
),
)
.initialization_script(LINK_SCRIPT)
.user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36")
.zoom_hotkeys_enabled(false)
.transparent(true),
if let Ok((position, size)) = get_webview_position(&app, dpr) {
if let Some(webview) = app.webviews().get("ads-window") {
if state.shown {
LogicalPosition::new(x, y)
let _ = webview.set_position(position);
let _ = webview.set_size(size);
} else {
LogicalPosition::new(-1000.0, -1000.0)
},
LogicalSize::new(width, height),
);
let _ =
webview.set_position(PhysicalPosition::new(-1000, -1000));
}
} else if let Some(window) = app.get_window("main") {
let _ = window.add_child(
tauri::webview::WebviewBuilder::new(
"ads-window",
WebviewUrl::External(
AD_LINK.parse().unwrap(),
),
)
.initialization_script(LINK_SCRIPT)
.user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36")
.zoom_hotkeys_enabled(false)
.transparent(true),
if state.shown {
position
} else {
PhysicalPosition::new(-1000.0, -1000.0)
},
size,
);
}
}
Ok(())
@@ -113,17 +128,15 @@ pub async fn init_ads_window() {}
#[tauri::command]
pub async fn show_ads_window<R: Runtime>(
app: tauri::AppHandle<R>,
dpr: f32,
) -> crate::api::Result<()> {
if let Some(webview) = app.webviews().get("ads-window") {
let state = app.state::<RwLock<AdsState>>();
let mut state = state.write().await;
let state = state.read().await;
state.shown = true;
if let Some(size) = state.size {
if state.shown {
let (position, size) = get_webview_position(&app, dpr)?;
let _ = webview.set_size(size);
}
if let Some(position) = state.position {
let _ = webview.set_position(position);
}
}
@@ -137,16 +150,14 @@ pub async fn hide_ads_window<R: Runtime>(
reset: Option<bool>,
) -> crate::api::Result<()> {
if let Some(webview) = app.webviews().get("ads-window") {
let state = app.state::<RwLock<AdsState>>();
let mut state = state.write().await;
state.shown = false;
if reset.unwrap_or(false) {
state.size = None;
state.position = None;
let state = app.state::<RwLock<AdsState>>();
let mut state = state.write().await;
state.shown = false;
}
let _ = webview.set_position(LogicalPosition::new(-1000, -1000));
let _ = webview.set_position(PhysicalPosition::new(-1000, -1000));
}
Ok(())
@@ -178,7 +189,7 @@ pub async fn open_link<R: Runtime>(
{
if let Some(last_click) = state.last_click {
if last_click.elapsed() < Duration::from_millis(100) {
let _ = app.shell().open(&path, None);
let _ = app.opener().open_url(&path, None::<String>);
state.last_click = None;
return Ok(());

View File

@@ -185,7 +185,7 @@ fn main() {
.plugin(tauri_plugin_os::init())
.plugin(tauri_plugin_dialog::init())
.plugin(tauri_plugin_deep_link::init())
.plugin(tauri_plugin_shell::init())
.plugin(tauri_plugin_opener::init())
.plugin(
tauri_plugin_window_state::Builder::default()
.with_filename("app-window-state.json")

View File

@@ -1,6 +1,6 @@
[package]
name = "theseus"
version = "0.8.9"
version = "0.9.0"
authors = ["Jai A <jaiagr+gpg@pm.me>"]
edition = "2021"

View File

@@ -105,7 +105,10 @@ impl State {
/// Get the current launcher state, waiting for initialization
pub async fn get() -> crate::Result<Arc<Self>> {
if !LAUNCHER_STATE.initialized() {
while !LAUNCHER_STATE.initialized() {}
tracing::error!("Attempted to get state before it is initialized - this should never happen!");
while !LAUNCHER_STATE.initialized() {
tokio::time::sleep(std::time::Duration::from_millis(100)).await;
}
}
Ok(Arc::clone(

View File

@@ -37,7 +37,7 @@
"qrcode.vue": "^3.4.1",
"vue-multiselect": "3.0.0",
"vue-select": "4.0.0-beta.6",
"vue-virtual-scroller": "v2.0.0-beta.8",
"vue-typed-virtual-list": "^1.0.10",
"vue3-apexcharts": "^1.4.4",
"xss": "^1.0.14"
},

View File

@@ -5,7 +5,7 @@ import Checkbox from '../base/Checkbox.vue'
import ContentListItem from './ContentListItem.vue'
import type { ContentItem } from './ContentListItem.vue'
import { DropdownIcon } from '@modrinth/assets'
import { RecycleScroller } from 'vue-virtual-scroller'
import { createVirtualScroller } from 'vue-typed-virtual-list'
const props = withDefaults(
defineProps<{
@@ -17,6 +17,8 @@ const props = withDefaults(
{},
)
const VirtualScroller = createVirtualScroller()
const selectionStates: Ref<Record<string, boolean>> = ref({})
const selected: Ref<string[]> = computed(() =>
Object.keys(selectionStates.value).filter(
@@ -76,26 +78,21 @@ function setSelected(value: boolean) {
</slot>
</div>
<div class="bg-bg-raised rounded-xl">
<RecycleScroller
v-slot="{ item, index }"
:items="items"
:item-size="64"
disable-transform
key-field="filename"
style="height: 100%"
>
<ContentListItem
v-model="selectionStates[item.filename]"
:item="item"
:last="props.items.length - 1 === index"
class="mb-2"
@update:model-value="updateSelection"
>
<template #actions="{ item }">
<slot name="actions" :item="item" />
</template>
</ContentListItem>
</RecycleScroller>
<VirtualScroller :items="items" :default-size="64" style="height: 100%">
<template #item="{ ref }">
<ContentListItem
v-model="selectionStates[ref.filename]"
:item="ref"
:last="false"
class="mb-2"
@update:model-value="updateSelection"
>
<template #actions="{ item }">
<slot name="actions" :item="item" />
</template>
</ContentListItem>
</template>
</VirtualScroller>
</div>
</div>
</template>

198
pnpm-lock.yaml generated
View File

@@ -36,8 +36,8 @@ importers:
version: link:../../packages/daedalus
devDependencies:
'@tauri-apps/cli':
specifier: 2.0.0-rc.16
version: 2.0.0-rc.16
specifier: 2.1.0
version: 2.1.0
apps/app-frontend:
dependencies:
@@ -54,23 +54,23 @@ importers:
specifier: ^8.27.0
version: 8.27.0(vue@3.5.13(typescript@5.5.4))
'@tauri-apps/api':
specifier: ^2.0.0-rc.3
version: 2.0.0-rc.3
specifier: ^2.1.1
version: 2.1.1
'@tauri-apps/plugin-dialog':
specifier: ^2.0.0-rc.0
version: 2.0.0-rc.0
specifier: ^2.2.0
version: 2.2.0
'@tauri-apps/plugin-opener':
specifier: ^2.2.1
version: 2.2.1
'@tauri-apps/plugin-os':
specifier: ^2.0.0-rc.0
version: 2.0.0-rc.0
'@tauri-apps/plugin-shell':
specifier: ^2.0.0-rc.0
version: 2.0.0-rc.0
specifier: ^2.2.0
version: 2.2.0
'@tauri-apps/plugin-updater':
specifier: ^2.0.0-rc.0
version: 2.0.0-rc.1
specifier: ^2.3.0
version: 2.3.0
'@tauri-apps/plugin-window-state':
specifier: ^2.0.0-rc.0
version: 2.0.0-rc.0
specifier: ^2.2.0
version: 2.2.0
'@vintl/vintl':
specifier: ^4.4.1
version: 4.4.1(typescript@5.5.4)(vue@3.5.13(typescript@5.5.4))
@@ -432,9 +432,9 @@ importers:
vue-select:
specifier: 4.0.0-beta.6
version: 4.0.0-beta.6(vue@3.5.13(typescript@5.5.4))
vue-virtual-scroller:
specifier: v2.0.0-beta.8
version: 2.0.0-beta.8(vue@3.5.13(typescript@5.5.4))
vue-typed-virtual-list:
specifier: ^1.0.10
version: 1.0.10(vue@3.5.13(typescript@5.5.4))
vue3-apexcharts:
specifier: ^1.4.4
version: 1.5.3(apexcharts@3.49.2)(vue@3.5.13(typescript@5.5.4))
@@ -2294,91 +2294,88 @@ packages:
peerDependencies:
eslint: '>=8.40.0'
'@tauri-apps/api@2.0.0-rc.3':
resolution: {integrity: sha512-k1erUfnoOFJwL5VNFZz0BQZ2agNstG7CNOjwpdWMl1vOaVuSn4DhJtXB0Deh9lZaaDlfrykKOyZs9c3XXpMi5Q==}
'@tauri-apps/api@2.1.1':
resolution: {integrity: sha512-fzUfFFKo4lknXGJq8qrCidkUcKcH2UHhfaaCNt4GzgzGaW2iS26uFOg4tS3H4P8D6ZEeUxtiD5z0nwFF0UN30A==}
'@tauri-apps/api@2.0.0-rc.4':
resolution: {integrity: sha512-UNiIhhKG08j4ooss2oEEVexffmWkgkYlC2M3GcX3VPtNsqFgVNL8Mcw/4Y7rO9M9S+ffAMnLOF5ypzyuyb8tyg==}
'@tauri-apps/cli-darwin-arm64@2.0.0-rc.16':
resolution: {integrity: sha512-lISZU4gG0c9PbY7h/j/gW7nJLxZEygNBrYEET6zN8R99Znf5rSO+CfjenaMcJUUj6yTAd8gzdakRpLqNSAWegA==}
'@tauri-apps/cli-darwin-arm64@2.1.0':
resolution: {integrity: sha512-ESc6J6CE8hl1yKH2vJ+ALF+thq4Be+DM1mvmTyUCQObvezNCNhzfS6abIUd3ou4x5RGH51ouiANeT3wekU6dCw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
'@tauri-apps/cli-darwin-x64@2.0.0-rc.16':
resolution: {integrity: sha512-D9uxPCxpyYcTSQulJGFX3POAKPOJd8WcWHFH8x6YVM1cIx6EWRXIE1sZnPUOjFr7qCg+bSdYdr8/BFHcZGcApQ==}
'@tauri-apps/cli-darwin-x64@2.1.0':
resolution: {integrity: sha512-TasHS442DFs8cSH2eUQzuDBXUST4ECjCd0yyP+zZzvAruiB0Bg+c8A+I/EnqCvBQ2G2yvWLYG8q/LI7c87A5UA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
'@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.16':
resolution: {integrity: sha512-WsVdKm4D1I1XV8I9yRnmOINZRwwWfh6xcLV3m19+B9g6TohK8RkRxWfxvs3TLQlWOLQ6lo8BzS9rzXB+KtjDpg==}
'@tauri-apps/cli-linux-arm-gnueabihf@2.1.0':
resolution: {integrity: sha512-aP7ZBGNL4ny07Cbb6kKpUOSrmhcIK2KhjviTzYlh+pPhAptxnC78xQGD3zKQkTi2WliJLPmBYbOHWWQa57lQ9w==}
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
'@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.16':
resolution: {integrity: sha512-2jpZDagNs6rrqposHJihHBayttgOl5aB2+bYiVEC6ye+haiFtmYmpdaPOaVIw+YVQs6lepf5PVrisCoU9DmYsg==}
'@tauri-apps/cli-linux-arm64-gnu@2.1.0':
resolution: {integrity: sha512-ZTdgD5gLeMCzndMT2f358EkoYkZ5T+Qy6zPzU+l5vv5M7dHVN9ZmblNAYYXmoOuw7y+BY4X/rZvHV9pcGrcanQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.16':
resolution: {integrity: sha512-SNEDcB+sWOls/B0a+UpUHVa/oegvlXXKYWsTxuXtgWIr5VbWG7rXLZ3fZpLLP3SpRVGTGTnABcyqshFbWSqqKQ==}
'@tauri-apps/cli-linux-arm64-musl@2.1.0':
resolution: {integrity: sha512-NzwqjUCilhnhJzusz3d/0i0F1GFrwCQbkwR6yAHUxItESbsGYkZRJk0yMEWkg3PzFnyK4cWTlQJMEU52TjhEzA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
'@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.16':
resolution: {integrity: sha512-Zsq29MM1ooeH1+chQBa7ffDFnzAZebBBFdsvs4e05tS1H8gn4oKE+PSMn9p/okzVXykEk9ri2/n7BG1XFeifMA==}
'@tauri-apps/cli-linux-x64-gnu@2.1.0':
resolution: {integrity: sha512-TyiIpMEtZxNOQmuFyfJwaaYbg3movSthpBJLIdPlKxSAB2BW0VWLY3/ZfIxm/G2YGHyREkjJvimzYE0i37PnMA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@tauri-apps/cli-linux-x64-musl@2.0.0-rc.16':
resolution: {integrity: sha512-g+pwSuis2YMxhJJ/pJYwp/Nps5CWvlv/5MV5UfDvClkCkeAyzIqVX+HbBLPcs5S0CePUQNeP0j4d4jBWUqZZQg==}
'@tauri-apps/cli-linux-x64-musl@2.1.0':
resolution: {integrity: sha512-/dQd0TlaxBdJACrR72DhynWftzHDaX32eBtS5WBrNJ+nnNb+znM3gON6nJ9tSE9jgDa6n1v2BkI/oIDtypfUXw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
'@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.16':
resolution: {integrity: sha512-PpPqdMTwJSDAK4KnNjvh77ShSkY+7pih1f6e50EtXar8bjC17e3XcEqFhDNne5mxEVTLYhibs6p1JLPad0ZjRA==}
'@tauri-apps/cli-win32-arm64-msvc@2.1.0':
resolution: {integrity: sha512-NdQJO7SmdYqOcE+JPU7bwg7+odfZMWO6g8xF9SXYCMdUzvM2Gv/AQfikNXz5yS7ralRhNFuW32i5dcHlxh4pDg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
'@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.16':
resolution: {integrity: sha512-io2yIcEcG7YLP+9n13NbilB93SjcB7jIl8GbURC4XZT4/4t9D1PWHpJr5hySVsGRLCz5e8NzwC5RlnenNzmpPQ==}
'@tauri-apps/cli-win32-ia32-msvc@2.1.0':
resolution: {integrity: sha512-f5h8gKT/cB8s1ticFRUpNmHqkmaLutT62oFDB7N//2YTXnxst7EpMIn1w+QimxTvTk2gcx6EcW6bEk/y2hZGzg==}
engines: {node: '>= 10'}
cpu: [ia32]
os: [win32]
'@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.16':
resolution: {integrity: sha512-Rfkmxe3k+cBVA/kVYt8O25QrQqWKJlH9AiH7Q3C6xBzzG9PCSRMBszCp+JhBF8jhVlwNmOBv6UG+lm85kspwGg==}
'@tauri-apps/cli-win32-x64-msvc@2.1.0':
resolution: {integrity: sha512-P/+LrdSSb5Xbho1LRP4haBjFHdyPdjWvGgeopL96OVtrFpYnfC+RctB45z2V2XxqFk3HweDDxk266btjttfjGw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
'@tauri-apps/cli@2.0.0-rc.16':
resolution: {integrity: sha512-wdjZg/M3dcxiqgWG6VRnABpX0dYxRww93t0d1MYoZxFDrnyoUz5kYwFQ0v4J9u0qenEgskjoypvon7V/Nj9qrg==}
'@tauri-apps/cli@2.1.0':
resolution: {integrity: sha512-K2VhcKqBhAeS5pNOVdnR/xQRU6jwpgmkSL2ejHXcl0m+kaTggT0WRDQnFtPq6NljA7aE03cvwsbCAoFG7vtkJw==}
engines: {node: '>= 10'}
hasBin: true
'@tauri-apps/plugin-dialog@2.0.0-rc.0':
resolution: {integrity: sha512-DPOXYe8SQ6Radk/67EOdaomlxL7oF99JO/ZUaPp1IBEs3Wro7lhlz63CfdKIBfKIZTLJLzP1R7/EiPL/GTA3Bg==}
'@tauri-apps/plugin-dialog@2.2.0':
resolution: {integrity: sha512-6bLkYK68zyK31418AK5fNccCdVuRnNpbxquCl8IqgFByOgWFivbiIlvb79wpSXi0O+8k8RCSsIpOquebusRVSg==}
'@tauri-apps/plugin-os@2.0.0-rc.0':
resolution: {integrity: sha512-OWAl8mooKnGykSD4iog8WRqcnOSx0gGmTJBlEExHdFeIuOHg0Ezvd+WiVLhT9LBg7go3ibNWRWpe/ZG7YEp4Vw==}
'@tauri-apps/plugin-opener@2.2.1':
resolution: {integrity: sha512-zloo4xzBqeh363xNA+xYt+7+/cu/lPYuG5PRtxjWAaSyfMqFo6IINdizkDBYylUewLiplXb5+S65GLVkeXTHPg==}
'@tauri-apps/plugin-shell@2.0.0-rc.0':
resolution: {integrity: sha512-bhUcQcrqZoK8H1DFXapr5r1Z75oh6Kd5Tltz97XpZFLREEqp+KhN2Fvyh8r/fKAyenYsTYUIsDsyGdjdueuF9g==}
'@tauri-apps/plugin-os@2.2.0':
resolution: {integrity: sha512-HszbCdbisMlu5QhCNAN8YIWyz2v33abAWha6+uvV2CKX8P5VSct/y+kEe22JeyqrxCnWlQ3DRx7s49Byg7/0EA==}
'@tauri-apps/plugin-updater@2.0.0-rc.1':
resolution: {integrity: sha512-SwQhDad/jnGIUe4eFfVBZ+0wRZthPSLwrFAl/K0Fyuu7dD/uGHS/jbATxZzwFDGfcpWOGLOsS8+LqSmY5zufHw==}
'@tauri-apps/plugin-updater@2.3.0':
resolution: {integrity: sha512-qdzyZEUN69FZQ/nRx51fBub10tT6wffJl3DLVo9q922Gvw8Wk++rZhoD9eethPlZYbog/7RGgT8JkrfLh5BKAg==}
'@tauri-apps/plugin-window-state@2.0.0-rc.0':
resolution: {integrity: sha512-lR8reD+D1yIHT+53v56WltLS0+Y2zIkKqTuwrvz1yNbY5Hk4Z6foFV2Byo4kJAAvi5vbeGtvxYAjSiczZK5euw==}
'@tauri-apps/plugin-window-state@2.2.0':
resolution: {integrity: sha512-PFZ/vkZ6UPaRyuggEn8jWc/xwpiEw3Id8i6bin54zUR3vHY0MOK+ovvpvp6SEHKryCJbZMigYJz0OUT2eZ4YmQ==}
'@trysound/sax@0.2.0':
resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
@@ -10544,72 +10541,70 @@ snapshots:
- supports-color
- typescript
'@tauri-apps/api@2.0.0-rc.3': {}
'@tauri-apps/api@2.1.1': {}
'@tauri-apps/api@2.0.0-rc.4': {}
'@tauri-apps/cli-darwin-arm64@2.0.0-rc.16':
'@tauri-apps/cli-darwin-arm64@2.1.0':
optional: true
'@tauri-apps/cli-darwin-x64@2.0.0-rc.16':
'@tauri-apps/cli-darwin-x64@2.1.0':
optional: true
'@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.16':
'@tauri-apps/cli-linux-arm-gnueabihf@2.1.0':
optional: true
'@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.16':
'@tauri-apps/cli-linux-arm64-gnu@2.1.0':
optional: true
'@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.16':
'@tauri-apps/cli-linux-arm64-musl@2.1.0':
optional: true
'@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.16':
'@tauri-apps/cli-linux-x64-gnu@2.1.0':
optional: true
'@tauri-apps/cli-linux-x64-musl@2.0.0-rc.16':
'@tauri-apps/cli-linux-x64-musl@2.1.0':
optional: true
'@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.16':
'@tauri-apps/cli-win32-arm64-msvc@2.1.0':
optional: true
'@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.16':
'@tauri-apps/cli-win32-ia32-msvc@2.1.0':
optional: true
'@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.16':
'@tauri-apps/cli-win32-x64-msvc@2.1.0':
optional: true
'@tauri-apps/cli@2.0.0-rc.16':
'@tauri-apps/cli@2.1.0':
optionalDependencies:
'@tauri-apps/cli-darwin-arm64': 2.0.0-rc.16
'@tauri-apps/cli-darwin-x64': 2.0.0-rc.16
'@tauri-apps/cli-linux-arm-gnueabihf': 2.0.0-rc.16
'@tauri-apps/cli-linux-arm64-gnu': 2.0.0-rc.16
'@tauri-apps/cli-linux-arm64-musl': 2.0.0-rc.16
'@tauri-apps/cli-linux-x64-gnu': 2.0.0-rc.16
'@tauri-apps/cli-linux-x64-musl': 2.0.0-rc.16
'@tauri-apps/cli-win32-arm64-msvc': 2.0.0-rc.16
'@tauri-apps/cli-win32-ia32-msvc': 2.0.0-rc.16
'@tauri-apps/cli-win32-x64-msvc': 2.0.0-rc.16
'@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
'@tauri-apps/plugin-dialog@2.0.0-rc.0':
'@tauri-apps/plugin-dialog@2.2.0':
dependencies:
'@tauri-apps/api': 2.0.0-rc.3
'@tauri-apps/api': 2.1.1
'@tauri-apps/plugin-os@2.0.0-rc.0':
'@tauri-apps/plugin-opener@2.2.1':
dependencies:
'@tauri-apps/api': 2.0.0-rc.3
'@tauri-apps/api': 2.1.1
'@tauri-apps/plugin-shell@2.0.0-rc.0':
'@tauri-apps/plugin-os@2.2.0':
dependencies:
'@tauri-apps/api': 2.0.0-rc.3
'@tauri-apps/api': 2.1.1
'@tauri-apps/plugin-updater@2.0.0-rc.1':
'@tauri-apps/plugin-updater@2.3.0':
dependencies:
'@tauri-apps/api': 2.0.0-rc.4
'@tauri-apps/api': 2.1.1
'@tauri-apps/plugin-window-state@2.0.0-rc.0':
'@tauri-apps/plugin-window-state@2.2.0':
dependencies:
'@tauri-apps/api': 2.0.0-rc.3
'@tauri-apps/api': 2.1.1
'@trysound/sax@0.2.0': {}
@@ -11558,6 +11553,16 @@ snapshots:
- '@vue/composition-api'
- vue
'@vueuse/core@9.13.0(vue@3.5.13(typescript@5.5.4))':
dependencies:
'@types/web-bluetooth': 0.0.16
'@vueuse/metadata': 9.13.0
'@vueuse/shared': 9.13.0(vue@3.5.13(typescript@5.5.4))
vue-demi: 0.14.8(vue@3.5.13(typescript@5.5.4))
transitivePeerDependencies:
- '@vue/composition-api'
- vue
'@vueuse/metadata@11.1.0': {}
'@vueuse/metadata@9.13.0': {}
@@ -11576,6 +11581,13 @@ snapshots:
- '@vue/composition-api'
- vue
'@vueuse/shared@9.13.0(vue@3.5.13(typescript@5.5.4))':
dependencies:
vue-demi: 0.14.8(vue@3.5.13(typescript@5.5.4))
transitivePeerDependencies:
- '@vue/composition-api'
- vue
'@webassemblyjs/ast@1.12.1':
dependencies:
'@webassemblyjs/helper-numbers': 1.11.6
@@ -17795,6 +17807,14 @@ snapshots:
transitivePeerDependencies:
- '@vue/composition-api'
vue-typed-virtual-list@1.0.10(vue@3.5.13(typescript@5.5.4)):
dependencies:
'@vueuse/core': 9.13.0(vue@3.5.13(typescript@5.5.4))
debounce: 1.2.1
vue: 3.5.13(typescript@5.5.4)
transitivePeerDependencies:
- '@vue/composition-api'
vue-virtual-scroller@2.0.0-beta.8(vue@3.5.13(typescript@5.5.4)):
dependencies:
mitt: 2.1.0