Merge branch 'tauri-apps:v2' into v2

pull/2454/head
Charles Schaefer 5 months ago committed by GitHub
commit 93c3441248
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -1,6 +0,0 @@
---
"log": patch
"log-js": patch
---
Fix timezone_strategy overwriting previously set LogLevels.

@ -1,5 +0,0 @@
---
single-instance: patch
---
Fixed an issue that caused `null pointer dereference occurred` errors on rust nightly.

@ -1,6 +0,0 @@
---
updater: patch
updater-js: patch
---
Fixed an issue that caused the plugin to emit a `ReleaseNotFound` error instead of a `Reqwest` error when the http request in `check()` failed.

8
Cargo.lock generated

@ -206,7 +206,7 @@ checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775"
[[package]] [[package]]
name = "api" name = "api"
version = "2.0.17" version = "2.0.18"
dependencies = [ dependencies = [
"log", "log",
"serde", "serde",
@ -6737,7 +6737,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-log" name = "tauri-plugin-log"
version = "2.2.1" version = "2.2.2"
dependencies = [ dependencies = [
"android_logger", "android_logger",
"byte-unit", "byte-unit",
@ -6882,7 +6882,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-single-instance" name = "tauri-plugin-single-instance"
version = "2.2.1" version = "2.2.2"
dependencies = [ dependencies = [
"semver", "semver",
"serde", "serde",
@ -6949,7 +6949,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin-updater" name = "tauri-plugin-updater"
version = "2.5.0" version = "2.5.1"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"dirs 6.0.0", "dirs 6.0.0",

@ -1,5 +1,12 @@
# Changelog # Changelog
## \[2.0.14]
### Dependencies
- Upgraded to `log-js@2.2.2`
- Upgraded to `updater-js@2.5.1`
## \[2.0.13] ## \[2.0.13]
### Dependencies ### Dependencies

@ -1,7 +1,7 @@
{ {
"name": "api", "name": "api",
"private": true, "private": true,
"version": "2.0.13", "version": "2.0.14",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite --clearScreen false", "dev": "vite --clearScreen false",
@ -28,7 +28,7 @@
"@tauri-apps/plugin-process": "^2.2.0", "@tauri-apps/plugin-process": "^2.2.0",
"@tauri-apps/plugin-shell": "^2.2.0", "@tauri-apps/plugin-shell": "^2.2.0",
"@tauri-apps/plugin-store": "^2.2.0", "@tauri-apps/plugin-store": "^2.2.0",
"@tauri-apps/plugin-updater": "^2.5.0", "@tauri-apps/plugin-updater": "^2.5.1",
"@zerodevx/svelte-json-view": "1.0.11" "@zerodevx/svelte-json-view": "1.0.11"
}, },
"devDependencies": { "devDependencies": {

@ -1,5 +1,12 @@
# Changelog # Changelog
## \[2.0.18]
### Dependencies
- Upgraded to `log@2.2.2`
- Upgraded to `updater@2.5.1`
## \[2.0.17] ## \[2.0.17]
### Dependencies ### Dependencies

@ -1,7 +1,7 @@
[package] [package]
name = "api" name = "api"
publish = false publish = false
version = "2.0.17" version = "2.0.18"
description = "An example Tauri Application showcasing the api" description = "An example Tauri Application showcasing the api"
edition = "2021" edition = "2021"
rust-version = { workspace = true } rust-version = { workspace = true }
@ -19,7 +19,7 @@ serde_json = { workspace = true }
serde = { workspace = true } serde = { workspace = true }
tiny_http = "0.12" tiny_http = "0.12"
log = { workspace = true } log = { workspace = true }
tauri-plugin-log = { path = "../../../plugins/log", version = "2.2.1" } tauri-plugin-log = { path = "../../../plugins/log", version = "2.2.2" }
tauri-plugin-fs = { path = "../../../plugins/fs", version = "2.2.0", features = [ tauri-plugin-fs = { path = "../../../plugins/fs", version = "2.2.0", features = [
"watch", "watch",
] } ] }
@ -53,7 +53,7 @@ features = [
[target."cfg(any(target_os = \"macos\", windows, target_os = \"linux\", target_os = \"dragonfly\", target_os = \"freebsd\", target_os = \"openbsd\", target_os = \"netbsd\"))".dependencies] [target."cfg(any(target_os = \"macos\", windows, target_os = \"linux\", target_os = \"dragonfly\", target_os = \"freebsd\", target_os = \"openbsd\", target_os = \"netbsd\"))".dependencies]
tauri-plugin-cli = { path = "../../../plugins/cli", version = "2.2.0" } tauri-plugin-cli = { path = "../../../plugins/cli", version = "2.2.0" }
tauri-plugin-global-shortcut = { path = "../../../plugins/global-shortcut", version = "2.2.0" } tauri-plugin-global-shortcut = { path = "../../../plugins/global-shortcut", version = "2.2.0" }
tauri-plugin-updater = { path = "../../../plugins/updater", version = "2.5.0" } tauri-plugin-updater = { path = "../../../plugins/updater", version = "2.5.1" }
tauri-plugin-window-state = { path = "../../../plugins/window-state", version = "2.2.0" } tauri-plugin-window-state = { path = "../../../plugins/window-state", version = "2.2.0" }
[target."cfg(any(target_os = \"android\", target_os = \"ios\"))".dependencies] [target."cfg(any(target_os = \"android\", target_os = \"ios\"))".dependencies]

@ -1,5 +1,9 @@
# Changelog # Changelog
## \[2.2.2]
- [`6b4c3917`](https://github.com/tauri-apps/plugins-workspace/commit/6b4c3917389f4bc489d03b48a837557ac0584175) ([#2401](https://github.com/tauri-apps/plugins-workspace/pull/2401) by [@Seishiin](https://github.com/tauri-apps/plugins-workspace/../../Seishiin)) Fix timezone_strategy overwriting previously set LogLevels.
## \[2.2.1] ## \[2.2.1]
- [`784a54a3`](https://github.com/tauri-apps/plugins-workspace/commit/784a54a39094dfbaaa8dd123eb083c04dc6c3bb2) ([#2344](https://github.com/tauri-apps/plugins-workspace/pull/2344) by [@madsmtm](https://github.com/tauri-apps/plugins-workspace/../../madsmtm)) Use `objc2` instead of `objc`. - [`784a54a3`](https://github.com/tauri-apps/plugins-workspace/commit/784a54a39094dfbaaa8dd123eb083c04dc6c3bb2) ([#2344](https://github.com/tauri-apps/plugins-workspace/pull/2344) by [@madsmtm](https://github.com/tauri-apps/plugins-workspace/../../madsmtm)) Use `objc2` instead of `objc`.

@ -1,6 +1,6 @@
[package] [package]
name = "tauri-plugin-log" name = "tauri-plugin-log"
version = "2.2.1" version = "2.2.2"
description = "Configurable logging for your Tauri app." description = "Configurable logging for your Tauri app."
authors = { workspace = true } authors = { workspace = true }
license = { workspace = true } license = { workspace = true }

@ -1,6 +1,6 @@
{ {
"name": "@tauri-apps/plugin-log", "name": "@tauri-apps/plugin-log",
"version": "2.2.1", "version": "2.2.2",
"description": "Configurable logging for your Tauri app.", "description": "Configurable logging for your Tauri app.",
"license": "MIT OR Apache-2.0", "license": "MIT OR Apache-2.0",
"authors": [ "authors": [

@ -1,5 +1,9 @@
# Changelog # Changelog
## \[2.2.2]
- [`1ab5f157`](https://github.com/tauri-apps/plugins-workspace/commit/1ab5f1576333174095bc7dad4bef7a8576bb29ab) ([#2452](https://github.com/tauri-apps/plugins-workspace/pull/2452) by [@FabianLars](https://github.com/tauri-apps/plugins-workspace/../../FabianLars)) Fixed `null pointer dereference` panic on rust nightly on Windows.
## \[2.2.1] ## \[2.2.1]
- [`da5c59e2`](https://github.com/tauri-apps/plugins-workspace/commit/da5c59e2fe879d177e3cfd52fcacce85440423cb) ([#2271](https://github.com/tauri-apps/plugins-workspace/pull/2271) by [@renovate](https://github.com/tauri-apps/plugins-workspace/../../renovate)) Updated `zbus` dependency to version 5. No API changes. - [`da5c59e2`](https://github.com/tauri-apps/plugins-workspace/commit/da5c59e2fe879d177e3cfd52fcacce85440423cb) ([#2271](https://github.com/tauri-apps/plugins-workspace/pull/2271) by [@renovate](https://github.com/tauri-apps/plugins-workspace/../../renovate)) Updated `zbus` dependency to version 5. No API changes.

@ -1,6 +1,6 @@
[package] [package]
name = "tauri-plugin-single-instance" name = "tauri-plugin-single-instance"
version = "2.2.1" version = "2.2.2"
description = "Ensure a single instance of your tauri app is running." description = "Ensure a single instance of your tauri app is running."
authors = { workspace = true } authors = { workspace = true }
license = { workspace = true } license = { workspace = true }

@ -3,5 +3,5 @@
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
fn main() { fn main() {
tauri_build::build() tauri_build::build()
} }

@ -1,14 +0,0 @@
max_width = 100
hard_tabs = false
tab_spaces = 2
newline_style = "Auto"
use_small_heuristics = "Default"
reorder_imports = true
reorder_modules = true
remove_nested_parens = true
edition = "2021"
merge_derives = true
use_try_shorthand = false
use_field_init_shorthand = false
force_explicit_abi = true
imports_granularity = "Crate"

@ -3,16 +3,15 @@
// SPDX-License-Identifier: MIT // SPDX-License-Identifier: MIT
#![cfg_attr( #![cfg_attr(
all(not(debug_assertions), target_os = "windows"), all(not(debug_assertions), target_os = "windows"),
windows_subsystem = "windows" windows_subsystem = "windows"
)] )]
fn main() { fn main() {
tauri::Builder::default() tauri::Builder::default()
.plugin(tauri_plugin_cli::init()) .plugin(tauri_plugin_single_instance::init(|app, argv, cwd| {
.plugin(tauri_plugin_single_instance::init(|app, argv, cwd| { println!("{}, {argv:?}, {cwd}", app.package_info().name);
println!("{}, {argv:?}, {cwd}", app.package_info().name); }))
})) .run(tauri::generate_context!())
.run(tauri::generate_context!()) .expect("error while running tauri application");
.expect("error while running tauri application");
} }

@ -20,18 +20,38 @@ use windows_sys::Win32::{
}, },
UI::WindowsAndMessaging::{ UI::WindowsAndMessaging::{
self as w32wm, CreateWindowExW, DefWindowProcW, DestroyWindow, FindWindowW, self as w32wm, CreateWindowExW, DefWindowProcW, DestroyWindow, FindWindowW,
RegisterClassExW, SendMessageW, GWL_STYLE, GWL_USERDATA, WINDOW_LONG_PTR_INDEX, RegisterClassExW, SendMessageW, CREATESTRUCTW, GWLP_USERDATA, GWL_STYLE,
WM_COPYDATA, WM_DESTROY, WNDCLASSEXW, WS_EX_LAYERED, WS_EX_NOACTIVATE, WS_EX_TOOLWINDOW, WINDOW_LONG_PTR_INDEX, WM_COPYDATA, WM_CREATE, WM_DESTROY, WNDCLASSEXW, WS_EX_LAYERED,
WS_EX_TRANSPARENT, WS_OVERLAPPED, WS_POPUP, WS_VISIBLE, WS_EX_NOACTIVATE, WS_EX_TOOLWINDOW, WS_EX_TRANSPARENT, WS_OVERLAPPED, WS_POPUP, WS_VISIBLE,
}, },
}; };
const WMCOPYDATA_SINGLE_INSTANCE_DATA: usize = 1542;
struct MutexHandle(isize); struct MutexHandle(isize);
struct TargetWindowHandle(isize); struct TargetWindowHandle(isize);
const WMCOPYDATA_SINGLE_INSTANCE_DATA: usize = 1542; struct UserData<R: Runtime> {
app: AppHandle<R>,
callback: Box<SingleInstanceCallback<R>>,
}
impl<R: Runtime> UserData<R> {
unsafe fn from_hwnd_raw(hwnd: HWND) -> *mut Self {
GetWindowLongPtrW(hwnd, GWLP_USERDATA) as *mut Self
}
pub fn init<R: Runtime>(f: Box<SingleInstanceCallback<R>>) -> TauriPlugin<R> { unsafe fn from_hwnd<'a>(hwnd: HWND) -> &'a mut Self {
&mut *Self::from_hwnd_raw(hwnd)
}
fn run_callback(&mut self, args: Vec<String>, cwd: String) {
(self.callback)(&self.app, args, cwd)
}
}
pub fn init<R: Runtime>(callback: Box<SingleInstanceCallback<R>>) -> TauriPlugin<R> {
plugin::Builder::new("single-instance") plugin::Builder::new("single-instance")
.setup(|app, _api| { .setup(|app, _api| {
#[allow(unused_mut)] #[allow(unused_mut)]
@ -54,21 +74,22 @@ pub fn init<R: Runtime>(f: Box<SingleInstanceCallback<R>>) -> TauriPlugin<R> {
let hwnd = FindWindowW(class_name.as_ptr(), window_name.as_ptr()); let hwnd = FindWindowW(class_name.as_ptr(), window_name.as_ptr());
if !hwnd.is_null() { if !hwnd.is_null() {
let data = format!( let cwd = std::env::current_dir().unwrap_or_default();
"{}|{}\0", let cwd = cwd.to_str().unwrap_or_default();
std::env::current_dir()
.unwrap_or_default() let args = std::env::args().collect::<Vec<String>>().join("|");
.to_str()
.unwrap_or_default(), let data = format!("{cwd}|{args}\0",);
std::env::args().collect::<Vec<String>>().join("|")
);
let bytes = data.as_bytes(); let bytes = data.as_bytes();
let cds = COPYDATASTRUCT { let cds = COPYDATASTRUCT {
dwData: WMCOPYDATA_SINGLE_INSTANCE_DATA, dwData: WMCOPYDATA_SINGLE_INSTANCE_DATA,
cbData: bytes.len() as _, cbData: bytes.len() as _,
lpData: bytes.as_ptr() as _, lpData: bytes.as_ptr() as _,
}; };
SendMessageW(hwnd, WM_COPYDATA, 0, &cds as *const _ as _); SendMessageW(hwnd, WM_COPYDATA, 0, &cds as *const _ as _);
app.cleanup_before_exit(); app.cleanup_before_exit();
std::process::exit(0); std::process::exit(0);
} }
@ -76,15 +97,12 @@ pub fn init<R: Runtime>(f: Box<SingleInstanceCallback<R>>) -> TauriPlugin<R> {
} else { } else {
app.manage(MutexHandle(hmutex as _)); app.manage(MutexHandle(hmutex as _));
let hwnd = create_event_target_window::<R>(&class_name, &window_name); let userdata = UserData {
unsafe { app: app.clone(),
SetWindowLongPtrW( callback,
hwnd,
GWL_USERDATA,
Box::into_raw(Box::new((app.clone(), f))) as _,
)
}; };
let userdata = Box::into_raw(Box::new(userdata));
let hwnd = create_event_target_window::<R>(&class_name, &window_name, userdata);
app.manage(TargetWindowHandle(hwnd as _)); app.manage(TargetWindowHandle(hwnd as _));
} }
@ -116,37 +134,43 @@ unsafe extern "system" fn single_instance_window_proc<R: Runtime>(
wparam: WPARAM, wparam: WPARAM,
lparam: LPARAM, lparam: LPARAM,
) -> LRESULT { ) -> LRESULT {
let data_ptr = GetWindowLongPtrW(hwnd, GWL_USERDATA)
as *mut (AppHandle<R>, Box<SingleInstanceCallback<R>>);
if data_ptr.is_null() {
return DefWindowProcW(hwnd, msg, wparam, lparam);
}
let (app_handle, callback) = &mut *data_ptr;
match msg { match msg {
WM_CREATE => {
let create_struct = &*(lparam as *const CREATESTRUCTW);
let userdata = create_struct.lpCreateParams as *const UserData<R>;
SetWindowLongPtrW(hwnd, GWLP_USERDATA, userdata as _);
0
}
WM_COPYDATA => { WM_COPYDATA => {
let cds_ptr = lparam as *const COPYDATASTRUCT; let cds_ptr = lparam as *const COPYDATASTRUCT;
if (*cds_ptr).dwData == WMCOPYDATA_SINGLE_INSTANCE_DATA { if (*cds_ptr).dwData == WMCOPYDATA_SINGLE_INSTANCE_DATA {
let userdata = UserData::<R>::from_hwnd(hwnd);
let data = CStr::from_ptr((*cds_ptr).lpData as _).to_string_lossy(); let data = CStr::from_ptr((*cds_ptr).lpData as _).to_string_lossy();
let mut s = data.split('|'); let mut s = data.split('|');
let cwd = s.next().unwrap(); let cwd = s.next().unwrap();
let args = s.map(|s| s.to_string()).collect(); let args = s.map(|s| s.to_string()).collect();
callback(app_handle, args, cwd.to_string());
userdata.run_callback(args, cwd.to_string());
} }
1 1
} }
WM_DESTROY => { WM_DESTROY => {
let _ = Box::from_raw(data_ptr); let userdata = UserData::<R>::from_hwnd_raw(hwnd);
drop(Box::from_raw(userdata));
0 0
} }
_ => DefWindowProcW(hwnd, msg, wparam, lparam), _ => DefWindowProcW(hwnd, msg, wparam, lparam),
} }
} }
fn create_event_target_window<R: Runtime>(class_name: &[u16], window_name: &[u16]) -> HWND { fn create_event_target_window<R: Runtime>(
class_name: &[u16],
window_name: &[u16],
userdata: *const UserData<R>,
) -> HWND {
unsafe { unsafe {
let class = WNDCLASSEXW { let class = WNDCLASSEXW {
cbSize: std::mem::size_of::<WNDCLASSEXW>() as u32, cbSize: std::mem::size_of::<WNDCLASSEXW>() as u32,
@ -187,7 +211,7 @@ fn create_event_target_window<R: Runtime>(class_name: &[u16], window_name: &[u16
std::ptr::null_mut(), std::ptr::null_mut(),
std::ptr::null_mut(), std::ptr::null_mut(),
GetModuleHandleW(std::ptr::null()), GetModuleHandleW(std::ptr::null()),
std::ptr::null(), userdata as _,
); );
SetWindowLongPtrW( SetWindowLongPtrW(
hwnd, hwnd,

@ -1,5 +1,9 @@
# Changelog # Changelog
## \[2.5.1]
- [`6f881293`](https://github.com/tauri-apps/plugins-workspace/commit/6f881293fcd67838f6f3f8063f536292431dd1f7) ([#2439](https://github.com/tauri-apps/plugins-workspace/pull/2439) by [@FabianLars](https://github.com/tauri-apps/plugins-workspace/../../FabianLars)) Fixed an issue that caused the plugin to emit a `ReleaseNotFound` error instead of a `Reqwest` error when the http request in `check()` failed.
## \[2.5.0] ## \[2.5.0]
- [`5369898d`](https://github.com/tauri-apps/plugins-workspace/commit/5369898db7a6098e3e2f43436100ea556d405628) ([#2067](https://github.com/tauri-apps/plugins-workspace/pull/2067) by [@jLynx](https://github.com/tauri-apps/plugins-workspace/../../jLynx)) Fix update installation on macOS when using an user without admin privileges. - [`5369898d`](https://github.com/tauri-apps/plugins-workspace/commit/5369898db7a6098e3e2f43436100ea556d405628) ([#2067](https://github.com/tauri-apps/plugins-workspace/pull/2067) by [@jLynx](https://github.com/tauri-apps/plugins-workspace/../../jLynx)) Fix update installation on macOS when using an user without admin privileges.

@ -1,6 +1,6 @@
[package] [package]
name = "tauri-plugin-updater" name = "tauri-plugin-updater"
version = "2.5.0" version = "2.5.1"
description = "In-app updates for Tauri applications." description = "In-app updates for Tauri applications."
edition = { workspace = true } edition = { workspace = true }
authors = { workspace = true } authors = { workspace = true }

@ -1,6 +1,6 @@
{ {
"name": "@tauri-apps/plugin-updater", "name": "@tauri-apps/plugin-updater",
"version": "2.5.0", "version": "2.5.1",
"license": "MIT OR Apache-2.0", "license": "MIT OR Apache-2.0",
"authors": [ "authors": [
"Tauri Programme within The Commons Conservancy" "Tauri Programme within The Commons Conservancy"

@ -109,7 +109,7 @@ importers:
specifier: ^2.2.0 specifier: ^2.2.0
version: link:../../plugins/store version: link:../../plugins/store
'@tauri-apps/plugin-updater': '@tauri-apps/plugin-updater':
specifier: ^2.5.0 specifier: ^2.5.1
version: link:../../plugins/updater version: link:../../plugins/updater
'@zerodevx/svelte-json-view': '@zerodevx/svelte-json-view':
specifier: 1.0.11 specifier: 1.0.11
@ -2428,9 +2428,9 @@ snapshots:
- encoding - encoding
- mocha - mocha
'@covector/assemble@0.12.0': '@covector/assemble@0.12.0(mocha@10.8.2)':
dependencies: dependencies:
'@covector/command': 0.8.0 '@covector/command': 0.8.0(mocha@10.8.2)
'@covector/files': 0.8.0 '@covector/files': 0.8.0
effection: 2.0.8(mocha@10.8.2) effection: 2.0.8(mocha@10.8.2)
js-yaml: 4.1.0 js-yaml: 4.1.0
@ -2441,9 +2441,10 @@ snapshots:
unified: 9.2.2 unified: 9.2.2
transitivePeerDependencies: transitivePeerDependencies:
- encoding - encoding
- mocha
- supports-color - supports-color
'@covector/changelog@0.12.0': '@covector/changelog@0.12.0(mocha@10.8.2)':
dependencies: dependencies:
'@covector/files': 0.8.0 '@covector/files': 0.8.0
effection: 2.0.8(mocha@10.8.2) effection: 2.0.8(mocha@10.8.2)
@ -2453,14 +2454,16 @@ snapshots:
unified: 9.2.2 unified: 9.2.2
transitivePeerDependencies: transitivePeerDependencies:
- encoding - encoding
- mocha
- supports-color - supports-color
'@covector/command@0.8.0': '@covector/command@0.8.0(mocha@10.8.2)':
dependencies: dependencies:
'@effection/process': 2.1.4 '@effection/process': 2.1.4(mocha@10.8.2)
effection: 2.0.8(mocha@10.8.2) effection: 2.0.8(mocha@10.8.2)
transitivePeerDependencies: transitivePeerDependencies:
- encoding - encoding
- mocha
'@covector/files@0.8.0': '@covector/files@0.8.0':
dependencies: dependencies:
@ -2507,10 +2510,8 @@ snapshots:
dependencies: dependencies:
effection: 2.0.8(mocha@10.8.2) effection: 2.0.8(mocha@10.8.2)
mocha: 10.8.2 mocha: 10.8.2
transitivePeerDependencies:
- encoding
'@effection/process@2.1.4': '@effection/process@2.1.4(mocha@10.8.2)':
dependencies: dependencies:
cross-spawn: 7.0.6 cross-spawn: 7.0.6
ctrlc-windows: 2.1.0 ctrlc-windows: 2.1.0
@ -2518,6 +2519,7 @@ snapshots:
shellwords: 0.1.1 shellwords: 0.1.1
transitivePeerDependencies: transitivePeerDependencies:
- encoding - encoding
- mocha
'@effection/stream@2.0.6': '@effection/stream@2.0.6':
dependencies: dependencies:
@ -3377,9 +3379,9 @@ snapshots:
dependencies: dependencies:
'@clack/prompts': 0.7.0 '@clack/prompts': 0.7.0
'@covector/apply': 0.10.0(mocha@10.8.2) '@covector/apply': 0.10.0(mocha@10.8.2)
'@covector/assemble': 0.12.0 '@covector/assemble': 0.12.0(mocha@10.8.2)
'@covector/changelog': 0.12.0 '@covector/changelog': 0.12.0(mocha@10.8.2)
'@covector/command': 0.8.0 '@covector/command': 0.8.0(mocha@10.8.2)
'@covector/files': 0.8.0 '@covector/files': 0.8.0
effection: 2.0.8(mocha@10.8.2) effection: 2.0.8(mocha@10.8.2)
globby: 11.1.0 globby: 11.1.0

Loading…
Cancel
Save