diff --git a/.changes/config.json b/.changes/config.json index 5792535f..f74e1a5f 100644 --- a/.changes/config.json +++ b/.changes/config.json @@ -88,15 +88,6 @@ "manager": "javascript-disabled" }, - "fs-watch": { - "path": "./plugins/fs-watch", - "manager": "rust-disabled" - }, - "fs-watch-js": { - "path": "./plugins/fs-watch", - "manager": "javascript-disabled" - }, - "global-shortcut": { "path": "./plugins/global-shortcut", "manager": "rust-disabled" diff --git a/Cargo.lock b/Cargo.lock index 266a3c38..7162dcc7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3100,9 +3100,9 @@ dependencies = [ [[package]] name = "notify" -version = "5.1.0" +version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58ea850aa68a06e48fdb069c0ec44d0d64c8dbffa49bf3b6f7f0a901fdea1ba9" +checksum = "729f63e1ca555a43fe3efa4f3efdf4801c479da85b432242a7b726f353c88486" dependencies = [ "bitflags 1.3.2", "crossbeam-channel", @@ -3114,7 +3114,7 @@ dependencies = [ "mio", "serde", "walkdir", - "windows-sys 0.42.0", + "windows-sys 0.45.0", ] [[package]] @@ -5150,23 +5150,12 @@ version = "0.0.0" dependencies = [ "anyhow", "glob", - "serde", - "tauri", - "thiserror", - "uuid", -] - -[[package]] -name = "tauri-plugin-fs-watch" -version = "0.0.0" -dependencies = [ - "log", "notify", "notify-debouncer-mini", "serde", - "serde_json", "tauri", "thiserror", + "uuid", ] [[package]] diff --git a/README.md b/README.md index edeb0ac5..1fdcf447 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,19 @@ ## Plugins Found Here -| | | Win | Mac | Lin | iOS | And | -| ------------------------------------------ | --------------------------------------------------------- | --- | --- | --- | --- | --- | -| [authenticator](plugins/authenticator) | Interface with hardware security keys. | ✅ | ✅ | ✅ | ? | ? | -| [autostart](plugins/autostart) | Automatically launch your app at system startup. | ✅ | ✅ | ✅ | ? | ? | -| [fs-extra](plugins/fs-extra) | File system methods that aren't included in the core API. | ✅ | ✅ | ✅ | ? | ? | -| [fs-watch](plugins/fs-watch) | Watch the filesystem for changes. | ✅ | ✅ | ✅ | ? | ? | -| [localhost](plugins/localhost) | Use a localhost server in production apps. | ✅ | ✅ | ✅ | ? | ? | -| [log](plugins/log) | Configurable logging. | ✅ | ✅ | ✅ | ✅ | ✅ | -| [persisted-scope](plugins/persisted-scope) | Persist runtime scope changes on the filesystem. | ✅ | ✅ | ✅ | ? | ? | -| [positioner](plugins/positioner) | Move windows to common locations. | ✅ | ✅ | ✅ | ? | ? | -| [single-instance](plugins/single-instance) | Ensure a single instance of your tauri app is running. | ✅ | ? | ✅ | ? | ? | -| [sql](plugins/sql) | Interface with SQL databases. | ✅ | ✅ | ✅ | ? | ? | -| [store](plugins/store) | Persistent key value storage. | ✅ | ✅ | ✅ | ? | ? | -| [stronghold](plugins/stronghold) | Encrypted, secure database. | ✅ | ✅ | ✅ | ? | ? | -| [upload](plugins/upload) | Tauri plugin for file uploads through HTTP. | ✅ | ✅ | ✅ | ? | ? | -| [websocket](plugins/websocket) | Open a WebSocket connection using a Rust client in JS. | ✅ | ✅ | ✅ | ? | ? | -| [window-state](plugins/window-state) | Persist window sizes and positions. | ✅ | ✅ | ✅ | ? | ? | +| | | Win | Mac | Lin | iOS | And | +| ------------------------------------------ | ------------------------------------------------------ | --- | --- | --- | --- | --- | +| [authenticator](plugins/authenticator) | Interface with hardware security keys. | ✅ | ✅ | ✅ | ? | ? | +| [autostart](plugins/autostart) | Automatically launch your app at system startup. | ✅ | ✅ | ✅ | ? | ? | +| [localhost](plugins/localhost) | Use a localhost server in production apps. | ✅ | ✅ | ✅ | ? | ? | +| [log](plugins/log) | Configurable logging. | ✅ | ✅ | ✅ | ✅ | ✅ | +| [persisted-scope](plugins/persisted-scope) | Persist runtime scope changes on the filesystem. | ✅ | ✅ | ✅ | ? | ? | +| [positioner](plugins/positioner) | Move windows to common locations. | ✅ | ✅ | ✅ | ? | ? | +| [single-instance](plugins/single-instance) | Ensure a single instance of your tauri app is running. | ✅ | ? | ✅ | ? | ? | +| [sql](plugins/sql) | Interface with SQL databases. | ✅ | ✅ | ✅ | ? | ? | +| [store](plugins/store) | Persistent key value storage. | ✅ | ✅ | ✅ | ? | ? | +| [stronghold](plugins/stronghold) | Encrypted, secure database. | ✅ | ✅ | ✅ | ? | ? | +| [upload](plugins/upload) | Tauri plugin for file uploads through HTTP. | ✅ | ✅ | ✅ | ? | ? | +| [websocket](plugins/websocket) | Open a WebSocket connection using a Rust client in JS. | ✅ | ✅ | ✅ | ? | ? | +| [window-state](plugins/window-state) | Persist window sizes and positions. | ✅ | ✅ | ✅ | ? | ? | _This repo and all plugins require a Rust version of at least **1.65**_ diff --git a/plugins/fs-watch/.gitignore b/plugins/fs-watch/.gitignore deleted file mode 100644 index b512c09d..00000000 --- a/plugins/fs-watch/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules \ No newline at end of file diff --git a/plugins/fs-watch/Cargo.toml b/plugins/fs-watch/Cargo.toml deleted file mode 100644 index 8431bae0..00000000 --- a/plugins/fs-watch/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -name = "tauri-plugin-fs-watch" -version = "0.0.0" -description = "Watch files and directories for changes." -authors.workspace = true -license.workspace = true -edition.workspace = true -rust-version.workspace = true - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -serde.workspace = true -serde_json.workspace = true -tauri.workspace = true -log.workspace = true -thiserror.workspace = true -notify = { version = "5" , features = ["serde"] } -notify-debouncer-mini = { version = "0.2.1" , features = ["serde"] } diff --git a/plugins/fs-watch/LICENSE.spdx b/plugins/fs-watch/LICENSE.spdx deleted file mode 100644 index cdd0df5a..00000000 --- a/plugins/fs-watch/LICENSE.spdx +++ /dev/null @@ -1,20 +0,0 @@ -SPDXVersion: SPDX-2.1 -DataLicense: CC0-1.0 -PackageName: tauri -DataFormat: SPDXRef-1 -PackageSupplier: Organization: The Tauri Programme in the Commons Conservancy -PackageHomePage: https://tauri.app -PackageLicenseDeclared: Apache-2.0 -PackageLicenseDeclared: MIT -PackageCopyrightText: 2019-2022, The Tauri Programme in the Commons Conservancy -PackageSummary: Tauri is a rust project that enables developers to make secure -and small desktop applications using a web frontend. - -PackageComment: The package includes the following libraries; see -Relationship information. - -Created: 2019-05-20T09:00:00Z -PackageDownloadLocation: git://github.com/tauri-apps/tauri -PackageDownloadLocation: git+https://github.com/tauri-apps/tauri.git -PackageDownloadLocation: git+ssh://github.com/tauri-apps/tauri.git -Creator: Person: Daniel Thompson-Yvetot \ No newline at end of file diff --git a/plugins/fs-watch/LICENSE_APACHE-2.0 b/plugins/fs-watch/LICENSE_APACHE-2.0 deleted file mode 100644 index 4947287f..00000000 --- a/plugins/fs-watch/LICENSE_APACHE-2.0 +++ /dev/null @@ -1,177 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/plugins/fs-watch/LICENSE_MIT b/plugins/fs-watch/LICENSE_MIT deleted file mode 100644 index 4d754725..00000000 --- a/plugins/fs-watch/LICENSE_MIT +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 - Present Tauri Apps Contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/plugins/fs-watch/README.md b/plugins/fs-watch/README.md deleted file mode 100644 index 63a154c8..00000000 --- a/plugins/fs-watch/README.md +++ /dev/null @@ -1,82 +0,0 @@ -![plugin-fs-watch](banner.png) - -Watch files and directories for changes using [notify](https://github.com/notify-rs/notify). - -## Install - -_This plugin requires a Rust version of at least **1.65**_ - -There are three general methods of installation that we can recommend. - -1. Use crates.io and npm (easiest, and requires you to trust that our publishing pipeline worked) -2. Pull sources directly from Github using git tags / revision hashes (most secure) -3. Git submodule install this repo in your tauri project and then use file protocol to ingest the source (most secure, but inconvenient to use) - -Install the Core plugin by adding the following to your `Cargo.toml` file: - -`src-tauri/Cargo.toml` - -```toml -[dependencies] -tauri-plugin-fs-watch = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } -``` - -You can install the JavaScript Guest bindings using your preferred JavaScript package manager: - -> 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-fs-watch#v2 -# or -npm add https://github.com/tauri-apps/tauri-plugin-fs-watch#v2 -# or -yarn add https://github.com/tauri-apps/tauri-plugin-fs-watch#v2 -``` - -## Usage - -First you need to register the core plugin with Tauri: - -`src-tauri/src/main.rs` - -```rust -fn main() { - tauri::Builder::default() - .plugin(tauri_plugin_fs_watch::init()) - .run(tauri::generate_context!()) - .expect("error while running tauri application"); -} -``` - -Afterwards all the plugin's APIs are available through the JavaScript guest bindings: - -```javascript -import { watch, watchImmediate } from "@tauri-apps/plugin-fs-watch"; - -// can also watch an array of paths -const stopWatching = await watch( - "/path/to/something", - (event) => { - const { type, payload } = event; - }, - { recursive: true } -); - -const stopRawWatcher = await watchImmediate( - ["/path/a", "/path/b"], - (event) => { - const { path, operation, cookie } = event; - }, - {} -); -``` - -## Contributing - -PRs accepted. Please make sure to read the Contributing Guide before making a pull request. - -## License - -Code: (c) 2015 - Present - The Tauri Programme within The Commons Conservancy. - -MIT or MIT/Apache 2.0 where applicable. diff --git a/plugins/fs-watch/banner.png b/plugins/fs-watch/banner.png deleted file mode 100644 index 6e77fe16..00000000 Binary files a/plugins/fs-watch/banner.png and /dev/null differ diff --git a/plugins/fs-watch/guest-js/index.ts b/plugins/fs-watch/guest-js/index.ts deleted file mode 100644 index 2aa58b0c..00000000 --- a/plugins/fs-watch/guest-js/index.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { invoke, transformCallback } from "@tauri-apps/api/tauri"; - -export interface WatchOptions { - recursive?: boolean; -} - -export interface DebouncedWatchOptions extends WatchOptions { - delayMs?: number; -} - -export type RawEvent = { - type: RawEventKind; - paths: string[]; - attrs: unknown; -}; - -type RawEventKind = - | "any " - | { - access?: unknown; - } - | { - create?: unknown; - } - | { - modify?: unknown; - } - | { - remove?: unknown; - } - | "other"; - -export type DebouncedEvent = - | { kind: "any"; path: string } - | { kind: "AnyContinous"; path: string }; - -async function unwatch(id: number): Promise { - await invoke("plugin:fs-watch|unwatch", { id }); -} - -// TODO: use channel from @tauri-apps/api on v2 -class Channel { - id: number; - // @ts-expect-error field used by the IPC serializer - private readonly __TAURI_CHANNEL_MARKER__ = true; - #onmessage: (response: T) => void = () => { - // no-op - }; - - constructor() { - this.id = transformCallback((response: T) => { - this.#onmessage(response); - }); - } - - set onmessage(handler: (response: T) => void) { - this.#onmessage = handler; - } - - get onmessage(): (response: T) => void { - return this.#onmessage; - } - - toJSON(): string { - return `__CHANNEL__:${this.id}`; - } -} - -export async function watch( - paths: string | string[], - cb: (event: DebouncedEvent) => void, - options: DebouncedWatchOptions = {} -): Promise<() => void> { - const opts = { - recursive: false, - delayMs: 2000, - ...options, - }; - let watchPaths; - if (typeof paths === "string") { - watchPaths = [paths]; - } else { - watchPaths = paths; - } - - const id = window.crypto.getRandomValues(new Uint32Array(1))[0]; - - const onEvent = new Channel(); - onEvent.onmessage = cb; - - await invoke("plugin:fs-watch|watch", { - id, - paths: watchPaths, - options: opts, - onEvent, - }); - - return () => { - void unwatch(id); - }; -} - -export async function watchImmediate( - paths: string | string[], - cb: (event: RawEvent) => void, - options: WatchOptions = {} -): Promise<() => void> { - const opts = { - recursive: false, - ...options, - delayMs: null, - }; - let watchPaths; - if (typeof paths === "string") { - watchPaths = [paths]; - } else { - watchPaths = paths; - } - - const id = window.crypto.getRandomValues(new Uint32Array(1))[0]; - - const onEvent = new Channel(); - onEvent.onmessage = cb; - - await invoke("plugin:fs-watch|watch", { - id, - paths: watchPaths, - options: opts, - onEvent, - }); - - return () => { - void unwatch(id); - }; -} diff --git a/plugins/fs-watch/package.json b/plugins/fs-watch/package.json deleted file mode 100644 index e5c0bb7a..00000000 --- a/plugins/fs-watch/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "@tauri-apps/plugin-fs-watch", - "version": "0.0.0", - "description": "Watch files and directories for changes.", - "license": "MIT or APACHE-2.0", - "authors": [ - "Tauri Programme within The Commons Conservancy" - ], - "type": "module", - "browser": "dist-js/index.min.js", - "module": "dist-js/index.mjs", - "types": "dist-js/index.d.ts", - "exports": { - "import": "./dist-js/index.mjs", - "types": "./dist-js/index.d.ts", - "browser": "./dist-js/index.min.js" - }, - "scripts": { - "build": "rollup -c" - }, - "files": [ - "dist-js", - "!dist-js/**/*.map", - "README.md", - "LICENSE" - ], - "devDependencies": { - "tslib": "^2.5.0" - }, - "dependencies": { - "@tauri-apps/api": "^1.2.0" - } -} diff --git a/plugins/fs-watch/rollup.config.mjs b/plugins/fs-watch/rollup.config.mjs deleted file mode 100644 index 6555e98b..00000000 --- a/plugins/fs-watch/rollup.config.mjs +++ /dev/null @@ -1,11 +0,0 @@ -import { readFileSync } from "fs"; - -import { createConfig } from "../../shared/rollup.config.mjs"; - -export default createConfig({ - input: "guest-js/index.ts", - pkg: JSON.parse( - readFileSync(new URL("./package.json", import.meta.url), "utf8") - ), - external: [/^@tauri-apps\/api/], -}); diff --git a/plugins/fs-watch/tsconfig.json b/plugins/fs-watch/tsconfig.json deleted file mode 120000 index 7cd38da8..00000000 --- a/plugins/fs-watch/tsconfig.json +++ /dev/null @@ -1 +0,0 @@ -../../shared/tsconfig.json \ No newline at end of file diff --git a/plugins/fs/Cargo.toml b/plugins/fs/Cargo.toml index bb3980b6..9ec49e97 100644 --- a/plugins/fs/Cargo.toml +++ b/plugins/fs/Cargo.toml @@ -16,3 +16,8 @@ thiserror.workspace = true anyhow = "1" uuid = { version = "1", features = ["v4"] } glob = "0.3" +notify = { version = "5", optional = true, features = ["serde"] } +notify-debouncer-mini = { version = "0.2.1", optional = true, features = ["serde"] } + +[features] +watch = ["notify", "notify-debouncer-mini"] diff --git a/plugins/fs/src/error.rs b/plugins/fs/src/error.rs index 9af56db3..e627b458 100644 --- a/plugins/fs/src/error.rs +++ b/plugins/fs/src/error.rs @@ -13,6 +13,10 @@ pub enum Error { /// Invalid glob pattern. #[error("invalid glob pattern: {0}")] GlobPattern(#[from] glob::PatternError), + /// Watcher error. + #[cfg(feature = "watch")] + #[error(transparent)] + Watch(#[from] notify::Error), } impl Serialize for Error { diff --git a/plugins/fs/src/lib.rs b/plugins/fs/src/lib.rs index 737189d5..023d04e6 100644 --- a/plugins/fs/src/lib.rs +++ b/plugins/fs/src/lib.rs @@ -12,6 +12,8 @@ mod commands; mod config; mod error; mod scope; +#[cfg(feature = "watch")] +mod watcher; pub use config::Config; pub use error::Error; @@ -47,7 +49,11 @@ pub fn init() -> TauriPlugin> { commands::remove_file, commands::rename_file, commands::exists, - commands::metadata + commands::metadata, + #[cfg(feature = "watch")] + watcher::watch, + #[cfg(feature = "watch")] + watcher::unwatch ]) .setup(|app: &tauri::AppHandle, api| { let default_scope = FsScope::default(); @@ -58,6 +64,10 @@ pub fn init() -> TauriPlugin> { .map(|c| &c.scope) .unwrap_or(&default_scope), )?); + + #[cfg(feature = "watch")] + app.manage(watcher::WatcherCollection::default()); + Ok(()) }) .on_event(|app, event| { diff --git a/plugins/fs-watch/src/lib.rs b/plugins/fs/src/watcher.rs similarity index 72% rename from plugins/fs-watch/src/lib.rs rename to plugins/fs/src/watcher.rs index d0a9f783..79cb34a2 100644 --- a/plugins/fs-watch/src/lib.rs +++ b/plugins/fs/src/watcher.rs @@ -1,12 +1,9 @@ use notify::{Config, Event, RecommendedWatcher, RecursiveMode, Watcher}; use notify_debouncer_mini::{new_debouncer, DebounceEventResult, Debouncer}; -use serde::{ser::Serializer, Deserialize, Serialize}; -use tauri::{ - api::ipc::Channel, - command, - plugin::{Builder as PluginBuilder, TauriPlugin}, - Manager, Runtime, State, -}; +use serde::Deserialize; +use tauri::{api::ipc::Channel, command, Runtime, State}; + +use crate::Result; use std::{ collections::HashMap, @@ -19,26 +16,10 @@ use std::{ time::Duration, }; -type Result = std::result::Result; type Id = u32; -#[derive(Debug, thiserror::Error)] -pub enum Error { - #[error(transparent)] - Watch(#[from] notify::Error), -} - -impl Serialize for Error { - fn serialize(&self, serializer: S) -> std::result::Result - where - S: Serializer, - { - serializer.serialize_str(self.to_string().as_ref()) - } -} - #[derive(Default)] -struct WatcherCollection(Mutex)>>); +pub struct WatcherCollection(Mutex)>>); enum WatcherKind { Debouncer(Debouncer), @@ -69,13 +50,13 @@ fn watch_debounced(on_event: Channel, rx: Receiver, recursive: bool, } #[command] -async fn watch( +pub async fn watch( watchers: State<'_, WatcherCollection>, id: Id, paths: Vec, @@ -113,7 +94,7 @@ async fn watch( } #[command] -async fn unwatch(watchers: State<'_, WatcherCollection>, id: Id) -> Result<()> { +pub async fn unwatch(watchers: State<'_, WatcherCollection>, id: Id) -> Result<()> { if let Some((watcher, paths)) = watchers.0.lock().unwrap().remove(&id) { match watcher { WatcherKind::Debouncer(mut debouncer) => { @@ -130,13 +111,3 @@ async fn unwatch(watchers: State<'_, WatcherCollection>, id: Id) -> Result<()> { } Ok(()) } - -pub fn init() -> TauriPlugin { - PluginBuilder::new("fs-watch") - .invoke_handler(tauri::generate_handler![watch, unwatch]) - .setup(|app, _api| { - app.manage(WatcherCollection::default()); - Ok(()) - }) - .build() -} diff --git a/plugins/http/README.md b/plugins/http/README.md index de55e8dd..729cedfa 100644 --- a/plugins/http/README.md +++ b/plugins/http/README.md @@ -18,7 +18,7 @@ Install the Core plugin by adding the following to your `Cargo.toml` file: ```toml [dependencies] -tauri-plugin-fs-extra = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } +tauri-plugin-http = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } ``` You can install the JavaScript Guest bindings using your preferred JavaScript package manager: diff --git a/plugins/mirrors.txt b/plugins/mirrors.txt index c785da72..c441d95e 100644 --- a/plugins/mirrors.txt +++ b/plugins/mirrors.txt @@ -4,7 +4,6 @@ cli clipboard dialog fs -fs-watch global-shortcut http localhost diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 15858968..dceddd2f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -58,9 +58,6 @@ importers: '@tauri-apps/cli': specifier: 2.0.0-alpha.8 version: 2.0.0-alpha.8 - '@zerodevx/svelte-json-view': - specifier: 0.2.1 - version: 0.2.1 '@tauri-apps/plugin-app': specifier: 0.0.0 version: link:../../plugins/app @@ -100,6 +97,9 @@ importers: '@tauri-apps/plugin-window': specifier: 0.0.0 version: link:../../plugins/window + '@zerodevx/svelte-json-view': + specifier: 0.2.1 + version: 0.2.1 devDependencies: '@iconify-json/codicon': specifier: ^1.1.10 @@ -193,16 +193,6 @@ importers: specifier: ^2.4.1 version: 2.4.1 - plugins/fs-watch: - dependencies: - '@tauri-apps/api': - specifier: ^1.2.0 - version: 1.2.0 - devDependencies: - tslib: - specifier: ^2.5.0 - version: 2.5.0 - plugins/global-shortcut: dependencies: '@tauri-apps/api':