* fix(fs): report read errors of readTextFileLines
In plugins/fs/src/commands.rs read_text_file_lines_next, a read error was
mapped to "not done, empty line", so a persistent error such as EISDIR
(File::open of a directory succeeds on Unix) made the iterator yield ""
forever and the error was swallowed.
The command now closes the resource and returns the error; the JS iterator
resets its rid so a new iteration starts over. api-iife.js regenerated. E2E
spec iterates a directory and expects a rejection.
* fix(fs): close the file when a readTextFileLines loop exits early
In plugins/fs/guest-js/index.ts readTextFileLines, the async iterator did
not implement return(), so breaking out of a for await loop left the
StdLinesResource (an open file) in the webview resource table.
return() now closes the resource and resets the iterator. api-iife.js
regenerated. E2E spec breaks out of a loop, checks the resource id is no
longer valid and that iterating again starts over.
In plugins/fs/src/lib.rs OpenOptions::android_mode, the mode was built by
concatenating r/w/t/a, so open(url, {append: true}) (read defaults to
true) produced "ra" and write+truncate+append "wta", which
ParcelFileDescriptor.parseMode / ContentResolver reject.
The options now map to r, w, wt, wa, rw or rwt. append wins over the
default read (no read+append mode exists). create/createNew still have no
Android equivalent (documented on the function). Unit tests for the
mapping, compiled on the host with cfg(test).
In plugins/fs/guest-js/index.ts, the size function only sent `path`
although the Rust command accepts `options.baseDir` and the JSDoc example
passed `{ baseDir: BaseDirectory.AppData }` (a TS error, silently dropped
at runtime, so the relative path was rejected).
Adds an optional `options?: SizeOptions` parameter (new exported type).
api-iife.js regenerated. The e2e spec now measures a file and a directory
relative to AppData instead of working around the missing option.
In plugins/fs/src/commands.rs write_file_inner, a malformed or non-ASCII
`options` header was dropped with .ok(), so baseDir/append/createNew were
silently ignored and the call became a truncating write to the raw path;
the JSON array body fallback truncated values above 255 and dropped
non-numbers.
The header is parsed with parse_write_file_options: empty, `undefined`
(what fetch sends for JSON.stringify(undefined)) and `null` mean no
options, anything else must parse. Array bodies must only contain bytes.
Unit test for the header parser; e2e spec for writes without options,
which is the case the `undefined` handling keeps working.
In plugins/fs/src/watcher.rs, notify errors were discarded (TODO), so a
watch that died left no trace. They are now logged with log::error!.
Reporting them to the JS callback would change the event payload and is
deferred to v3.
* refactor(opener)!: rename reveal_item_in_dir command to reveal_items_in_dir
The `allow-reveal-item-in-dir` and `deny-reveal-item-in-dir` permissions
are now `allow-reveal-items-in-dir` and `deny-reveal-items-in-dir`. The
`revealItemInDir` JavaScript function and the Rust `Opener` methods are
unchanged.
* cr
* retain rust api
* fix build
* update docs, rename ts api
* cr
* Apply suggestion from @Legend-Master
---------
Co-authored-by: Tony <68118705+Legend-Master@users.noreply.github.com>
check() set both variables to Debian paths when they were unset. On distros
with a different layout, such as ALT Linux, the paths do not exist, and
rustls-native-certs then loads roots only from them, so every TLS client
created afterwards in the app got an empty root store.
reqwest with rustls already finds the system store through
rustls-platform-verifier and openssl-probe, so the override is not needed.
Closes#3598
* refactor(shell)!: remove deprecated open API
`open` has been deprecated since 2.1.0 in favor of tauri-plugin-opener.
This removes:
- the `open` command and its `allow-open`/`deny-open` permissions
(`shell:default` now grants nothing)
- the `plugins > shell > open` configuration; `init()` returns
`TauriPlugin<R>` again
- `Shell::open`, the `tauri_plugin_shell::open` module and
`Error::UnknownProgramName`
- the `open` JavaScript function
- the Android and iOS plugins, since `open` was their only command
* chore(examples): drop the now empty shell:default permission set
---------
Co-authored-by: Lucas Nogueira <lucas@crabnebula.dev>
* refactor(updater)!: remove deprecated Update.available field
It was always `true`; check whether `check()` returned `null` instead.
* fix(examples): remove usage of the dropped Update.available field
* Update .changes/updater-remove-available.md
---------
Co-authored-by: Amr Bashir <github@amrbashir.me>
`upload(url, path, onProgress, { headers, method })` and
`download(url, path, onProgress, { headers, body })` replace the
positional optional arguments.
`headers` accepts both a `Map` and a plain object; previously a `Map`
was silently serialized as an empty object.
* refactor(dialog)!: remove deprecated MessageDialogOptions.okLabel
Use `buttons: { ok: 'label' }` instead. `ConfirmDialogOptions` (used by
`ask` and `confirm`) still accepts `okLabel` and `cancelLabel`.
* Apply suggestion from @amrbashir
---------
Co-authored-by: Amr Bashir <github@amrbashir.me>
* refactor(fs)!: return Watcher from watch and watchImmediate
Both resolve to a `Watcher` resource instead of an `UnwatchFn` callback;
call `await watcher.close()` to stop watching. `UnwatchFn` is removed and
`Watcher` is now exported.
* fix change file
* fmt
`WatchEvent` now follows notify v8's format: the event kind is flattened
into the event, with `type` holding the top-level kind and `kind`/`mode`
refining it, e.g. `{ type: 'modify', kind: 'data', mode: 'content' }`
instead of `{ type: { modify: { kind: 'data', mode: 'content' } } }`.
`attrs` is now typed as `WatchEventAttributes` and its `flag` is
`rescan` instead of `Rescan`.