From b589d495633d4f95783ffabe0aaf20e7838169b1 Mon Sep 17 00:00:00 2001 From: amrbashir Date: Tue, 6 Jun 2023 20:36:50 +0300 Subject: [PATCH 1/3] feat(os): refactor and improvemnts --- .changes/os-plugin-refactor.md | 11 +++++ Cargo.lock | 17 ++++++-- plugins/os/Cargo.toml | 1 + plugins/os/guest-js/index.ts | 59 ++++++++++++++++----------- plugins/os/src/commands.rs | 20 +++++++--- plugins/os/src/lib.rs | 73 +++++++++++++++++++++------------- 6 files changed, 122 insertions(+), 59 deletions(-) create mode 100644 .changes/os-plugin-refactor.md diff --git a/.changes/os-plugin-refactor.md b/.changes/os-plugin-refactor.md new file mode 100644 index 0000000000..63cd5bdddc --- /dev/null +++ b/.changes/os-plugin-refactor.md @@ -0,0 +1,11 @@ +--- +"os": minor +"os-js": minor +--- + +The os plugin is recieving a few changes to improve consistency and add new features: + +- Renamed `Kind` enum to `OsType` and `kind()` function to `os_type()`. +- Added `family()`,`exe_extension()`, and `hostname()` functions and their equivalents for JS. +- Removed `tempdir()` function and its equivalent on JS, use `std::env::temp_dir` instead of `temp_dir` from `tauri::path::PathResolver::temp_dir` and `path.tempDir` on JS. +- Modified `platform()` implementation to return `windows` instead of `win32` and `macos` instead of `darwin` to align with Rust's `std::env::consts::OS` diff --git a/Cargo.lock b/Cargo.lock index 5fe1883972..5fb1c522f1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -206,7 +206,7 @@ checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" [[package]] name = "api" -version = "2.0.0-alpha.0" +version = "2.0.0-alpha.1" dependencies = [ "log", "serde", @@ -1854,6 +1854,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "gethostname" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" +dependencies = [ + "libc", + "windows-targets 0.48.0", +] + [[package]] name = "getrandom" version = "0.1.16" @@ -5263,7 +5273,7 @@ dependencies = [ [[package]] name = "tauri-plugin-notification" -version = "2.0.0-alpha.0" +version = "2.0.0-alpha.1" dependencies = [ "log", "notify-rust", @@ -5283,6 +5293,7 @@ dependencies = [ name = "tauri-plugin-os" version = "2.0.0-alpha.0" dependencies = [ + "gethostname 0.4.3", "log", "os_info", "serde", @@ -6886,7 +6897,7 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "592b4883219f345e712b3209c62654ebda0bb50887f330cbd018d0f654bfd507" dependencies = [ - "gethostname", + "gethostname 0.2.3", "nix 0.24.3", "winapi", "winapi-wsapoll", diff --git a/plugins/os/Cargo.toml b/plugins/os/Cargo.toml index 2890d54011..ef2f8a6d7c 100644 --- a/plugins/os/Cargo.toml +++ b/plugins/os/Cargo.toml @@ -14,3 +14,4 @@ log = { workspace = true } thiserror = { workspace = true } os_info = "3" sys-locale = "0.3" +gethostname = "0.4" diff --git a/plugins/os/guest-js/index.ts b/plugins/os/guest-js/index.ts index 2b4806b209..60ff116047 100644 --- a/plugins/os/guest-js/index.ts +++ b/plugins/os/guest-js/index.ts @@ -16,7 +16,7 @@ declare global { type Platform = | "linux" - | "darwin" + | "macos" | "ios" | "freebsd" | "dragonfly" @@ -24,9 +24,9 @@ type Platform = | "openbsd" | "solaris" | "android" - | "win32"; + | "windows"; -type OsType = "Linux" | "Darwin" | "Windows_NT"; +type OsType = "linux" | "windows" | "macss" | "ios" | "android"; type Arch = | "x86" @@ -55,8 +55,9 @@ function isWindows(): boolean { const EOL = isWindows() ? "\r\n" : "\n"; /** - * Returns a string identifying the operating system platform. - * The value is set at compile time. Possible values are `'linux'`, `'darwin'`, `'ios'`, `'freebsd'`, `'dragonfly'`, `'netbsd'`, `'openbsd'`, `'solaris'`, `'android'`, `'win32'` + * Returns a string describing the specific operating system in use. + * The value is set at compile time. Possible values are `'linux'`, `'macos'`, `'ios'`, `'freebsd'`, `'dragonfly'`, `'netbsd'`, `'openbsd'`, `'solaris'`, `'android'`, `'windows'` + * * @example * ```typescript * import { platform } from '@tauri-apps/plugin-os'; @@ -71,7 +72,7 @@ async function platform(): Promise { } /** - * Returns a string identifying the kernel version. + * Returns the current operating system version. * @example * ```typescript * import { version } from '@tauri-apps/plugin-os'; @@ -85,7 +86,7 @@ async function version(): Promise { } /** - * Returns `'Linux'` on Linux, `'Darwin'` on macOS, and `'Windows_NT'` on Windows. + * Returns the current operating system type. Returns `'linux'` on Linux, `'macos'` on macOS, `'windows'` on Windows, `'ios'` on iOS and `'android'` on Android. * @example * ```typescript * import { type } from '@tauri-apps/plugin-os'; @@ -95,11 +96,11 @@ async function version(): Promise { * @since 2.0.0 */ async function type(): Promise { - return window.__TAURI_INVOKE__("plugin:os|kind"); + return window.__TAURI_INVOKE__("plugin:os|os_type"); } /** - * Returns the operating system CPU architecture for which the tauri app was compiled. + * Returns the current operating system architecture. * Possible values are `'x86'`, `'x86_64'`, `'arm'`, `'aarch64'`, `'mips'`, `'mips64'`, `'powerpc'`, `'powerpc64'`, `'riscv64'`, `'s390x'`, `'sparc64'`. * @example * ```typescript @@ -114,35 +115,47 @@ async function arch(): Promise { } /** - * Returns the operating system's default directory for temporary files as a string. + * Returns a String with a `BCP-47` language tag inside. If the locale couldn’t be obtained, `null` is returned instead. * @example * ```typescript - * import { tempdir } from '@tauri-apps/plugin-os'; - * const tempdirPath = await tempdir(); + * import { locale } from '@tauri-apps/plugin-os'; + * const locale = await locale(); + * if (locale) { + * // use the locale string here + * } * ``` * * @since 2.0.0 */ -async function tempdir(): Promise { - return window.__TAURI_INVOKE__("plugin:os|tempdir"); +async function locale(): Promise { + return window.__TAURI_INVOKE__("plugin:os|locale"); } /** - * Returns a String with a `BCP-47` language tag inside. If the locale couldn’t be obtained, `null` is returned instead. + * Returns the file extension, if any, used for executable binaries on this platform. Possible values are `'exe'` and `''` (empty string). * @example * ```typescript - * import { locale } from '@tauri-apps/plugin-os'; - * const locale = await locale(); - * if (locale) { - * // use the locale string here - * } + * import { exeExtension } from '@tauri-apps/plugin-os'; + * const exeExt = await exeExtension(); * ``` * * @since 2.0.0 */ -async function locale(): Promise { - return window.__TAURI_INVOKE__("plugin:os|locale"); +async function exeExtension(): Promise { + return window.__TAURI_INVOKE__("plugin:os|exe_extension"); +} + +/** + * Returns the host name of the operating system. + * @example + * ```typescript + * import { hostname } from '@tauri-apps/api/os'; + * const hostname = await hostname(); + * ``` + */ +async function hostname(): Promise { + return window.__TAURI_INVOKE__("plugin:os|hostname"); } -export { EOL, platform, version, type, arch, tempdir, locale }; +export { EOL, platform, version, type, arch, locale, exeExtension, hostname }; export type { Platform, OsType, Arch }; diff --git a/plugins/os/src/commands.rs b/plugins/os/src/commands.rs index 668fa82a4d..fdfa09a002 100644 --- a/plugins/os/src/commands.rs +++ b/plugins/os/src/commands.rs @@ -2,8 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: MIT -use std::path::PathBuf; - #[tauri::command] pub fn platform() -> &'static str { crate::platform() @@ -15,8 +13,13 @@ pub fn version() -> String { } #[tauri::command] -pub fn kind() -> String { - crate::kind().to_string() +pub fn os_type() -> String { + crate::type_().to_string() +} + +#[tauri::command] +pub fn family() -> &'static str { + crate::family() } #[tauri::command] @@ -25,11 +28,16 @@ pub fn arch() -> &'static str { } #[tauri::command] -pub fn tempdir() -> PathBuf { - crate::tempdir() +pub fn exe_extension() -> &'static str { + crate::exe_extension() } #[tauri::command] pub fn locale() -> Option { crate::locale() } + +#[tauri::command] +pub fn hostname() -> String { + crate::hostname() +} diff --git a/plugins/os/src/lib.rs b/plugins/os/src/lib.rs index 4060c679ab..ccbbdfef41 100644 --- a/plugins/os/src/lib.rs +++ b/plugins/os/src/lib.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: MIT -use std::{fmt::Display, path::PathBuf}; +use std::fmt::Display; pub use os_info::Version; use tauri::{ @@ -15,74 +15,93 @@ mod error; pub use error::Error; -pub enum Kind { +pub enum OsType { Linux, Windows, - Darwin, + Macos, IOS, Android, } -impl Display for Kind { +impl Display for OsType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - Self::Linux => write!(f, "Linux"), - Self::Windows => write!(f, "Linux_NT"), - Self::Darwin => write!(f, "Darwin"), - Self::IOS => write!(f, "iOS"), - Self::Android => write!(f, "Android"), + Self::Linux => write!(f, "linux"), + Self::Windows => write!(f, "windows"), + Self::Macos => write!(f, "macos"), + Self::IOS => write!(f, "ios"), + Self::Android => write!(f, "android"), } } } +/// Returns a string describing the specific operating system in use, see [std::env::consts::OS]. pub fn platform() -> &'static str { - match std::env::consts::OS { - "windows" => "win32", - "macos" => "darwin", - _ => std::env::consts::OS, - } + std::env::consts::OS } +/// Returns the current operating system version. pub fn version() -> Version { os_info::get().version().clone() } -pub fn kind() -> Kind { - #[cfg(target_os = "linux")] - return Kind::Linux; +/// Returns the current operating system type. +pub fn type_() -> OsType { + #[cfg(any( + target_os = "linux", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", + target_os = "openbsd" + ))] + return OsType::Linux; #[cfg(target_os = "windows")] - return Kind::Windows; + return OsType::Windows; #[cfg(target_os = "macos")] - return Kind::Darwin; + return OsType::Macos; #[cfg(target_os = "ios")] - return Kind::IOS; + return OsType::IOS; #[cfg(target_os = "android")] - return Kind::Android; + return OsType::Android; +} + +/// Returns the current operating system family, see [std::env::consts::FAMILY]. +pub fn family() -> &'static str { + std::env::consts::FAMILY } +/// Returns the current operating system architecture, see [std::env::consts::ARCH]. pub fn arch() -> &'static str { std::env::consts::ARCH } -pub fn tempdir() -> PathBuf { - std::env::temp_dir() +/// Returns the file extension, if any, used for executable binaries on this platform. Example value is `exe`, see [std::env::consts::EXE_EXTENSION]. +pub fn exe_extension() -> &'static str { + std::env::consts::EXE_EXTENSION } -/// Returns the locale with the `BCP-47` language tag. If the locale couldn’t be obtained, `None` is returned instead. +/// Returns the current operating system locale with the `BCP-47` language tag. If the locale couldn’t be obtained, `None` is returned instead. pub fn locale() -> Option { sys_locale::get_locale() } +/// Returns the current operating system hostname. +pub fn hostname() -> String { + gethostname::gethostname().to_string_lossy().to_string() +} + pub fn init() -> TauriPlugin { Builder::new("os") .js_init_script(include_str!("api-iife.js").to_string()) .invoke_handler(tauri::generate_handler![ commands::platform, commands::version, - commands::kind, + commands::os_type, + commands::family, commands::arch, - commands::tempdir, - commands::locale + commands::exe_extension, + commands::locale, + commands::hostname ]) .build() } From f2100f5bd6a5532190c6dbfb5ee8ffd8713039e7 Mon Sep 17 00:00:00 2001 From: amrbashir Date: Tue, 6 Jun 2023 20:38:46 +0300 Subject: [PATCH 2/3] format and iife file --- plugins/os/src/api-iife.js | 2 +- plugins/stronghold/guest-js/index.ts | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/plugins/os/src/api-iife.js b/plugins/os/src/api-iife.js index 3e754051b8..d22be7a27e 100644 --- a/plugins/os/src/api-iife.js +++ b/plugins/os/src/api-iife.js @@ -1 +1 @@ -if("__TAURI__"in window){var __TAURI_OS__=function(n){"use strict";const _=navigator.appVersion.includes("Win")?"\r\n":"\n";return n.EOL=_,n.arch=async function(){return window.__TAURI_INVOKE__("plugin:os|arch")},n.locale=async function(){return window.__TAURI_INVOKE__("plugin:os|locale")},n.platform=async function(){return window.__TAURI_INVOKE__("plugin:os|platform")},n.tempdir=async function(){return window.__TAURI_INVOKE__("plugin:os|tempdir")},n.type=async function(){return window.__TAURI_INVOKE__("plugin:os|kind")},n.version=async function(){return window.__TAURI_INVOKE__("plugin:os|version")},n}({});Object.defineProperty(window.__TAURI__,"os",{value:__TAURI_OS__})} +if("__TAURI__"in window){var __TAURI_OS__=function(n){"use strict";const _=navigator.appVersion.includes("Win")?"\r\n":"\n";return n.EOL=_,n.arch=async function(){return window.__TAURI_INVOKE__("plugin:os|arch")},n.exeExtension=async function(){return window.__TAURI_INVOKE__("plugin:os|exe_extension")},n.hostname=async function(){return window.__TAURI_INVOKE__("plugin:os|hostname")},n.locale=async function(){return window.__TAURI_INVOKE__("plugin:os|locale")},n.platform=async function(){return window.__TAURI_INVOKE__("plugin:os|platform")},n.type=async function(){return window.__TAURI_INVOKE__("plugin:os|os_type")},n.version=async function(){return window.__TAURI_INVOKE__("plugin:os|version")},n}({});Object.defineProperty(window.__TAURI__,"os",{value:__TAURI_OS__})} diff --git a/plugins/stronghold/guest-js/index.ts b/plugins/stronghold/guest-js/index.ts index 933543dc44..1b28f4f1bc 100644 --- a/plugins/stronghold/guest-js/index.ts +++ b/plugins/stronghold/guest-js/index.ts @@ -436,10 +436,12 @@ export class Stronghold { * @returns */ static async load(path: string, password: string): Promise { - return await window.__TAURI_INVOKE__("plugin:stronghold|initialize", { - snapshotPath: path, - password, - }).then(() => new Stronghold(path)); + return await window + .__TAURI_INVOKE__("plugin:stronghold|initialize", { + snapshotPath: path, + password, + }) + .then(() => new Stronghold(path)); } /** From 7cfaa5dd4835604d8e6ea419edbab470b03c8b9b Mon Sep 17 00:00:00 2001 From: amrbashir Date: Tue, 6 Jun 2023 20:58:14 +0300 Subject: [PATCH 3/3] add family function to js --- plugins/os/guest-js/index.ts | 30 ++++++++++++++++++++++++++++-- plugins/os/src/api-iife.js | 2 +- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/plugins/os/guest-js/index.ts b/plugins/os/guest-js/index.ts index 60ff116047..2b94895df7 100644 --- a/plugins/os/guest-js/index.ts +++ b/plugins/os/guest-js/index.ts @@ -85,6 +85,22 @@ async function version(): Promise { return window.__TAURI_INVOKE__("plugin:os|version"); } +type Family = "unix" | "windows"; + +/** + * Returns the current operating system family. Possible values are `'unix'`, `'windows'`. + * @example + * ```typescript + * import { family } from '@tauri-apps/plugin-os'; + * const family = await family(); + * ``` + * + * @since 2.0.0 + */ +async function family(): Promise { + return window.__TAURI_INVOKE__("plugin:os|family"); +} + /** * Returns the current operating system type. Returns `'linux'` on Linux, `'macos'` on macOS, `'windows'` on Windows, `'ios'` on iOS and `'android'` on Android. * @example @@ -157,5 +173,15 @@ async function hostname(): Promise { return window.__TAURI_INVOKE__("plugin:os|hostname"); } -export { EOL, platform, version, type, arch, locale, exeExtension, hostname }; -export type { Platform, OsType, Arch }; +export { + EOL, + platform, + family, + version, + type, + arch, + locale, + exeExtension, + hostname, +}; +export type { Platform, OsType, Arch, Family }; diff --git a/plugins/os/src/api-iife.js b/plugins/os/src/api-iife.js index d22be7a27e..382e6d1534 100644 --- a/plugins/os/src/api-iife.js +++ b/plugins/os/src/api-iife.js @@ -1 +1 @@ -if("__TAURI__"in window){var __TAURI_OS__=function(n){"use strict";const _=navigator.appVersion.includes("Win")?"\r\n":"\n";return n.EOL=_,n.arch=async function(){return window.__TAURI_INVOKE__("plugin:os|arch")},n.exeExtension=async function(){return window.__TAURI_INVOKE__("plugin:os|exe_extension")},n.hostname=async function(){return window.__TAURI_INVOKE__("plugin:os|hostname")},n.locale=async function(){return window.__TAURI_INVOKE__("plugin:os|locale")},n.platform=async function(){return window.__TAURI_INVOKE__("plugin:os|platform")},n.type=async function(){return window.__TAURI_INVOKE__("plugin:os|os_type")},n.version=async function(){return window.__TAURI_INVOKE__("plugin:os|version")},n}({});Object.defineProperty(window.__TAURI__,"os",{value:__TAURI_OS__})} +if("__TAURI__"in window){var __TAURI_OS__=function(n){"use strict";const _=navigator.appVersion.includes("Win")?"\r\n":"\n";return n.EOL=_,n.arch=async function(){return window.__TAURI_INVOKE__("plugin:os|arch")},n.exeExtension=async function(){return window.__TAURI_INVOKE__("plugin:os|exe_extension")},n.family=async function(){return window.__TAURI_INVOKE__("plugin:os|family")},n.hostname=async function(){return window.__TAURI_INVOKE__("plugin:os|hostname")},n.locale=async function(){return window.__TAURI_INVOKE__("plugin:os|locale")},n.platform=async function(){return window.__TAURI_INVOKE__("plugin:os|platform")},n.type=async function(){return window.__TAURI_INVOKE__("plugin:os|os_type")},n.version=async function(){return window.__TAURI_INVOKE__("plugin:os|version")},n}({});Object.defineProperty(window.__TAURI__,"os",{value:__TAURI_OS__})}