From f4069f55887e90963b802640895c7c8f61aba04a Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Sat, 20 May 2023 16:28:27 -0700 Subject: [PATCH] docs: update README.md and remove allowlist information (#381) --- plugins/app/README.md | 15 +++++++- plugins/app/guest-js/index.ts | 16 -------- plugins/authenticator/README.md | 25 ++++++++++-- plugins/autostart/README.md | 9 +++++ plugins/cli/README.md | 37 +++++++++++++++--- plugins/clipboard/README.md | 17 ++++++-- plugins/clipboard/guest-js/index.ts | 16 -------- plugins/dialog/README.md | 13 ++++++- plugins/dialog/guest-js/index.ts | 8 ++-- plugins/fs/README.md | 11 +++++- plugins/fs/banner.png | Bin 44501 -> 0 bytes plugins/fs/guest-js/index.ts | 34 ++-------------- plugins/fs/src/scope.rs | 2 +- plugins/global-shortcut/README.md | 30 +++++++++++---- plugins/global-shortcut/guest-js/index.ts | 13 ------- plugins/http/README.md | 19 +++++++-- plugins/http/guest-js/index.ts | 25 ++---------- plugins/http/src/scope.rs | 2 +- plugins/localhost/README.md | 23 +++++------ plugins/log/README.md | 9 +++++ plugins/notification/README.md | 23 +++++++---- plugins/notification/guest-js/index.ts | 15 -------- plugins/os/README.md | 14 ++++++- plugins/os/guest-js/index.ts | 13 ------- plugins/persisted-scope/README.md | 2 + plugins/positioner/README.md | 9 ++--- plugins/process/README.md | 17 +++++++- plugins/shell/README.md | 16 ++++++-- plugins/shell/guest-js/index.ts | 45 ++++++++-------------- plugins/shell/src/config.rs | 4 +- plugins/shell/src/open.rs | 2 +- plugins/shell/src/scope.rs | 2 +- plugins/single-instance/README.md | 2 + plugins/sql/README.md | 11 +++++- plugins/store/README.md | 9 +++++ plugins/stronghold/README.md | 9 +++++ plugins/updater/README.md | 30 +++++++++++++-- plugins/upload/README.md | 9 +++++ plugins/websocket/README.md | 11 +++++- plugins/window-state/README.md | 9 +++++ plugins/window/README.md | 26 ++++++++++++- plugins/window/guest-js/index.ts | 45 ---------------------- shared/template/README.md | 21 +++++++--- 43 files changed, 386 insertions(+), 282 deletions(-) delete mode 100644 plugins/fs/banner.png diff --git a/plugins/app/README.md b/plugins/app/README.md index 9b4bace2..96625b18 100644 --- a/plugins/app/README.md +++ b/plugins/app/README.md @@ -1,4 +1,4 @@ -# App plugin +# App This plugin provides APIs to read application metadata and macOS app visibility functions. @@ -18,6 +18,8 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: ```toml [dependencies] +tauri-plugin-app = "2.0.0-alpha" +# alternatively with Git: tauri-plugin-app = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` @@ -26,6 +28,13 @@ You can install the JavaScript Guest bindings using your preferred JavaScript pa > Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use. ```sh +pnpm add @tauri-apps/plugin-app +# or +npm add @tauri-apps/plugin-app +# or +yarn add @tauri-apps/plugin-app + +# alternatively with Git: pnpm add https://github.com/tauri-apps/tauri-plugin-app#v2 # or npm add https://github.com/tauri-apps/tauri-plugin-app#v2 @@ -51,7 +60,9 @@ fn main() { Afterwards all the plugin's APIs are available through the JavaScript guest bindings: ```javascript -import * as app from "@tauri-apps/plugin-app"; +import { getVersion, hide } from "@tauri-apps/plugin-app"; +const appVersion = await getVersion(); +await hide(); ``` ## Contributing diff --git a/plugins/app/guest-js/index.ts b/plugins/app/guest-js/index.ts index d5e06aed..056f255e 100644 --- a/plugins/app/guest-js/index.ts +++ b/plugins/app/guest-js/index.ts @@ -5,22 +5,6 @@ /** * Get application metadata. * - * The APIs must be added to [`tauri.allowlist.app`](https://tauri.app/v1/api/config/#allowlistconfig.app) in `tauri.conf.json`: - * ```json - * { - * "tauri": { - * "allowlist": { - * "app": { - * "all": true, // enable all app APIs - * "show": true, - * "hide": true - * } - * } - * } - * } - * ``` - * It is recommended to allowlist only the APIs you use for optimal bundle size and security. - * * @module */ diff --git a/plugins/authenticator/README.md b/plugins/authenticator/README.md index c902bc23..bcdedeab 100644 --- a/plugins/authenticator/README.md +++ b/plugins/authenticator/README.md @@ -2,6 +2,8 @@ Use hardware security-keys in your Tauri App. +- Supported platforms: Windows, Linux, FreeBSD, NetBSD, OpenBSD, and macOS. + ## Install _This plugin requires a Rust version of at least **1.65**_ @@ -17,9 +19,10 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: `src-tauri/Cargo.toml` ```toml -[dependencies] -tauri-plugin-authenticator = "0.1" -# or through git +# you can add the dependencies on the `[dependencies]` section if you do not target mobile +[target."cfg(not(any(target_os = \"android\", target_os = \"ios\")))".dependencies] +tauri-plugin-authenticator = "2.0.0-alpha" +# alternatively with Git: tauri-plugin-authenticator = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` @@ -27,6 +30,16 @@ You can install the JavaScript Guest bindings using your preferred JavaScript pa > Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use. +```sh +pnpm add @tauri-apps/plugin-authenticator +# or +npm add @tauri-apps/plugin-authenticator +# or +yarn add @tauri-apps/plugin-authenticator +``` + +Alternatively with Git: + ```sh pnpm add https://github.com/tauri-apps/tauri-plugin-authenticator#v2 # or @@ -44,7 +57,11 @@ First you need to register the core plugin with Tauri: ```rust fn main() { tauri::Builder::default() - .plugin(tauri_plugin_authenticator::init()) + .setup(|app| { + #[cfg(desktop)] + app.handle().plugin(tauri_plugin_authenticator::init())?; + Ok(()) + }) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/plugins/autostart/README.md b/plugins/autostart/README.md index d62d4c26..f14fd2c2 100644 --- a/plugins/autostart/README.md +++ b/plugins/autostart/README.md @@ -18,6 +18,8 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: ```toml [dependencies] +tauri-plugin-autostart = "2.0.0-alpha" +# alternatively with Git: tauri-plugin-autostart = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` @@ -26,6 +28,13 @@ You can install the JavaScript Guest bindings using your preferred JavaScript pa > Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use. ```sh +pnpm add @tauri-apps/plugin-autostart +# or +npm add @tauri-apps/plugin-autostart +# or +yarn add @tauri-apps/plugin-autostart + +# alternatively with Git: pnpm add https://github.com/tauri-apps/tauri-plugin-autostart#v2 # or npm add https://github.com/tauri-apps/tauri-plugin-autostart#v2 diff --git a/plugins/cli/README.md b/plugins/cli/README.md index 983cf803..5de6c9e8 100644 --- a/plugins/cli/README.md +++ b/plugins/cli/README.md @@ -1,6 +1,8 @@ -![plugin-cli](banner.jpg) +# CLI - +Parse arguments from your Command Line Interface. + +- Supported platforms: Windows, Linux and macOS. ## Install @@ -17,7 +19,10 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: `src-tauri/Cargo.toml` ```toml -[dependencies] +# you can add the dependencies on the `[dependencies]` section if you do not target mobile +[target."cfg(not(any(target_os = \"android\", target_os = \"ios\")))".dependencies] +tauri-plugin-cli = "2.0.0-alpha" +# alternatively with Git: tauri-plugin-cli = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` @@ -26,6 +31,13 @@ You can install the JavaScript Guest bindings using your preferred JavaScript pa > Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use. ```sh +pnpm add @tauri-apps/plugin-cli +# or +npm add @tauri-apps/plugin-cli +# or +yarn add @tauri-apps/plugin-cli + +# alternatively with Git: pnpm add https://github.com/tauri-apps/tauri-plugin-cli#v2 # or npm add https://github.com/tauri-apps/tauri-plugin-cli#v2 @@ -42,7 +54,11 @@ First you need to register the core plugin with Tauri: ```rust fn main() { tauri::Builder::default() - .plugin(tauri_plugin_cli::init()) + .setup(|app| { + #[cfg(desktop)] + app.handle().plugin(tauri_plugin_cli::init())?; + Ok(()) + }) .run(tauri::generate_context!()) .expect("error while running tauri application"); } @@ -51,7 +67,18 @@ fn main() { Afterwards all the plugin's APIs are available through the JavaScript guest bindings: ```javascript - +import { getMatches } from "@tauri-apps/plugin-cli"; +const matches = await getMatches(); +if (matches.subcommand?.name === "run") { + // `./your-app run $ARGS` was executed + const args = matches.subcommand?.matches.args; + if ("debug" in args) { + // `./your-app run --debug` was executed + } +} else { + const args = matches.args; + // `./your-app $ARGS` was executed +} ``` ## Contributing diff --git a/plugins/clipboard/README.md b/plugins/clipboard/README.md index 2b5df3e4..8ccb430b 100644 --- a/plugins/clipboard/README.md +++ b/plugins/clipboard/README.md @@ -1,6 +1,6 @@ -![plugin-clipboard](banner.jpg) +# Clipboard - +Read and write to the system clipboard. ## Install @@ -18,6 +18,8 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: ```toml [dependencies] +tauri-plugin-clipboard = "2.0.0-alpha" +# alternatively with Git: tauri-plugin-clipboard = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` @@ -26,6 +28,13 @@ You can install the JavaScript Guest bindings using your preferred JavaScript pa > Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use. ```sh +pnpm add @tauri-apps/plugin-clipboard +# or +npm add @tauri-apps/plugin-clipboard +# or +yarn add @tauri-apps/plugin-clipboard + +# alternatively with Git: pnpm add https://github.com/tauri-apps/tauri-plugin-clipboard#v2 # or npm add https://github.com/tauri-apps/tauri-plugin-clipboard#v2 @@ -51,7 +60,9 @@ fn main() { Afterwards all the plugin's APIs are available through the JavaScript guest bindings: ```javascript - +import { writeText, readText } from "@tauri-apps/plugin-clipboard"; +await writeText("Tauri is awesome!"); +assert(await readText(), "Tauri is awesome!"); ``` ## Contributing diff --git a/plugins/clipboard/guest-js/index.ts b/plugins/clipboard/guest-js/index.ts index f9a40d30..67f519ee 100644 --- a/plugins/clipboard/guest-js/index.ts +++ b/plugins/clipboard/guest-js/index.ts @@ -5,22 +5,6 @@ /** * Read and write to the system clipboard. * - * The APIs must be added to [`tauri.allowlist.clipboard`](https://tauri.app/v1/api/config/#allowlistconfig.clipboard) in `tauri.conf.json`: - * ```json - * { - * "tauri": { - * "allowlist": { - * "clipboard": { - * "all": true, // enable all Clipboard APIs - * "writeText": true, - * "readText": true - * } - * } - * } - * } - * ``` - * It is recommended to allowlist only the APIs you use for optimal bundle size and security. - * * @module */ diff --git a/plugins/dialog/README.md b/plugins/dialog/README.md index 172ed55e..8e06ed2b 100644 --- a/plugins/dialog/README.md +++ b/plugins/dialog/README.md @@ -1,6 +1,6 @@ -![Dialog](banner.jpg) +# Dialog - +Native system dialogs for opening and saving files along with message dialogs. ## Install @@ -18,6 +18,8 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: ```toml [dependencies] +tauri-plugin-dialog = "2.0.0-alpha" +# alternatively with Git: tauri-plugin-dialog = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` @@ -31,6 +33,13 @@ pnpm add @tauri-apps/plugin-dialog npm add @tauri-apps/plugin-dialog # or yarn add @tauri-apps/plugin-dialog + +# alternatively with Git: +pnpm add https://github.com/tauri-apps/tauri-plugin-dialog#v2 +# or +npm add https://github.com/tauri-apps/tauri-plugin-dialog#v2 +# or +yarn add https://github.com/tauri-apps/tauri-plugin-dialog#v2 ``` ## Usage diff --git a/plugins/dialog/guest-js/index.ts b/plugins/dialog/guest-js/index.ts index 50c6e64c..3d94a61e 100644 --- a/plugins/dialog/guest-js/index.ts +++ b/plugins/dialog/guest-js/index.ts @@ -113,11 +113,11 @@ async function open( /** * Open a file/directory selection dialog. * - * The selected paths are added to the filesystem and asset protocol allowlist scopes. + * The selected paths are added to the filesystem and asset protocol scopes. * When security is more important than the easy of use of this API, * prefer writing a dedicated command instead. * - * Note that the allowlist scope change is not persisted, so the values are cleared when the application is restarted. + * Note that the scope change is not persisted, so the values are cleared when the application is restarted. * You can save it to the filesystem using [tauri-plugin-persisted-scope](https://github.com/tauri-apps/tauri-plugin-persisted-scope). * @example * ```typescript @@ -175,11 +175,11 @@ async function open( /** * Open a file/directory save dialog. * - * The selected path is added to the filesystem and asset protocol allowlist scopes. + * The selected path is added to the filesystem and asset protocol scopes. * When security is more important than the easy of use of this API, * prefer writing a dedicated command instead. * - * Note that the allowlist scope change is not persisted, so the values are cleared when the application is restarted. + * Note that the scope change is not persisted, so the values are cleared when the application is restarted. * You can save it to the filesystem using [tauri-plugin-persisted-scope](https://github.com/tauri-apps/tauri-plugin-persisted-scope). * @example * ```typescript diff --git a/plugins/fs/README.md b/plugins/fs/README.md index f411ca25..badc305d 100644 --- a/plugins/fs/README.md +++ b/plugins/fs/README.md @@ -1,4 +1,4 @@ -![tauri-plugin-fs](banner.png) +# File System Access the file system. @@ -18,6 +18,8 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: ```toml [dependencies] +tauri-plugin-fs = "2.0.0-alpha" +# alternatively with Git: tauri-plugin-fs = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` @@ -26,6 +28,13 @@ You can install the JavaScript Guest bindings using your preferred JavaScript pa > Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use. ```sh +pnpm add @tauri-apps/plugin-fs +# or +npm add @tauri-apps/plugin-fs +# or +yarn add @tauri-apps/plugin-fs + +# alternatively with Git: pnpm add https://github.com/tauri-apps/tauri-plugin-fs#v2 # or npm add https://github.com/tauri-apps/tauri-plugin-fs#v2 diff --git a/plugins/fs/banner.png b/plugins/fs/banner.png deleted file mode 100644 index b860c3c827b07230dd20f524136ef2d8e687dfed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44501 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�U2idS*DqkZb*JHwQ%8Ck}nPHJPhu(EM^c4PC? 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 diff --git a/plugins/fs/guest-js/index.ts b/plugins/fs/guest-js/index.ts index 93f4998c..bd16cd43 100644 --- a/plugins/fs/guest-js/index.ts +++ b/plugins/fs/guest-js/index.ts @@ -5,32 +5,6 @@ /** * Access the file system. * - * This package is also accessible with `window.__TAURI__.fs` when [`build.withGlobalTauri`](https://tauri.app/v1/api/config/#buildconfig.withglobaltauri) in `tauri.conf.json` is set to `true`. - * - * The APIs must be added to [`tauri.allowlist.fs`](https://tauri.app/v1/api/config/#allowlistconfig.fs) in `tauri.conf.json`: - * ```json - * { - * "tauri": { - * "allowlist": { - * "fs": { - * "all": true, // enable all FS APIs - * "readFile": true, - * "writeFile": true, - * "readDir": true, - * "copyFile": true, - * "createDir": true, - * "removeDir": true, - * "removeFile": true, - * "renameFile": true, - * "metadata": true, - * "exists": true - * } - * } - * } - * } - * ``` - * It is recommended to allowlist only the APIs you use for optimal bundle size and security. - * * ## Security * * This module prevents path traversal, not allowing absolute paths or parent dir components @@ -45,11 +19,9 @@ * *databases* folder of the {@link path.appDataDir | $APPDATA directory}: * ```json * { - * "tauri": { - * "allowlist": { - * "fs": { - * "scope": ["$APPDATA/databases/*"] - * } + * "plugins": { + * "fs": { + * "scope": ["$APPDATA/databases/*"] * } * } * } diff --git a/plugins/fs/src/scope.rs b/plugins/fs/src/scope.rs index c8958f2e..609506fc 100644 --- a/plugins/fs/src/scope.rs +++ b/plugins/fs/src/scope.rs @@ -80,7 +80,7 @@ fn push_pattern, F: Fn(&str) -> Result>( manager: &M, scope: &FsScope, diff --git a/plugins/global-shortcut/README.md b/plugins/global-shortcut/README.md index c2362ae4..7c151730 100644 --- a/plugins/global-shortcut/README.md +++ b/plugins/global-shortcut/README.md @@ -1,6 +1,8 @@ -![plugin-shortcut](banner.jpg) +# Global Shortcut - +Register global shortcuts. + +- Supported platforms: Windows, Linux and macOS. ## Install @@ -17,7 +19,10 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: `src-tauri/Cargo.toml` ```toml -[dependencies] +# you can add the dependencies on the `[dependencies]` section if you do not target mobile +[target."cfg(not(any(target_os = \"android\", target_os = \"ios\")))".dependencies] +tauri-plugin-global-shortcut = "2.0.0-alpha" +# alternatively with Git: tauri-plugin-shortcut = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` @@ -26,11 +31,18 @@ You can install the JavaScript Guest bindings using your preferred JavaScript pa > Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use. ```sh -pnpm add https://github.com/tauri-apps/tauri-plugin-shortcut#v2 +pnpm add @tauri-apps/plugin-global-shortcut +# or +npm add @tauri-apps/plugin-global-shortcut +# or +yarn add @tauri-apps/plugin-global-shortcut + +# alternatively with Git: +pnpm add https://github.com/tauri-apps/tauri-plugin-global-shortcut#v2 # or -npm add https://github.com/tauri-apps/tauri-plugin-shortcut#v2 +npm add https://github.com/tauri-apps/tauri-plugin-global-shortcut#v2 # or -yarn add https://github.com/tauri-apps/tauri-plugin-shortcut#v2 +yarn add https://github.com/tauri-apps/tauri-plugin-global-shortcut#v2 ``` ## Usage @@ -42,7 +54,11 @@ First you need to register the core plugin with Tauri: ```rust fn main() { tauri::Builder::default() - .plugin(tauri_plugin_shortcut::init()) + .setup(|app| { + #[cfg(desktop)] + app.handle().plugin(tauri_plugin_shortcut::init())?; + Ok(()) + }) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/plugins/global-shortcut/guest-js/index.ts b/plugins/global-shortcut/guest-js/index.ts index f8686cff..ea105f25 100644 --- a/plugins/global-shortcut/guest-js/index.ts +++ b/plugins/global-shortcut/guest-js/index.ts @@ -5,19 +5,6 @@ /** * Register global shortcuts. * - * The APIs must be added to [`tauri.allowlist.globalShortcut`](https://tauri.app/v1/api/config/#allowlistconfig.globalshortcut) in `tauri.conf.json`: - * ```json - * { - * "tauri": { - * "allowlist": { - * "globalShortcut": { - * "all": true // enable all global shortcut APIs - * } - * } - * } - * } - * ``` - * It is recommended to allowlist only the APIs you use for optimal bundle size and security. * @module */ diff --git a/plugins/http/README.md b/plugins/http/README.md index 729cedfa..440e5a18 100644 --- a/plugins/http/README.md +++ b/plugins/http/README.md @@ -1,6 +1,6 @@ -![plugin-http](banner.jpg) +# HTTP - +Access the HTTP client written in Rust. ## Install @@ -18,6 +18,8 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: ```toml [dependencies] +tauri-plugin-http = "2.0.0-alpha" +# alternatively with Git: tauri-plugin-http = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` @@ -26,6 +28,13 @@ You can install the JavaScript Guest bindings using your preferred JavaScript pa > Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use. ```sh +pnpm add @tauri-apps/plugin-http +# or +npm add @tauri-apps/plugin-http +# or +yarn add @tauri-apps/plugin-http + +# alternatively with Git: pnpm add https://github.com/tauri-apps/tauri-plugin-http#v2 # or npm add https://github.com/tauri-apps/tauri-plugin-http#v2 @@ -51,7 +60,11 @@ fn main() { Afterwards all the plugin's APIs are available through the JavaScript guest bindings: ```javascript - +import { fetch } from "@tauri-apps/plugin-http"; +const response = await fetch("http://localhost:3003/users/2", { + method: "GET", + timeout: 30, +}); ``` ## Contributing diff --git a/plugins/http/guest-js/index.ts b/plugins/http/guest-js/index.ts index 4f542b86..f2a8e2b2 100644 --- a/plugins/http/guest-js/index.ts +++ b/plugins/http/guest-js/index.ts @@ -5,21 +5,6 @@ /** * Access the HTTP client written in Rust. * - * The APIs must be allowlisted on `tauri.conf.json`: - * ```json - * { - * "tauri": { - * "allowlist": { - * "http": { - * "all": true, // enable all http APIs - * "request": true // enable HTTP request API - * } - * } - * } - * } - * ``` - * It is recommended to allowlist only the APIs you use for optimal bundle size and security. - * * ## Security * * This API has a scope configuration that forces you to restrict the URLs and paths that can be accessed using glob patterns. @@ -27,11 +12,9 @@ * For instance, this scope configuration only allows making HTTP requests to the GitHub API for the `tauri-apps` organization: * ```json * { - * "tauri": { - * "allowlist": { - * "http": { - * "scope": ["https://api.github.com/repos/tauri-apps/*"] - * } + * "plugins": { + * "http": { + * "scope": ["https://api.github.com/repos/tauri-apps/*"] * } * } * } @@ -105,7 +88,7 @@ class Body { * By default it sets the `application/x-www-form-urlencoded` Content-Type header, * but you can set it to `multipart/form-data` if the Cargo feature `multipart` is enabled. * - * Note that a file path must be allowed in the `fs` allowlist scope. + * Note that a file path must be allowed in the `fs` scope. * @example * ```typescript * import { Body } from "@tauri-apps/plugin-http" diff --git a/plugins/http/src/scope.rs b/plugins/http/src/scope.rs index 0c620a9b..1b802ace 100644 --- a/plugins/http/src/scope.rs +++ b/plugins/http/src/scope.rs @@ -13,7 +13,7 @@ pub struct Scope { } impl Scope { - /// Creates a new scope from the allowlist's `http` scope configuration. + /// Creates a new scope from the scope configuration. pub(crate) fn new(scope: &HttpAllowlistScope) -> Self { Self { allowed_urls: scope diff --git a/plugins/localhost/README.md b/plugins/localhost/README.md index 87919843..5b83bf4b 100644 --- a/plugins/localhost/README.md +++ b/plugins/localhost/README.md @@ -20,8 +20,10 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: ```toml [dependencies] -tauri-plugin-localhost = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } portpicker = "0.1" # used in the example to pick a random free port +tauri-plugin-localhost = "2.0.0-alpha" +# alternatively with Git: +tauri-plugin-localhost = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` ## Usage @@ -31,27 +33,26 @@ First you need to register the core plugin with Tauri: `src-tauri/src/main.rs` ```rust -use tauri::{utils::config::AppUrl, window::WindowBuilder, WindowUrl}; +use tauri::{Manager, window::WindowBuilder, WindowUrl}; fn main() { let port = portpicker::pick_unused_port().expect("failed to find unused port"); - let mut context = tauri::generate_context!(); - let url = format!("http://localhost:{}", port).parse().unwrap(); - let window_url = WindowUrl::External(url); - // rewrite the config so the IPC is enabled on this URL - context.config_mut().build.dist_dir = AppUrl::Url(window_url.clone()); - context.config_mut().build.dev_path = AppUrl::Url(window_url.clone()); - tauri::Builder::default() .plugin(tauri_plugin_localhost::Builder::new(port).build()) .setup(move |app| { - WindowBuilder::new(app, "main".to_string(), window_url) + app.ipc_scope().configure_remote_access( + RemoteDomainAccessScope::new(format!("localhost:{}", port)) + .add_window("main") + ); + + let url = format!("http://localhost:{}", port).parse().unwrap(); + WindowBuilder::new(app, "main".to_string(), WindowUrl::External(url)) .title("Localhost Example") .build()?; Ok(()) }) - .run(context) + .run(tauri::generate_context!()) .expect("error while running tauri application"); } ``` diff --git a/plugins/log/README.md b/plugins/log/README.md index b3cb6e8a..50aaecbf 100644 --- a/plugins/log/README.md +++ b/plugins/log/README.md @@ -18,6 +18,8 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: ```toml [dependencies] +tauri-plugin-log = "2.0.0-alpha" +# alternatively with Git: tauri-plugin-log = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` @@ -26,6 +28,13 @@ You can install the JavaScript Guest bindings using your preferred JavaScript pa > Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use. ```sh +pnpm add @tauri-apps/plugin-log +# or +npm add @tauri-apps/plugin-log +# or +yarn add @tauri-apps/plugin-log + +# alternatively with Git: pnpm add https://github.com/tauri-apps/tauri-plugin-log#v2 # or npm add https://github.com/tauri-apps/tauri-plugin-log#v2 diff --git a/plugins/notification/README.md b/plugins/notification/README.md index 1387df60..08f9dfd3 100644 --- a/plugins/notification/README.md +++ b/plugins/notification/README.md @@ -1,6 +1,6 @@ -![{{plugin name}}](banner.jpg) +# Notification - +Send message notifications (brief auto-expiring OS window element) to your user. Can also be used with the Notification Web API. ## Install @@ -18,7 +18,9 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: ```toml [dependencies] - = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "dev" } +tauri-plugin-notification = "2.0.0-alpha" +# alternatively with Git: +tauri-plugin-notification = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` You can install the JavaScript Guest bindings using your preferred JavaScript package manager: @@ -26,11 +28,18 @@ You can install the JavaScript Guest bindings using your preferred JavaScript pa > Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use. ```sh -pnpm add +pnpm add @tauri-apps/plugin-notification # or -npm add +npm add @tauri-apps/plugin-notification # or -yarn add +yarn add @tauri-apps/plugin-notification + +# alternatively with Git: +pnpm add https://github.com/tauri-apps/tauri-plugin-notification#v2 +# or +npm add https://github.com/tauri-apps/tauri-plugin-notification#v2 +# or +yarn add https://github.com/tauri-apps/tauri-plugin-notification#v2 ``` ## Usage @@ -42,7 +51,7 @@ First you need to register the core plugin with Tauri: ```rust fn main() { tauri::Builder::default() - .plugin() + .plugin(tauri_plugin_notification::init()) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/plugins/notification/guest-js/index.ts b/plugins/notification/guest-js/index.ts index b11127eb..ee157ecc 100644 --- a/plugins/notification/guest-js/index.ts +++ b/plugins/notification/guest-js/index.ts @@ -6,21 +6,6 @@ * Send toast notifications (brief auto-expiring OS window element) to your user. * Can also be used with the Notification Web API. * - * This package is also accessible with `window.__TAURI__.notification` when [`build.withGlobalTauri`](https://tauri.app/v1/api/config/#buildconfig.withglobaltauri) in `tauri.conf.json` is set to `true`. - * - * The APIs must be added to [`tauri.allowlist.notification`](https://tauri.app/v1/api/config/#allowlistconfig.notification) in `tauri.conf.json`: - * ```json - * { - * "tauri": { - * "allowlist": { - * "notification": { - * "all": true // enable all notification APIs - * } - * } - * } - * } - * ``` - * It is recommended to allowlist only the APIs you use for optimal bundle size and security. * @module */ diff --git a/plugins/os/README.md b/plugins/os/README.md index b16ea49f..27ed03ad 100644 --- a/plugins/os/README.md +++ b/plugins/os/README.md @@ -1,4 +1,4 @@ -# Operating system plugin +# Operating System Read information about the operating system. @@ -18,6 +18,8 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: ```toml [dependencies] +tauri-plugin-os = "2.0.0-alpha" +# alternatively with Git: tauri-plugin-os = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` @@ -26,6 +28,13 @@ You can install the JavaScript Guest bindings using your preferred JavaScript pa > Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use. ```sh +pnpm add @tauri-apps/plugin-os +# or +npm add @tauri-apps/plugin-os +# or +yarn add @tauri-apps/plugin-os + +# alternatively with Git: pnpm add https://github.com/tauri-apps/tauri-plugin-os#v2 # or npm add https://github.com/tauri-apps/tauri-plugin-os#v2 @@ -51,7 +60,8 @@ fn main() { Afterwards all the plugin's APIs are available through the JavaScript guest bindings: ```javascript -import * as os from "@tauri-apps/plugin-os"; +import { version } from "@tauri-apps/plugin-os"; +const osVersion = await version(); ``` ## Contributing diff --git a/plugins/os/guest-js/index.ts b/plugins/os/guest-js/index.ts index 93147c0a..36c508f1 100644 --- a/plugins/os/guest-js/index.ts +++ b/plugins/os/guest-js/index.ts @@ -5,19 +5,6 @@ /** * Provides operating system-related utility methods and properties. * - * The APIs must be added to [`tauri.allowlist.os`](https://tauri.app/v1/api/config/#allowlistconfig.os) in `tauri.conf.json`: - * ```json - * { - * "tauri": { - * "allowlist": { - * "os": { - * "all": true, // enable all Os APIs - * } - * } - * } - * } - * ``` - * It is recommended to allowlist only the APIs you use for optimal bundle size and security. * @module */ diff --git a/plugins/persisted-scope/README.md b/plugins/persisted-scope/README.md index 01ac82b4..1a7e19bf 100644 --- a/plugins/persisted-scope/README.md +++ b/plugins/persisted-scope/README.md @@ -18,6 +18,8 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: ```toml [dependencies] +tauri-plugin-persisted-scope = "2.0.0-alpha" +# alternatively with Git: tauri-plugin-persisted-scope = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` diff --git a/plugins/positioner/README.md b/plugins/positioner/README.md index 0da5aaa9..e80eb516 100644 --- a/plugins/positioner/README.md +++ b/plugins/positioner/README.md @@ -20,8 +20,8 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: ```toml [dependencies] -tauri-plugin-positioner = "1.0" -# or through git +tauri-plugin-positioner = "2.0.0-alpha" +# alternatively with Git: tauri-plugin-positioner = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` @@ -35,11 +35,8 @@ pnpm add @tauri-apps/plugin-positioner npm add @tauri-apps/plugin-positioner # or yarn add @tauri-apps/plugin-positioner -``` - -Or through git: -```sh +# alternatively with Git: pnpm add https://github.com/tauri-apps/tauri-plugin-positioner#v2 # or npm add https://github.com/tauri-apps/tauri-plugin-positioner#v2 diff --git a/plugins/process/README.md b/plugins/process/README.md index 01fc5d61..fad3e821 100644 --- a/plugins/process/README.md +++ b/plugins/process/README.md @@ -1,4 +1,4 @@ -# Process plugin +# Process This plugin provides APIs to access the current process. To spawn child processes, see the [`shell`](https://github.com/tauri-apps/tauri-plugin-shell) plugin. @@ -18,6 +18,8 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: ```toml [dependencies] +tauri-plugin-process = "2.0.0-alpha" +# alternatively with Git: tauri-plugin-process = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` @@ -26,6 +28,13 @@ You can install the JavaScript Guest bindings using your preferred JavaScript pa > Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use. ```sh +pnpm add @tauri-apps/plugin-process +# or +npm add @tauri-apps/plugin-process +# or +yarn add @tauri-apps/plugin-process + +# alternatively with Git: pnpm add https://github.com/tauri-apps/tauri-plugin-process#v2 # or npm add https://github.com/tauri-apps/tauri-plugin-process#v2 @@ -51,7 +60,11 @@ fn main() { Afterwards all the plugin's APIs are available through the JavaScript guest bindings: ```javascript -import * as process from "@tauri-apps/plugin-process"; +import { exit, relaunch } from "@tauri-apps/plugin-process"; +// exit the app with the given status code +await exit(0); +// restart the app +await relaunch(); ``` ## Contributing diff --git a/plugins/shell/README.md b/plugins/shell/README.md index 80400eaa..4d06a1e9 100644 --- a/plugins/shell/README.md +++ b/plugins/shell/README.md @@ -1,6 +1,6 @@ -![plugin-shell](banner.jpg) +# Shell - +Access the system shell. Allows you to spawn child processes and manage files and URLs using their default application. ## Install @@ -18,6 +18,8 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: ```toml [dependencies] +tauri-plugin-shell = "2.0.0-alpha" +# alternatively with Git: tauri-plugin-shell = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` @@ -26,6 +28,13 @@ You can install the JavaScript Guest bindings using your preferred JavaScript pa > Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use. ```sh +pnpm add @tauri-apps/plugin-shell +# or +npm add @tauri-apps/plugin-shell +# or +yarn add @tauri-apps/plugin-shell + +# alternatively with Git: pnpm add https://github.com/tauri-apps/tauri-plugin-shell#v2 # or npm add https://github.com/tauri-apps/tauri-plugin-shell#v2 @@ -51,7 +60,8 @@ fn main() { Afterwards all the plugin's APIs are available through the JavaScript guest bindings: ```javascript - +import { Command } from "@tauri-apps/plugin-shell"; +Command.create("git", ["commit", "-m", "the commit message"]); ``` ## Contributing diff --git a/plugins/shell/guest-js/index.ts b/plugins/shell/guest-js/index.ts index 979f51d1..9d5abb21 100644 --- a/plugins/shell/guest-js/index.ts +++ b/plugins/shell/guest-js/index.ts @@ -6,36 +6,19 @@ * Access the system shell. * Allows you to spawn child processes and manage files and URLs using their default application. * - * The APIs must be added to [`tauri.allowlist.shell`](https://tauri.app/v1/api/config/#allowlistconfig.shell) in `tauri.conf.json`: - * ```json - * { - * "tauri": { - * "allowlist": { - * "shell": { - * "all": true, // enable all shell APIs - * "execute": true, // enable process spawn APIs - * "sidecar": true, // enable spawning sidecars - * "open": true // enable opening files/URLs using the default program - * } - * } - * } - * } - * ``` - * It is recommended to allowlist only the APIs you use for optimal bundle size and security. - * * ## Security * * This API has a scope configuration that forces you to restrict the programs and arguments that can be used. * * ### Restricting access to the {@link open | `open`} API * - * On the allowlist, `open: true` means that the {@link open} API can be used with any URL, + * On the configuration object, `open: true` means that the {@link open} API can be used with any URL, * as the argument is validated with the `^((mailto:\w+)|(tel:\w+)|(https?://\w+)).+` regex. * You can change that regex by changing the boolean value to a string, e.g. `open: ^https://github.com/`. * * ### Restricting access to the {@link Command | `Command`} APIs * - * The `shell` allowlist object has a `scope` field that defines an array of CLIs that can be used. + * The plugin configuration object has a `scope` field that defines an array of CLIs that can be used. * Each CLI is a configuration object `{ name: string, cmd: string, sidecar?: bool, args?: boolean | Arg[] }`. * * - `name`: the unique identifier of the command, passed to the {@link Command.create | Command.create function}. @@ -55,13 +38,17 @@ * Configuration: * ```json * { - * "scope": [ - * { - * "name": "run-git-commit", - * "cmd": "git", - * "args": ["commit", "-m", { "validator": "\\S+" }] + * "plugins": { + * "shell": { + * "scope": [ + * { + * "name": "run-git-commit", + * "cmd": "git", + * "args": ["commit", "-m", { "validator": "\\S+" }] + * } + * ] * } - * ] + * } * } * ``` * Usage: @@ -425,7 +412,7 @@ class Command extends EventEmitter { * Creates a new `Command` instance. * * @param program The program name to execute. - * It must be configured on `tauri.conf.json > tauri > allowlist > shell > scope`. + * It must be configured on `tauri.conf.json > plugins > shell > scope`. * @param args Program arguments. * @param options Spawn options. */ @@ -462,7 +449,7 @@ class Command extends EventEmitter { * ``` * * @param program The program to execute. - * It must be configured on `tauri.conf.json > tauri > allowlist > shell > scope`. + * It must be configured on `tauri.conf.json > plugins > shell > scope`. */ static create( program: string, @@ -494,7 +481,7 @@ class Command extends EventEmitter { * ``` * * @param program The program to execute. - * It must be configured on `tauri.conf.json > tauri > allowlist > shell > scope`. + * It must be configured on `tauri.conf.json > plugins > shell > scope`. */ static sidecar( program: string, @@ -634,7 +621,7 @@ type CommandEvent = * ``` * * @param path The path or URL to open. - * This value is matched against the string regex defined on `tauri.conf.json > tauri > allowlist > shell > open`, + * This value is matched against the string regex defined on `tauri.conf.json > plugins > shell > open`, * which defaults to `^((mailto:\w+)|(tel:\w+)|(https?://\w+)).+`. * @param openWith The app to open the file or URL with. * Defaults to the system default application for the specified path type. diff --git a/plugins/shell/src/config.rs b/plugins/shell/src/config.rs index 1a35df4e..180de7f6 100644 --- a/plugins/shell/src/config.rs +++ b/plugins/shell/src/config.rs @@ -2,9 +2,7 @@ use std::path::PathBuf; use serde::{de::Error as DeError, Deserialize, Deserializer}; -/// Allowlist for the shell APIs. -/// -/// See more: https://tauri.app/v1/api/config#shellallowlistconfig +/// Configuration for the shell plugin. #[derive(Debug, Default, PartialEq, Eq, Clone, Deserialize)] #[serde(rename_all = "camelCase", deny_unknown_fields)] pub struct Config { diff --git a/plugins/shell/src/open.rs b/plugins/shell/src/open.rs index 5cc50927..a46d3f14 100644 --- a/plugins/shell/src/open.rs +++ b/plugins/shell/src/open.rs @@ -104,7 +104,7 @@ impl Program { /// Opens path or URL with the program specified in `with`, or system default if `None`. /// /// The path will be matched against the shell open validation regex, defaulting to `^((mailto:\w+)|(tel:\w+)|(https?://\w+)).+`. -/// A custom validation regex may be supplied in the config in `tauri > allowlist > scope > open`. +/// A custom validation regex may be supplied in the config in `plugins > shell > scope > open`. /// /// # Examples /// diff --git a/plugins/shell/src/scope.rs b/plugins/shell/src/scope.rs index 871f3940..67ebde6a 100644 --- a/plugins/shell/src/scope.rs +++ b/plugins/shell/src/scope.rs @@ -248,7 +248,7 @@ impl Scope { /// Open a path in the default (or specified) browser. /// - /// The path is validated against the `tauri > allowlist > shell > open` validation regex, which + /// The path is validated against the `plugins > shell > open` validation regex, which /// defaults to `^((mailto:\w+)|(tel:\w+)|(https?://\w+)).+`. pub fn open(&self, path: &str, with: Option) -> Result<(), Error> { // ensure we pass validation if the configuration has one diff --git a/plugins/single-instance/README.md b/plugins/single-instance/README.md index 6c72dc4e..2cb2d88e 100644 --- a/plugins/single-instance/README.md +++ b/plugins/single-instance/README.md @@ -18,6 +18,8 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: ```toml [dependencies] +tauri-plugin-single-instance = "2.0.0-alpha" +# alternatively with Git: tauri-plugin-single-instance = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` diff --git a/plugins/sql/README.md b/plugins/sql/README.md index f6658668..3901405e 100644 --- a/plugins/sql/README.md +++ b/plugins/sql/README.md @@ -18,9 +18,11 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: ```toml [dependencies.tauri-plugin-sql] +features = ["sqlite"] # or "postgres", or "mysql" +version = "2.0.0-alpha" +# alternatively with Git git = "https://github.com/tauri-apps/plugins-workspace" branch = "v2" -features = ["sqlite"] # or "postgres", or "mysql" ``` You can install the JavaScript Guest bindings using your preferred JavaScript package manager: @@ -28,6 +30,13 @@ You can install the JavaScript Guest bindings using your preferred JavaScript pa > Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use. ```sh +pnpm add @tauri-apps/plugin-sql +# or +npm add @tauri-apps/plugin-sql +# or +yarn add @tauri-apps/plugin-sql + +# alternatively with Git: pnpm add https://github.com/tauri-apps/tauri-plugin-sql#v2 # or npm add https://github.com/tauri-apps/tauri-plugin-sql#v2 diff --git a/plugins/store/README.md b/plugins/store/README.md index c8411112..90b0b7ef 100644 --- a/plugins/store/README.md +++ b/plugins/store/README.md @@ -18,6 +18,8 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: ```toml [dependencies] +tauri-plugin-store = "2.0.0-alpha" +# alternatively with Git: tauri-plugin-store = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` @@ -26,6 +28,13 @@ You can install the JavaScript Guest bindings using your preferred JavaScript pa > Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use. ```sh +pnpm add @tauri-apps/plugin-store +# or +npm add @tauri-apps/plugin-store +# or +yarn add @tauri-apps/plugin-store + +# alternatively with Git: pnpm add https://github.com/tauri-apps/tauri-plugin-store#v2 # or npm add https://github.com/tauri-apps/tauri-plugin-store#v2 diff --git a/plugins/stronghold/README.md b/plugins/stronghold/README.md index 52b22a87..7254b857 100644 --- a/plugins/stronghold/README.md +++ b/plugins/stronghold/README.md @@ -18,6 +18,8 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: ```toml [dependencies] +tauri-plugin-stronghold = "2.0.0-alpha" +# alternatively with Git: tauri-plugin-stronghold = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` @@ -26,6 +28,13 @@ You can install the JavaScript Guest bindings using your preferred JavaScript pa > Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use. ```sh +pnpm add @tauri-apps/plugin-stronghold +# or +npm add @tauri-apps/plugin-stronghold +# or +yarn add @tauri-apps/plugin-stronghold + +# alternatively with Git: pnpm add https://github.com/tauri-apps/tauri-plugin-stronghold#v2 # or npm add https://github.com/tauri-apps/tauri-plugin-stronghold#v2 diff --git a/plugins/updater/README.md b/plugins/updater/README.md index 842af4d9..eb6f3642 100644 --- a/plugins/updater/README.md +++ b/plugins/updater/README.md @@ -1,7 +1,9 @@ -# Updater plugin +# Updater In-app updates for Tauri applications. +- Supported platforms: Windows, Linux and macOS. + ## Install _This plugin requires a Rust version of at least **1.65**_ @@ -17,7 +19,10 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: `src-tauri/Cargo.toml` ```toml -[dependencies] +# you can add the dependencies on the `[dependencies]` section if you do not target mobile +[target."cfg(not(any(target_os = \"android\", target_os = \"ios\")))".dependencies] +tauri-plugin-updater = "2.0.0-alpha" +# alternatively with Git: tauri-plugin-updater = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` @@ -26,6 +31,13 @@ You can install the JavaScript Guest bindings using your preferred JavaScript pa > Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use. ```sh +pnpm add @tauri-apps/plugin-updater +# or +npm add @tauri-apps/plugin-updater +# or +yarn add @tauri-apps/plugin-updater + +# alternatively with Git: pnpm add https://github.com/tauri-apps/tauri-plugin-updater#v2 # or npm add https://github.com/tauri-apps/tauri-plugin-updater#v2 @@ -42,7 +54,11 @@ First you need to register the core plugin with Tauri: ```rust fn main() { tauri::Builder::default() - .plugin(tauri_plugin_updater::Builder::new().build()) + .setup(|app| { + #[cfg(desktop)] + app.handle().plugin(tauri_plugin_updater::Builder::new().build())?; + Ok(()) + }) .run(tauri::generate_context!()) .expect("error while running tauri application"); } @@ -51,7 +67,13 @@ fn main() { Afterwards all the plugin's APIs are available through the JavaScript guest bindings: ```javascript -import * as updater from "@tauri-apps/plugin-updater"; +import { check } from "@tauri-apps/plugin-updater"; +import { relaunch } from "@tauri-apps/plugin-process"; +const update = await check(); +if (update.response.available) { + await update.downloadAndInstall(); + await relaunch(); +} ``` ## Contributing diff --git a/plugins/upload/README.md b/plugins/upload/README.md index d451a8d6..9796aa8a 100644 --- a/plugins/upload/README.md +++ b/plugins/upload/README.md @@ -18,6 +18,8 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: ```toml [dependencies] +tauri-plugin-upload = "2.0.0-alpha" +# alternatively with Git: tauri-plugin-upload = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` @@ -26,6 +28,13 @@ You can install the JavaScript Guest bindings using your preferred JavaScript pa > Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use. ```sh +pnpm add @tauri-apps/plugin-upload +# or +npm add @tauri-apps/plugin-upload +# or +yarn add @tauri-apps/plugin-upload + +# alternatively with Git: pnpm add https://github.com/tauri-apps/tauri-plugin-upload#v2 # or npm add https://github.com/tauri-apps/tauri-plugin-upload#v2 diff --git a/plugins/websocket/README.md b/plugins/websocket/README.md index 0971d6ff..56943465 100644 --- a/plugins/websocket/README.md +++ b/plugins/websocket/README.md @@ -1,6 +1,6 @@ ![plugin-websocket](banner.png) - +Expose a WebSocket server to your Tauri frontend. ## Install @@ -18,6 +18,8 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: ```toml [dependencies] +tauri-plugin-websocket = "2.0.0-alpha" +# alternatively with Git: tauri-plugin-websocket = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` @@ -26,6 +28,13 @@ You can install the JavaScript Guest bindings using your preferred JavaScript pa > Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use. ```sh +pnpm add @tauri-apps/plugin-websocket +# or +npm add @tauri-apps/plugin-websocket +# or +yarn add @tauri-apps/plugin-websocket + +# alternatively with Git: pnpm add https://github.com/tauri-apps/tauri-plugin-websocket#v2 # or npm add https://github.com/tauri-apps/tauri-plugin-websocket#v2 diff --git a/plugins/window-state/README.md b/plugins/window-state/README.md index 97848cd2..ea03f8e2 100644 --- a/plugins/window-state/README.md +++ b/plugins/window-state/README.md @@ -18,6 +18,8 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: ```toml [dependencies] +tauri-plugin-window-state = "2.0.0-alpha" +# alternatively with Git: tauri-plugin-window-state = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` @@ -26,6 +28,13 @@ You can install the JavaScript Guest bindings using your preferred JavaScript pa > Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use. ```sh +pnpm add @tauri-apps/plugin-window-state +# or +npm add @tauri-apps/plugin-window-state +# or +yarn add @tauri-apps/plugin-window-state + +# alternatively with Git: pnpm add https://github.com/tauri-apps/tauri-plugin-window-state#v2 # or npm add https://github.com/tauri-apps/tauri-plugin-window-state#v2 diff --git a/plugins/window/README.md b/plugins/window/README.md index 1a47b706..14e7c8a8 100644 --- a/plugins/window/README.md +++ b/plugins/window/README.md @@ -1,4 +1,4 @@ -# Window plugin +# Window Interact with the Tauri window. @@ -18,6 +18,8 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: ```toml [dependencies] +tauri-plugin-window = "2.0.0-alpha" +# alternatively with Git: tauri-plugin-window = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` @@ -26,6 +28,13 @@ You can install the JavaScript Guest bindings using your preferred JavaScript pa > Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use. ```sh +pnpm add @tauri-apps/plugin-window +# or +npm add @tauri-apps/plugin-window +# or +yarn add @tauri-apps/plugin-window + +# alternatively with Git: pnpm add https://github.com/tauri-apps/tauri-plugin-window#v2 # or npm add https://github.com/tauri-apps/tauri-plugin-window#v2 @@ -51,7 +60,20 @@ fn main() { Afterwards all the plugin's APIs are available through the JavaScript guest bindings: ```javascript -import * as tauriWindow from "@tauri-apps/plugin-window"; +import { appWindow, WebviewWindow } from "@tauri-apps/plugin-window"; + +// manipulating this window +await appWindow.setResizable(false); + +// Creating new windows: +// loading embedded asset: +const webview = new WebviewWindow("theUniqueLabel", { + url: "path/to/page.html", +}); +// alternatively, load a remote URL: +const webview = new WebviewWindow("theUniqueLabel", { + url: "https://github.com/tauri-apps/tauri", +}); ``` ## Contributing diff --git a/plugins/window/guest-js/index.ts b/plugins/window/guest-js/index.ts index b330314b..038fdc05 100644 --- a/plugins/window/guest-js/index.ts +++ b/plugins/window/guest-js/index.ts @@ -5,51 +5,6 @@ /** * Provides APIs to create windows, communicate with other windows and manipulate the current window. * - * The APIs must be added to [`tauri.allowlist.window`](https://tauri.app/v1/api/config/#allowlistconfig.window) in `tauri.conf.json`: - * ```json - * { - * "tauri": { - * "allowlist": { - * "window": { - * "all": true, // enable all window APIs - * "create": true, // enable window creation - * "center": true, - * "requestUserAttention": true, - * "setResizable": true, - * "setTitle": true, - * "maximize": true, - * "unmaximize": true, - * "minimize": true, - * "unminimize": true, - * "show": true, - * "hide": true, - * "close": true, - * "setDecorations": true, - * "setShadow": true, - * "setAlwaysOnTop": true, - * "setContentProtected": true, - * "setSize": true, - * "setMinSize": true, - * "setMaxSize": true, - * "setPosition": true, - * "setFullscreen": true, - * "setFocus": true, - * "setIcon": true, - * "setSkipTaskbar": true, - * "setCursorGrab": true, - * "setCursorVisible": true, - * "setCursorIcon": true, - * "setCursorPosition": true, - * "setIgnoreCursorEvents": true, - * "startDragging": true, - * "print": true - * } - * } - * } - * } - * ``` - * It is recommended to allowlist only the APIs you use for optimal bundle size and security. - * * ## Window events * * Events can be listened to using `appWindow.listen`: diff --git a/shared/template/README.md b/shared/template/README.md index f1641d84..1a839763 100644 --- a/shared/template/README.md +++ b/shared/template/README.md @@ -1,4 +1,4 @@ -![{{plugin name}}](banner.jpg) +![{{plugin-name}}](banner.png) @@ -18,7 +18,9 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: ```toml [dependencies] - = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } +tauri-plugin-{{plugin-name}} = "2.0.0-alpha" +# alternatively with Git: +tauri-plugin-{{plugin-name}} = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` You can install the JavaScript Guest bindings using your preferred JavaScript package manager: @@ -26,11 +28,18 @@ You can install the JavaScript Guest bindings using your preferred JavaScript pa > Note: Since most JavaScript package managers are unable to install packages from git monorepos we provide read-only mirrors of each plugin. This makes installation option 2 more ergonomic to use. ```sh -pnpm add +pnpm add @tauri-apps/plugin-{{plugin-name}} # or -npm add +npm add @tauri-apps/plugin-{{plugin-name}} # or -yarn add +yarn add @tauri-apps/plugin-{{plugin-name}} + +# alternatively with Git: +pnpm add https://github.com/tauri-apps/tauri-plugin-{{plugin-name}}#v2 +# or +npm add https://github.com/tauri-apps/tauri-plugin-{{plugin-name}}#v2 +# or +yarn add https://github.com/tauri-apps/tauri-plugin-{{plugin-name}}#v2 ``` ## Usage @@ -42,7 +51,7 @@ First you need to register the core plugin with Tauri: ```rust fn main() { tauri::Builder::default() - .plugin() + .plugin(tauri_plugin_{{plugin-name}}::init()) .run(tauri::generate_context!()) .expect("error while running tauri application"); }