From 7ea3e2abe8b67d4c665d2a3146c3df1b14219c65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Mon, 22 Jun 2026 15:06:36 +0200 Subject: [PATCH 01/11] =?UTF-8?q?feat(electron):=20Electron-compatible=20a?= =?UTF-8?q?pp=20shell=20=E2=80=94=20run=20existing=20Electron=20apps=20nat?= =?UTF-8?q?ively?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds `packages/electron`, a drop-in Electron-compat toolkit, plus the native support it needs (macOS first). Existing Electron app code (`app`, `BrowserWindow`, `ipcMain`, `contextBridge`, …) runs unmodified: app logic compiles native, the view runs in the OS-native webview (WKWebView) — Tauri-model internals, Electron API surface, no bundled Chromium, no Rust to write. Native (perry-ui-macos / perry-runtime / perry-codegen / perry-dispatch): - webview.rs: bidirectional IPC bridge — WKScriptMessageHandler (renderer→main), document-start user-script injection (add_user_script), set_on_message; file:// loads via loadFileURL:allowingReadAccessToURL: + allowFileAccessFromFileURLs so a file:// page can load its own subresources. - app.rs: app_run_loop (body-less event loop resolving whenReady), app_quit, full-window Auto-Layout pinning in window_set_body, window_show activates + orderFrontRegardless. - ui_loop.rs + codegen entry.rs hook: js_ui_loop_take_over runs the UI loop at the TOP LEVEL of generated main (not from a microtask) — required or windows created from app.whenReady().then(...) never composite on macOS. - FFI exports, perry-dispatch table rows, and types/perry/ui/index.d.ts decls. TS toolkit (packages/electron, a nativeModule package): - app, BrowserWindow, ipcMain, webContents, Menu, dialog, shell, contextBridge/ ipcRenderer implemented on perry/ui + node:*. - Renderer-side bridge runtime (bridge/preload-runtime.js): require('electron'), a CommonJS loader for local renderer requires, ipcRenderer/contextBridge, console forwarding to the main process. - examples/system-explorer: a full IPC demo (invoke/handle, send/on, main→renderer push, fs/os, persisted userData). Verified end-to-end on macOS: czonios/pomodoro-electron (vanilla) and electron-vite-react (React + Vite + Tailwind, contextBridge) run unmodified with rendering windows and working IPC. Known limits: macOS only so far (Windows/Linux bridge is the same pattern); dialog/Menu are v1 stubs; JSON-only IPC; renderer-side Node usage (old nodeIntegration + `remote` apps) is unsupported by design (system webview has no Node — same boundary as Tauri). --- crates/perry-codegen/src/codegen/entry.rs | 10 + .../src/runtime_decls/strings_part2.rs | 4 + crates/perry-dispatch/src/ui_table.rs | 38 ++ crates/perry-runtime/src/lib.rs | 1 + crates/perry-runtime/src/ui_loop.rs | 42 ++ crates/perry-ui-macos/src/app.rs | 181 +++++- .../src/lib_ffi/core_widgets.rs | 20 + .../src/lib_ffi/interactivity.rs | 8 + crates/perry-ui-macos/src/widgets/webview.rs | 177 ++++- packages/electron/.gitignore | 7 + packages/electron/DESIGN.md | 85 +++ packages/electron/README.md | 93 +++ packages/electron/bridge/preload-runtime.js | 202 ++++++ .../electron/examples/system-explorer/main.ts | 128 ++++ .../examples/system-explorer/package.json | 7 + .../examples/system-explorer/preload.js | 15 + .../system-explorer/renderer/index.html | 71 +++ .../system-explorer/renderer/renderer.js | 105 +++ packages/electron/package.json | 12 + packages/electron/src/index.ts | 602 ++++++++++++++++++ packages/electron/src/preload-runtime.ts | 206 ++++++ types/perry/ui/index.d.ts | 29 + 22 files changed, 2024 insertions(+), 19 deletions(-) create mode 100644 crates/perry-runtime/src/ui_loop.rs create mode 100644 packages/electron/.gitignore create mode 100644 packages/electron/DESIGN.md create mode 100644 packages/electron/README.md create mode 100644 packages/electron/bridge/preload-runtime.js create mode 100644 packages/electron/examples/system-explorer/main.ts create mode 100644 packages/electron/examples/system-explorer/package.json create mode 100644 packages/electron/examples/system-explorer/preload.js create mode 100644 packages/electron/examples/system-explorer/renderer/index.html create mode 100644 packages/electron/examples/system-explorer/renderer/renderer.js create mode 100644 packages/electron/package.json create mode 100644 packages/electron/src/index.ts create mode 100644 packages/electron/src/preload-runtime.ts diff --git a/crates/perry-codegen/src/codegen/entry.rs b/crates/perry-codegen/src/codegen/entry.rs index da5531b359..7ae9f2a5ed 100644 --- a/crates/perry-codegen/src/codegen/entry.rs +++ b/crates/perry-codegen/src/codegen/entry.rs @@ -696,6 +696,16 @@ pub(super) fn compile_module_entry( let _ = ctx.block().call(I32, "js_interval_timer_tick", &[]); } ctx.block().call_void("js_run_stdlib_pump", &[]); + + // Top-level UI loop takeover. If a windowed app requested a + // native UI event loop (e.g. the Electron-compat `app` shell), + // hand control to it HERE — at the true top level of `main`, + // before the async event loop. This is what lets a window + // created from `app.whenReady().then(...)` actually composite; + // entering `[NSApp run]` from a microtask leaves windows + // off-screen. No-op when no UI loop is registered. + ctx.block().call_void("js_ui_loop_take_over", &[]); + ctx.block().br(&header_label); // loop_header: check if there's any reason to keep running diff --git a/crates/perry-codegen/src/runtime_decls/strings_part2.rs b/crates/perry-codegen/src/runtime_decls/strings_part2.rs index 0c80f2c304..ac542cd25a 100644 --- a/crates/perry-codegen/src/runtime_decls/strings_part2.rs +++ b/crates/perry-codegen/src/runtime_decls/strings_part2.rs @@ -687,6 +687,10 @@ pub(crate) fn declare_phase_b_strings_part2(module: &mut LlModule) { // perry-runtime as a thin function-pointer trampoline so it's // safe to call even when perry-stdlib is not linked (no-op). module.declare_function("js_run_stdlib_pump", VOID, &[]); + // Top-level UI event-loop takeover (Electron-compat / windowed apps). If a + // native UI backend registered a blocking loop, this blocks here at the true + // top level; otherwise it's a no-op and the async event loop proceeds. + module.declare_function("js_ui_loop_take_over", VOID, &[]); module.declare_function("js_sleep_ms", VOID, &[DOUBLE]); // Issue #84: condvar-backed wait for the event loop / await busy-wait. // Replaces fixed-quantum `js_sleep_ms(10.0)` / `js_sleep_ms(1.0)`. diff --git a/crates/perry-dispatch/src/ui_table.rs b/crates/perry-dispatch/src/ui_table.rs index e168a9f4da..6c72cad790 100644 --- a/crates/perry-dispatch/src/ui_table.rs +++ b/crates/perry-dispatch/src/ui_table.rs @@ -655,6 +655,22 @@ pub const PERRY_UI_TABLE: &[MethodRow] = &[ args: &[ArgKind::Widget, ArgKind::Closure], ret: ReturnKind::Void, }, + // Electron-compat IPC bridge (renderer → main). `closure` receives the + // JSON string the page posts via the "perry" WKScriptMessageHandler. + MethodRow { + method: "webviewSetOnMessage", + runtime: "perry_ui_webview_set_on_message", + args: &[ArgKind::Widget, ArgKind::Closure], + ret: ReturnKind::Void, + }, + // Inject a document-start user script (bridge runtime + app preload) before + // the page's own scripts run. Call before webviewLoadUrl. + MethodRow { + method: "webviewAddUserScript", + runtime: "perry_ui_webview_add_user_script", + args: &[ArgKind::Widget, ArgKind::Str], + ret: ReturnKind::Void, + }, MethodRow { method: "webviewLoadUrl", runtime: "perry_ui_webview_load_url", @@ -1787,6 +1803,28 @@ pub const PERRY_UI_TABLE: &[MethodRow] = &[ ret: ReturnKind::I64AsF64, }, // ---- App lifecycle hooks ---- + // Electron-compat: body-less event loop. `appRunLoop(onReady)` blocks; the + // onReady closure resolves `app.whenReady()`. `appQuit()` terminates. + MethodRow { + method: "appRunLoop", + runtime: "perry_ui_app_run_loop", + args: &[ArgKind::Closure], + ret: ReturnKind::Void, + }, + // Non-blocking: registers the top-level UI loop; generated main enters it + // after the user's top-level code (so windows from whenReady().then composite). + MethodRow { + method: "appRequestLoop", + runtime: "perry_ui_app_request_loop", + args: &[ArgKind::Closure], + ret: ReturnKind::Void, + }, + MethodRow { + method: "appQuit", + runtime: "perry_ui_app_quit", + args: &[], + ret: ReturnKind::Void, + }, MethodRow { method: "onTerminate", runtime: "perry_ui_app_on_terminate", diff --git a/crates/perry-runtime/src/lib.rs b/crates/perry-runtime/src/lib.rs index 29d2e98cb1..319aabf325 100644 --- a/crates/perry-runtime/src/lib.rs +++ b/crates/perry-runtime/src/lib.rs @@ -108,6 +108,7 @@ pub mod temporal; pub mod text; pub mod timer; pub mod typed_feedback; +pub mod ui_loop; pub mod typedarray; pub mod typedarray_half; pub(crate) mod typedarray_props; diff --git a/crates/perry-runtime/src/ui_loop.rs b/crates/perry-runtime/src/ui_loop.rs new file mode 100644 index 0000000000..39aa3b13d6 --- /dev/null +++ b/crates/perry-runtime/src/ui_loop.rs @@ -0,0 +1,42 @@ +//! Top-level UI event-loop takeover. +//! +//! A native UI backend (perry-ui-macos, …) can register a blocking event-loop +//! function. Perry's generated `main` calls [`js_ui_loop_take_over`] once, at +//! the true top level (right before the normal async event loop), so the UI +//! backend's `[NSApp run]` becomes the outermost loop on the main thread. +//! +//! Why this matters: if the UI loop is entered from a microtask / the post-main +//! drain instead (e.g. `Promise.resolve().then(() => appRunLoop())`), the macOS +//! window server never composites the app's windows (they exist but report +//! `onscreen=None`). Entering it at the top level — the same context as the +//! classic blocking `App({...})` call — fixes that. Used by the Electron-compat +//! `app.whenReady()` shell, which can't itself block at the top level because it +//! must first let the user's `main` register `ipcMain`/`whenReady` handlers. + +use std::sync::atomic::{AtomicPtr, Ordering}; + +static UI_LOOP_FN: AtomicPtr<()> = AtomicPtr::new(std::ptr::null_mut()); + +/// Register a blocking UI event-loop entry point. The UI backend calls this +/// (indirectly, when the program requests a windowed loop) so that +/// [`js_ui_loop_take_over`] can hand control to it. Passing a null-equivalent +/// is not expected; registration is one-shot for the process lifetime. +#[no_mangle] +pub extern "C" fn perry_runtime_register_ui_loop(f: extern "C" fn()) { + UI_LOOP_FN.store(f as *mut (), Ordering::SeqCst); +} + +/// Called once by generated `main` at the top level, just before the normal +/// async event loop. If a UI loop was registered (a windowed app requested it), +/// this blocks in that loop for the lifetime of the app (it returns only if the +/// UI loop itself returns, which a real app's `[NSApp run]` does not — it exits +/// via `terminate:`). If nothing registered a UI loop, this is a no-op and the +/// normal event loop proceeds. +#[no_mangle] +pub extern "C" fn js_ui_loop_take_over() { + let p = UI_LOOP_FN.load(Ordering::SeqCst); + if !p.is_null() { + let f: extern "C" fn() = unsafe { std::mem::transmute(p) }; + f(); + } +} diff --git a/crates/perry-ui-macos/src/app.rs b/crates/perry-ui-macos/src/app.rs index 5dbb36f2ff..ea5838606c 100644 --- a/crates/perry-ui-macos/src/app.rs +++ b/crates/perry-ui-macos/src/app.rs @@ -604,6 +604,131 @@ pub fn app_run(_app_handle: i64) { app.run(); } +/// Body-less event loop for the Electron-compat shell (`app.whenReady()`). +/// +/// Unlike `app_run`, this does not expect any pre-built `App({...})` window. +/// It sets up `NSApplication`, the menu bar, the app delegate and the ~8ms +/// timer pump, then — once everything is in place — invokes the `on_ready` TS +/// closure (which resolves the shim's `app.whenReady()` promise) and blocks in +/// `NSApplication.run()`. The `.then(createWindow)` chain runs on the first pump +/// tick, so `new BrowserWindow()` / `Window()` create real windows while the +/// loop is live. Windows are created dynamically via the multi-window FFI +/// (`window_create` / `window_set_body` / `window_show`). +pub fn app_run_loop(on_ready: f64) { + crate::crash_log::install_crash_hooks(); + register_cross_platform_text_handlers(); + + let mtm = MainThreadMarker::new().expect("perry/ui must run on the main thread"); + let app = NSApplication::sharedApplication(mtm); + + let policy = PENDING_ACTIVATION_POLICY.with(|p| p.borrow().clone()); + let activation_policy = match policy.as_deref() { + Some("accessory") => NSApplicationActivationPolicy::Accessory, + Some("background") => NSApplicationActivationPolicy::Prohibited, + _ => NSApplicationActivationPolicy::Regular, + }; + app.setActivationPolicy(activation_policy); + + PENDING_ICON_PATH.with(|p| { + if let Some(path) = p.borrow().as_ref() { + unsafe { + let ns_path = NSString::from_str(path); + let image: Option> = + msg_send![NSImage::alloc(), initWithContentsOfFile: &*ns_path]; + if let Some(img) = image { + let _: () = msg_send![&*app, setApplicationIconImage: &*img]; + } + } + } + }); + + setup_menu_bar(&app, mtm); + flush_pending_shortcuts(mtm); + + unsafe { + let delegate = PerryAppDelegate::new(); + let _: () = msg_send![&*app, setDelegate: &*delegate]; + crate::deeplinks::install_apple_event_handler(&*delegate as *const _ as *const AnyObject); + std::mem::forget(delegate); + } + + #[allow(deprecated)] + app.activateIgnoringOtherApps(true); + + // ~8ms (120Hz) timer pump drives setTimeout/setInterval/microtasks/stdlib. + unsafe { + let target = PerryPumpTarget::new(); + let sel = Sel::register(c"pump:"); + let _: Retained = msg_send![ + objc2::class!(NSTimer), + scheduledTimerWithTimeInterval: 0.008f64, + target: &*target, + selector: sel, + userInfo: std::ptr::null::(), + repeats: true + ]; + std::mem::forget(target); + } + + install_test_mode_exit_timer(); + + // Resolve `app.whenReady()`. This only enqueues the `.then` microtask; it + // runs on the first pump tick once `app.run()` is spinning below. + if on_ready != 0.0 { + extern "C" { + fn js_nanbox_get_pointer(value: f64) -> i64; + fn js_closure_call0(closure: *const u8) -> f64; + } + crate::catch_callback_panic( + "app whenReady", + std::panic::AssertUnwindSafe(|| unsafe { + let ptr = js_nanbox_get_pointer(on_ready) as *const u8; + if !ptr.is_null() { + js_closure_call0(ptr); + } + }), + ); + } + + app.run(); +} + +thread_local! { + /// `on_ready` closure for the deferred top-level UI loop (Electron-compat). + static PENDING_APP_LOOP_ON_READY: std::cell::Cell = std::cell::Cell::new(0.0); +} + +/// Request the Electron-compat UI event loop be entered at the TOP LEVEL after +/// `main` (not from a microtask). The shim calls this during module init; it +/// stores `on_ready` and registers `ui_loop_entry` with the runtime so the +/// generated `main`'s `js_ui_loop_take_over()` hands control to `app_run_loop` +/// at the top level. Entering `[NSApp run]` from a microtask leaves windows +/// off-screen, so this top-level entry is required for windows to composite. +pub fn request_app_loop(on_ready: f64) { + extern "C" { + fn perry_runtime_register_ui_loop(f: extern "C" fn()); + } + PENDING_APP_LOOP_ON_READY.with(|c| c.set(on_ready)); + unsafe { + perry_runtime_register_ui_loop(ui_loop_entry); + } +} + +extern "C" fn ui_loop_entry() { + let on_ready = PENDING_APP_LOOP_ON_READY.with(|c| c.get()); + app_run_loop(on_ready); +} + +/// `app.quit()` — terminate the application (Electron-compat). +pub fn app_quit() { + if let Some(mtm) = MainThreadMarker::new() { + let app = NSApplication::sharedApplication(mtm); + unsafe { + let _: () = msg_send![&*app, terminate: std::ptr::null::()]; + } + } +} + /// If `PERRY_UI_TEST_MODE=1`, schedule an NSTimer that captures a screenshot /// (when `PERRY_UI_SCREENSHOT_PATH` is set) and exits the process cleanly. /// This lets doc-example programs be verified in CI without a human. @@ -1588,14 +1713,43 @@ pub fn window_create(title_ptr: *const u8, width: f64, height: f64) -> i64 { } } -/// Set the root widget of a window. +/// Set the root widget of a window, pinned to fill it. +/// +/// Unlike the bare `setContentView`, this pins the body to the window's +/// `contentLayoutGuide` with Auto Layout so a full-window webview (an Electron +/// `BrowserWindow` whose entire content is the page) fills and resizes with the +/// window. Mirrors the pinning `app_set_body` does for the main window. pub fn window_set_body(window_handle: i64, widget_handle: i64) { WINDOWS.with(|w| { let windows = w.borrow(); let idx = (window_handle - 1) as usize; if idx < windows.len() { if let Some(view) = crate::widgets::get_widget(widget_handle) { - windows[idx].window.setContentView(Some(&view)); + let window = &windows[idx].window; + window.setContentView(Some(&view)); + unsafe { + let _: () = objc2::msg_send![&*view, setTranslatesAutoresizingMaskIntoConstraints: false]; + let guide: Retained = msg_send![&**window, contentLayoutGuide]; + let guide_top: Retained = msg_send![&*guide, topAnchor]; + let guide_bottom: Retained = msg_send![&*guide, bottomAnchor]; + let guide_leading: Retained = msg_send![&*guide, leadingAnchor]; + let guide_trailing: Retained = msg_send![&*guide, trailingAnchor]; + + let top_anchor = view.topAnchor(); + let bottom_anchor = view.bottomAnchor(); + let leading_anchor = view.leadingAnchor(); + let trailing_anchor = view.trailingAnchor(); + + let c_top: Retained = msg_send![&*top_anchor, constraintEqualToAnchor: &*guide_top]; + let c_bottom: Retained = msg_send![&*bottom_anchor, constraintEqualToAnchor: &*guide_bottom]; + let c_leading: Retained = msg_send![&*leading_anchor, constraintEqualToAnchor: &*guide_leading]; + let c_trailing: Retained = msg_send![&*trailing_anchor, constraintEqualToAnchor: &*guide_trailing]; + + let _: () = msg_send![&*c_top, setActive: true]; + let _: () = msg_send![&*c_bottom, setActive: true]; + let _: () = msg_send![&*c_leading, setActive: true]; + let _: () = msg_send![&*c_trailing, setActive: true]; + } } } }); @@ -1607,8 +1761,27 @@ pub fn window_show(window_handle: i64) { let windows = w.borrow(); let idx = (window_handle - 1) as usize; if idx < windows.len() { - windows[idx].window.center(); - windows[idx].window.makeKeyAndOrderFront(None); + let window = &windows[idx].window; + // Activate the app first. In the Electron-compat loop, windows are + // created dynamically from a microtask *during* app_run_loop's + // `[NSApp run]` (via whenReady().then(createWindow)), after the + // initial activate(). Without re-activating + orderFrontRegardless + // the window is created but never composited on-screen + // (CGWindow `onscreen=None`) and `makeKeyAndOrderFront` alone is a + // no-op for a non-active app. + if let Some(mtm) = MainThreadMarker::new() { + let app = NSApplication::sharedApplication(mtm); + #[allow(deprecated)] + app.activateIgnoringOtherApps(true); + } + window.center(); + window.makeKeyAndOrderFront(None); + unsafe { + // Force the window on-screen regardless of app-active state — + // this is the piece that actually composites a window created + // mid-run-loop. + let _: () = msg_send![&**window, orderFrontRegardless]; + } } }); } diff --git a/crates/perry-ui-macos/src/lib_ffi/core_widgets.rs b/crates/perry-ui-macos/src/lib_ffi/core_widgets.rs index 35185830e6..36c750fe7f 100644 --- a/crates/perry-ui-macos/src/lib_ffi/core_widgets.rs +++ b/crates/perry-ui-macos/src/lib_ffi/core_widgets.rs @@ -23,6 +23,26 @@ pub extern "C" fn perry_ui_app_run(app_handle: i64) { app::app_run(app_handle); } +/// Electron-compat body-less event loop. Fires `on_ready` (resolves +/// `app.whenReady()`) then blocks. Windows are created dynamically afterward. +#[no_mangle] +pub extern "C" fn perry_ui_app_run_loop(on_ready: f64) { + app::app_run_loop(on_ready); +} + +/// `app.quit()` — terminate the application. +#[no_mangle] +pub extern "C" fn perry_ui_app_quit() { + app::app_quit(); +} + +/// Request the top-level Electron-compat UI loop (non-blocking; the generated +/// `main` enters it via `js_ui_loop_take_over` after the user's top-level code). +#[no_mangle] +pub extern "C" fn perry_ui_app_request_loop(on_ready: f64) { + app::request_app_loop(on_ready); +} + /// Set the application dock icon from a file path. #[no_mangle] pub extern "C" fn perry_ui_app_set_icon(path_ptr: i64) { diff --git a/crates/perry-ui-macos/src/lib_ffi/interactivity.rs b/crates/perry-ui-macos/src/lib_ffi/interactivity.rs index d1c09bb7f2..fb6899ba00 100644 --- a/crates/perry-ui-macos/src/lib_ffi/interactivity.rs +++ b/crates/perry-ui-macos/src/lib_ffi/interactivity.rs @@ -371,6 +371,14 @@ pub extern "C" fn perry_ui_webview_set_on_error(handle: i64, closure: f64) { widgets::webview::set_on_error(handle, closure) } #[no_mangle] +pub extern "C" fn perry_ui_webview_set_on_message(handle: i64, closure: f64) { + widgets::webview::set_on_message(handle, closure) +} +#[no_mangle] +pub extern "C" fn perry_ui_webview_add_user_script(handle: i64, src_ptr: i64) { + widgets::webview::add_user_script(handle, src_ptr as *const u8) +} +#[no_mangle] pub extern "C" fn perry_ui_webview_load_url(handle: i64, url_ptr: i64) { widgets::webview::load_url(handle, url_ptr as *const u8) } diff --git a/crates/perry-ui-macos/src/widgets/webview.rs b/crates/perry-ui-macos/src/widgets/webview.rs index ac472370b2..aa4fd4dc4f 100644 --- a/crates/perry-ui-macos/src/widgets/webview.rs +++ b/crates/perry-ui-macos/src/widgets/webview.rs @@ -52,6 +52,10 @@ struct WebViewState { on_should_navigate: f64, on_loaded: f64, on_error: f64, + /// Electron-compat IPC: TS closure invoked with the JSON string the page + /// posts via `window.webkit.messageHandlers.perry.postMessage(...)`. + /// 0.0 means "not registered". (renderer → main half of the bridge). + on_message: f64, /// Hard navigation allowlist. Empty = no restriction. URLs whose host /// matches any entry pass; others are rejected without invoking the user /// closure (security: prevents hijacked OAuth pages from redirecting to @@ -446,6 +450,51 @@ define_class!( ) { self.dispatch_error(error); } + + /// `userContentController:didReceiveScriptMessage:` — the inbound half + /// of the Electron-compat IPC bridge (WKScriptMessageHandler). The page + /// calls `window.webkit.messageHandlers.perry.postMessage(jsonString)`; + /// we hand the JSON string to the registered `on_message` TS closure. + /// The main process (compiled TS) parses it and replies via + /// `webviewEvaluateJs(...)` (the main → renderer half). + #[unsafe(method(userContentController:didReceiveScriptMessage:))] + fn did_receive_script_message( + &self, + _ucc: *mut AnyObject, + message: *mut AnyObject, + ) { + let key = self.ivars().callback_key.get(); + let on_message = WEBVIEW_STATES.with(|s| { + s.borrow().get(&key).map(|st| st.on_message).unwrap_or(0.0) + }); + if on_message == 0.0 { + return; + } + crate::catch_callback_panic( + "webview onMessage", + std::panic::AssertUnwindSafe(|| unsafe { + // The bridge always posts a JSON string, so `body` is an + // NSString. `description` is a safe fallback for anything else. + let body: *mut AnyObject = msg_send![message, body]; + let s = if !body.is_null() { + let descr: *mut AnyObject = msg_send![body, description]; + if !descr.is_null() { + let ns: &NSString = &*(descr as *const NSString); + ns.to_string() + } else { + String::new() + } + } else { + String::new() + }; + let nb = nanbox_str(&s); + let closure_ptr = js_nanbox_get_pointer(on_message) as *const u8; + if !closure_ptr.is_null() { + js_closure_call1(closure_ptr, nb); + } + }), + ); + } } ); @@ -515,7 +564,14 @@ pub fn create(url_ptr: *const u8, width: f64, height: f64, ephemeral_hint: f64) ), ); - // 1. WKWebViewConfiguration. v2-B: pass the ephemeral hint up + // 1. Delegate first — it doubles as the WKScriptMessageHandler, so it + // must exist before we build the configuration's content controller. + // The ivar key is the delegate's own address (stable for life). + let delegate = PerryWebViewDelegate::new(); + let key = Retained::as_ptr(&delegate) as usize; + delegate.ivars().callback_key.set(key); + + // 2. WKWebViewConfiguration. v2-B: pass the ephemeral hint up // front so the websiteDataStore is correct from the first // navigation onward. Default (1.0 = ephemeral) maps to // nonPersistentDataStore; 0.0 → defaultDataStore. @@ -530,24 +586,48 @@ pub fn create(url_ptr: *const u8, width: f64, height: f64, ephemeral_hint: f64) }; let _: () = msg_send![cfg, setWebsiteDataStore: store]; - // 2. WKWebView. + // 2b. WKUserContentController — the Electron-compat IPC bridge. + // Register the delegate as the "perry" script message handler so + // `window.webkit.messageHandlers.perry.postMessage(json)` in the + // page lands in `did_receive_script_message`. User scripts (the + // bridge runtime + the app's preload) are injected later via + // `add_user_script`. The content controller retains its handler + // strongly, so the delegate stays alive for IPC even though + // WKWebView only holds the nav/UI delegate weakly. + let ucc_cls = AnyClass::get(c"WKUserContentController") + .expect("WKUserContentController not found — link WebKit.framework"); + let ucc: *mut AnyObject = msg_send![ucc_cls, new]; + let handler_name = NSString::from_str("perry"); + let _: () = msg_send![ucc, addScriptMessageHandler: &*delegate, name: &*handler_name]; + let _: () = msg_send![cfg, setUserContentController: ucc]; + + // 2c. Allow a file:// document to load file:// subresources (its own + // + + diff --git a/packages/electron/examples/system-explorer/renderer/renderer.js b/packages/electron/examples/system-explorer/renderer/renderer.js new file mode 100644 index 0000000000..b1ed374a37 --- /dev/null +++ b/packages/electron/examples/system-explorer/renderer/renderer.js @@ -0,0 +1,105 @@ +// Renderer — plain web JS calling the contextBridge-exposed `window.api`, +// which routes over the Perry IPC bridge to the native main process. +const api = window.api; + +function fmtBytes(n) { + if (n < 1024) return n + " B"; + if (n < 1024 * 1024) return (n / 1024).toFixed(1) + " KB"; + return (n / (1024 * 1024)).toFixed(1) + " MB"; +} + +// ---- System info (invoke/handle round trip) ---- +async function loadSystem() { + const info = await api.getSystemInfo(); + const rows = [ + ["Platform", info.platform + " / " + info.arch], + ["Hostname", info.hostname], + ["CPU", info.cpuModel], + ["Cores", String(info.cpus)], + ["Memory", info.freeMemMB + " / " + info.totalMemMB + " MB free"], + ["Uptime", Math.round(info.uptimeSec / 60) + " min"], + ["Release", info.release], + ]; + document.getElementById("sysinfo").innerHTML = rows + .map((r) => '
' + r[0] + "" + r[1] + "
") + .join(""); + api.log("system info rendered: " + info.hostname); +} + +// ---- File listing + preview ---- +let lastDir = ""; +async function loadFiles() { + const res = await api.listDir(""); + lastDir = res.dir; + document.getElementById("crumbs").textContent = res.dir; + const html = res.entries + .map(function (e) { + const ic = e.isDir ? "📁" : "📄"; + const sz = e.isDir ? "" : '' + fmtBytes(e.sizeBytes) + ""; + return ( + '
' + + ic + + '' + + e.name + + "" + + sz + + "
" + ); + }) + .join(""); + const filesEl = document.getElementById("files"); + filesEl.innerHTML = html; + filesEl.querySelectorAll(".file").forEach(function (el) { + el.addEventListener("click", async function () { + if (el.getAttribute("data-dir") === "1") return; + const name = el.getAttribute("data-name"); + const fileRes = await api.readFile(lastDir + "/" + name); + const pre = document.getElementById("preview"); + pre.textContent = fileRes.ok ? fileRes.text : "⚠️ " + fileRes.error; + }); + }); +} + +// ---- Notes (persisted) ---- +let notes = []; +async function loadNotes() { + notes = await api.loadNotes(); + renderNotes(); +} +function renderNotes() { + document.getElementById("noteList").innerHTML = notes + .map(function (n) { + return '
' + escapeHtml(n) + "
"; + }) + .join(""); +} +function escapeHtml(s) { + return String(s).replace(/[&<>]/g, function (c) { + return c === "&" ? "&" : c === "<" ? "<" : ">"; + }); +} + +document.getElementById("addNote").addEventListener("click", async function () { + const input = document.getElementById("noteInput"); + const v = input.value.trim(); + if (!v) return; + notes.unshift(v); + input.value = ""; + renderNotes(); + const r = await api.saveNotes(notes); + api.log("saved " + r.count + " notes"); +}); + +// ---- Live clock push (main → renderer) ---- +api.onClockTick(function (iso) { + const d = new Date(iso); + document.getElementById("clock").textContent = d.toLocaleTimeString(); +}); + +loadSystem(); +loadFiles(); +loadNotes(); diff --git a/packages/electron/package.json b/packages/electron/package.json new file mode 100644 index 0000000000..b1832b00fc --- /dev/null +++ b/packages/electron/package.json @@ -0,0 +1,12 @@ +{ + "name": "electron", + "version": "0.1.0", + "description": "Electron-compatible app shell for Perry — run existing Electron apps natively (Tauri-model internals, Electron API surface)", + "main": "src/index.ts", + "types": "src/index.ts", + "perry": { + "nativeModule": true + }, + "keywords": ["perry", "electron", "desktop", "webview", "ipc"], + "license": "MIT" +} diff --git a/packages/electron/src/index.ts b/packages/electron/src/index.ts new file mode 100644 index 0000000000..d0c37cfa32 --- /dev/null +++ b/packages/electron/src/index.ts @@ -0,0 +1,602 @@ +// electron — Electron-compatible app shell for Perry. +// +// Existing Electron app code (`import { app, BrowserWindow, ipcMain } from +// 'electron'`) runs unmodified. App logic compiles natively; the view runs in +// the OS-native webview. Internals are the Tauri model (system webview, single +// native process); the public surface is Electron's. +// +// Main process (this file, compiled native): app, BrowserWindow, ipcMain, Menu, +// dialog, webContents. Renderer/preload (ipcRenderer, contextBridge) is the JS +// in ./preload-runtime.ts injected into each webview. + +import { EventEmitter } from "events"; +import { + Window, + WebView, + webviewLoadUrl, + webviewEvaluateJs, + webviewSetOnMessage, + webviewSetOnLoaded, + webviewAddUserScript, + appRequestLoop, + appQuit, +} from "perry/ui"; +import * as os from "os"; +import * as path from "path"; +import * as fs from "fs"; +import * as childProcess from "child_process"; +import { PRELOAD_RUNTIME } from "./preload-runtime"; + +// --------------------------------------------------------------------------- +// Small helpers for marshalling values across the webview boundary. +// --------------------------------------------------------------------------- + +function jsStringLiteral(s: string): string { + // Produce a JS source string literal for embedding in an evaluateJs payload. + return JSON.stringify(s); +} + +// Build `window.__perryResolve(id, ok, payload)` source. `payload` is the +// result re-encoded as a JS string literal of its JSON (double-encoded), which +// the renderer JSON.parses. undefined results pass the bare `undefined` token. +function resolveJs(id: number, ok: boolean, value: unknown): string { + let arg3: string; + if (value === undefined) { + arg3 = "undefined"; + } else { + arg3 = jsStringLiteral(JSON.stringify(value)); + } + return "window.__perryResolve(" + id + "," + (ok ? "true" : "false") + "," + arg3 + ")"; +} + +function deliverJs(channel: string, args: unknown[]): string { + const argsJson = JSON.stringify(args); + return "window.__perryDeliver(" + jsStringLiteral(channel) + "," + jsStringLiteral(argsJson) + ")"; +} + +// --------------------------------------------------------------------------- +// ipcMain +// --------------------------------------------------------------------------- + +type IpcInvokeHandler = (event: IpcMainInvokeEvent, ...args: any[]) => any; + +interface IpcMainInvokeEvent { + sender: WebContents; + frameId: number; + processId: number; +} + +interface IpcMainEvent { + sender: WebContents; + reply: (channel: string, ...args: any[]) => void; + frameId: number; + processId: number; + returnValue?: any; +} + +class IpcMain extends EventEmitter { + // channel -> invoke handler (for ipcRenderer.invoke / ipcMain.handle). + // Initialized in the constructor (not as a field initializer): Perry does not + // reliably run field initializers on EventEmitter subclasses. + private handlers: { [channel: string]: IpcInvokeHandler }; + + constructor() { + super(); + this.handlers = {}; + } + + handle(channel: string, listener: IpcInvokeHandler): void { + this.handlers[channel] = listener; + } + handleOnce(channel: string, listener: IpcInvokeHandler): void { + const self = this; + this.handlers[channel] = function (event: IpcMainInvokeEvent, ...args: any[]) { + delete self.handlers[channel]; + return listener(event, ...args); + }; + } + removeHandler(channel: string): void { + delete this.handlers[channel]; + } + + // Internal: dispatch a parsed message coming from a webview. + _dispatch(win: BrowserWindow, msg: { kind: string; id: number; channel: string; args: any[] }): void { + const wc = win.webContents; + if (msg.kind === "console") { + // Renderer console / errors forwarded over the bridge. + const text = msg.args && msg.args.length > 0 ? String(msg.args[0]) : ""; + if (msg.channel === "error") console.error("[renderer-console] " + text); + else console.log("[renderer-console] " + text); + return; + } + if (msg.kind === "invoke") { + const handler = this.handlers[msg.channel]; + const invokeEvent: IpcMainInvokeEvent = { sender: wc, frameId: 0, processId: 0 }; + if (!handler) { + wc._eval(resolveJs(msg.id, false, { message: "No handler registered for '" + msg.channel + "'" })); + return; + } + try { + const result = handler(invokeEvent, ...msg.args); + Promise.resolve(result).then( + (value) => wc._eval(resolveJs(msg.id, true, value)), + (err) => wc._eval(resolveJs(msg.id, false, { message: errMessage(err) })) + ); + } catch (err) { + wc._eval(resolveJs(msg.id, false, { message: errMessage(err) })); + } + } else if (msg.kind === "send") { + const event: IpcMainEvent = { + sender: wc, + reply: (channel: string, ...args: any[]) => wc.send(channel, ...args), + frameId: 0, + processId: 0, + }; + this.emit(msg.channel, event, ...msg.args); + } + } +} + +function errMessage(err: unknown): string { + if (err && typeof err === "object" && "message" in (err as any)) return String((err as any).message); + return String(err); +} + +export const ipcMain = new IpcMain(); + +// --------------------------------------------------------------------------- +// WebContents — the per-window bridge to its webview. +// --------------------------------------------------------------------------- + +class WebContents extends EventEmitter { + // The perry/ui WebView widget handle for this window. + _wv: any; + id: number; + + constructor(id: number) { + super(); + this._wv = 0; + this.id = id; + } + + _eval(js: string): void { + if (this._wv) { + webviewEvaluateJs(this._wv, js, (_result: string) => {}); + } + } + + // main -> renderer push (ipcRenderer.on receives it) + send(channel: string, ...args: any[]): void { + this._eval(deliverJs(channel, args)); + } + + executeJavaScript(code: string): Promise { + return new Promise((resolve) => { + if (!this._wv) { + resolve(undefined); + return; + } + webviewEvaluateJs(this._wv, code, (result: string) => resolve(result)); + }); + } + + openDevTools(): void { + /* no-op: system webview devtools are opened via the OS inspector */ + } + closeDevTools(): void {} + setWindowOpenHandler(_handler: (details: any) => any): void {} + get session(): any { + return { clearStorageData: () => Promise.resolve() }; + } +} + +// --------------------------------------------------------------------------- +// BrowserWindow +// --------------------------------------------------------------------------- + +interface BrowserWindowOptions { + width?: number; + height?: number; + title?: string; + show?: boolean; + webPreferences?: { preload?: string; [k: string]: any }; + [k: string]: any; +} + +let nextWebContentsId = 1; +const openWindows: BrowserWindow[] = []; + +// Keeps the app-ready closure passed to appRequestLoop alive from module init +// until the native loop fires it after main top-level (GC root). +let rootedOnReady: (() => void) | null = null; + +class BrowserWindow extends EventEmitter { + // perry/ui window operations, captured as closures over the LOCAL `win` in + // the constructor. This is required: perry/ui instance-method dispatch + // (setBody/show/…) only fires on a local flow-tracked from the `Window()` + // call — calling on a property receiver (`this.win.show()`) compiles to a + // generic no-op, so the window would never composite or respond. A closure + // capturing the local preserves the dispatch. + private _show: () => void; + private _hide: () => void; + private _close: () => void; + private _setSize: (w: number, h: number) => void; + webContents: WebContents; + private destroyed: boolean; + private preloadPath: string | undefined; + + constructor(options?: BrowserWindowOptions) { + super(); + this.destroyed = false; + const opts = options || {}; + const width = opts.width || 800; + const height = opts.height || 600; + const title = opts.title || ""; + this.preloadPath = opts.webPreferences && opts.webPreferences.preload; + + const win = Window(title, width, height); + this._show = () => win.show(); + this._hide = () => win.hide(); + this._close = () => win.close(); + this._setSize = (w: number, h: number) => win.setSize(w, h); + this.webContents = new WebContents(nextWebContentsId++); + + // Create the webview that fills the window. Start blank; load via + // loadFile/loadURL. Persistent data store (ephemeral=0) so apps keep state. + const wv = WebView({ url: "about:blank", width, height }); + this.webContents._wv = wv; + + // Inject the IPC bridge runtime + the app's preload (document-start), + // before any page loads. Order matters: bridge first so `require('electron')` + // and `contextBridge` exist when the app's preload runs. + webviewAddUserScript(wv, PRELOAD_RUNTIME); + if (this.preloadPath) { + const preloadSrc = tryReadFile(this.preloadPath); + if (preloadSrc) webviewAddUserScript(wv, preloadSrc); + } + + // Fire webContents 'did-finish-load' / 'dom-ready' when the page loads, so + // apps that push to the renderer after load (a very common pattern) work. + const self = this; + // NOTE: wires webContents 'did-finish-load'/'dom-ready' from the webview's + // onLoaded delegate. The native onLoaded currently doesn't fire for file:// + // loads (tracked gap) so apps that push to the renderer on load don't yet + // get the event; renderer→main and main→renderer IPC otherwise work. + webviewSetOnLoaded(wv, (_url: string) => { + self.webContents.emit("did-finish-load"); + self.webContents.emit("dom-ready"); + }); + + // Route inbound IPC from this window's renderer to ipcMain. + webviewSetOnMessage(wv, (json: string) => { + let msg: any; + try { + msg = JSON.parse(json); + } catch (e) { + return; + } + ipcMain._dispatch(self, msg); + }); + + win.setBody(wv); + if (opts.show !== false) { + win.show(); + } + openWindows.push(this); + } + + loadURL(url: string): Promise { + webviewLoadUrl(this.webContents._wv, url); + return Promise.resolve(); + } + + loadFile(filePath: string, _options?: any): Promise { + // Resolve relative to cwd; Electron resolves relative to the app dir. + const abs = path.isAbsolute(filePath) ? filePath : path.join(process.cwd(), filePath); + webviewLoadUrl(this.webContents._wv, "file://" + abs); + return Promise.resolve(); + } + + show(): void { + this._show(); + } + hide(): void { + this._hide(); + } + close(): void { + if (this.destroyed) return; + this.emit("close"); + this._close(); + this.destroyed = true; + const idx = openWindows.indexOf(this); + if (idx >= 0) openWindows.splice(idx, 1); + this.emit("closed"); + if (openWindows.length === 0) { + app.emit("window-all-closed"); + } + } + destroy(): void { + this.close(); + } + isDestroyed(): boolean { + return this.destroyed; + } + setSize(width: number, height: number): void { + this._setSize(width, height); + } + setTitle(_title: string): void { + /* perry/ui window title is set at create; runtime retitle is a follow-up */ + } + focus(): void { + this._show(); + } + + static getAllWindows(): BrowserWindow[] { + return openWindows.slice(); + } + static getFocusedWindow(): BrowserWindow | null { + return openWindows.length > 0 ? openWindows[openWindows.length - 1] : null; + } +} + +function tryReadFile(p: string): string | null { + try { + const abs = path.isAbsolute(p) ? p : path.join(process.cwd(), p); + return fs.readFileSync(abs, "utf8"); + } catch (e) { + console.error("[electron] failed to read preload '" + p + "': " + errMessage(e)); + return null; + } +} + +// --------------------------------------------------------------------------- +// app +// --------------------------------------------------------------------------- + +class App extends EventEmitter { + private ready: boolean; + private readyResolvers: Array<() => void>; + private loopScheduled: boolean; + private appName: string; + dock: { hide: () => void; show: () => void; setIcon: (icon: any) => void }; + + constructor() { + super(); + this.ready = false; + this.readyResolvers = []; + this.loopScheduled = false; + this.appName = "Perry App"; + this.dock = { hide: () => {}, show: () => {}, setIcon: (_icon: any) => {} }; + // Register the native UI event loop. This does NOT block — the generated + // `main` enters the loop at the top level AFTER the user's `main` top-level + // code runs (registering ipcMain/whenReady handlers). Entering the loop at + // the top level (rather than from a microtask) is what lets windows created + // in `whenReady().then(...)` actually composite on screen. + this.startLoop(); + } + + private startLoop(): void { + if (this.loopScheduled) return; + this.loopScheduled = true; + const self = this; + // onReady fires when the loop takes over (top level), resolving whenReady(); + // the `.then(createWindow)` chain then runs on the first pump tick. Held in + // a module-level slot (rootedOnReady) so GC can't collect it before then. + rootedOnReady = () => { + self.ready = true; + self.emit("ready"); + const resolvers = self.readyResolvers; + self.readyResolvers = []; + for (let i = 0; i < resolvers.length; i++) resolvers[i](); + }; + appRequestLoop(rootedOnReady); + } + + whenReady(): Promise { + if (this.ready) return Promise.resolve(); + const self = this; + return new Promise((resolve) => { + self.readyResolvers.push(resolve); + }); + } + + isReady(): boolean { + return this.ready; + } + + quit(): void { + this.emit("before-quit"); + this.emit("will-quit"); + appQuit(); + } + exit(_code?: number): void { + appQuit(); + } + + getName(): string { + return this.appName; + } + setName(name: string): void { + this.appName = name; + } + getVersion(): string { + return "0.0.0"; + } + getAppPath(): string { + return process.cwd(); + } + getPath(name: string): string { + const home = os.homedir(); + switch (name) { + case "home": + return home; + case "appData": + return path.join(home, "Library", "Application Support"); + case "userData": + return path.join(home, "Library", "Application Support", this.appName); + case "temp": + return os.tmpdir(); + case "desktop": + return path.join(home, "Desktop"); + case "documents": + return path.join(home, "Documents"); + case "downloads": + return path.join(home, "Downloads"); + case "exe": + return process.execPath || process.cwd(); + default: + return home; + } + } + requestSingleInstanceLock(): boolean { + return true; + } + setActivationPolicy(_policy: string): void {} +} + +export const app = new App(); + +// --------------------------------------------------------------------------- +// Menu / MenuItem (v1: template is accepted; native menubar wiring is a +// follow-up. setApplicationMenu(null) hides — accepted as a no-op so apps run.) +// --------------------------------------------------------------------------- + +class MenuItem { + label: string; + click?: () => void; + submenu?: any; + role?: string; + type?: string; + accelerator?: string; + constructor(opts: any) { + this.label = opts.label || ""; + this.click = opts.click; + this.submenu = opts.submenu; + this.role = opts.role; + this.type = opts.type; + this.accelerator = opts.accelerator; + } +} + +class Menu { + items: MenuItem[]; + constructor() { + this.items = []; + } + append(item: MenuItem): void { + this.items.push(item); + } + popup(_options?: any): void {} + static buildFromTemplate(template: any[]): Menu { + const menu = new Menu(); + for (let i = 0; i < template.length; i++) { + menu.append(new MenuItem(template[i])); + } + return menu; + } + static setApplicationMenu(_menu: Menu | null): void { + /* v1: native menubar already provides standard Cmd+Q etc. */ + } + static getApplicationMenu(): Menu | null { + return null; + } +} + +export { Menu, MenuItem, BrowserWindow, WebContents }; + +// --------------------------------------------------------------------------- +// dialog (v1: returns canceled; native NSOpenPanel/NSSavePanel wiring is a +// follow-up. Apps that gate on `canceled` keep running.) +// --------------------------------------------------------------------------- + +export const dialog = { + showOpenDialog(_window?: any, _options?: any): Promise<{ canceled: boolean; filePaths: string[] }> { + console.warn("[electron] dialog.showOpenDialog is a v1 stub (returns canceled)"); + return Promise.resolve({ canceled: true, filePaths: [] }); + }, + showSaveDialog(_window?: any, _options?: any): Promise<{ canceled: boolean; filePath: string }> { + console.warn("[electron] dialog.showSaveDialog is a v1 stub (returns canceled)"); + return Promise.resolve({ canceled: true, filePath: "" }); + }, + showMessageBox(_window?: any, _options?: any): Promise<{ response: number; checkboxChecked: boolean }> { + return Promise.resolve({ response: 0, checkboxChecked: false }); + }, + showErrorBox(title: string, content: string): void { + console.error("[electron] " + title + ": " + content); + }, +}; + +// --------------------------------------------------------------------------- +// shell +// --------------------------------------------------------------------------- + +export const shell = { + openExternal(url: string): Promise { + try { + childProcess.spawn("open", [url]); + } catch (e) { + console.error("[electron] shell.openExternal failed: " + errMessage(e)); + } + return Promise.resolve(); + }, + openPath(p: string): Promise { + try { + childProcess.spawn("open", [p]); + } catch (e) {} + return Promise.resolve(""); + }, + showItemInFolder(_p: string): void {}, + beep(): void {}, +}; + +// --------------------------------------------------------------------------- +// ipcRenderer / contextBridge — renderer-only in Electron. Provided here so a +// main-process `import { ipcRenderer } from 'electron'` doesn't crash; the real +// implementations run in the renderer (./preload-runtime.ts). +// --------------------------------------------------------------------------- + +export const ipcRenderer = { + invoke(_channel: string, ..._args: any[]): Promise { + return Promise.reject(new Error("ipcRenderer is only available in the renderer process")); + }, + send(_channel: string, ..._args: any[]): void {}, + on(_channel: string, _listener: any): any { + return ipcRenderer; + }, + once(_channel: string, _listener: any): any { + return ipcRenderer; + }, + removeListener(_channel: string, _listener: any): any { + return ipcRenderer; + }, + removeAllListeners(_channel?: string): any { + return ipcRenderer; + }, +}; + +export const contextBridge = { + exposeInMainWorld(_key: string, _api: any): void { + /* renderer-only; see preload-runtime.ts */ + }, +}; + +export const nativeTheme = { + shouldUseDarkColors: false, + themeSource: "system", + on: (_event: string, _cb: any) => {}, +}; + +// Default export mirrors `const electron = require('electron')`. +export default { + app, + BrowserWindow, + ipcMain, + ipcRenderer, + contextBridge, + Menu, + MenuItem, + dialog, + shell, + nativeTheme, + WebContents, +}; diff --git a/packages/electron/src/preload-runtime.ts b/packages/electron/src/preload-runtime.ts new file mode 100644 index 0000000000..08133b3c6a --- /dev/null +++ b/packages/electron/src/preload-runtime.ts @@ -0,0 +1,206 @@ +// AUTO-WRAPPED from bridge/preload-runtime.js — do not edit here; edit the .js and re-wrap. +// The renderer-side Electron-compat runtime, injected into every webview as a +// document-start user script (before the app preload) via webviewAddUserScript. +export const PRELOAD_RUNTIME: string = `// Renderer-side Electron-compat runtime. +// +// Injected into every webview as a document-start WKUserScript (before the app's own +// preload). Provides \`require('electron')\` → { ipcRenderer, contextBridge } and the +// transport to the native (Perry-compiled) main process. +// +// Transport: +// renderer -> main : window.webkit.messageHandlers.perry.postMessage(jsonString) +// (WebView2: window.chrome.webview.postMessage; GTK: same shape) +// main -> renderer : native evals window.__perryDeliver / __perryResolve into the page +(function () { + "use strict"; + if (window.__perryBridgeInstalled) return; + window.__perryBridgeInstalled = true; + + function postToNative(msg) { + var json = JSON.stringify(msg); + if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.perry) { + window.webkit.messageHandlers.perry.postMessage(json); // WKWebView (macOS/iOS) + } else if (window.chrome && window.chrome.webview) { + window.chrome.webview.postMessage(json); // WebView2 (Windows) + } else if (window.__perryNativePost) { + window.__perryNativePost(json); // GTK / fallback + } + // (no native channel → silently drop; console forwarding below would recurse) + } + + // Forward renderer console + uncaught errors to the native main process, so + // they land in the terminal (Electron pipes the renderer console to stdout via + // devtools; we do it over the bridge). Also the author's diagnostic window. + function fwd(level, args) { + try { + var parts = []; + for (var i = 0; i < args.length; i++) { + var a = args[i]; + parts.push(typeof a === "string" ? a : safeStringify(a)); + } + postToNative({ kind: "console", id: 0, channel: level, args: [parts.join(" ")] }); + } catch (e) {} + } + function safeStringify(v) { + try { return JSON.stringify(v); } catch (e) { return String(v); } + } + var realConsole = window.console || {}; + ["log", "info", "warn", "error", "debug"].forEach(function (level) { + var orig = realConsole[level] ? realConsole[level].bind(realConsole) : function () {}; + realConsole[level] = function () { + fwd(level, arguments); + orig.apply(null, arguments); + }; + }); + window.addEventListener("error", function (e) { + fwd("error", ["Uncaught " + (e.message || "error") + (e.filename ? " @ " + e.filename + ":" + e.lineno : "")]); + }); + window.addEventListener("unhandledrejection", function (e) { + fwd("error", ["Unhandled rejection: " + (e.reason && e.reason.message ? e.reason.message : safeStringify(e.reason))]); + }); + + var nextInvokeId = 1; + var pending = Object.create(null); // id -> {resolve, reject} + var listeners = Object.create(null); // channel -> [fn,...] + + // ---- main -> renderer entry points (called by native via evaluateJs) ---- + window.__perryResolve = function (id, ok, payloadJson) { + var p = pending[id]; + if (!p) return; + delete pending[id]; + var value = payloadJson === undefined ? undefined : JSON.parse(payloadJson); + if (ok) p.resolve(value); + else p.reject(Object.assign(new Error(value && value.message ? value.message : "ipc error"), value || {})); + }; + window.__perryDeliver = function (channel, payloadJson) { + var fns = listeners[channel]; + if (!fns || !fns.length) return; + var args = payloadJson === undefined ? [] : JSON.parse(payloadJson); + var event = { sender: ipcRenderer, senderId: 0 }; + for (var i = 0; i < fns.length; i++) { + try { fns[i].apply(null, [event].concat(args)); } + catch (e) { console.error("[perry-electron] listener for '" + channel + "' threw:", e); } + } + }; + + // ---- ipcRenderer ---- + var ipcRenderer = { + invoke: function (channel) { + var args = Array.prototype.slice.call(arguments, 1); + var id = nextInvokeId++; + return new Promise(function (resolve, reject) { + pending[id] = { resolve: resolve, reject: reject }; + postToNative({ kind: "invoke", id: id, channel: channel, args: args }); + }); + }, + send: function (channel) { + var args = Array.prototype.slice.call(arguments, 1); + postToNative({ kind: "send", id: 0, channel: channel, args: args }); + }, + sendSync: function () { + throw new Error("[perry-electron] ipcRenderer.sendSync is not supported; use invoke()"); + }, + on: function (channel, fn) { + (listeners[channel] || (listeners[channel] = [])).push(fn); + return ipcRenderer; + }, + once: function (channel, fn) { + var wrap = function () { ipcRenderer.removeListener(channel, wrap); return fn.apply(this, arguments); }; + return ipcRenderer.on(channel, wrap); + }, + removeListener: function (channel, fn) { + var fns = listeners[channel]; + if (fns) listeners[channel] = fns.filter(function (f) { return f !== fn; }); + return ipcRenderer; + }, + removeAllListeners: function (channel) { + if (channel === undefined) listeners = Object.create(null); + else delete listeners[channel]; + return ipcRenderer; + }, + }; + + // ---- contextBridge ---- + var contextBridge = { + exposeInMainWorld: function (key, api) { + // configurable:true so a renderer's top-level \`const x = window.x\` doesn't + // throw "duplicate variable that shadows a global property" in JSC. (Real + // Electron isolates the preload in a separate world; we share one world, + // so the exposed name must not be a non-configurable global binding.) + try { + Object.defineProperty(window, key, { + value: Object.freeze(deepBind(api)), + enumerable: true, + writable: false, + configurable: true, + }); + } catch (e) { + window[key] = deepBind(api); // some apps re-expose; be lenient + } + }, + exposeInIsolatedWorld: function (_worldId, key, api) { contextBridge.exposeInMainWorld(key, api); }, + }; + function deepBind(api) { + if (typeof api === "function") return api; + if (api && typeof api === "object") { + var out = Array.isArray(api) ? [] : {}; + for (var k in api) out[k] = deepBind(api[k]); + return out; + } + return api; + } + + // ---- require() for the renderer ---- + // Provides require('electron'), and a CommonJS loader for LOCAL files + // (require('./foo.js')) so old nodeIntegration-style apps that load their + // scripts/jQuery via require keep working — we sync-fetch the file and eval it + // as a CommonJS module. (Node *builtins* are not available in the webview.) + var electron = { ipcRenderer: ipcRenderer, contextBridge: contextBridge, webFrame: { setZoomFactor: function () {}, setZoomLevel: function () {} } }; + var moduleCache = Object.create(null); + + function loadSync(url) { + try { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); // sync — required for CommonJS require() semantics + xhr.send(); + if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) return xhr.responseText; + } catch (e) {} + return null; + } + function resolveUrl(name, base) { + try { return new URL(name, base).href; } catch (e) { return name; } + } + function makeRequire(baseUrl) { + return function (name) { + if (name === "electron") return electron; + if (name.charAt(0) === "." || name.charAt(0) === "/") { + var url = resolveUrl(name, baseUrl); + var src = loadSync(url); + if (src === null && url.slice(-3) !== ".js") { url = url + ".js"; src = loadSync(url); } + if (src === null) throw new Error("[perry-electron] require: cannot load '" + name + "'"); + if (moduleCache[url]) return moduleCache[url].exports; + var mod = { exports: {} }; + moduleCache[url] = mod; + var dir = url.replace(/\\/[^/]*$/, "/"); + try { + var fn = new Function("module", "exports", "require", "__filename", "__dirname", src); + fn(mod, mod.exports, makeRequire(dir), url, dir); + } catch (e) { + delete moduleCache[url]; + throw e; + } + return mod.exports; + } + throw new Error("[perry-electron] require('" + name + "') is not available in the renderer (no Node builtins in the system webview)"); + }; + } + window.require = makeRequire(window.location ? window.location.href : ""); + + window.electron = electron; // also expose directly for apps using window.electron + window.__perryIpcRenderer = ipcRenderer; + + // Diagnostic heartbeat so the main process can confirm the bridge installed + // at document-start and the message channel is live. + postToNative({ kind: "console", id: 0, channel: "debug", args: ["[perry-bridge] installed; channel=" + (!!(window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.perry)) ] }); +})(); +`; diff --git a/types/perry/ui/index.d.ts b/types/perry/ui/index.d.ts index 8ee0aab517..3ad20da95d 100644 --- a/types/perry/ui/index.d.ts +++ b/types/perry/ui/index.d.ts @@ -706,6 +706,17 @@ export function webviewCanGoBack(handle: Widget): number; export function webviewEvaluateJs(handle: Widget, js: string, callback: (result: string) => void): void; /** Wipe the WebView's cookies / local storage / IndexedDB. Use after auth. */ export function webviewClearCookies(handle: Widget): void; +/** + * Electron-compat IPC (renderer → main). Register a closure invoked with the + * JSON string the page posts via `window.webkit.messageHandlers.perry.postMessage(...)`. + * Reply with `webviewEvaluateJs(...)` (main → renderer). Backs `ipcMain`. + */ +export function webviewSetOnMessage(handle: Widget, onMessage: (json: string) => void): void; +/** + * Inject a document-start user script into all frames (the IPC bridge runtime + + * the app's preload). Call before `webviewLoadUrl` so it applies to that load. + */ +export function webviewAddUserScript(handle: Widget, source: string): void; /** VStack with built-in edge insets. */ export function VStackWithInsets(spacing: number, top: number, left: number, bottom: number, right: number): Widget; @@ -1786,6 +1797,24 @@ export function registerGlobalHotkey( */ export function onTerminate(callback: () => void): void; +/** + * Electron-compat body-less event loop. Sets up NSApplication + the timer pump, + * invokes `onReady` (which resolves `app.whenReady()`), then blocks. Windows are + * created dynamically afterward via `Window(...)`. Backs `electron`'s app loop. + */ +export function appRunLoop(onReady: () => void): void; + +/** Electron-compat `app.quit()` — terminate the application. */ +export function appQuit(): void; + +/** + * Electron-compat: register the top-level UI event loop without blocking. The + * generated `main` enters it (via the runtime's loop-takeover hook) AFTER the + * user's top-level code runs, so windows created from `app.whenReady().then(...)` + * composite correctly. Prefer this over `appRunLoop` for the `app` shell. + */ +export function appRequestLoop(onReady: () => void): void; + /** * Register a callback to run when the app becomes the frontmost app * (initial launch, dock click, cmd-tab). Runs once per activation. Use to From f6028108b6fa0a04718146718d63135088173739 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Tue, 23 Jun 2026 06:54:57 +0200 Subject: [PATCH 02/11] fix(compile): warm auto-optimize cache dropped CPU-only well-known libs (electron/EventEmitter link); + electron-compat contributor DX fixes Eight items from contributor feedback on the feat/electron-compat branch. #7 (the real bug): perry/ui + events apps failed to link from source with `Undefined symbols: _js_event_emitter_*`. build_optimized_libs splits well-known bindings into CPU-only (events -> perry-ext-events.a, resolved immediately into well_known_libs) and tokio-using (deferred). The warm-cache early-return rebuilt the list from the tokio-using set ALONE, dropping every CPU-only wrapper from the link line while the stdlib still stripped bundled-events -> a stdlib calling js_event_emitter_* with no provider. Only bit on a warm auto-optimize cache (cold cache took the fresh path and linked), the intermittent "can't compile from source" report. Fix: cached path now extends well_known_libs with the tokio-resolved set, mirroring the fresh path. Reproduced + verified with the system-explorer example (links + runs). #8: perry run . now resolves an entry inside a directory arg (perry.toml entry, src/main.ts, main.ts) instead of erroring 'Is a directory'. #3: perry init mirrors perry.packageAliases into tsconfig compilerOptions.paths (create + best-effort merge into an existing tsconfig). #4/#5: new packages/perry-react (@perryts/react) - bundles @types/react* and augments react-dom/client with createRoot(null, PerryRootOptions). Validated with tsc under moduleResolution bundler + node. #1: root package.json gains name/version/private (npm arborist crash). #2: packages/electron README documents the install workaround + scoped alias. #6: verified webviewAddUserScript is wired on this branch (release-lag only). Version 0.5.1204; changelog updated. --- CHANGELOG.md | 54 ++++++ CLAUDE.md | 2 +- Cargo.lock | 152 ++++++++--------- Cargo.toml | 2 +- .../src/commands/compile/optimized_libs.rs | 19 ++- crates/perry/src/commands/init.rs | 156 +++++++++++++++++- crates/perry/src/commands/run/entry.rs | 69 ++++++-- package.json | 4 + packages/electron/README.md | 40 +++++ packages/electron/package.json | 18 +- packages/perry-react/LICENSE | 21 +++ packages/perry-react/README.md | 81 +++++++++ packages/perry-react/index.d.ts | 76 +++++++++ packages/perry-react/package.json | 55 ++++++ packages/perry-react/tsconfig.json | 13 ++ 15 files changed, 658 insertions(+), 104 deletions(-) create mode 100644 packages/perry-react/LICENSE create mode 100644 packages/perry-react/README.md create mode 100644 packages/perry-react/index.d.ts create mode 100644 packages/perry-react/package.json create mode 100644 packages/perry-react/tsconfig.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 60a3e00ac5..d879f41cd0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,57 @@ +## v0.5.1204 — electron-compat contributor feedback: DX fixes + ext-events warm-cache link fix + +Eight items of feedback from a contributor trying the `feat/electron-compat` +branch end-to-end. Most are packaging/DX; one is a real linker bug. + +- **`perry/ui` + `events` apps failed to link from source with `Undefined + symbols: _js_event_emitter_*`** (the headline bug). Root cause: the + auto-optimize lib resolver has two well-known-binding categories — CPU-only + wrappers (e.g. `events` → `perry-ext-events.a`) resolved immediately, and + tokio-using wrappers resolved after the cargo rebuild. The **warm-cache + early-return path** in `build_optimized_libs` (`optimized_libs.rs`) + reconstructed `well_known_libs` from the tokio-using set **alone**, silently + dropping every CPU-only wrapper from the link line — while the matching stdlib + feature (`bundled-events`) was still stripped from the cached stdlib. The + result: a stdlib that calls `js_event_emitter_*` with no provider on the link + line. Only bit on a **warm** auto-optimize cache (a cold cache took the + fresh-rebuild path, which appends to the same list and linked fine) — which is + exactly the intermittent "can't compile from source as documented" report. + Fix: the cached path now `extend()`s the already-resolved CPU-only + `well_known_libs` with the tokio-resolved ones, mirroring the fresh path + (#466). Reproduced with the `system-explorer` electron example (perry/ui + + EventEmitter) and confirmed the link now includes `libperry_ext_events.a`. +- **`perry run .` rejected a directory** with "Is a directory". `resolve_entry_file` + returned the directory as-is because it `exists()`. Now a directory argument + (and the no-arg default) resolves an entry *inside* it — `perry.toml` `entry`, + then `src/main.ts`, then `main.ts` — so the project-level form works. +- **`perry init` now mirrors `perry.packageAliases` into `tsconfig.json` + `compilerOptions.paths`.** `packageAliases` was compiler-only, so the IDE's tsc + resolved aliased imports differently from what Perry compiles. init now emits + matching `paths` (with `baseUrl`) on create, and merges them into an existing + tsconfig (best-effort; prints the block to paste if the file isn't plain JSON). +- **New `packages/perry-react` (`@perryts/react`)** — a types package for Perry's + React support. It depends on `@types/react` / `@types/react-dom` (so users + don't add them by hand) and augments `react-dom/client` with Perry's + native-window overload `createRoot(null, { title, width, height })` + (`PerryRootOptions`). Validated with real `tsc` under `moduleResolution` + `bundler` (Perry's default) and `node`. NOTE: the augmentation must live in the + file the user loads (`types: ["@perryts/react"]` or a direct import) — TS drops + module augmentations reached only via a re-export from another `.d.ts`, and a + stray `export {}` next to the `declare module` also suppresses it. +- **Root `package.json` now carries `name`/`version`** (+ `private`) so + `npm install` straight from the git repo no longer crashes npm's arborist with + `Cannot read properties of undefined (reading 'spec')`. +- **`packages/electron` install is documented.** npm can't publish a package + named `electron` or install a repo subdirectory, so the README now covers the + two real paths: clone + `npm install /path/to/packages/electron` (keeps the + bare `electron` import working), or the scoped `@perryts/electron` + a + `packageAliases` entry. Added distribution metadata (`files`, `repository`, + `homepage`, `publishConfig`). +- **`webviewAddUserScript`** was reported missing from the npm binary; verified + it is fully implemented and wired on this branch (real `WKUserScript` + injection in perry-ui-macos + `perry-dispatch` table row) — it predates npm + 0.5.1182 and ships with this branch. + ## v0.5.1199 — feat(ui): BloomView live-render plumbing on every backend (#5519) Perry-UI side of #5519 (live `BloomView` rendering on all platforms; the engine diff --git a/CLAUDE.md b/CLAUDE.md index 20ec3e091d..41ed1adf7f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -8,7 +8,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co Perry is a native TypeScript compiler written in Rust that compiles TypeScript source code directly to native executables. It uses SWC for TypeScript parsing and LLVM for code generation. -**Current Version:** 0.5.1199 +**Current Version:** 0.5.1204 ## TypeScript Parity Status diff --git a/Cargo.lock b/Cargo.lock index e15e0727d6..6ef381412e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5325,7 +5325,7 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "perry" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "anyhow", "base64", @@ -5382,14 +5382,14 @@ dependencies = [ [[package]] name = "perry-api-manifest" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "serde", ] [[package]] name = "perry-audio-miniaudio" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "cc", "libc", @@ -5397,7 +5397,7 @@ dependencies = [ [[package]] name = "perry-codegen" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "anyhow", "log", @@ -5412,7 +5412,7 @@ dependencies = [ [[package]] name = "perry-codegen-arkts" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "anyhow", "perry-hir", @@ -5421,7 +5421,7 @@ dependencies = [ [[package]] name = "perry-codegen-glance" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "anyhow", "perry-hir", @@ -5429,7 +5429,7 @@ dependencies = [ [[package]] name = "perry-codegen-js" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "anyhow", "perry-dispatch", @@ -5439,7 +5439,7 @@ dependencies = [ [[package]] name = "perry-codegen-swiftui" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "anyhow", "perry-hir", @@ -5448,7 +5448,7 @@ dependencies = [ [[package]] name = "perry-codegen-wasm" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "anyhow", "base64", @@ -5461,7 +5461,7 @@ dependencies = [ [[package]] name = "perry-codegen-wear-tiles" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "anyhow", "perry-hir", @@ -5469,7 +5469,7 @@ dependencies = [ [[package]] name = "perry-container-compose" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "anyhow", "async-trait", @@ -5498,14 +5498,14 @@ dependencies = [ [[package]] name = "perry-container-e2e" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "anyhow", ] [[package]] name = "perry-diagnostics" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "serde", "serde_json", @@ -5513,7 +5513,7 @@ dependencies = [ [[package]] name = "perry-dispatch" -version = "0.5.1199" +version = "0.5.1204" [[package]] name = "perry-doc-fixture-my-bindings" @@ -5524,7 +5524,7 @@ dependencies = [ [[package]] name = "perry-doc-tests" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "anyhow", "clap", @@ -5539,14 +5539,14 @@ dependencies = [ [[package]] name = "perry-ext-ads" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "perry-ffi", ] [[package]] name = "perry-ext-argon2" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "argon2", "perry-ffi", @@ -5554,7 +5554,7 @@ dependencies = [ [[package]] name = "perry-ext-axios" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "perry-ffi", "reqwest", @@ -5563,7 +5563,7 @@ dependencies = [ [[package]] name = "perry-ext-bcrypt" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "bcrypt", "perry-ffi", @@ -5571,7 +5571,7 @@ dependencies = [ [[package]] name = "perry-ext-better-sqlite3" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "perry-ffi", "rusqlite", @@ -5579,7 +5579,7 @@ dependencies = [ [[package]] name = "perry-ext-cheerio" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "perry-ffi", "scraper", @@ -5587,7 +5587,7 @@ dependencies = [ [[package]] name = "perry-ext-commander" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "perry-ffi", "perry-runtime", @@ -5595,7 +5595,7 @@ dependencies = [ [[package]] name = "perry-ext-cron" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "chrono", "cron 0.16.0", @@ -5605,7 +5605,7 @@ dependencies = [ [[package]] name = "perry-ext-dayjs" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "chrono", "perry-ffi", @@ -5613,7 +5613,7 @@ dependencies = [ [[package]] name = "perry-ext-decimal" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "perry-ffi", "rust_decimal", @@ -5621,7 +5621,7 @@ dependencies = [ [[package]] name = "perry-ext-dotenv" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "perry-ffi", "serde_json", @@ -5629,7 +5629,7 @@ dependencies = [ [[package]] name = "perry-ext-ethers" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "perry-ffi", "rand 0.8.6", @@ -5637,7 +5637,7 @@ dependencies = [ [[package]] name = "perry-ext-events" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "perry-ffi", "perry-runtime", @@ -5645,14 +5645,14 @@ dependencies = [ [[package]] name = "perry-ext-exponential-backoff" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "perry-ffi", ] [[package]] name = "perry-ext-fastify" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "bytes", "http-body-util", @@ -5669,7 +5669,7 @@ dependencies = [ [[package]] name = "perry-ext-fetch" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "lazy_static", "perry-ffi", @@ -5681,7 +5681,7 @@ dependencies = [ [[package]] name = "perry-ext-http" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "bytes", "lazy_static", @@ -5695,7 +5695,7 @@ dependencies = [ [[package]] name = "perry-ext-http-server" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "bytes", "h2", @@ -5718,7 +5718,7 @@ dependencies = [ [[package]] name = "perry-ext-ioredis" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "lazy_static", "perry-ffi", @@ -5728,7 +5728,7 @@ dependencies = [ [[package]] name = "perry-ext-jsonwebtoken" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "base64", "jsonwebtoken", @@ -5739,7 +5739,7 @@ dependencies = [ [[package]] name = "perry-ext-lru-cache" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "lru", "perry-ffi", @@ -5747,7 +5747,7 @@ dependencies = [ [[package]] name = "perry-ext-moment" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "chrono", "perry-ffi", @@ -5755,7 +5755,7 @@ dependencies = [ [[package]] name = "perry-ext-mongodb" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "bson", "futures-util", @@ -5767,7 +5767,7 @@ dependencies = [ [[package]] name = "perry-ext-mysql2" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "chrono", "perry-ffi", @@ -5777,7 +5777,7 @@ dependencies = [ [[package]] name = "perry-ext-nanoid" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "nanoid", "perry-ffi", @@ -5786,7 +5786,7 @@ dependencies = [ [[package]] name = "perry-ext-net" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "perry-ffi", "perry-runtime", @@ -5798,7 +5798,7 @@ dependencies = [ [[package]] name = "perry-ext-nodemailer" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "lettre", "perry-ffi", @@ -5808,7 +5808,7 @@ dependencies = [ [[package]] name = "perry-ext-pdf" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "perry-ffi", "printpdf", @@ -5816,7 +5816,7 @@ dependencies = [ [[package]] name = "perry-ext-pg" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "perry-ffi", "sqlx", @@ -5825,7 +5825,7 @@ dependencies = [ [[package]] name = "perry-ext-ratelimit" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "governor", "perry-ffi", @@ -5833,7 +5833,7 @@ dependencies = [ [[package]] name = "perry-ext-sharp" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "fast_image_resize", "image", @@ -5843,14 +5843,14 @@ dependencies = [ [[package]] name = "perry-ext-slugify" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "perry-ffi", ] [[package]] name = "perry-ext-streams" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "lazy_static", "perry-ffi", @@ -5859,7 +5859,7 @@ dependencies = [ [[package]] name = "perry-ext-uuid" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "perry-ffi", "uuid", @@ -5867,7 +5867,7 @@ dependencies = [ [[package]] name = "perry-ext-validator" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "perry-ffi", "regex", @@ -5877,7 +5877,7 @@ dependencies = [ [[package]] name = "perry-ext-ws" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "futures-util", "lazy_static", @@ -5889,7 +5889,7 @@ dependencies = [ [[package]] name = "perry-ext-zlib" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "brotli", "flate2", @@ -5898,7 +5898,7 @@ dependencies = [ [[package]] name = "perry-ffi" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "dashmap", "once_cell", @@ -5907,7 +5907,7 @@ dependencies = [ [[package]] name = "perry-hir" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "anyhow", "perry-api-manifest", @@ -5925,7 +5925,7 @@ dependencies = [ [[package]] name = "perry-parser" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "anyhow", "perry-diagnostics", @@ -5937,7 +5937,7 @@ dependencies = [ [[package]] name = "perry-runtime" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "anyhow", "base64", @@ -5970,14 +5970,14 @@ dependencies = [ [[package]] name = "perry-runtime-static" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "perry-runtime", ] [[package]] name = "perry-stdlib" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "aes 0.8.4", "aes-gcm", @@ -6069,14 +6069,14 @@ dependencies = [ [[package]] name = "perry-stdlib-static" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "perry-stdlib", ] [[package]] name = "perry-transform" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "anyhow", "perry-hir", @@ -6086,7 +6086,7 @@ dependencies = [ [[package]] name = "perry-types" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "anyhow", "thiserror 1.0.69", @@ -6094,14 +6094,14 @@ dependencies = [ [[package]] name = "perry-ui" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "perry-ui-model", ] [[package]] name = "perry-ui-android" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "base64", "itoa", @@ -6118,7 +6118,7 @@ dependencies = [ [[package]] name = "perry-ui-geisterhand" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "rand 0.8.6", "serde", @@ -6128,7 +6128,7 @@ dependencies = [ [[package]] name = "perry-ui-gtk4" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "base64", "cairo-rs", @@ -6151,7 +6151,7 @@ dependencies = [ [[package]] name = "perry-ui-ios" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "base64", "block2", @@ -6167,7 +6167,7 @@ dependencies = [ [[package]] name = "perry-ui-macos" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "base64", "block2", @@ -6182,7 +6182,7 @@ dependencies = [ [[package]] name = "perry-ui-model" -version = "0.5.1199" +version = "0.5.1204" [[package]] name = "perry-ui-test" @@ -6190,11 +6190,11 @@ version = "0.1.0" [[package]] name = "perry-ui-testkit" -version = "0.5.1199" +version = "0.5.1204" [[package]] name = "perry-ui-tvos" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "base64", "block2", @@ -6210,7 +6210,7 @@ dependencies = [ [[package]] name = "perry-ui-visionos" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "base64", "block2", @@ -6226,7 +6226,7 @@ dependencies = [ [[package]] name = "perry-ui-watchos" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "block2", "libc", @@ -6239,7 +6239,7 @@ dependencies = [ [[package]] name = "perry-ui-windows" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "base64", "libc", @@ -6256,14 +6256,14 @@ dependencies = [ [[package]] name = "perry-ui-windows-winui" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "perry-ui-windows", ] [[package]] name = "perry-updater" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "base64", "ed25519-dalek", @@ -6277,7 +6277,7 @@ dependencies = [ [[package]] name = "perry-wasm-host" -version = "0.5.1199" +version = "0.5.1204" dependencies = [ "wasmi", ] diff --git a/Cargo.toml b/Cargo.toml index f0ed3f6fb5..8fe06390df 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -301,7 +301,7 @@ strip = false codegen-units = 16 [workspace.package] -version = "0.5.1199" +version = "0.5.1204" edition = "2021" license = "MIT" repository = "https://github.com/PerryTS/perry" diff --git a/crates/perry/src/commands/compile/optimized_libs.rs b/crates/perry/src/commands/compile/optimized_libs.rs index fa07bf4f7e..a887b95f7f 100644 --- a/crates/perry/src/commands/compile/optimized_libs.rs +++ b/crates/perry/src/commands/compile/optimized_libs.rs @@ -748,13 +748,28 @@ pub(super) fn build_optimized_libs( &build_stamp, ) { - let well_known_libs = resolve_auto_well_known_libs( + // A warm auto-optimize cache returns here WITHOUT running the + // fresh-rebuild path below — which is the only place the tokio-using + // well-known libs get appended to `well_known_libs`. Mirror that here, + // but crucially keep the CPU-only well-known libs already resolved into + // `well_known_libs` at the routing step above (e.g. `events` → + // perry-ext-events.a, decimal.js → perry-ext-decimal.a). The previous + // code SHADOWED `well_known_libs` with the tokio-only result, silently + // dropping every CPU-only wrapper from the link line. Because the + // matching stdlib feature was still stripped from the (cached) stdlib + // rebuild, an EventEmitter / electron app then linked a stdlib that + // calls `js_event_emitter_*` with no provider — failing with + // `Undefined symbols: _js_event_emitter_*`. This only bit when the + // auto-optimize archives were already fresh (warm cache); a cold cache + // took the fresh path and linked fine, which is exactly the + // intermittent "can't compile from source" report. #466. + well_known_libs.extend(resolve_auto_well_known_libs( &workspace_root, &release_dir, &tokio_using_bindings, target, format, - ); + )); return OptimizedLibs { runtime: Some(runtime_path), stdlib: Some(stdlib_path), diff --git a/crates/perry/src/commands/init.rs b/crates/perry/src/commands/init.rs index 556ea48574..2f63247599 100644 --- a/crates/perry/src/commands/init.rs +++ b/crates/perry/src/commands/init.rs @@ -3,7 +3,7 @@ use anyhow::Result; use clap::Args; use std::fs; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; use crate::OutputFormat; @@ -62,14 +62,120 @@ const DEFAULT_TSCONFIG: &str = r#"{ "strict": true, "noEmit": true, "skipLibCheck": true, + "baseUrl": ".", "paths": { - "perry/*": ["./.perry/types/perry/*/index.d.ts"] +{paths} } }, "include": ["src", ".perry/types/stdlib/index.d.ts"] } "#; +/// Read `perry.packageAliases` (npm package name → replacement package name) +/// from the project's package.json, so the generated tsconfig can mirror what +/// the Perry compiler resolves. Returns sorted (from, to) pairs. +fn package_aliases(project_path: &Path) -> Vec<(String, String)> { + let pkg_path = project_path.join("package.json"); + let Ok(content) = fs::read_to_string(&pkg_path) else { + return Vec::new(); + }; + let Ok(pkg) = serde_json::from_str::(&content) else { + return Vec::new(); + }; + let Some(aliases) = pkg + .get("perry") + .and_then(|p| p.get("packageAliases")) + .and_then(|a| a.as_object()) + else { + return Vec::new(); + }; + let mut out: Vec<(String, String)> = aliases + .iter() + .filter_map(|(from, to)| to.as_str().map(|to| (from.clone(), to.to_string()))) + .collect(); + out.sort(); + out +} + +/// Build the `compilerOptions.paths` map the IDE's tsc needs to resolve the +/// same module specifiers Perry resolves at compile time: the always-present +/// `perry/*` type-stub mapping, plus one bare + one wildcard entry per +/// `perry.packageAliases` alias (`"": ["./node_modules/"]`). +fn tsconfig_paths(aliases: &[(String, String)]) -> serde_json::Map { + let mut paths = serde_json::Map::new(); + paths.insert( + "perry/*".to_string(), + serde_json::json!(["./.perry/types/perry/*/index.d.ts"]), + ); + for (from, to) in aliases { + paths.insert( + from.clone(), + serde_json::json!([format!("./node_modules/{to}")]), + ); + paths.insert( + format!("{from}/*"), + serde_json::json!([format!("./node_modules/{to}/*")]), + ); + } + paths +} + +/// Render the `paths` entries indented to sit inside the DEFAULT_TSCONFIG +/// template's `"paths": { … }` block (6-space indent, comma-separated). +fn render_paths_block(paths: &serde_json::Map) -> String { + paths + .iter() + .map(|(k, v)| { + format!( + " {}: {}", + serde_json::to_string(k).unwrap_or_else(|_| format!("\"{k}\"")), + serde_json::to_string(v).unwrap_or_else(|_| "[]".to_string()) + ) + }) + .collect::>() + .join(",\n") +} + +/// Merge alias paths into an existing tsconfig.json. Returns the rewritten +/// contents if a change is needed and the file parses as JSON, `Ok(None)` if +/// nothing changed, or `Err` with the block to paste if it can't be parsed +/// (e.g. JSONC with comments/trailing commas). +fn merge_paths_into_existing( + existing: &str, + paths: &serde_json::Map, +) -> std::result::Result, String> { + let mut root: serde_json::Value = serde_json::from_str(existing) + .map_err(|_| render_paths_block(paths))?; + let obj = root + .as_object_mut() + .ok_or_else(|| render_paths_block(paths))?; + let co = obj + .entry("compilerOptions") + .or_insert_with(|| serde_json::json!({})); + let co = co.as_object_mut().ok_or_else(|| render_paths_block(paths))?; + co.entry("baseUrl") + .or_insert_with(|| serde_json::json!(".")); + let existing_paths = co + .entry("paths") + .or_insert_with(|| serde_json::json!({})); + let existing_paths = existing_paths + .as_object_mut() + .ok_or_else(|| render_paths_block(paths))?; + let mut changed = false; + for (k, v) in paths { + if existing_paths.get(k) != Some(v) { + existing_paths.insert(k.clone(), v.clone()); + changed = true; + } + } + if !changed { + return Ok(None); + } + let mut out = serde_json::to_string_pretty(&root).map_err(|_| render_paths_block(paths))?; + out.push('\n'); + Ok(Some(out)) +} + pub fn run(args: InitArgs, format: OutputFormat, _use_color: bool) -> Result<()> { let project_path = args.path.canonicalize().unwrap_or(args.path.clone()); @@ -137,19 +243,57 @@ pub fn run(args: InitArgs, format: OutputFormat, _use_color: bool) -> Result<()> } } - // Create tsconfig.json + // Create / update tsconfig.json. The `paths` block mirrors + // `perry.packageAliases` from package.json so the IDE's tsc language + // server resolves aliased imports to the same target Perry uses at + // compile time (perry.packageAliases is otherwise compiler-only). + let aliases = package_aliases(&project_path); + let paths = tsconfig_paths(&aliases); let tsconfig_path = project_path.join("tsconfig.json"); if !tsconfig_path.exists() { - fs::write(&tsconfig_path, DEFAULT_TSCONFIG)?; + let contents = DEFAULT_TSCONFIG.replace("{paths}", &render_paths_block(&paths)); + fs::write(&tsconfig_path, contents)?; match format { - OutputFormat::Text => println!(" Created tsconfig.json"), + OutputFormat::Text => { + println!(" Created tsconfig.json"); + if !aliases.is_empty() { + println!( + " + {} packageAliases path(s) for IDE resolution", + aliases.len() + ); + } + } OutputFormat::Json => {} } - } else { + } else if aliases.is_empty() { match format { OutputFormat::Text => println!(" Skipped tsconfig.json (already exists)"), OutputFormat::Json => {} } + } else { + // tsconfig exists and there are aliases to sync — merge the paths in. + let existing = fs::read_to_string(&tsconfig_path)?; + match merge_paths_into_existing(&existing, &paths) { + Ok(Some(updated)) => { + fs::write(&tsconfig_path, updated)?; + if let OutputFormat::Text = format { + println!(" Updated tsconfig.json (synced packageAliases paths)"); + } + } + Ok(None) => { + if let OutputFormat::Text = format { + println!(" Skipped tsconfig.json (packageAliases paths already in sync)"); + } + } + Err(block) => { + if let OutputFormat::Text = format { + println!( + " Skipped tsconfig.json (couldn't auto-merge — not plain JSON).\n\ + \x20 Add these to compilerOptions.paths so the IDE matches Perry:\n{block}" + ); + } + } + } } // Write Perry type stubs into .perry/types/perry/ diff --git a/crates/perry/src/commands/run/entry.rs b/crates/perry/src/commands/run/entry.rs index ae703f0c17..9e3673139a 100644 --- a/crates/perry/src/commands/run/entry.rs +++ b/crates/perry/src/commands/run/entry.rs @@ -38,28 +38,37 @@ pub fn rust_target_triple(target: Option<&str>) -> Option<&'static str> { } } -/// Resolve the entry TypeScript file +/// Resolve the entry TypeScript file. +/// +/// Accepts a file, a directory, or nothing: +/// - a file path is returned as-is; +/// - a directory (e.g. `perry run .`) is treated as a project root — its +/// `perry.toml` `entry`, then `src/main.ts`, then `main.ts` is resolved +/// inside it (this is what users expect from a project-level command, and +/// avoids the bare "Is a directory" error from the compiler downstream); +/// - nothing falls back to the current directory the same way. pub fn resolve_entry_file(input: Option<&Path>) -> Result { if let Some(path) = input { + if path.is_dir() { + if let Some(entry) = resolve_entry_in_dir(path) { + return Ok(entry); + } + return Err(anyhow!( + "'{}' is a directory with no entry point.\n\ + Looked for: perry.toml `entry`, src/main.ts, main.ts\n\ + Pass a file (perry run path/to/file.ts) or set `entry` in perry.toml.", + path.display() + )); + } if path.exists() { return Ok(path.to_path_buf()); } return Err(anyhow!("File not found: {}", path.display())); } - // Try perry.toml - if let Some(entry) = read_perry_toml_entry() { - if entry.exists() { - return Ok(entry); - } - } - - // Fallback: src/main.ts, then main.ts - for candidate in &["src/main.ts", "main.ts"] { - let path = PathBuf::from(candidate); - if path.exists() { - return Ok(path); - } + // No argument: resolve against the current directory. + if let Some(entry) = resolve_entry_in_dir(Path::new(".")) { + return Ok(entry); } Err(anyhow!( @@ -69,9 +78,35 @@ pub fn resolve_entry_file(input: Option<&Path>) -> Result { )) } -/// Read entry point from perry.toml if present -pub fn read_perry_toml_entry() -> Option { - let toml_str = std::fs::read_to_string("perry.toml").ok()?; +/// Resolve the entry file inside a project directory, honoring `perry.toml` +/// `entry` first, then the conventional `src/main.ts` / `main.ts` fallbacks. +/// Returns a path that is guaranteed to exist. +fn resolve_entry_in_dir(dir: &Path) -> Option { + // perry.toml `entry` is relative to the project directory. + if let Some(entry) = read_perry_toml_entry_in(dir) { + let resolved = if entry.is_absolute() { + entry + } else { + dir.join(entry) + }; + if resolved.is_file() { + return Some(resolved); + } + } + + for candidate in &["src/main.ts", "main.ts"] { + let path = dir.join(candidate); + if path.is_file() { + return Some(path); + } + } + + None +} + +/// Read the `entry` key from `/perry.toml`, if present. +fn read_perry_toml_entry_in(dir: &Path) -> Option { + let toml_str = std::fs::read_to_string(dir.join("perry.toml")).ok()?; for line in toml_str.lines() { let trimmed = line.trim(); if trimmed.starts_with("entry") { diff --git a/package.json b/package.json index 6671f2d932..f018c963b4 100644 --- a/package.json +++ b/package.json @@ -1,4 +1,8 @@ { + "name": "perry", + "version": "0.0.0", + "private": true, + "description": "Perry — native TypeScript compiler. This root manifest carries name+version so the repo is installable straight from git (npm's arborist throws \"Cannot read properties of undefined (reading 'spec')\" without them); the publishable packages live under packages/*.", "type": "module", "devDependencies": { "mongodb": "^7.0.0", diff --git a/packages/electron/README.md b/packages/electron/README.md index 51c20fa20d..c3c782a095 100644 --- a/packages/electron/README.md +++ b/packages/electron/README.md @@ -35,8 +35,48 @@ IPC transport on macOS: - **`ipcRenderer.invoke` ↔ `ipcMain.handle`**: request/response correlated by a monotonic id; the renderer parks a Promise until the main side replies. +## Install + +This package intentionally keeps the npm name **`electron`** so your app's +existing `import … from "electron"` resolves to it with zero code changes. npm +won't let anyone publish a package literally named `electron`, and it doesn't +support installing a single subdirectory straight from a GitHub repo, so install +it one of these two ways: + +**A. Clone + install by path (works today):** + +```bash +git clone https://github.com/PerryTS/perry +# in your app, install the compat package from the checkout: +npm install /absolute/path/to/perry/packages/electron +``` + +> `npm install github:PerryTS/perry#feat/electron-compat` installs the whole +> Perry repo, not just this package — the repo root now carries `name`/`version` +> so that no longer crashes npm's arborist, but you still want the subdirectory. + +**B. Scoped npm package + alias (once published):** the package is also +published as **`@perryts/electron`**. Because it must keep importing as +`electron`, point Perry's resolver at the scoped install with a `packageAlias`: + +```jsonc +// your-app/package.json +{ + "dependencies": { "@perryts/electron": "^0.1.0" }, + "perry": { + "packageAliases": { "electron": "@perryts/electron" } + } +} +``` + +`perry init` mirrors `packageAliases` into `tsconfig.json` `compilerOptions.paths`, +so your IDE's tsc resolves `electron` to the compat types too. + ## Use it +If the package resolves under the bare name `electron` (install option A, or a +plain `node_modules/electron`), your app needs no Perry config at all: + ```jsonc // your-app/package.json — no code changes to your app { diff --git a/packages/electron/package.json b/packages/electron/package.json index b1832b00fc..d5615bea82 100644 --- a/packages/electron/package.json +++ b/packages/electron/package.json @@ -7,6 +7,22 @@ "perry": { "nativeModule": true }, + "files": [ + "src", + "bridge", + "README.md", + "DESIGN.md" + ], "keywords": ["perry", "electron", "desktop", "webview", "ipc"], - "license": "MIT" + "repository": { + "type": "git", + "url": "https://github.com/PerryTS/perry.git", + "directory": "packages/electron" + }, + "homepage": "https://github.com/PerryTS/perry/tree/main/packages/electron#readme", + "bugs": "https://github.com/PerryTS/perry/issues", + "license": "MIT", + "publishConfig": { + "access": "public" + } } diff --git a/packages/perry-react/LICENSE b/packages/perry-react/LICENSE new file mode 100644 index 0000000000..c60e2b25ee --- /dev/null +++ b/packages/perry-react/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Perry 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. diff --git a/packages/perry-react/README.md b/packages/perry-react/README.md new file mode 100644 index 0000000000..ded29372f3 --- /dev/null +++ b/packages/perry-react/README.md @@ -0,0 +1,81 @@ +# @perryts/react + +TypeScript types for [Perry](https://github.com/PerryTS/perry)'s React support. + +Perry compiles React/JSX to **native widgets** — standard React components +render to a native macOS/iOS/Android app, with no DOM and no browser. The +runtime lives in [`perry-react`](https://github.com/PerryTS/react) and +[`perry-react-dom`](https://github.com/PerryTS/react-dom); **this package is the +type layer** for it. + +It does two things: + +1. **Bundles the React types.** It depends on `@types/react` and + `@types/react-dom`, so a single `npm i -D @perryts/react` gives you working + React types — no need to remember the `@types/*` packages separately. + +2. **Types Perry's `createRoot` extension.** `@types/react-dom` only knows the + DOM-container form `createRoot(domNode)`. Perry has no DOM, so it extends + `createRoot` to take `null` plus native window options. This package augments + `react-dom/client` with that overload, so the call below type-checks instead + of erroring on the `null` container / extra argument. + +## Install + +```bash +npm install -D @perryts/react +# react / react-dom themselves are peer deps (the Perry runtime provides them): +npm install react react-dom +``` + +## Use + +Add it to your tsconfig so the `createRoot` augmentation is always in scope: + +```jsonc +// tsconfig.json +{ + "compilerOptions": { + "jsx": "react-jsx", + "types": ["@perryts/react"] + } +} +``` + +…or import it once anywhere in your project: + +```tsx +import '@perryts/react'; +import { useState } from 'react'; +import { createRoot } from 'react-dom/client'; + +function Counter() { + const [n, setN] = useState(0); + return ; +} + +// Perry overload: null container + native window options — now fully typed. +createRoot(null, { title: 'Counter', width: 300, height: 200 }).render(); +``` + +### `PerryRootOptions` + +The second argument to `createRoot(null, …)`. `title` / `width` / `height` are +the documented core; the rest mirror the common `perry/ui` window knobs and are +optional: + +```ts +import type { PerryRootOptions } from '@perryts/react'; + +const opts: PerryRootOptions = { + title: 'My App', + width: 900, + height: 640, + minWidth: 400, + resizable: true, +}; +``` + +## License + +MIT diff --git a/packages/perry-react/index.d.ts b/packages/perry-react/index.d.ts new file mode 100644 index 0000000000..5cde8f3c8a --- /dev/null +++ b/packages/perry-react/index.d.ts @@ -0,0 +1,76 @@ +/** + * `@perryts/react` — TypeScript types for Perry's React support. + * + * Two jobs: + * + * 1. **Bundle the React types.** This package depends on `@types/react` and + * `@types/react-dom`, so installing `@perryts/react` is enough — you don't + * have to remember to add the `@types/*` packages by hand. + * + * 2. **Type Perry's `createRoot` extension.** This file augments + * `react-dom/client` with the native-window overload + * `createRoot(null, { title, width, height })`. + * + * Activate it by adding the package to your tsconfig `types` (recommended, so + * the augmentation is always in scope): + * + * ```jsonc + * // tsconfig.json + * { "compilerOptions": { "jsx": "react-jsx", "types": ["@perryts/react"] } } + * ``` + * + * …or import it once anywhere in your project: + * + * ```ts + * import '@perryts/react'; + * import { createRoot } from 'react-dom/client'; + * createRoot(null, { title: 'Counter', width: 300, height: 200 }).render(); + * ``` + * + * NOTE: the `createRoot` augmentation only takes effect when the file that + * holds it is loaded directly (via `types: [...]`, a direct `import`, or a + * `/// `). TypeScript drops module augmentations reached only + * indirectly through a re-export from another `.d.ts`, so the augmentation + * lives here in the package entry rather than in a re-exported sub-module. + */ + +/// +/// + +import type { Root } from 'react-dom/client'; + +/** + * Options for the native window that hosts a Perry React root, passed as the + * second argument to `createRoot(null, options)`. + * + * `title` / `width` / `height` are the documented core; the rest mirror the + * common `perry/ui` window knobs and are all optional. + */ +export interface PerryRootOptions { + /** Window title shown in the title bar. */ + title?: string; + /** Initial content width, in points. */ + width?: number; + /** Initial content height, in points. */ + height?: number; + /** Minimum content width the user can resize to, in points. */ + minWidth?: number; + /** Minimum content height the user can resize to, in points. */ + minHeight?: number; + /** Whether the user can resize the window. Defaults to `true`. */ + resizable?: boolean; + /** Initial window x position, in screen points. Centered if omitted. */ + x?: number; + /** Initial window y position, in screen points. Centered if omitted. */ + y?: number; +} + +declare module 'react-dom/client' { + /** + * Perry native-window overload: pass `null` (no DOM container) plus the + * native window options. Standard `react-dom`'s DOM-container overloads stay + * available — this only adds the `null` form. Returns the same `Root` so + * `.render()` / `.unmount()` work as usual. + */ + export function createRoot(container: null | undefined, options: PerryRootOptions): Root; +} diff --git a/packages/perry-react/package.json b/packages/perry-react/package.json new file mode 100644 index 0000000000..78849e5cf7 --- /dev/null +++ b/packages/perry-react/package.json @@ -0,0 +1,55 @@ +{ + "name": "@perryts/react", + "version": "0.1.0", + "description": "TypeScript types for Perry's React support — bundles @types/react / @types/react-dom and augments react-dom/client's createRoot with Perry's native-window overload (createRoot(null, { title, width, height })).", + "types": "./index.d.ts", + "exports": { + ".": { + "types": "./index.d.ts" + }, + "./package.json": "./package.json" + }, + "files": [ + "index.d.ts", + "README.md", + "LICENSE" + ], + "scripts": { + "typecheck": "tsc --noEmit -p tsconfig.json" + }, + "keywords": [ + "perry", + "react", + "react-dom", + "createRoot", + "native", + "types", + "typescript" + ], + "author": "Perry Contributors", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/PerryTS/perry.git", + "directory": "packages/perry-react" + }, + "homepage": "https://github.com/PerryTS/perry/tree/main/packages/perry-react#readme", + "bugs": { + "url": "https://github.com/PerryTS/perry/issues" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react": { "optional": true }, + "react-dom": { "optional": true } + }, + "dependencies": { + "@types/react": "^18.3.0 || ^19.0.0", + "@types/react-dom": "^18.3.0 || ^19.0.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/perry-react/tsconfig.json b/packages/perry-react/tsconfig.json new file mode 100644 index 0000000000..3d53dba4cd --- /dev/null +++ b/packages/perry-react/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "ESNext", + "moduleResolution": "bundler", + "jsx": "react-jsx", + "strict": true, + "skipLibCheck": true, + "noEmit": true, + "types": [] + }, + "include": ["index.d.ts"] +} From 0680d08263f464ddef910908d788f87a38488379 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Mon, 29 Jun 2026 10:49:53 +0200 Subject: [PATCH 03/11] feat(electron): wire clipboard, Tray, nativeImage, Menu, dialog, activate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Several electron-compat surfaces were link errors (nativeImage, clipboard, Tray) or true no-ops (Menu.setApplicationMenu, dialog.show*Dialog) reported on the stress test. The native capabilities already exist in perry-ui-macos and are exposed via perry/ui — this wires the shim over them (no compiler change): - clipboard.readText/writeText/clear -> clipboardRead/clipboardWrite - nativeImage.createFromPath/… -> thin wrapper carrying the source path - Tray (image, setImage, setToolTip, -> trayCreate/traySetIcon/traySetTooltip/ setContextMenu, on('click'), destroy) trayAttachMenu/trayOnClick/trayDestroy - Menu.setApplicationMenu -> menuBarCreate/menuBarAddMenu/menuBarAttach (separators, nested submenus, click callbacks, accelerators normalized from "CmdOrCtrl+S", and roles mapped to AppKit selectors: copy/paste/undo/quit/…) - dialog.showOpenDialog/showSaveDialog -> openFileDialog/openFolderDialog/saveFileDialog (accepts both (options) and (window, options) call shapes) - app emits 'activate' on dock-icon -> onActivate (native ON_ACTIVATE_CALLBACK) click (event, hasVisibleWindows) Native-held handles + menu/tray/dialog callbacks are kept in a module-level root array so GC can't reclaim them. Verified: a program exercising all of the above compiles and links (the previously-undefined symbols now resolve); clipboard round-trips at runtime via the perry/ui binding. Still Tier B (need a new perry/ui binding first, separate change): main-process Notification, nativeTheme.shouldUseDarkColors, app.dock.setIcon. --- packages/electron/src/index.ts | 313 +++++++++++++++++++++++++++++++-- 1 file changed, 300 insertions(+), 13 deletions(-) diff --git a/packages/electron/src/index.ts b/packages/electron/src/index.ts index d0c37cfa32..783cad8230 100644 --- a/packages/electron/src/index.ts +++ b/packages/electron/src/index.ts @@ -20,6 +20,27 @@ import { webviewAddUserScript, appRequestLoop, appQuit, + clipboardRead, + clipboardWrite, + trayCreate, + traySetIcon, + traySetTooltip, + trayAttachMenu, + trayOnClick, + trayDestroy, + menuCreate, + menuAddItem, + menuAddSeparator, + menuAddSubmenu, + menuAddItemWithShortcut, + menuAddStandardAction, + menuBarCreate, + menuBarAddMenu, + menuBarAttach, + openFileDialog, + openFolderDialog, + saveFileDialog, + onActivate, } from "perry/ui"; import * as os from "os"; import * as path from "path"; @@ -209,6 +230,13 @@ const openWindows: BrowserWindow[] = []; // Keeps the app-ready closure passed to appRequestLoop alive from module init // until the native loop fires it after main top-level (GC root). let rootedOnReady: (() => void) | null = null; +// Same GC-root rationale for the dock-activate closure handed to the native +// onActivate hook — held until the user clicks the dock icon. +let rootedOnActivate: (() => void) | null = null; +// Native-held menubar/tray handles + their click closures. The native side +// stores these; rooting them here keeps the menubar/tray and every menu-item +// callback alive for the app's lifetime (otherwise GC could reclaim them). +const rootedNativeUi: any[] = []; class BrowserWindow extends EventEmitter { // perry/ui window operations, captured as closures over the LOCAL `win` in @@ -390,6 +418,12 @@ class App extends EventEmitter { for (let i = 0; i < resolvers.length; i++) resolvers[i](); }; appRequestLoop(rootedOnReady); + // macOS 'activate' — fired when the dock icon is clicked (incl. after all + // windows are closed). Electron apps reopen their window from here. + rootedOnActivate = () => { + self.emit("activate", {}, openWindows.length > 0); + }; + onActivate(rootedOnActivate); } whenReady(): Promise { @@ -457,10 +491,105 @@ class App extends EventEmitter { export const app = new App(); // --------------------------------------------------------------------------- -// Menu / MenuItem (v1: template is accepted; native menubar wiring is a -// follow-up. setApplicationMenu(null) hides — accepted as a no-op so apps run.) +// Menu / MenuItem +// +// Menu.buildFromTemplate accepts the Electron template; setApplicationMenu wires +// it into the native macOS menubar (perry/ui menuBar*). Items with a `click` +// callback fire it; `role` items map to the standard AppKit selector +// (copy/paste/undo/quit/…) sent to the first responder; `type: "separator"` +// and nested `submenu` are supported. Accelerators ("CmdOrCtrl+S") are +// normalized to perry/ui's "Cmd+Shift+S" syntax. // --------------------------------------------------------------------------- +// Electron accelerator → perry/ui shortcut. CmdOrCtrl collapses to Cmd on +// macOS; Super/Meta → Cmd; everything else passes through to parse_shortcut. +function normalizeAccelerator(accel: string): string { + return accel + .replace(/CommandOrControl/gi, "Cmd") + .replace(/CmdOrCtrl/gi, "Cmd") + .replace(/Command/gi, "Cmd") + .replace(/Control/gi, "Ctrl") + .replace(/Option/gi, "Alt") + .replace(/Super/gi, "Cmd") + .replace(/Meta/gi, "Cmd"); +} + +// Electron menu role → AppKit first-responder selector (so copy/paste/etc. +// act on the focused webview). Roles without a standard selector fall through +// to a plain labeled item. +const ROLE_SELECTORS: { [role: string]: string } = { + undo: "undo:", + redo: "redo:", + cut: "cut:", + copy: "copy:", + paste: "paste:", + pasteandmatchstyle: "pasteAsPlainText:", + delete: "delete:", + selectall: "selectAll:", + quit: "terminate:", + minimize: "performMiniaturize:", + close: "performClose:", + togglefullscreen: "toggleFullScreen:", + hide: "hide:", + hideothers: "hideOtherApplications:", + unhide: "unhideAllApplications:", +}; + +const ROLE_LABELS: { [role: string]: string } = { + undo: "Undo", redo: "Redo", cut: "Cut", copy: "Copy", paste: "Paste", + pasteandmatchstyle: "Paste and Match Style", delete: "Delete", + selectall: "Select All", quit: "Quit", minimize: "Minimize", close: "Close", + togglefullscreen: "Toggle Full Screen", hide: "Hide", hideothers: "Hide Others", + unhide: "Show All", +}; + +// A Menu instance carries `.items`; a raw template submenu is an array. (The +// shim's buildFromTemplate only wraps the top level, so nested submenus arrive +// as raw template objects — read fields generically.) +function menuItemList(submenu: any): any[] { + if (!submenu) return []; + if (Array.isArray(submenu)) return submenu; + if (submenu.items && Array.isArray(submenu.items)) return submenu.items; + return []; +} + +// Build a native perry/ui menu handle from a list of Electron menu items. +function buildNativeMenu(items: any[]): any { + const native = menuCreate(); + rootedNativeUi.push(native); + for (let i = 0; i < items.length; i++) { + const item = items[i]; + if (item.type === "separator") { + menuAddSeparator(native); + continue; + } + if (item.submenu) { + const child = buildNativeMenu(menuItemList(item.submenu)); + menuAddSubmenu(native, item.label || "", child); + continue; + } + const role = item.role ? String(item.role).toLowerCase() : ""; + if (role && ROLE_SELECTORS[role]) { + const label = item.label || ROLE_LABELS[role] || ""; + const accel = item.accelerator ? normalizeAccelerator(item.accelerator) : ""; + menuAddStandardAction(native, label, ROLE_SELECTORS[role], accel); + continue; + } + const label = item.label || ROLE_LABELS[role] || ""; + const click = item.click; + const cb = () => { + if (typeof click === "function") click(); + }; + rootedNativeUi.push(cb); + if (item.accelerator) { + menuAddItemWithShortcut(native, label, normalizeAccelerator(item.accelerator), cb); + } else { + menuAddItem(native, label, cb); + } + } + return native; +} + class MenuItem { label: string; click?: () => void; @@ -478,6 +607,8 @@ class MenuItem { } } +let appMenu: Menu | null = null; + class Menu { items: MenuItem[]; constructor() { @@ -487,6 +618,20 @@ class Menu { this.items.push(item); } popup(_options?: any): void {} + + // Build the native menubar this Menu represents: each top-level item becomes + // a bar menu whose contents are that item's submenu. + _buildNativeMenuBar(): any { + const bar = menuBarCreate(); + rootedNativeUi.push(bar); + for (let i = 0; i < this.items.length; i++) { + const top = this.items[i]; + const sub = buildNativeMenu(menuItemList(top.submenu)); + menuBarAddMenu(bar, top.label || "", sub); + } + return bar; + } + static buildFromTemplate(template: any[]): Menu { const menu = new Menu(); for (let i = 0; i < template.length; i++) { @@ -494,29 +639,61 @@ class Menu { } return menu; } - static setApplicationMenu(_menu: Menu | null): void { - /* v1: native menubar already provides standard Cmd+Q etc. */ + static setApplicationMenu(menu: Menu | null): void { + appMenu = menu; + if (!menu) return; // removing the native menubar isn't supported in v1 + menuBarAttach(menu._buildNativeMenuBar()); } static getApplicationMenu(): Menu | null { - return null; + return appMenu; } } export { Menu, MenuItem, BrowserWindow, WebContents }; // --------------------------------------------------------------------------- -// dialog (v1: returns canceled; native NSOpenPanel/NSSavePanel wiring is a -// follow-up. Apps that gate on `canceled` keep running.) +// dialog — native NSOpenPanel/NSSavePanel via perry/ui. The native dialogs are +// single-selection; `properties: ["openDirectory"]` picks the folder panel. +// Both options-only and (window, options) call signatures are accepted. // --------------------------------------------------------------------------- +// dialog calls come as showXxx(options) or showXxx(browserWindow, options). +function dialogOptions(a?: any, b?: any): any { + if (b !== undefined) return b || {}; + // Single arg: a BrowserWindow has no dialog option keys, so treat an object + // with `properties`/`defaultPath`/`filters`/`title` as the options bag. + if (a && (a.properties || a.defaultPath || a.filters || a.title)) return a; + return a && !(a instanceof BrowserWindow) ? a : {}; +} + export const dialog = { - showOpenDialog(_window?: any, _options?: any): Promise<{ canceled: boolean; filePaths: string[] }> { - console.warn("[electron] dialog.showOpenDialog is a v1 stub (returns canceled)"); - return Promise.resolve({ canceled: true, filePaths: [] }); + showOpenDialog(a?: any, b?: any): Promise<{ canceled: boolean; filePaths: string[] }> { + const options = dialogOptions(a, b); + const props: string[] = options.properties || []; + const wantDir = props.indexOf("openDirectory") >= 0; + return new Promise((resolve) => { + const cb = (selected: string) => { + if (!selected) resolve({ canceled: true, filePaths: [] }); + else resolve({ canceled: false, filePaths: [selected] }); + }; + rootedNativeUi.push(cb); + if (wantDir) openFolderDialog(cb); + else openFileDialog(cb); + }); }, - showSaveDialog(_window?: any, _options?: any): Promise<{ canceled: boolean; filePath: string }> { - console.warn("[electron] dialog.showSaveDialog is a v1 stub (returns canceled)"); - return Promise.resolve({ canceled: true, filePath: "" }); + showSaveDialog(a?: any, b?: any): Promise<{ canceled: boolean; filePath: string }> { + const options = dialogOptions(a, b); + const defaultPath: string = options.defaultPath || ""; + const base = defaultPath ? path.basename(defaultPath) : "untitled"; + const ext = path.extname(base).replace(/^\./, ""); + return new Promise((resolve) => { + const cb = (selected: string) => { + if (!selected) resolve({ canceled: true, filePath: "" }); + else resolve({ canceled: false, filePath: selected }); + }; + rootedNativeUi.push(cb); + saveFileDialog(cb, base, ext); + }); }, showMessageBox(_window?: any, _options?: any): Promise<{ response: number; checkboxChecked: boolean }> { return Promise.resolve({ response: 0, checkboxChecked: false }); @@ -549,6 +726,113 @@ export const shell = { beep(): void {}, }; +// --------------------------------------------------------------------------- +// clipboard — system pasteboard via perry/ui (text in v1). +// --------------------------------------------------------------------------- + +export const clipboard = { + readText(_type?: string): string { + return clipboardRead(); + }, + writeText(text: string, _type?: string): void { + clipboardWrite(text); + }, + clear(_type?: string): void { + clipboardWrite(""); + }, + availableFormats(_type?: string): string[] { + return ["text/plain"]; + }, +}; + +// --------------------------------------------------------------------------- +// nativeImage — thin wrapper carrying the source path (Tray/dock icons read it). +// --------------------------------------------------------------------------- + +class NativeImage { + // Source file path ("" for empty / unsupported sources). + _path: string; + constructor(p: string) { + this._path = p; + } + isEmpty(): boolean { + return this._path === ""; + } + getSize(): { width: number; height: number } { + return { width: 0, height: 0 }; + } + toDataURL(): string { + return ""; + } +} + +// Accept a path string or a NativeImage anywhere Electron takes an "image". +function iconToPath(icon: any): string { + if (typeof icon === "string") return icon; + if (icon && typeof icon._path === "string") return icon._path; + return ""; +} + +export const nativeImage = { + createFromPath(p: string): NativeImage { + return new NativeImage(p); + }, + createEmpty(): NativeImage { + return new NativeImage(""); + }, + createFromDataURL(_dataUrl: string): NativeImage { + return new NativeImage(""); + }, + createFromBuffer(_buffer: any, _options?: any): NativeImage { + return new NativeImage(""); + }, +}; + +// --------------------------------------------------------------------------- +// Tray — system menu-bar status item via perry/ui tray*. +// --------------------------------------------------------------------------- + +class Tray extends EventEmitter { + private _handle: any; + private _destroyed: boolean; + + constructor(image: string | NativeImage) { + super(); + this._destroyed = false; + this._handle = trayCreate(iconToPath(image)); + rootedNativeUi.push(this._handle); + const self = this; + const onClick = () => self.emit("click"); + rootedNativeUi.push(onClick); + trayOnClick(this._handle, onClick); + } + + setImage(image: string | NativeImage): void { + traySetIcon(this._handle, iconToPath(image)); + } + setToolTip(toolTip: string): void { + traySetTooltip(this._handle, toolTip); + } + setTitle(_title: string, _options?: any): void { + /* status-item title text — not wired in v1 */ + } + setContextMenu(menu: Menu | null): void { + if (menu) trayAttachMenu(this._handle, buildNativeMenu(menuItemList(menu))); + } + setPressedImage(_image: string | NativeImage): void {} + popUpContextMenu(_menu?: any, _position?: any): void {} + isDestroyed(): boolean { + return this._destroyed; + } + destroy(): void { + if (this._destroyed) return; + trayDestroy(this._handle); + this._destroyed = true; + } +} + +export { Tray }; + // --------------------------------------------------------------------------- // ipcRenderer / contextBridge — renderer-only in Electron. Provided here so a // main-process `import { ipcRenderer } from 'electron'` doesn't crash; the real @@ -597,6 +881,9 @@ export default { MenuItem, dialog, shell, + clipboard, + nativeImage, + Tray, nativeTheme, WebContents, }; From ed43488f11b74a3736b1a3fbf0f63416a64826cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Mon, 29 Jun 2026 12:02:54 +0200 Subject: [PATCH 04/11] =?UTF-8?q?fix(electron):=20address=20review=20?= =?UTF-8?q?=E2=80=94=20dialog=20root=20leak,=20visible-window=20activate,?= =?UTF-8?q?=20null=20detach,=20tray=20guards?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CodeRabbit feedback on the Tier A wiring: - dialog open/save callbacks now unroot from the GC-root array once the native side replies (were leaking one-shot closures for the app lifetime). - app 'activate' reports hasVisibleWindows from actual window visibility (BrowserWindow now tracks _visible via show/hide/close and exposes isVisible()); a hidden window no longer suppresses the dock-reopen pattern. - Menu.setApplicationMenu(null) attaches a fresh empty menubar so the previous app menu is cleared instead of left live. - Tray.setContextMenu(null) attaches an empty menu to detach the previous one; setImage/setToolTip/setContextMenu are guarded after destroy(). - nativeImage.createFromDataURL/createFromBuffer warn (unsupported → empty image) instead of silently dropping Tray/dock icons. --- packages/electron/src/index.ts | 56 +++++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/packages/electron/src/index.ts b/packages/electron/src/index.ts index 783cad8230..de5cc4f633 100644 --- a/packages/electron/src/index.ts +++ b/packages/electron/src/index.ts @@ -227,6 +227,22 @@ interface BrowserWindowOptions { let nextWebContentsId = 1; const openWindows: BrowserWindow[] = []; +// True if any open window is currently visible (for the 'activate' event's +// hasVisibleWindows arg — a hidden window must not count). +function anyWindowVisible(): boolean { + for (let i = 0; i < openWindows.length; i++) { + if (openWindows[i].isVisible()) return true; + } + return false; +} + +// Drop a one-shot native callback from the GC-root array once it has fired +// (dialog completion handlers only need to live until the native side replies). +function unrootNativeUi(cb: any): void { + const i = rootedNativeUi.indexOf(cb); + if (i >= 0) rootedNativeUi.splice(i, 1); +} + // Keeps the app-ready closure passed to appRequestLoop alive from module init // until the native loop fires it after main top-level (GC root). let rootedOnReady: (() => void) | null = null; @@ -251,11 +267,13 @@ class BrowserWindow extends EventEmitter { private _setSize: (w: number, h: number) => void; webContents: WebContents; private destroyed: boolean; + private _visible: boolean; private preloadPath: string | undefined; constructor(options?: BrowserWindowOptions) { super(); this.destroyed = false; + this._visible = false; const opts = options || {}; const width = opts.width || 800; const height = opts.height || 600; @@ -309,6 +327,7 @@ class BrowserWindow extends EventEmitter { win.setBody(wv); if (opts.show !== false) { win.show(); + this._visible = true; } openWindows.push(this); } @@ -327,15 +346,21 @@ class BrowserWindow extends EventEmitter { show(): void { this._show(); + this._visible = true; } hide(): void { this._hide(); + this._visible = false; + } + isVisible(): boolean { + return this._visible && !this.destroyed; } close(): void { if (this.destroyed) return; this.emit("close"); this._close(); this.destroyed = true; + this._visible = false; const idx = openWindows.indexOf(this); if (idx >= 0) openWindows.splice(idx, 1); this.emit("closed"); @@ -420,8 +445,10 @@ class App extends EventEmitter { appRequestLoop(rootedOnReady); // macOS 'activate' — fired when the dock icon is clicked (incl. after all // windows are closed). Electron apps reopen their window from here. + // hasVisibleWindows must reflect *visible* windows, not merely open ones + // (a hidden window must not suppress the reopen pattern). rootedOnActivate = () => { - self.emit("activate", {}, openWindows.length > 0); + self.emit("activate", {}, anyWindowVisible()); }; onActivate(rootedOnActivate); } @@ -641,8 +668,16 @@ class Menu { } static setApplicationMenu(menu: Menu | null): void { appMenu = menu; - if (!menu) return; // removing the native menubar isn't supported in v1 - menuBarAttach(menu._buildNativeMenuBar()); + if (menu) { + menuBarAttach(menu._buildNativeMenuBar()); + } else { + // No native "remove menubar" API; attach a fresh empty bar so the app's + // custom menus are cleared rather than left live (keeps the native state + // consistent with getApplicationMenu() === null). + const empty = menuBarCreate(); + rootedNativeUi.push(empty); + menuBarAttach(empty); + } } static getApplicationMenu(): Menu | null { return appMenu; @@ -673,6 +708,7 @@ export const dialog = { const wantDir = props.indexOf("openDirectory") >= 0; return new Promise((resolve) => { const cb = (selected: string) => { + unrootNativeUi(cb); if (!selected) resolve({ canceled: true, filePaths: [] }); else resolve({ canceled: false, filePaths: [selected] }); }; @@ -688,6 +724,7 @@ export const dialog = { const ext = path.extname(base).replace(/^\./, ""); return new Promise((resolve) => { const cb = (selected: string) => { + unrootNativeUi(cb); if (!selected) resolve({ canceled: true, filePath: "" }); else resolve({ canceled: false, filePath: selected }); }; @@ -781,9 +818,13 @@ export const nativeImage = { return new NativeImage(""); }, createFromDataURL(_dataUrl: string): NativeImage { + // v1 supports path-backed images only; data-URL/buffer sources return an + // empty image. Warn so a missing Tray/dock icon isn't a silent surprise. + console.warn("[electron] nativeImage.createFromDataURL is unsupported (returns an empty image)"); return new NativeImage(""); }, createFromBuffer(_buffer: any, _options?: any): NativeImage { + console.warn("[electron] nativeImage.createFromBuffer is unsupported (returns an empty image)"); return new NativeImage(""); }, }; @@ -808,16 +849,23 @@ class Tray extends EventEmitter { } setImage(image: string | NativeImage): void { + if (this._destroyed) return; traySetIcon(this._handle, iconToPath(image)); } setToolTip(toolTip: string): void { + if (this._destroyed) return; traySetTooltip(this._handle, toolTip); } setTitle(_title: string, _options?: any): void { /* status-item title text — not wired in v1 */ } setContextMenu(menu: Menu | null): void { - if (menu) trayAttachMenu(this._handle, buildNativeMenu(menuItemList(menu))); + if (this._destroyed) return; + // `null` detaches the current menu — attach a fresh empty native menu so + // the previous context menu doesn't linger. + const native = menu ? buildNativeMenu(menuItemList(menu)) : menuCreate(); + if (!menu) rootedNativeUi.push(native); + trayAttachMenu(this._handle, native); } setPressedImage(_image: string | NativeImage): void {} popUpContextMenu(_menu?: any, _position?: any): void {} From f0c4cc80d60d1e516d20adf5e67bbd4c4bb763db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Mon, 29 Jun 2026 17:37:24 +0200 Subject: [PATCH 05/11] =?UTF-8?q?feat(servo):=20unblock=20in-process=20Ser?= =?UTF-8?q?vo=20=E2=80=94=20fork=20servo-script=20onto=20ml-kem=200.3.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Servo now compiles as a perry workspace member (servo-webview feature). Two dependency conflicts with perry's tree resolved: - libsqlite3-sys: via the rusqlite 0.37 + sqlx 0.9 upgrade (separate PR). - ml-kem: perry needs 0.3.2+pkcs8 (stable kem); servo-script needs 0.2.x (pre-release kem, no pkcs8). Forked servo-script and migrated its WebCrypto ML-KEM code 0.2 -> 0.3.2. Captured as docs/servo/servo-script-ml-kem-0.3.2.patch and applied via a local [patch.crates-io]. Verified: perry-ui-macos --features servo-webview builds the full Servo stack (servo v0.1.1) cleanly. ml-dsa is not a conflict (perry doesn't use it). The ml-kem migration is type-correct; behavioral crypto correctness needs Servo's WebCrypto vectors (niche surface; rendering unaffected). See docs/servo/README.md. WIP: ServoEngine integration (render into NSView + event loop + toggle) follows. (cherry picked from commit 9464ac517ed4b8808adc6386c954f90865b9f534) --- Cargo.lock | 10417 ++++++++++++++----- Cargo.toml | 6 + crates/perry-ui-macos/Cargo.toml | 2 + docs/servo/README.md | 58 + docs/servo/servo-script-ml-kem-0.3.2.patch | 332 + 5 files changed, 8047 insertions(+), 2768 deletions(-) create mode 100644 docs/servo/README.md create mode 100644 docs/servo/servo-script-ml-kem-0.3.2.patch diff --git a/Cargo.lock b/Cargo.lock index bf1061c195..787d5fec81 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,35 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "accesskit" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3b7f7f85a7e5f68090000ed7622545829afd484d210358702ae4cb97dd0c320" +dependencies = [ + "enumn", + "serde", + "uuid", +] + +[[package]] +name = "accountable-refcell" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6afea9052e0b2d90e38572691d87194b2e5d8d6899b9b850b22aaab17e486252" +dependencies = [ + "backtrace", +] + +[[package]] +name = "addr2line" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +dependencies = [ + "gimli", +] + [[package]] name = "adler2" version = "2.0.1" @@ -54,6 +83,15 @@ dependencies = [ "subtle", ] +[[package]] +name = "aes-kw" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69fa2b352dcefb5f7f3a5fb840e02665d311d878955380515e4fd50095dd3d8c" +dependencies = [ + "aes 0.8.4", +] + [[package]] name = "aes-kw" version = "0.3.1" @@ -141,6 +179,9 @@ name = "allocator-api2" version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +dependencies = [ + "serde", +] [[package]] name = "allsorts" @@ -236,6 +277,16 @@ version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" +[[package]] +name = "app_units" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "467b60e4ee6761cd6fd4e03ea58acefc8eec0d1b1def995c1b3b783fa7be8a60" +dependencies = [ + "num-traits", + "serde", +] + [[package]] name = "ar_archive_writer" version = "0.5.2" @@ -251,6 +302,26 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +[[package]] +name = "arboard" +version = "3.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf" +dependencies = [ + "clipboard-win", + "image", + "log", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "parking_lot", + "percent-encoding", + "windows-sys 0.60.2", + "x11rb", +] + [[package]] name = "arc-swap" version = "1.9.2" @@ -289,11 +360,20 @@ dependencies = [ "password-hash", ] +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + [[package]] name = "arrayvec" version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f02882884d3e1bc524fb12c79f107f6ad0e1cfd498c536ffb494301740995dfe" +dependencies = [ + "serde", +] [[package]] name = "as-slice" @@ -310,6 +390,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading", +] + [[package]] name = "ast_node" version = "5.0.0" @@ -345,6 +434,18 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "async-compression" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79b3f8a79cccc2898f31920fc69f304859b3bd567490f75ebf51ae1c792a9ac" +dependencies = [ + "compression-codecs", + "compression-core", + "pin-project-lite", + "tokio", +] + [[package]] name = "async-executor" version = "1.14.0" @@ -452,6 +553,26 @@ dependencies = [ "syn 2.0.118", ] +[[package]] +name = "async-tungstenite" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8447f02eaa65412035e2d3eeaa3fc82bbb8d7137c84c5976b4af685136012ee9" +dependencies = [ + "atomic-waker", + "futures-core", + "futures-io", + "futures-task", + "futures-util", + "log", + "pin-project-lite", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite 0.29.0", + "webpki-roots 1.0.8", +] + [[package]] name = "atoi" version = "2.0.0" @@ -573,6 +694,21 @@ dependencies = [ "fastrand", ] +[[package]] +name = "backtrace" +version = "0.3.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-link 0.2.1", +] + [[package]] name = "base16ct" version = "0.2.0" @@ -585,6 +721,18 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd307490d624467aa6f74b0eabb77633d1f758a7b25f12bceb0b22e08d9726f6" +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + [[package]] name = "base64" version = "0.22.1" @@ -603,7 +751,7 @@ version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abaf6da45c74385272ddf00e1ac074c7d8a6c1a1dda376902bd6a427522a8b2c" dependencies = [ - "base64", + "base64 0.22.1", "blowfish", "getrandom 0.3.4", "subtle", @@ -619,6 +767,15 @@ dependencies = [ "scoped-tls", ] +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + [[package]] name = "bindgen" version = "0.72.1" @@ -712,6 +869,12 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + [[package]] name = "block-buffer" version = "0.10.4" @@ -727,7 +890,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" dependencies = [ - "hybrid-array", + "hybrid-array 0.4.13", "zeroize", ] @@ -824,7 +987,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7969a9ba84b0ff843813e7249eed1678d9b6607ce5a3b8f0a47af3fcf7978e6e" dependencies = [ "ahash 0.8.12", - "base64", + "base64 0.22.1", "bitvec", "getrandom 0.2.17", "getrandom 0.3.4", @@ -840,6 +1003,23 @@ dependencies = [ "uuid", ] +[[package]] +name = "buf-read-ext" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e2c71c44e5bbc64de4ecfac946e05f9bba5cc296ea7bab4d3eda242a3ffa73c" + +[[package]] +name = "build-parallel" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e3ff9db740167616e528c509b3618046fc05d337f8f3182d300f4aa977d2bb" +dependencies = [ + "crossbeam-utils", + "jobserver", + "num_cpus", +] + [[package]] name = "built" version = "0.8.1" @@ -852,6 +1032,12 @@ version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + [[package]] name = "bytecheck" version = "0.6.12" @@ -885,6 +1071,20 @@ name = "bytemuck" version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] [[package]] name = "byteorder" @@ -946,6 +1146,16 @@ dependencies = [ "system-deps", ] +[[package]] +name = "calendrical_calculations" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e97f73e95d668625c9b28a3072e6326773785a0cf807de9f3d632778438f3d38" +dependencies = [ + "core_maths", + "displaydoc", +] + [[package]] name = "calendrical_calculations" version = "0.2.4" @@ -1014,6 +1224,15 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" +dependencies = [ + "libc", +] + [[package]] name = "chacha20" version = "0.9.1" @@ -1049,6 +1268,17 @@ dependencies = [ "zeroize", ] +[[package]] +name = "chardetng" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14b8f0b65b7b08ae3c8187e8d77174de20cb6777864c6b832d8ad365999cf1ea" +dependencies = [ + "cfg-if", + "encoding_rs", + "memchr", +] + [[package]] name = "chrono" version = "0.4.45" @@ -1060,7 +1290,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -1151,6 +1381,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" +[[package]] +name = "clipboard-win" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" +dependencies = [ + "error-code", +] + [[package]] name = "cmake" version = "0.1.58" @@ -1166,6 +1405,33 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror 2.0.18", +] + +[[package]] +name = "codespan-reporting" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "color" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ec7c5eb7a16992b1904d76c517d170ab353b0e0b3d5a0c81a8a0cd1037893cf" +dependencies = [ + "bytemuck", +] + [[package]] name = "color_quant" version = "1.1.0" @@ -1192,6 +1458,26 @@ dependencies = [ "tokio-util", ] +[[package]] +name = "compression-codecs" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce2548391e9c1929c21bf6aa2680af86fe4c1b33e6cea9ac1cfeec0bd11218cf" +dependencies = [ + "brotli", + "compression-core", + "flate2", + "memchr", + "zstd", + "zstd-safe", +] + +[[package]] +name = "compression-core" +version = "0.4.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc14f565cf027a105f7a44ccf9e5b424348421a1d8952a8fc9d499d313107789" + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -1264,6 +1550,22 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" +[[package]] +name = "content-security-policy" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d348c3856ad6a6b957d69dc8cf93e66fe9be5a7657fdd7028b1a56d2775e3fce" +dependencies = [ + "base64 0.22.1", + "bitflags 2.13.0", + "once_cell", + "percent-encoding", + "regex", + "serde", + "sha2 0.10.9", + "url", +] + [[package]] name = "convert_case" version = "0.10.0" @@ -1273,6 +1575,26 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "cookie" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" +dependencies = [ + "time", + "version_check", +] + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "time", + "version_check", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1300,25 +1622,72 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] -name = "core_maths" -version = "0.1.1" +name = "core-graphics" +version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" dependencies = [ - "libm", + "bitflags 1.3.2", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", + "foreign-types", + "libc", ] [[package]] -name = "cpubits" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15b85f9c39137c3a891689859392b1bd49812121d0d61c9caf00d46ed5ce06ae" - -[[package]] -name = "cpufeatures" -version = "0.2.17" +name = "core-graphics-types" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.13.0", + "core-foundation 0.10.1", + "libc", +] + +[[package]] +name = "core-text" +version = "20.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d2790b5c08465d49f8dc05c8bcae9fea467855947db39b0f8145c091aaced5" +dependencies = [ + "core-foundation 0.9.4", + "core-graphics", + "foreign-types", + "libc", +] + +[[package]] +name = "core_maths" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" +dependencies = [ + "libm", +] + +[[package]] +name = "cpubits" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15b85f9c39137c3a891689859392b1bd49812121d0d61c9caf00d46ed5ce06ae" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -1382,7 +1751,7 @@ checksum = "4aa42bcd3d846ebf66e15bd528d1087f75d1c6c1c66ebff626178a106353c576" dependencies = [ "chrono", "derive_builder", - "strum", + "strum 0.27.2", ] [[package]] @@ -1455,7 +1824,7 @@ dependencies = [ "cpubits", "ctutils", "getrandom 0.4.3", - "hybrid-array", + "hybrid-array 0.4.13", "num-traits", "rand_core 0.10.1", "subtle", @@ -1480,23 +1849,47 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" dependencies = [ "getrandom 0.4.3", - "hybrid-array", + "hybrid-array 0.4.13", "rand_core 0.10.1", ] +[[package]] +name = "cssparser" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" +dependencies = [ + "cssparser-macros 0.6.1", + "dtoa-short", + "itoa", + "phf 0.13.1", + "serde", + "smallvec", +] + [[package]] name = "cssparser" version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c9cdaae01d5ed7882b04d795e7f752f46ff52d2fa3b50a20d28c464510bba98" dependencies = [ - "cssparser-macros", + "cssparser-macros 0.7.0", "dtoa-short", "itoa", "phf 0.13.1", "smallvec", ] +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.118", +] + [[package]] name = "cssparser-macros" version = "0.7.0" @@ -1642,12 +2035,50 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" +[[package]] +name = "data-url" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" + [[package]] name = "deflate64" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac6b926516df9c60bfa16e107b21086399f8285a44ca9711344b9e553c5146e2" +[[package]] +name = "defmt" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6e524506490a1953d237cb87b1cfc1e46f88c18f10a22dfe0f507dc6bfc7f7f" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0a27770e9c8f719a79d8b638281f4d828f77d8fd61e0bd94451b9b85e576a0b" +dependencies = [ + "defmt-parser", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror 2.0.18", +] + [[package]] name = "der" version = "0.7.10" @@ -1817,6 +2248,39 @@ dependencies = [ "zeroize", ] +[[package]] +name = "diplomat" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3137c640d2bac491dbfca7f9945c948f888dd8c95bdf7ee6b164fbdfa5d3efc2" +dependencies = [ + "diplomat_core", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "diplomat-runtime" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53bfcc833b58615b593a6e5c46771cb36b1cfce94899c60823810939fe8ca9d9" + +[[package]] +name = "diplomat_core" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd7aca1d8f9e7b73ad61785beedc9556ad79f84b15c15abaa7041377e42284c1" +dependencies = [ + "lazy_static", + "proc-macro2", + "quote", + "serde", + "smallvec", + "strck_ident", + "syn 2.0.118", +] + [[package]] name = "dirs" version = "6.0.0" @@ -1859,6 +2323,15 @@ dependencies = [ "syn 2.0.118", ] +[[package]] +name = "dlib" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" +dependencies = [ + "libloading", +] + [[package]] name = "document-features" version = "0.2.12" @@ -1874,6 +2347,12 @@ version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" + [[package]] name = "dssim-core" version = "3.4.0" @@ -1907,6 +2386,20 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "dwrote" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b35532432acc8b19ceed096e35dfa088d3ea037fe4f3c085f1f97f33b4d02" +dependencies = [ + "lazy_static", + "libc", + "serde", + "serde_derive", + "winapi", + "wio", +] + [[package]] name = "ecb" version = "0.1.2" @@ -2028,7 +2521,7 @@ dependencies = [ "crypto-common 0.2.2", "ff 0.14.0", "group 0.14.0", - "hybrid-array", + "hybrid-array 0.4.13", "pkcs8 0.11.0", "rand_core 0.10.1", "sec1 0.8.1", @@ -2042,7 +2535,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9298e6504d9b9e780ed3f7dfd43a61be8cd0e09eb07f7706a945b0072b6670b6" dependencies = [ - "base64", + "base64 0.22.1", "memchr", ] @@ -2052,12 +2545,42 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449" +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + [[package]] name = "encode_unicode" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" +[[package]] +name = "encoding_c" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9af727805f3b0d79956bde5b35732669fb5c5d45a94893798e7b7e70cfbf9cc1" +dependencies = [ + "encoding_rs", +] + +[[package]] +name = "encoding_c_mem" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a80a16821fe8c7cab96e0c67b57cd7090e021e9615e6ce6ab0cf866c44ed1f0" +dependencies = [ + "encoding_rs", +] + [[package]] name = "encoding_rs" version = "0.8.35" @@ -2065,6 +2588,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", + "serde", ] [[package]] @@ -2094,6 +2618,27 @@ dependencies = [ "syn 2.0.118", ] +[[package]] +name = "enumn" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "env_filter" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900d271a03799a1ee8d1ca9b19893b48ca674a9284fefcfb85f05e74ed314217" +dependencies = [ + "log", + "regex", +] + [[package]] name = "env_logger" version = "0.10.2" @@ -2107,6 +2652,19 @@ dependencies = [ "termcolor", ] +[[package]] +name = "env_logger" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de671bd27a75a797dc9ae289ba1e77276e75e2026408aab65185384e2d5cd3f6" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "jiff", + "log", +] + [[package]] name = "equator" version = "0.4.2" @@ -2143,6 +2701,23 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "error-code" +version = "3.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" + +[[package]] +name = "etagere" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc89bf99e5dc15954a60f707c1e09d7540e5cd9af85fa75caa0b510bc08c5342" +dependencies = [ + "euclid", + "serde", + "svg_fmt", +] + [[package]] name = "etcetera" version = "0.11.0" @@ -2153,6 +2728,16 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "euclid" +version = "0.22.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06" +dependencies = [ + "num-traits", + "serde", +] + [[package]] name = "event-listener" version = "5.4.1" @@ -2208,7 +2793,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1e1dacd0d2082dfcf1351c4bdd566bbe89a2b263235a2b50058f1e130a47277" dependencies = [ "bit-set", - "regex-automata", + "regex-automata 0.4.14", "regex-syntax", ] @@ -2245,6 +2830,15 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "fearless_simd" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fb2907d1f08b2b316b9223ced5b0e89d87028ba8deae9764741dba8ff7f3903" +dependencies = [ + "bytemuck", +] + [[package]] name = "ff" version = "0.13.1" @@ -2297,6 +2891,23 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +[[package]] +name = "fixed_decimal" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0febbeb1118a9ecdee6e4520ead6b54882e843dd0592ad233247dbee84c53db8" +dependencies = [ + "displaydoc", + "smallvec", + "writeable 0.5.5", +] + +[[package]] +name = "fixedbitset" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86d4de0081402f5e88cdac65c8dcdcc73118c1a7a465e2a05f0da05843a8ea33" + [[package]] name = "flagset" version = "0.4.7" @@ -2314,6 +2925,12 @@ dependencies = [ "zlib-rs", ] +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" + [[package]] name = "flume" version = "0.12.0" @@ -2344,55 +2961,178 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] -name = "form_urlencoded" -version = "1.2.2" +name = "font-types" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +checksum = "39a654f404bbcbd48ea58c617c2993ee91d1cb63727a37bf2323a4edeed1b8c5" dependencies = [ - "percent-encoding", + "bytemuck", ] [[package]] -name = "from_variant" -version = "3.0.0" +name = "fontconfig-parser" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ff35a391aef949120a0340d690269b3d9f63460a6106e99bd07b961f345ea9" +checksum = "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30de5f5646" dependencies = [ - "swc_macros_common", - "syn 2.0.118", + "roxmltree", ] [[package]] -name = "fs_extra" -version = "1.3.0" +name = "fontdb" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" +checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905" +dependencies = [ + "fontconfig-parser", + "log", + "memmap2", + "slotmap", + "tinyvec", + "ttf-parser", +] [[package]] -name = "fsevent-sys" -version = "4.1.0" +name = "fontsan" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" +checksum = "52fd401b496627c46f35318272508fcdcb77927868507ed2ad796408aa903923" dependencies = [ + "cc", + "fontsan-woff2", + "glob", "libc", + "libz-sys", ] [[package]] -name = "fslock" -version = "0.2.1" +name = "fontsan-woff2" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04412b8935272e3a9bae6f48c7bfff74c2911f60525404edfdd28e49884c3bfb" +checksum = "106ebe29445505f3860765d2597ddad20a3e90174d6e8539a10d58253b3e5c0f" +dependencies = [ + "brotli-decompressor", + "cc", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "freetype" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a440748e063798e4893ceb877151e84acef9bea9a8c6800645cf3f1b3a7806e" +dependencies = [ + "freetype-sys", + "libc", +] + +[[package]] +name = "freetype-sys" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7edc5b9669349acfda99533e9e0bcf26a51862ab43b08ee7745c55d28eb134" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "from_variant" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ff35a391aef949120a0340d690269b3d9f63460a6106e99bd07b961f345ea9" +dependencies = [ + "swc_macros_common", + "syn 2.0.118", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "fsevent-sys" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" +dependencies = [ + "libc", +] + +[[package]] +name = "fslock" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04412b8935272e3a9bae6f48c7bfff74c2911f60525404edfdd28e49884c3bfb" dependencies = [ "libc", "winapi", ] +[[package]] +name = "fst" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ab85b9b05e3978cc9a9cf8fea7f01b494e1a09ed3037e16ba39edc7a29eb61a" + [[package]] name = "funty" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.32" @@ -2495,6 +3235,16 @@ dependencies = [ "slab", ] +[[package]] +name = "gaol" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "061957ca7a966a39a79ebca393a9a6c7babda10bf9dd6f11d00041558d929c22" +dependencies = [ + "libc", + "log", +] + [[package]] name = "gdk-pixbuf" version = "0.20.10" @@ -2563,6 +3313,16 @@ dependencies = [ "zeroize", ] +[[package]] +name = "gethostname" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" +dependencies = [ + "rustix", + "windows-link 0.2.1", +] + [[package]] name = "getopts" version = "0.2.24" @@ -2572,6 +3332,17 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + [[package]] name = "getrandom" version = "0.2.17" @@ -2581,7 +3352,7 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] @@ -2623,6 +3394,16 @@ dependencies = [ "polyval", ] +[[package]] +name = "gif" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" +dependencies = [ + "color_quant", + "weezl", +] + [[package]] name = "gif" version = "0.14.2" @@ -2633,6 +3414,12 @@ dependencies = [ "weezl", ] +[[package]] +name = "gimli" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" + [[package]] name = "gio" version = "0.20.12" @@ -2676,6 +3463,26 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "gleam" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8647cc2e2ffde598ce5ca2809452e722dd8dc127885ab8aba2fa8b469cd3ed94" +dependencies = [ + "gl_generator", +] + [[package]] name = "glib" version = "0.20.12" @@ -2769,6 +3576,36 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +[[package]] +name = "glow" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glslopt" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c406272113953698f579ad93ec5e909eae0b5f84f6839238b185081d0df04d" +dependencies = [ + "cc", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" +dependencies = [ + "gl_generator", +] + [[package]] name = "glyph-names" version = "0.2.0" @@ -2820,6 +3657,57 @@ dependencies = [ "web-time", ] +[[package]] +name = "gpu-alloc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags 2.13.0", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.13.0", +] + +[[package]] +name = "gpu-allocator" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" +dependencies = [ + "log", + "presser", + "thiserror 1.0.69", + "windows 0.58.0", +] + +[[package]] +name = "gpu-descriptor" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" +dependencies = [ + "bitflags 2.13.0", + "gpu-descriptor-types", + "hashbrown 0.15.5", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" +dependencies = [ + "bitflags 2.13.0", +] + [[package]] name = "graphene-rs" version = "0.20.10" @@ -2849,6 +3737,12 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36119f3a540b086b4e436bb2b588cf98a68863470e0e880f4d0842f112a3183a" +[[package]] +name = "grid" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b40ca9252762c466af32d0b1002e91e4e1bc5398f77455e55474deb466355ff5" + [[package]] name = "group" version = "0.13.0" @@ -3047,6 +3941,25 @@ dependencies = [ "system-deps", ] +[[package]] +name = "h2" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "h2" version = "0.4.15" @@ -3058,7 +3971,7 @@ dependencies = [ "fnv", "futures-core", "futures-sink", - "http", + "http 1.4.2", "indexmap", "slab", "tokio", @@ -3074,9 +3987,25 @@ checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ "cfg-if", "crunchy", + "num-traits", "zerocopy", ] +[[package]] +name = "harfbuzz-sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb86e2fef3ba40cebffb8fa2cba811f06aa5c5fd296a4e469473e5398d166594" +dependencies = [ + "cc", + "core-graphics", + "core-text", + "foreign-types", + "freetype-sys", + "pkg-config", + "winapi", +] + [[package]] name = "hash2curve" version = "0.14.0" @@ -3112,7 +4041,10 @@ version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ + "allocator-api2", + "equivalent", "foldhash 0.1.5", + "serde", ] [[package]] @@ -3156,20 +4088,68 @@ dependencies = [ ] [[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "heck" -version = "0.5.0" +name = "headers" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" +dependencies = [ + "base64 0.21.7", + "bytes", + "headers-core 0.2.0", + "http 0.2.12", + "httpdate", + "mime", + "sha1 0.10.6", +] [[package]] -name = "hermit-abi" -version = "0.1.19" +name = "headers" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" +dependencies = [ + "base64 0.22.1", + "bytes", + "headers-core 0.3.0", + "http 1.4.2", + "httpdate", + "mime", + "sha1 0.10.6", +] + +[[package]] +name = "headers-core" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" +dependencies = [ + "http 0.2.12", +] + +[[package]] +name = "headers-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" +dependencies = [ + "http 1.4.2", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" dependencies = [ @@ -3188,6 +4168,12 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + [[package]] name = "hickory-net" version = "0.26.1" @@ -3302,7 +4288,7 @@ checksum = "617aaa3557aef3810a6369d0a99fac8a080891b68bd9f9812a1eeda0c0730cbd" dependencies = [ "cfg-if", "libc", - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -3329,6 +4315,17 @@ dependencies = [ "markup5ever", ] +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "http" version = "1.4.2" @@ -3339,6 +4336,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "pin-project-lite", +] + [[package]] name = "http-body" version = "1.0.1" @@ -3346,7 +4354,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http", + "http 1.4.2", ] [[package]] @@ -3357,8 +4365,8 @@ checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", "futures-core", - "http", - "http-body", + "http 1.4.2", + "http-body 1.0.1", "pin-project-lite", ] @@ -3380,6 +4388,15 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" +[[package]] +name = "hybrid-array" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d15931895091dea5c47afa5b3c9a01ba634b311919fd4d41388fa0e3d76af" +dependencies = [ + "typenum", +] + [[package]] name = "hybrid-array" version = "0.4.13" @@ -3392,6 +4409,30 @@ dependencies = [ "zeroize", ] +[[package]] +name = "hyper" +version = "0.14.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.3.27", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.5.10", + "tokio", + "tower-service", + "tracing", + "want", +] + [[package]] name = "hyper" version = "1.10.1" @@ -3402,9 +4443,9 @@ dependencies = [ "bytes", "futures-channel", "futures-core", - "h2", - "http", - "http-body", + "h2 0.4.15", + "http 1.4.2", + "http-body 1.0.1", "httparse", "httpdate", "itoa", @@ -3420,9 +4461,10 @@ version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ - "http", - "hyper", + "http 1.4.2", + "hyper 1.10.1", "hyper-util", + "log", "rustls", "tokio", "tokio-rustls", @@ -3436,18 +4478,18 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "futures-channel", "futures-util", - "http", - "http-body", - "hyper", + "http 1.4.2", + "http-body 1.0.1", + "hyper 1.10.1", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2", + "socket2 0.6.4", "tokio", "tower-service", "tracing", @@ -3465,7 +4507,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core", + "windows-core 0.62.2", ] [[package]] @@ -3477,22 +4519,45 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_calendar" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7265b2137f9a36f7634a308d91f984574bbdba8cfd95ceffe1c345552275a8ff" +dependencies = [ + "calendrical_calculations 0.1.3", + "displaydoc", + "icu_calendar_data 1.5.1", + "icu_locid", + "icu_locid_transform", + "icu_provider 1.5.0", + "tinystr 0.7.6", + "writeable 0.5.5", + "zerovec 0.10.4", +] + [[package]] name = "icu_calendar" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2b2acc6263f494f1df50685b53ff8e57869e47d5c6fe39c23d518ae9a4f3e45" dependencies = [ - "calendrical_calculations", + "calendrical_calculations 0.2.4", "displaydoc", - "icu_calendar_data", + "icu_calendar_data 2.2.0", "icu_locale", "icu_locale_core", - "icu_provider", - "tinystr", - "zerovec", + "icu_provider 2.2.0", + "tinystr 0.8.3", + "zerovec 0.11.6", ] +[[package]] +name = "icu_calendar_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "820499e77e852162190608b4f444e7b4552619150eafc39a9e39333d9efae9e1" + [[package]] name = "icu_calendar_data" version = "2.2.0" @@ -3500,4107 +4565,6676 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "118577bcf3a0fa7c6ac0a7d6e951814da84ee56b9b1f68fb4d8d10b08cefaf4d" [[package]] -name = "icu_collections" -version = "2.2.0" +name = "icu_capi" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +checksum = "acc33c4f501b515cdb6b583b31ec009479a4c0cb4cf28dcdfcd54b29069d725e" +dependencies = [ + "diplomat", + "diplomat-runtime", + "icu_calendar 1.5.2", + "icu_casemap", + "icu_collator", + "icu_collections 1.5.0", + "icu_datetime", + "icu_decimal", + "icu_experimental", + "icu_list", + "icu_locid", + "icu_locid_transform", + "icu_normalizer 1.5.0", + "icu_plurals", + "icu_properties 1.5.1", + "icu_provider 1.5.0", + "icu_provider_adapters", + "icu_segmenter 1.5.0", + "icu_timezone", + "tinystr 0.7.6", + "unicode-bidi", + "writeable 0.5.5", +] + +[[package]] +name = "icu_casemap" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ff0c8ae9f8d31b12e27fc385ff9ab1f3cd9b17417c665c49e4ec958c37da75f" dependencies = [ "displaydoc", - "potential_utf", - "utf8_iter", - "yoke", - "zerofrom", - "zerovec", + "icu_casemap_data", + "icu_collections 1.5.0", + "icu_locid", + "icu_properties 1.5.1", + "icu_provider 1.5.0", + "writeable 0.5.5", + "zerovec 0.10.4", ] [[package]] -name = "icu_locale" -version = "2.2.0" +name = "icu_casemap_data" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5a396343c7208121dc86e35623d3dfe19814a7613cfd14964994cdc9c9a2e26" +checksum = "02bd9f6276270c85a5cd54611adbbf94e993ec464a2a86a452a6c565b7ded5d9" + +[[package]] +name = "icu_collator" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d370371887d31d56f361c3eaa15743e54f13bc677059c9191c77e099ed6966b2" dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_locale_data", - "icu_provider", - "potential_utf", - "tinystr", - "zerovec", + "displaydoc", + "icu_collator_data", + "icu_collections 1.5.0", + "icu_locid_transform", + "icu_normalizer 1.5.0", + "icu_properties 1.5.1", + "icu_provider 1.5.0", + "smallvec", + "utf16_iter", + "utf8_iter", + "zerovec 0.10.4", ] [[package]] -name = "icu_locale_core" -version = "2.2.0" +name = "icu_collator_data" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +checksum = "7b353986d77d28991eca4dea5ef2b8982f639342ae19ca81edc44f048bc38ebb" + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" dependencies = [ "displaydoc", - "litemap", - "serde", - "tinystr", - "writeable", - "zerovec", + "yoke 0.7.5", + "zerofrom", + "zerovec 0.10.4", ] [[package]] -name = "icu_locale_data" +name = "icu_collections" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fdcc9ac77c6d74ff5cf6e65ef3181d6af32003b16fce3a77fb451d2f695993" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke 0.8.3", + "zerofrom", + "zerovec 0.11.6", +] [[package]] -name = "icu_normalizer" -version = "2.2.0" +name = "icu_datetime" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +checksum = "d115efb85e08df3fd77e77f52e7e087545a783fffba8be80bfa2102f306b1780" dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", + "displaydoc", + "either", + "fixed_decimal", + "icu_calendar 1.5.2", + "icu_datetime_data", + "icu_decimal", + "icu_locid", + "icu_locid_transform", + "icu_plurals", + "icu_provider 1.5.0", + "icu_timezone", "smallvec", - "zerovec", + "tinystr 0.7.6", + "writeable 0.5.5", + "zerovec 0.10.4", ] [[package]] -name = "icu_normalizer_data" -version = "2.2.0" +name = "icu_datetime_data" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" +checksum = "bef5f04076123cab1b7a926a7083db27fe0d7a0e575adb984854aae3f3a6507d" [[package]] -name = "icu_properties" -version = "2.2.0" +name = "icu_decimal" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +checksum = "fb8fd98f86ec0448d85e1edf8884e4e318bb2e121bd733ec929a05c0a5e8b0eb" dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", + "displaydoc", + "fixed_decimal", + "icu_decimal_data", + "icu_locid_transform", + "icu_provider 1.5.0", + "writeable 0.5.5", ] [[package]] -name = "icu_properties_data" -version = "2.2.0" +name = "icu_decimal_data" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" +checksum = "67c95dd97f5ccf6d837a9c115496ec7d36646fa86ca18e7f1412115b4c820ae2" [[package]] -name = "icu_provider" -version = "2.2.0" +name = "icu_experimental" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +checksum = "844ad7b682a165c758065d694bc4d74ac67f176da1c499a04d85d492c0f193b7" dependencies = [ "displaydoc", - "icu_locale_core", - "serde", - "stable_deref_trait", - "writeable", - "yoke", + "fixed_decimal", + "icu_collections 1.5.0", + "icu_decimal", + "icu_experimental_data", + "icu_locid", + "icu_locid_transform", + "icu_normalizer 1.5.0", + "icu_pattern", + "icu_plurals", + "icu_properties 1.5.1", + "icu_provider 1.5.0", + "litemap 0.7.5", + "num-bigint", + "num-rational", + "num-traits", + "smallvec", + "tinystr 0.7.6", + "writeable 0.5.5", "zerofrom", - "zerotrie", - "zerovec", + "zerotrie 0.1.3", + "zerovec 0.10.4", ] [[package]] -name = "ident_case" -version = "1.0.1" +name = "icu_experimental_data" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +checksum = "121df92eafb8f5286d4e8ff401c1e7db8384377f806db3f8db77b91e5b7bd4dd" [[package]] -name = "idna" -version = "1.1.0" +name = "icu_list" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +checksum = "bbfeda1d7775b6548edd4e8b7562304a559a91ed56ab56e18961a053f367c365" dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", + "displaydoc", + "icu_list_data", + "icu_locid_transform", + "icu_provider 1.5.0", + "regex-automata 0.2.0", + "writeable 0.5.5", ] [[package]] -name = "idna_adapter" -version = "1.2.2" +name = "icu_list_data" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" -dependencies = [ - "icu_normalizer", - "icu_properties", -] +checksum = "52b1a7fbdbf3958f1be8354cb59ac73f165b7b7082d447ff2090355c9a069120" [[package]] -name = "image" -version = "0.25.10" +name = "icu_locale" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" +checksum = "d5a396343c7208121dc86e35623d3dfe19814a7613cfd14964994cdc9c9a2e26" dependencies = [ - "bytemuck", - "byteorder-lite", - "color_quant", - "exr", - "gif", - "image-webp", - "moxcms", - "num-traits", - "png 0.18.1", - "qoi", - "ravif", - "rayon", - "rgb", - "tiff", - "zune-core", - "zune-jpeg", + "icu_collections 2.2.0", + "icu_locale_core", + "icu_locale_data", + "icu_provider 2.2.0", + "potential_utf", + "tinystr 0.8.3", + "zerovec 0.11.6", ] [[package]] -name = "image-webp" -version = "0.2.4" +name = "icu_locale_core" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ - "byteorder-lite", - "quick-error 2.0.1", + "displaydoc", + "litemap 0.8.2", + "serde", + "tinystr 0.8.3", + "writeable 0.6.3", + "zerovec 0.11.6", ] [[package]] -name = "imgref" -version = "1.12.2" +name = "icu_locale_data" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89194689a993ab15268672e99e7b0e19da2da3268ac682e8f02d29d4d1434cd7" +checksum = "d5fdcc9ac77c6d74ff5cf6e65ef3181d6af32003b16fce3a77fb451d2f695993" [[package]] -name = "indexmap" -version = "2.14.0" +name = "icu_locid" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" dependencies = [ - "equivalent", - "hashbrown 0.17.1", - "serde", - "serde_core", + "displaydoc", + "litemap 0.7.5", + "tinystr 0.7.6", + "writeable 0.5.5", + "zerovec 0.10.4", ] [[package]] -name = "indicatif" -version = "0.18.4" +name = "icu_locid_transform" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25470f23803092da7d239834776d653104d551bc4d7eacaf31e6837854b8e9eb" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" dependencies = [ - "console 0.16.3", - "portable-atomic", - "unicode-width", - "unit-prefix", - "web-time", + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider 1.5.0", + "tinystr 0.7.6", + "zerovec 0.10.4", ] [[package]] -name = "inotify" -version = "0.9.6" +name = "icu_locid_transform_data" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" -dependencies = [ - "bitflags 1.3.2", - "inotify-sys", - "libc", -] +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" [[package]] -name = "inotify-sys" -version = "0.1.5" +name = "icu_normalizer" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" dependencies = [ - "libc", + "displaydoc", + "icu_collections 1.5.0", + "icu_normalizer_data 1.5.1", + "icu_properties 1.5.1", + "icu_provider 1.5.0", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec 0.10.4", ] [[package]] -name = "inout" -version = "0.1.4" +name = "icu_normalizer" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ - "block-padding", - "generic-array", + "icu_collections 2.2.0", + "icu_normalizer_data 2.2.0", + "icu_properties 2.2.0", + "icu_provider 2.2.0", + "smallvec", + "zerovec 0.11.6", ] [[package]] -name = "inout" -version = "0.2.2" +name = "icu_normalizer_data" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4250ce6452e92010fdf7268ccc5d14faa80bb12fc741938534c58f16804e03c7" -dependencies = [ - "hybrid-array", -] +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" [[package]] -name = "interpolate_name" -version = "0.2.4" +name = "icu_normalizer_data" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", -] +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] -name = "ipconfig" -version = "0.3.4" +name = "icu_pattern" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d40460c0ce33d6ce4b0630ad68ff63d6661961c48b6dba35e5a4d81cfb48222" +checksum = "cb7f36aafd098d6717de34e668a8120822275c1fba22b936e757b7de8a2fd7e4" dependencies = [ - "socket2", - "widestring", - "windows-registry", - "windows-result", - "windows-sys 0.61.2", + "displaydoc", + "either", + "writeable 0.5.5", + "yoke 0.7.5", + "zerofrom", ] [[package]] -name = "ipnet" -version = "2.12.0" +name = "icu_plurals" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" +checksum = "ba5a70e7c025dbd5c501b0a5c188cd11666a424f0dadcd4f0a95b7dafde3b114" dependencies = [ - "serde", + "displaydoc", + "fixed_decimal", + "icu_locid_transform", + "icu_plurals_data", + "icu_provider 1.5.0", + "zerovec 0.10.4", ] [[package]] -name = "is-macro" -version = "0.3.7" +name = "icu_plurals_data" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d57a3e447e24c22647738e4607f1df1e0ec6f72e16182c4cd199f647cdfb0e4" +checksum = "a483403238cb7d6a876a77a5f8191780336d80fe7b8b00bfdeb20be6abbfd112" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.118", + "displaydoc", + "icu_collections 1.5.0", + "icu_locid_transform", + "icu_properties_data 1.5.1", + "icu_provider 1.5.0", + "tinystr 0.7.6", + "unicode-bidi", + "zerovec 0.10.4", ] [[package]] -name = "is-terminal" -version = "0.4.17" +name = "icu_properties" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ - "hermit-abi 0.5.2", - "libc", - "windows-sys 0.61.2", + "icu_collections 2.2.0", + "icu_locale_core", + "icu_properties_data 2.2.0", + "icu_provider 2.2.0", + "zerotrie 0.2.4", + "zerovec 0.11.6", ] [[package]] -name = "is_terminal_polyfill" -version = "1.70.2" +name = "icu_properties_data" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" [[package]] -name = "itertools" -version = "0.10.5" +name = "icu_properties_data" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] -name = "itertools" -version = "0.13.0" +name = "icu_provider" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" dependencies = [ - "either", + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr 0.7.6", + "writeable 0.5.5", + "yoke 0.7.5", + "zerofrom", + "zerovec 0.10.4", ] [[package]] -name = "itertools" -version = "0.14.0" +name = "icu_provider" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ - "either", + "displaydoc", + "icu_locale_core", + "serde", + "stable_deref_trait", + "writeable 0.6.3", + "yoke 0.8.3", + "zerofrom", + "zerotrie 0.2.4", + "zerovec 0.11.6", ] [[package]] -name = "itertools" -version = "0.15.0" +name = "icu_provider_adapters" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc" +checksum = "d6324dfd08348a8e0374a447ebd334044d766b1839bb8d5ccf2482a99a77c0bc" dependencies = [ - "either", + "icu_locid", + "icu_locid_transform", + "icu_provider 1.5.0", + "tinystr 0.7.6", + "zerovec 0.10.4", ] [[package]] -name = "itoa" -version = "1.0.18" +name = "icu_provider_macros" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] [[package]] -name = "ixdtf" -version = "0.6.5" +name = "icu_segmenter" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ceaf4c6c48465bead8cb6a0b7c4ee0c86ecbb31239032b9c66ab9a08d2f3ee1" +checksum = "a717725612346ffc2d7b42c94b820db6908048f39434504cb130e8b46256b0de" +dependencies = [ + "core_maths", + "displaydoc", + "icu_collections 1.5.0", + "icu_locid", + "icu_provider 1.5.0", + "icu_segmenter_data 1.5.1", + "utf8_iter", + "zerovec 0.10.4", +] [[package]] -name = "javascriptcore6" -version = "0.4.0" +name = "icu_segmenter" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03b28ed9c7c08f906b2a51bc2365eae2ba5e7db1249b89892f7ae4cbd602d1f4" +checksum = "5c0794db0b1a86193ac9c48768d0e6c52c54448e0870ad87907d456ee0dac964" dependencies = [ - "glib 0.20.12", - "javascriptcore6-sys", - "libc", + "core_maths", + "icu_collections 2.2.0", + "icu_locale", + "icu_provider 2.2.0", + "icu_segmenter_data 2.2.0", + "potential_utf", + "utf8_iter", + "zerovec 0.11.6", ] [[package]] -name = "javascriptcore6-sys" -version = "0.4.0" +name = "icu_segmenter_data" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4741e2a31c2145050dd4971f8dd51e92c840d5839a7124cc68a33c7325523a12" -dependencies = [ - "glib-sys 0.20.10", - "gobject-sys 0.20.10", - "libc", - "system-deps", -] +checksum = "a1e52775179941363cc594e49ce99284d13d6948928d8e72c755f55e98caa1eb" [[package]] -name = "jiff-tzdb" -version = "0.1.6" +name = "icu_segmenter_data" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c900ef84826f1338a557697dc8fc601df9ca9af4ac137c7fb61d4c6f2dfd3076" +checksum = "e4a2c462a4d927d512f5f882a033ddd62f33a05bb9f230d98f736ac3dc85938f" [[package]] -name = "jni" -version = "0.21.1" +name = "icu_timezone" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +checksum = "aa91ba6a585939a020c787235daa8aee856d9bceebd6355e283c0c310bc6de96" dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys 0.3.1", - "log", - "thiserror 1.0.69", - "walkdir", - "windows-sys 0.45.0", + "displaydoc", + "icu_calendar 1.5.2", + "icu_provider 1.5.0", + "icu_timezone_data", + "tinystr 0.7.6", + "zerotrie 0.1.3", + "zerovec 0.10.4", ] [[package]] -name = "jni" -version = "0.22.4" +name = "icu_timezone_data" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" -dependencies = [ - "cfg-if", - "combine", - "jni-macros", - "jni-sys 0.4.1", - "log", - "simd_cesu8", - "thiserror 2.0.18", - "walkdir", - "windows-link", -] +checksum = "1adcf7b613a268af025bc2a2532b4b9ee294e6051c5c0832d8bff20ac0232e68" [[package]] -name = "jni-macros" -version = "0.22.4" +name = "ident_case" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" -dependencies = [ - "proc-macro2", - "quote", - "rustc_version", - "simd_cesu8", - "syn 2.0.118", -] +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] -name = "jni-sys" -version = "0.3.1" +name = "idna" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ - "jni-sys 0.4.1", + "idna_adapter", + "smallvec", + "utf8_iter", ] [[package]] -name = "jni-sys" -version = "0.4.1" +name = "idna_adapter" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ - "jni-sys-macros", + "icu_normalizer 2.2.0", + "icu_properties 2.2.0", ] [[package]] -name = "jni-sys-macros" -version = "0.4.1" +name = "image" +version = "0.25.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" dependencies = [ - "quote", - "syn 2.0.118", + "bytemuck", + "byteorder-lite", + "color_quant", + "exr", + "gif 0.14.2", + "image-webp", + "moxcms", + "num-traits", + "png 0.18.1", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core 0.5.1", + "zune-jpeg 0.5.15", ] [[package]] -name = "jobserver" -version = "0.1.34" +name = "image-webp" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" dependencies = [ - "getrandom 0.3.4", - "libc", + "byteorder-lite", + "quick-error 2.0.1", ] [[package]] -name = "js-sys" -version = "0.3.103" +name = "imagesize" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" -dependencies = [ - "cfg-if", - "futures-util", - "wasm-bindgen", -] +checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" [[package]] -name = "jsonwebtoken" -version = "10.4.0" +name = "imgref" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eba32bfb4ffdeaca3e34431072faf01745c9b26d25504aa7a6cf5684334fc4fc" -dependencies = [ - "base64", - "ed25519-dalek", - "getrandom 0.2.17", - "hmac 0.12.1", - "js-sys", - "p256", - "p384", - "pem", - "rand 0.8.6", - "rsa", - "serde", - "serde_json", - "sha2 0.10.9", - "signature 2.2.0", - "simple_asn1", - "zeroize", -] +checksum = "89194689a993ab15268672e99e7b0e19da2da3268ac682e8f02d29d4d1434cd7" [[package]] -name = "kamadak-exif" -version = "0.6.1" +name = "imsz" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1130d80c7374efad55a117d715a3af9368f0fa7a2c54573afc15a188cd984837" -dependencies = [ - "mutate_once", -] +checksum = "396dda16a82727ec2d14aabc1167832bb823d849c54a246ca0cff6cfb7bc697c" [[package]] -name = "keccak" -version = "0.1.6" +name = "indexmap" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ - "cpufeatures 0.2.17", + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", ] [[package]] -name = "keccak" -version = "0.2.0" +name = "indicatif" +version = "0.18.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e24a010dd405bd7ed803e5253182815b41bf2e6a80cc3bfc066658e03a198aa" +checksum = "25470f23803092da7d239834776d653104d551bc4d7eacaf31e6837854b8e9eb" dependencies = [ - "cfg-if", - "cpufeatures 0.3.0", + "console 0.16.3", + "portable-atomic", + "unicode-width", + "unit-prefix", + "web-time", ] [[package]] -name = "kem" -version = "0.3.0" +name = "inherent" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01737161ba802849cfd486b5bd209d38ba4943494c249a8126005170c7621edd" +checksum = "c727f80bfa4a6c6e2508d2f05b6f4bfce242030bd88ed15ae5331c5b5d30fba7" dependencies = [ - "crypto-common 0.2.2", - "rand_core 0.10.1", + "proc-macro2", + "quote", + "syn 2.0.118", ] [[package]] -name = "kqueue" -version = "1.2.0" +name = "inotify" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "273c0752728918e0ac4976f2b275b6fefb9ecd400585dec929419f3844cd87b5" +checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" dependencies = [ - "kqueue-sys", + "bitflags 1.3.2", + "inotify-sys", "libc", ] [[package]] -name = "kqueue-sys" -version = "1.1.2" +name = "inotify-sys" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" dependencies = [ - "bitflags 2.13.0", "libc", ] [[package]] -name = "ksni" -version = "0.3.5" +name = "inout" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9eeb3f510b6148ae68f963af2c1fbb0de4d9e4e05f82813cfb319837c3ad2b" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ - "futures-util", - "pastey 0.2.3", - "serde", - "tokio", - "zbus", + "block-padding", + "generic-array", ] [[package]] -name = "kstring" -version = "2.0.2" +name = "inout" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "558bf9508a558512042d3095138b1f7b8fe90c5467d94f9f1da28b3731c5dbd1" +checksum = "4250ce6452e92010fdf7268ccc5d14faa80bb12fc741938534c58f16804e03c7" dependencies = [ - "static_assertions", + "hybrid-array 0.4.13", ] [[package]] -name = "lazy_static" -version = "1.5.0" +name = "interpolate_name" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ - "spin", + "proc-macro2", + "quote", + "syn 2.0.118", ] [[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - -[[package]] -name = "lebe" -version = "0.5.3" +name = "inventory" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" +checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" +dependencies = [ + "rustversion", +] [[package]] -name = "lettre" -version = "0.11.22" +name = "ipc-channel" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0da65617f6cb926332d039cb578aad56178da86e128db6a1b09f4c94fa5b3349" +checksum = "a441490012d80e9aea75fb27503df8e87e9557dcfc6fe4244dde86bfc12e94e3" dependencies = [ - "async-trait", - "base64", - "email-encoding", - "email_address", - "fastrand", - "futures-io", - "futures-util", - "hostname", - "httpdate", - "idna", - "mime", - "nom 8.0.0", - "percent-encoding", - "quoted_printable", - "rustls", - "socket2", - "tokio", - "tokio-rustls", - "url", - "webpki-roots 1.0.8", + "crossbeam-channel", + "libc", + "mio 1.2.1", + "postcard", + "rand 0.9.4", + "rustc-hash 2.1.2", + "serde_core", + "tempfile", + "thiserror 2.0.18", + "uuid", + "windows 0.61.3", ] [[package]] -name = "libbz2-rs-sys" -version = "0.2.5" +name = "ipconfig" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34b357333733e8260735ba5894eb928c02ecc69c78715f01a8019e7fa7f2db4c" +checksum = "4d40460c0ce33d6ce4b0630ad68ff63d6661961c48b6dba35e5a4d81cfb48222" +dependencies = [ + "socket2 0.6.4", + "widestring", + "windows-registry", + "windows-result 0.4.1", + "windows-sys 0.61.2", +] [[package]] -name = "libc" -version = "0.2.186" +name = "ipnet" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" +dependencies = [ + "serde", +] [[package]] -name = "libfuzzer-sys" -version = "0.4.13" +name = "is-macro" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9fd2f41a1cba099f79a0b6b6c35656cf7c03351a7bae8ff0f28f25270f929d2" +checksum = "1d57a3e447e24c22647738e4607f1df1e0ec6f72e16182c4cd199f647cdfb0e4" dependencies = [ - "arbitrary", - "cc", + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.118", ] [[package]] -name = "libloading" -version = "0.8.9" +name = "is-terminal" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ - "cfg-if", - "windows-link", + "hermit-abi 0.5.2", + "libc", + "windows-sys 0.61.2", ] [[package]] -name = "libm" -version = "0.2.16" +name = "is_terminal_polyfill" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] -name = "libmimalloc-sys" -version = "0.1.49" +name = "itertools" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a45a52f43e1c16f667ccfe4dd8c85b7f7c204fd5e3bf46c5b0db9a5c3c0b8e9" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ - "cc", + "either", ] [[package]] -name = "libredox" -version = "0.1.17" +name = "itertools" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ - "libc", + "either", ] [[package]] -name = "libshumate" -version = "0.6.0" +name = "itertools" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc9921cc829fb2d546bd6a3a158a4134002098887e0bb01ceb4535521af610ec" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ - "gdk-pixbuf", - "gdk4", - "gio", - "glib 0.20.12", - "gtk4", - "libc", - "libshumate-sys", + "either", ] [[package]] -name = "libshumate-sys" -version = "0.6.0" +name = "itertools" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b238767323bdd28dc72471fa8a512ad0ae99a18d9668deb626c55f373f7aff81" +checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc" dependencies = [ - "gdk-pixbuf-sys", - "gdk4-sys", - "gio-sys 0.20.10", - "glib-sys 0.20.10", - "gobject-sys 0.20.10", - "gtk4-sys", - "libc", - "system-deps", + "either", ] [[package]] -name = "libsqlite3-sys" -version = "0.35.0" +name = "itoa" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "133c182a6a2c87864fe97778797e46c7e999672690dc9fa3ee8e241aa4a9c13f" -dependencies = [ - "bindgen", - "cc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linux-raw-sys" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" - -[[package]] -name = "litemap" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] -name = "litrs" -version = "1.0.0" +name = "ixdtf" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" +checksum = "2ceaf4c6c48465bead8cb6a0b7c4ee0c86ecbb31239032b9c66ab9a08d2f3ee1" [[package]] -name = "lock_api" -version = "0.4.14" +name = "javascriptcore6" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +checksum = "03b28ed9c7c08f906b2a51bc2365eae2ba5e7db1249b89892f7ae4cbd602d1f4" dependencies = [ - "scopeguard", + "glib 0.20.12", + "javascriptcore6-sys", + "libc", ] [[package]] -name = "log" -version = "0.4.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" - -[[package]] -name = "loop9" -version = "0.1.5" +name = "javascriptcore6-sys" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +checksum = "4741e2a31c2145050dd4971f8dd51e92c840d5839a7124cc68a33c7325523a12" dependencies = [ - "imgref", + "glib-sys 0.20.10", + "gobject-sys 0.20.10", + "libc", + "system-deps", ] [[package]] -name = "lopdf" -version = "0.39.0" +name = "jiff" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f560f57dfb9142a02d673e137622fd515d4231e51feb8b4af28d92647d83f35b" +checksum = "34f877a98676d2fb664698d74cc6a51ce6c484ce8c770f05d0108ec9090aeb46" dependencies = [ - "aes 0.8.4", - "bitflags 2.13.0", - "cbc", - "ecb", - "encoding_rs", - "flate2", - "getrandom 0.3.4", - "indexmap", - "itoa", + "defmt", + "jiff-static", "log", - "md-5 0.10.6", - "nom 8.0.0", - "nom_locate", - "rand 0.9.4", - "rangemap", - "sha2 0.10.9", - "stringprep", - "thiserror 2.0.18", - "time", - "ttf-parser", - "weezl", + "portable-atomic", + "portable-atomic-util", + "serde_core", ] [[package]] -name = "lru" -version = "0.18.0" +name = "jiff-static" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a860605968fce16869fd239cf4237a82f3ac470723415db603b0e8b6c8d4fb9" +checksum = "0666b5ab5ecaca213fc2a85b8c0083d9004e84ee2d5f9a7e0017aaf50986f25f" dependencies = [ - "hashbrown 0.17.1", + "proc-macro2", + "quote", + "syn 2.0.118", ] [[package]] -name = "lru-slab" -version = "0.1.2" +name = "jiff-tzdb" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" +checksum = "c900ef84826f1338a557697dc8fc601df9ca9af4ac137c7fb61d4c6f2dfd3076" [[package]] -name = "lzma-rust2" -version = "0.16.4" +name = "jni" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce716bf1a316f47a280fc76295f6495b5bea4752bca01c3b3885e101b1c23c02" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" dependencies = [ - "sha2 0.11.0", + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", ] [[package]] -name = "mach2" -version = "0.6.0" +name = "jni" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dae608c151f68243f2b000364e1f7b186d9c29845f7d2d85bd31b9ad77ad552b" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys 0.4.1", + "log", + "simd_cesu8", + "thiserror 2.0.18", + "walkdir", + "windows-link 0.2.1", +] [[package]] -name = "macro_magic" -version = "0.5.1" +name = "jni-macros" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc33f9f0351468d26fbc53d9ce00a096c8522ecb42f19b50f34f2c422f76d21d" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" dependencies = [ - "macro_magic_core", - "macro_magic_macros", + "proc-macro2", "quote", + "rustc_version", + "simd_cesu8", "syn 2.0.118", ] [[package]] -name = "macro_magic_core" -version = "0.5.1" +name = "jni-sys" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1687dc887e42f352865a393acae7cf79d98fab6351cde1f58e9e057da89bf150" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" dependencies = [ - "const-random", - "derive-syn-parse", - "macro_magic_core_macros", - "proc-macro2", - "quote", - "syn 2.0.118", + "jni-sys 0.4.1", ] [[package]] -name = "macro_magic_core_macros" -version = "0.5.1" +name = "jni-sys" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b02abfe41815b5bd98dbd4260173db2c116dda171dc0fe7838cb206333b83308" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", + "jni-sys-macros", ] [[package]] -name = "macro_magic_macros" -version = "0.5.1" +name = "jni-sys-macros" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ea28ee64b88876bf45277ed9a5817c1817df061a74f2b988971a12570e5869" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" dependencies = [ - "macro_magic_core", "quote", "syn 2.0.118", ] [[package]] -name = "markup5ever" -version = "0.39.0" +name = "jobserver" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7122d987ec5f704ee56f6e5b41a7d93722e9aae27ae07cafa4036c4d3f9757de" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "log", - "tendril", - "web_atoms", + "getrandom 0.3.4", + "libc", ] [[package]] -name = "matchers" -version = "0.2.0" +name = "js-sys" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" dependencies = [ - "regex-automata", + "cfg-if", + "futures-util", + "wasm-bindgen", ] [[package]] -name = "maybe-rayon" -version = "0.1.1" +name = "jsonwebtoken" +version = "10.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +checksum = "eba32bfb4ffdeaca3e34431072faf01745c9b26d25504aa7a6cf5684334fc4fc" dependencies = [ - "cfg-if", - "rayon", + "base64 0.22.1", + "ed25519-dalek", + "getrandom 0.2.17", + "hmac 0.12.1", + "js-sys", + "p256", + "p384", + "pem", + "rand 0.8.6", + "rsa", + "serde", + "serde_json", + "sha2 0.10.9", + "signature 2.2.0", + "simple_asn1", + "zeroize", ] [[package]] -name = "md-5" -version = "0.10.6" +name = "kamadak-exif" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +checksum = "1130d80c7374efad55a117d715a3af9368f0fa7a2c54573afc15a188cd984837" dependencies = [ - "cfg-if", - "digest 0.10.7", + "mutate_once", ] [[package]] -name = "md-5" -version = "0.11.0" +name = "keccak" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69b6441f590336821bb897fb28fc622898ccceb1d6cea3fde5ea86b090c4de98" +checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" dependencies = [ - "cfg-if", - "digest 0.11.3", + "cpufeatures 0.2.17", ] [[package]] -name = "memchr" -version = "2.8.2" +name = "keccak" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" +checksum = "9e24a010dd405bd7ed803e5253182815b41bf2e6a80cc3bfc066658e03a198aa" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", +] [[package]] -name = "memoffset" -version = "0.9.1" +name = "kem" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +checksum = "01737161ba802849cfd486b5bd209d38ba4943494c249a8126005170c7621edd" dependencies = [ - "autocfg", + "crypto-common 0.2.2", + "rand_core 0.10.1", ] [[package]] -name = "mimalloc" -version = "0.1.52" +name = "keyboard-types" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d4139bb28d14ad1facf21d5eb8825051b326e172d216b39f6d31df53cc97862" +checksum = "0fbe853b403ae61a04233030ae8a79d94975281ed9770a1f9e246732b534b28d" dependencies = [ - "libmimalloc-sys", + "bitflags 2.13.0", + "serde", + "unicode-segmentation", ] [[package]] -name = "mime" -version = "0.3.17" +name = "khronos-egl" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" dependencies = [ - "mime", - "unicase", + "libc", + "libloading", + "pkg-config", ] [[package]] -name = "minimal-lexical" -version = "0.2.1" +name = "khronos_api" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" [[package]] -name = "miniz_oxide" -version = "0.8.9" +name = "kqueue" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +checksum = "273c0752728918e0ac4976f2b275b6fefb9ecd400585dec929419f3844cd87b5" dependencies = [ - "adler2", - "simd-adler32", + "kqueue-sys", + "libc", ] [[package]] -name = "mio" -version = "0.8.11" +name = "kqueue-sys" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087" dependencies = [ + "bitflags 2.13.0", "libc", - "log", - "wasi", - "windows-sys 0.48.0", ] [[package]] -name = "mio" -version = "1.2.1" +name = "ksni" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" +checksum = "da9eeb3f510b6148ae68f963af2c1fbb0de4d9e4e05f82813cfb319837c3ad2b" dependencies = [ - "libc", - "wasi", - "windows-sys 0.61.2", + "futures-util", + "pastey 0.2.3", + "serde", + "tokio", + "zbus", ] [[package]] -name = "ml-kem" -version = "0.3.2" +name = "kstring" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e15f3e5b957493873e396a66914e83e616b6afe335cdef7efe5c6e1216aba66" +checksum = "558bf9508a558512042d3095138b1f7b8fe90c5467d94f9f1da28b3731c5dbd1" dependencies = [ - "const-oid 0.10.2", - "hybrid-array", - "kem", - "module-lattice", - "pkcs8 0.11.0", - "rand_core 0.10.1", - "sha3 0.11.0", + "static_assertions", ] [[package]] -name = "module-lattice" -version = "0.2.3" +name = "kurbo" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c61b87c9683ab7cb1c6871d261ad5479b6b10ceb52c4352aaca3b5d35a8febe" +checksum = "c62026ae44756f8a599ba21140f350303d4f08dcdcc71b5ad9c9bb8128c13c62" dependencies = [ - "ctutils", - "hybrid-array", - "num-traits", + "arrayvec", + "euclid", + "smallvec", ] [[package]] -name = "moka" -version = "0.12.15" +name = "kurbo" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957228ad12042ee839f93c8f257b62b4c0ab5eaae1d4fa60de53b27c9d7c5046" +checksum = "ce9729cc38c18d86123ab736fd2e7151763ba226ac2490ec092d1dd148825e32" dependencies = [ - "crossbeam-channel", - "crossbeam-epoch", - "crossbeam-utils", - "equivalent", - "parking_lot", - "portable-atomic", + "arrayvec", + "euclid", + "serde", "smallvec", - "tagptr", - "uuid", ] [[package]] -name = "mongocrypt" -version = "0.3.2" +name = "lazy_static" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da0cd419a51a5fb44819e290fbdb0665a54f21dead8923446a799c7f4d26ad9" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" dependencies = [ - "bson", - "mongocrypt-sys", - "once_cell", - "serde", + "spin", ] [[package]] -name = "mongocrypt-sys" -version = "0.1.5+1.15.1" +name = "leb128fmt" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224484c5d09285a7b8cb0a0c117e847ebd14cb6e4470ecf68cdb89c503b0edb9" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] -name = "mongodb" -version = "3.7.0" +name = "lebe" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276ba0cd571553d1f6936c6f180964776ece6ab7507dc8765f8a9c9c49d8cd00" +checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" + +[[package]] +name = "lettre" +version = "0.11.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0da65617f6cb926332d039cb578aad56178da86e128db6a1b09f4c94fa5b3349" dependencies = [ - "base64", - "bitflags 2.13.0", - "bson", - "derive-where", - "derive_more", - "futures-core", + "async-trait", + "base64 0.22.1", + "email-encoding", + "email_address", + "fastrand", "futures-io", "futures-util", - "hex", - "hickory-net", - "hickory-proto", - "hickory-resolver", - "hmac 0.12.1", - "macro_magic", - "md-5 0.10.6", - "mongocrypt", - "mongodb-internal-macros", - "pbkdf2 0.12.2", + "hostname", + "httpdate", + "idna", + "mime", + "nom 8.0.0", "percent-encoding", - "rand 0.9.4", - "rustc_version_runtime", + "quoted_printable", "rustls", - "serde", - "serde_bytes", - "serde_with", - "sha1 0.10.6", - "sha2 0.10.9", - "socket2", - "stringprep", - "strsim", - "take_mut", - "thiserror 2.0.18", + "socket2 0.6.4", "tokio", "tokio-rustls", - "tokio-util", - "typed-builder", - "uuid", + "url", "webpki-roots 1.0.8", ] [[package]] -name = "mongodb-internal-macros" -version = "3.7.0" +name = "libbz2-rs-sys" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99ceb1a9a1018e470077ec94cf3a8c2d0e6da542b2c05ea95a59a0a627147375" -dependencies = [ - "macro_magic", - "proc-macro2", - "quote", - "syn 2.0.118", -] +checksum = "34b357333733e8260735ba5894eb928c02ecc69c78715f01a8019e7fa7f2db4c" [[package]] -name = "moxcms" -version = "0.8.1" +name = "libc" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" -dependencies = [ - "num-traits", - "pxfm", -] +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] -name = "mpris-server" -version = "0.10.0" +name = "libfuzzer-sys" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70cf358e9a9516cc35ed40eebd56cbe80f5190a7a2b3cd0c2d358c86b879132b" +checksum = "a9fd2f41a1cba099f79a0b6b6c35656cf7c03351a7bae8ff0f28f25270f929d2" dependencies = [ - "async-channel", - "futures-channel", - "serde", - "trait-variant", - "zbus", + "arbitrary", + "cc", ] [[package]] -name = "muldiv" -version = "1.0.1" +name = "libloading" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "956787520e75e9bd233246045d19f42fb73242759cc57fba9611d940ae96d4b0" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link 0.2.1", +] [[package]] -name = "mutate_once" -version = "0.1.2" +name = "libm" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13d2233c9842d08cfe13f9eac96e207ca6a2ea10b80259ebe8ad0268be27d2af" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] -name = "nanoid" -version = "0.5.0" +name = "libmimalloc-sys" +version = "0.1.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8628de41fe064cc3f0cf07f3d299ee3e73521adaff72278731d5c8cae3797873" +checksum = "6a45a52f43e1c16f667ccfe4dd8c85b7f7c204fd5e3bf46c5b0db9a5c3c0b8e9" dependencies = [ - "rand 0.9.4", + "cc", ] [[package]] -name = "ndk-context" -version = "0.1.1" +name = "libredox" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" +checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3" +dependencies = [ + "libc", +] [[package]] -name = "new_debug_unreachable" -version = "1.0.6" +name = "libshumate" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" +checksum = "fc9921cc829fb2d546bd6a3a158a4134002098887e0bb01ceb4535521af610ec" +dependencies = [ + "gdk-pixbuf", + "gdk4", + "gio", + "glib 0.20.12", + "gtk4", + "libc", + "libshumate-sys", +] [[package]] -name = "no_std_io2" -version = "0.9.4" +name = "libshumate-sys" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418abd1b6d34fbf6cae440dc874771b0525a604428704c76e48b29a5e67b8003" +checksum = "b238767323bdd28dc72471fa8a512ad0ae99a18d9668deb626c55f373f7aff81" dependencies = [ - "memchr", + "gdk-pixbuf-sys", + "gdk4-sys", + "gio-sys 0.20.10", + "glib-sys 0.20.10", + "gobject-sys 0.20.10", + "gtk4-sys", + "libc", + "system-deps", ] [[package]] -name = "nom" -version = "7.1.3" +name = "libsqlite3-sys" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +checksum = "133c182a6a2c87864fe97778797e46c7e999672690dc9fa3ee8e241aa4a9c13f" dependencies = [ - "memchr", - "minimal-lexical", + "bindgen", + "cc", + "pkg-config", + "vcpkg", ] [[package]] -name = "nom" -version = "8.0.0" +name = "libz-sys" +version = "1.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +checksum = "85bc9657773828b90eeb625adff10eeac83cc21bbfd8e23a03eaa8a33c9e28d9" dependencies = [ - "memchr", + "cc", + "libc", + "pkg-config", + "vcpkg", ] [[package]] -name = "nom_locate" -version = "5.0.0" +name = "linebender_resource_handle" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b577e2d69827c4740cba2b52efaad1c4cc7c73042860b199710b3575c68438d" +checksum = "d4a5ff6bcca6c4867b1c4fd4ef63e4db7436ef363e0ad7531d1558856bae64f4" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "bytecount", - "memchr", - "nom 8.0.0", + "scopeguard", + "serde", ] [[package]] -name = "nonzero_ext" -version = "0.3.0" +name = "log" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" [[package]] -name = "noop_proc_macro" -version = "0.3.0" +name = "loop9" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] [[package]] -name = "notify" -version = "6.1.1" +name = "lopdf" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" +checksum = "f560f57dfb9142a02d673e137622fd515d4231e51feb8b4af28d92647d83f35b" dependencies = [ + "aes 0.8.4", "bitflags 2.13.0", - "crossbeam-channel", - "filetime", - "fsevent-sys", - "inotify", - "kqueue", - "libc", + "cbc", + "ecb", + "encoding_rs", + "flate2", + "getrandom 0.3.4", + "indexmap", + "itoa", "log", - "mio 0.8.11", - "walkdir", - "windows-sys 0.48.0", + "md-5 0.10.6", + "nom 8.0.0", + "nom_locate", + "rand 0.9.4", + "rangemap", + "sha2 0.10.9", + "stringprep", + "thiserror 2.0.18", + "time", + "ttf-parser", + "weezl", ] [[package]] -name = "nu-ansi-term" -version = "0.50.3" +name = "lru" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +checksum = "8a860605968fce16869fd239cf4237a82f3ac470723415db603b0e8b6c8d4fb9" dependencies = [ - "windows-sys 0.61.2", + "hashbrown 0.17.1", ] [[package]] -name = "num-bigint" -version = "0.4.6" +name = "lru-slab" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", - "serde", -] +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] -name = "num-bigint-dig" -version = "0.8.6" +name = "lzma-rust2" +version = "0.16.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +checksum = "ce716bf1a316f47a280fc76295f6495b5bea4752bca01c3b3885e101b1c23c02" dependencies = [ - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand 0.8.6", - "smallvec", - "zeroize", + "sha2 0.11.0", ] [[package]] -name = "num-conv" -version = "0.2.2" +name = "mach2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" +checksum = "dae608c151f68243f2b000364e1f7b186d9c29845f7d2d85bd31b9ad77ad552b" [[package]] -name = "num-derive" -version = "0.4.2" +name = "macro_magic" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +checksum = "cc33f9f0351468d26fbc53d9ce00a096c8522ecb42f19b50f34f2c422f76d21d" dependencies = [ - "proc-macro2", + "macro_magic_core", + "macro_magic_macros", "quote", "syn 2.0.118", ] [[package]] -name = "num-integer" -version = "0.1.46" +name = "macro_magic_core" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +checksum = "1687dc887e42f352865a393acae7cf79d98fab6351cde1f58e9e057da89bf150" dependencies = [ - "num-traits", + "const-random", + "derive-syn-parse", + "macro_magic_core_macros", + "proc-macro2", + "quote", + "syn 2.0.118", ] [[package]] -name = "num-iter" -version = "0.1.45" +name = "macro_magic_core_macros" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +checksum = "b02abfe41815b5bd98dbd4260173db2c116dda171dc0fe7838cb206333b83308" dependencies = [ - "autocfg", - "num-integer", - "num-traits", + "proc-macro2", + "quote", + "syn 2.0.118", ] [[package]] -name = "num-rational" -version = "0.4.2" +name = "macro_magic_macros" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +checksum = "73ea28ee64b88876bf45277ed9a5817c1817df061a74f2b988971a12570e5869" dependencies = [ - "num-bigint", - "num-integer", - "num-traits", + "macro_magic_core", + "quote", + "syn 2.0.118", ] [[package]] -name = "num-traits" -version = "0.2.19" +name = "malloc_buf" +version = "0.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" dependencies = [ - "autocfg", - "libm", + "libc", ] [[package]] -name = "objc2" -version = "0.6.4" +name = "malloc_size_of_derive" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +checksum = "f44db74bde26fdf427af23f1d146c211aed857c59e3be750cf2617f6b0b05c94" dependencies = [ - "objc2-encode", + "proc-macro2", + "syn 2.0.118", + "synstructure", ] [[package]] -name = "objc2-app-kit" -version = "0.3.2" +name = "markup5ever" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +checksum = "7122d987ec5f704ee56f6e5b41a7d93722e9aae27ae07cafa4036c4d3f9757de" dependencies = [ - "bitflags 2.13.0", - "block2", - "libc", - "objc2", - "objc2-cloud-kit", - "objc2-core-data", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-core-image", - "objc2-core-text", - "objc2-core-video", - "objc2-foundation", - "objc2-quartz-core", + "log", + "tendril", + "web_atoms", ] [[package]] -name = "objc2-cloud-kit" -version = "0.3.2" +name = "matchers" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "bitflags 2.13.0", - "objc2", - "objc2-foundation", + "regex-automata 0.4.14", ] [[package]] -name = "objc2-core-data" -version = "0.3.2" +name = "maybe-rayon" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" dependencies = [ - "bitflags 2.13.0", - "objc2", - "objc2-foundation", + "cfg-if", + "rayon", ] [[package]] -name = "objc2-core-foundation" -version = "0.3.2" +name = "md-5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ - "bitflags 2.13.0", - "block2", - "dispatch2", - "libc", - "objc2", + "cfg-if", + "digest 0.10.7", ] [[package]] -name = "objc2-core-graphics" -version = "0.3.2" +name = "md-5" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +checksum = "69b6441f590336821bb897fb28fc622898ccceb1d6cea3fde5ea86b090c4de98" dependencies = [ - "bitflags 2.13.0", - "dispatch2", - "objc2", - "objc2-core-foundation", - "objc2-io-surface", + "cfg-if", + "digest 0.11.3", ] [[package]] -name = "objc2-core-image" -version = "0.3.2" +name = "memchr" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" -dependencies = [ - "objc2", - "objc2-foundation", -] +checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" [[package]] -name = "objc2-core-location" -version = "0.3.2" +name = "memmap2" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" +checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0" dependencies = [ - "objc2", - "objc2-foundation", + "libc", ] [[package]] -name = "objc2-core-text" -version = "0.3.2" +name = "memoffset" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ - "bitflags 2.13.0", - "objc2", - "objc2-core-foundation", - "objc2-core-graphics", + "autocfg", ] [[package]] -name = "objc2-core-video" -version = "0.3.2" +name = "metal" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" +checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605" dependencies = [ "bitflags 2.13.0", - "objc2", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-io-surface", + "block", + "core-graphics-types 0.2.0", + "foreign-types", + "log", + "objc", + "paste", ] [[package]] -name = "objc2-encode" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" - -[[package]] -name = "objc2-foundation" -version = "0.3.2" +name = "mimalloc" +version = "0.1.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +checksum = "2d4139bb28d14ad1facf21d5eb8825051b326e172d216b39f6d31df53cc97862" dependencies = [ - "bitflags 2.13.0", - "block2", - "libc", - "objc2", - "objc2-core-foundation", + "libmimalloc-sys", ] [[package]] -name = "objc2-io-surface" -version = "0.3.2" +name = "mime" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" -dependencies = [ - "bitflags 2.13.0", - "objc2", - "objc2-core-foundation", -] +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] -name = "objc2-quartz-core" -version = "0.3.2" +name = "mime-multipart-hyper1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +checksum = "bc819448803ee517eb413276ca59613c2850a95c4fdcd87ec82c5a6ce6cdab1a" dependencies = [ - "bitflags 2.13.0", - "objc2", - "objc2-core-foundation", - "objc2-foundation", + "buf-read-ext", + "http 1.4.2", + "httparse", + "log", + "mime", + "tempfile", + "textnonce", ] [[package]] -name = "objc2-ui-kit" -version = "0.3.2" +name = "mime_guess" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" dependencies = [ - "bitflags 2.13.0", - "block2", - "objc2", - "objc2-cloud-kit", - "objc2-core-data", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-core-image", - "objc2-core-location", - "objc2-core-text", - "objc2-foundation", - "objc2-quartz-core", - "objc2-user-notifications", + "mime", + "unicase", ] [[package]] -name = "objc2-user-notifications" -version = "0.3.2" +name = "minimal-lexical" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" -dependencies = [ - "objc2", - "objc2-foundation", -] +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] -name = "object" -version = "0.37.3" +name = "miniz_oxide" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ - "memchr", + "adler2", + "simd-adler32", ] [[package]] -name = "once_cell" -version = "1.21.4" +name = "mio" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ - "critical-section", - "portable-atomic", + "libc", + "log", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.48.0", ] [[package]] -name = "once_cell_polyfill" -version = "1.70.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" - -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - -[[package]] -name = "openssl-probe" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "option-operations" -version = "0.6.1" +name = "mio" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aca39cf52b03268400c16eeb9b56382ea3c3353409309b63f5c8f0b1faf42754" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" dependencies = [ - "pastey 0.2.3", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", ] [[package]] -name = "ordered-stream" -version = "0.2.0" +name = "ml-dsa" +version = "0.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +checksum = "ac4a46643af2001eafebcc37031fc459eb72d45057aac5d7a15b00046a2ad6db" dependencies = [ - "futures-core", - "pin-project-lite", + "const-oid 0.9.6", + "hybrid-array 0.3.1", + "num-traits", + "pkcs8 0.10.2", + "rand_core 0.6.4", + "sha3 0.10.9", + "signature 2.2.0", ] [[package]] -name = "ouroboros" -version = "0.17.2" +name = "ml-kem" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2ba07320d39dfea882faa70554b4bd342a5f273ed59ba7c1c6b4c840492c954" +checksum = "5e15f3e5b957493873e396a66914e83e616b6afe335cdef7efe5c6e1216aba66" dependencies = [ - "aliasable", - "ouroboros_macro", - "static_assertions", + "const-oid 0.10.2", + "hybrid-array 0.4.13", + "kem", + "module-lattice", + "pkcs8 0.11.0", + "rand_core 0.10.1", + "sha3 0.11.0", ] [[package]] -name = "ouroboros_macro" -version = "0.17.2" +name = "module-lattice" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec4c6225c69b4ca778c0aea097321a64c421cf4577b331c61b229267edabb6f8" +checksum = "0c61b87c9683ab7cb1c6871d261ad5479b6b10ceb52c4352aaca3b5d35a8febe" dependencies = [ - "heck 0.4.1", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.118", + "ctutils", + "hybrid-array 0.4.13", + "num-traits", ] [[package]] -name = "p256" -version = "0.13.2" +name = "moka" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +checksum = "957228ad12042ee839f93c8f257b62b4c0ab5eaae1d4fa60de53b27c9d7c5046" dependencies = [ - "ecdsa", - "elliptic-curve 0.13.8", - "primeorder", - "sha2 0.10.9", + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "equivalent", + "parking_lot", + "portable-atomic", + "smallvec", + "tagptr", + "uuid", ] [[package]] -name = "p384" -version = "0.13.1" +name = "mongocrypt" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" +checksum = "8da0cd419a51a5fb44819e290fbdb0665a54f21dead8923446a799c7f4d26ad9" dependencies = [ - "ecdsa", - "elliptic-curve 0.13.8", - "primeorder", - "sha2 0.10.9", + "bson", + "mongocrypt-sys", + "once_cell", + "serde", ] [[package]] -name = "p521" -version = "0.13.3" +name = "mongocrypt-sys" +version = "0.1.5+1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc9e2161f1f215afdfce23677034ae137bbd45016a880c2eb3ba8eb95f085b2" -dependencies = [ - "base16ct 0.2.0", - "ecdsa", - "elliptic-curve 0.13.8", - "primeorder", - "sha2 0.10.9", -] +checksum = "224484c5d09285a7b8cb0a0c117e847ebd14cb6e4470ecf68cdb89c503b0edb9" [[package]] -name = "pango" -version = "0.20.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6576b311f6df659397043a5fa8a021da8f72e34af180b44f7d57348de691ab5c" +name = "mongodb" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276ba0cd571553d1f6936c6f180964776ece6ab7507dc8765f8a9c9c49d8cd00" dependencies = [ - "gio", - "glib 0.20.12", - "libc", - "pango-sys", + "base64 0.22.1", + "bitflags 2.13.0", + "bson", + "derive-where", + "derive_more", + "futures-core", + "futures-io", + "futures-util", + "hex", + "hickory-net", + "hickory-proto", + "hickory-resolver", + "hmac 0.12.1", + "macro_magic", + "md-5 0.10.6", + "mongocrypt", + "mongodb-internal-macros", + "pbkdf2 0.12.2", + "percent-encoding", + "rand 0.9.4", + "rustc_version_runtime", + "rustls", + "serde", + "serde_bytes", + "serde_with", + "sha1 0.10.6", + "sha2 0.10.9", + "socket2 0.6.4", + "stringprep", + "strsim", + "take_mut", + "thiserror 2.0.18", + "tokio", + "tokio-rustls", + "tokio-util", + "typed-builder", + "uuid", + "webpki-roots 1.0.8", ] [[package]] -name = "pango-sys" -version = "0.20.10" +name = "mongodb-internal-macros" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "186909673fc09be354555c302c0b3dcf753cd9fa08dcb8077fa663c80fb243fa" +checksum = "99ceb1a9a1018e470077ec94cf3a8c2d0e6da542b2c05ea95a59a0a627147375" dependencies = [ - "glib-sys 0.20.10", - "gobject-sys 0.20.10", - "libc", - "system-deps", + "macro_magic", + "proc-macro2", + "quote", + "syn 2.0.118", ] [[package]] -name = "parking" -version = "2.2.1" +name = "moxcms" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" +dependencies = [ + "num-traits", + "pxfm", +] [[package]] -name = "parking_lot" -version = "0.12.5" +name = "mozangle" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +checksum = "298bc7f83d5cca3789e47779e92cda492b75f11e03995bf558475bd9df2f639b" dependencies = [ - "lock_api", - "parking_lot_core", + "bindgen", + "cc", + "walkdir", ] [[package]] -name = "parking_lot_core" -version = "0.9.12" +name = "mozjs" +version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +checksum = "226edc79aa3f990a61330d4011471910273f6ee6bbfd0dcb93b18f5a03505f6b" dependencies = [ - "cfg-if", + "bindgen", + "cc", + "encoding_rs", "libc", - "redox_syscall", - "smallvec", - "windows-link", + "log", + "mozjs_sys", + "num-traits", ] [[package]] -name = "password-hash" -version = "0.5.0" +name = "mozjs_sys" +version = "0.140.8-2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" +checksum = "4b50224a02c96e1e703f7d055377431333dfc5cd3a09ccf03f8a2c8a156c7af8" dependencies = [ - "base64ct", - "rand_core 0.6.4", - "subtle", + "bindgen", + "cc", + "encoding_c", + "encoding_c_mem", + "flate2", + "icu_capi", + "libc", + "libz-sys", + "tar", + "walkdir", ] [[package]] -name = "paste" -version = "1.0.15" +name = "mpris-server" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +checksum = "70cf358e9a9516cc35ed40eebd56cbe80f5190a7a2b3cd0c2d358c86b879132b" +dependencies = [ + "async-channel", + "futures-channel", + "serde", + "trait-variant", + "zbus", +] [[package]] -name = "pastey" -version = "0.1.1" +name = "muldiv" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" +checksum = "956787520e75e9bd233246045d19f42fb73242759cc57fba9611d940ae96d4b0" [[package]] -name = "pastey" -version = "0.2.3" +name = "mutate_once" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ee67f1008b1ba2321834326597b8e186293b049a023cdef258527550b9935b4" +checksum = "13d2233c9842d08cfe13f9eac96e207ca6a2ea10b80259ebe8ad0268be27d2af" [[package]] -name = "pathfinder_geometry" -version = "0.5.1" +name = "naga" +version = "26.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b7e7b4ea703700ce73ebf128e1450eb69c3a8329199ffbfb9b2a0418e5ad3" +checksum = "916cbc7cb27db60be930a4e2da243cf4bc39569195f22fd8ee419cd31d5b662c" dependencies = [ + "arrayvec", + "bit-set", + "bitflags 2.13.0", + "cfg-if", + "cfg_aliases", + "codespan-reporting", + "half", + "hashbrown 0.15.5", + "hexf-parse", + "indexmap", + "libm", "log", - "pathfinder_simd", + "num-traits", + "once_cell", + "rustc-hash 1.1.0", + "spirv", + "thiserror 2.0.18", + "unicode-ident", ] [[package]] -name = "pathfinder_simd" -version = "0.5.6" +name = "nanoid" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4500030c302e4af1d423f36f3b958d1aecb6c04184356ed5a833bf6b60435777" +checksum = "8628de41fe064cc3f0cf07f3d299ee3e73521adaff72278731d5c8cae3797873" dependencies = [ - "rustc_version", + "rand 0.9.4", ] [[package]] -name = "pbkdf2" -version = "0.12.2" +name = "ndk-context" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" -dependencies = [ - "digest 0.10.7", - "hmac 0.12.1", -] +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" [[package]] -name = "pbkdf2" -version = "0.13.0" +name = "ndk-sys" +version = "0.6.0+11769913" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112d82ceb8c5bf524d9af484d4e4970c9fd5a0cc15ba14ad93dccd28873b0629" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" dependencies = [ - "digest 0.11.3", - "hmac 0.13.0", + "jni-sys 0.3.1", ] [[package]] -name = "pem" -version = "3.0.6" +name = "new_debug_unreachable" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" -dependencies = [ - "base64", - "serde_core", -] +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] -name = "pem-rfc7468" -version = "0.7.0" +name = "no_std_io2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +checksum = "418abd1b6d34fbf6cae440dc874771b0525a604428704c76e48b29a5e67b8003" dependencies = [ - "base64ct", + "memchr", ] [[package]] -name = "percent-encoding" -version = "2.3.2" +name = "nom" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "perry" -version = "0.5.1208" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ - "anyhow", - "base64", - "chrono", - "clap", - "console 0.16.3", - "dialoguer 0.12.0", - "dirs", - "dotenvy", - "ed25519-dalek", - "env_logger", - "flate2", - "fslock", - "futures-util", - "hex", - "indicatif", - "jsonwebtoken", - "log", - "notify", - "perry-api-manifest", - "perry-codegen", - "perry-codegen-arkts", - "perry-codegen-glance", - "perry-codegen-js", - "perry-codegen-swiftui", - "perry-codegen-wasm", - "perry-codegen-wear-tiles", - "perry-diagnostics", - "perry-hir", - "perry-parser", - "perry-runtime", - "perry-transform", - "perry-types", - "rand 0.9.4", - "rayon", - "regex", - "reqwest", - "semver", - "serde", - "serde_json", - "sha2 0.11.0", - "swc_common", - "swc_ecma_ast", - "tar", - "tempfile", - "tokio", - "tokio-tungstenite", - "toml", - "url", - "walkdir", - "zip", - "zstd", + "memchr", + "minimal-lexical", ] [[package]] -name = "perry-api-manifest" -version = "0.5.1208" +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" dependencies = [ - "serde", + "memchr", ] [[package]] -name = "perry-audio-miniaudio" -version = "0.5.1208" +name = "nom-language" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2de2bc5b451bfedaef92c90b8939a8fff5770bdcc1fafd6239d086aab8fa6b29" dependencies = [ - "cc", - "libc", + "nom 8.0.0", ] [[package]] -name = "perry-codegen" -version = "0.5.1208" +name = "nom-rfc8288" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaf26c6675a34266d3d71137fc5d876adb5e3d74963181397fd39742a8341576" dependencies = [ - "anyhow", - "log", - "perry-api-manifest", - "perry-dispatch", - "perry-hir", - "perry-types", - "serde", - "serde_json", - "thiserror 1.0.69", + "itertools 0.14.0", + "nom 8.0.0", + "nom-language", + "thiserror 2.0.18", ] [[package]] -name = "perry-codegen-arkts" -version = "0.5.1208" +name = "nom_locate" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b577e2d69827c4740cba2b52efaad1c4cc7c73042860b199710b3575c68438d" dependencies = [ - "anyhow", - "perry-hir", - "perry-types", + "bytecount", + "memchr", + "nom 8.0.0", ] [[package]] -name = "perry-codegen-glance" -version = "0.5.1208" -dependencies = [ - "anyhow", - "perry-hir", -] +name = "nonzero_ext" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21" [[package]] -name = "perry-codegen-js" -version = "0.5.1208" -dependencies = [ - "anyhow", - "perry-dispatch", - "perry-hir", - "perry-types", -] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" [[package]] -name = "perry-codegen-swiftui" -version = "0.5.1208" +name = "notify" +version = "6.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" dependencies = [ - "anyhow", - "perry-hir", - "perry-types", + "bitflags 2.13.0", + "crossbeam-channel", + "filetime", + "fsevent-sys", + "inotify", + "kqueue", + "libc", + "log", + "mio 0.8.11", + "walkdir", + "windows-sys 0.48.0", ] [[package]] -name = "perry-codegen-wasm" -version = "0.5.1208" +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "anyhow", - "base64", - "perry-codegen-js", - "perry-dispatch", - "perry-hir", - "perry-types", - "wasm-encoder", + "windows-sys 0.61.2", ] [[package]] -name = "perry-codegen-wear-tiles" -version = "0.5.1208" +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "anyhow", - "perry-hir", + "num-integer", + "num-traits", + "serde", ] [[package]] -name = "perry-container-compose" -version = "0.5.1208" +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" dependencies = [ - "anyhow", - "async-trait", - "atty", - "clap", - "console 0.15.11", - "dashmap", - "dialoguer 0.11.0", - "dotenvy", - "hex", - "indexmap", - "md-5 0.11.0", - "once_cell", - "proptest", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", "rand 0.8.6", - "regex", "serde", - "serde_json", - "serde_yaml", - "thiserror 1.0.69", - "tokio", - "tracing", - "tracing-subscriber", - "which", -] - -[[package]] -name = "perry-container-e2e" -version = "0.5.1208" -dependencies = [ - "anyhow", + "smallvec", + "zeroize", ] [[package]] -name = "perry-diagnostics" -version = "0.5.1208" +name = "num-complex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" dependencies = [ - "serde", - "serde_json", + "autocfg", + "num-traits", ] [[package]] -name = "perry-dispatch" -version = "0.5.1208" +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] -name = "perry-doc-fixture-my-bindings" -version = "0.1.0" +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ - "perry-ffi", + "proc-macro2", + "quote", + "syn 2.0.118", ] [[package]] -name = "perry-doc-tests" -version = "0.5.1208" +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "anyhow", - "clap", - "dssim-core", - "image", - "rgb", - "serde", - "serde_json", - "tempfile", - "walkdir", + "num-traits", ] [[package]] -name = "perry-ext-ads" -version = "0.5.1208" +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ - "block2", - "objc2", - "objc2-foundation", - "perry-ffi", + "autocfg", + "num-integer", + "num-traits", ] [[package]] -name = "perry-ext-argon2" -version = "0.5.1208" +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "argon2", - "perry-ffi", + "num-bigint", + "num-integer", + "num-traits", ] [[package]] -name = "perry-ext-axios" -version = "0.5.1208" +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ - "perry-ffi", - "reqwest", - "tokio", + "autocfg", + "libm", ] [[package]] -name = "perry-ext-bcrypt" -version = "0.5.1208" +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ - "bcrypt", - "perry-ffi", + "hermit-abi 0.5.2", + "libc", ] [[package]] -name = "perry-ext-better-sqlite3" -version = "0.5.1208" +name = "num_threads" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" dependencies = [ - "perry-ffi", - "rusqlite", + "libc", ] [[package]] -name = "perry-ext-cheerio" -version = "0.5.1208" +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ - "perry-ffi", - "scraper", + "malloc_buf", ] [[package]] -name = "perry-ext-commander" -version = "0.5.1208" +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" dependencies = [ - "perry-ffi", - "perry-runtime", + "objc2-encode", ] [[package]] -name = "perry-ext-cron" -version = "0.5.1208" +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ - "chrono", - "cron", - "perry-ffi", - "perry-runtime", + "bitflags 2.13.0", + "block2", + "libc", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-text", + "objc2-core-video", + "objc2-foundation", + "objc2-quartz-core", ] [[package]] -name = "perry-ext-dayjs" -version = "0.5.1208" +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" dependencies = [ - "chrono", - "perry-ffi", + "bitflags 2.13.0", + "objc2", + "objc2-foundation", ] [[package]] -name = "perry-ext-decimal" -version = "0.5.1208" +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" dependencies = [ - "perry-ffi", - "rust_decimal", + "bitflags 2.13.0", + "objc2", + "objc2-foundation", ] [[package]] -name = "perry-ext-dotenv" -version = "0.5.1208" +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "perry-ffi", - "serde_json", + "bitflags 2.13.0", + "block2", + "dispatch2", + "libc", + "objc2", ] [[package]] -name = "perry-ext-ethers" -version = "0.5.1208" +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "perry-ffi", - "rand 0.8.6", + "bitflags 2.13.0", + "block2", + "dispatch2", + "libc", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", + "objc2-metal", ] [[package]] -name = "perry-ext-events" -version = "0.5.1208" +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" dependencies = [ - "perry-ffi", - "perry-runtime", + "objc2", + "objc2-foundation", ] [[package]] -name = "perry-ext-exponential-backoff" -version = "0.5.1208" +name = "objc2-core-location" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" dependencies = [ - "perry-ffi", + "objc2", + "objc2-foundation", ] [[package]] -name = "perry-ext-fastify" -version = "0.5.1208" +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "lazy_static", - "perry-ext-ws", - "perry-ffi", - "perry-runtime", - "serde_json", - "socket2", - "tokio", - "tokio-tungstenite", + "bitflags 2.13.0", + "block2", + "libc", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", ] [[package]] -name = "perry-ext-fetch" -version = "0.5.1208" +name = "objc2-core-video" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" dependencies = [ - "bytes", - "lazy_static", - "perry-ffi", - "perry-runtime", - "reqwest", - "serde_json", - "tokio", + "bitflags 2.13.0", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-io-surface", ] [[package]] -name = "perry-ext-http" -version = "0.5.1208" +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bytes", - "lazy_static", - "perry-ext-http-server", - "perry-ffi", - "perry-runtime", - "reqwest", - "serde_json", - "tokio", + "bitflags 2.13.0", + "block2", + "libc", + "objc2", + "objc2-core-foundation", ] [[package]] -name = "perry-ext-http-server" -version = "0.5.1208" +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" dependencies = [ - "bytes", - "h2", - "http-body-util", - "hyper", - "hyper-util", - "lazy_static", - "perry-ext-net", - "perry-ext-ws", - "perry-ffi", - "perry-runtime", - "rustls", - "rustls-pemfile", - "serde_json", - "socket2", - "tokio", - "tokio-rustls", - "tokio-tungstenite", + "bitflags 2.13.0", + "libc", + "objc2", + "objc2-core-foundation", ] [[package]] -name = "perry-ext-ioredis" -version = "0.5.1208" +name = "objc2-metal" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794" dependencies = [ - "lazy_static", - "perry-ffi", - "redis", - "tokio", + "bitflags 2.13.0", + "objc2", + "objc2-foundation", ] [[package]] -name = "perry-ext-jsonwebtoken" -version = "0.5.1208" +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" dependencies = [ - "base64", - "jsonwebtoken", - "perry-ffi", - "serde", - "serde_json", + "bitflags 2.13.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", ] [[package]] -name = "perry-ext-lru-cache" -version = "0.5.1208" +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" dependencies = [ - "lru", - "perry-ffi", + "bitflags 2.13.0", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-location", + "objc2-core-text", + "objc2-foundation", + "objc2-quartz-core", + "objc2-user-notifications", ] [[package]] -name = "perry-ext-moment" -version = "0.5.1208" +name = "objc2-user-notifications" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" dependencies = [ - "chrono", - "perry-ffi", + "objc2", + "objc2-foundation", ] [[package]] -name = "perry-ext-mongodb" -version = "0.5.1208" +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ - "bson", - "futures-util", - "mongodb", - "perry-ffi", - "serde_json", - "tokio", + "memchr", ] [[package]] -name = "perry-ext-mysql2" -version = "0.5.1208" +name = "ocb3" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c196e0276c471c843dd5777e7543a36a298a4be942a2a688d8111cd43390dedb" dependencies = [ - "chrono", - "perry-ffi", - "sqlx", - "tokio", + "aead", + "cipher 0.4.4", + "ctr", + "subtle", ] [[package]] -name = "perry-ext-nanoid" -version = "0.5.1208" -dependencies = [ - "nanoid", - "perry-ffi", - "rand 0.9.4", +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" +dependencies = [ + "critical-section", + "portable-atomic", ] [[package]] -name = "perry-ext-net" -version = "0.5.1208" -dependencies = [ - "bytes", - "perry-ffi", - "perry-runtime", - "rustls", - "rustls-native-certs", - "tokio", - "tokio-rustls", -] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] -name = "perry-ext-nodemailer" -version = "0.5.1208" -dependencies = [ - "lettre", - "perry-ffi", - "tokio", - "uuid", -] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] -name = "perry-ext-pdf" -version = "0.5.1208" -dependencies = [ - "perry-ffi", - "printpdf", -] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] -name = "perry-ext-pg" -version = "0.5.1208" +name = "openxr" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40adeaa3219baa4412a522742eeee152656763008a39c68a50fd3027fe37625e" dependencies = [ - "perry-ffi", - "sqlx", - "tokio", + "libc", + "libloading", + "ndk-context", + "openxr-sys", ] [[package]] -name = "perry-ext-ratelimit" -version = "0.5.1208" +name = "openxr-sys" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8b94052f57756896c60b504769568fc538808210e77190b69c69b467ee7eaaf" dependencies = [ - "governor", - "perry-ffi", + "libc", ] [[package]] -name = "perry-ext-sharp" -version = "0.5.1208" -dependencies = [ - "fast_image_resize", - "image", - "kamadak-exif", - "perry-ffi", -] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] -name = "perry-ext-slugify" -version = "0.5.1208" +name = "option-operations" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aca39cf52b03268400c16eeb9b56382ea3c3353409309b63f5c8f0b1faf42754" dependencies = [ - "perry-ffi", + "pastey 0.2.3", ] [[package]] -name = "perry-ext-streams" -version = "0.5.1208" +name = "ordered-float" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2c1f9f56e534ac6a9b8a4600bdf0f530fb393b5f393e7b4d03489c3cf0c3f01" dependencies = [ - "lazy_static", - "perry-ffi", - "perry-runtime", + "num-traits", ] [[package]] -name = "perry-ext-uuid" -version = "0.5.1208" +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" dependencies = [ - "perry-ffi", - "uuid", + "futures-core", + "pin-project-lite", ] [[package]] -name = "perry-ext-validator" -version = "0.5.1208" +name = "ordermap" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a86ed3f5f244b372d6b1a00b72ef7f8876d0bc6a78a4c9985c53614041512063" + +[[package]] +name = "ouroboros" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2ba07320d39dfea882faa70554b4bd342a5f273ed59ba7c1c6b4c840492c954" dependencies = [ - "perry-ffi", - "regex", - "serde_json", - "validator", + "aliasable", + "ouroboros_macro", + "static_assertions", ] [[package]] -name = "perry-ext-ws" -version = "0.5.1208" +name = "ouroboros_macro" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec4c6225c69b4ca778c0aea097321a64c421cf4577b331c61b229267edabb6f8" dependencies = [ - "futures-util", - "lazy_static", - "perry-ffi", - "perry-runtime", - "tokio", - "tokio-tungstenite", + "heck 0.4.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.118", ] [[package]] -name = "perry-ext-zlib" -version = "0.5.1208" +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" dependencies = [ - "brotli", - "flate2", - "perry-ffi", + "ecdsa", + "elliptic-curve 0.13.8", + "primeorder", + "sha2 0.10.9", ] [[package]] -name = "perry-ffi" -version = "0.5.1208" +name = "p384" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" dependencies = [ - "dashmap", - "once_cell", - "perry-runtime", + "ecdsa", + "elliptic-curve 0.13.8", + "primeorder", + "sha2 0.10.9", ] [[package]] -name = "perry-hir" -version = "0.5.1208" +name = "p521" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc9e2161f1f215afdfce23677034ae137bbd45016a880c2eb3ba8eb95f085b2" dependencies = [ - "anyhow", - "perry-api-manifest", - "perry-diagnostics", - "perry-parser", - "perry-types", - "perry-ui-model", - "serde", - "serde_json", - "stacker", - "swc_common", - "swc_ecma_ast", - "thiserror 1.0.69", + "base16ct 0.2.0", + "ecdsa", + "elliptic-curve 0.13.8", + "primeorder", + "rand_core 0.6.4", + "sha2 0.10.9", ] [[package]] -name = "perry-parser" -version = "0.5.1208" +name = "pango" +version = "0.20.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6576b311f6df659397043a5fa8a021da8f72e34af180b44f7d57348de691ab5c" dependencies = [ - "anyhow", - "perry-diagnostics", - "swc_common", - "swc_ecma_ast", - "swc_ecma_parser", - "thiserror 1.0.69", + "gio", + "glib 0.20.12", + "libc", + "pango-sys", ] [[package]] -name = "perry-runtime" -version = "0.5.1208" +name = "pango-sys" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186909673fc09be354555c302c0b3dcf753cd9fa08dcb8077fa663c80fb243fa" dependencies = [ - "anyhow", - "base64", - "dirs", - "fancy-regex", - "hickory-proto", - "hostname", - "icu_locale_core", - "idna", - "itoa", - "lazy_static", + "glib-sys 0.20.10", + "gobject-sys 0.20.10", "libc", - "mach2", - "mimalloc", - "perry-dispatch", - "rand 0.8.6", - "regex", - "resolv-conf", - "ryu", - "serde_json", - "socket2", - "taffy", - "temporal_rs", - "thiserror 1.0.69", - "unicode-normalization", - "unicode-segmentation", - "url", - "windows-sys 0.61.2", + "system-deps", ] [[package]] -name = "perry-runtime-static" -version = "0.5.1208" +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ - "perry-runtime", + "lock_api", + "parking_lot_core", ] [[package]] -name = "perry-stdlib" -version = "0.5.1208" +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "password-hash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pastey" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" + +[[package]] +name = "pastey" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ee67f1008b1ba2321834326597b8e186293b049a023cdef258527550b9935b4" + +[[package]] +name = "pathfinder_geometry" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b7e7b4ea703700ce73ebf128e1450eb69c3a8329199ffbfb9b2a0418e5ad3" +dependencies = [ + "log", + "pathfinder_simd", +] + +[[package]] +name = "pathfinder_simd" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4500030c302e4af1d423f36f3b958d1aecb6c04184356ed5a833bf6b60435777" +dependencies = [ + "rustc_version", +] + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest 0.10.7", + "hmac 0.12.1", +] + +[[package]] +name = "pbkdf2" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112d82ceb8c5bf524d9af484d4e4970c9fd5a0cc15ba14ad93dccd28873b0629" +dependencies = [ + "digest 0.11.3", + "hmac 0.13.0", +] + +[[package]] +name = "peek-poke" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef60922033e31835f6cf98b9b81b58368037b71d2a81928985cd9d0b3b3171fb" +dependencies = [ + "euclid", + "peek-poke-derive", +] + +[[package]] +name = "peek-poke-derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271f78bae1e699b58c180a384a2e8d78ccbb60b853e15db92339725f3a2764d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", + "synstructure", +] + +[[package]] +name = "pem" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" +dependencies = [ + "base64 0.22.1", + "serde_core", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "peniko" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3c76095c9a636173600478e0373218c7b955335048c2bcd12dc6a79657649d8" +dependencies = [ + "bytemuck", + "color", + "kurbo 0.12.0", + "linebender_resource_handle", + "smallvec", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "perry" +version = "0.5.1208" dependencies = [ - "aes 0.8.4", - "aes-gcm", - "aes-kw", "anyhow", - "argon2", - "base64", - "bcrypt", - "brotli", - "bson", - "bytes", - "cbc", - "chacha20poly1305", + "base64 0.22.1", "chrono", "clap", - "cron", - "ctr", - "dashmap", - "ecb", + "console 0.16.3", + "dialoguer 0.12.0", + "dirs", + "dotenvy", "ed25519-dalek", - "ed448-goldilocks", + "env_logger 0.10.2", "flate2", + "fslock", "futures-util", - "ghash", - "governor", "hex", - "hkdf 0.13.0", - "hmac 0.13.0", - "http-body-util", - "hyper", - "hyper-util", - "image", - "itoa", + "indicatif", "jsonwebtoken", - "lazy_static", - "lettre", - "libc", - "lru", - "md-5 0.11.0", - "ml-kem", - "mongodb", - "nanoid", - "once_cell", - "p256", - "p384", - "p521", - "pbkdf2 0.13.0", - "perry-container-compose", + "log", + "notify", + "perry-api-manifest", + "perry-codegen", + "perry-codegen-arkts", + "perry-codegen-glance", + "perry-codegen-js", + "perry-codegen-swiftui", + "perry-codegen-wasm", + "perry-codegen-wear-tiles", + "perry-diagnostics", + "perry-hir", + "perry-parser", "perry-runtime", - "perry-updater", - "proptest", - "rand 0.8.6", - "redis", + "perry-transform", + "perry-types", + "rand 0.9.4", + "rayon", "regex", "reqwest", - "rsa", - "rusqlite", - "rust_decimal", - "rustls", - "rustls-native-certs", - "rustls-pemfile", - "ryu", - "scraper", - "scrypt", + "semver", "serde", "serde_json", - "serde_yaml", - "sha1 0.10.6", - "sha1 0.11.0", "sha2 0.11.0", - "sha3 0.10.9", - "sha3 0.11.0", - "sha3-utils", - "spki 0.7.3", - "sqlx", - "thiserror 1.0.69", + "swc_common", + "swc_ecma_ast", + "tar", + "tempfile", "tokio", - "tokio-cron-scheduler", - "tokio-rustls", "tokio-tungstenite", - "uuid", - "validator", - "windows-sys 0.61.2", - "x25519-dalek", - "x448", - "x509-cert", + "toml", + "url", + "walkdir", + "zip", "zstd", ] [[package]] -name = "perry-stdlib-static" -version = "0.5.1208" +name = "perry-api-manifest" +version = "0.5.1208" +dependencies = [ + "serde", +] + +[[package]] +name = "perry-audio-miniaudio" +version = "0.5.1208" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "perry-codegen" +version = "0.5.1208" +dependencies = [ + "anyhow", + "log", + "perry-api-manifest", + "perry-dispatch", + "perry-hir", + "perry-types", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "perry-codegen-arkts" +version = "0.5.1208" +dependencies = [ + "anyhow", + "perry-hir", + "perry-types", +] + +[[package]] +name = "perry-codegen-glance" +version = "0.5.1208" +dependencies = [ + "anyhow", + "perry-hir", +] + +[[package]] +name = "perry-codegen-js" +version = "0.5.1208" +dependencies = [ + "anyhow", + "perry-dispatch", + "perry-hir", + "perry-types", +] + +[[package]] +name = "perry-codegen-swiftui" +version = "0.5.1208" +dependencies = [ + "anyhow", + "perry-hir", + "perry-types", +] + +[[package]] +name = "perry-codegen-wasm" +version = "0.5.1208" +dependencies = [ + "anyhow", + "base64 0.22.1", + "perry-codegen-js", + "perry-dispatch", + "perry-hir", + "perry-types", + "wasm-encoder", +] + +[[package]] +name = "perry-codegen-wear-tiles" +version = "0.5.1208" +dependencies = [ + "anyhow", + "perry-hir", +] + +[[package]] +name = "perry-container-compose" +version = "0.5.1208" +dependencies = [ + "anyhow", + "async-trait", + "atty", + "clap", + "console 0.15.11", + "dashmap", + "dialoguer 0.11.0", + "dotenvy", + "hex", + "indexmap", + "md-5 0.11.0", + "once_cell", + "proptest", + "rand 0.8.6", + "regex", + "serde", + "serde_json", + "serde_yaml", + "thiserror 1.0.69", + "tokio", + "tracing", + "tracing-subscriber", + "which", +] + +[[package]] +name = "perry-container-e2e" +version = "0.5.1208" +dependencies = [ + "anyhow", +] + +[[package]] +name = "perry-diagnostics" +version = "0.5.1208" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "perry-dispatch" +version = "0.5.1208" + +[[package]] +name = "perry-doc-fixture-my-bindings" +version = "0.1.0" +dependencies = [ + "perry-ffi", +] + +[[package]] +name = "perry-doc-tests" +version = "0.5.1208" +dependencies = [ + "anyhow", + "clap", + "dssim-core", + "image", + "rgb", + "serde", + "serde_json", + "tempfile", + "walkdir", +] + +[[package]] +name = "perry-ext-ads" +version = "0.5.1208" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", + "perry-ffi", +] + +[[package]] +name = "perry-ext-argon2" +version = "0.5.1208" +dependencies = [ + "argon2", + "perry-ffi", +] + +[[package]] +name = "perry-ext-axios" +version = "0.5.1208" +dependencies = [ + "perry-ffi", + "reqwest", + "tokio", +] + +[[package]] +name = "perry-ext-bcrypt" +version = "0.5.1208" +dependencies = [ + "bcrypt", + "perry-ffi", +] + +[[package]] +name = "perry-ext-better-sqlite3" +version = "0.5.1208" +dependencies = [ + "perry-ffi", + "rusqlite", +] + +[[package]] +name = "perry-ext-cheerio" +version = "0.5.1208" +dependencies = [ + "perry-ffi", + "scraper", +] + +[[package]] +name = "perry-ext-commander" +version = "0.5.1208" +dependencies = [ + "perry-ffi", + "perry-runtime", +] + +[[package]] +name = "perry-ext-cron" +version = "0.5.1208" +dependencies = [ + "chrono", + "cron", + "perry-ffi", + "perry-runtime", +] + +[[package]] +name = "perry-ext-dayjs" +version = "0.5.1208" +dependencies = [ + "chrono", + "perry-ffi", +] + +[[package]] +name = "perry-ext-decimal" +version = "0.5.1208" +dependencies = [ + "perry-ffi", + "rust_decimal", +] + +[[package]] +name = "perry-ext-dotenv" +version = "0.5.1208" +dependencies = [ + "perry-ffi", + "serde_json", +] + +[[package]] +name = "perry-ext-ethers" +version = "0.5.1208" +dependencies = [ + "perry-ffi", + "rand 0.8.6", +] + +[[package]] +name = "perry-ext-events" +version = "0.5.1208" +dependencies = [ + "perry-ffi", + "perry-runtime", +] + +[[package]] +name = "perry-ext-exponential-backoff" +version = "0.5.1208" +dependencies = [ + "perry-ffi", +] + +[[package]] +name = "perry-ext-fastify" +version = "0.5.1208" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.10.1", + "hyper-util", + "lazy_static", + "perry-ext-ws", + "perry-ffi", + "perry-runtime", + "serde_json", + "socket2 0.6.4", + "tokio", + "tokio-tungstenite", +] + +[[package]] +name = "perry-ext-fetch" +version = "0.5.1208" +dependencies = [ + "bytes", + "lazy_static", + "perry-ffi", + "perry-runtime", + "reqwest", + "serde_json", + "tokio", +] + +[[package]] +name = "perry-ext-http" +version = "0.5.1208" +dependencies = [ + "bytes", + "lazy_static", + "perry-ext-http-server", + "perry-ffi", + "perry-runtime", + "reqwest", + "serde_json", + "tokio", +] + +[[package]] +name = "perry-ext-http-server" +version = "0.5.1208" +dependencies = [ + "bytes", + "h2 0.4.15", + "http-body-util", + "hyper 1.10.1", + "hyper-util", + "lazy_static", + "perry-ext-net", + "perry-ext-ws", + "perry-ffi", + "perry-runtime", + "rustls", + "rustls-pemfile", + "serde_json", + "socket2 0.6.4", + "tokio", + "tokio-rustls", + "tokio-tungstenite", +] + +[[package]] +name = "perry-ext-ioredis" +version = "0.5.1208" +dependencies = [ + "lazy_static", + "perry-ffi", + "redis", + "tokio", +] + +[[package]] +name = "perry-ext-jsonwebtoken" +version = "0.5.1208" +dependencies = [ + "base64 0.22.1", + "jsonwebtoken", + "perry-ffi", + "serde", + "serde_json", +] + +[[package]] +name = "perry-ext-lru-cache" +version = "0.5.1208" +dependencies = [ + "lru", + "perry-ffi", +] + +[[package]] +name = "perry-ext-moment" +version = "0.5.1208" +dependencies = [ + "chrono", + "perry-ffi", +] + +[[package]] +name = "perry-ext-mongodb" +version = "0.5.1208" +dependencies = [ + "bson", + "futures-util", + "mongodb", + "perry-ffi", + "serde_json", + "tokio", +] + +[[package]] +name = "perry-ext-mysql2" +version = "0.5.1208" +dependencies = [ + "chrono", + "perry-ffi", + "sqlx", + "tokio", +] + +[[package]] +name = "perry-ext-nanoid" +version = "0.5.1208" +dependencies = [ + "nanoid", + "perry-ffi", + "rand 0.9.4", +] + +[[package]] +name = "perry-ext-net" +version = "0.5.1208" +dependencies = [ + "bytes", + "perry-ffi", + "perry-runtime", + "rustls", + "rustls-native-certs", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "perry-ext-nodemailer" +version = "0.5.1208" +dependencies = [ + "lettre", + "perry-ffi", + "tokio", + "uuid", +] + +[[package]] +name = "perry-ext-pdf" +version = "0.5.1208" +dependencies = [ + "perry-ffi", + "printpdf", +] + +[[package]] +name = "perry-ext-pg" +version = "0.5.1208" +dependencies = [ + "perry-ffi", + "sqlx", + "tokio", +] + +[[package]] +name = "perry-ext-ratelimit" +version = "0.5.1208" +dependencies = [ + "governor", + "perry-ffi", +] + +[[package]] +name = "perry-ext-sharp" +version = "0.5.1208" +dependencies = [ + "fast_image_resize", + "image", + "kamadak-exif", + "perry-ffi", +] + +[[package]] +name = "perry-ext-slugify" +version = "0.5.1208" +dependencies = [ + "perry-ffi", +] + +[[package]] +name = "perry-ext-streams" +version = "0.5.1208" +dependencies = [ + "lazy_static", + "perry-ffi", + "perry-runtime", +] + +[[package]] +name = "perry-ext-uuid" +version = "0.5.1208" +dependencies = [ + "perry-ffi", + "uuid", +] + +[[package]] +name = "perry-ext-validator" +version = "0.5.1208" +dependencies = [ + "perry-ffi", + "regex", + "serde_json", + "validator", +] + +[[package]] +name = "perry-ext-ws" +version = "0.5.1208" +dependencies = [ + "futures-util", + "lazy_static", + "perry-ffi", + "perry-runtime", + "tokio", + "tokio-tungstenite", +] + +[[package]] +name = "perry-ext-zlib" +version = "0.5.1208" +dependencies = [ + "brotli", + "flate2", + "perry-ffi", +] + +[[package]] +name = "perry-ffi" +version = "0.5.1208" +dependencies = [ + "dashmap", + "once_cell", + "perry-runtime", +] + +[[package]] +name = "perry-hir" +version = "0.5.1208" +dependencies = [ + "anyhow", + "perry-api-manifest", + "perry-diagnostics", + "perry-parser", + "perry-types", + "perry-ui-model", + "serde", + "serde_json", + "stacker", + "swc_common", + "swc_ecma_ast", + "thiserror 1.0.69", +] + +[[package]] +name = "perry-parser" +version = "0.5.1208" +dependencies = [ + "anyhow", + "perry-diagnostics", + "swc_common", + "swc_ecma_ast", + "swc_ecma_parser", + "thiserror 1.0.69", +] + +[[package]] +name = "perry-runtime" +version = "0.5.1208" +dependencies = [ + "anyhow", + "base64 0.22.1", + "dirs", + "fancy-regex", + "hickory-proto", + "hostname", + "icu_locale_core", + "idna", + "itoa", + "lazy_static", + "libc", + "mach2", + "mimalloc", + "perry-dispatch", + "rand 0.8.6", + "regex", + "resolv-conf", + "ryu", + "serde_json", + "socket2 0.6.4", + "taffy 0.7.7", + "temporal_rs", + "thiserror 1.0.69", + "unicode-normalization", + "unicode-segmentation", + "url", + "windows-sys 0.61.2", +] + +[[package]] +name = "perry-runtime-static" +version = "0.5.1208" +dependencies = [ + "perry-runtime", +] + +[[package]] +name = "perry-stdlib" +version = "0.5.1208" +dependencies = [ + "aes 0.8.4", + "aes-gcm", + "aes-kw 0.3.1", + "anyhow", + "argon2", + "base64 0.22.1", + "bcrypt", + "brotli", + "bson", + "bytes", + "cbc", + "chacha20poly1305", + "chrono", + "clap", + "cron", + "ctr", + "dashmap", + "ecb", + "ed25519-dalek", + "ed448-goldilocks", + "flate2", + "futures-util", + "ghash", + "governor", + "hex", + "hkdf 0.13.0", + "hmac 0.13.0", + "http-body-util", + "hyper 1.10.1", + "hyper-util", + "image", + "itoa", + "jsonwebtoken", + "lazy_static", + "lettre", + "libc", + "lru", + "md-5 0.11.0", + "ml-kem", + "mongodb", + "nanoid", + "once_cell", + "p256", + "p384", + "p521", + "pbkdf2 0.13.0", + "perry-container-compose", + "perry-runtime", + "perry-updater", + "proptest", + "rand 0.8.6", + "redis", + "regex", + "reqwest", + "rsa", + "rusqlite", + "rust_decimal", + "rustls", + "rustls-native-certs", + "rustls-pemfile", + "ryu", + "scraper", + "scrypt", + "serde", + "serde_json", + "serde_yaml", + "sha1 0.10.6", + "sha1 0.11.0", + "sha2 0.11.0", + "sha3 0.10.9", + "sha3 0.11.0", + "sha3-utils", + "spki 0.7.3", + "sqlx", + "thiserror 1.0.69", + "tokio", + "tokio-cron-scheduler", + "tokio-rustls", + "tokio-tungstenite", + "uuid", + "validator", + "windows-sys 0.61.2", + "x25519-dalek", + "x448", + "x509-cert", + "zstd", +] + +[[package]] +name = "perry-stdlib-static" +version = "0.5.1208" +dependencies = [ + "perry-stdlib", +] + +[[package]] +name = "perry-transform" +version = "0.5.1208" +dependencies = [ + "anyhow", + "perry-hir", + "perry-types", + "thiserror 1.0.69", +] + +[[package]] +name = "perry-types" +version = "0.5.1208" +dependencies = [ + "anyhow", + "thiserror 1.0.69", +] + +[[package]] +name = "perry-ui" +version = "0.5.1208" +dependencies = [ + "perry-ui-model", +] + +[[package]] +name = "perry-ui-android" +version = "0.5.1208" +dependencies = [ + "base64 0.22.1", + "itoa", + "jni 0.21.1", + "libc", + "perry-audio-miniaudio", + "perry-ext-sharp", + "perry-runtime", + "perry-ui", + "ryu", + "serde_json", + "tungstenite 0.24.0", +] + +[[package]] +name = "perry-ui-geisterhand" +version = "0.5.1208" +dependencies = [ + "rand 0.8.6", + "serde", + "serde_json", + "tiny_http", +] + +[[package]] +name = "perry-ui-gtk4" +version = "0.5.1208" +dependencies = [ + "base64 0.22.1", + "cairo-rs", + "dirs", + "gstreamer", + "gstreamer-app", + "gtk4", + "ksni", + "libc", + "libshumate", + "mpris-server", + "perry-audio-miniaudio", + "perry-ffi", + "perry-runtime", + "perry-ui", + "perry-ui-testkit", + "tokio", + "webkit6", +] + +[[package]] +name = "perry-ui-ios" +version = "0.5.1208" +dependencies = [ + "base64 0.22.1", + "block2", + "libc", + "objc2", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "perry-runtime", + "perry-ui", + "perry-ui-testkit", +] + +[[package]] +name = "perry-ui-macos" +version = "0.5.1208" +dependencies = [ + "base64 0.22.1", + "block2", + "libc", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "perry-ui", + "perry-ui-testkit", + "servo", +] + +[[package]] +name = "perry-ui-model" +version = "0.5.1208" + +[[package]] +name = "perry-ui-test" +version = "0.1.0" + +[[package]] +name = "perry-ui-testkit" +version = "0.5.1208" + +[[package]] +name = "perry-ui-tvos" +version = "0.5.1208" +dependencies = [ + "base64 0.22.1", + "block2", + "libc", + "objc2", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "perry-runtime", + "perry-ui", + "perry-ui-testkit", +] + +[[package]] +name = "perry-ui-visionos" +version = "0.5.1208" +dependencies = [ + "base64 0.22.1", + "block2", + "libc", + "objc2", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "perry-runtime", + "perry-ui", + "perry-ui-testkit", +] + +[[package]] +name = "perry-ui-watchos" +version = "0.5.1208" +dependencies = [ + "block2", + "libc", + "objc2", + "objc2-foundation", + "perry-runtime", + "perry-ui", + "perry-ui-testkit", +] + +[[package]] +name = "perry-ui-windows" +version = "0.5.1208" +dependencies = [ + "base64 0.22.1", + "libc", + "perry-audio-miniaudio", + "perry-runtime", + "perry-ui", + "perry-ui-testkit", + "png 0.17.16", + "qrcodegen", + "webview2-com", + "windows 0.62.2", + "windows-core 0.62.2", +] + +[[package]] +name = "perry-ui-windows-winui" +version = "0.5.1208" +dependencies = [ + "perry-ui-windows", +] + +[[package]] +name = "perry-updater" +version = "0.5.1208" +dependencies = [ + "base64 0.22.1", + "ed25519-dalek", + "hex", + "perry-runtime", + "semver", + "serde", + "serde_json", + "sha2 0.11.0", +] + +[[package]] +name = "perry-wasm-host" +version = "0.5.1208" +dependencies = [ + "wasmi", +] + +[[package]] +name = "petgraph" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3659d1ee90221741f65dd128d9998311b0e40c5d3c23a62445938214abce4f" +dependencies = [ + "fixedbitset", + "ordermap", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" +dependencies = [ + "phf_shared 0.12.1", +] + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros 0.13.1", + "phf_shared 0.13.1", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared 0.11.3", + "rand 0.8.6", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher 1.0.3", +] + +[[package]] +name = "phf_shared" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981" +dependencies = [ + "siphasher 1.0.3", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher 1.0.3", +] + +[[package]] +name = "pico-args" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" + +[[package]] +name = "pin-project" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der 0.7.10", + "pkcs8 0.10.2", + "spki 0.7.3", +] + +[[package]] +name = "pkcs5" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e847e2c91a18bfa887dd028ec33f2fe6f25db77db3619024764914affe8b69a6" +dependencies = [ + "aes 0.8.4", + "cbc", + "der 0.7.10", + "pbkdf2 0.12.2", + "scrypt", + "sha2 0.10.9", + "spki 0.7.3", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der 0.7.10", + "pkcs5", + "rand_core 0.6.4", + "spki 0.7.3", +] + +[[package]] +name = "pkcs8" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451913da69c775a56034ea8d9003d27ee8948e12443eae7c038ba100a4f21cb7" +dependencies = [ + "der 0.8.0", + "spki 0.8.0", +] + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "plane-split" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c1f7d82649829ecdef8e258790b0587acf0a8403f0ce963473d8e918acc1643" +dependencies = [ + "euclid", + "log", + "smallvec", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.13.0", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.5.2", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "portable-atomic-util" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "serde", +] + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "serde_core", + "writeable 0.6.3", + "zerovec 0.11.6", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppmd-rust" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efca4c95a19a79d1c98f791f10aebd5c1363b473244630bb7dbde1dc98455a24" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "prefix-trie" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cf6e3177f0684016a5c209b00882e15f8bdd3f3bb48f0491df10cd102d0c6e7" +dependencies = [ + "either", + "ipnet", + "num-traits", +] + +[[package]] +name = "presser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" + +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve 0.13.8", +] + +[[package]] +name = "printpdf" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91dac59ed5eed56d899517c12cb9f00756738731926b54e513732a36f49a83d" +dependencies = [ + "allsorts", + "base64 0.22.1", + "flate2", + "getrandom 0.3.4", + "lopdf", + "serde", + "serde_derive", + "serde_json", + "time", + "wasm-bindgen", + "wasm-bindgen-futures", + "weezl", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4488a4a36b9a4ba6b9334a32a39971f77c1436ec82c38707bce707699cc3bbcb" +dependencies = [ + "quote", + "syn 2.0.118", +] + +[[package]] +name = "proptest" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.13.0", + "num-traits", + "rand 0.9.4", + "rand_chacha 0.9.0", + "rand_xorshift", + "regex-syntax", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "psm" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645dbe486e346d9b5de3ef16ede18c26e6c70ad97418f4874b8b1889d6e761ea" dependencies = [ - "perry-stdlib", + "ar_archive_writer", + "cc", ] [[package]] -name = "perry-transform" -version = "0.5.1208" +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" dependencies = [ - "anyhow", - "perry-hir", - "perry-types", - "thiserror 1.0.69", + "ptr_meta_derive", ] [[package]] -name = "perry-types" -version = "0.5.1208" +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" dependencies = [ - "anyhow", - "thiserror 1.0.69", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] -name = "perry-ui" -version = "0.5.1208" +name = "pxfm" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0c5ccf5294c6ccd63a74f1565028353830a9c2f5eb0c682c355c471726a6e3f" + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" dependencies = [ - "perry-ui-model", + "bytemuck", ] [[package]] -name = "perry-ui-android" -version = "0.5.1208" +name = "qrcodegen" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4339fc7a1021c9c1621d87f5e3505f2805c8c105420ba2f2a4df86814590c142" + +[[package]] +name = "quanta" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3ab5a9d756f0d97bdc89019bd2e4ea098cf9cde50ee7564dde6b81ccc8f06c7" dependencies = [ - "base64", - "itoa", - "jni 0.21.1", + "crossbeam-utils", "libc", - "perry-audio-miniaudio", - "perry-ext-sharp", - "perry-runtime", - "perry-ui", - "ryu", - "serde_json", - "tungstenite 0.24.0", + "once_cell", + "raw-cpuid", + "wasi 0.11.1+wasi-snapshot-preview1", + "web-sys", + "winapi", ] [[package]] -name = "perry-ui-geisterhand" -version = "0.5.1208" +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quick_cache" +version = "0.6.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9c6658afe513a3b484e3abfdaa0d03ef3c0bbf017542c178dd55f94eb3051f9" dependencies = [ - "rand 0.8.6", - "serde", - "serde_json", - "tiny_http", + "ahash 0.8.12", + "equivalent", + "hashbrown 0.16.1", ] [[package]] -name = "perry-ui-gtk4" -version = "0.5.1208" +name = "quinn" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" dependencies = [ - "base64", - "cairo-rs", - "dirs", - "gstreamer", - "gstreamer-app", - "gtk4", - "ksni", - "libc", - "libshumate", - "mpris-server", - "perry-audio-miniaudio", - "perry-ffi", - "perry-runtime", - "perry-ui", - "perry-ui-testkit", + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.1.2", + "rustls", + "socket2 0.6.4", + "thiserror 2.0.18", "tokio", - "webkit6", + "tracing", + "web-time", ] [[package]] -name = "perry-ui-ios" -version = "0.5.1208" +name = "quinn-proto" +version = "0.11.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fcb935c5bec503c2f0e306bdd3e58bb9029dcb14fa8d9ac76e3a5256ac0763e" dependencies = [ - "base64", - "block2", - "libc", - "objc2", - "objc2-core-foundation", - "objc2-foundation", - "objc2-ui-kit", - "perry-runtime", - "perry-ui", - "perry-ui-testkit", + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.4", + "ring", + "rustc-hash 2.1.2", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", ] [[package]] -name = "perry-ui-macos" -version = "0.5.1208" +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" dependencies = [ - "base64", - "block2", + "cfg_aliases", "libc", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "perry-ui", - "perry-ui-testkit", + "once_cell", + "socket2 0.6.4", + "tracing", + "windows-sys 0.60.2", ] [[package]] -name = "perry-ui-model" -version = "0.5.1208" +name = "quote" +version = "1.0.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +dependencies = [ + "proc-macro2", +] [[package]] -name = "perry-ui-test" -version = "0.1.0" +name = "quoted_printable" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478e0585659a122aa407eb7e3c0e1fa51b1d8a870038bd29f0cf4a8551eea972" [[package]] -name = "perry-ui-testkit" -version = "0.5.1208" +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] -name = "perry-ui-tvos" -version = "0.5.1208" +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "base64", - "block2", + "getrandom 0.1.16", "libc", - "objc2", - "objc2-core-foundation", - "objc2-foundation", - "objc2-ui-kit", - "perry-runtime", - "perry-ui", - "perry-ui-testkit", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", ] [[package]] -name = "perry-ui-visionos" -version = "0.5.1208" +name = "rand" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ - "base64", - "block2", "libc", - "objc2", - "objc2-core-foundation", - "objc2-foundation", - "objc2-ui-kit", - "perry-runtime", - "perry-ui", - "perry-ui-testkit", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", ] [[package]] -name = "perry-ui-watchos" -version = "0.5.1208" +name = "rand" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" dependencies = [ - "block2", - "libc", - "objc2", - "objc2-foundation", - "perry-runtime", - "perry-ui", - "perry-ui-testkit", + "chacha20 0.10.1", + "getrandom 0.4.3", + "rand_core 0.10.1", ] [[package]] -name = "perry-ui-windows" -version = "0.5.1208" +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ - "base64", - "libc", - "perry-audio-miniaudio", - "perry-runtime", - "perry-ui", - "perry-ui-testkit", - "png 0.17.16", - "qrcodegen", - "webview2-com", - "windows", - "windows-core", + "ppv-lite86", + "rand_core 0.5.1", ] [[package]] -name = "perry-ui-windows-winui" -version = "0.5.1208" +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ - "perry-ui-windows", + "ppv-lite86", + "rand_core 0.6.4", ] [[package]] -name = "perry-updater" -version = "0.5.1208" +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ - "base64", - "ed25519-dalek", - "hex", - "perry-runtime", - "semver", - "serde", - "serde_json", - "sha2 0.11.0", + "ppv-lite86", + "rand_core 0.9.5", ] [[package]] -name = "perry-wasm-host" -version = "0.5.1208" +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "wasmi", + "getrandom 0.1.16", ] [[package]] -name = "phf" -version = "0.11.3" +name = "rand_core" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "phf_macros 0.11.3", - "phf_shared 0.11.3", + "getrandom 0.2.17", ] [[package]] -name = "phf" -version = "0.12.1" +name = "rand_core" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ - "phf_shared 0.12.1", + "getrandom 0.3.4", ] [[package]] -name = "phf" -version = "0.13.1" +name = "rand_core" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" -dependencies = [ - "phf_macros 0.13.1", - "phf_shared 0.13.1", - "serde", -] +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" [[package]] -name = "phf_codegen" -version = "0.13.1" +name = "rand_hc" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "phf_generator 0.13.1", - "phf_shared 0.13.1", + "rand_core 0.5.1", ] [[package]] -name = "phf_generator" -version = "0.11.3" +name = "rand_xorshift" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" dependencies = [ - "phf_shared 0.11.3", - "rand 0.8.6", + "rand_core 0.9.5", ] [[package]] -name = "phf_generator" -version = "0.13.1" +name = "range-alloc" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +checksum = "ca45419789ae5a7899559e9512e58ca889e41f04f1f2445e9f4b290ceccd1d08" + +[[package]] +name = "rangemap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "973443cf09a9c8656b574a866ab68dfa19f0867d0340648c7d2f6a71b8a8ea68" + +[[package]] +name = "rav1e" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" dependencies = [ - "fastrand", - "phf_shared 0.13.1", + "aligned-vec", + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av-scenechange", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools 0.14.0", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "paste", + "profiling", + "rand 0.9.4", + "rand_chacha 0.9.0", + "simd_helpers", + "thiserror 2.0.18", + "v_frame", + "wasm-bindgen", ] [[package]] -name = "phf_macros" -version = "0.11.3" +name = "ravif" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +checksum = "e52310197d971b0f5be7fe6b57530dcd27beb35c1b013f29d66c1ad73fbbcc45" dependencies = [ - "phf_generator 0.11.3", - "phf_shared 0.11.3", - "proc-macro2", - "quote", - "syn 2.0.118", + "avif-serialize", + "imgref", + "loop9", + "quick-error 2.0.1", + "rav1e", + "rayon", + "rgb", ] [[package]] -name = "phf_macros" -version = "0.13.1" +name = "raw-cpuid" +version = "11.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" dependencies = [ - "phf_generator 0.13.1", - "phf_shared 0.13.1", - "proc-macro2", - "quote", - "syn 2.0.118", + "bitflags 2.13.0", ] [[package]] -name = "phf_shared" -version = "0.11.3" +name = "raw-window-handle" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" dependencies = [ - "siphasher 1.0.3", + "either", + "rayon-core", ] [[package]] -name = "phf_shared" -version = "0.12.1" +name = "rayon-core" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ - "siphasher 1.0.3", + "crossbeam-deque", + "crossbeam-utils", ] [[package]] -name = "phf_shared" -version = "0.13.1" +name = "read-fonts" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +checksum = "6717cf23b488adf64b9d711329542ba34de147df262370221940dfabc2c91358" dependencies = [ - "siphasher 1.0.3", + "bytemuck", + "font-types", ] [[package]] -name = "pin-project-lite" -version = "0.2.17" +name = "redis" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" +checksum = "2fa6f8e4b491d7a8ef3a9550a4d71969bd0064f46e32b8dbbcc7fc60dad94fed" +dependencies = [ + "arc-swap", + "arcstr", + "async-lock", + "backon", + "bytes", + "cfg-if", + "combine", + "futures-channel", + "futures-util", + "itoa", + "num-bigint", + "percent-encoding", + "pin-project-lite", + "ryu", + "sha1_smol", + "socket2 0.6.4", + "tokio", + "tokio-util", + "url", + "xxhash-rust", +] [[package]] -name = "piper" -version = "0.2.5" +name = "redox_syscall" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "atomic-waker", - "fastrand", - "futures-io", + "bitflags 2.13.0", ] [[package]] -name = "pkcs1" -version = "0.7.5" +name = "redox_users" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ - "der 0.7.10", - "pkcs8 0.10.2", - "spki 0.7.3", + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.18", ] [[package]] -name = "pkcs5" -version = "0.7.1" +name = "regex" +version = "1.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e847e2c91a18bfa887dd028ec33f2fe6f25db77db3619024764914affe8b69a6" +checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" dependencies = [ - "aes 0.8.4", - "cbc", - "der 0.7.10", - "pbkdf2 0.12.2", - "scrypt", - "sha2 0.10.9", - "spki 0.7.3", + "aho-corasick", + "memchr", + "regex-automata 0.4.14", + "regex-syntax", ] [[package]] -name = "pkcs8" -version = "0.10.2" +name = "regex-automata" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +checksum = "e9368763f5a9b804326f3af749e16f9abf378d227bcdee7634b13d8f17793782" dependencies = [ - "der 0.7.10", - "pkcs5", - "rand_core 0.6.4", - "spki 0.7.3", + "memchr", ] [[package]] -name = "pkcs8" -version = "0.11.0" +name = "regex-automata" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "451913da69c775a56034ea8d9003d27ee8948e12443eae7c038ba100a4f21cb7" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ - "der 0.8.0", - "spki 0.8.0", + "aho-corasick", + "memchr", + "regex-syntax", ] [[package]] -name = "pkg-config" -version = "0.3.33" +name = "regex-syntax" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] -name = "png" -version = "0.17.16" +name = "rend" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" dependencies = [ - "bitflags 1.3.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide", + "bytecheck", ] [[package]] -name = "png" -version = "0.18.1" +name = "reqwest" +version = "0.12.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ - "bitflags 2.13.0", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide", + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.4.15", + "http 1.4.2", + "http-body 1.0.1", + "http-body-util", + "hyper 1.10.1", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "mime_guess", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 1.0.8", ] [[package]] -name = "polling" -version = "3.11.0" +name = "resolv-conf" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi 0.5.2", - "pin-project-lite", - "rustix", - "windows-sys 0.61.2", -] +checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" [[package]] -name = "poly1305" -version = "0.8.0" +name = "resvg" +version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +checksum = "a8928798c0a55e03c9ca6c4c6846f76377427d2c1e1f7e6de3c06ae57942df43" dependencies = [ - "cpufeatures 0.2.17", - "opaque-debug", - "universal-hash", + "gif 0.13.3", + "image-webp", + "log", + "pico-args", + "rgb", + "svgtypes", + "tiny-skia", + "usvg", + "zune-jpeg 0.4.21", ] [[package]] -name = "polyval" -version = "0.6.2" +name = "rfc6979" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "opaque-debug", - "universal-hash", + "hmac 0.12.1", + "subtle", ] [[package]] -name = "portable-atomic" -version = "1.13.1" +name = "rgb" +version = "0.8.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" +checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" +dependencies = [ + "bytemuck", +] [[package]] -name = "potential_utf" -version = "0.1.5" +name = "ring" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ - "serde_core", - "writeable", - "zerovec", + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", ] [[package]] -name = "powerfmt" -version = "0.2.0" +name = "rkyv" +version = "0.7.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] [[package]] -name = "ppmd-rust" -version = "1.4.0" +name = "rkyv_derive" +version = "0.7.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efca4c95a19a79d1c98f791f10aebd5c1363b473244630bb7dbde1dc98455a24" +checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] [[package]] -name = "ppv-lite86" -version = "0.2.21" +name = "ron" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +checksum = "beceb6f7bf81c73e73aeef6dd1356d9a1b2b4909e1f0fc3e59b034f9572d7b7f" dependencies = [ - "zerocopy", + "base64 0.22.1", + "bitflags 2.13.0", + "serde", + "serde_derive", + "unicode-ident", ] [[package]] -name = "precomputed-hash" -version = "0.1.1" +name = "roxmltree" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" [[package]] -name = "prefix-trie" -version = "0.8.4" +name = "rsa" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cf6e3177f0684016a5c209b00882e15f8bdd3f3bb48f0491df10cd102d0c6e7" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" dependencies = [ - "either", - "ipnet", + "const-oid 0.9.6", + "digest 0.10.7", + "num-bigint-dig", + "num-integer", "num-traits", + "pkcs1", + "pkcs8 0.10.2", + "rand_core 0.6.4", + "sha1 0.10.6", + "sha2 0.10.9", + "signature 2.2.0", + "spki 0.7.3", + "subtle", + "zeroize", ] [[package]] -name = "primeorder" -version = "0.13.6" +name = "rusqlite" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +checksum = "165ca6e57b20e1351573e3729b958bc62f0e48025386970b6e4d29e7a7e71f3f" dependencies = [ - "elliptic-curve 0.13.8", + "bitflags 2.13.0", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink 0.10.0", + "libsqlite3-sys", + "smallvec", ] [[package]] -name = "printpdf" -version = "0.9.1" +name = "rust_decimal" +version = "1.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91dac59ed5eed56d899517c12cb9f00756738731926b54e513732a36f49a83d" +checksum = "be2a24f50780bc85f09cc6ac299bdf1424302742d77221106859c9d8b102126a" dependencies = [ - "allsorts", - "base64", - "flate2", - "getrandom 0.3.4", - "lopdf", + "arrayvec", + "borsh", + "bytes", + "num-traits", + "rand 0.8.6", + "rkyv", "serde", - "serde_derive", "serde_json", - "time", "wasm-bindgen", - "wasm-bindgen-futures", - "weezl", ] [[package]] -name = "proc-macro-crate" -version = "3.5.0" +name = "rustc-demangle" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" -dependencies = [ - "toml_edit", -] +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" [[package]] -name = "proc-macro-error" -version = "1.0.4" +name = "rustc_version" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", + "semver", ] [[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +name = "rustc_version_runtime" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "2dd18cd2bae1820af0b6ad5e54f4a51d0f3fcc53b05f845675074efcc7af071d" dependencies = [ - "proc-macro2", - "quote", - "version_check", + "rustc_version", + "semver", ] [[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" +name = "rustix" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "proc-macro2", - "quote", + "bitflags 2.13.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", ] [[package]] -name = "proc-macro-error2" -version = "2.0.1" +name = "rustls" +version = "0.23.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f" dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn 2.0.118", + "aws-lc-rs", + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", ] [[package]] -name = "proc-macro2" -version = "1.0.106" +name = "rustls-native-certs" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" dependencies = [ - "unicode-ident", + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", ] [[package]] -name = "profiling" -version = "1.0.18" +name = "rustls-pemfile" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "profiling-procmacros", + "rustls-pki-types", ] [[package]] -name = "profiling-procmacros" -version = "1.0.18" +name = "rustls-pki-types" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4488a4a36b9a4ba6b9334a32a39971f77c1436ec82c38707bce707699cc3bbcb" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" dependencies = [ - "quote", - "syn 2.0.118", + "web-time", + "zeroize", ] [[package]] -name = "proptest" -version = "1.11.0" +name = "rustls-platform-verifier" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" +checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" dependencies = [ - "bit-set", - "bit-vec", - "bitflags 2.13.0", - "num-traits", - "rand 0.9.4", - "rand_chacha 0.9.0", - "rand_xorshift", - "regex-syntax", - "rusty-fork", - "tempfile", - "unarray", + "core-foundation 0.10.1", + "core-foundation-sys", + "jni 0.21.1", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", ] [[package]] -name = "psm" -version = "0.1.31" +name = "rustls-platform-verifier-android" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645dbe486e346d9b5de3ef16ede18c26e6c70ad97418f4874b8b1889d6e761ea" -dependencies = [ - "ar_archive_writer", - "cc", -] +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] -name = "ptr_meta" -version = "0.1.4" +name = "rustls-webpki" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ - "ptr_meta_derive", + "aws-lc-rs", + "ring", + "rustls-pki-types", + "untrusted", ] [[package]] -name = "ptr_meta_derive" -version = "0.1.4" +name = "rustversion" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] -name = "pxfm" -version = "0.1.29" +name = "rusty-fork" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c5ccf5294c6ccd63a74f1565028353830a9c2f5eb0c682c355c471726a6e3f" +checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" +dependencies = [ + "fnv", + "quick-error 1.2.3", + "tempfile", + "wait-timeout", +] [[package]] -name = "qoi" -version = "0.4.1" +name = "rustybuzz" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" dependencies = [ + "bitflags 2.13.0", "bytemuck", + "core_maths", + "log", + "smallvec", + "ttf-parser", + "unicode-bidi-mirroring", + "unicode-ccc", + "unicode-properties", + "unicode-script", ] [[package]] -name = "qrcodegen" -version = "1.8.0" +name = "ryu" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4339fc7a1021c9c1621d87f5e3505f2805c8c105420ba2f2a4df86814590c142" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] -name = "quanta" -version = "0.12.6" +name = "salsa20" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3ab5a9d756f0d97bdc89019bd2e4ea098cf9cde50ee7564dde6b81ccc8f06c7" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" dependencies = [ - "crossbeam-utils", - "libc", - "once_cell", - "raw-cpuid", - "wasi", - "web-sys", - "winapi", + "cipher 0.4.4", ] [[package]] -name = "quick-error" -version = "1.2.3" +name = "same-file" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] [[package]] -name = "quick-error" -version = "2.0.1" +name = "schannel" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] [[package]] -name = "quinn" -version = "0.11.11" +name = "scoped-tls" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" -dependencies = [ - "bytes", - "cfg_aliases", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash 2.1.2", - "rustls", - "socket2", - "thiserror 2.0.18", - "tokio", - "tracing", - "web-time", -] +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" [[package]] -name = "quinn-proto" -version = "0.11.15" +name = "scopeguard" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fcb935c5bec503c2f0e306bdd3e58bb9029dcb14fa8d9ac76e3a5256ac0763e" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scraper" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd0be4d296f048bfb06dd01bbc80ef789ddd2e55583e8d2e6b804942abfabc2" dependencies = [ - "bytes", - "getrandom 0.3.4", - "lru-slab", - "rand 0.9.4", - "ring", - "rustc-hash 2.1.2", - "rustls", - "rustls-pki-types", - "slab", - "thiserror 2.0.18", - "tinyvec", - "tracing", - "web-time", + "cssparser 0.37.0", + "ego-tree", + "getopts", + "html5ever", + "precomputed-hash", + "selectors 0.38.0", + "tendril", ] [[package]] -name = "quinn-udp" -version = "0.5.14" +name = "scrypt" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f" dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.60.2", + "password-hash", + "pbkdf2 0.12.2", + "salsa20", + "sha2 0.10.9", ] [[package]] -name = "quote" -version = "1.0.46" +name = "sea-query" +version = "1.0.0-rc.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +checksum = "58decdaaaf2a698170af2fa1b2e8f7b43a970e7768bf18aebaab113bada46354" +dependencies = [ + "inherent", + "sea-query-derive", +] + +[[package]] +name = "sea-query-derive" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0b0f466921cdd3cf4b89d5c3ac2173dba89a873ab395b123a645de181ec7537" dependencies = [ + "darling 0.20.11", + "heck 0.4.1", "proc-macro2", + "quote", + "syn 2.0.118", + "thiserror 2.0.18", ] [[package]] -name = "quoted_printable" -version = "0.5.2" +name = "sea-query-rusqlite" +version = "0.8.0-rc.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478e0585659a122aa407eb7e3c0e1fa51b1d8a870038bd29f0cf4a8551eea972" +checksum = "9d42855d86ace6f5d9e425b65a8035d45c64e001db87a254ecfd87f226b4b0f7" +dependencies = [ + "rusqlite", + "sea-query", +] [[package]] -name = "r-efi" -version = "5.3.0" +name = "seahash" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] -name = "r-efi" -version = "6.0.0" +name = "sec1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct 0.2.0", + "der 0.7.10", + "generic-array", + "pkcs8 0.10.2", + "subtle", + "zeroize", +] [[package]] -name = "radium" -version = "0.7.0" +name = "sec1" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +checksum = "d56d437c2f19203ce5f7122e507831de96f3d2d4d3be5af44a0b0a09d8a80e4d" +dependencies = [ + "base16ct 1.0.0", + "ctutils", + "der 0.8.0", + "hybrid-array 0.4.13", + "subtle", + "zeroize", +] [[package]] -name = "rand" -version = "0.8.6" +name = "security-framework" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ + "bitflags 2.13.0", + "core-foundation 0.10.1", + "core-foundation-sys", "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", + "security-framework-sys", ] [[package]] -name = "rand" -version = "0.9.4" +name = "security-framework-sys" +version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.5", + "core-foundation-sys", + "libc", ] [[package]] -name = "rand" -version = "0.10.1" +name = "selectors" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" +checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c" dependencies = [ - "chacha20 0.10.1", - "getrandom 0.4.3", - "rand_core 0.10.1", + "bitflags 2.13.0", + "cssparser 0.36.0", + "derive_more", + "log", + "new_debug_unreachable", + "phf 0.13.1", + "phf_codegen", + "precomputed-hash", + "rustc-hash 2.1.2", + "servo_arc", + "smallvec", + "to_shmem", + "to_shmem_derive", ] [[package]] -name = "rand_chacha" -version = "0.3.1" +name = "selectors" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "8adfa1c298912827b8a28b223b3b874357397ae706e6190acd9bf28cee99114d" dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", + "bitflags 2.13.0", + "cssparser 0.37.0", + "derive_more", + "log", + "new_debug_unreachable", + "phf 0.13.1", + "phf_codegen", + "precomputed-hash", + "rustc-hash 2.1.2", + "servo_arc", + "smallvec", ] [[package]] -name = "rand_chacha" -version = "0.9.0" +name = "semver" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "seq-macro" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ - "ppv-lite86", - "rand_core 0.9.5", + "serde_core", + "serde_derive", ] [[package]] -name = "rand_core" -version = "0.6.4" +name = "serde_bytes" +version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" dependencies = [ - "getrandom 0.2.17", + "serde", + "serde_core", ] [[package]] -name = "rand_core" -version = "0.9.5" +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ - "getrandom 0.3.4", + "serde_derive", ] [[package]] -name = "rand_core" -version = "0.10.1" +name = "serde_derive" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] [[package]] -name = "rand_xorshift" -version = "0.4.0" +name = "serde_json" +version = "1.0.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" dependencies = [ - "rand_core 0.9.5", + "indexmap", + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", ] [[package]] -name = "rangemap" -version = "1.7.1" +name = "serde_repr" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "973443cf09a9c8656b574a866ab68dfa19f0867d0340648c7d2f6a71b8a8ea68" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] [[package]] -name = "rav1e" -version = "0.8.1" +name = "serde_spanned" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" dependencies = [ - "aligned-vec", - "arbitrary", - "arg_enum_proc_macro", - "arrayvec", - "av-scenechange", - "av1-grain", - "bitstream-io", - "built", - "cfg-if", - "interpolate_name", - "itertools 0.14.0", - "libc", - "libfuzzer-sys", - "log", - "maybe-rayon", - "new_debug_unreachable", - "noop_proc_macro", - "num-derive", - "num-traits", - "paste", - "profiling", - "rand 0.9.4", - "rand_chacha 0.9.0", - "simd_helpers", - "thiserror 2.0.18", - "v_frame", - "wasm-bindgen", + "serde_core", ] [[package]] -name = "ravif" -version = "0.13.0" +name = "serde_urlencoded" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e52310197d971b0f5be7fe6b57530dcd27beb35c1b013f29d66c1ad73fbbcc45" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ - "avif-serialize", - "imgref", - "loop9", - "quick-error 2.0.1", - "rav1e", - "rayon", - "rgb", + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" +dependencies = [ + "serde_core", + "serde_with_macros", ] [[package]] -name = "raw-cpuid" -version = "11.6.0" +name = "serde_with_macros" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" +checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" dependencies = [ - "bitflags 2.13.0", + "darling 0.23.0", + "proc-macro2", + "quote", + "syn 2.0.118", ] [[package]] -name = "rayon" -version = "1.12.0" +name = "serde_yaml" +version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "either", - "rayon-core", + "indexmap", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", ] [[package]] -name = "rayon-core" -version = "1.13.0" +name = "serdect" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +checksum = "66cf8fedced2fcf12406bcb34223dffb92eaf34908ede12fed414c82b7f00b3e" dependencies = [ - "crossbeam-deque", - "crossbeam-utils", + "base16ct 1.0.0", + "serde", ] [[package]] -name = "redis" -version = "1.3.0" +name = "servo" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fa6f8e4b491d7a8ef3a9550a4d71969bd0064f46e32b8dbbcc7fc60dad94fed" +checksum = "2311cff3de4f2352ea13a9db0718262645202c0773f668a4aad20cc07fe6b06f" dependencies = [ - "arc-swap", - "arcstr", - "async-lock", - "backon", - "bytes", - "cfg-if", - "combine", - "futures-channel", - "futures-util", - "itoa", - "num-bigint", - "percent-encoding", - "pin-project-lite", - "ryu", - "sha1_smol", - "socket2", + "accesskit", + "arboard", + "bitflags 2.13.0", + "cookie 0.18.1", + "crossbeam-channel", + "dpi", + "env_logger 0.11.11", + "euclid", + "gaol", + "image", + "ipc-channel", + "keyboard-types", + "log", + "mozangle", + "parking_lot", + "rustc-hash 2.1.2", + "serde", + "servo-background-hang-monitor", + "servo-base", + "servo-canvas-traits", + "servo-config", + "servo-constellation", + "servo-constellation-traits", + "servo-default-resources", + "servo-devtools", + "servo-devtools-traits", + "servo-embedder-traits", + "servo-fonts", + "servo-geometry", + "servo-layout", + "servo-layout-api", + "servo-media", + "servo-media-dummy", + "servo-media-thread", + "servo-net", + "servo-net-traits", + "servo-paint", + "servo-paint-api", + "servo-profile", + "servo-profile-traits", + "servo-script", + "servo-script-traits", + "servo-storage", + "servo-storage-traits", + "servo-tracing", + "servo-url", + "servo-webgl", + "servo-webgpu", + "servo-webxr", + "stylo", + "stylo_traits", + "surfman", "tokio", - "tokio-util", "url", - "xxhash-rust", + "webrender", + "webrender_api", ] [[package]] -name = "redox_syscall" -version = "0.5.18" +name = "servo-allocator" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +checksum = "4d8013ec6b49e7fc3c93d82550ab944536dc843a1cfd3d32691f5030854871af" dependencies = [ - "bitflags 2.13.0", + "libc", + "tikv-jemalloc-sys", + "tikv-jemallocator", + "windows-sys 0.61.2", ] [[package]] -name = "redox_users" -version = "0.5.2" +name = "servo-background-hang-monitor" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +checksum = "bc008a0ae4a818390b09e67b0b113a17259666c8594372565186b8485a3dad13" dependencies = [ - "getrandom 0.2.17", - "libredox", - "thiserror 2.0.18", + "backtrace", + "crossbeam-channel", + "libc", + "log", + "rustc-hash 2.1.2", + "serde_json", + "servo-background-hang-monitor-api", + "servo-base", ] [[package]] -name = "regex" -version = "1.12.4" +name = "servo-background-hang-monitor-api" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" +checksum = "c8e6392cea0a079d759adeae3f9f4afdfbd2736680545be2dcdce90d61dd813a" dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", + "serde", + "servo-base", ] [[package]] -name = "regex-automata" -version = "0.4.14" +name = "servo-base" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +checksum = "652c96d26c12eb1a80c1de5cd352eeae6d5450f4903f860484142138b26bb596" dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", + "accesskit", + "crossbeam-channel", + "ipc-channel", + "libc", + "log", + "mach2", + "malloc_size_of_derive", + "parking_lot", + "rayon", + "regex", + "serde", + "serde_json", + "servo-config", + "servo-malloc-size-of", + "time", + "unicode-segmentation", + "webrender_api", + "windows-sys 0.61.2", ] [[package]] -name = "regex-syntax" -version = "0.8.11" +name = "servo-canvas" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" +checksum = "4a860146427668731437efb0b2fa98e09d3a481a4d29b826eb2cdcdad4cd5704" +dependencies = [ + "bytemuck", + "crossbeam-channel", + "euclid", + "kurbo 0.12.0", + "log", + "peniko", + "rustc-hash 2.1.2", + "servo-base", + "servo-canvas-traits", + "servo-config", + "servo-fonts", + "servo-paint-api", + "servo-pixels", + "servo-profile-traits", + "servo-tracing", + "stylo", + "vello_cpu", + "webrender_api", +] [[package]] -name = "rend" -version = "0.4.2" +name = "servo-canvas-traits" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +checksum = "5f18e3688716e4accaa2614a54bc17e71624b965a4132e66b6191218e77d75e7" dependencies = [ - "bytecheck", + "crossbeam-channel", + "euclid", + "glow", + "kurbo 0.12.0", + "malloc_size_of_derive", + "serde", + "servo-base", + "servo-fonts-traits", + "servo-malloc-size-of", + "servo-pixels", + "servo-webxr-api", + "strum 0.28.0", + "stylo", + "webrender_api", ] [[package]] -name = "reqwest" -version = "0.12.28" +name = "servo-config" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +checksum = "d453a08194c46a1ef557b82bfc5d101ef26de6a8101e6d79a7eb6773ed346056" dependencies = [ - "base64", - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "js-sys", - "log", - "mime_guess", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-pki-types", "serde", "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-rustls", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots 1.0.8", + "servo-config-macro", + "stylo_static_prefs", ] [[package]] -name = "resolv-conf" -version = "0.7.6" +name = "servo-config-macro" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" +checksum = "50eeff1d9312db321e09f7b9da39994656583507b12cbc21000d5de9d73ac8a2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", + "synstructure", +] [[package]] -name = "rfc6979" -version = "0.4.0" +name = "servo-constellation" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +checksum = "f2c5a79abbad7c9d96bedf6f047e69f777993ffd820c80ac4c66154475800afe" dependencies = [ - "hmac 0.12.1", - "subtle", + "accesskit", + "backtrace", + "content-security-policy", + "crossbeam-channel", + "euclid", + "gaol", + "ipc-channel", + "keyboard-types", + "log", + "parking_lot", + "rand 0.9.4", + "rustc-hash 2.1.2", + "serde", + "servo-background-hang-monitor", + "servo-background-hang-monitor-api", + "servo-base", + "servo-canvas", + "servo-canvas-traits", + "servo-config", + "servo-constellation-traits", + "servo-devtools-traits", + "servo-embedder-traits", + "servo-fonts", + "servo-layout-api", + "servo-media-thread", + "servo-net", + "servo-net-traits", + "servo-paint-api", + "servo-profile-traits", + "servo-script-traits", + "servo-storage-traits", + "servo-tracing", + "servo-url", + "servo-webgpu", + "servo-webgpu-traits", + "servo-webxr-api", + "stylo", + "stylo_traits", +] + +[[package]] +name = "servo-constellation-traits" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9586a099986a4f42749f576cacd086054e031021cd91110dab5e0b8ef2e51ab" +dependencies = [ + "content-security-policy", + "encoding_rs", + "euclid", + "http 1.4.2", + "ipc-channel", + "log", + "malloc_size_of_derive", + "rustc-hash 2.1.2", + "serde", + "servo-base", + "servo-canvas-traits", + "servo-config", + "servo-devtools-traits", + "servo-embedder-traits", + "servo-fonts-traits", + "servo-hyper-serde", + "servo-malloc-size-of", + "servo-net-traits", + "servo-paint-api", + "servo-pixels", + "servo-profile-traits", + "servo-storage-traits", + "servo-url", + "servo-webgpu-traits", + "strum 0.28.0", + "uuid", + "webrender_api", ] [[package]] -name = "rgb" -version = "0.8.53" +name = "servo-default-resources" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" +checksum = "b4207da426d1d47862349e6743ffd8ac8c1488d9a8a5eed03a83ff9e163697da" dependencies = [ - "bytemuck", + "servo-embedder-traits", ] [[package]] -name = "ring" -version = "0.17.14" +name = "servo-deny-public-fields" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +checksum = "98fae4310bb51f47eb651f5e18085902ff0fb6202b81db4c30ff3ecdc2f9c0bc" dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.17", - "libc", - "untrusted", - "windows-sys 0.52.0", + "syn 2.0.118", + "synstructure", ] [[package]] -name = "rkyv" -version = "0.7.46" +name = "servo-devtools" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" +checksum = "868371dece681d1ca370e763bd5093a4c322eab7fa137969a405a65b9cb9fceb" dependencies = [ - "bitvec", - "bytecheck", - "bytes", - "hashbrown 0.12.3", - "ptr_meta", - "rend", - "rkyv_derive", - "seahash", - "tinyvec", + "atomic_refcell", + "base64 0.22.1", + "chrono", + "crossbeam-channel", + "headers 0.4.1", + "http 1.4.2", + "log", + "malloc_size_of_derive", + "rand 0.9.4", + "rustc-hash 2.1.2", + "serde", + "serde_json", + "servo-base", + "servo-config", + "servo-devtools-traits", + "servo-embedder-traits", + "servo-malloc-size-of", + "servo-net", + "servo-net-traits", + "servo-profile-traits", + "servo-url", "uuid", ] [[package]] -name = "rkyv_derive" -version = "0.7.46" +name = "servo-devtools-traits" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" +checksum = "e44b3824b411e24d2155baf43fda4de8ae31ccf28b978402c769226a1b082a77" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "http 1.4.2", + "malloc_size_of_derive", + "serde", + "servo-base", + "servo-embedder-traits", + "servo-malloc-size-of", + "servo-net-traits", + "servo-profile-traits", + "servo-url", + "uuid", ] -[[package]] -name = "rsa" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" -dependencies = [ - "const-oid 0.9.6", - "digest 0.10.7", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1", - "pkcs8 0.10.2", - "rand_core 0.6.4", - "sha2 0.10.9", - "signature 2.2.0", - "spki 0.7.3", - "subtle", - "zeroize", +[[package]] +name = "servo-dom-struct" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f913de114000e33ebada6f4d82edc72575325894e043be9b1d0499e1ace75e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", ] [[package]] -name = "rusqlite" -version = "0.37.0" +name = "servo-embedder-traits" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "165ca6e57b20e1351573e3729b958bc62f0e48025386970b6e4d29e7a7e71f3f" +checksum = "ed5f5632ee546288b8d50c823b710afa56219aca202dd0d990fdc166c84120da" dependencies = [ + "accesskit", "bitflags 2.13.0", - "fallible-iterator", - "fallible-streaming-iterator", - "hashlink 0.10.0", - "libsqlite3-sys", - "smallvec", + "cookie 0.18.1", + "crossbeam-channel", + "euclid", + "http 1.4.2", + "image", + "inventory", + "keyboard-types", + "log", + "malloc_size_of_derive", + "rustc-hash 2.1.2", + "serde", + "servo-base", + "servo-geometry", + "servo-hyper-serde", + "servo-malloc-size-of", + "servo-pixels", + "servo-url", + "strum 0.28.0", + "stylo", + "stylo_traits", + "url", + "uuid", + "webdriver", + "webrender_api", ] [[package]] -name = "rust_decimal" -version = "1.42.1" +name = "servo-fonts" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be2a24f50780bc85f09cc6ac299bdf1424302742d77221106859c9d8b102126a" +checksum = "db31f28feaab1159deb1e31b96ac3e320d54dd3e1a8b373acf8f95059354d15c" dependencies = [ - "arrayvec", - "borsh", - "bytes", + "app_units", + "bitflags 2.13.0", + "byteorder", + "content-security-policy", + "dwrote", + "euclid", + "fontsan", + "freetype-sys", + "harfbuzz-sys", + "icu_locid", + "icu_properties 1.5.1", + "itertools 0.14.0", + "libc", + "log", + "malloc_size_of_derive", + "memmap2", "num-traits", - "rand 0.8.6", - "rkyv", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-text", + "parking_lot", + "read-fonts", + "rustc-hash 2.1.2", "serde", - "serde_json", - "wasm-bindgen", + "servo-allocator", + "servo-base", + "servo-config", + "servo-fonts-traits", + "servo-malloc-size-of", + "servo-net-traits", + "servo-paint-api", + "servo-profile-traits", + "servo-tracing", + "servo-url", + "servo_arc", + "skrifa", + "smallvec", + "stylo", + "stylo_atoms", + "unicode-properties", + "unicode-script", + "url", + "uuid", + "webrender_api", + "winapi", + "xml", + "yeslogic-fontconfig-sys", ] [[package]] -name = "rustc-hash" -version = "1.1.0" +name = "servo-fonts-traits" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +checksum = "e7119d37b59f0c02b48499ad916a80b901114a174d3bdc872b8e59be9cc7e3c6" +dependencies = [ + "atomic_refcell", + "dwrote", + "log", + "malloc_size_of_derive", + "memmap2", + "num-derive", + "num-traits", + "parking_lot", + "read-fonts", + "serde", + "servo-base", + "servo-malloc-size-of", + "servo-profile-traits", + "servo-url", + "stylo", + "uuid", + "webrender_api", +] [[package]] -name = "rustc-hash" -version = "2.1.2" +name = "servo-geometry" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" +checksum = "d3bbac0f89e8f20941a26d6e68861f313fbb01e79b18b1c1bd56ca0179063676" +dependencies = [ + "app_units", + "euclid", + "malloc_size_of_derive", + "servo-malloc-size-of", + "webrender", + "webrender_api", +] [[package]] -name = "rustc_version" -version = "0.4.1" +name = "servo-hyper-serde" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +checksum = "72838514a505b8b8f056f8f4a9e7c2aea8bf2ed14b8573ffc28e5a54926a9447" dependencies = [ - "semver", + "cookie 0.18.1", + "headers 0.4.1", + "http 1.4.2", + "hyper 1.10.1", + "mime", + "serde_bytes", + "serde_core", ] [[package]] -name = "rustc_version_runtime" -version = "0.3.0" +name = "servo-jstraceable-derive" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dd18cd2bae1820af0b6ad5e54f4a51d0f3fcc53b05f845675074efcc7af071d" +checksum = "35253dd08315fd35726155b7470aad195ccdff476d92ac959992c067c0b9e3e4" dependencies = [ - "rustc_version", - "semver", + "proc-macro2", + "syn 2.0.118", + "synstructure", ] [[package]] -name = "rustix" -version = "1.1.4" +name = "servo-layout" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +checksum = "be71eb9497abe74c4e2daec8617bfa14e4378f293795231fd96597308ba27ac2" dependencies = [ + "app_units", + "atomic_refcell", "bitflags 2.13.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", + "data-url", + "euclid", + "html5ever", + "icu_locid", + "icu_segmenter 1.5.0", + "itertools 0.14.0", + "kurbo 0.12.0", + "log", + "malloc_size_of_derive", + "parking_lot", + "rayon", + "rustc-hash 2.1.2", + "selectors 0.36.1", + "servo-base", + "servo-config", + "servo-embedder-traits", + "servo-fonts", + "servo-fonts-traits", + "servo-geometry", + "servo-layout-api", + "servo-malloc-size-of", + "servo-net-traits", + "servo-paint-api", + "servo-pixels", + "servo-profile-traits", + "servo-script", + "servo-script-traits", + "servo-tracing", + "servo-url", + "servo_arc", + "smallvec", + "strum 0.28.0", + "stylo", + "stylo_atoms", + "stylo_traits", + "taffy 0.10.1", + "unicode-bidi", + "unicode-script", + "unicode_categories", + "url", + "webrender_api", + "xi-unicode", ] [[package]] -name = "rustls" -version = "0.23.41" +name = "servo-layout-api" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f" +checksum = "b513bc3cc4d4efd5e1f689633095a4fc780642b3a9ba0082df1283ae395f84a2" dependencies = [ - "aws-lc-rs", - "log", - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", + "app_units", + "atomic_refcell", + "bitflags 2.13.0", + "euclid", + "html5ever", + "libc", + "malloc_size_of_derive", + "parking_lot", + "rustc-hash 2.1.2", + "selectors 0.36.1", + "serde", + "servo-background-hang-monitor-api", + "servo-base", + "servo-embedder-traits", + "servo-fonts", + "servo-malloc-size-of", + "servo-net-traits", + "servo-paint-api", + "servo-pixels", + "servo-profile-traits", + "servo-script-traits", + "servo-url", + "servo_arc", + "stylo", + "stylo_traits", + "webrender_api", ] [[package]] -name = "rustls-native-certs" -version = "0.8.4" +name = "servo-malloc-size-of" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" +checksum = "351361a0978e50fdc7e2198cb7e7a4c74c68f6f6b57915c3108a76036e07f153" dependencies = [ - "openssl-probe", - "rustls-pki-types", - "schannel", - "security-framework", + "accountable-refcell", + "app_units", + "atomic_refcell", + "content-security-policy", + "crossbeam-channel", + "encoding_rs", + "euclid", + "http 1.4.2", + "indexmap", + "ipc-channel", + "keyboard-types", + "markup5ever", + "mime", + "parking_lot", + "resvg", + "servo-allocator", + "servo_arc", + "smallvec", + "string_cache", + "stylo", + "stylo_dom", + "stylo_malloc_size_of", + "taffy 0.10.1", + "tendril", + "time", + "tokio", + "unicode-bidi", + "unicode-script", + "url", + "urlpattern", + "uuid", + "webrender", + "webrender_api", + "wr_malloc_size_of", ] [[package]] -name = "rustls-pemfile" -version = "2.2.0" +name = "servo-media" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +checksum = "b832794132cd7f36b4a5f8f8a1b0a7640160b1f9d2716fa7a16c2e36df0df1ef" dependencies = [ - "rustls-pki-types", + "once_cell", + "servo-media-audio", + "servo-media-player", + "servo-media-streams", + "servo-media-traits", + "servo-media-webrtc", ] [[package]] -name = "rustls-pki-types" -version = "1.14.1" +name = "servo-media-audio" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" +checksum = "36a31cfa701b2b51dbf2b40c52bc15f785265553c211d4160292459953c56e99" dependencies = [ - "web-time", - "zeroize", + "byte-slice-cast", + "euclid", + "log", + "malloc_size_of_derive", + "num-complex", + "num-traits", + "petgraph", + "serde", + "serde_derive", + "servo-malloc-size-of", + "servo-media-derive", + "servo-media-player", + "servo-media-streams", + "servo-media-traits", + "smallvec", + "speexdsp-resampler", ] [[package]] -name = "rustls-webpki" -version = "0.103.13" +name = "servo-media-derive" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +checksum = "44fdc309a170b22d23787925a26213d912eb8b48c2ec31abcaba27bfd665f190" dependencies = [ - "aws-lc-rs", - "ring", - "rustls-pki-types", - "untrusted", + "proc-macro2", + "quote", + "syn 2.0.118", ] [[package]] -name = "rustversion" -version = "1.0.22" +name = "servo-media-dummy" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "933cc33fb330745d7fef9437b1bf6ef00377ce2ffdfce3dd407a1b47ce018da2" +dependencies = [ + "ipc-channel", + "servo-media", + "servo-media-audio", + "servo-media-player", + "servo-media-streams", + "servo-media-traits", + "servo-media-webrtc", +] [[package]] -name = "rusty-fork" -version = "0.3.1" +name = "servo-media-player" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" +checksum = "4e1d19c7b0c783382b457907085916187e8f35c1d9fb7a1adccfc3a644782237" dependencies = [ - "fnv", - "quick-error 1.2.3", - "tempfile", - "wait-timeout", + "ipc-channel", + "malloc_size_of_derive", + "serde", + "serde_derive", + "servo-malloc-size-of", + "servo-media-streams", + "servo-media-traits", ] [[package]] -name = "ryu" -version = "1.0.23" +name = "servo-media-streams" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" +checksum = "454b562e8309468c1afce9691ff59720c55c4ca7abe0c8c66385e7fe5a6f5ccd" +dependencies = [ + "malloc_size_of_derive", + "servo-malloc-size-of", + "uuid", +] [[package]] -name = "salsa20" -version = "0.10.2" +name = "servo-media-thread" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +checksum = "cc8a15eefd0c1dfeb2feabe5ec449ce81df1fa5c1c12f95404fecbf38d090f9d" dependencies = [ - "cipher 0.4.4", + "euclid", + "ipc-channel", + "log", + "malloc_size_of_derive", + "rustc-hash 2.1.2", + "serde", + "servo-config", + "servo-malloc-size-of", + "servo-media", + "servo-paint-api", + "webrender_api", ] [[package]] -name = "same-file" -version = "1.0.6" +name = "servo-media-traits" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +checksum = "3aa16dc86558337e9b997872cdd03262f0743fdcf25892bdd0bf572e2677ef6b" dependencies = [ - "winapi-util", + "malloc_size_of_derive", + "servo-malloc-size-of", ] [[package]] -name = "schannel" -version = "0.1.29" +name = "servo-media-webrtc" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +checksum = "81ef80f1b85d057b48f9473761a27f013094884a63d649ab6355d9b3f7f29e47" dependencies = [ - "windows-sys 0.61.2", + "log", + "servo-media-streams", + "uuid", ] [[package]] -name = "scoped-tls" -version = "1.0.1" +name = "servo-metrics" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" +checksum = "349524fd3a66a99e0027575bd246807d657213711d1f606bbc019c996aacc67a" +dependencies = [ + "malloc_size_of_derive", + "servo-base", + "servo-config", + "servo-malloc-size-of", + "servo-paint-api", + "servo-profile-traits", + "servo-script-traits", + "servo-url", +] [[package]] -name = "scopeguard" -version = "1.2.0" +name = "servo-net" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +checksum = "c577079bb3ef21a4fd7bb36f452aa63b25882e2a7726276cea47ea577d224721" +dependencies = [ + "async-compression", + "async-recursion", + "async-tungstenite", + "base64 0.22.1", + "bytes", + "chrono", + "content-security-policy", + "cookie 0.18.1", + "crossbeam-channel", + "data-url", + "fst", + "futures", + "futures-core", + "futures-util", + "generic-array", + "headers 0.4.1", + "http 1.4.2", + "http-body-util", + "hyper 1.10.1", + "hyper-rustls", + "hyper-util", + "imsz", + "ipc-channel", + "itertools 0.14.0", + "log", + "malloc_size_of_derive", + "mime", + "mime_guess", + "nom 8.0.0", + "parking_lot", + "quick_cache", + "regex", + "resvg", + "rustc-hash 2.1.2", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier", + "serde", + "servo-base", + "servo-config", + "servo-devtools-traits", + "servo-embedder-traits", + "servo-hyper-serde", + "servo-malloc-size-of", + "servo-net-traits", + "servo-paint-api", + "servo-pixels", + "servo-profile-traits", + "servo-url", + "servo_arc", + "sha2 0.10.9", + "time", + "tokio", + "tokio-rustls", + "tokio-stream", + "tokio-util", + "tower", + "tungstenite 0.29.0", + "url", + "uuid", + "webpki-roots 1.0.8", + "webrender_api", +] [[package]] -name = "scraper" -version = "0.27.0" +name = "servo-net-traits" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdd0be4d296f048bfb06dd01bbc80ef789ddd2e55583e8d2e6b804942abfabc2" +checksum = "9625ab5589003db438ba7a266f19d28dbfac09fe2b84cd08adb6c72d0625eab4" dependencies = [ - "cssparser", - "ego-tree", - "getopts", - "html5ever", - "precomputed-hash", - "selectors", - "tendril", + "content-security-policy", + "cookie 0.18.1", + "crossbeam-channel", + "data-url", + "headers 0.4.1", + "http 1.4.2", + "hyper-util", + "ipc-channel", + "log", + "malloc_size_of_derive", + "mime", + "num-traits", + "parking_lot", + "percent-encoding", + "rand 0.9.4", + "rustc-hash 2.1.2", + "rustls-pki-types", + "serde", + "servo-base", + "servo-config", + "servo-embedder-traits", + "servo-hyper-serde", + "servo-malloc-size-of", + "servo-paint-api", + "servo-pixels", + "servo-profile-traits", + "servo-url", + "servo_arc", + "sys-locale", + "tokio", + "url", + "uuid", + "webrender_api", ] [[package]] -name = "scrypt" -version = "0.11.0" +name = "servo-paint" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f" +checksum = "3d0a4a54c85d0d196aa3e2a1802b2b3cfe9b599a05bc32004138a798af2842a3" dependencies = [ - "password-hash", - "pbkdf2 0.12.2", - "salsa20", - "sha2 0.10.9", + "bitflags 2.13.0", + "crossbeam-channel", + "dpi", + "euclid", + "gleam", + "image", + "ipc-channel", + "log", + "rayon", + "rustc-hash 2.1.2", + "servo-allocator", + "servo-base", + "servo-canvas-traits", + "servo-config", + "servo-constellation-traits", + "servo-embedder-traits", + "servo-geometry", + "servo-malloc-size-of", + "servo-media-thread", + "servo-paint-api", + "servo-profile-traits", + "servo-timers", + "servo-tracing", + "servo-webgl", + "smallvec", + "stylo_traits", + "surfman", + "webrender", + "webrender_api", + "wr_malloc_size_of", ] [[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - -[[package]] -name = "sec1" -version = "0.7.3" +name = "servo-paint-api" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +checksum = "a3f579bc5f06a675ebebecee4b9dc3975010a0c06e68cae9cde805aff5800ca3" dependencies = [ - "base16ct 0.2.0", - "der 0.7.10", - "generic-array", - "pkcs8 0.10.2", - "subtle", - "zeroize", + "bitflags 2.13.0", + "crossbeam-channel", + "dpi", + "euclid", + "gleam", + "glow", + "image", + "ipc-channel", + "log", + "malloc_size_of_derive", + "parking_lot", + "raw-window-handle", + "rustc-hash 2.1.2", + "serde", + "serde_bytes", + "servo-base", + "servo-embedder-traits", + "servo-geometry", + "servo-malloc-size-of", + "servo-profile-traits", + "servo-tracing", + "servo-url", + "smallvec", + "strum 0.28.0", + "stylo", + "stylo_traits", + "surfman", + "webrender_api", ] [[package]] -name = "sec1" -version = "0.8.1" +name = "servo-pixels" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56d437c2f19203ce5f7122e507831de96f3d2d4d3be5af44a0b0a09d8a80e4d" +checksum = "d1fa7656e3deae84546d147ea7eeb5373d6ba2fb20bd3ed1ff82a19427aad6b4" dependencies = [ - "base16ct 1.0.0", - "ctutils", - "der 0.8.0", - "hybrid-array", - "subtle", - "zeroize", + "euclid", + "image", + "log", + "malloc_size_of_derive", + "serde", + "servo-base", + "servo-malloc-size-of", + "webrender_api", ] [[package]] -name = "security-framework" -version = "3.7.0" +name = "servo-profile" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +checksum = "c977f737c66d814c5b6d121018e7541ddc861f4313a93a0b8acc14a2f7645202" dependencies = [ - "bitflags 2.13.0", - "core-foundation 0.10.1", - "core-foundation-sys", "libc", - "security-framework-sys", + "log", + "mach2", + "regex", + "serde", + "serde_json", + "servo-allocator", + "servo-base", + "servo-config", + "servo-profile-traits", + "tikv-jemalloc-sys", + "time", ] [[package]] -name = "security-framework-sys" -version = "2.17.0" +name = "servo-profile-traits" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +checksum = "4fe4720dbdedadebe5b9c644305adfb8ec2293ce0ae65c832f3af83d58573377" dependencies = [ - "core-foundation-sys", - "libc", + "crossbeam-channel", + "ipc-channel", + "log", + "malloc_size_of_derive", + "serde", + "servo-allocator", + "servo-base", + "servo-malloc-size-of", + "time", ] [[package]] -name = "selectors" -version = "0.38.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8adfa1c298912827b8a28b223b3b874357397ae706e6190acd9bf28cee99114d" +name = "servo-script" +version = "0.1.0" dependencies = [ + "aes 0.8.4", + "aes-gcm", + "aes-kw 0.2.1", + "app_units", + "argon2", + "arrayvec", + "atomic_refcell", + "aws-lc-rs", + "backtrace", + "base64 0.22.1", + "base64ct", "bitflags 2.13.0", - "cssparser", - "derive_more", + "brotli", + "cbc", + "chacha20poly1305", + "chardetng", + "chrono", + "cipher 0.4.4", + "content-security-policy", + "cookie 0.18.1", + "crossbeam-channel", + "cssparser 0.36.0", + "ctr", + "data-url", + "der 0.7.10", + "digest 0.10.7", + "ecdsa", + "elliptic-curve 0.13.8", + "encoding_rs", + "euclid", + "flate2", + "glow", + "headers 0.4.1", + "hkdf 0.12.4", + "html5ever", + "http 1.4.2", + "icu_locid", + "indexmap", + "ipc-channel", + "itertools 0.14.0", + "keyboard-types", + "libc", "log", - "new_debug_unreachable", + "malloc_size_of_derive", + "markup5ever", + "mime", + "mime-multipart-hyper1", + "mime_guess", + "ml-dsa", + "ml-kem", + "mozangle", + "mozjs", + "nom-rfc8288", + "num-bigint-dig", + "num-traits", + "num_cpus", + "ocb3", + "p256", + "p384", + "p521", + "parking_lot", + "percent-encoding", "phf 0.13.1", - "phf_codegen", - "precomputed-hash", + "pkcs8 0.10.2", + "postcard", + "rand 0.9.4", + "regex", + "rsa", "rustc-hash 2.1.2", + "sec1 0.7.3", + "selectors 0.36.1", + "serde", + "serde_json", + "servo-background-hang-monitor-api", + "servo-base", + "servo-canvas-traits", + "servo-config", + "servo-constellation-traits", + "servo-deny-public-fields", + "servo-devtools-traits", + "servo-dom-struct", + "servo-embedder-traits", + "servo-fonts", + "servo-fonts-traits", + "servo-geometry", + "servo-hyper-serde", + "servo-jstraceable-derive", + "servo-layout-api", + "servo-malloc-size-of", + "servo-media", + "servo-media-thread", + "servo-metrics", + "servo-net-traits", + "servo-paint-api", + "servo-pixels", + "servo-profile-traits", + "servo-script-bindings", + "servo-script-traits", + "servo-storage-traits", + "servo-timers", + "servo-url", + "servo-webgpu-traits", + "servo-xpath", "servo_arc", + "sha1 0.10.6", + "sha2 0.10.9", + "sha3 0.10.9", "smallvec", + "strum 0.28.0", + "stylo", + "stylo_atoms", + "stylo_dom", + "stylo_malloc_size_of", + "stylo_traits", + "swapper", + "tempfile", + "tendril", + "time", + "unicode-bidi", + "unicode-script", + "url", + "urlpattern", + "uuid", + "webdriver", + "webrender_api", + "wgpu-core", + "wgpu-types", + "x25519-dalek", + "xml5ever", ] [[package]] -name = "semver" -version = "1.0.28" +name = "servo-script-bindings" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +checksum = "f1237e5599ea3857a3cd76f0ec6cd6cfafd2acf274966f960ace001b87b2d891" +dependencies = [ + "bitflags 2.13.0", + "crossbeam-channel", + "encoding_rs", + "html5ever", + "indexmap", + "keyboard-types", + "libc", + "log", + "malloc_size_of_derive", + "mozjs", + "num-traits", + "parking_lot", + "phf 0.13.1", + "phf_codegen", + "phf_shared 0.13.1", + "regex", + "serde_json", + "servo-base", + "servo-config", + "servo-deny-public-fields", + "servo-dom-struct", + "servo-jstraceable-derive", + "servo-malloc-size-of", + "servo-profile-traits", + "servo-url", + "servo_arc", + "smallvec", + "stylo", + "stylo_atoms", + "tendril", + "xml5ever", +] [[package]] -name = "seq-macro" -version = "0.3.6" +name = "servo-script-traits" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" - -[[package]] -name = "serde" -version = "1.0.228" +checksum = "edc2d83cc0e14e0d3914881ae51b1eead81502afe06dbee4996df1f137fb6a6c" +dependencies = [ + "accesskit", + "crossbeam-channel", + "euclid", + "keyboard-types", + "malloc_size_of_derive", + "rustc-hash 2.1.2", + "serde", + "servo-base", + "servo-canvas-traits", + "servo-config", + "servo-constellation-traits", + "servo-devtools-traits", + "servo-embedder-traits", + "servo-fonts-traits", + "servo-malloc-size-of", + "servo-media-thread", + "servo-net-traits", + "servo-paint-api", + "servo-pixels", + "servo-profile-traits", + "servo-storage-traits", + "servo-url", + "servo-webxr-api", + "strum 0.28.0", + "stylo_atoms", + "stylo_traits", + "webrender_api", +] + +[[package]] +name = "servo-storage" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +checksum = "65ed9c35f2831bbafc3a846555daeb829e42a50c75cab753a0af691b1a92a324" dependencies = [ - "serde_core", - "serde_derive", + "libc", + "log", + "malloc_size_of_derive", + "postcard", + "rusqlite", + "rustc-hash 2.1.2", + "sea-query", + "sea-query-rusqlite", + "serde", + "servo-base", + "servo-config", + "servo-malloc-size-of", + "servo-net-traits", + "servo-profile-traits", + "servo-storage-traits", + "servo-url", + "tempfile", + "uuid", ] [[package]] -name = "serde_bytes" -version = "0.11.19" +name = "servo-storage-traits" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" +checksum = "3b7c15d38ed849e268a2cf0f9adab96f80d1b2cbaf00e67b1787f035a6fde000" dependencies = [ + "malloc_size_of_derive", "serde", - "serde_core", + "servo-base", + "servo-malloc-size-of", + "servo-profile-traits", + "servo-url", + "uuid", ] [[package]] -name = "serde_core" -version = "1.0.228" +name = "servo-timers" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +checksum = "cc03b1dd9ac0e5c11ff2d3dce1a0879fd0f0e42c670723b2c475539c64197370" dependencies = [ - "serde_derive", + "crossbeam-channel", + "malloc_size_of_derive", + "servo-malloc-size-of", ] [[package]] -name = "serde_derive" -version = "1.0.228" +name = "servo-tracing" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "404ade73d66d656d6d84c43d4c5e52a744b1be33c0adf44dc48d5c90535b1009" dependencies = [ "proc-macro2", "quote", @@ -7608,94 +11242,128 @@ dependencies = [ ] [[package]] -name = "serde_json" -version = "1.0.150" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" -dependencies = [ - "indexmap", - "itoa", - "memchr", - "serde", - "serde_core", - "zmij", -] - -[[package]] -name = "serde_repr" -version = "0.1.20" +name = "servo-url" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.118", +checksum = "f6704e3fcc79b00776e68fe896bc2429bf2f08dc665d3010a0e914b570993b8e" +dependencies = [ + "encoding_rs", + "malloc_size_of_derive", + "serde", + "servo-malloc-size-of", + "servo_arc", + "url", + "uuid", ] [[package]] -name = "serde_spanned" -version = "1.1.1" +name = "servo-webgl" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +checksum = "1d6994dc5b85ac5d848ff58ad6ea74ce9a7444c1c46f1ef806aab76790ff60bb" dependencies = [ - "serde_core", + "bitflags 2.13.0", + "byteorder", + "crossbeam-channel", + "euclid", + "glow", + "half", + "itertools 0.14.0", + "log", + "parking_lot", + "rustc-hash 2.1.2", + "servo-base", + "servo-canvas-traits", + "servo-paint-api", + "servo-pixels", + "surfman", + "webrender_api", ] [[package]] -name = "serde_urlencoded" -version = "0.7.1" +name = "servo-webgpu" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +checksum = "26fcecae88239ee15fa5a10351c2bc5d09d084f63abdab0bc70931d8fb1f7947" dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", + "arrayvec", + "euclid", + "log", + "rustc-hash 2.1.2", + "servo-base", + "servo-config", + "servo-paint-api", + "servo-pixels", + "servo-webgpu-traits", + "webrender_api", + "wgpu-core", + "wgpu-types", ] [[package]] -name = "serde_with" -version = "3.21.0" +name = "servo-webgpu-traits" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" +checksum = "fe5ed6c27d606ce6537cfec6d7a1a249d9c69a4603dc53aa770a72e77bda6ef8" dependencies = [ - "serde_core", - "serde_with_macros", + "arrayvec", + "malloc_size_of_derive", + "serde", + "servo-base", + "servo-malloc-size-of", + "servo-pixels", + "webrender_api", + "wgpu-core", + "wgpu-types", ] [[package]] -name = "serde_with_macros" -version = "3.21.0" +name = "servo-webxr" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" +checksum = "efdbc5c1be1fdf250978506d303132719a502ec9b81462c7c42f76688187feb5" dependencies = [ - "darling 0.23.0", - "proc-macro2", - "quote", - "syn 2.0.118", + "crossbeam-channel", + "euclid", + "glow", + "log", + "openxr", + "raw-window-handle", + "servo-base", + "servo-profile-traits", + "servo-webxr-api", + "surfman", + "winapi", + "wio", ] [[package]] -name = "serde_yaml" -version = "0.9.34+deprecated" +name = "servo-webxr-api" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +checksum = "32a475bc39579c269a02d9f988709d691b295dbbd2887e178ea613b482cecb50" dependencies = [ - "indexmap", - "itoa", - "ryu", + "euclid", + "ipc-channel", + "log", + "malloc_size_of_derive", "serde", - "unsafe-libyaml", + "servo-base", + "servo-embedder-traits", + "servo-malloc-size-of", + "servo-profile-traits", ] [[package]] -name = "serdect" -version = "0.4.3" +name = "servo-xpath" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66cf8fedced2fcf12406bcb34223dffb92eaf34908ede12fed414c82b7f00b3e" +checksum = "5e8bd73d8165bdbb46fcfce8af60fab54398ac47071e7402dea354b25ce079af" dependencies = [ - "base16ct 1.0.0", - "serde", + "log", + "malloc_size_of_derive", + "markup5ever", + "servo-malloc-size-of", ] [[package]] @@ -7704,6 +11372,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" dependencies = [ + "serde", "stable_deref_trait", ] @@ -7897,6 +11566,15 @@ dependencies = [ "time", ] +[[package]] +name = "simplecss" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9c6883ca9c3c7c90e888de77b7a5c849c779d25d74a1269b0218b14e8b136c" +dependencies = [ + "log", +] + [[package]] name = "siphasher" version = "0.3.11" @@ -7909,6 +11587,16 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" +[[package]] +name = "skrifa" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c31071dedf532758ecf3fed987cdb4bd9509f900e026ab684b4ecb81ea49841" +dependencies = [ + "bytemuck", + "read-fonts", +] + [[package]] name = "slab" version = "0.4.12" @@ -7924,6 +11612,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "smallbitvec" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b0e903ee191d8f7a8fbf0d712c3a1699d19e04ceba5ad1eb673053c7d938a09" + [[package]] name = "smallvec" version = "1.15.2" @@ -7944,6 +11638,16 @@ dependencies = [ "version_check", ] +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "socket2" version = "0.6.4" @@ -7980,6 +11684,12 @@ dependencies = [ "system-deps", ] +[[package]] +name = "speexdsp-resampler" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b72d540d5c565dbe1f891d7e21ceb21d2649508306782f1066989fccb0b363d3" + [[package]] name = "spin" version = "0.9.8" @@ -7998,6 +11708,15 @@ dependencies = [ "lock_api", ] +[[package]] +name = "spirv" +version = "0.3.0+sdk-1.3.268.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" +dependencies = [ + "bitflags 2.13.0", +] + [[package]] name = "spki" version = "0.7.3" @@ -8043,7 +11762,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05b44e85bf579a8eeb4ceaa77a3a523baf2bf0e9bac7e40f405d537b5d2d5ccb" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "cfg-if", "chrono", @@ -8144,7 +11863,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87a2bdd6e83f6b3ea525ca9fee568030508b58355a43d0b2c1674d5f79dcd65e" dependencies = [ "atoi", - "base64", + "base64 0.22.1", "bitflags 2.13.0", "byteorder", "chrono", @@ -8192,115 +11911,350 @@ dependencies = [ "log", "percent-encoding", "serde", - "sqlx-core", - "thiserror 2.0.18", - "tracing", + "sqlx-core", + "thiserror 2.0.18", + "tracing", + "url", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "stacker" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "640c8cdd92b6b12f5bcb1803ca3bbf5ab96e5e6b6b96b9ab77dabe9e880b3190" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "windows-sys 0.61.2", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strck" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be91090ded9d8f979d9fe921777342d37e769e0b6b7296843a7a38247240e917" + +[[package]] +name = "strck_ident" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1c3802b169b3858a44667f221c9a0b3136e6019936ea926fc97fbad8af77202" +dependencies = [ + "strck", + "unicode-ident", +] + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" +dependencies = [ + "float-cmp", +] + +[[package]] +name = "string_cache" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared 0.13.1", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", + "proc-macro2", + "quote", +] + +[[package]] +name = "string_enum" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae36a4951ca7bd1cfd991c241584a9824a70f6aff1e7d4f693fb3f2465e4030e" +dependencies = [ + "quote", + "swc_macros_common", + "syn 2.0.118", +] + +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +dependencies = [ + "strum_macros 0.27.2", +] + +[[package]] +name = "strum" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" +dependencies = [ + "strum_macros 0.28.0", +] + +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "strum_macros" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.118", +] + +[[package]] +name = "stylo" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c032879feb9c437f8eb370b1ddc56c13531267766bd6f3ada99c406d36d60a6" +dependencies = [ + "app_units", + "arrayvec", + "atomic_refcell", + "bitflags 2.13.0", + "byteorder", + "cssparser 0.36.0", + "derive_more", + "encoding_rs", + "euclid", + "icu_segmenter 2.2.0", + "indexmap", + "itertools 0.14.0", + "itoa", + "log", + "malloc_size_of_derive", + "mime", + "new_debug_unreachable", + "num-derive", + "num-integer", + "num-traits", + "num_cpus", + "parking_lot", + "precomputed-hash", + "rayon", + "rayon-core", + "rustc-hash 2.1.2", + "selectors 0.36.1", + "serde", + "servo_arc", + "smallbitvec", + "smallvec", + "static_assertions", + "string_cache", + "strum 0.28.0", + "strum_macros 0.28.0", + "stylo_atoms", + "stylo_derive", + "stylo_dom", + "stylo_malloc_size_of", + "stylo_static_prefs", + "stylo_traits", + "thin-vec", + "to_shmem", + "to_shmem_derive", + "uluru", "url", + "void", + "walkdir", + "web_atoms", ] [[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[package]] -name = "stacker" -version = "0.1.24" +name = "stylo_atoms" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "640c8cdd92b6b12f5bcb1803ca3bbf5ab96e5e6b6b96b9ab77dabe9e880b3190" +checksum = "dbb92d87ad2ba792800cc2bf508eb17286044303ebe55b15cd7e541190486c86" dependencies = [ - "cc", - "cfg-if", - "libc", - "psm", - "windows-sys 0.61.2", + "string_cache", + "string_cache_codegen", ] [[package]] -name = "static_assertions" -version = "1.1.0" +name = "stylo_derive" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +checksum = "338d14b4375657058b395afcf11bee2fc22a77e9d80f66ee863b617b38d4319a" +dependencies = [ + "darling 0.20.11", + "proc-macro2", + "quote", + "syn 2.0.118", + "synstructure", +] [[package]] -name = "string_cache" -version = "0.9.0" +name = "stylo_dom" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +checksum = "1aa592a930bd67daa5c9c07bc7b422f23f67b5bd30532e85a6fcfef348cf0fb9" dependencies = [ - "new_debug_unreachable", - "parking_lot", - "phf_shared 0.13.1", - "precomputed-hash", + "bitflags 2.13.0", + "stylo_malloc_size_of", ] [[package]] -name = "string_cache_codegen" -version = "0.6.1" +name = "stylo_malloc_size_of" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +checksum = "a8cd4ec615ff7bbc849d1d7d95891c39db20dfd1cb79eb8ba29c54107a4101a3" dependencies = [ - "phf_generator 0.13.1", - "phf_shared 0.13.1", - "proc-macro2", - "quote", + "app_units", + "cssparser 0.36.0", + "euclid", + "selectors 0.36.1", + "servo_arc", + "smallbitvec", + "smallvec", + "string_cache", + "thin-vec", + "void", ] [[package]] -name = "string_enum" -version = "1.0.2" +name = "stylo_static_prefs" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae36a4951ca7bd1cfd991c241584a9824a70f6aff1e7d4f693fb3f2465e4030e" -dependencies = [ - "quote", - "swc_macros_common", - "syn 2.0.118", -] +checksum = "dc94d0d425d29db1da9535b12793a0db91e85ca2fde13adc73df33f49ee75af7" [[package]] -name = "stringprep" -version = "0.1.5" +name = "stylo_traits" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +checksum = "30cc7f5c9b43201f0d5c81ca190ccbf29382cff3af4cc926c9cd5e53beb6c9e5" dependencies = [ - "unicode-bidi", - "unicode-normalization", - "unicode-properties", + "app_units", + "bitflags 2.13.0", + "cssparser 0.36.0", + "euclid", + "malloc_size_of_derive", + "selectors 0.36.1", + "serde", + "servo_arc", + "stylo_atoms", + "stylo_malloc_size_of", + "thin-vec", + "to_shmem", + "to_shmem_derive", + "url", ] [[package]] -name = "strsim" -version = "0.11.1" +name = "subtle" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] -name = "strum" -version = "0.27.2" +name = "surfman" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +checksum = "04d3973284ef0dc7362cdaee41c2356c4c39a5a5ebd8490c5163ebf21a7adc02" dependencies = [ - "strum_macros", + "bitflags 2.13.0", + "cfg_aliases", + "cgl", + "euclid", + "fnv", + "gl_generator", + "glow", + "libc", + "log", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-video", + "objc2-foundation", + "objc2-io-surface", + "objc2-metal", + "objc2-quartz-core", + "raw-window-handle", + "wayland-sys", + "winapi", + "wio", + "x11-dl", ] [[package]] -name = "strum_macros" -version = "0.27.2" +name = "svg_fmt" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +checksum = "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3acf9e02fb" + +[[package]] +name = "svgtypes" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.118", + "kurbo 0.11.3", + "siphasher 1.0.3", ] [[package]] -name = "subtle" -version = "2.6.1" +name = "swapper" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +checksum = "e454d048db5527d000bfddb77bd072bbf3a1e2ae785f16d9bd116e07c2ab45eb" [[package]] name = "swc_atoms" @@ -8452,6 +12406,15 @@ dependencies = [ "syn 2.0.118", ] +[[package]] +name = "sys-locale" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" +dependencies = [ + "libc", +] + [[package]] name = "system-configuration" version = "0.7.0" @@ -8493,7 +12456,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab4f4d046dd956a47a7e1a2947083d7ac3e6aa3cfaaead36173ceaa5ab11878c" dependencies = [ "arrayvec", - "grid", + "grid 0.15.0", + "serde", + "slotmap", +] + +[[package]] +name = "taffy" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aea22054047c16c3f34d3ac473a2170be1424b1115b2a3adcf28cfb067c88859" +dependencies = [ + "arrayvec", + "grid 1.0.1", "serde", "slotmap", ] @@ -8552,17 +12527,17 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1afc06e45b0d63943c777d0233523fa2e23a12431a73c37b1c0366777b31717" dependencies = [ - "calendrical_calculations", + "calendrical_calculations 0.2.4", "core_maths", "iana-time-zone", - "icu_calendar", + "icu_calendar 2.2.1", "icu_locale_core", "ixdtf", "num-traits", "timezone_provider", - "tinystr", + "tinystr 0.8.3", "web-time", - "writeable", + "writeable 0.6.3", ] [[package]] @@ -8571,6 +12546,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4790fc369d5a530f4b544b094e31388b9b3a37c0f4652ade4505945f5660d24" dependencies = [ + "encoding_rs", "new_debug_unreachable", "utf-8", ] @@ -8584,6 +12560,22 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "textnonce" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7743f8d70cd784ed1dc33106a18998d77758d281dc40dc3e6d050cf0f5286683" +dependencies = [ + "base64 0.12.3", + "rand 0.7.3", +] + +[[package]] +name = "thin-vec" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0f7e269b48f0a7dd0146680fa24b50cc67fc0373f086a5b2f99bd084639b482" + [[package]] name = "thiserror" version = "1.0.69" @@ -8644,7 +12636,27 @@ dependencies = [ "half", "quick-error 2.0.1", "weezl", - "zune-jpeg", + "zune-jpeg 0.5.15", +] + +[[package]] +name = "tikv-jemalloc-sys" +version = "0.6.1+5.3.0-1-ge13ca993e8ccb9ba9847cc330696e02839f328f7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd8aa5b2ab86a2cefa406d889139c162cbb230092f7d1d7cbc1716405d852a3b" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "tikv-jemallocator" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0359b4327f954e0567e69fb191cf1436617748813819c94b8cd4a431422d053a" +dependencies = [ + "libc", + "tikv-jemalloc-sys", ] [[package]] @@ -8655,7 +12667,9 @@ checksum = "85c17d80feb7334b40c484e45ed1a5273dfd8bfda537c3be2e74a06a6686f327" dependencies = [ "deranged", "js-sys", + "libc", "num-conv", + "num_threads", "powerfmt", "serde_core", "time-core", @@ -8686,10 +12700,10 @@ checksum = "48738555f588bc05b58cb55206843cde9875bb1fde50101dd1a7c50ac6535cd5" dependencies = [ "combine", "jiff-tzdb", - "tinystr", + "tinystr 0.8.3", "tzif", - "zerotrie", - "zerovec", + "zerotrie 0.2.4", + "zerovec 0.11.6", ] [[package]] @@ -8701,6 +12715,32 @@ dependencies = [ "crunchy", ] +[[package]] +name = "tiny-skia" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "png 0.17.16", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + [[package]] name = "tiny_http" version = "0.12.0" @@ -8713,6 +12753,16 @@ dependencies = [ "log", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec 0.10.4", +] + [[package]] name = "tinystr" version = "0.8.3" @@ -8721,7 +12771,7 @@ checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "serde_core", - "zerovec", + "zerovec 0.11.6", ] [[package]] @@ -8739,6 +12789,33 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "to_shmem" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab187810ca1e6aaa4c97a06492aac9ade2ffae6a301fd2aac103656f5a69edb" +dependencies = [ + "cssparser 0.36.0", + "servo_arc", + "smallbitvec", + "smallvec", + "string_cache", + "thin-vec", +] + +[[package]] +name = "to_shmem_derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ba1f5563024b63bb6acb4558452d9ba737518c1d11fcc1861febe98d1e31cf4" +dependencies = [ + "darling 0.20.11", + "proc-macro2", + "quote", + "syn 2.0.118", + "synstructure", +] + [[package]] name = "tokio" version = "1.52.3" @@ -8751,7 +12828,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.6.4", "tokio-macros", "tracing", "windows-sys 0.61.2", @@ -8887,6 +12964,12 @@ version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" +[[package]] +name = "topological-sort" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa7c7f42dea4b1b99439786f5633aeb9c14c1b53f75e282803c2ec2ad545873c" + [[package]] name = "tower" version = "0.5.3" @@ -8911,8 +12994,8 @@ dependencies = [ "bitflags 2.13.0", "bytes", "futures-util", - "http", - "http-body", + "http 1.4.2", + "http-body 1.0.1", "pin-project-lite", "tower", "tower-layer", @@ -8985,7 +13068,7 @@ dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "regex-automata", + "regex-automata 0.4.14", "sharded-slab", "smallvec", "thread_local", @@ -8994,6 +13077,12 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "tracy-rs" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce607aae8ab0ab3abf3a2723a9ab6f09bb8639ed83fdd888d857b8e556c868d8" + [[package]] name = "trait-variant" version = "0.1.2" @@ -9026,6 +13115,9 @@ name = "ttf-parser" version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" +dependencies = [ + "core_maths", +] [[package]] name = "tungstenite" @@ -9036,7 +13128,7 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http", + "http 1.4.2", "httparse", "log", "rand 0.8.6", @@ -9056,7 +13148,7 @@ checksum = "6c01152af293afb9c7c2a57e4b559c5620b421f6d133261c60dd2d0cdb38e6b8" dependencies = [ "bytes", "data-encoding", - "http", + "http 1.4.2", "httparse", "log", "rand 0.9.4", @@ -9124,12 +13216,62 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "uluru" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c8a2469e56e6e5095c82ccd3afb98dad95f7af7929aab6d8ba8d6e0f73657da" +dependencies = [ + "arrayvec", +] + [[package]] name = "unarray" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + [[package]] name = "unicase" version = "2.9.0" @@ -9140,7 +13282,13 @@ checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" name = "unicode-bidi" version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-bidi-mirroring" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfa6e8c60bb66d49db113e0125ee8711b7647b5579dc7f5f19c42357ed039fe" [[package]] name = "unicode-canonical-combining-class" @@ -9148,6 +13296,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41c99d5174052d02ce765418e826597a1be18f32c114e35d9e22f92390239561" +[[package]] +name = "unicode-ccc" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" + [[package]] name = "unicode-general-category" version = "1.1.0" @@ -9187,12 +13341,24 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" +[[package]] +name = "unicode-script" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "383ad40bb927465ec0ce7720e033cb4ca06912855fc35db31b5755d0de75b1ee" + [[package]] name = "unicode-segmentation" version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" +[[package]] +name = "unicode-vo" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" + [[package]] name = "unicode-width" version = "0.2.2" @@ -9205,6 +13371,12 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "unicode_categories" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" + [[package]] name = "unit-prefix" version = "0.5.2" @@ -9243,6 +13415,46 @@ dependencies = [ "idna", "percent-encoding", "serde", + "serde_derive", +] + +[[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] +name = "usvg" +version = "0.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80be9b06fbae3b8b303400ab20778c80bbaf338f563afe567cf3c9eea17b47ef" +dependencies = [ + "base64 0.22.1", + "data-url", + "flate2", + "fontdb", + "imagesize", + "kurbo 0.11.3", + "log", + "pico-args", + "roxmltree", + "rustybuzz", + "simplecss", + "siphasher 1.0.3", + "strict-num", + "svgtypes", + "tiny-skia-path", + "unicode-bidi", + "unicode-script", + "unicode-vo", + "xmlwriter", ] [[package]] @@ -9251,6 +13463,12 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + [[package]] name = "utf8_iter" version = "1.0.4" @@ -9331,6 +13549,32 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "vello_common" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a235ba928b3109ad9e7696270edb09445a52ae1c7c08e6d31a19b1cdd6cbc24a" +dependencies = [ + "bytemuck", + "fearless_simd", + "hashbrown 0.15.5", + "log", + "peniko", + "png 0.17.16", + "skrifa", + "smallvec", +] + +[[package]] +name = "vello_cpu" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0bd1fcf9c1814f17a491e07113623d44e3ec1125a9f3401f5e047d6d326da21" +dependencies = [ + "bytemuck", + "vello_common", +] + [[package]] name = "version-compare" version = "0.2.1" @@ -9343,6 +13587,12 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + [[package]] name = "wait-timeout" version = "0.2.1" @@ -9371,6 +13621,39 @@ dependencies = [ "try-lock", ] +[[package]] +name = "warp" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4378d202ff965b011c64817db11d5829506d3404edeadb61f190d111da3f231c" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "headers 0.3.9", + "http 0.2.12", + "hyper 0.14.32", + "log", + "mime", + "mime_guess", + "percent-encoding", + "pin-project", + "scoped-tls", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-util", + "tower-service", + "tracing", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" @@ -9509,6 +13792,18 @@ dependencies = [ "semver", ] +[[package]] +name = "wayland-sys" +version = "0.31.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8eab23fefc9e41f8e841df4a9c707e8a8c4ed26e944ef69297184de2785e3be" +dependencies = [ + "dlib", + "log", + "once_cell", + "pkg-config", +] + [[package]] name = "web-sys" version = "0.3.103" @@ -9541,6 +13836,29 @@ dependencies = [ "string_cache_codegen", ] +[[package]] +name = "webdriver" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91d53921e1bef27512fa358179c9a22428d55778d2c2ae3c5c37a52b82ce6e92" +dependencies = [ + "base64 0.22.1", + "bytes", + "cookie 0.16.2", + "http 0.2.12", + "icu_segmenter 1.5.0", + "log", + "serde", + "serde_derive", + "serde_json", + "thiserror 1.0.69", + "time", + "tokio", + "tokio-stream", + "url", + "warp", +] + [[package]] name = "webkit6" version = "0.4.0" @@ -9574,6 +13892,15 @@ dependencies = [ "system-deps", ] +[[package]] +name = "webpki-root-certs" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d46a5a140e6f7afeccd8eae97eff335163939eac8b929834875168b29b3d267" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "webpki-roots" version = "0.26.11" @@ -9592,6 +13919,73 @@ dependencies = [ "rustls-pki-types", ] +[[package]] +name = "webrender" +version = "0.68.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a591c25221a9f8ac2ad7754659b283d912cee6c8424f0fa3777aabed3be91c16" +dependencies = [ + "allocator-api2", + "bincode", + "bitflags 2.13.0", + "build-parallel", + "byteorder", + "derive_more", + "etagere", + "euclid", + "gleam", + "glslopt", + "lazy_static", + "log", + "malloc_size_of_derive", + "num-traits", + "peek-poke", + "plane-split", + "rayon", + "ron", + "rustc-hash 2.1.2", + "serde", + "smallvec", + "svg_fmt", + "topological-sort", + "tracy-rs", + "webrender_api", + "webrender_build", + "wr_glyph_rasterizer", + "wr_malloc_size_of", + "zeitstempel", +] + +[[package]] +name = "webrender_api" +version = "0.68.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb206f613b4635881065a2ff4670e656edc904af0b8729c51ce1196679fd1b6d" +dependencies = [ + "app_units", + "bitflags 2.13.0", + "byteorder", + "crossbeam-channel", + "euclid", + "malloc_size_of_derive", + "peek-poke", + "serde", + "serde_bytes", + "serde_derive", + "wr_malloc_size_of", + "zeitstempel", +] + +[[package]] +name = "webrender_build" +version = "0.68.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e6165a81201892371061250bd6f08ede9ed7279842fedc4033f48582a789068" +dependencies = [ + "bitflags 2.13.0", + "lazy_static", +] + [[package]] name = "webview2-com" version = "0.39.1" @@ -9600,8 +13994,8 @@ checksum = "3f89fca7a704cee10dcb3654c1dbb8941d1783132f1917358af75bec37a7d7e6" dependencies = [ "webview2-com-macros", "webview2-com-sys", - "windows", - "windows-core", + "windows 0.62.2", + "windows-core 0.62.2", ] [[package]] @@ -9622,8 +14016,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3a07132775117d6065853d9d1178157b8c90e228de47129d6bce2c7edebedfb" dependencies = [ "thiserror 2.0.18", - "windows", - "windows-core", + "windows 0.62.2", + "windows-core 0.62.2", ] [[package]] @@ -9632,6 +14026,123 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" +[[package]] +name = "wgpu-core" +version = "26.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f62f1053bd28c2268f42916f31588f81f64796e2ff91b81293515017ca8bd9" +dependencies = [ + "arrayvec", + "bit-set", + "bit-vec", + "bitflags 2.13.0", + "cfg_aliases", + "document-features", + "hashbrown 0.15.5", + "indexmap", + "log", + "naga", + "once_cell", + "parking_lot", + "profiling", + "rustc-hash 1.1.0", + "serde", + "smallvec", + "thiserror 2.0.18", + "wgpu-core-deps-apple", + "wgpu-core-deps-emscripten", + "wgpu-core-deps-windows-linux-android", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core-deps-apple" +version = "26.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18ae5fbde6a4cbebae38358aa73fcd6e0f15c6144b67ef5dc91ded0db125dbdf" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-emscripten" +version = "26.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7670e390f416006f746b4600fdd9136455e3627f5bd763abf9a65daa216dd2d" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-windows-linux-android" +version = "26.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "720a5cb9d12b3d337c15ff0e24d3e97ed11490ff3f7506e7f3d98c68fa5d6f14" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-hal" +version = "26.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d0e67224cc7305b3b4eb2cc57ca4c4c3afc665c1d1bee162ea806e19c47bdd" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bit-set", + "bitflags 2.13.0", + "block", + "bytemuck", + "cfg-if", + "cfg_aliases", + "core-graphics-types 0.2.0", + "glow", + "glutin_wgl_sys", + "gpu-alloc", + "gpu-allocator", + "gpu-descriptor", + "hashbrown 0.15.5", + "js-sys", + "khronos-egl", + "libc", + "libloading", + "log", + "metal", + "naga", + "ndk-sys", + "objc", + "ordered-float", + "parking_lot", + "profiling", + "range-alloc", + "raw-window-handle", + "smallvec", + "thiserror 2.0.18", + "wasm-bindgen", + "web-sys", + "wgpu-types", + "windows 0.58.0", + "windows-core 0.58.0", +] + +[[package]] +name = "wgpu-types" +version = "26.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca7a8d8af57c18f57d393601a1fb159ace8b2328f1b6b5f80893f7d672c9ae2" +dependencies = [ + "bitflags 2.13.0", + "bytemuck", + "js-sys", + "log", + "serde", + "thiserror 2.0.18", + "web-sys", +] + [[package]] name = "which" version = "8.0.4" @@ -9670,39 +14181,97 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] -name = "winapi-util" -version = "0.1.11" +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core 0.58.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections 0.2.0", + "windows-core 0.61.2", + "windows-future 0.2.1", + "windows-link 0.1.3", + "windows-numerics 0.2.0", +] + +[[package]] +name = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections 0.3.2", + "windows-core 0.62.2", + "windows-future 0.3.2", + "windows-numerics 0.3.1", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" dependencies = [ - "windows-sys 0.61.2", + "windows-core 0.61.2", ] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "windows-collections" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +dependencies = [ + "windows-core 0.62.2", +] [[package]] -name = "windows" -version = "0.62.2" +name = "windows-core" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" dependencies = [ - "windows-collections", - "windows-core", - "windows-future", - "windows-numerics", + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings 0.1.0", + "windows-targets 0.52.6", ] [[package]] -name = "windows-collections" -version = "0.3.2" +name = "windows-core" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ - "windows-core", + "windows-implement 0.60.2", + "windows-interface 0.59.3", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", ] [[package]] @@ -9711,11 +14280,22 @@ version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", + "windows-implement 0.60.2", + "windows-interface 0.59.3", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading 0.1.0", ] [[package]] @@ -9724,9 +14304,20 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" dependencies = [ - "windows-core", - "windows-link", - "windows-threading", + "windows-core 0.62.2", + "windows-link 0.2.1", + "windows-threading 0.2.1", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", ] [[package]] @@ -9740,6 +14331,17 @@ dependencies = [ "syn 2.0.118", ] +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", +] + [[package]] name = "windows-interface" version = "0.59.3" @@ -9751,20 +14353,36 @@ dependencies = [ "syn 2.0.118", ] +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + [[package]] name = "windows-numerics" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" dependencies = [ - "windows-core", - "windows-link", + "windows-core 0.62.2", + "windows-link 0.2.1", ] [[package]] @@ -9773,9 +14391,27 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" dependencies = [ - "windows-link", - "windows-result", - "windows-strings", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", ] [[package]] @@ -9784,7 +14420,26 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-link", + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result 0.2.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", ] [[package]] @@ -9793,7 +14448,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -9847,7 +14502,7 @@ version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -9902,7 +14557,7 @@ version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows-link", + "windows-link 0.2.1", "windows_aarch64_gnullvm 0.53.1", "windows_aarch64_msvc 0.53.1", "windows_i686_gnu 0.53.1", @@ -9913,13 +14568,22 @@ dependencies = [ "windows_x86_64_msvc 0.53.1", ] +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + [[package]] name = "windows-threading" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" dependencies = [ - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -10120,12 +14784,72 @@ dependencies = [ "memchr", ] +[[package]] +name = "wio" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5" +dependencies = [ + "winapi", +] + [[package]] name = "wit-bindgen" version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" +[[package]] +name = "wr_glyph_rasterizer" +version = "0.68.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4fcffa889d25131fc7c6ec8a558aa7c78d6030eaa17e31695c172adcc4eb0b" +dependencies = [ + "core-foundation 0.9.4", + "core-graphics", + "core-text", + "dwrote", + "euclid", + "freetype", + "lazy_static", + "libc", + "log", + "malloc_size_of_derive", + "objc", + "rayon", + "rustc-hash 2.1.2", + "serde", + "smallvec", + "tracy-rs", + "webrender_api", + "wr_malloc_size_of", +] + +[[package]] +name = "wr_malloc_size_of" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "482308b684f11723b200a32808094bb460b5ac4840903ccbcb78ad92a6354a1f" +dependencies = [ + "app_units", + "euclid", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +dependencies = [ + "either", +] + [[package]] name = "writeable" version = "0.6.3" @@ -10141,6 +14865,34 @@ dependencies = [ "tap", ] +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" +dependencies = [ + "gethostname", + "rustix", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" + [[package]] name = "x25519-dalek" version = "2.0.1" @@ -10184,6 +14936,40 @@ dependencies = [ "rustix", ] +[[package]] +name = "xi-unicode" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a67300977d3dc3f8034dae89778f502b6ba20b269527b3223ba59c0cf393bb8a" + +[[package]] +name = "xml" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "636f85e5ca6488e96401b61eb7de54f4e44755c988af0f52cf90230c312a1a89" + +[[package]] +name = "xml-rs" +version = "0.8.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" + +[[package]] +name = "xml5ever" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab627f34ff61b80d756180d556f9c68801d836d271b3b8c094504ceca69d221" +dependencies = [ + "log", + "markup5ever", +] + +[[package]] +name = "xmlwriter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" + [[package]] name = "xxhash-rust" version = "0.8.15" @@ -10196,6 +14982,29 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" +[[package]] +name = "yeslogic-fontconfig-sys" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d8b8abf912b9a29ff112e1671c97c33636903d13a69712037190e6805af4f76" +dependencies = [ + "dlib", + "once_cell", + "pkg-config", +] + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive 0.7.5", + "zerofrom", +] + [[package]] name = "yoke" version = "0.8.3" @@ -10203,10 +15012,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ "stable_deref_trait", - "yoke-derive", + "yoke-derive 0.8.2", "zerofrom", ] +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", + "synstructure", +] + [[package]] name = "yoke-derive" version = "0.8.2" @@ -10281,6 +15102,18 @@ dependencies = [ "zvariant", ] +[[package]] +name = "zeitstempel" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94652f036694517fa67509942c3b60a51a19e1cd9cfd0f456eeb830ae8798d3d" +dependencies = [ + "cfg-if", + "libc", + "once_cell", + "winapi", +] + [[package]] name = "zerocopy" version = "0.8.52" @@ -10342,6 +15175,17 @@ dependencies = [ "syn 2.0.118", ] +[[package]] +name = "zerotrie" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb594dd55d87335c5f60177cee24f19457a5ec10a065e0a3014722ad252d0a1f" +dependencies = [ + "displaydoc", + "yoke 0.7.5", + "zerofrom", +] + [[package]] name = "zerotrie" version = "0.2.4" @@ -10349,9 +15193,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", - "yoke", + "yoke 0.8.3", + "zerofrom", + "zerovec 0.11.6", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke 0.7.5", "zerofrom", - "zerovec", + "zerovec-derive 0.10.3", ] [[package]] @@ -10361,9 +15216,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "serde", - "yoke", + "yoke 0.8.3", "zerofrom", - "zerovec-derive", + "zerovec-derive 0.11.3", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.118", ] [[package]] @@ -10456,6 +15322,12 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + [[package]] name = "zune-core" version = "0.5.1" @@ -10471,13 +15343,22 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "zune-jpeg" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" +dependencies = [ + "zune-core 0.4.12", +] + [[package]] name = "zune-jpeg" version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" dependencies = [ - "zune-core", + "zune-core 0.5.1", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 3401365d2a..ae4e604d34 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -445,3 +445,9 @@ perry-codegen-wasm = { path = "crates/perry-codegen-wasm" } perry-ui-testkit = { path = "crates/perry-ui-testkit" } perry-audio-miniaudio = { path = "crates/perry-audio-miniaudio" } perry-updater = { path = "crates/perry-updater" } + +# Experimental: fork of servo-script migrated from ml-kem 0.2 -> 0.3.2 so its +# WebCrypto ML-KEM coexists with perry's ml-kem 0.3.2 (pkcs8). Enables the +# in-process Servo webview (servo-webview feature). See servo-forks/servo-script. +[patch.crates-io] +servo-script = { path = "../servo-forks/servo-script" } diff --git a/crates/perry-ui-macos/Cargo.toml b/crates/perry-ui-macos/Cargo.toml index 3fc0c99fd3..8048feba31 100644 --- a/crates/perry-ui-macos/Cargo.toml +++ b/crates/perry-ui-macos/Cargo.toml @@ -10,9 +10,11 @@ crate-type = ["rlib", "staticlib"] default = [] plugins = [] geisterhand = [] +servo-webview = ["dep:servo"] [dependencies] perry-ui = { path = "../perry-ui" } +servo = { version = "0.1", optional = true } perry-ui-testkit = { workspace = true } base64 = "0.22" block2 = "0.6" diff --git a/docs/servo/README.md b/docs/servo/README.md new file mode 100644 index 0000000000..ada6f64524 --- /dev/null +++ b/docs/servo/README.md @@ -0,0 +1,58 @@ +# In-process Servo web engine (experimental) + +`perry-ui-macos` can optionally use [Servo](https://servo.org) as an alternative +web engine to the system WKWebView, selected at runtime via `PERRY_WEBVIEW=servo`. +Enabled by the `servo-webview` cargo feature (off by default — pulls the full +Servo stack incl. SpiderMonkey). + +## Dependency conflicts (and how they're resolved) + +Embedding Servo in-process means unifying its ~835-crate tree with perry's. Two +hard version conflicts had to be resolved: + +1. **`libsqlite3-sys`** (`links = "sqlite3"` → one version per workspace). + Servo pulls `rusqlite 0.37 → libsqlite3-sys 0.35`; perry pinned older. + Fixed by upgrading perry's sqlite stack: `rusqlite 0.32→0.37` and + `sqlx 0.8.6→0.9.0` (see the `chore/align-libsqlite3-for-servo` PR). Clean, + stable upgrade — landed independently of Servo. + +2. **`ml-kem`** (post-quantum KEM, used by both perry's WebCrypto and Servo's). + Perry needs `ml-kem 0.3.2` + the `pkcs8` feature (stable `kem 0.3.0`); Servo's + `servo-script` needs `ml-kem 0.2.x`, which pins a *pre-release* `kem + =0.3.0-pre.0` and lacks `pkcs8`. Irreconcilable in one workspace. + Fixed by **forking `servo-script`** and migrating its WebCrypto ML-KEM code + from ml-kem 0.2 → 0.3.2 (so both sides share 0.3.2). The migration is captured + in `servo-script-ml-kem-0.3.2.patch` (332 lines, 3 files) and applied via a + local `[patch.crates-io]`. + + `ml-dsa` (the sibling ML-DSA/Dilithium crate Servo also uses) is **not** a + conflict — perry doesn't depend on it. + +## Reproducing the fork + +```sh +# 1. Vendor servo-script from the registry into a sibling dir: +cp -R ~/.cargo/registry/src/*/servo-script-0.1.0 ../servo-forks/servo-script +chmod -R u+w ../servo-forks/servo-script +# 2. Apply the ml-kem 0.3.2 migration: +cd ../servo-forks/servo-script && patch -p0 < .../docs/servo/servo-script-ml-kem-0.3.2.patch +``` + +The workspace `Cargo.toml` then carries: +```toml +[patch.crates-io] +servo-script = { path = "../servo-forks/servo-script" } +``` + +For a landable PR the fork needs a permanent home (git fork/submodule or in-tree +vendor) rather than the local path above. + +## ML-KEM migration: correctness note + +The migration is **type-correct** (the full Servo stack compiles). Behavioral +equivalence was reasoned per call-site (`from_seed` ≡ `generate_deterministic`, +`ExpandedKeyEncoding::to_expanded_bytes` ≡ the old `EncodedSizeUser::as_bytes`, +no-arg `encapsulate()` OS entropy ≡ `OsRng`) but **not** verified against Servo's +WebCrypto ML-KEM test vectors. ML-KEM WebCrypto is a niche surface; page +rendering is unaffected. Verify with Servo's WPT WebCrypto suite before relying +on it. diff --git a/docs/servo/servo-script-ml-kem-0.3.2.patch b/docs/servo/servo-script-ml-kem-0.3.2.patch new file mode 100644 index 0000000000..4bc48931a9 --- /dev/null +++ b/docs/servo/servo-script-ml-kem-0.3.2.patch @@ -0,0 +1,332 @@ +--- /Users/amlug/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/servo-script-0.1.0/Cargo.toml 2006-07-24 03:21:28 ++++ /Users/amlug/projects/perry-worktrees/servo-forks/servo-script/Cargo.toml 2026-06-29 16:42:36 +@@ -293,8 +293,8 @@ + version = "0.0.4" + + [dependencies.ml-kem] +-version = "0.2" +-features = ["deterministic"] ++version = "0.3.2" ++features = ["getrandom"] + + [dependencies.net_traits] + version = "0.1.0" +--- /Users/amlug/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/servo-script-0.1.0/dom/subtlecrypto/ml_kem_operation.rs 2006-07-24 03:21:28 ++++ /Users/amlug/projects/perry-worktrees/servo-forks/servo-script/dom/subtlecrypto/ml_kem_operation.rs 2026-06-29 16:43:00 +@@ -5,11 +5,16 @@ + use der::asn1::{BitString, OctetString}; + use der::{AnyRef, Choice, Decode, Encode, Sequence}; + use js::context::JSContext; +-use ml_kem::kem::{Decapsulate, Encapsulate, EncapsulationKey}; + use ml_kem::{ +- B32, Encoded, EncodedSizeUser, KemCore, MlKem512, MlKem512Params, MlKem768, MlKem768Params, +- MlKem1024, MlKem1024Params, ++ B32, Ciphertext, Decapsulate, DecapsulationKey, Encapsulate, EncapsulationKey, Key, KeyExport, ++ MlKem512, MlKem768, MlKem1024, + }; ++// `ExpandedKeyEncoding` is deprecated in ml-kem 0.3.x, but it is the only API exposing the expanded ++// FIPS-203 decapsulation-key encoding (`dk_pke || ek_pke || H(ek) || z`). We need it to preserve ++// the seed/expanded-key consistency check in `convert_seed_to_handles`, which previously relied on ++// the (now seed-returning) `DecapsulationKey::as_bytes()`. ++#[allow(deprecated)] ++use ml_kem::ExpandedKeyEncoding; + use pkcs8::rand_core::{OsRng, RngCore}; + use pkcs8::spki::AlgorithmIdentifier; + use pkcs8::{ObjectIdentifier, PrivateKeyInfo, SubjectPublicKeyInfo}; +@@ -153,10 +158,19 @@ + "The key handle is not representing an ML-KEM-512 public key".to_string(), + ))); + }; +- let ek = EncapsulationKey::::from_bytes(encoded_ek); +- let (encoded_ciphertext, shared_key) = ek.encapsulate(&mut OsRng).map_err(|_| { +- Error::Operation(Some("Failed to perform ML-KEM encapsulation".to_string())) ++ let ek = EncapsulationKey::::new(encoded_ek).map_err(|_| { ++ Error::Operation(Some( ++ "The ML-KEM-512 encapsulation key failed the FIPS-203 Section 7.2 check" ++ .to_string(), ++ )) + })?; ++ // MIGRATION-NOTE: 0.2 used `ek.encapsulate(&mut OsRng)`. The literal 0.3.2 analogue ++ // `encapsulate_with_rng(&mut OsRng)` is NOT viable here: `pkcs8::rand_core::OsRng` is ++ // rand_core 0.6 (pkcs8 0.10), while ml-kem 0.3.2 requires a rand_core 0.10 `CryptoRng`, ++ // and rand_core 0.10 has no `OsRng`. `encapsulate()` (enabled by the `getrandom` ++ // feature) draws from the OS CSPRNG internally (`UnwrapErr(SysRng)`), the same entropy ++ // source as the old `OsRng`, so FIPS-203 ML-KEM.Encaps semantics are preserved. ++ let (encoded_ciphertext, shared_key) = ek.encapsulate(); + (shared_key.to_vec(), encoded_ciphertext.to_vec()) + }, + CryptoAlgorithm::MlKem768 => { +@@ -165,10 +179,14 @@ + "The key handle is not representing an ML-KEM-768 public key".to_string(), + ))); + }; +- let ek = EncapsulationKey::::from_bytes(encoded_ek); +- let (encoded_ciphertext, shared_key) = ek.encapsulate(&mut OsRng).map_err(|_| { +- Error::Operation(Some("Failed to perform ML-KEM encapsulation".to_string())) ++ let ek = EncapsulationKey::::new(encoded_ek).map_err(|_| { ++ Error::Operation(Some( ++ "The ML-KEM-768 encapsulation key failed the FIPS-203 Section 7.2 check" ++ .to_string(), ++ )) + })?; ++ // MIGRATION-NOTE: see the ML-KEM-512 arm above re: `encapsulate()` vs OsRng. ++ let (encoded_ciphertext, shared_key) = ek.encapsulate(); + (shared_key.to_vec(), encoded_ciphertext.to_vec()) + }, + CryptoAlgorithm::MlKem1024 => { +@@ -177,10 +195,14 @@ + "The key handle is not representing an ML-KEM-1024 public key".to_string(), + ))); + }; +- let ek = EncapsulationKey::::from_bytes(encoded_ek); +- let (encoded_ciphertext, shared_key) = ek.encapsulate(&mut OsRng).map_err(|_| { +- Error::Operation(Some("Failed to perform ML-KEM encapsulation".to_string())) ++ let ek = EncapsulationKey::::new(encoded_ek).map_err(|_| { ++ Error::Operation(Some( ++ "The ML-KEM-1024 encapsulation key failed the FIPS-203 Section 7.2 check" ++ .to_string(), ++ )) + })?; ++ // MIGRATION-NOTE: see the ML-KEM-512 arm above re: `encapsulate()` vs OsRng. ++ let (encoded_ciphertext, shared_key) = ek.encapsulate(); + (shared_key.to_vec(), encoded_ciphertext.to_vec()) + }, + _ => { +@@ -235,15 +257,11 @@ + "The key handle is not representing an ML-KEM-512 private key".to_string(), + ))); + }; +- let ciphertext = ciphertext ++ let ciphertext: Ciphertext = ciphertext + .try_into() + .map_err(|_| Error::Operation(Some("Failed to load the ciphertext".to_string())))?; +- let (dk, _) = MlKem512::generate_deterministic(&seed.0, &seed.1); +- dk.decapsulate(ciphertext) +- .map_err(|_| { +- Error::Operation(Some("Failed to perform ML-KEM decapsulation".to_string())) +- })? +- .to_vec() ++ let dk = DecapsulationKey::::from_seed(seed.0.concat(seed.1)); ++ dk.decapsulate(&ciphertext).to_vec() + }, + CryptoAlgorithm::MlKem768 => { + let Handle::MlKem768PrivateKey(seed) = key.handle() else { +@@ -251,15 +269,11 @@ + "The key handle is not representing an ML-KEM-768 private key".to_string(), + ))); + }; +- let ciphertext = ciphertext ++ let ciphertext: Ciphertext = ciphertext + .try_into() + .map_err(|_| Error::Operation(Some("Failed to load the ciphertext".to_string())))?; +- let (dk, _) = MlKem768::generate_deterministic(&seed.0, &seed.1); +- dk.decapsulate(ciphertext) +- .map_err(|_| { +- Error::Operation(Some("Failed to perform ML-KEM decapsulation".to_string())) +- })? +- .to_vec() ++ let dk = DecapsulationKey::::from_seed(seed.0.concat(seed.1)); ++ dk.decapsulate(&ciphertext).to_vec() + }, + CryptoAlgorithm::MlKem1024 => { + let Handle::MlKem1024PrivateKey(seed) = key.handle() else { +@@ -267,15 +281,11 @@ + "The key handle is not representing an ML-KEM-1024 private key".to_string(), + ))); + }; +- let ciphertext = ciphertext ++ let ciphertext: Ciphertext = ciphertext + .try_into() + .map_err(|_| Error::Operation(Some("Failed to load the ciphertext".to_string())))?; +- let (dk, _) = MlKem1024::generate_deterministic(&seed.0, &seed.1); +- dk.decapsulate(ciphertext) +- .map_err(|_| { +- Error::Operation(Some("Failed to perform ML-KEM decapsulation".to_string())) +- })? +- .to_vec() ++ let dk = DecapsulationKey::::from_seed(seed.0.concat(seed.1)); ++ dk.decapsulate(&ciphertext).to_vec() + }, + _ => { + return Err(Error::NotSupported(Some(format!( +@@ -1209,16 +1219,22 @@ + })?; + let handles = match algorithm_name { + CryptoAlgorithm::MlKem512 => { +- let (decapsulation_key, encapsulation_key) = MlKem512::generate_deterministic(&d, &z); ++ let decapsulation_key = DecapsulationKey::::from_seed(d.concat(z)); ++ let encapsulation_key = decapsulation_key.encapsulation_key(); + if let Some(private_key_bytes) = private_key_bytes { +- if private_key_bytes != decapsulation_key.as_bytes().as_slice() { ++ // NOTE: `DecapsulationKey::to_bytes()` now returns the 64-byte seed, so we use the ++ // deprecated `to_expanded_bytes()` to recover the expanded FIPS-203 encoding ++ // (`dk_pke || ek_pke || H(ek) || z`) and keep the original consistency check. ++ #[allow(deprecated)] ++ let expanded_private_key = decapsulation_key.to_expanded_bytes(); ++ if private_key_bytes != expanded_private_key.as_slice() { + return Err(Error::Data(Some( + "The expanded private key does not match the seed".to_string(), + ))); + } + } + if let Some(public_key_bytes) = public_key_bytes { +- if public_key_bytes != encapsulation_key.as_bytes().as_slice() { ++ if public_key_bytes != encapsulation_key.to_bytes().as_slice() { + return Err(Error::Data(Some( + "The public key does not match the seed".to_string(), + ))); +@@ -1227,20 +1243,26 @@ + + ( + Handle::MlKem512PrivateKey((d, z)), +- Handle::MlKem512PublicKey(Box::new(encapsulation_key.as_bytes())), ++ Handle::MlKem512PublicKey(Box::new(encapsulation_key.to_bytes())), + ) + }, + CryptoAlgorithm::MlKem768 => { +- let (decapsulation_key, encapsulation_key) = MlKem768::generate_deterministic(&d, &z); ++ let decapsulation_key = DecapsulationKey::::from_seed(d.concat(z)); ++ let encapsulation_key = decapsulation_key.encapsulation_key(); + if let Some(private_key_bytes) = private_key_bytes { +- if private_key_bytes != decapsulation_key.as_bytes().as_slice() { ++ // NOTE: `DecapsulationKey::to_bytes()` now returns the 64-byte seed, so we use the ++ // deprecated `to_expanded_bytes()` to recover the expanded FIPS-203 encoding ++ // (`dk_pke || ek_pke || H(ek) || z`) and keep the original consistency check. ++ #[allow(deprecated)] ++ let expanded_private_key = decapsulation_key.to_expanded_bytes(); ++ if private_key_bytes != expanded_private_key.as_slice() { + return Err(Error::Data(Some( + "The expanded private key does not match the seed".to_string(), + ))); + } + } + if let Some(public_key_bytes) = public_key_bytes { +- if public_key_bytes != encapsulation_key.as_bytes().as_slice() { ++ if public_key_bytes != encapsulation_key.to_bytes().as_slice() { + return Err(Error::Data(Some( + "The public key does not match the seed".to_string(), + ))); +@@ -1249,20 +1271,26 @@ + + ( + Handle::MlKem768PrivateKey((d, z)), +- Handle::MlKem768PublicKey(Box::new(encapsulation_key.as_bytes())), ++ Handle::MlKem768PublicKey(Box::new(encapsulation_key.to_bytes())), + ) + }, + CryptoAlgorithm::MlKem1024 => { +- let (decapsulation_key, encapsulation_key) = MlKem1024::generate_deterministic(&d, &z); ++ let decapsulation_key = DecapsulationKey::::from_seed(d.concat(z)); ++ let encapsulation_key = decapsulation_key.encapsulation_key(); + if let Some(private_key_bytes) = private_key_bytes { +- if private_key_bytes != decapsulation_key.as_bytes().as_slice() { ++ // NOTE: `DecapsulationKey::to_bytes()` now returns the 64-byte seed, so we use the ++ // deprecated `to_expanded_bytes()` to recover the expanded FIPS-203 encoding ++ // (`dk_pke || ek_pke || H(ek) || z`) and keep the original consistency check. ++ #[allow(deprecated)] ++ let expanded_private_key = decapsulation_key.to_expanded_bytes(); ++ if private_key_bytes != expanded_private_key.as_slice() { + return Err(Error::Data(Some( + "The expanded private key does not match the seed".to_string(), + ))); + } + } + if let Some(public_key_bytes) = public_key_bytes { +- if public_key_bytes != encapsulation_key.as_bytes().as_slice() { ++ if public_key_bytes != encapsulation_key.to_bytes().as_slice() { + return Err(Error::Data(Some( + "The public key does not match the seed".to_string(), + ))); +@@ -1271,7 +1299,7 @@ + + ( + Handle::MlKem1024PrivateKey((d, z)), +- Handle::MlKem1024PublicKey(Box::new(encapsulation_key.as_bytes())), ++ Handle::MlKem1024PublicKey(Box::new(encapsulation_key.to_bytes())), + ) + }, + _ => { +@@ -1293,24 +1321,24 @@ + ) -> Result { + let public_key_handle = match algorithm_name { + CryptoAlgorithm::MlKem512 => { +- let encoded_encapsulation_key = Encoded::>::try_from( +- public_key_bytes, +- ) +- .map_err(|_| Error::Data(Some("Failed to parse ML-KEM public key".to_string())))?; ++ let encoded_encapsulation_key = ++ Key::>::try_from(public_key_bytes).map_err(|_| { ++ Error::Data(Some("Failed to parse ML-KEM public key".to_string())) ++ })?; + Handle::MlKem512PublicKey(Box::new(encoded_encapsulation_key)) + }, + CryptoAlgorithm::MlKem768 => { +- let encoded_encapsulation_key = Encoded::>::try_from( +- public_key_bytes, +- ) +- .map_err(|_| Error::Data(Some("Failed to parse ML-KEM public key".to_string())))?; ++ let encoded_encapsulation_key = ++ Key::>::try_from(public_key_bytes).map_err(|_| { ++ Error::Data(Some("Failed to parse ML-KEM public key".to_string())) ++ })?; + Handle::MlKem768PublicKey(Box::new(encoded_encapsulation_key)) + }, + CryptoAlgorithm::MlKem1024 => { +- let encoded_encapsulation_key = Encoded::>::try_from( +- public_key_bytes, +- ) +- .map_err(|_| Error::Data(Some("Failed to parse ML-KEM public key".to_string())))?; ++ let encoded_encapsulation_key = ++ Key::>::try_from(public_key_bytes).map_err(|_| { ++ Error::Data(Some("Failed to parse ML-KEM public key".to_string())) ++ })?; + Handle::MlKem1024PublicKey(Box::new(encoded_encapsulation_key)) + }, + _ => { +@@ -1331,20 +1359,23 @@ + Handle::MlKem512PrivateKey((d, z)) => { + let mut seed = d.to_vec(); + seed.extend_from_slice(z); +- let (_private_key, public_key) = MlKem512::generate_deterministic(d, z); +- (seed, public_key.as_bytes().to_vec()) ++ let decapsulation_key = DecapsulationKey::::from_seed(d.concat(*z)); ++ let public_key = decapsulation_key.encapsulation_key(); ++ (seed, public_key.to_bytes().to_vec()) + }, + Handle::MlKem768PrivateKey((d, z)) => { + let mut seed = d.to_vec(); + seed.extend_from_slice(z); +- let (_private_key, public_key) = MlKem768::generate_deterministic(d, z); +- (seed, public_key.as_bytes().to_vec()) ++ let decapsulation_key = DecapsulationKey::::from_seed(d.concat(*z)); ++ let public_key = decapsulation_key.encapsulation_key(); ++ (seed, public_key.to_bytes().to_vec()) + }, + Handle::MlKem1024PrivateKey((d, z)) => { + let mut seed = d.to_vec(); + seed.extend_from_slice(z); +- let (_private_key, public_key) = MlKem1024::generate_deterministic(d, z); +- (seed, public_key.as_bytes().to_vec()) ++ let decapsulation_key = DecapsulationKey::::from_seed(d.concat(*z)); ++ let public_key = decapsulation_key.encapsulation_key(); ++ (seed, public_key.to_bytes().to_vec()) + }, + _ => { + return Err(Error::Operation(Some( +--- /Users/amlug/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/servo-script-0.1.0/dom/cryptokey.rs 2006-07-24 03:21:28 ++++ /Users/amlug/projects/perry-worktrees/servo-forks/servo-script/dom/cryptokey.rs 2026-06-29 16:38:59 +@@ -48,11 +48,9 @@ + MlKem512PrivateKey((ml_kem::B32, ml_kem::B32)), + MlKem768PrivateKey((ml_kem::B32, ml_kem::B32)), + MlKem1024PrivateKey((ml_kem::B32, ml_kem::B32)), +- MlKem512PublicKey(Box>>), +- MlKem768PublicKey(Box>>), +- MlKem1024PublicKey( +- Box>>, +- ), ++ MlKem512PublicKey(Box>>), ++ MlKem768PublicKey(Box>>), ++ MlKem1024PublicKey(Box>>), + MlDsa44PrivateKey(ml_dsa::B32), + MlDsa65PrivateKey(ml_dsa::B32), + MlDsa87PrivateKey(ml_dsa::B32), From 7017923d6fbf485dc05bc94ae1451d6aef172615 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Mon, 29 Jun 2026 17:48:46 +0200 Subject: [PATCH 06/11] feat(servo): ServoEngine backend for the WebView widget (PERRY_WEBVIEW=servo) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds an experimental Servo-backed implementation of the WebView widget, selectable at runtime via PERRY_WEBVIEW=servo (feature `servo-webview`, off by default — the default build still links only the system WKWebView). - servo_webview.rs: ServoEngine renders offscreen via SoftwareRenderingContext (the proven probe path) and blits each frame into a layer-backed NSImageView using NSBitmapImageRep, driven by a shared ~60 Hz NSTimer on the main run loop. Software+blit (not WindowRenderingContext) because perry adds widget NSViews to the window lazily, which would race a GPU context's window-handle requirement. - webview.rs: create() routes to the Servo engine when requested (falling back to WKWebView on engine-construction failure); load_url/reload/evaluate_js/ set_on_loaded dispatch to the engine when the handle is Servo-backed. - evaluate_javascript bridges Servo's JSValue back to the TS callback as a string (matching the WKWebView contract); onLoaded fires on LoadStatus::Complete. Verified: builds with --features servo-webview (full Servo stack) AND the default build is unaffected by the cfg gating. On-screen rendering is GUI-verified. (cherry picked from commit fa2c7944ea44093d8e3cde59e47cfd188dc06907) --- Cargo.lock | 2 + crates/perry-ui-macos/Cargo.toml | 4 +- crates/perry-ui-macos/src/widgets/mod.rs | 3 + .../src/widgets/servo_webview.rs | 331 ++++++++++++++++++ crates/perry-ui-macos/src/widgets/webview.rs | 30 ++ 5 files changed, 369 insertions(+), 1 deletion(-) create mode 100644 crates/perry-ui-macos/src/widgets/servo_webview.rs diff --git a/Cargo.lock b/Cargo.lock index 787d5fec81..0ad4c196a3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8101,6 +8101,7 @@ version = "0.5.1208" dependencies = [ "base64 0.22.1", "block2", + "dpi", "libc", "objc2", "objc2-app-kit", @@ -8109,6 +8110,7 @@ dependencies = [ "perry-ui", "perry-ui-testkit", "servo", + "url", ] [[package]] diff --git a/crates/perry-ui-macos/Cargo.toml b/crates/perry-ui-macos/Cargo.toml index 8048feba31..f41ca57f35 100644 --- a/crates/perry-ui-macos/Cargo.toml +++ b/crates/perry-ui-macos/Cargo.toml @@ -10,11 +10,13 @@ crate-type = ["rlib", "staticlib"] default = [] plugins = [] geisterhand = [] -servo-webview = ["dep:servo"] +servo-webview = ["dep:servo", "dep:url", "dep:dpi"] [dependencies] perry-ui = { path = "../perry-ui" } servo = { version = "0.1", optional = true } +url = { version = "2", optional = true } +dpi = { version = "0.1", optional = true } perry-ui-testkit = { workspace = true } base64 = "0.22" block2 = "0.6" diff --git a/crates/perry-ui-macos/src/widgets/mod.rs b/crates/perry-ui-macos/src/widgets/mod.rs index 4da3a9a75d..b284beaa6a 100644 --- a/crates/perry-ui-macos/src/widgets/mod.rs +++ b/crates/perry-ui-macos/src/widgets/mod.rs @@ -28,6 +28,9 @@ pub mod rich_text; pub mod rich_tooltip; pub mod scrollview; pub mod securefield; +/// Experimental Servo web-engine backend (off by default; `PERRY_WEBVIEW=servo`). +#[cfg(feature = "servo-webview")] +pub mod servo_webview; pub mod sheet; pub mod slider; pub mod spacer; diff --git a/crates/perry-ui-macos/src/widgets/servo_webview.rs b/crates/perry-ui-macos/src/widgets/servo_webview.rs new file mode 100644 index 0000000000..88f76587ea --- /dev/null +++ b/crates/perry-ui-macos/src/widgets/servo_webview.rs @@ -0,0 +1,331 @@ +//! Experimental **Servo** web-engine backend for the WebView widget +//! (feature `servo-webview`, selected at runtime via `PERRY_WEBVIEW=servo`). +//! +//! Design: Servo renders **offscreen** into a [`SoftwareRenderingContext`] — the +//! exact path proven by the headless probe — and each frame is blitted into a +//! layer-backed `NSImageView` (the widget's view) via `NSBitmapImageRep`. An +//! `NSTimer` on the main run loop drives `spin_event_loop` + `paint` + `present` +//! + readback at ~60 Hz. +//! +//! Why software + blit instead of `WindowRenderingContext` (GPU into the view): +//! perry adds widget `NSView`s to the window **lazily** (deferred layout), so a +//! GPU rendering context — which needs a realized window handle at creation — +//! would race the layout. The software context has no window dependency, so the +//! engine is constructable the moment `create()` is called. Performance is +//! secondary for an experimental engine. +//! +//! This file is only compiled with `--features servo-webview`; the default build +//! (system WKWebView) never links Servo. + +use std::cell::{Cell, RefCell}; +use std::collections::HashMap; +use std::rc::Rc; + +use dpi::PhysicalSize; +use objc2::rc::Retained; +use objc2::runtime::{AnyClass, AnyObject}; +use objc2::{msg_send, MainThreadOnly}; +use objc2_app_kit::{NSImageView, NSView}; +use objc2_foundation::{MainThreadMarker, NSString}; +use servo::{ + DeviceIntRect, DeviceIntSize, LoadStatus, RenderingContext, Servo, ServoBuilder, + SoftwareRenderingContext, WebView, WebViewBuilder, WebViewDelegate, +}; +use url::Url; + +extern "C" { + fn js_closure_call0(closure: *const u8) -> f64; + fn js_closure_call1(closure: *const u8, arg: f64) -> f64; + fn js_nanbox_get_pointer(value: f64) -> i64; + fn js_string_from_bytes(ptr: *const u8, len: i64) -> *const u8; + fn js_nanbox_string(ptr: i64) -> f64; +} + +thread_local! { + /// Live Servo engines keyed by Perry widget handle. Lives on the main + /// thread only (Servo is `!Send`); the driver timer reads it on the main + /// run loop. + static ENGINES: RefCell>> = RefCell::new(HashMap::new()); + /// True once the shared driver `NSTimer` has been installed. + static TIMER_INSTALLED: Cell = const { Cell::new(false) }; +} + +/// `true` when the embedder asked for the Servo backend (`PERRY_WEBVIEW=servo`). +pub fn is_servo_requested() -> bool { + matches!(std::env::var("PERRY_WEBVIEW").as_deref(), Ok("servo")) +} + +/// `true` when `handle` is backed by a Servo engine (vs the system WKWebView). +pub fn has(handle: i64) -> bool { + ENGINES.with(|e| e.borrow().contains_key(&handle)) +} + +/// Servo's wake signal. We drive painting from a periodic timer, so this only +/// needs to ensure the main run loop wakes; the timer does the spinning. +#[derive(Clone)] +struct TimerWaker; +impl servo::EventLoopWaker for TimerWaker { + fn clone_box(&self) -> Box { + Box::new(self.clone()) + } + fn wake(&self) {} +} + +/// Per-webview delegate state: load status + the user's `onLoaded` closure. +struct ServoState { + loaded: Cell, + /// NaN-boxed `onLoaded` TS closure, or `0.0` if unset. + on_loaded: Cell, + /// Set by `notify_new_frame_ready`; cleared after a blit. + dirty: Cell, +} + +impl WebViewDelegate for ServoState { + fn notify_load_status_changed(&self, _webview: WebView, status: LoadStatus) { + if matches!(status, LoadStatus::Complete) && !self.loaded.replace(true) { + let cb = self.on_loaded.get(); + if cb != 0.0 { + crate::catch_callback_panic("servo webview onLoaded", || unsafe { + js_closure_call0(js_nanbox_get_pointer(cb) as *const u8); + }); + } + } + } + + fn notify_new_frame_ready(&self, _webview: WebView) { + self.dirty.set(true); + } +} + +/// A live Servo engine bound to one Perry widget view. +struct ServoEngine { + servo: Servo, + webview: WebView, + rc: Rc, + state: Rc, + /// Layer-backed `NSImageView` that displays the rendered frames. + view: Retained, + size: Cell<(u32, u32)>, +} + +impl ServoEngine { + /// One driver step: advance Servo, paint, present, and blit the frame. + fn tick(&self) { + self.servo.spin_event_loop(); + self.webview.paint(); + self.rc.present(); + let (w, h) = self.size.get(); + let rect = DeviceIntRect::from_size(DeviceIntSize::new(w as i32, h as i32)); + if let Some(img) = self.rc.read_to_image(rect) { + blit_rgba_to_image_view(&self.view, img.as_raw(), img.width(), img.height()); + } + self.state.dirty.set(false); + } +} + +/// Create a Servo-backed WebView widget. Returns the Perry widget handle (the +/// same contract as the WKWebView `create`). Falls back to handle `0` on +/// engine-construction failure so the caller can degrade gracefully. +pub fn create(url: &str, width: f64, height: f64) -> i64 { + let mtm = MainThreadMarker::new().expect("perry/ui must run on the main thread"); + let w = if width > 0.0 { width as u32 } else { 600 }; + let h = if height > 0.0 { height as u32 } else { 400 }; + + let rc = match SoftwareRenderingContext::new(PhysicalSize::new(w, h)) { + Ok(rc) => Rc::new(rc), + Err(_) => return 0, + }; + let _ = rc.make_current(); + + let servo = ServoBuilder::default() + .event_loop_waker(Box::new(TimerWaker)) + .build(); + + let state = Rc::new(ServoState { + loaded: Cell::new(false), + on_loaded: Cell::new(0.0), + dirty: Cell::new(true), + }); + + let mut builder = WebViewBuilder::new(&servo, rc.clone()).delegate(state.clone()); + if !url.is_empty() { + if let Ok(parsed) = Url::parse(url) { + builder = builder.url(parsed); + } + } + let webview = builder.build(); + webview.focus(); + webview.resize(PhysicalSize::new(w, h)); + + // The displayed surface: a layer-backed NSImageView sized to the widget. + let frame = objc2_core_foundation::CGRect::new( + objc2_core_foundation::CGPoint::new(0.0, 0.0), + objc2_core_foundation::CGSize::new(w as f64, h as f64), + ); + let view: Retained = + unsafe { msg_send![NSImageView::alloc(mtm), initWithFrame: frame] }; + unsafe { + let _: () = msg_send![&*view, setWantsLayer: true]; + // NSImageScaleAxesIndependently = 3 — stretch to fill the widget box. + let _: () = msg_send![&*view, setImageScaling: 3usize]; + } + + let view_ns: Retained = unsafe { Retained::cast_unchecked(view.clone()) }; + let handle = super::register_widget(view_ns); + + let engine = Rc::new(ServoEngine { + servo, + webview, + rc, + state, + view, + size: Cell::new((w, h)), + }); + // Paint the first frame immediately so the view isn't blank pre-load. + engine.tick(); + + ENGINES.with(|e| e.borrow_mut().insert(handle, engine)); + install_driver_timer(mtm); + handle +} + +/// Imperative `loadUrl` for a Servo-backed handle. +pub fn load_url(handle: i64, url: &str) { + if url.is_empty() { + return; + } + if let Ok(parsed) = Url::parse(url) { + ENGINES.with(|e| { + if let Some(engine) = e.borrow().get(&handle) { + engine.state.loaded.set(false); + engine.webview.load(parsed); + } + }); + } +} + +pub fn reload(handle: i64) { + ENGINES.with(|e| { + if let Some(engine) = e.borrow().get(&handle) { + engine.webview.reload(); + } + }); +} + +/// Async JS evaluation. Fires `callback(result_string)` — errors and +/// null/undefined collapse to the empty string, matching the WKWebView path. +pub fn evaluate_js(handle: i64, js: &str, callback: f64) { + ENGINES.with(|e| { + let borrow = e.borrow(); + let Some(engine) = borrow.get(&handle) else { + return; + }; + engine + .webview + .evaluate_javascript(js.to_string(), move |result| { + let s = match result { + Ok(v) => servo_jsvalue_to_string(&v), + Err(_) => String::new(), + }; + if callback != 0.0 { + crate::catch_callback_panic("servo webview evaluateJs callback", || unsafe { + let js_str = js_string_from_bytes(s.as_ptr(), s.len() as i64); + let boxed = js_nanbox_string(js_str as i64); + js_closure_call1(js_nanbox_get_pointer(callback) as *const u8, boxed); + }); + } + }); + }); +} + +/// Register the user's `onLoaded` closure for a Servo-backed handle. +pub fn set_on_loaded(handle: i64, closure: f64) { + ENGINES.with(|e| { + if let Some(engine) = e.borrow().get(&handle) { + engine.state.on_loaded.set(closure); + } + }); +} + +/// Best-effort stringify of a Servo `JSValue` for `evaluateJavaScript`. +fn servo_jsvalue_to_string(value: &servo::JSValue) -> String { + use servo::JSValue; + match value { + JSValue::String(s) => s.clone(), + JSValue::Number(n) => n.to_string(), + JSValue::Boolean(b) => b.to_string(), + _ => String::new(), + } +} + +/// Install the shared ~60 Hz driver timer once. It ticks every live engine on +/// the main run loop (where Servo lives). +fn install_driver_timer(_mtm: MainThreadMarker) { + if TIMER_INSTALLED.with(|t| t.replace(true)) { + return; + } + let block = block2::RcBlock::new(move |_timer: *mut AnyObject| { + ENGINES.with(|e| { + let engines: Vec> = e.borrow().values().cloned().collect(); + for engine in engines { + engine.tick(); + } + }); + }); + unsafe { + let timer_cls = AnyClass::get(c"NSTimer").expect("NSTimer"); + let _timer: *mut AnyObject = msg_send![ + timer_cls, + scheduledTimerWithTimeInterval: 0.016f64, + repeats: true, + block: &*block, + ]; + } + // The scheduled timer is retained by the run loop; the block by the timer. + std::mem::forget(block); +} + +/// Blit a tightly-packed RGBA8 buffer into `view` by wrapping it in an +/// `NSBitmapImageRep` (which allocates its own backing store and we memcpy into) +/// and setting it as the image-view's image. +fn blit_rgba_to_image_view(view: &NSImageView, rgba: &[u8], width: u32, height: u32) { + if width == 0 || height == 0 || rgba.len() < (width * height * 4) as usize { + return; + } + unsafe { + let rep_cls = AnyClass::get(c"NSBitmapImageRep").expect("NSBitmapImageRep"); + let alloc: *mut AnyObject = msg_send![rep_cls, alloc]; + // planes = NULL → the rep allocates its own buffer we then fill. + let null_planes: *mut *mut u8 = std::ptr::null_mut(); + let color_space = NSString::from_str("NSDeviceRGBColorSpace"); + let rep: *mut AnyObject = msg_send![ + alloc, + initWithBitmapDataPlanes: null_planes, + pixelsWide: width as isize, + pixelsHigh: height as isize, + bitsPerSample: 8isize, + samplesPerPixel: 4isize, + hasAlpha: true, + isPlanar: false, + colorSpaceName: &*color_space, + bytesPerRow: (width * 4) as isize, + bitsPerPixel: 32isize, + ]; + if rep.is_null() { + return; + } + let rep = Retained::from_raw(rep).expect("rep"); + let dst: *mut u8 = msg_send![&*rep, bitmapData]; + if !dst.is_null() { + std::ptr::copy_nonoverlapping(rgba.as_ptr(), dst, (width * height * 4) as usize); + } + + let img_cls = AnyClass::get(c"NSImage").expect("NSImage"); + let size = objc2_core_foundation::CGSize::new(width as f64, height as f64); + let image: *mut AnyObject = msg_send![img_cls, alloc]; + let image: *mut AnyObject = msg_send![image, initWithSize: size]; + let _: () = msg_send![image, addRepresentation: &*rep]; + let image = Retained::from_raw(image).expect("image"); + let _: () = msg_send![view, setImage: &*image]; + } +} diff --git a/crates/perry-ui-macos/src/widgets/webview.rs b/crates/perry-ui-macos/src/widgets/webview.rs index f5a7bfaba3..8f6140e2f6 100644 --- a/crates/perry-ui-macos/src/widgets/webview.rs +++ b/crates/perry-ui-macos/src/widgets/webview.rs @@ -557,6 +557,16 @@ pub fn create(url_ptr: *const u8, width: f64, height: f64, ephemeral_hint: f64) let url = str_from_header(url_ptr).to_string(); let mtm = MainThreadMarker::new().expect("perry/ui must run on the main thread"); + // Experimental Servo backend (PERRY_WEBVIEW=servo). On engine-construction + // failure we fall through to the system WKWebView below. + #[cfg(feature = "servo-webview")] + if super::servo_webview::is_servo_requested() { + let handle = super::servo_webview::create(&url, width, height); + if handle != 0 { + return handle; + } + } + // Preflight macOS TCC for camera + microphone. WKUIDelegate grants the // web-origin permission later, but the process still needs OS-level access. request_av_capture_access_once(); @@ -683,6 +693,11 @@ pub fn load_url(handle: i64, url_ptr: *const u8) { if url.is_empty() { return; } + #[cfg(feature = "servo-webview")] + if super::servo_webview::has(handle) { + super::servo_webview::load_url(handle, &url); + return; + } if let Some(wv) = webview_for_handle(handle) { unsafe { load_url_on_webview(wv, &url) }; } @@ -715,6 +730,11 @@ unsafe fn load_url_on_webview(webview: *mut AnyObject, url: &str) { } pub fn reload(handle: i64) { + #[cfg(feature = "servo-webview")] + if super::servo_webview::has(handle) { + super::servo_webview::reload(handle); + return; + } if let Some(wv) = webview_for_handle(handle) { unsafe { let _: *mut AnyObject = msg_send![wv, reload]; @@ -753,6 +773,11 @@ pub fn can_go_back(handle: i64) -> i64 { /// string for predictable user code (matches `localStorage.getItem` shape). pub fn evaluate_js(handle: i64, js_ptr: *const u8, callback: f64) { let js = str_from_header(js_ptr).to_string(); + #[cfg(feature = "servo-webview")] + if super::servo_webview::has(handle) { + super::servo_webview::evaluate_js(handle, &js, callback); + return; + } let wv = match webview_for_handle(handle) { Some(w) => w, None => return, @@ -894,6 +919,11 @@ pub fn set_on_should_navigate(handle: i64, closure: f64) { } pub fn set_on_loaded(handle: i64, closure: f64) { + #[cfg(feature = "servo-webview")] + if super::servo_webview::has(handle) { + super::servo_webview::set_on_loaded(handle, closure); + return; + } if let Some(key) = HANDLE_TO_KEY.with(|m| m.borrow().get(&handle).copied()) { WEBVIEW_STATES.with(|s| { if let Some(st) = s.borrow_mut().get_mut(&key) { From 98168851d2305b0bc273afaeae5b19bc117fd121 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Mon, 29 Jun 2026 18:22:56 +0200 Subject: [PATCH 07/11] feat(servo): perry compile --webview=servo selects the Servo UI backend Adds a `--webview ` flag to `perry compile` (default system). `--webview servo` links the Servo-enabled macOS UI library variant (libperry_ui_macos_servo.a, built with --features servo-webview) so a compiled app defaults to the Servo web engine; PERRY_WEBVIEW still overrides at runtime. Plumbed via a thread-local in library_search (mirroring the other cross-cutting compile flags) read by find_ui_library, which prefers the _servo variant on macOS and warns + falls back to the system WKWebView lib if it isn't present. Ignored on non-macOS targets. (cherry picked from commit e99019e706f754dbca6a3cb8796612ea9b730de2) --- .../src/commands/compile/library_search.rs | 40 +++++++++++++++++++ .../src/commands/compile/run_pipeline.rs | 5 +++ crates/perry/src/commands/compile/types.rs | 9 +++++ crates/perry/src/commands/dev.rs | 1 + crates/perry/src/commands/run/mod.rs | 1 + 5 files changed, 56 insertions(+) diff --git a/crates/perry/src/commands/compile/library_search.rs b/crates/perry/src/commands/compile/library_search.rs index da49f03a8b..39499ec900 100644 --- a/crates/perry/src/commands/compile/library_search.rs +++ b/crates/perry/src/commands/compile/library_search.rs @@ -966,7 +966,47 @@ pub(super) fn find_wasm_host_library(target: Option<&str>) -> Option { /// branch in `compile.rs` unconditionally clears `ctx.needs_ui` for that /// target so this lookup is never reached with `Some("harmonyos*")` /// (#400). +thread_local! { + /// Set from `--webview servo`: link the Servo-enabled macOS UI lib variant + /// instead of the default WKWebView one. Thread-local (like the other + /// cross-cutting compile flags) so we don't thread a param through every + /// `find_ui_library` call site. + static WEBVIEW_SERVO: std::cell::Cell = const { std::cell::Cell::new(false) }; +} + +/// Record whether the compile requested the Servo web engine (`--webview servo`). +pub(crate) fn set_webview_servo(on: bool) { + WEBVIEW_SERVO.with(|c| c.set(on)); +} + +/// True when this compile asked for the Servo web engine. +pub(crate) fn webview_servo() -> bool { + WEBVIEW_SERVO.with(|c| c.get()) +} + pub(super) fn find_ui_library(target: Option<&str>) -> Option { + // Servo backend (macOS only): link the Servo-enabled variant. cargo emits + // the same `libperry_ui_macos.a` name regardless of features, so the variant + // is distinguished by filename — built via + // `cargo build --release -p perry-ui-macos --features servo-webview` and + // placed as `libperry_ui_macos_servo.a`. See docs/servo/README.md. + let macos_servo = webview_servo() + && matches!( + target, + Some("macos") | None if cfg!(target_os = "macos") + ); + if macos_servo { + if let Some(p) = find_library("libperry_ui_macos_servo.a", target) { + return Some(p); + } + eprintln!( + "warning: --webview servo requested but libperry_ui_macos_servo.a not found; \ + falling back to the system WKWebView library. Build it with \ + `cargo build --release -p perry-ui-macos --features servo-webview` and place it \ + alongside libperry_ui_macos.a (see docs/servo/README.md)." + ); + } + let lib_name = match target { Some("ios-simulator") | Some("ios") => "libperry_ui_ios.a", Some("visionos-simulator") | Some("visionos") => "libperry_ui_visionos.a", diff --git a/crates/perry/src/commands/compile/run_pipeline.rs b/crates/perry/src/commands/compile/run_pipeline.rs index 83c8344e16..9d67690ce1 100644 --- a/crates/perry/src/commands/compile/run_pipeline.rs +++ b/crates/perry/src/commands/compile/run_pipeline.rs @@ -33,6 +33,11 @@ pub fn run_with_parse_cache( let mut args = args; args.target = apply_libc_to_target(args.target.take(), args.libc.as_deref())?; + // `--webview servo` selects the Servo-enabled macOS UI library variant. + // Record it here (single-threaded, before `find_ui_library` runs) via a + // thread-local, mirroring the other cross-cutting compile flags. + super::library_search::set_webview_servo(args.webview == "servo"); + // #835 + #846: clear the codegen-side FFI provenance set up-front // so any leftover entries from a prior `perry dev` rebuild (or a // failed-build early-return that skipped our drain below) don't diff --git a/crates/perry/src/commands/compile/types.rs b/crates/perry/src/commands/compile/types.rs index dda3071457..06f16ffd4f 100644 --- a/crates/perry/src/commands/compile/types.rs +++ b/crates/perry/src/commands/compile/types.rs @@ -121,6 +121,15 @@ pub struct CompileArgs { #[arg(long)] pub libc: Option, + /// Web engine for the WebView widget on macOS: `system` (default, + /// WKWebView) or `servo` (experimental in-process Servo engine). `servo` + /// links the Servo-enabled UI library variant (`libperry_ui_macos_servo.a`, + /// built with `--features servo-webview`); the app then defaults to Servo + /// and can still be overridden at runtime via `PERRY_WEBVIEW`. Ignored on + /// non-macOS targets. + #[arg(long, default_value = "system")] + pub webview: String, + /// App bundle identifier (required for widget targets) #[arg(long)] pub app_bundle_id: Option, diff --git a/crates/perry/src/commands/dev.rs b/crates/perry/src/commands/dev.rs index 442860937d..4b3ddd551e 100644 --- a/crates/perry/src/commands/dev.rs +++ b/crates/perry/src/commands/dev.rs @@ -290,6 +290,7 @@ fn build_once( enable_wasm_runtime: false, target: None, libc: None, + webview: "system".to_string(), app_bundle_id: None, output_type: "executable".to_string(), bundle_extensions: None, diff --git a/crates/perry/src/commands/run/mod.rs b/crates/perry/src/commands/run/mod.rs index 3b87a26a37..cc7de119d9 100644 --- a/crates/perry/src/commands/run/mod.rs +++ b/crates/perry/src/commands/run/mod.rs @@ -202,6 +202,7 @@ pub fn run(args: RunArgs, format: OutputFormat, use_color: bool, verbose: u8) -> enable_wasm_runtime: args.enable_wasm_runtime, target: target.clone(), libc: args.libc.clone(), + webview: "system".to_string(), app_bundle_id: Some(bundle_id), output_type: "executable".to_string(), bundle_extensions: None, From 32953d437eab5444d0ff9c93a7761c17c8ab9c1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Mon, 29 Jun 2026 18:35:37 +0200 Subject: [PATCH 08/11] feat(servo): input + resize for the Servo WebView (PerryServoView) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Servo-backed WebView is now interactive. Replaces the passive NSImageView with a PerryServoView (flipped, first-responder NSView subclass) that holds the image view as an autoresizing subview and: - forwards mouse down/up/drag + left/right buttons and the scroll wheel to Servo as InputEvents (coordinates converted to Servo device pixels), and - resizes the engine — rendering context + WebView + readback size — on layout via setFrameSize:, so the page tracks the widget bounds. Reuses webview::nanbox_str (now pub(super)) for the evaluate_js result instead of re-declaring the string FFI. Follow-ups (documented in docs/servo/README.md): keyboard input, hover (NSTrackingArea), and HiDPI backing scale. Builds with --features servo-webview; default build unaffected (cfg-gated). (cherry picked from commit 0d47c463223281761a7fb7a7ce1f24ddbc099b3a) --- .../src/widgets/servo_webview.rs | 178 ++++++++++++++++-- crates/perry-ui-macos/src/widgets/webview.rs | 2 +- docs/servo/README.md | 28 +++ 3 files changed, 192 insertions(+), 16 deletions(-) diff --git a/crates/perry-ui-macos/src/widgets/servo_webview.rs b/crates/perry-ui-macos/src/widgets/servo_webview.rs index 88f76587ea..7a007012b3 100644 --- a/crates/perry-ui-macos/src/widgets/servo_webview.rs +++ b/crates/perry-ui-macos/src/widgets/servo_webview.rs @@ -24,12 +24,15 @@ use std::rc::Rc; use dpi::PhysicalSize; use objc2::rc::Retained; use objc2::runtime::{AnyClass, AnyObject}; -use objc2::{msg_send, MainThreadOnly}; -use objc2_app_kit::{NSImageView, NSView}; +use objc2::{define_class, msg_send, DefinedClass, MainThreadOnly}; +use objc2_app_kit::{NSEvent, NSImageView, NSView}; +use objc2_core_foundation::{CGPoint, CGSize}; use objc2_foundation::{MainThreadMarker, NSString}; use servo::{ - DeviceIntRect, DeviceIntSize, LoadStatus, RenderingContext, Servo, ServoBuilder, - SoftwareRenderingContext, WebView, WebViewBuilder, WebViewDelegate, + DeviceIntRect, DeviceIntSize, DevicePoint, InputEvent, LoadStatus, MouseButton, + MouseButtonAction, MouseButtonEvent, MouseMoveEvent, RenderingContext, Servo, ServoBuilder, + SoftwareRenderingContext, WebView, WebViewBuilder, WebViewDelegate, WebViewPoint, WheelDelta, + WheelEvent, WheelMode, }; use url::Url; @@ -37,8 +40,6 @@ extern "C" { fn js_closure_call0(closure: *const u8) -> f64; fn js_closure_call1(closure: *const u8, arg: f64) -> f64; fn js_nanbox_get_pointer(value: f64) -> i64; - fn js_string_from_bytes(ptr: *const u8, len: i64) -> *const u8; - fn js_nanbox_string(ptr: i64) -> f64; } thread_local! { @@ -123,6 +124,143 @@ impl ServoEngine { } } +struct ServoViewIvars { + /// Perry widget handle this view belongs to (looked up in `ENGINES` to + /// route input/resize to the right Servo engine). `0` until registered. + handle: Cell, +} + +define_class!( + /// Flipped, first-responder `NSView` that captures mouse/scroll/resize and + /// forwards them to its Servo engine. Holds an `NSImageView` subview that + /// displays the rendered frames. + #[unsafe(super(NSView))] + #[name = "PerryServoView"] + #[ivars = ServoViewIvars] + struct PerryServoView; + + impl PerryServoView { + // Flipped → the view's coords share Servo's top-left device origin. + #[unsafe(method(isFlipped))] + fn is_flipped(&self) -> bool { + true + } + + #[unsafe(method(acceptsFirstResponder))] + fn accepts_first_responder(&self) -> bool { + true + } + + #[unsafe(method(mouseDown:))] + fn mouse_down(&self, event: &NSEvent) { + self.send_button(event, MouseButtonAction::Down, MouseButton::Left); + } + + #[unsafe(method(mouseUp:))] + fn mouse_up(&self, event: &NSEvent) { + self.send_button(event, MouseButtonAction::Up, MouseButton::Left); + } + + #[unsafe(method(rightMouseDown:))] + fn right_mouse_down(&self, event: &NSEvent) { + self.send_button(event, MouseButtonAction::Down, MouseButton::Right); + } + + #[unsafe(method(rightMouseUp:))] + fn right_mouse_up(&self, event: &NSEvent) { + self.send_button(event, MouseButtonAction::Up, MouseButton::Right); + } + + #[unsafe(method(mouseDragged:))] + fn mouse_dragged(&self, event: &NSEvent) { + self.send_move(event); + } + + #[unsafe(method(mouseMoved:))] + fn mouse_moved(&self, event: &NSEvent) { + self.send_move(event); + } + + #[unsafe(method(scrollWheel:))] + fn scroll_wheel(&self, event: &NSEvent) { + let pt = self.point_of(event); + let (dx, dy) = (event.scrollingDeltaX(), event.scrollingDeltaY()); + let delta = WheelDelta { + x: dx, + y: dy, + z: 0.0, + mode: WheelMode::DeltaPixel, + }; + engine_notify( + self.ivars().handle.get(), + InputEvent::Wheel(WheelEvent::new(delta, pt)), + ); + } + + #[unsafe(method(setFrameSize:))] + fn set_frame_size(&self, size: CGSize) { + let _: () = unsafe { msg_send![super(self), setFrameSize: size] }; + engine_resize( + self.ivars().handle.get(), + size.width as u32, + size.height as u32, + ); + } + } +); + +impl PerryServoView { + /// Window-relative event point → Servo device-pixel point. + fn point_of(&self, event: &NSEvent) -> WebViewPoint { + let win = event.locationInWindow(); + let local: CGPoint = + unsafe { msg_send![self, convertPoint: win, fromView: std::ptr::null::()] }; + WebViewPoint::Device(DevicePoint::new(local.x as f32, local.y as f32)) + } + + fn send_button(&self, event: &NSEvent, action: MouseButtonAction, button: MouseButton) { + let pt = self.point_of(event); + engine_notify( + self.ivars().handle.get(), + InputEvent::MouseButton(MouseButtonEvent::new(action, button, pt)), + ); + } + + fn send_move(&self, event: &NSEvent) { + let pt = self.point_of(event); + engine_notify( + self.ivars().handle.get(), + InputEvent::MouseMove(MouseMoveEvent::new(pt)), + ); + } +} + +/// Forward an input event to the Servo engine backing `handle`, if any. +fn engine_notify(handle: i64, event: InputEvent) { + ENGINES.with(|e| { + if let Some(engine) = e.borrow().get(&handle) { + engine.webview.notify_input_event(event); + } + }); +} + +/// Resize the Servo engine backing `handle` to (w, h) logical pixels — the +/// rendering context, the WebView, and the cached readback size all move +/// together so the next frame fills the new bounds. +fn engine_resize(handle: i64, w: u32, h: u32) { + if w == 0 || h == 0 { + return; + } + ENGINES.with(|e| { + if let Some(engine) = e.borrow().get(&handle) { + let size = PhysicalSize::new(w, h); + engine.rc.resize(size); + engine.webview.resize(size); + engine.size.set((w, h)); + } + }); +} + /// Create a Servo-backed WebView widget. Returns the Perry widget handle (the /// same contract as the WKWebView `create`). Falls back to handle `0` on /// engine-construction failure so the caller can degrade gracefully. @@ -157,28 +295,39 @@ pub fn create(url: &str, width: f64, height: f64) -> i64 { webview.focus(); webview.resize(PhysicalSize::new(w, h)); - // The displayed surface: a layer-backed NSImageView sized to the widget. + // The widget view: a PerryServoView (captures input + resize) holding an + // NSImageView subview that displays the rendered frames (autoresized to fill). let frame = objc2_core_foundation::CGRect::new( objc2_core_foundation::CGPoint::new(0.0, 0.0), - objc2_core_foundation::CGSize::new(w as f64, h as f64), + CGSize::new(w as f64, h as f64), ); - let view: Retained = + let container: Retained = { + let this = PerryServoView::alloc(mtm).set_ivars(ServoViewIvars { + handle: Cell::new(0), + }); + unsafe { msg_send![super(this), initWithFrame: frame] } + }; + let image_view: Retained = unsafe { msg_send![NSImageView::alloc(mtm), initWithFrame: frame] }; unsafe { - let _: () = msg_send![&*view, setWantsLayer: true]; + let _: () = msg_send![&*image_view, setWantsLayer: true]; // NSImageScaleAxesIndependently = 3 — stretch to fill the widget box. - let _: () = msg_send![&*view, setImageScaling: 3usize]; + let _: () = msg_send![&*image_view, setImageScaling: 3usize]; + // NSViewWidthSizable (2) | NSViewHeightSizable (16) — track the container. + let _: () = msg_send![&*image_view, setAutoresizingMask: 18usize]; + let _: () = msg_send![&*container, addSubview: &*image_view]; } - let view_ns: Retained = unsafe { Retained::cast_unchecked(view.clone()) }; + let view_ns: Retained = unsafe { Retained::cast_unchecked(container.clone()) }; let handle = super::register_widget(view_ns); + container.ivars().handle.set(handle); let engine = Rc::new(ServoEngine { servo, webview, rc, state, - view, + view: image_view, size: Cell::new((w, h)), }); // Paint the first frame immediately so the view isn't blank pre-load. @@ -228,9 +377,8 @@ pub fn evaluate_js(handle: i64, js: &str, callback: f64) { Err(_) => String::new(), }; if callback != 0.0 { + let boxed = super::webview::nanbox_str(&s); crate::catch_callback_panic("servo webview evaluateJs callback", || unsafe { - let js_str = js_string_from_bytes(s.as_ptr(), s.len() as i64); - let boxed = js_nanbox_string(js_str as i64); js_closure_call1(js_nanbox_get_pointer(callback) as *const u8, boxed); }); } diff --git a/crates/perry-ui-macos/src/widgets/webview.rs b/crates/perry-ui-macos/src/widgets/webview.rs index 8f6140e2f6..9edb1f9f32 100644 --- a/crates/perry-ui-macos/src/widgets/webview.rs +++ b/crates/perry-ui-macos/src/widgets/webview.rs @@ -84,7 +84,7 @@ fn str_from_header(ptr: *const u8) -> &'static str { } } -fn nanbox_str(s: &str) -> f64 { +pub(super) fn nanbox_str(s: &str) -> f64 { let bytes = s.as_bytes(); unsafe { let p = js_string_from_bytes(bytes.as_ptr(), bytes.len() as i64); diff --git a/docs/servo/README.md b/docs/servo/README.md index ada6f64524..1d5684cc91 100644 --- a/docs/servo/README.md +++ b/docs/servo/README.md @@ -47,6 +47,34 @@ servo-script = { path = "../servo-forks/servo-script" } For a landable PR the fork needs a permanent home (git fork/submodule or in-tree vendor) rather than the local path above. +## Selecting the Servo backend + +- **At build time:** `perry compile app.ts --webview servo -o app` — links the + Servo-enabled UI lib variant (`libperry_ui_macos_servo.a`) so the app defaults + to Servo. Build that variant with + `cargo build --release -p perry-ui-macos --features servo-webview` and place it + alongside `libperry_ui_macos.a` (cargo emits the same filename regardless of + features, so rename/scope it as the `_servo` variant). If it's missing, the + compiler warns and falls back to the WKWebView lib. +- **At runtime:** `PERRY_WEBVIEW=servo` selects Servo for a build that linked the + variant; anything else uses the system WKWebView. + +## Engine capabilities & limitations + +The `ServoEngine` (`servo_webview.rs`) drives the WebView widget through the same +FFI surface as WKWebView: + +- ✅ Navigation (`loadUrl` / `reload`), `evaluateJavaScript` → string callback, + `onLoaded` on `LoadStatus::Complete`. +- ✅ Rendering — offscreen software render blitted into a layer-backed + `NSImageView` at ~60 Hz. +- ✅ Interaction — a `PerryServoView` (flipped, first-responder `NSView`) forwards + mouse down/up/drag, left/right buttons, and scroll wheel to Servo, and resizes + the engine (rendering context + WebView) on layout via `setFrameSize:`. +- ⏳ Follow-ups: keyboard input (key-code → `KeyboardEvent` translation), hover + (`mouseMoved` needs an `NSTrackingArea`), and HiDPI backing-scale (the software + context renders at logical pixels today). + ## ML-KEM migration: correctness note The migration is **type-correct** (the full Servo stack compiles). Behavioral From adc172173fb03fa81d7f99c14485935027300ef3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Tue, 30 Jun 2026 09:14:36 +0200 Subject: [PATCH 09/11] style: rustfmt electron-merge artifacts (init.rs, runtime/lib.rs) --- Cargo.lock | 20 ++++++++++---------- crates/perry-runtime/src/lib.rs | 2 +- crates/perry/src/commands/init.rs | 12 ++++++------ 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0ad4c196a3..f421adda46 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3659,9 +3659,9 @@ dependencies = [ [[package]] name = "gpu-alloc" -version = "0.6.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +checksum = "45cf04b2726f02df5508c6de726acdc90cdf97ac771a9a0ffd8ba10a6e696bf9" dependencies = [ "bitflags 2.13.0", "gpu-alloc-types", @@ -3669,9 +3669,9 @@ dependencies = [ [[package]] name = "gpu-alloc-types" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +checksum = "b2bbed164dd10ed526c2e4fe3e721ca4a71c61730e5aafac6844b417b3227058" dependencies = [ "bitflags 2.13.0", ] @@ -5175,9 +5175,9 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.18.4" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25470f23803092da7d239834776d653104d551bc4d7eacaf31e6837854b8e9eb" +checksum = "993f007684f2e9727160da8b960ec161264703bfd1af084fd2e34d040c9a0dd4" dependencies = [ "console 0.16.3", "portable-atomic", @@ -5399,9 +5399,9 @@ dependencies = [ [[package]] name = "jiff" -version = "0.2.29" +version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34f877a98676d2fb664698d74cc6a51ce6c484ce8c770f05d0108ec9090aeb46" +checksum = "ccfe6121cbe750cf81efa362d85c0bde7ea298ec43092d3a193baca59cdbd634" dependencies = [ "defmt", "jiff-static", @@ -5413,9 +5413,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.29" +version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0666b5ab5ecaca213fc2a85b8c0083d9004e84ee2d5f9a7e0017aaf50986f25f" +checksum = "e165e897f662d428f3cd3828a919dbe067c2d42bb1031eede74ef9d27ecdedd2" dependencies = [ "proc-macro2", "quote", diff --git a/crates/perry-runtime/src/lib.rs b/crates/perry-runtime/src/lib.rs index 8473125b9b..5cdb6eab43 100644 --- a/crates/perry-runtime/src/lib.rs +++ b/crates/perry-runtime/src/lib.rs @@ -110,11 +110,11 @@ pub mod temporal; pub mod text; pub mod timer; pub mod typed_feedback; -pub mod ui_loop; pub mod typedarray; pub mod typedarray_half; pub(crate) mod typedarray_props; pub mod typedarray_view; +pub mod ui_loop; pub mod url; pub mod v8; pub mod validators; diff --git a/crates/perry/src/commands/init.rs b/crates/perry/src/commands/init.rs index a15e5adbff..d8be344a38 100644 --- a/crates/perry/src/commands/init.rs +++ b/crates/perry/src/commands/init.rs @@ -162,20 +162,20 @@ fn merge_paths_into_existing( existing: &str, paths: &serde_json::Map, ) -> std::result::Result, String> { - let mut root: serde_json::Value = serde_json::from_str(existing) - .map_err(|_| render_paths_block(paths))?; + let mut root: serde_json::Value = + serde_json::from_str(existing).map_err(|_| render_paths_block(paths))?; let obj = root .as_object_mut() .ok_or_else(|| render_paths_block(paths))?; let co = obj .entry("compilerOptions") .or_insert_with(|| serde_json::json!({})); - let co = co.as_object_mut().ok_or_else(|| render_paths_block(paths))?; + let co = co + .as_object_mut() + .ok_or_else(|| render_paths_block(paths))?; co.entry("baseUrl") .or_insert_with(|| serde_json::json!(".")); - let existing_paths = co - .entry("paths") - .or_insert_with(|| serde_json::json!({})); + let existing_paths = co.entry("paths").or_insert_with(|| serde_json::json!({})); let existing_paths = existing_paths .as_object_mut() .ok_or_else(|| render_paths_block(paths))?; From 7a9767056eeca383d832949d516042f6d4835150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Tue, 30 Jun 2026 09:21:27 +0200 Subject: [PATCH 10/11] build(servo): host servo-script fork as a git patch (PerryTS/servo-script-mlkem) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Point [patch.crates-io] servo-script at the git fork by rev instead of a local path, so the branch resolves on any machine (incl. CI) — the servo optional dep must resolve even when the servo-webview feature is off. Update docs/servo. --- Cargo.lock | 1 + Cargo.toml | 5 +++-- docs/servo/README.md | 25 ++++++++++++------------- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f421adda46..58ac9de923 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10974,6 +10974,7 @@ dependencies = [ [[package]] name = "servo-script" version = "0.1.0" +source = "git+https://github.com/PerryTS/servo-script-mlkem?rev=e4dc40a54366ac327845c8dd5013a3fb068d19b5#e4dc40a54366ac327845c8dd5013a3fb068d19b5" dependencies = [ "aes 0.8.4", "aes-gcm", diff --git a/Cargo.toml b/Cargo.toml index ae4e604d34..55ed812088 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -448,6 +448,7 @@ perry-updater = { path = "crates/perry-updater" } # Experimental: fork of servo-script migrated from ml-kem 0.2 -> 0.3.2 so its # WebCrypto ML-KEM coexists with perry's ml-kem 0.3.2 (pkcs8). Enables the -# in-process Servo webview (servo-webview feature). See servo-forks/servo-script. +# in-process Servo webview (servo-webview feature). Source + migration diff: +# https://github.com/PerryTS/servo-script-mlkem (see docs/servo/README.md). [patch.crates-io] -servo-script = { path = "../servo-forks/servo-script" } +servo-script = { git = "https://github.com/PerryTS/servo-script-mlkem", rev = "e4dc40a54366ac327845c8dd5013a3fb068d19b5" } diff --git a/docs/servo/README.md b/docs/servo/README.md index 1d5684cc91..0251f083fd 100644 --- a/docs/servo/README.md +++ b/docs/servo/README.md @@ -28,24 +28,23 @@ hard version conflicts had to be resolved: `ml-dsa` (the sibling ML-DSA/Dilithium crate Servo also uses) is **not** a conflict — perry doesn't depend on it. -## Reproducing the fork - -```sh -# 1. Vendor servo-script from the registry into a sibling dir: -cp -R ~/.cargo/registry/src/*/servo-script-0.1.0 ../servo-forks/servo-script -chmod -R u+w ../servo-forks/servo-script -# 2. Apply the ml-kem 0.3.2 migration: -cd ../servo-forks/servo-script && patch -p0 < .../docs/servo/servo-script-ml-kem-0.3.2.patch -``` +## The fork + +The migrated `servo-script` is hosted at +**https://github.com/PerryTS/servo-script-mlkem** — a vendored copy of crates.io +`servo-script 0.1.0` whose *only* change vs upstream is the ML-KEM migration +(captured in `servo-script-ml-kem-0.3.2.patch`). The workspace `Cargo.toml` +patches it in by git rev, so the branch resolves on any machine (incl. CI): -The workspace `Cargo.toml` then carries: ```toml [patch.crates-io] -servo-script = { path = "../servo-forks/servo-script" } +servo-script = { git = "https://github.com/PerryTS/servo-script-mlkem", rev = "" } ``` -For a landable PR the fork needs a permanent home (git fork/submodule or in-tree -vendor) rather than the local path above. +To regenerate the fork from scratch (e.g. to bump the servo version): vendor a +fresh `servo-script-0.1.0` from the registry, apply +`servo-script-ml-kem-0.3.2.patch`, and push to the fork repo, then update the +`rev` above. ## Selecting the Servo backend From 59cd33022140b6fe875d228f99f3525d581a2adc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralph=20K=C3=BCpper?= Date: Sun, 5 Jul 2026 15:12:09 +0200 Subject: [PATCH 11/11] ci(security-audit): ignore RUSTSEC-2025-0144 (ml-dsa timing side-channel) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ml-dsa 0.0.4 is a transitive dep of servo-script, part of #5811's EXPERIMENTAL feature-gated Servo web-engine switch (servo-webview, opt-in — not in the default build graph). Patched only in a pre-release (>=0.1.0-rc.3) that servo-script does not yet pin; Perry does not exercise ML-DSA signing. Documented alongside the existing acknowledged transitive-dep advisories. --- .github/workflows/security-audit.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/security-audit.yml b/.github/workflows/security-audit.yml index c453676b4f..e7179f09ad 100644 --- a/.github/workflows/security-audit.yml +++ b/.github/workflows/security-audit.yml @@ -50,6 +50,15 @@ jobs: # not a parser of untrusted PDFs, so the deeply-nested-input # surface is not reached. Tracking for a printpdf release that # moves to lopdf >=0.42. + # - RUSTSEC-2025-0144 (ml-dsa) — timing side-channel in ML-DSA + # decomposition. Transitive via `servo-script`, part of the + # EXPERIMENTAL, feature-gated Servo web-engine switch (opt-in, + # not in the default build graph — `cargo tree -i ml-dsa` does + # not resolve it without the Servo feature). Patched only in a + # pre-release (>=0.1.0-rc.3), and servo-script pins 0.0.4, so + # there is no actionable stable bump yet. Perry does not exercise + # ML-DSA signing in this context. Tracking for servo-script to + # move to a released ml-dsa >=0.1.0. # # Previously the job ran `--deny warnings` which also # escalated every "unmaintained crate" notice into a hard @@ -62,4 +71,5 @@ jobs: --ignore RUSTSEC-2023-0071 \ --ignore RUSTSEC-2026-0118 \ --ignore RUSTSEC-2026-0119 \ - --ignore RUSTSEC-2026-0187 + --ignore RUSTSEC-2026-0187 \ + --ignore RUSTSEC-2025-0144