From 3aa9fcd1b519cbc5db0ec3cf8857ca0e8c8d892e Mon Sep 17 00:00:00 2001 From: Pauline Date: Sun, 12 May 2024 05:53:13 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feature(core):=20start=20specta=20+?= =?UTF-8?q?=20pcr=20+=20rspc=20integration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cargo/config.toml | 2 + .clippy.toml | 1 + .github/CODEOWNERS | 0 .gitignore | 3 +- Cargo.toml | 8 + client/package.json | 26 ++ client/src/index.ts | 0 client/tsconfig.json | 9 + desktop/.gitignore | 1 - desktop/dist/.gitignore | 5 + desktop/package.json | 15 +- desktop/src-tauri/Cargo.toml | 11 +- desktop/src-tauri/src/ext/mod.rs | 2 +- desktop/src-tauri/src/ext/updater.rs | 115 ++++++++ desktop/src-tauri/src/lib.rs | 5 +- desktop/src-tauri/tauri.conf.json | 12 +- desktop/vite.config.ts | 3 + package.json | 17 +- patches/@rspc__tauri@0.2.0.patch | 90 +++++++ pnpm-lock.yaml | 382 +++++++++++++++------------ pnpm-workspace.yaml | 1 + tsconfig.json | 5 +- 22 files changed, 522 insertions(+), 191 deletions(-) create mode 100644 .clippy.toml create mode 100644 .github/CODEOWNERS create mode 100644 client/package.json create mode 100644 client/src/index.ts create mode 100644 client/tsconfig.json create mode 100644 desktop/dist/.gitignore create mode 100644 desktop/src-tauri/src/ext/updater.rs create mode 100644 patches/@rspc__tauri@0.2.0.patch diff --git a/.cargo/config.toml b/.cargo/config.toml index fc6e856d..48c6e34b 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -3,3 +3,5 @@ rustflags = [ "-C", "link-args=/STACK:16777220" ] + +[alias] diff --git a/.clippy.toml b/.clippy.toml new file mode 100644 index 00000000..154626ef --- /dev/null +++ b/.clippy.toml @@ -0,0 +1 @@ +allow-unwrap-in-tests = true diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..e69de29b diff --git a/.gitignore b/.gitignore index ccadbf92..a89d5a5b 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,6 @@ dev.db dev.db-journal # Vendor -dist .eslintcache # .env* vendor/ @@ -261,7 +260,7 @@ out # Nuxt.js build / generate output .nuxt -dist + # Gatsby files .cache/ diff --git a/Cargo.toml b/Cargo.toml index cb982a91..ec688021 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,6 +31,10 @@ tauri-plugin-window-state = { git = "https://github.com/tauri-apps/plugins-works tauri-plugin-single-instance = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } tauri-plugin-updater = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2", features = [ "rustls-tls" ] } +rspc = { version = "0.2.0", features = [ "specta2" ] } +specta = { version = "=2.0.0-rc.12" } +rspc-tauri2 = { git = "https://github.com/specta-rs/tauri2" } + interpulse = { version = "0.1.3" } tracing = { version = "0.1" } @@ -115,6 +119,10 @@ whoami = { version = "1.5" } cocoa = { version = "0.25" } objc = { version = "0.2" } +[patch.crates-io] +specta = { git = "https://github.com/oscartbeaumont/specta", rev = "f3bc75ec6120ea0fc6cd8e2e2e3aebef049e93cb" } +rspc = { git = "https://github.com/oscartbeaumont/rspc", rev = "f250409db9e21a67ae252c963d605f863f73d5f0" } + [profile.dev] # add debug symbols/logic and optimize for reduced build time (parallel) debug = true diff --git a/client/package.json b/client/package.json new file mode 100644 index 00000000..4ed440a0 --- /dev/null +++ b/client/package.json @@ -0,0 +1,26 @@ +{ + "name": "@onelauncher/client", + "type": "module", + "version": "1.0.0", + "private": true, + "description": "RSPC Client for OneLauncher", + "license": "GPL-3.0-only", + "repository": { + "type": "git", + "url": "git@github.com:polyfrost/onelauncher", + "directory": "client" + }, + "sideEffects": false, + "main": "./src/index.ts", + "types": "./src/index.ts", + "dependencies": { + "@rspc/client": "^0.2.0", + "@rspc/tauri": "^0.2.0", + "@solid-primitives/deep": "^0.2.8", + "@tanstack/solid-query": "^5.35.5", + "fast-equals": "^5.0.1", + "plausible-tracker": "^0.3.8", + "solid-js": "^1.8.17", + "zod": "^3.23.8" + } +} diff --git a/client/src/index.ts b/client/src/index.ts new file mode 100644 index 00000000..e69de29b diff --git a/client/tsconfig.json b/client/tsconfig.json new file mode 100644 index 00000000..cbc15950 --- /dev/null +++ b/client/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "rootDir": "src", + "emitDeclarationOnly": false, + "outDir": "./dist" + }, + "include": ["src/**/*.ts", "src/**/*.d.ts"] +} diff --git a/desktop/.gitignore b/desktop/.gitignore index 151488bf..b3bed89e 100644 --- a/desktop/.gitignore +++ b/desktop/.gitignore @@ -1,3 +1,2 @@ -/dist /dist-isolation /coverage diff --git a/desktop/dist/.gitignore b/desktop/dist/.gitignore new file mode 100644 index 00000000..c5327226 --- /dev/null +++ b/desktop/dist/.gitignore @@ -0,0 +1,5 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore +# This is done so that Tauri never complains that '../dist does not exist' diff --git a/desktop/package.json b/desktop/package.json index 3751777f..ca8cc04d 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -3,16 +3,13 @@ "type": "module", "version": "1.0.0", "description": "Next-generation open source Minecraft desktop launcher", - "license": "MIT", + "license": "GPL-3.0-only", "repository": { "type": "git", "url": "git@github.com:polyfrost/onelauncher", "directory": "desktop" }, "scripts": { - "test": "vitest run", - "test:dev": "vitest", - "test:ui": "vitest --ui", "tauri": "tauri", "dev": "vite dev", "build": "vite build" @@ -20,6 +17,9 @@ "dependencies": { "@fontsource/poppins": "^5.0.14", "@iconify-json/logos": "^1.1.42", + "@onelauncher/client": "workspace:*", + "@rspc/client": "^0.2.0", + "@rspc/tauri": "^0.2.0", "@solid-primitives/refs": "^1.0.8", "@solidjs/router": "^0.13.3", "@tauri-apps/api": "^2.0.0-beta", @@ -38,15 +38,10 @@ "@tauri-apps/cli": "2.0.0-beta.10", "@testing-library/jest-dom": "^6.4.5", "@types/uuid": "^9.0.8", - "@vitest/ui": "^1.6.0", "jsdom": "^24.0.0", "sass": "^1.77.1", - "ts-node": "^10.9.2", - "typescript": "^5.4.5", "unocss": "^0.60.0", - "vite": "^5.2.11", "vite-plugin-solid": "^2.10.2", - "vite-tsconfig-paths": "^4.3.2", - "vitest": "^1.6.0" + "vite-tsconfig-paths": "^4.3.2" } } diff --git a/desktop/src-tauri/Cargo.toml b/desktop/src-tauri/Cargo.toml index 56d5dbd1..c0675306 100644 --- a/desktop/src-tauri/Cargo.toml +++ b/desktop/src-tauri/Cargo.toml @@ -26,7 +26,6 @@ tauri-build = { workspace = true, features = [ [dependencies] onelauncher = { path = "../../core", features = [ "tauri" ] } - interpulse = { workspace = true, features = [ "bincode" ] } tauri = { workspace = true, features = [ @@ -41,6 +40,7 @@ tauri-plugin-window-state = { workspace = true } tauri-plugin-single-instance = { workspace = true } tauri-plugin-updater = { workspace = true } tauri-plugin-authenticator = { workspace = true } + tokio = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } @@ -61,5 +61,14 @@ cocoa = "0.25.0" objc = "0.2.7" [features] +default = [ "custom-protocol" ] +devtools = [ "tauri/devtools" ] # This feature is used for production builds or when a dev server is not specified, DO NOT REMOVE!! custom-protocol = [ "tauri/custom-protocol" ] + +[profile.release] +panic = "abort" +codegen-units = 1 +lto = true +opt-level = "s" +strip = true diff --git a/desktop/src-tauri/src/ext/mod.rs b/desktop/src-tauri/src/ext/mod.rs index 8b137891..a880d9de 100644 --- a/desktop/src-tauri/src/ext/mod.rs +++ b/desktop/src-tauri/src/ext/mod.rs @@ -1 +1 @@ - +pub mod updater; diff --git a/desktop/src-tauri/src/ext/updater.rs b/desktop/src-tauri/src/ext/updater.rs new file mode 100644 index 00000000..54d19862 --- /dev/null +++ b/desktop/src-tauri/src/ext/updater.rs @@ -0,0 +1,115 @@ +use tauri::{plugin::TauriPlugin, Manager, Runtime}; +use tauri_plugin_updater::{Update as TauriPluginUpdate, UpdaterExt}; +use tokio::sync::Mutex; + +#[derive(Debug, Clone, serde::Serialize)] +pub struct Update { + pub version: String, +} + +impl Update { + fn new(update: &TauriPluginUpdate) -> Self { + Self { + version: update.version.clone(), + } + } +} + +#[derive(Default)] +pub struct State { + install_lock: Mutex<()>, +} + +async fn get_update(app: tauri::AppHandle) -> Result, String> { + app.updater_builder() + .header("X-OneLauncher-Version", "stable") + .map_err(|e| e.to_string())? + .build() + .map_err(|e| e.to_string())? + .check() + .await + .map_err(|e| e.to_string()) +} + +#[derive(Clone, serde::Serialize)] +#[serde(rename_all = "camelCase", tag = "status")] +pub enum UpdateEvent { + Loading, + Error(String), + UpdateAvailable { update: Update }, + NoUpdateAvailable, + Installing, +} + +#[tauri::command] +pub async fn check_for_update(app: tauri::AppHandle) -> Result, String> { + app.emit("updater", UpdateEvent::Loading).ok(); + + let update = match get_update(app.clone()).await { + Ok(update) => update, + Err(e) => { + app.emit("updater", UpdateEvent::Error(e.clone())).ok(); + return Err(e); + } + }; + + let update = update.map(|update| Update::new(&update)); + + app.emit( + "updater", + update + .clone() + .map_or(UpdateEvent::NoUpdateAvailable, |update| { + UpdateEvent::UpdateAvailable { update } + }), + ) + .ok(); + + Ok(update) +} + +#[tauri::command] +pub async fn install_update( + app: tauri::AppHandle, + state: tauri::State<'_, State>, +) -> Result<(), String> { + let lock = match state.install_lock.try_lock() { + Ok(lock) => lock, + Err(_) => return Err("Update already installing".into()), + }; + + app.emit("updater", UpdateEvent::Installing).ok(); + + get_update(app.clone()) + .await? + .ok_or_else(|| "No update required".to_string())? + .download_and_install(|_, _| {}, || {}) + .await + .map_err(|e| e.to_string())?; + + drop(lock); + + Ok(()) +} + +pub fn plugin() -> TauriPlugin { + tauri::plugin::Builder::new("onelauncher-updater") + .on_page_load(|window, _| { + #[cfg(target_os = "linux")] + let updater_available = false; + + #[cfg(not(target_os = "linux"))] + let updater_available = true; + + if updater_available { + window + .eval("window.__LAUNCHER_UPDATER__ = true;") + .expect("Failed to inject updater JS"); + } + }) + .js_init_script(format!( + r#"window.__ONELAUNCHER_VERSION__ = "{}";"#, + env!("CARGO_PKG_VERSION") + )) + .build() +} diff --git a/desktop/src-tauri/src/lib.rs b/desktop/src-tauri/src/lib.rs index a9bb654d..cd9136c2 100644 --- a/desktop/src-tauri/src/lib.rs +++ b/desktop/src-tauri/src/lib.rs @@ -52,7 +52,10 @@ pub async fn run_app) + Send + ' app.emit("single-instance", SingleInstancePayload { args: argv, cwd }) .unwrap(); })) - .plugin(tauri_plugin_window_state::Builder::default().build()) + .plugin(tauri_plugin_updater::Builder::new().build()) + .plugin(ext::updater::plugin()) + .manage(ext::updater::State::default()) + // .plugin(tauri_plugin_window_state::Builder::default().build()) .menu(tauri::menu::Menu::new) .setup(move |app| { setup(app); diff --git a/desktop/src-tauri/tauri.conf.json b/desktop/src-tauri/tauri.conf.json index f26a0915..14bbfe91 100644 --- a/desktop/src-tauri/tauri.conf.json +++ b/desktop/src-tauri/tauri.conf.json @@ -86,22 +86,28 @@ "shortDescription": "Next-generation open source Minecraft launcher", "macOS": { "entitlements": "App.entitlements", - "exceptionDomain": "", + "exceptionDomain": null, "frameworks": [], "providerShortName": null, "signingIdentity": null, - "minimumSystemVersion": "10.13" + "minimumSystemVersion": "10.15" }, "windows": { "certificateThumbprint": null, + "webviewInstallMode": { + "silent": true, + "type": "downloadBootstrapper" + }, "digestAlgorithm": "sha256", "timestampUrl": "https://timestamp.digicert.com" } }, "plugins": { "updater": { + "active": true, + "dialog": false, "pubkey": "", - "endpoints": ["https://api.polyfrost.org/launcher/update/{{target}}/{{custom_version}}"] + "endpoints": ["https://polyfrost.org/releases/update/{{version}}/{{target}}/{{arch}}"] } } } diff --git a/desktop/vite.config.ts b/desktop/vite.config.ts index 745db237..b3411d90 100644 --- a/desktop/vite.config.ts +++ b/desktop/vite.config.ts @@ -25,6 +25,9 @@ export default defineConfig(async ({ mode }) => { target: ['esnext', 'chrome110', 'safari13'], minify: !process.env.TAURI_DEBUG ? 'esbuild' : false, sourcemap: !!process.env.TAURI_DEBUG, + rollupOptions: { + treeshake: 'recommended', + }, }, clearScreen: false, diff --git a/package.json b/package.json index fbe66de4..62f6d0ec 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "version": "1.0.0", "packageManager": "pnpm@9.1.0", "description": "Next-generation open source Minecraft launcher and tools for interacting with Polyfrost", - "license": "MIT", + "license": "GPL-3.0-only", "repository": { "type": "git", "url": "git@github.com:polyfrost/onelauncher" @@ -14,6 +14,7 @@ }, "scripts": { "gui": "pnpm --filter @onelauncher/gui", + "client": "pnpm --filter @onelauncher/client", "dev": "pnpm gui tauri dev", "build": "pnpm gui tauri build", "lint": "eslint . --cache", @@ -21,11 +22,21 @@ "release:node": "bumpp -r" }, "devDependencies": { - "@flowr/eslint-config": "^3.2.0", + "@flowr/eslint-config": "^3.2.1", "@types/node": "^20.12.11", + "@vitest/ui": "^1.6.0", "bumpp": "^9.4.1", "eslint": "^8.56.0", "eslint-plugin-solid": "^0.14.0", - "typescript": "^5.4.5" + "ts-node": "^10.9.2", + "tsx": "^4.10.0", + "typescript": "^5.4.5", + "vite": "^5.2.11", + "vitest": "^1.6.0" + }, + "pnpm": { + "patchDependencies": { + "@rspc/tauri@0.2.0": "patches/@rspc__tauri@0.2.0.patch" + } } } diff --git a/patches/@rspc__tauri@0.2.0.patch b/patches/@rspc__tauri@0.2.0.patch new file mode 100644 index 00000000..6776e601 --- /dev/null +++ b/patches/@rspc__tauri@0.2.0.patch @@ -0,0 +1,90 @@ +diff --git a/dist/index.js b/dist/index.js +index 9c147bac563ff3f42130b6bbcaa39be46a5a2df2..1e14b7ecdd5e812c1c3c02ffecdda0f8fe7c8e4e 100644 +--- a/dist/index.js ++++ b/dist/index.js +@@ -39,7 +39,7 @@ var TauriTransport = (_class = class { + resolve = res; + }); + this.requestMap.set(id, resolve); +- await _window.appWindow.emit("plugin:rspc:transport", { ++ await _window.getCurrent.call(void 0, ).emit("plugin:rspc:transport", { + id, + method: operation, + params: { +diff --git a/dist/index.js.map b/dist/index.js.map +index e81a18ddd3c2b9e0062ffe1fb3232bd075288310..dbc9a1a1f37c670c6b1c642da3a2d327938c6ba1 100644 +--- a/dist/index.js.map ++++ b/dist/index.js.map +@@ -1 +1 @@ +-{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";AAAA,SAAS,UAAoC,iBAAiB;AAC9D,SAAS,cAA0B;AACnC,SAAS,iBAAiB;AAEnB,IAAM,iBAAN,MAA0C;AAAA,EACvC,aAAa,oBAAI,IAAiC;AAAA,EAClD;AAAA,EACR;AAAA,EAEA,cAAc;AACZ,SAAK,WAAW,OAAO,8BAA8B,CAAC,UAAU;AAVpE;AAWM,YAAM,EAAE,IAAI,OAAO,IAAI,MAAM;AAC7B,UAAI,OAAO,SAAS,SAAS;AAC3B,YAAI,KAAK;AACP,eAAK,2BAA2B,IAAI,OAAO,IAAI;AAAA,MACnD,WAAW,OAAO,SAAS,YAAY;AACrC,YAAI,KAAK,WAAW,IAAI,EAAE,GAAG;AAC3B,qBAAK,WAAW,IAAI,EAAE,MAAtB,mBAA0B,EAAE,MAAM,YAAY,QAAQ,OAAO,KAAK;AAClE,eAAK,WAAW,OAAO,EAAE;AAAA,QAC3B;AAAA,MACF,WAAW,OAAO,SAAS,SAAS;AAClC,cAAM,EAAE,SAAS,KAAK,IAAI,OAAO;AACjC,YAAI,KAAK,WAAW,IAAI,EAAE,GAAG;AAC3B,qBAAK,WAAW,IAAI,EAAE,MAAtB,mBAA0B,EAAE,MAAM,SAAS,SAAS,KAAK;AACzD,eAAK,WAAW,OAAO,EAAE;AAAA,QAC3B;AAAA,MACF,OAAO;AACL,gBAAQ,MAAM,qCAAqC,OAAO,IAAI,GAAG;AAAA,MACnE;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UACJ,WACA,KACA,OACc;AACd,QAAI,CAAC,KAAK,UAAU;AAClB,YAAM,KAAK;AAAA,IACb;AAEA,UAAM,KAAK,SAAS;AACpB,QAAI;AACJ,UAAM,UAAU,IAAI,QAAQ,CAAC,QAAQ;AACnC,gBAAU;AAAA,IACZ,CAAC;AAGD,SAAK,WAAW,IAAI,IAAI,OAAO;AAE/B,UAAM,UAAU,KAAK,yBAAyB;AAAA,MAC5C;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,OAAQ,MAAM;AACpB,QAAI,KAAK,SAAS,SAAS;AACzB,YAAM,EAAE,MAAM,QAAQ,IAAI;AAC1B,YAAM,IAAI,UAAU,MAAM,OAAO;AAAA,IACnC,WAAW,KAAK,SAAS,YAAY;AACnC,aAAO,KAAK;AAAA,IACd,OAAO;AACL,YAAM,IAAI;AAAA,QACR,oDAAoD,6BAAM,IAAI;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AACF","sourcesContent":["import { randomId, OperationType, Transport, RSPCError } from \"@rspc/client\";\nimport { listen, UnlistenFn } from \"@tauri-apps/api/event\";\nimport { appWindow } from \"@tauri-apps/api/window\";\n\nexport class TauriTransport implements Transport {\n private requestMap = new Map void>();\n private listener?: Promise;\n clientSubscriptionCallback?: (id: string, value: any) => void;\n\n constructor() {\n this.listener = listen(\"plugin:rspc:transport:resp\", (event) => {\n const { id, result } = event.payload as any;\n if (result.type === \"event\") {\n if (this.clientSubscriptionCallback)\n this.clientSubscriptionCallback(id, result.data);\n } else if (result.type === \"response\") {\n if (this.requestMap.has(id)) {\n this.requestMap.get(id)?.({ type: \"response\", result: result.data });\n this.requestMap.delete(id);\n }\n } else if (result.type === \"error\") {\n const { message, code } = result.data;\n if (this.requestMap.has(id)) {\n this.requestMap.get(id)?.({ type: \"error\", message, code });\n this.requestMap.delete(id);\n }\n } else {\n console.error(`Received event of unknown method '${result.type}'`);\n }\n });\n }\n\n async doRequest(\n operation: OperationType,\n key: string,\n input: any\n ): Promise {\n if (!this.listener) {\n await this.listener;\n }\n\n const id = randomId();\n let resolve: (data: any) => void;\n const promise = new Promise((res) => {\n resolve = res;\n });\n\n // @ts-ignore\n this.requestMap.set(id, resolve);\n\n await appWindow.emit(\"plugin:rspc:transport\", {\n id,\n method: operation,\n params: {\n path: key,\n input,\n },\n });\n\n const body = (await promise) as any;\n if (body.type === \"error\") {\n const { code, message } = body;\n throw new RSPCError(code, message);\n } else if (body.type === \"response\") {\n return body.result;\n } else {\n throw new Error(\n `RSPC Tauri doRequest received invalid body type '${body?.type}'`\n );\n }\n }\n}\n"]} +\ No newline at end of file ++{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";AAAA,SAAS,UAAoC,iBAAiB;AAC9D,SAAS,cAA0B;AACnC,SAAS,kBAAkB;AAEpB,IAAM,iBAAN,MAA0C;AAAA,EACvC,aAAa,oBAAI,IAAiC;AAAA,EAClD;AAAA,EACR;AAAA,EAEA,cAAc;AACZ,SAAK,WAAW,OAAO,8BAA8B,CAAC,UAAU;AAVpE;AAWM,YAAM,EAAE,IAAI,OAAO,IAAI,MAAM;AAC7B,UAAI,OAAO,SAAS,SAAS;AAC3B,YAAI,KAAK;AACP,eAAK,2BAA2B,IAAI,OAAO,IAAI;AAAA,MACnD,WAAW,OAAO,SAAS,YAAY;AACrC,YAAI,KAAK,WAAW,IAAI,EAAE,GAAG;AAC3B,qBAAK,WAAW,IAAI,EAAE,MAAtB,mBAA0B,EAAE,MAAM,YAAY,QAAQ,OAAO,KAAK;AAClE,eAAK,WAAW,OAAO,EAAE;AAAA,QAC3B;AAAA,MACF,WAAW,OAAO,SAAS,SAAS;AAClC,cAAM,EAAE,SAAS,KAAK,IAAI,OAAO;AACjC,YAAI,KAAK,WAAW,IAAI,EAAE,GAAG;AAC3B,qBAAK,WAAW,IAAI,EAAE,MAAtB,mBAA0B,EAAE,MAAM,SAAS,SAAS,KAAK;AACzD,eAAK,WAAW,OAAO,EAAE;AAAA,QAC3B;AAAA,MACF,OAAO;AACL,gBAAQ,MAAM,qCAAqC,OAAO,IAAI,GAAG;AAAA,MACnE;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UACJ,WACA,KACA,OACc;AACd,QAAI,CAAC,KAAK,UAAU;AAClB,YAAM,KAAK;AAAA,IACb;AAEA,UAAM,KAAK,SAAS;AACpB,QAAI;AACJ,UAAM,UAAU,IAAI,QAAQ,CAAC,QAAQ;AACnC,gBAAU;AAAA,IACZ,CAAC;AAGD,SAAK,WAAW,IAAI,IAAI,OAAO;AAE/B,UAAM,WAAW,EAAE,KAAK,yBAAyB;AAAA,MAC/C;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,OAAQ,MAAM;AACpB,QAAI,KAAK,SAAS,SAAS;AACzB,YAAM,EAAE,MAAM,QAAQ,IAAI;AAC1B,YAAM,IAAI,UAAU,MAAM,OAAO;AAAA,IACnC,WAAW,KAAK,SAAS,YAAY;AACnC,aAAO,KAAK;AAAA,IACd,OAAO;AACL,YAAM,IAAI;AAAA,QACR,oDAAoD,6BAAM,IAAI;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AACF","sourcesContent":["import { randomId, OperationType, Transport, RSPCError } from \"@rspc/client\";\nimport { listen, UnlistenFn } from \"@tauri-apps/api/event\";\nimport { getCurrent } from \"@tauri-apps/api/window\";\n\nexport class TauriTransport implements Transport {\n private requestMap = new Map void>();\n private listener?: Promise;\n clientSubscriptionCallback?: (id: string, value: any) => void;\n\n constructor() {\n this.listener = listen(\"plugin:rspc:transport:resp\", (event) => {\n const { id, result } = event.payload as any;\n if (result.type === \"event\") {\n if (this.clientSubscriptionCallback)\n this.clientSubscriptionCallback(id, result.data);\n } else if (result.type === \"response\") {\n if (this.requestMap.has(id)) {\n this.requestMap.get(id)?.({ type: \"response\", result: result.data });\n this.requestMap.delete(id);\n }\n } else if (result.type === \"error\") {\n const { message, code } = result.data;\n if (this.requestMap.has(id)) {\n this.requestMap.get(id)?.({ type: \"error\", message, code });\n this.requestMap.delete(id);\n }\n } else {\n console.error(`Received event of unknown method '${result.type}'`);\n }\n });\n }\n\n async doRequest(\n operation: OperationType,\n key: string,\n input: any\n ): Promise {\n if (!this.listener) {\n await this.listener;\n }\n\n const id = randomId();\n let resolve: (data: any) => void;\n const promise = new Promise((res) => {\n resolve = res;\n });\n\n // @ts-ignore\n this.requestMap.set(id, resolve);\n\n await getCurrent().emit(\"plugin:rspc:transport\", {\n id,\n method: operation,\n params: {\n path: key,\n input,\n },\n });\n\n const body = (await promise) as any;\n if (body.type === \"error\") {\n const { code, message } = body;\n throw new RSPCError(code, message);\n } else if (body.type === \"response\") {\n return body.result;\n } else {\n throw new Error(\n `RSPC Tauri doRequest received invalid body type '${body?.type}'`\n );\n }\n }\n}\n"]} +\ No newline at end of file +diff --git a/dist/index.mjs b/dist/index.mjs +index bba6888c0dd213cb086fad7d7548afb43fb8494c..7b01ceaee03edeb751f3e1d772b666a791242105 100644 +--- a/dist/index.mjs ++++ b/dist/index.mjs +@@ -1,7 +1,7 @@ + // src/index.ts + import { randomId, RSPCError } from "@rspc/client"; + import { listen } from "@tauri-apps/api/event"; +-import { appWindow } from "@tauri-apps/api/window"; ++import { getCurrent } from "@tauri-apps/api/window"; + var TauriTransport = class { + requestMap = /* @__PURE__ */ new Map(); + listener; +@@ -39,7 +39,7 @@ var TauriTransport = class { + resolve = res; + }); + this.requestMap.set(id, resolve); +- await appWindow.emit("plugin:rspc:transport", { ++ await getCurrent().emit("plugin:rspc:transport", { + id, + method: operation, + params: { +diff --git a/dist/index.mjs.map b/dist/index.mjs.map +index c83073015352b197d4d4a7ee6239c180c89f31db..8d27d5faa80fc5815477e54a832c88f5da9967b4 100644 +--- a/dist/index.mjs.map ++++ b/dist/index.mjs.map +@@ -1 +1 @@ +-{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { randomId, OperationType, Transport, RSPCError } from \"@rspc/client\";\nimport { listen, UnlistenFn } from \"@tauri-apps/api/event\";\nimport { appWindow } from \"@tauri-apps/api/window\";\n\nexport class TauriTransport implements Transport {\n private requestMap = new Map void>();\n private listener?: Promise;\n clientSubscriptionCallback?: (id: string, value: any) => void;\n\n constructor() {\n this.listener = listen(\"plugin:rspc:transport:resp\", (event) => {\n const { id, result } = event.payload as any;\n if (result.type === \"event\") {\n if (this.clientSubscriptionCallback)\n this.clientSubscriptionCallback(id, result.data);\n } else if (result.type === \"response\") {\n if (this.requestMap.has(id)) {\n this.requestMap.get(id)?.({ type: \"response\", result: result.data });\n this.requestMap.delete(id);\n }\n } else if (result.type === \"error\") {\n const { message, code } = result.data;\n if (this.requestMap.has(id)) {\n this.requestMap.get(id)?.({ type: \"error\", message, code });\n this.requestMap.delete(id);\n }\n } else {\n console.error(`Received event of unknown method '${result.type}'`);\n }\n });\n }\n\n async doRequest(\n operation: OperationType,\n key: string,\n input: any\n ): Promise {\n if (!this.listener) {\n await this.listener;\n }\n\n const id = randomId();\n let resolve: (data: any) => void;\n const promise = new Promise((res) => {\n resolve = res;\n });\n\n // @ts-ignore\n this.requestMap.set(id, resolve);\n\n await appWindow.emit(\"plugin:rspc:transport\", {\n id,\n method: operation,\n params: {\n path: key,\n input,\n },\n });\n\n const body = (await promise) as any;\n if (body.type === \"error\") {\n const { code, message } = body;\n throw new RSPCError(code, message);\n } else if (body.type === \"response\") {\n return body.result;\n } else {\n throw new Error(\n `RSPC Tauri doRequest received invalid body type '${body?.type}'`\n );\n }\n }\n}\n"],"mappings":";AAAA,SAAS,UAAoC,iBAAiB;AAC9D,SAAS,cAA0B;AACnC,SAAS,iBAAiB;AAEnB,IAAM,iBAAN,MAA0C;AAAA,EACvC,aAAa,oBAAI,IAAiC;AAAA,EAClD;AAAA,EACR;AAAA,EAEA,cAAc;AACZ,SAAK,WAAW,OAAO,8BAA8B,CAAC,UAAU;AAVpE;AAWM,YAAM,EAAE,IAAI,OAAO,IAAI,MAAM;AAC7B,UAAI,OAAO,SAAS,SAAS;AAC3B,YAAI,KAAK;AACP,eAAK,2BAA2B,IAAI,OAAO,IAAI;AAAA,MACnD,WAAW,OAAO,SAAS,YAAY;AACrC,YAAI,KAAK,WAAW,IAAI,EAAE,GAAG;AAC3B,qBAAK,WAAW,IAAI,EAAE,MAAtB,mBAA0B,EAAE,MAAM,YAAY,QAAQ,OAAO,KAAK;AAClE,eAAK,WAAW,OAAO,EAAE;AAAA,QAC3B;AAAA,MACF,WAAW,OAAO,SAAS,SAAS;AAClC,cAAM,EAAE,SAAS,KAAK,IAAI,OAAO;AACjC,YAAI,KAAK,WAAW,IAAI,EAAE,GAAG;AAC3B,qBAAK,WAAW,IAAI,EAAE,MAAtB,mBAA0B,EAAE,MAAM,SAAS,SAAS,KAAK;AACzD,eAAK,WAAW,OAAO,EAAE;AAAA,QAC3B;AAAA,MACF,OAAO;AACL,gBAAQ,MAAM,qCAAqC,OAAO,IAAI,GAAG;AAAA,MACnE;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UACJ,WACA,KACA,OACc;AACd,QAAI,CAAC,KAAK,UAAU;AAClB,YAAM,KAAK;AAAA,IACb;AAEA,UAAM,KAAK,SAAS;AACpB,QAAI;AACJ,UAAM,UAAU,IAAI,QAAQ,CAAC,QAAQ;AACnC,gBAAU;AAAA,IACZ,CAAC;AAGD,SAAK,WAAW,IAAI,IAAI,OAAO;AAE/B,UAAM,UAAU,KAAK,yBAAyB;AAAA,MAC5C;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,OAAQ,MAAM;AACpB,QAAI,KAAK,SAAS,SAAS;AACzB,YAAM,EAAE,MAAM,QAAQ,IAAI;AAC1B,YAAM,IAAI,UAAU,MAAM,OAAO;AAAA,IACnC,WAAW,KAAK,SAAS,YAAY;AACnC,aAAO,KAAK;AAAA,IACd,OAAO;AACL,YAAM,IAAI;AAAA,QACR,oDAAoD,6BAAM,IAAI;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AACF;","names":[]} +\ No newline at end of file ++{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { randomId, OperationType, Transport, RSPCError } from \"@rspc/client\";\nimport { listen, UnlistenFn } from \"@tauri-apps/api/event\";\nimport { getCurrent } from \"@tauri-apps/api/window\";\n\nexport class TauriTransport implements Transport {\n private requestMap = new Map void>();\n private listener?: Promise;\n clientSubscriptionCallback?: (id: string, value: any) => void;\n\n constructor() {\n this.listener = listen(\"plugin:rspc:transport:resp\", (event) => {\n const { id, result } = event.payload as any;\n if (result.type === \"event\") {\n if (this.clientSubscriptionCallback)\n this.clientSubscriptionCallback(id, result.data);\n } else if (result.type === \"response\") {\n if (this.requestMap.has(id)) {\n this.requestMap.get(id)?.({ type: \"response\", result: result.data });\n this.requestMap.delete(id);\n }\n } else if (result.type === \"error\") {\n const { message, code } = result.data;\n if (this.requestMap.has(id)) {\n this.requestMap.get(id)?.({ type: \"error\", message, code });\n this.requestMap.delete(id);\n }\n } else {\n console.error(`Received event of unknown method '${result.type}'`);\n }\n });\n }\n\n async doRequest(\n operation: OperationType,\n key: string,\n input: any\n ): Promise {\n if (!this.listener) {\n await this.listener;\n }\n\n const id = randomId();\n let resolve: (data: any) => void;\n const promise = new Promise((res) => {\n resolve = res;\n });\n\n // @ts-ignore\n this.requestMap.set(id, resolve);\n\n await getCurrent().emit(\"plugin:rspc:transport\", {\n id,\n method: operation,\n params: {\n path: key,\n input,\n },\n });\n\n const body = (await promise) as any;\n if (body.type === \"error\") {\n const { code, message } = body;\n throw new RSPCError(code, message);\n } else if (body.type === \"response\") {\n return body.result;\n } else {\n throw new Error(\n `RSPC Tauri doRequest received invalid body type '${body?.type}'`\n );\n }\n }\n}\n"],"mappings":";AAAA,SAAS,UAAoC,iBAAiB;AAC9D,SAAS,cAA0B;AACnC,SAAS,kBAAkB;AAEpB,IAAM,iBAAN,MAA0C;AAAA,EACvC,aAAa,oBAAI,IAAiC;AAAA,EAClD;AAAA,EACR;AAAA,EAEA,cAAc;AACZ,SAAK,WAAW,OAAO,8BAA8B,CAAC,UAAU;AAVpE;AAWM,YAAM,EAAE,IAAI,OAAO,IAAI,MAAM;AAC7B,UAAI,OAAO,SAAS,SAAS;AAC3B,YAAI,KAAK;AACP,eAAK,2BAA2B,IAAI,OAAO,IAAI;AAAA,MACnD,WAAW,OAAO,SAAS,YAAY;AACrC,YAAI,KAAK,WAAW,IAAI,EAAE,GAAG;AAC3B,qBAAK,WAAW,IAAI,EAAE,MAAtB,mBAA0B,EAAE,MAAM,YAAY,QAAQ,OAAO,KAAK;AAClE,eAAK,WAAW,OAAO,EAAE;AAAA,QAC3B;AAAA,MACF,WAAW,OAAO,SAAS,SAAS;AAClC,cAAM,EAAE,SAAS,KAAK,IAAI,OAAO;AACjC,YAAI,KAAK,WAAW,IAAI,EAAE,GAAG;AAC3B,qBAAK,WAAW,IAAI,EAAE,MAAtB,mBAA0B,EAAE,MAAM,SAAS,SAAS,KAAK;AACzD,eAAK,WAAW,OAAO,EAAE;AAAA,QAC3B;AAAA,MACF,OAAO;AACL,gBAAQ,MAAM,qCAAqC,OAAO,IAAI,GAAG;AAAA,MACnE;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UACJ,WACA,KACA,OACc;AACd,QAAI,CAAC,KAAK,UAAU;AAClB,YAAM,KAAK;AAAA,IACb;AAEA,UAAM,KAAK,SAAS;AACpB,QAAI;AACJ,UAAM,UAAU,IAAI,QAAQ,CAAC,QAAQ;AACnC,gBAAU;AAAA,IACZ,CAAC;AAGD,SAAK,WAAW,IAAI,IAAI,OAAO;AAE/B,UAAM,WAAW,EAAE,KAAK,yBAAyB;AAAA,MAC/C;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,OAAQ,MAAM;AACpB,QAAI,KAAK,SAAS,SAAS;AACzB,YAAM,EAAE,MAAM,QAAQ,IAAI;AAC1B,YAAM,IAAI,UAAU,MAAM,OAAO;AAAA,IACnC,WAAW,KAAK,SAAS,YAAY;AACnC,aAAO,KAAK;AAAA,IACd,OAAO;AACL,YAAM,IAAI;AAAA,QACR,oDAAoD,6BAAM,IAAI;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AACF;","names":[]} +\ No newline at end of file +diff --git a/package.json b/package.json +index 270887cf93791db63c8b60ed44db12ccd2393f65..9be62429b39828236ddf5e5da7ae1b0697cc591a 100644 +--- a/package.json ++++ b/package.json +@@ -17,6 +17,11 @@ + "files": [ + "dist" + ], ++ "scripts": { ++ "dev": "tsup --watch", ++ "build": "tsup", ++ "prepare": "tsup" ++ }, + "tsup": { + "entry": [ + "src/index.ts" +@@ -33,18 +38,14 @@ + "sourcemap": true + }, + "dependencies": { +- "@rspc/client": "0.2.0" ++ "@rspc/client": "workspace:*" + }, + "devDependencies": { +- "@tauri-apps/api": "^1.5.3", ++ "@tauri-apps/api": "next", + "tsup": "^8.0.2", + "typescript": "^5.4.2" + }, + "peerDependencies": { + "@tauri-apps/api": "^1.2.0" +- }, +- "scripts": { +- "dev": "tsup --watch", +- "build": "tsup" + } + } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c4cde753..e3106ab6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,11 +9,14 @@ importers: .: devDependencies: '@flowr/eslint-config': - specifier: ^3.2.0 - version: 3.2.0(@vue/compiler-sfc@3.4.27)(eslint-plugin-solid@0.14.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(vitest@1.6.0(@types/node@20.12.11)) + specifier: ^3.2.1 + version: 3.2.1(@unocss/eslint-plugin@0.60.1(eslint@8.57.0)(typescript@5.4.5))(@vue/compiler-sfc@3.4.27)(eslint-plugin-solid@0.14.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(vitest@1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0)(jsdom@24.0.0)(sass@1.77.1)) '@types/node': specifier: ^20.12.11 version: 20.12.11 + '@vitest/ui': + specifier: ^1.6.0 + version: 1.6.0(vitest@1.6.0) bumpp: specifier: ^9.4.1 version: 9.4.1 @@ -23,9 +26,48 @@ importers: eslint-plugin-solid: specifier: ^0.14.0 version: 0.14.0(eslint@8.57.0)(typescript@5.4.5) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@20.12.11)(typescript@5.4.5) + tsx: + specifier: ^4.10.0 + version: 4.10.0 typescript: specifier: ^5.4.5 version: 5.4.5 + vite: + specifier: ^5.2.11 + version: 5.2.11(@types/node@20.12.11)(sass@1.77.1) + vitest: + specifier: ^1.6.0 + version: 1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0(vitest@1.6.0))(jsdom@24.0.0)(sass@1.77.1) + + client: + dependencies: + '@rspc/client': + specifier: ^0.2.0 + version: 0.2.0 + '@rspc/tauri': + specifier: ^0.2.0 + version: 0.2.0(@tauri-apps/api@2.0.0-beta.8) + '@solid-primitives/deep': + specifier: ^0.2.8 + version: 0.2.8(solid-js@1.8.17) + '@tanstack/solid-query': + specifier: ^5.35.5 + version: 5.35.5(solid-js@1.8.17) + fast-equals: + specifier: ^5.0.1 + version: 5.0.1 + plausible-tracker: + specifier: ^0.3.8 + version: 0.3.8 + solid-js: + specifier: ^1.8.17 + version: 1.8.17 + zod: + specifier: ^3.23.8 + version: 3.23.8 desktop: dependencies: @@ -35,6 +77,15 @@ importers: '@iconify-json/logos': specifier: ^1.1.42 version: 1.1.42 + '@onelauncher/client': + specifier: workspace:* + version: link:../client + '@rspc/client': + specifier: ^0.2.0 + version: 0.2.0 + '@rspc/tauri': + specifier: ^0.2.0 + version: 0.2.0(@tauri-apps/api@2.0.0-beta.8) '@solid-primitives/refs': specifier: ^1.0.8 version: 1.0.8(solid-js@1.8.17) @@ -80,40 +131,25 @@ importers: version: 2.0.0-beta.10 '@testing-library/jest-dom': specifier: ^6.4.5 - version: 6.4.5(vitest@1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0)(jsdom@24.0.0)(sass@1.77.1)) + version: 6.4.5(vitest@1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0(vitest@1.6.0))(jsdom@24.0.0)(sass@1.77.1)) '@types/uuid': specifier: ^9.0.8 version: 9.0.8 - '@vitest/ui': - specifier: ^1.6.0 - version: 1.6.0(vitest@1.6.0) jsdom: specifier: ^24.0.0 version: 24.0.0 sass: specifier: ^1.77.1 version: 1.77.1 - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@20.12.11)(typescript@5.4.5) - typescript: - specifier: ^5.4.5 - version: 5.4.5 unocss: specifier: ^0.60.0 version: 0.60.0(postcss@8.4.38)(rollup@4.17.2)(vite@5.2.11(@types/node@20.12.11)(sass@1.77.1)) - vite: - specifier: ^5.2.11 - version: 5.2.11(@types/node@20.12.11)(sass@1.77.1) vite-plugin-solid: specifier: ^2.10.2 - version: 2.10.2(@testing-library/jest-dom@6.4.5(vitest@1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0)(jsdom@24.0.0)(sass@1.77.1)))(solid-js@1.8.17)(vite@5.2.11(@types/node@20.12.11)(sass@1.77.1)) + version: 2.10.2(@testing-library/jest-dom@6.4.5(vitest@1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0(vitest@1.6.0))(jsdom@24.0.0)(sass@1.77.1)))(solid-js@1.8.17)(vite@5.2.11(@types/node@20.12.11)(sass@1.77.1)) vite-tsconfig-paths: specifier: ^4.3.2 version: 4.3.2(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.11)(sass@1.77.1)) - vitest: - specifier: ^1.6.0 - version: 1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0)(jsdom@24.0.0)(sass@1.77.1) packages: @@ -336,9 +372,6 @@ packages: resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} engines: {node: '>=6.9.0'} - '@catppuccin/palette@1.1.1': - resolution: {integrity: sha512-wgITbl3OEIUnv8WPTdG2BGjepSMZtJW9V4XpxNDJjCvel0Q5+BxRmKH3XYN0vVjohHR+APCyZCpzSnO+GdsTLg==} - '@clack/core@0.3.4': resolution: {integrity: sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw==} @@ -515,8 +548,8 @@ packages: resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@flowr/eslint-config@3.2.0': - resolution: {integrity: sha512-ILqoMnvD3UWfzV5nSq3NKa/yZHnz7vUCcyFeTNb4Qp4zZUN4+l9vzFNXdW2VlUut3kji0P7r0YBbttg8E3GLhw==} + '@flowr/eslint-config@3.2.1': + resolution: {integrity: sha512-6s9SEQJ1+Bgh7I9E6PZislLVN+CaDtvzvX3eNAVOZeLz6CmHkbrVF5l20vYm8iPF016HV44DQvGKPtHXGQ3H/g==} engines: {node: '>=20'} peerDependencies: '@eslint-react/eslint-plugin': ^1.5.11 @@ -558,8 +591,8 @@ packages: svelte-eslint-parser: optional: true - '@flowr/utils@3.2.0': - resolution: {integrity: sha512-DENpUk/hTPSywoKwkuIkX4xlsJg506suRk2fXQ/62UkwC7MQCdFjo3OpfziaDu5qJqAio5B7uRp4T3D+eSFVUw==} + '@flowr/utils@3.2.1': + resolution: {integrity: sha512-ZwJgiRimVZXm2aCSWhEMy86NwEYDIybe/sEpSQWnKNJKUzBkxttWzL5TysaAVeXDGT9JwOFXG5ipnOq1JYuLnw==} engines: {node: '>=20'} '@fontsource/poppins@5.0.14': @@ -626,6 +659,10 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@polka/url@1.0.0-next.25': resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} @@ -718,14 +755,37 @@ packages: cpu: [x64] os: [win32] + '@rspc/client@0.2.0': + resolution: {integrity: sha512-IIOfAk4g+bzbfr3cmvm42EocsjtzMO9CRCc95ZMx9mFh5ixHzP4Na1lun+KipGzsFV1QsmV6uYSBg/4Kpnu9iA==} + + '@rspc/tauri@0.2.0': + resolution: {integrity: sha512-YULpKSCV/YZLtDRs/poiq3PVW54vMJjIbFZ8PgG+sdyZcujRudpza7xaLrfAHfbo61XdQYz/HP5j/9s5uqXQrA==} + peerDependencies: + '@tauri-apps/api': ^1.2.0 + '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@solid-primitives/deep@0.2.8': + resolution: {integrity: sha512-r+enqrL2oiDkJt7lYUYMVvKzcqVDAd4G/1OkLnXEibk5nIA635qNIuOxIAaCCP3GDAHKznaW3yc/vMG68lo8bQ==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/memo@1.3.8': + resolution: {integrity: sha512-U75pfLFSxFmM2xbx1+2XPPyWbaXrnUFF10spbFuOUgJ7azrC+4y+FnrVi4RKqHw9gftd8aKQuTiyMQq468YLQw==} + peerDependencies: + solid-js: ^1.6.12 + '@solid-primitives/refs@1.0.8': resolution: {integrity: sha512-+jIsWG8/nYvhaCoG2Vg6CJOLgTmPKFbaCrNQKWfChalgUf9WrVxWw0CdJb3yX15n5lUcQ0jBo6qYtuVVmBLpBw==} peerDependencies: solid-js: ^1.6.12 + '@solid-primitives/scheduled@1.4.3': + resolution: {integrity: sha512-HfWN5w7b7FEc6VPLBKnnE302h90jsLMuR28Fcf7neRGGf8jBj6wm6/UFQ00VlKexHFMR6KQ2u4VBh5a1ZcqM8g==} + peerDependencies: + solid-js: ^1.6.12 + '@solid-primitives/transition-group@1.0.5': resolution: {integrity: sha512-G3FuqvL13kQ55WzWPX2ewiXdZ/1iboiX53195sq7bbkDbXqP6TYKiadwEdsaDogW5rPnPYAym3+xnsNplQJRKQ==} peerDependencies: @@ -780,6 +840,14 @@ packages: peerDependencies: eslint: '>=8.40.0' + '@tanstack/query-core@5.35.5': + resolution: {integrity: sha512-OMWvlEqG01RfGj+XZb/piDzPp0eZkkHWSDHt2LvE/fd1zWburP/xwm0ghk6Iv8cuPlP+ACFkZviKXK0OVt6lhg==} + + '@tanstack/solid-query@5.35.5': + resolution: {integrity: sha512-Suhtcq9x4HMac22wrl3hvDq/W8Lf/rTtyOWrS/mXYyEeQw9dZJ7NmGYA+uTI5pl4OeasPMRTVZymlkBdHlqJog==} + peerDependencies: + solid-js: ^1.6.0 + '@tauri-apps/api@2.0.0-beta.8': resolution: {integrity: sha512-fN5u+9HsSfhRaXGOdD2kPGbqDgyX+nkm1XF/4d/LNuM4WiNfvHjjRAqWQYBhQsg1aF9nsTPmSW+tmy+Yn5T5+A==} engines: {node: '>= 18', npm: '>= 6.6.0', yarn: '>= 1.19.1'} @@ -1042,9 +1110,20 @@ packages: resolution: {integrity: sha512-y8zTM/qhZ5p2zhtgjsqL4BDjDXes1i72kNts/A85adNTx9ffZG+0dbrH2DLoBKp6aAb51AOo5OcG5cllSbNrDQ==} engines: {node: '>=14'} + '@unocss/config@0.60.1': + resolution: {integrity: sha512-9moB8hgEfJ5q7W8w40dANbdFZRlJdJbCIzTraUwpiTWjzYdct8XPNYmyterVt0LZ8b85LOk14PKPXjp1IiksSw==} + engines: {node: '>=14'} + '@unocss/core@0.60.0': resolution: {integrity: sha512-i1j5i/4xiCfogobaOdQCQUEy/Ch8mBtKgpfUIreJtElaF15uIjT2t/G0y7qUz87ZNl+wJoPcWkcSC92HVnjXwg==} + '@unocss/core@0.60.1': + resolution: {integrity: sha512-Ks+BZeJRlH+51sHfxZMYwlRnAy6Kl0nZGfhrU7NRjWCN9QhQDx99zRoo9mqOAZyT16Sj731j6+T0tT0pXHxpkg==} + + '@unocss/eslint-plugin@0.60.1': + resolution: {integrity: sha512-vH+j/qpLo07CCDFq4FtZdalMi39MNOcIxcNhseNp2TIIpkHef9s6J8m+FfuvH4lyFOeN1FR2x3s4Dbtp4uPyMw==} + engines: {node: '>=14'} + '@unocss/extractor-arbitrary-variants@0.60.0': resolution: {integrity: sha512-f6o2KsCP+BYzYRjeBkjiquh5eM1oRv/wNu1a1triNk9pmmD3nUWRY0ImaXRkSbgHpAjVEDloOpqPdMTO408ePg==} @@ -1171,18 +1250,10 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ansi-escapes@6.2.1: - resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} - engines: {node: '>=14.16'} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -1195,10 +1266,6 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -1317,10 +1384,6 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - character-entities-legacy@1.1.4: resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} @@ -1352,10 +1415,6 @@ packages: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} engines: {node: '>=4'} - cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -1511,9 +1570,6 @@ packages: electron-to-chromium@1.4.745: resolution: {integrity: sha512-tRbzkaRI5gbUn5DEvF0dV4TQbMZ5CLkWeTAXmpC9IrYT+GE+x76i9p+o3RJ5l9XmdQlI1pPhVtE9uNcJJ0G0EA==} - emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} - enhanced-resolve@5.16.1: resolution: {integrity: sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==} engines: {node: '>=10.13.0'} @@ -1642,8 +1698,8 @@ packages: vue-eslint-parser: optional: true - eslint-plugin-petal@3.2.0: - resolution: {integrity: sha512-teo5SNQoA7q+YmHLsHp0WZ1A8PiKWbY/N/kpZCi/xI285rYNuL8LdYAyGGzRWuJBzmEHrFdhrUPVittbAiRsoA==} + eslint-plugin-petal@3.2.1: + resolution: {integrity: sha512-dFFPyz3jMiRuTee0L8SDl7fXc4oVPC2AgVquVTRQtc0WO+3FkiCt0STrwkSR/GwybPtEcQRzkE6taTemnAKYYw==} engines: {node: '>=20'} peerDependencies: eslint: '*' @@ -1769,6 +1825,10 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-equals@5.0.1: + resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} + engines: {node: '>=6.0.0'} + fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -1841,10 +1901,6 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - get-east-asian-width@1.2.0: - resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} - engines: {node: '>=18'} - get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} @@ -2060,10 +2116,6 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-fullwidth-code-point@5.0.0: - resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} - engines: {node: '>=18'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -2243,10 +2295,6 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - log-update@6.0.0: - resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} - engines: {node: '>=18'} - loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} @@ -2546,6 +2594,10 @@ packages: pkg-types@1.1.0: resolution: {integrity: sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==} + plausible-tracker@0.3.8: + resolution: {integrity: sha512-lmOWYQ7s9KOUJ1R+YTOR3HrjdbxIS2Z4de0P/Jx2dQPteznJl2eX3tXxKClpvbfyGP59B5bbhW8ftN59HbbFSg==} + engines: {node: '>=10'} + pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -2645,10 +2697,6 @@ packages: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true - restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -2751,10 +2799,6 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - slice-ansi@7.1.0: - resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} - engines: {node: '>=18'} - solid-js@1.8.17: resolution: {integrity: sha512-E0FkUgv9sG/gEBWkHr/2XkBluHb1fkrHywUgA6o6XolPDCJ4g1HaLmQufcBBhiF36ee40q+HpG/vCZu7fLpI3Q==} @@ -2802,18 +2846,10 @@ packages: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} - string-width@7.1.0: - resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} - engines: {node: '>=18'} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -2855,6 +2891,10 @@ packages: resolution: {integrity: sha512-Vhf+bUa//YSTYKseDiiEuQmhGCoIF3CVBhunm3r/DQnYiGT4JssmnKQc44BIyOZRK2pKjXXAgbhfmbeoC9CJpA==} engines: {node: '>=12.20'} + synckit@0.9.0: + resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==} + engines: {node: ^14.18.0 || >=16.0.0} + tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -2869,9 +2909,6 @@ packages: tinybench@2.8.0: resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} - tinycolor2@1.6.0: - resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - tinypool@0.8.4: resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} engines: {node: '>=14.0.0'} @@ -2937,8 +2974,10 @@ packages: tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - tweetnacl@1.0.3: - resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + tsx@4.10.0: + resolution: {integrity: sha512-Ct/j4Yv49EFlr1z5CT++ld+BUhjLRLtimE4hIDaW9zEVIp3xJOQdTDAan+KEXeme7GcYIGzFD421Zcqf9dHomw==} + engines: {node: '>=18.0.0'} + hasBin: true type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -3161,10 +3200,6 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} - engines: {node: '>=18'} - wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -3218,6 +3253,9 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + snapshots: '@adobe/css-tools@4.3.3': {} @@ -3530,8 +3568,6 @@ snapshots: '@babel/helper-validator-identifier': 7.24.5 to-fast-properties: 2.0.0 - '@catppuccin/palette@1.1.1': {} - '@clack/core@0.3.4': dependencies: picocolors: 1.0.0 @@ -3662,7 +3698,7 @@ snapshots: '@eslint/js@8.57.0': {} - '@flowr/eslint-config@3.2.0(@vue/compiler-sfc@3.4.27)(eslint-plugin-solid@0.14.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(vitest@1.6.0(@types/node@20.12.11))': + '@flowr/eslint-config@3.2.1(@unocss/eslint-plugin@0.60.1(eslint@8.57.0)(typescript@5.4.5))(@vue/compiler-sfc@3.4.27)(eslint-plugin-solid@0.14.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(vitest@1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0)(jsdom@24.0.0)(sass@1.77.1))': dependencies: '@antfu/install-pkg': 0.3.3 '@clack/prompts': 0.7.0 @@ -3682,11 +3718,11 @@ snapshots: eslint-plugin-n: 17.6.0(eslint@8.57.0) eslint-plugin-no-only-tests: 3.1.0 eslint-plugin-perfectionist: 2.10.0(eslint@8.57.0)(typescript@5.4.5)(vue-eslint-parser@9.4.2(eslint@8.57.0)) - eslint-plugin-petal: 3.2.0(eslint@8.57.0) + eslint-plugin-petal: 3.2.1(eslint@8.57.0) eslint-plugin-toml: 0.11.0(eslint@8.57.0) eslint-plugin-unicorn: 53.0.0(eslint@8.57.0) eslint-plugin-unused-imports: 3.2.0(@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0) - eslint-plugin-vitest: 0.5.4(@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)(vitest@1.6.0(@types/node@20.12.11)) + eslint-plugin-vitest: 0.5.4(@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)(vitest@1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0)(jsdom@24.0.0)(sass@1.77.1)) eslint-plugin-vue: 9.26.0(eslint@8.57.0) eslint-plugin-yml: 1.14.0(eslint@8.57.0) eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.4.27)(eslint@8.57.0) @@ -3698,6 +3734,7 @@ snapshots: vue-eslint-parser: 9.4.2(eslint@8.57.0) yaml-eslint-parser: 1.2.2 optionalDependencies: + '@unocss/eslint-plugin': 0.60.1(eslint@8.57.0)(typescript@5.4.5) eslint-plugin-solid: 0.14.0(eslint@8.57.0)(typescript@5.4.5) transitivePeerDependencies: - '@vue/compiler-sfc' @@ -3705,17 +3742,11 @@ snapshots: - svelte - vitest - '@flowr/utils@3.2.0': + '@flowr/utils@3.2.1': dependencies: - '@catppuccin/palette': 1.1.1 - chalk: 5.3.0 - log-update: 6.0.0 luxon: 3.4.4 - semver: 7.6.2 + pathe: 1.1.2 serialize-error: 11.0.3 - sisteransi: 1.0.5 - tinycolor2: 1.6.0 - tweetnacl: 1.0.3 '@fontsource/poppins@5.0.14': {} @@ -3794,6 +3825,9 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@pkgr/core@0.1.1': + optional: true + '@polka/url@1.0.0-next.25': {} '@rollup/pluginutils@5.1.0(rollup@4.17.2)': @@ -3852,13 +3886,35 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.17.2': optional: true + '@rspc/client@0.2.0': {} + + '@rspc/tauri@0.2.0(@tauri-apps/api@2.0.0-beta.8)': + dependencies: + '@rspc/client': 0.2.0 + '@tauri-apps/api': 2.0.0-beta.8 + '@sinclair/typebox@0.27.8': {} + '@solid-primitives/deep@0.2.8(solid-js@1.8.17)': + dependencies: + '@solid-primitives/memo': 1.3.8(solid-js@1.8.17) + solid-js: 1.8.17 + + '@solid-primitives/memo@1.3.8(solid-js@1.8.17)': + dependencies: + '@solid-primitives/scheduled': 1.4.3(solid-js@1.8.17) + '@solid-primitives/utils': 6.2.3(solid-js@1.8.17) + solid-js: 1.8.17 + '@solid-primitives/refs@1.0.8(solid-js@1.8.17)': dependencies: '@solid-primitives/utils': 6.2.3(solid-js@1.8.17) solid-js: 1.8.17 + '@solid-primitives/scheduled@1.4.3(solid-js@1.8.17)': + dependencies: + solid-js: 1.8.17 + '@solid-primitives/transition-group@1.0.5(solid-js@1.8.17)': dependencies: solid-js: 1.8.17 @@ -3925,6 +3981,13 @@ snapshots: - supports-color - typescript + '@tanstack/query-core@5.35.5': {} + + '@tanstack/solid-query@5.35.5(solid-js@1.8.17)': + dependencies: + '@tanstack/query-core': 5.35.5 + solid-js: 1.8.17 + '@tauri-apps/api@2.0.0-beta.8': {} '@tauri-apps/cli-darwin-arm64@2.0.0-beta.10': @@ -3985,7 +4048,7 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.4.5(vitest@1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0)(jsdom@24.0.0)(sass@1.77.1))': + '@testing-library/jest-dom@6.4.5(vitest@1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0(vitest@1.6.0))(jsdom@24.0.0)(sass@1.77.1))': dependencies: '@adobe/css-tools': 4.3.3 '@babel/runtime': 7.24.5 @@ -3996,7 +4059,7 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 optionalDependencies: - vitest: 1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0)(jsdom@24.0.0)(sass@1.77.1) + vitest: 1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0(vitest@1.6.0))(jsdom@24.0.0)(sass@1.77.1) '@thisbeyond/solid-dnd@0.7.5(solid-js@1.8.17)': dependencies: @@ -4220,8 +4283,30 @@ snapshots: '@unocss/core': 0.60.0 unconfig: 0.3.13 + '@unocss/config@0.60.1': + dependencies: + '@unocss/core': 0.60.1 + unconfig: 0.3.13 + optional: true + '@unocss/core@0.60.0': {} + '@unocss/core@0.60.1': + optional: true + + '@unocss/eslint-plugin@0.60.1(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) + '@unocss/config': 0.60.1 + '@unocss/core': 0.60.1 + magic-string: 0.30.10 + synckit: 0.9.0 + transitivePeerDependencies: + - eslint + - supports-color + - typescript + optional: true + '@unocss/extractor-arbitrary-variants@0.60.0': dependencies: '@unocss/core': 0.60.0 @@ -4375,7 +4460,7 @@ snapshots: pathe: 1.1.2 picocolors: 1.0.0 sirv: 2.0.4 - vitest: 1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0)(jsdom@24.0.0)(sass@1.77.1) + vitest: 1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0(vitest@1.6.0))(jsdom@24.0.0)(sass@1.77.1) '@vitest/utils@1.6.0': dependencies: @@ -4437,12 +4522,8 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ansi-escapes@6.2.1: {} - ansi-regex@5.0.1: {} - ansi-regex@6.0.1: {} - ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 @@ -4453,8 +4534,6 @@ snapshots: ansi-styles@5.2.0: {} - ansi-styles@6.2.1: {} - anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -4599,8 +4678,6 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.3.0: {} - character-entities-legacy@1.1.4: {} character-entities@1.2.4: {} @@ -4635,10 +4712,6 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 - cli-cursor@4.0.0: - dependencies: - restore-cursor: 4.0.0 - color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -4778,8 +4851,6 @@ snapshots: electron-to-chromium@1.4.745: {} - emoji-regex@10.3.0: {} - enhanced-resolve@5.16.1: dependencies: graceful-fs: 4.2.11 @@ -4959,9 +5030,9 @@ snapshots: - supports-color - typescript - eslint-plugin-petal@3.2.0(eslint@8.57.0): + eslint-plugin-petal@3.2.1(eslint@8.57.0): dependencies: - '@flowr/utils': 3.2.0 + '@flowr/utils': 3.2.1 eslint: 8.57.0 eslint-plugin-solid@0.14.0(eslint@8.57.0)(typescript@5.4.5): @@ -5016,13 +5087,13 @@ snapshots: optionalDependencies: '@typescript-eslint/eslint-plugin': 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) - eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)(vitest@1.6.0(@types/node@20.12.11)): + eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)(vitest@1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0)(jsdom@24.0.0)(sass@1.77.1)): dependencies: '@typescript-eslint/utils': 7.8.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 optionalDependencies: '@typescript-eslint/eslint-plugin': 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) - vitest: 1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0)(jsdom@24.0.0)(sass@1.77.1) + vitest: 1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0(vitest@1.6.0))(jsdom@24.0.0)(sass@1.77.1) transitivePeerDependencies: - supports-color - typescript @@ -5167,6 +5238,8 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-equals@5.0.1: {} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -5242,8 +5315,6 @@ snapshots: gensync@1.0.0-beta.2: {} - get-east-asian-width@1.2.0: {} - get-func-name@2.0.2: {} get-intrinsic@1.2.4: @@ -5455,10 +5526,6 @@ snapshots: is-extglob@2.1.1: {} - is-fullwidth-code-point@5.0.0: - dependencies: - get-east-asian-width: 1.2.0 - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -5620,14 +5687,6 @@ snapshots: lodash@4.17.21: {} - log-update@6.0.0: - dependencies: - ansi-escapes: 6.2.1 - cli-cursor: 4.0.0 - slice-ansi: 7.1.0 - strip-ansi: 7.1.0 - wrap-ansi: 9.0.0 - loupe@2.3.7: dependencies: get-func-name: 2.0.2 @@ -5918,6 +5977,8 @@ snapshots: mlly: 1.6.1 pathe: 1.1.2 + plausible-tracker@0.3.8: {} + pluralize@8.0.0: {} possible-typed-array-names@1.0.0: {} @@ -6018,11 +6079,6 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - restore-cursor@4.0.0: - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - reusify@1.0.4: {} rimraf@3.0.2: @@ -6134,11 +6190,6 @@ snapshots: slash@3.0.0: {} - slice-ansi@7.1.0: - dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 5.0.0 - solid-js@1.8.17: dependencies: csstype: 3.1.3 @@ -6189,20 +6240,10 @@ snapshots: string-argv@0.3.2: {} - string-width@7.1.0: - dependencies: - emoji-regex: 10.3.0 - get-east-asian-width: 1.2.0 - strip-ansi: 7.1.0 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.0.1 - strip-final-newline@2.0.0: {} strip-final-newline@3.0.0: {} @@ -6237,6 +6278,12 @@ snapshots: dependencies: tslib: 2.6.2 + synckit@0.9.0: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.6.2 + optional: true + tapable@2.2.1: {} tar@6.2.1: @@ -6252,8 +6299,6 @@ snapshots: tinybench@2.8.0: {} - tinycolor2@1.6.0: {} - tinypool@0.8.4: {} tinyspy@2.2.1: {} @@ -6309,7 +6354,12 @@ snapshots: tslib@2.6.2: {} - tweetnacl@1.0.3: {} + tsx@4.10.0: + dependencies: + esbuild: 0.20.2 + get-tsconfig: 4.7.5 + optionalDependencies: + fsevents: 2.3.3 type-check@0.4.0: dependencies: @@ -6419,7 +6469,7 @@ snapshots: - supports-color - terser - vite-plugin-solid@2.10.2(@testing-library/jest-dom@6.4.5(vitest@1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0)(jsdom@24.0.0)(sass@1.77.1)))(solid-js@1.8.17)(vite@5.2.11(@types/node@20.12.11)(sass@1.77.1)): + vite-plugin-solid@2.10.2(@testing-library/jest-dom@6.4.5(vitest@1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0(vitest@1.6.0))(jsdom@24.0.0)(sass@1.77.1)))(solid-js@1.8.17)(vite@5.2.11(@types/node@20.12.11)(sass@1.77.1)): dependencies: '@babel/core': 7.24.4 '@types/babel__core': 7.20.5 @@ -6430,7 +6480,7 @@ snapshots: vite: 5.2.11(@types/node@20.12.11)(sass@1.77.1) vitefu: 0.2.5(vite@5.2.11(@types/node@20.12.11)(sass@1.77.1)) optionalDependencies: - '@testing-library/jest-dom': 6.4.5(vitest@1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0)(jsdom@24.0.0)(sass@1.77.1)) + '@testing-library/jest-dom': 6.4.5(vitest@1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0(vitest@1.6.0))(jsdom@24.0.0)(sass@1.77.1)) transitivePeerDependencies: - supports-color @@ -6459,7 +6509,7 @@ snapshots: optionalDependencies: vite: 5.2.11(@types/node@20.12.11)(sass@1.77.1) - vitest@1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0)(jsdom@24.0.0)(sass@1.77.1): + vitest@1.6.0(@types/node@20.12.11)(@vitest/ui@1.6.0(vitest@1.6.0))(jsdom@24.0.0)(sass@1.77.1): dependencies: '@vitest/expect': 1.6.0 '@vitest/runner': 1.6.0 @@ -6558,12 +6608,6 @@ snapshots: word-wrap@1.2.5: {} - wrap-ansi@9.0.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 7.1.0 - strip-ansi: 7.1.0 - wrappy@1.0.2: {} ws@8.17.0: {} @@ -6591,3 +6635,5 @@ snapshots: yocto-queue@0.1.0: {} yocto-queue@1.0.0: {} + + zod@3.23.8: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 4ea7bcff..52e65436 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,2 +1,3 @@ packages: - desktop + - client diff --git a/tsconfig.json b/tsconfig.json index e0b2b767..e1ef8bed 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,3 +1,6 @@ { - "extends": "./tsconfig.base.json" + "extends": "./tsconfig.base.json", + "compilerOptions": { + "types": ["vitest/globals", "vite/client"] + } }