diff --git a/Cargo.lock b/Cargo.lock index 4b600eb9b..d20900926 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -132,6 +132,134 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "async-executor" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand 2.3.0", + "futures-lite 2.6.0", + "slab", +] + +[[package]] +name = "async-global-executor" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" +dependencies = [ + "async-channel 2.3.1", + "async-executor", + "async-io", + "async-lock", + "blocking", + "futures-lite 2.6.0", + "once_cell", +] + +[[package]] +name = "async-io" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +dependencies = [ + "async-lock", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.6.0", + "parking", + "polling", + "rustix", + "slab", + "tracing", + "windows-sys", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.4.0", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" +dependencies = [ + "async-channel 2.3.1", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener 5.4.0", + "futures-lite 2.6.0", + "rustix", + "tracing", +] + +[[package]] +name = "async-signal" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys", +] + +[[package]] +name = "async-std" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "730294c1c08c2e0f85759590518f6333f0d5a0a766a27d519c1b244c3dfd8a24" +dependencies = [ + "async-channel 1.9.0", + "async-global-executor", + "async-io", + "async-lock", + "async-process", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite 2.6.0", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + [[package]] name = "async-trait" version = "0.1.87" @@ -143,6 +271,12 @@ dependencies = [ "syn 2.0.99", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.4.0" @@ -176,6 +310,19 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel 2.3.1", + "async-task", + "futures-io", + "futures-lite 2.6.0", + "piper", +] + [[package]] name = "bstr" version = "1.11.3" @@ -364,12 +511,15 @@ dependencies = [ "assert_fs", "assert_matches", "async-channel 2.3.1", + "async-std", "bincode", "crossbeam-channel", "crux_http", + "crux_kv", "crux_macros", "crux_time", "doctest_support", + "either", "erased-serde", "futures", "rand 0.9.0", @@ -379,9 +529,12 @@ dependencies = [ "serde_json", "slab", "static_assertions", + "streamunordered", "thiserror 2.0.12", + "tracing", "url", "uuid", + "wasm-bindgen-futures", ] [[package]] @@ -554,6 +707,12 @@ dependencies = [ "serde_json", ] +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + [[package]] name = "encode_unicode" version = "1.0.0" @@ -715,6 +874,19 @@ dependencies = [ "waker-fn", ] +[[package]] +name = "futures-lite" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +dependencies = [ + "fastrand 2.3.0", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.31" @@ -836,6 +1008,18 @@ dependencies = [ "walkdir", ] +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + [[package]] name = "hashbrown" version = "0.15.2" @@ -857,6 +1041,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + [[package]] name = "http" version = "1.2.0" @@ -877,7 +1067,7 @@ dependencies = [ "anyhow", "async-channel 1.9.0", "base64", - "futures-lite", + "futures-lite 1.13.0", "infer", "pin-project-lite", "rand 0.7.3", @@ -1156,6 +1346,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -1191,6 +1390,9 @@ name = "log" version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" +dependencies = [ + "value-bag", +] [[package]] name = "logos" @@ -1334,6 +1536,32 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand 2.3.0", + "futures-io", +] + +[[package]] +name = "polling" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys", +] + [[package]] name = "ppv-lite86" version = "0.2.20" @@ -1729,6 +1957,15 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + [[package]] name = "similar" version = "2.7.0" @@ -1774,6 +2011,18 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "streamunordered" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0baba51055b6c1a4e39ade5df203cd3cf96780c645be651f42214576c942df54" +dependencies = [ + "futures-core", + "futures-sink", + "futures-util", + "slab", +] + [[package]] name = "strsim" version = "0.11.1" @@ -1927,6 +2176,37 @@ dependencies = [ "winnow", ] +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.99", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", +] + [[package]] name = "typeid" version = "1.0.3" @@ -1995,14 +2275,20 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.15.1" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f540e3240398cce6128b64ba83fdbdd86129c16a3aa1a3a252efd66eb3d587" +checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" dependencies = [ "getrandom 0.3.1", "serde", ] +[[package]] +name = "value-bag" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" + [[package]] name = "version_check" version = "0.9.5" @@ -2072,6 +2358,19 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.100" diff --git a/crux_core/Cargo.toml b/crux_core/Cargo.toml index 6617c55e5..f2731daf4 100644 --- a/crux_core/Cargo.toml +++ b/crux_core/Cargo.toml @@ -33,6 +33,11 @@ thiserror = "2.0.12" # So I've left them 0.26.0 and 0.4.0 respectively. serde-generate = { version = "0.26.0", optional = true } serde-reflection = { version = "0.4.0", optional = true } +either = "1.14.0" +async-std = {version = "1.13.0", features = ["unstable"] } +tracing = "0.1.41" +wasm-bindgen-futures = "0.4.50" +streamunordered = "0.5.4" [dev-dependencies] assert_fs = "1.1.2" @@ -40,6 +45,7 @@ assert_matches = "1.5" async-channel = "2.3" crux_http = { path = "../crux_http" } crux_time = { path = "../crux_time" } +crux_kv = { path = "../crux_kv" } doctest_support = { path = "../doctest_support" } serde = { version = "1.0.218", features = ["derive"] } static_assertions = "1.1" diff --git a/crux_core/src/bridge/mod.rs b/crux_core/src/bridge/mod.rs index 33362b691..c8ce9b695 100644 --- a/crux_core/src/bridge/mod.rs +++ b/crux_core/src/bridge/mod.rs @@ -1,16 +1,27 @@ +mod nacre; mod registry; mod request_serde; +mod shell; + +use std::sync::Arc; use bincode::{DefaultOptions, Options}; +use either::Either; use erased_serde::{Error as SerdeError, Serialize as _}; +use nacre::ShellEffects; use serde::{Deserialize, Serialize}; use thiserror::Error; -use crate::{core::ResolveError, App, Core}; +use crate::{ + core::{Middleware, ResolveError}, + App, Effect, NacreEffect, +}; use registry::{EffectId, ResolveRegistry}; // ResolveByte is public to be accessible from crux_macros +pub use nacre::{Nacre, NacreBridge}; #[doc(hidden)] pub use request_serde::ResolveSerialized; +pub use shell::Shell; /// Request for a side-effect passed from the Core to the Shell. The `EffectId` links /// the `Request` with the corresponding call to [`Core::resolve`] to pass the data back @@ -27,13 +38,43 @@ where } // ANCHOR_END: request +pub type RequestFfi<A> = Request<<<A as App>::Effect as Effect>::Ffi>; + +pub trait NacreTrait<A: App> +where + A::Effect: NacreEffect, +{ + fn register_callback( + &self, + receiver: async_std::channel::Receiver<ShellEffects<A>>, + cb: impl Fn(ShellEffects<A>) -> Vec<u8> + Send + 'static, + ); +} + /// Bridge is a core wrapper presenting the same interface as the [`Core`] but in a /// serialized form, using bincode as the serialization format. -pub struct Bridge<A> +pub struct Bridge<Core> where - A: App, + Core: Middleware, { - inner: BridgeWithSerializer<A>, + inner: Arc<BridgeWithSerializer<Core>>, +} + +impl<Core> Bridge<Core> +where + Core: NacreTrait<Core::App> + Middleware + Send + Sync + 'static, + <<Core as Middleware>::App as App>::Effect: NacreEffect, + <<Core as Middleware>::App as App>::Effect: + From<<<<Core as Middleware>::App as App>::Effect as NacreEffect>::ShellEffect>, +{ + pub fn from_nacre( + nacre: Core, + receiver: async_std::channel::Receiver<ShellEffects<Core::App>>, + ) -> Self { + Self { + inner: BridgeWithSerializer::from_nacre(nacre, receiver), + } + } } #[derive(Debug, Error)] @@ -50,14 +91,14 @@ pub enum BridgeError { SerializeView(SerdeError), } -impl<A> Bridge<A> +impl<Core> Bridge<Core> where - A: App, + Core: Middleware, { /// Create a new Bridge using the provided `core`. - pub fn new(core: Core<A>) -> Self { + pub fn new(core: Core) -> Self { Self { - inner: BridgeWithSerializer::new(core), + inner: Arc::new(BridgeWithSerializer::new(core)), } } @@ -67,7 +108,7 @@ where /// to your app. pub fn process_event(&self, event: &[u8]) -> Result<Vec<u8>, BridgeError> where - A::Event: for<'a> Deserialize<'a>, + <Core::App as App>::Event: for<'a> Deserialize<'a>, { let options = Self::bincode_options(); @@ -90,7 +131,7 @@ where pub fn handle_response(&self, id: u32, output: &[u8]) -> Result<Vec<u8>, BridgeError> // ANCHOR_END: handle_response_sig where - A::Event: for<'a> Deserialize<'a>, + <Core::App as App>::Event: for<'a> Deserialize<'a>, { let options = Self::bincode_options(); @@ -123,6 +164,41 @@ where } } +impl<Core> BridgeWithSerializer<Core> +where + Core: NacreTrait<Core::App> + Middleware + Send + Sync + 'static, + <<Core as Middleware>::App as App>::Effect: NacreEffect, + <<Core as Middleware>::App as App>::Effect: + From<<<<Core as Middleware>::App as App>::Effect as NacreEffect>::ShellEffect>, +{ + pub fn from_nacre( + nacre: Core, + receiver: async_std::channel::Receiver<ShellEffects<Core::App>>, + ) -> Arc<Self> { + let core = Arc::new(nacre); + let cloned_core = core.clone(); + let this = Arc::new(Self { + core, + registry: Default::default(), + }); + let cloned = this.clone(); + let callback = move |effects: ShellEffects<Core::App>| { + let mut return_buffer = vec![]; + let mut ser = + bincode::Serializer::new(&mut return_buffer, Bridge::<Core>::bincode_options()); + cloned + .register( + effects.into_iter().map(std::convert::Into::into), + &mut <dyn erased_serde::Serializer>::erase(&mut ser), + ) + .unwrap(); + return_buffer + }; + cloned_core.register_callback(receiver, callback); + this + } +} + /// A bridge with a user supplied serializer /// /// This is exactly the same as [`Bridge`], except instead of using the default @@ -134,22 +210,22 @@ where /// it using separate tooling. // used in docs/internals/bridge.md // ANCHOR: bridge_with_serializer -pub struct BridgeWithSerializer<A> +pub struct BridgeWithSerializer<Core> where - A: App, + Core: Middleware, { - core: Core<A>, + core: Arc<Core>, registry: ResolveRegistry, } // ANCHOR_END: bridge_with_serializer -impl<A> BridgeWithSerializer<A> +impl<Core> BridgeWithSerializer<Core> where - A: App, + Core: Middleware, { - pub fn new(core: Core<A>) -> Self { + pub fn new(core: Core) -> Self { Self { - core, + core: Arc::new(core), registry: Default::default(), } } @@ -160,7 +236,7 @@ where /// to your app. pub fn process_event<'de, D, S>(&self, event: D, requests_out: S) -> Result<(), BridgeError> where - for<'a> A::Event: Deserialize<'a>, + for<'a> <Core::App as App>::Event: Deserialize<'a>, D: ::serde::de::Deserializer<'de> + 'de, S: ::serde::ser::Serializer, { @@ -183,7 +259,7 @@ where requests_out: S, ) -> Result<(), BridgeError> where - for<'a> A::Event: Deserialize<'a>, + for<'a> <Core::App as App>::Event: Deserialize<'a>, D: ::serde::de::Deserializer<'de>, S: ::serde::ser::Serializer, { @@ -202,26 +278,37 @@ where requests_out: &mut dyn erased_serde::Serializer, ) -> Result<(), BridgeError> where - A::Event: for<'a> Deserialize<'a>, + <Core::App as App>::Event: for<'a> Deserialize<'a>, { let effects = match id { None => { let shell_event = erased_serde::deserialize(data).map_err(BridgeError::DeserializeEvent)?; - self.core.process_event(shell_event) + Either::Left(self.core.process_event(shell_event)) } Some(id) => { - self.registry.resume(id, data)?; + self.registry.resume(id, data).expect( + "Response could not be handled. The request did not expect a response.", + ); - self.core.process() + Either::Right(self.core.process_effects()) } }; + self.register(effects, requests_out) + } + + fn register( + &self, + effects: impl Iterator<Item = <Core::App as App>::Effect>, + requests_out: &mut dyn erased_serde::Serializer, + ) -> Result<(), BridgeError> { let requests: Vec<_> = effects .into_iter() .map(|eff| self.registry.register(eff)) .collect(); + tracing::info!("bridge registered {} effects", requests.len()); requests .erased_serialize(requests_out) @@ -230,6 +317,10 @@ where Ok(()) } + pub fn inner(&self) -> &Core { + &self.core + } + /// Get the current state of the app's view model (serialized). pub fn view<S>(&self, ser: S) -> Result<(), BridgeError> where diff --git a/crux_core/src/bridge/nacre.rs b/crux_core/src/bridge/nacre.rs new file mode 100644 index 000000000..32b7d4852 --- /dev/null +++ b/crux_core/src/bridge/nacre.rs @@ -0,0 +1,186 @@ +use crate::bridge::{NacreTrait, Shell}; +use crate::{Core, Middleware, NacreEffect, WithContext}; +use futures::StreamExt; +use std::future::Future; +use std::sync::Arc; +use streamunordered::{StreamUnordered, StreamYield}; + +pub struct Nacre<A> +where + A: crate::App + Send + Sync + 'static, + A::Effect: NacreEffect, + A::Capabilities: WithContext<A::Event, A::Effect> + Send + Sync, + A::Model: Send + Sync, + <A::Effect as NacreEffect>::ShellEffect: Send, +{ + core: Arc<crate::Core<A>>, + sender: async_std::channel::Sender<Vec<<A::Effect as NacreEffect>::ShellEffect>>, +} + +pub type ShellEffects<A> = Vec<<<A as crate::App>::Effect as NacreEffect>::ShellEffect>; + +impl<A> Nacre<A> +where + A: crate::App + Send + Sync + 'static, + A::Effect: NacreEffect, + A::Capabilities: WithContext<A::Event, A::Effect> + Send + Sync, + A::Model: Send + Sync, + <A::Effect as NacreEffect>::ShellEffect: Send, +{ + pub fn new( + sender: async_std::channel::Sender<Vec<<A::Effect as NacreEffect>::ShellEffect>>, + ) -> Self { + Self { + core: Arc::new(Core::new()), + sender, + } + } + + fn process(&self, effects: impl Iterator<Item = A::Effect>) { + let effects = effects.collect::<Vec<_>>(); + let core = self.core.clone(); + let sender = self.sender.clone(); + self.spawn(async move { + let all_streams = effects.into_iter().map(|effect| { + let core = core.clone(); + effect.handle(core) + }); + let mut streams = StreamUnordered::from_iter(all_streams); + + while let Some((yielded, _)) = streams.next().await { + match yielded { + StreamYield::Item(effects) => { + sender.send(effects).await.unwrap(); + } + StreamYield::Finished(_stream) => { + // TODO: remove the stream + // stream.remove(streams); + } + } + } + }); + } + #[cfg(not(target_arch = "wasm32"))] + pub fn spawn<F>(&self, f: F) + where + F: Future + Send + 'static, + F::Output: Send, + { + async_std::task::spawn(async { + f.await; + }); + } + + #[cfg(target_arch = "wasm32")] + pub fn spawn<F>(&self, f: F) + where + F: Future + Send + 'static, + F::Output: Send, + { + wasm_bindgen_futures::spawn_local(async { + f.await; + }); + } +} + +pub struct NacreBridge<A> +where + A: crate::App + Send + Sync + 'static, + A::Effect: NacreEffect, + A::Capabilities: WithContext<A::Event, A::Effect> + Send + Sync, + A::Model: Send + Sync, + <A::Effect as NacreEffect>::ShellEffect: Send, +{ + nacre: Nacre<A>, + shell: Arc<dyn Shell>, +} + +impl<A> NacreBridge<A> +where + A: crate::App + Send + Sync + 'static, + A::Effect: NacreEffect, + A::Capabilities: WithContext<A::Event, A::Effect> + Send + Sync, + A::Model: Send + Sync, + <A::Effect as NacreEffect>::ShellEffect: Send, +{ + pub fn new( + sender: async_std::channel::Sender<Vec<<A::Effect as NacreEffect>::ShellEffect>>, + shell: Arc<dyn Shell>, + ) -> Self { + Self { + nacre: Nacre::new(sender), + shell, + } + } +} + +impl<A> NacreTrait<A> for NacreBridge<A> +where + A: crate::App + Send + Sync + 'static, + A::Effect: NacreEffect, + A::Capabilities: WithContext<A::Event, A::Effect> + Send + Sync, + A::Model: Send + Sync, + <A::Effect as NacreEffect>::ShellEffect: Send, +{ + fn register_callback( + &self, + receiver: async_std::channel::Receiver<ShellEffects<A>>, + cb: impl Fn(ShellEffects<A>) -> Vec<u8> + Send + 'static, + ) { + let shell = self.shell.clone(); + self.nacre.spawn(async move { + while let Ok(effect) = receiver.recv().await { + let bytes = cb(effect); + shell.handle_effects(bytes); + } + }); + } +} + +impl<A> Middleware for NacreBridge<A> +where + A: crate::App + Send + Sync + 'static, + A::Effect: NacreEffect, + A::Capabilities: WithContext<A::Event, A::Effect> + Send + Sync, + A::Model: Send + Sync, + <A::Effect as NacreEffect>::ShellEffect: Send, +{ + type App = A; + + fn process_event(&self, event: A::Event) -> impl Iterator<Item = A::Effect> { + self.nacre.process_event(event) + } + + fn process_effects(&self) -> impl Iterator<Item = A::Effect> { + self.nacre.process_effects() + } + + fn view(&self) -> A::ViewModel { + self.nacre.view() + } +} + +impl<A> Middleware for Nacre<A> +where + A: crate::App + Send + Sync + 'static, + A::Effect: NacreEffect, + A::Capabilities: WithContext<A::Event, A::Effect> + Send + Sync, + A::Model: Send + Sync, + <A::Effect as NacreEffect>::ShellEffect: Send, +{ + type App = A; + + fn process_event(&self, event: A::Event) -> impl Iterator<Item = A::Effect> { + self.process(self.core.process_event(event)); + vec![].into_iter() + } + + fn process_effects(&self) -> impl Iterator<Item = A::Effect> { + self.process(self.core.process_effects()); + vec![].into_iter() + } + + fn view(&self) -> A::ViewModel { + self.core.view() + } +} diff --git a/crux_core/src/bridge/shell.rs b/crux_core/src/bridge/shell.rs new file mode 100644 index 000000000..e90aa8e61 --- /dev/null +++ b/crux_core/src/bridge/shell.rs @@ -0,0 +1,3 @@ +pub trait Shell: Send + Sync { + fn handle_effects(&self, requests: Vec<u8>); +} diff --git a/crux_core/src/command/context.rs b/crux_core/src/command/context.rs index 45b25141a..9f9f90816 100644 --- a/crux_core/src/command/context.rs +++ b/crux_core/src/command/context.rs @@ -5,7 +5,6 @@ use std::task::{Context, Poll}; use crossbeam_channel::Sender; use futures::channel::mpsc; -use futures::future::Fuse; use futures::stream::StreamFuture; use futures::{FutureExt as _, Stream, StreamExt}; @@ -164,9 +163,8 @@ impl<T: Unpin + Send> ShellStream<T> { // Since neither part is Clone, we'll need to do an Indiana Jones // 1. take items out of self - let dummy = ShellStream::Sent(mpsc::unbounded().1); let ShellStream::ReadyToSend(send_request, output_receiver) = - std::mem::replace(self, dummy) + std::mem::replace(self, ShellStream::Sent(mpsc::unbounded().1)) else { unreachable!(); }; @@ -197,7 +195,7 @@ impl<T: Unpin + Send> Stream for ShellStream<T> { } pub struct ShellRequest<T: Unpin + Send> { - inner: Fuse<StreamFuture<ShellStream<T>>>, + inner: StreamFuture<ShellStream<T>>, } impl<T: Unpin + Send + 'static> ShellRequest<T> { @@ -205,9 +203,7 @@ impl<T: Unpin + Send + 'static> ShellRequest<T> { send_request: impl FnOnce() + Send + 'static, output_receiver: mpsc::UnboundedReceiver<T>, ) -> Self { - let inner = ShellStream::new(send_request, output_receiver) - .into_future() - .fuse(); + let inner = ShellStream::new(send_request, output_receiver).into_future(); Self { inner } } diff --git a/crux_core/src/core/middleware.rs b/crux_core/src/core/middleware.rs new file mode 100644 index 000000000..18eb11251 --- /dev/null +++ b/crux_core/src/core/middleware.rs @@ -0,0 +1,61 @@ +use super::Core; + +/// Implement Middleware for a type which wraps the [`Core`] and modifies its behaviour in some way. +/// This allows this new type to still be wrapped in a [`Bridge`], which is generic over an +/// implementation of `Middleware`. +/// +/// Middleware gets to adapt the incoming Events, the outgoing Effect requests, and the returned view model. +/// +/// Specifically, this is useful to provide Rust-side implementations of capabilities when they exist, +/// and are easily portable for the target platforms, so that they don't have to be implemented in the +/// shell several times. +pub trait Middleware { + type App: crate::App; + + /// Process an event. The middleware may capture or modify the incoming events. Note that these are + /// only the events originating outside the core, any internal events will be sent back to th app + /// by the `Core` directly + fn process_event( + &self, + event: <Self::App as crate::App>::Event, + ) -> impl Iterator<Item = <Self::App as crate::App>::Effect>; + + /// Process any unfinished effects tasks and return any resulting effect requests. + /// + /// Implementations are expected to call this method after resolving any effect requests to advance + /// the effects runtime. + /// + /// # Discussion + /// + /// The trait does not provide a `resolve_effect` method, because doing so would require middleware to hold + /// original Requests in their original form. As an example, the Bridge does not do this - instead, it converts + /// the Request into a similar type working with Serializers instead of values. The Core technically does not + /// require the original Request in order to proceed, the requests just needs to be resolved first, the + /// `Core` API is more of a convenience. + /// + // FIXME: This will generally just forward down, is there a way to provide a default implementation...? + fn process_effects(&self) -> impl Iterator<Item = <Self::App as crate::App>::Effect>; + + /// Return the view model from the app. This gives the middleware a chance to modify the view model + /// on the way out + fn view(&self) -> <Self::App as crate::App>::ViewModel; +} + +impl<A: crate::App> Middleware for Core<A> { + type App = A; + + fn process_event( + &self, + event: <Self::App as crate::App>::Event, + ) -> impl Iterator<Item = <Self::App as crate::App>::Effect> { + self.process_event(event) + } + + fn process_effects(&self) -> impl Iterator<Item = <Self::App as crate::App>::Effect> { + self.process() + } + + fn view(&self) -> <Self::App as crate::App>::ViewModel { + self.view() + } +} diff --git a/crux_core/src/core/mod.rs b/crux_core/src/core/mod.rs index d2a8c022e..bc6c3d43f 100644 --- a/crux_core/src/core/mod.rs +++ b/crux_core/src/core/mod.rs @@ -1,10 +1,14 @@ mod effect; +mod middleware; +mod nacre_effect; mod request; mod resolve; use std::sync::RwLock; pub use effect::Effect; +pub use middleware::Middleware; +pub use nacre_effect::NacreEffect; pub use request::Request; pub use resolve::ResolveError; @@ -83,7 +87,7 @@ where /// effect requests. // used in docs/internals/runtime.md // ANCHOR: process_event - pub fn process_event(&self, event: A::Event) -> Vec<A::Effect> { + pub fn process_event(&self, event: A::Event) -> impl Iterator<Item = A::Effect> + '_ { let mut model = self.model.write().expect("Model RwLock was poisoned."); let command = self.app.update(event, &mut model, &self.capabilities); @@ -108,7 +112,7 @@ where &self, request: &mut Request<Op>, result: Op::Output, - ) -> Result<Vec<A::Effect>, ResolveError> + ) -> Result<impl Iterator<Item = A::Effect> + '_, ResolveError> where Op: Operation, // ANCHOR_END: resolve_sig @@ -124,7 +128,7 @@ where // used in docs/internals/runtime.md // ANCHOR: process - pub(crate) fn process(&self) -> Vec<A::Effect> { + pub fn process(&self) -> impl Iterator<Item = A::Effect> + '_ { self.executor.run_all(); while let Some(capability_event) = self.capability_events.receive() { @@ -139,7 +143,7 @@ where self.executor.run_all(); } - self.requests.drain().collect() + self.requests.drain() } // ANCHOR_END: process diff --git a/crux_core/src/core/nacre_effect.rs b/crux_core/src/core/nacre_effect.rs new file mode 100644 index 000000000..6fcbc271c --- /dev/null +++ b/crux_core/src/core/nacre_effect.rs @@ -0,0 +1,16 @@ +use super::Effect; +use futures::Stream; +use std::fmt::Debug; +use std::sync::Arc; + +pub trait NacreEffect: Debug + Effect + Send + Sized { + type ShellEffect; + fn handle<A>( + self, + core: Arc<crate::Core<A>>, + ) -> impl Stream<Item = Vec<Self::ShellEffect>> + Send + where + A: crate::App<Effect = Self> + Send + Sync + 'static, + A::Capabilities: Send + Sync, + A::Model: Send + Sync; +} diff --git a/crux_core/src/lib.rs b/crux_core/src/lib.rs index eeef0f1f5..cc96cf1d7 100644 --- a/crux_core/src/lib.rs +++ b/crux_core/src/lib.rs @@ -171,7 +171,7 @@ pub use self::{ capabilities::*, capability::{Capability, WithContext}, command::Command, - core::{Core, Effect, Request, ResolveError}, + core::{Core, Effect, Middleware, NacreEffect, Request, ResolveError}, }; pub use crux_macros as macros; diff --git a/crux_core/tests/capability_runtime.rs b/crux_core/tests/capability_runtime.rs index 0552e5c98..8d212850f 100644 --- a/crux_core/tests/capability_runtime.rs +++ b/crux_core/tests/capability_runtime.rs @@ -217,7 +217,7 @@ mod tests { fn fetches_a_tree() { let core: Core<MyApp> = Core::new(); - let mut effects: VecDeque<Effect> = core.process_event(Event::Fetch).into(); + let mut effects: VecDeque<Effect> = core.process_event(Event::Fetch).collect(); let mut counter: usize = 1; @@ -234,7 +234,10 @@ mod tests { counter += 3; - let effs: Vec<Effect> = core.resolve(&mut request, output).expect("to resolve"); + let effs: Vec<Effect> = core + .resolve(&mut request, output) + .expect("to resolve") + .collect(); for e in effs { effects.push_back(e) @@ -262,7 +265,7 @@ mod tests { let core: Core<MyApp> = Core::new(); // Spawns the task - core.process_event(Event::Fetch); + let _ = core.process_event(Event::Fetch); drop(core); } diff --git a/crux_core/tests/json_bridge.rs b/crux_core/tests/json_bridge.rs index afceb007b..8f4315518 100644 --- a/crux_core/tests/json_bridge.rs +++ b/crux_core/tests/json_bridge.rs @@ -50,11 +50,11 @@ mod app { } mod core { - use crux_core::bridge::BridgeWithSerializer; + use crux_core::{bridge::BridgeWithSerializer, Core}; use crate::app::App; - pub type Bridge = BridgeWithSerializer<App>; + pub type Bridge = BridgeWithSerializer<Core<App>>; } mod tests { diff --git a/crux_macros/src/effect.rs b/crux_macros/src/effect.rs index c2b59a27e..2cd5fb171 100644 --- a/crux_macros/src/effect.rs +++ b/crux_macros/src/effect.rs @@ -3,7 +3,7 @@ use proc_macro2::{Literal, TokenStream}; use proc_macro_error::{abort_call_site, OptionExt}; use quote::{format_ident, quote}; use std::collections::BTreeMap; -use syn::{DeriveInput, GenericArgument, Ident, PathArguments, Type}; +use syn::{DeriveInput, GenericArgument, Ident, Path, PathArguments, Type}; #[derive(FromDeriveInput, Debug)] #[darling(attributes(effect), supports(struct_named))] @@ -20,6 +20,9 @@ pub struct EffectFieldReceiver { ty: Type, #[darling(default)] skip: bool, + notify_handler: Option<Path>, + request_handler: Option<Path>, + stream_handler: Option<Path>, } struct Field { @@ -27,6 +30,9 @@ struct Field { variant: Ident, event: Type, skip: bool, + notify_handler: Option<Path>, + request_handler: Option<Path>, + stream_handler: Option<Path>, } impl From<&EffectFieldReceiver> for Field { @@ -37,6 +43,9 @@ impl From<&EffectFieldReceiver> for Field { variant, event, skip: f.skip, + notify_handler: f.notify_handler.clone(), + request_handler: f.request_handler.clone(), + stream_handler: f.stream_handler.clone(), } } } @@ -45,14 +54,15 @@ impl ToTokens for EffectStructReceiver { fn to_tokens(&self, tokens: &mut TokenStream) { let ident = &self.ident; - let (effect_name, ffi_effect_name, ffi_effect_rename) = match self.name { + let (effect_name, shell_effect_name, ffi_effect_name, ffi_effect_rename) = match self.name { Some(ref name) => { let ffi_ef_name = format_ident!("{}Ffi", name); let ffi_ef_rename = Literal::string(&name.to_string()); + let shell_ef_name = format_ident!("Shell{}", name); - (quote!(#name), quote!(#ffi_ef_name), quote!(#ffi_ef_rename)) + (quote!(#name), quote!(#shell_ef_name), quote!(#ffi_ef_name), quote!(#ffi_ef_rename)) } - None => (quote!(Effect), quote!(EffectFfi), quote!("Effect")), + None => (quote!(Effect), quote!(ShellEffect), quote!(EffectFfi), quote!("Effect")), }; let fields = self @@ -83,6 +93,11 @@ impl ToTokens for EffectStructReceiver { let mut ffi_variants = Vec::new(); let mut match_arms = Vec::new(); let mut filters = Vec::new(); + let mut handlers = Vec::new(); + + let mut shell_variants = Vec::new(); + let mut from_effect_to_shell_effect_impl = Vec::new(); + let mut from_shell_effect_to_effect_impl = Vec::new(); for ( field_name, @@ -91,9 +106,63 @@ impl ToTokens for EffectStructReceiver { variant, event, skip, + notify_handler, + request_handler, + stream_handler, }, ) in fields.iter() { + if notify_handler.is_some() && request_handler.is_some() { + panic!( + "Field {} can't have both a sync and an async handler", + field_name.to_string() + ); + } + let once_handler = notify_handler.is_some() || request_handler.is_some(); + + if once_handler && stream_handler.is_some() { + panic!( + "Field {} can't have both a regular and a stream handler", + field_name.to_string() + ); + } + if let Some(handler) = notify_handler { + handlers.push(quote! { + #effect_name::#variant(mut request) => { + ::futures::stream::once(async move { + // Fire and forget, no need to resolve / process + let output: () = #handler(&request.operation).await; + }).boxed() + } + }); + } else if let Some(handler) = request_handler { + handlers.push(quote! { + #effect_name::#variant(mut request) => { + // We rely on nacre to provide a runtime here + ::futures::stream::once(async move { + let output = #handler(&request.operation).await; + request.resolve(output).unwrap(); + core.process().map(::std::convert::Into::into).collect() + }).boxed() + } + }); + } + + if let Some(handler) = stream_handler { + handlers.push(quote! { + #effect_name::#variant(mut request) => { + #handler(&request.operation) + .map(move |output| { + request.resolve(output).unwrap(); + core.process().map(::std::convert::Into::into).collect() + }).boxed() + } + }); + } + + let is_shell_capability = + notify_handler.is_none() && request_handler.is_none() && stream_handler.is_none(); + if *skip { let msg = format!("Requesting effects from capability \"{variant}\" is impossible because it was skipped",); with_context_fields.push(quote! { @@ -108,10 +177,28 @@ impl ToTokens for EffectStructReceiver { #variant(::crux_core::Request<<#capability<#event> as ::crux_core::capability::Capability<#event>>::Operation>) }); - ffi_variants.push(quote! { #variant(<#capability<#event> as ::crux_core::capability::Capability<#event>>::Operation) }); + if is_shell_capability { + + shell_variants.push(quote!{ + #variant(::crux_core::Request<<#capability<#event> as ::crux_core::capability::Capability<#event>>::Operation>) + }); - match_arms.push(quote! { #effect_name::#variant(request) => request.serialize(#ffi_effect_name::#variant) }); + ffi_variants.push(quote! { #variant(<#capability<#event> as ::crux_core::capability::Capability<#event>>::Operation) }); + from_effect_to_shell_effect_impl.push( + quote! { #effect_name::#variant(request) => #shell_effect_name::#variant(request) } + ); + + from_shell_effect_to_effect_impl.push( + quote! { #shell_effect_name::#variant(request) => #effect_name::#variant(request) } + ); + match_arms.push(quote! { #effect_name::#variant(request) => request.serialize(#ffi_effect_name::#variant) }); + } else { + let name_and_variant = quote! { #effect_name::#variant }; + + from_effect_to_shell_effect_impl.push(quote! { #effect_name::#variant(request) => panic!("capability {} is not implemented in the shell", stringify!(#name_and_variant)) }); + match_arms.push(quote! { #effect_name::#variant(request) => panic!("capability {} is not implemented in the shell", stringify!(#name_and_variant)) }); + } let filter_fn = format_ident!("is_{}", field_name); let map_fn = format_ident!("into_{}", field_name); let expect_fn = format_ident!("expect_{}", field_name); @@ -155,6 +242,58 @@ impl ToTokens for EffectStructReceiver { pub enum #effect_name { #(#variants ,)* } + + #[derive(Debug)] + pub enum #shell_effect_name { + #(#shell_variants ,)* + } + + impl From<#effect_name> for #shell_effect_name { + fn from(value: #effect_name) -> Self { + match value { + #(#from_effect_to_shell_effect_impl,)* + } + } + } + + impl From<#shell_effect_name> for #effect_name { + fn from(value: #shell_effect_name) -> Self { + match value { + #(#from_shell_effect_to_effect_impl,)* + } + } + } + + impl ::crux_core::NacreEffect for #effect_name { + type ShellEffect = #shell_effect_name; + + #[cfg(not(target_arch = "wasm32"))] + fn handle<A>(mut self, core: ::std::sync::Arc<::crux_core::Core<A>>) -> impl ::futures::Stream<Item = Vec<Self::ShellEffect>> + Send + where + A: ::crux_core::App<Effect = #effect_name> + 'static, + ::crux_core::Core<A>: Send + Sync + { + use futures::StreamExt; + + match self { + #(#handlers,)* + other => ::futures::stream::once(async move { vec![other.into()] }).boxed() + } + } + #[cfg(target_arch = "wasm32")] + fn handle<A>(mut self, core: ::std::sync::Arc<::crux_core::Core<A>>) -> impl ::futures::Stream<Item = Vec<Self::ShellEffect>> + Send + where + A: ::crux_core::App<Effect = #effect_name> + 'static, + ::crux_core::Core<A>: Send + Sync + { + use futures::StreamExt; + + match self { + #(#handlers ,)* + other => ::futures::stream::once(async move { vec![other.into()] }).boxed() + } + } + } #[derive(::serde::Serialize, ::serde::Deserialize)] #[serde(rename = #ffi_effect_rename)] diff --git a/crux_macros/src/export.rs b/crux_macros/src/export.rs index 2d9735037..d079fbfb1 100644 --- a/crux_macros/src/export.rs +++ b/crux_macros/src/export.rs @@ -2,7 +2,7 @@ use darling::{ast, util, FromDeriveInput, FromField, ToTokens}; use proc_macro2::TokenStream; use proc_macro_error::OptionExt; use quote::{format_ident, quote}; -use syn::{DeriveInput, GenericArgument, Ident, PathArguments, Type}; +use syn::{DeriveInput, GenericArgument, Ident, Path, PathArguments, Type}; #[derive(FromDeriveInput, Debug)] #[darling(attributes(effect), supports(struct_named))] @@ -18,6 +18,15 @@ pub struct ExportFieldReceiver { ty: Type, #[darling(default)] skip: bool, + notify_handler: Option<Path>, + request_handler: Option<Path>, + stream_handler: Option<Path>, +} + +impl ExportFieldReceiver { + fn is_shell_capability(&self) -> bool { + self.notify_handler.is_none() && self.request_handler.is_none() && self.stream_handler.is_none() + } } impl ToTokens for ExportStructReceiver { @@ -45,7 +54,10 @@ impl ToTokens for ExportStructReceiver { let mut output_type_exports = Vec::new(); - for (capability, event) in fields.iter().map(|f| split_on_generic(&f.ty)) { + for (capability, event) in fields + .iter() + .filter_map(|f| f.is_shell_capability().then_some(split_on_generic(&f.ty))) + { output_type_exports.push(quote! { #capability::<#event>::register_types(generator)?; }); diff --git a/examples/simple_counter/Cargo.lock b/examples/simple_counter/Cargo.lock index db541719a..d38e45681 100644 --- a/examples/simple_counter/Cargo.lock +++ b/examples/simple_counter/Cargo.lock @@ -99,28 +99,237 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d301b3b94cb4b2f23d7917810addbbaff90738e0ca2be692bd027e70d7e0330c" +[[package]] +name = "askama" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b79091df18a97caea757e28cd2d5fda49c6cd4bd01ddffd7ff01ace0c0ad2c28" +dependencies = [ + "askama_derive", + "askama_escape", +] + +[[package]] +name = "askama_derive" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19fe8d6cb13c4714962c072ea496f3392015f0989b1a2847bb4b2d9effd71d83" +dependencies = [ + "askama_parser", + "basic-toml", + "mime", + "mime_guess", + "proc-macro2", + "quote", + "serde", + "syn 2.0.100", +] + +[[package]] +name = "askama_escape" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" + +[[package]] +name = "askama_parser" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acb1161c6b64d1c3d83108213c2a2533a342ac225aabd0bda218278c2ddb00c0" +dependencies = [ + "nom", +] + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "slab", +] + +[[package]] +name = "async-global-executor" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" +dependencies = [ + "async-channel 2.3.1", + "async-executor", + "async-io", + "async-lock", + "blocking", + "futures-lite", + "once_cell", +] + +[[package]] +name = "async-io" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +dependencies = [ + "async-lock", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "tracing", + "windows-sys", +] + [[package]] name = "async-lock" version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener", + "event-listener 5.4.0", "event-listener-strategy", "pin-project-lite", ] +[[package]] +name = "async-process" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" +dependencies = [ + "async-channel 2.3.1", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener 5.4.0", + "futures-lite", + "rustix", + "tracing", +] + +[[package]] +name = "async-signal" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys", +] + +[[package]] +name = "async-std" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c634475f29802fde2b8f0b505b1bd00dfe4df7d4a000f0b36f7671197d5c3615" +dependencies = [ + "async-channel 1.9.0", + "async-global-executor", + "async-io", + "async-lock", + "async-process", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite", + "gloo-timers 0.3.0", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + [[package]] name = "async-trait" -version = "0.1.87" +version = "0.1.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d556ec1359574147ec0c4fc5eb525f3f23263a592b1a9c07e0a75b427de55c97" +checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "attribute-derive" version = "0.10.3" @@ -132,7 +341,7 @@ dependencies = [ "manyhow", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -148,7 +357,7 @@ dependencies = [ "proc-macro2", "quote", "quote-use", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -180,9 +389,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "basic-toml" -version = "0.1.10" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" +checksum = "823388e228f614e9558c6804262db37960ec8821856535f5c3f59913140558f8" dependencies = [ "serde", ] @@ -198,9 +407,15 @@ dependencies = [ [[package]] name = "bitflags" -version = "2.9.0" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" [[package]] name = "block-buffer" @@ -211,6 +426,19 @@ dependencies = [ "generic-array", ] +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel 2.3.1", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + [[package]] name = "boolinator" version = "2.4.0" @@ -231,9 +459,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.10.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" [[package]] name = "camino" @@ -302,9 +530,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.31" +version = "4.5.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "027bb0d98429ae334a8698531da7077bdf906419543a35a55c2cb1b66437d767" +checksum = "92b7b18d71fad5313a1e320fa9897994228ce274b60faa4d694fe0ea89cd9e6d" dependencies = [ "clap_builder", "clap_derive", @@ -312,9 +540,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.31" +version = "4.5.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5589e0cba072e0f3d23791efac0fd8627b49c829c196a492e88168e6a669d863" +checksum = "a35db2071778a7344791a4fb4f95308b5673d219dee3ae348b86642574ecc90c" dependencies = [ "anstream", "anstyle", @@ -331,7 +559,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -413,7 +641,7 @@ checksum = "04382d0d9df7434af6b1b49ea1a026ef39df1b0738b1cc373368cf175354f6eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -486,9 +714,11 @@ name = "crux_core" version = "0.12.2" dependencies = [ "anyhow", + "async-std", "bincode", "crossbeam-channel", "crux_macros", + "either", "erased-serde", "futures", "serde", @@ -496,7 +726,10 @@ dependencies = [ "serde-reflection", "serde_json", "slab", + "streamunordered", "thiserror 2.0.12", + "tracing", + "wasm-bindgen-futures", ] [[package]] @@ -507,7 +740,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -541,7 +774,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -552,7 +785,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -565,7 +798,7 @@ dependencies = [ "hashbrown 0.14.5", "lock_api", "once_cell", - "parking_lot_core", + "parking_lot_core 0.9.10", ] [[package]] @@ -579,7 +812,7 @@ dependencies = [ "hashbrown 0.14.5", "lock_api", "once_cell", - "parking_lot_core", + "parking_lot_core 0.9.10", ] [[package]] @@ -596,7 +829,7 @@ checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -682,7 +915,7 @@ dependencies = [ "dioxus-rsx", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -821,7 +1054,7 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -880,7 +1113,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -894,7 +1127,7 @@ dependencies = [ "futures-util", "generational-box", "once_cell", - "parking_lot", + "parking_lot 0.12.3", "rustc-hash 1.1.0", "tracing", "warnings", @@ -941,7 +1174,7 @@ dependencies = [ "proc-macro2", "quote", "server_fn_macro 0.6.15", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -952,7 +1185,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -969,9 +1202,9 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "dyn-clone" -version = "1.0.19" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" +checksum = "feeef44e73baff3a26d371801df019877a9866a8c493d315ab00177843314f35" [[package]] name = "either" @@ -1007,7 +1240,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -1018,14 +1251,24 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "erased-serde" -version = "0.4.6" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" +checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d" dependencies = [ "serde", "typeid", ] +[[package]] +name = "errno" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys", +] + [[package]] name = "euclid" version = "0.22.11" @@ -1035,6 +1278,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + [[package]] name = "event-listener" version = "5.4.0" @@ -1052,10 +1301,16 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" dependencies = [ - "event-listener", + "event-listener 5.4.0", "pin-project-lite", ] +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + [[package]] name = "fnv" version = "1.0.7" @@ -1129,6 +1384,19 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +[[package]] +name = "futures-lite" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.31" @@ -1137,7 +1405,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -1176,7 +1444,7 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a673cf4fb0ea6a91aa86c08695756dfe875277a912cdbf33db9a9f62d47ed82b" dependencies = [ - "parking_lot", + "parking_lot 0.12.3", "tracing", ] @@ -1517,6 +1785,8 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" dependencies = [ + "futures-channel", + "futures-core", "js-sys", "wasm-bindgen", ] @@ -1592,7 +1862,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -1655,6 +1925,12 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + [[package]] name = "html-escape" version = "0.2.13" @@ -1688,9 +1964,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.10.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" [[package]] name = "hydration_context" @@ -1821,7 +2097,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -1863,12 +2139,12 @@ dependencies = [ [[package]] name = "implicit-clone-derive" -version = "0.1.2" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "699c1b6d335e63d0ba5c1e1c7f647371ce989c3bcbe1f7ed2b85fa56e3bd1a21" +checksum = "9311685eb9a34808bbb0608ad2fcab9ae216266beca5848613e95553ac914e3b" dependencies = [ "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -1905,6 +2181,15 @@ dependencies = [ "hashbrown 0.15.2", ] +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + [[package]] name = "interpolator" version = "0.5.0" @@ -1928,9 +2213,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "js-sys" @@ -1948,7 +2233,16 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" dependencies = [ - "bitflags", + "bitflags 2.8.0", +] + +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", ] [[package]] @@ -2036,12 +2330,12 @@ dependencies = [ "anyhow", "camino", "indexmap", - "parking_lot", + "parking_lot 0.12.3", "proc-macro2", "quote", "rstml", "serde", - "syn 2.0.99", + "syn 2.0.100", "walkdir", ] @@ -2063,7 +2357,7 @@ dependencies = [ "quote", "rstml", "server_fn_macro 0.7.7", - "syn 2.0.99", + "syn 2.0.100", "uuid", ] @@ -2089,9 +2383,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.170" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "linear-map" @@ -2099,11 +2393,17 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfae20f6b19ad527b550c223fddc3077a547fc70cda94b9b566575423fd303ee" +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + [[package]] name = "litemap" -version = "0.7.5" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "lock_api" @@ -2117,9 +2417,12 @@ dependencies = [ [[package]] name = "log" -version = "0.4.26" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" +dependencies = [ + "value-bag", +] [[package]] name = "longest-increasing-subsequence" @@ -2160,7 +2463,7 @@ dependencies = [ "manganis-core", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -2172,7 +2475,7 @@ dependencies = [ "manyhow-macros", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -2216,9 +2519,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.5" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b" dependencies = [ "adler2", ] @@ -2254,7 +2557,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.9", "libc", ] @@ -2295,6 +2598,17 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + [[package]] name = "parking_lot" version = "0.12.3" @@ -2302,7 +2616,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", - "parking_lot_core", + "parking_lot_core 0.9.10", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi", ] [[package]] @@ -2313,7 +2641,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.8", "smallvec", "windows-targets", ] @@ -2382,22 +2710,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.10" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.10" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -2423,12 +2751,38 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + [[package]] name = "plain" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" +[[package]] +name = "polling" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.4.0", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys", +] + [[package]] name = "ppv-lite86" version = "0.2.20" @@ -2440,12 +2794,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.30" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1ccf34da56fc294e7d4ccf69a85992b7dfb826b7cf57bac6a70bba3494cc08a" +checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" dependencies = [ "proc-macro2", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -2501,7 +2855,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -2538,7 +2892,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", "version_check", "yansi", ] @@ -2562,9 +2916,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.39" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] @@ -2588,7 +2942,7 @@ dependencies = [ "proc-macro-utils", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -2667,16 +3021,25 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] name = "redox_syscall" -version = "0.5.10" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "bitflags", + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +dependencies = [ + "bitflags 2.8.0", ] [[package]] @@ -2708,45 +3071,6 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "rinja" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dc4940d00595430b3d7d5a01f6222b5e5b51395d1120bdb28d854bb8abb17a5" -dependencies = [ - "itoa", - "rinja_derive", -] - -[[package]] -name = "rinja_derive" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d9ed0146aef6e2825f1b1515f074510549efba38d71f4554eec32eb36ba18b" -dependencies = [ - "basic-toml", - "memchr", - "mime", - "mime_guess", - "proc-macro2", - "quote", - "rinja_parser", - "rustc-hash 2.1.1", - "serde", - "syn 2.0.99", -] - -[[package]] -name = "rinja_parser" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f9a866e2e00a7a1fb27e46e9e324a6f7c0e7edc4543cae1d38f4e4a100c610" -dependencies = [ - "memchr", - "nom", - "serde", -] - [[package]] name = "rstml" version = "0.12.1" @@ -2757,7 +3081,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.99", + "syn 2.0.100", "syn_derive", "thiserror 2.0.12", ] @@ -2780,17 +3104,30 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.8.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + [[package]] name = "rustversion" -version = "1.0.20" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "ryu" -version = "1.0.20" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" [[package]] name = "same-file" @@ -2824,14 +3161,14 @@ checksum = "7f81c2fde025af7e69b1d1420531c8a8811ca898919db177141a85313b1cb932" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] name = "semver" -version = "1.0.26" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" dependencies = [ "serde", ] @@ -2847,9 +3184,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.218" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] @@ -2903,13 +3240,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.218" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -3035,7 +3372,7 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", "xxhash-rust", ] @@ -3049,7 +3386,7 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", "xxhash-rust", ] @@ -3060,7 +3397,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f2aa8119b558a17992e0ac1fd07f080099564f24532858811ce04f742542440" dependencies = [ "server_fn_macro 0.6.15", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -3070,7 +3407,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "563909a43390341403ab76fbc33fde306712613da02244e692eabeae8ffde949" dependencies = [ "server_fn_macro 0.7.7", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -3097,11 +3434,17 @@ dependencies = [ name = "shared" version = "0.1.0" dependencies = [ + "async-std", + "async-stream", "crux_core", + "futures", + "futures-util", "lazy_static", "serde", "uniffi", "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-timer", ] [[package]] @@ -3113,6 +3456,15 @@ dependencies = [ "shared", ] +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + [[package]] name = "siphasher" version = "0.3.11" @@ -3145,7 +3497,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33a1b4f13e2bbf2f5b29d09dfebc9de69229ffee245aed80e3b70f9b5fd28c06" dependencies = [ "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -3191,6 +3543,18 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "streamunordered" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0baba51055b6c1a4e39ade5df203cd3cf96780c645be651f42214576c942df54" +dependencies = [ + "futures-core", + "futures-sink", + "futures-util", + "slab", +] + [[package]] name = "strsim" version = "0.11.1" @@ -3210,9 +3574,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.99" +version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e02e925281e18ffd9d640e234264753c43edc62d64b2d4cf898f1bc5e75f3fc2" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", @@ -3228,7 +3592,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -3239,7 +3603,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -3264,7 +3628,7 @@ dependencies = [ "oco_ref", "once_cell", "or_poisoned", - "parking_lot", + "parking_lot 0.12.3", "paste", "reactive_graph", "reactive_stores", @@ -3288,9 +3652,9 @@ dependencies = [ [[package]] name = "textwrap" -version = "0.16.2" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" dependencies = [ "smawk", ] @@ -3321,7 +3685,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -3332,7 +3696,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -3436,7 +3800,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "winnow 0.7.3", + "winnow 0.7.2", ] [[package]] @@ -3458,7 +3822,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -3527,14 +3891,14 @@ checksum = "560b82d656506509d43abe30e0ba64c56b1953ab3d4fe7ba5902747a7a3cedd5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] name = "typeid" -version = "1.0.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" +checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e" [[package]] name = "typenum" @@ -3550,9 +3914,9 @@ checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" [[package]] name = "unicode-segmentation" @@ -3574,9 +3938,9 @@ checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "uniffi" -version = "0.29.0" +version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba62a57e90f9baed5ad02a71a0870180fa1cc35499093b2d21be2edfb68ec0f7" +checksum = "4cb08c58c7ed7033150132febe696bef553f891b1ede57424b40d87a89e3c170" dependencies = [ "anyhow", "camino", @@ -3590,11 +3954,12 @@ dependencies = [ [[package]] name = "uniffi_bindgen" -version = "0.29.0" +version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2242f35214f1e0e3b47c495d340c69f649f9a9ece3a943a29e275686cc884533" +checksum = "cade167af943e189a55020eda2c314681e223f1e42aca7c4e52614c2b627698f" dependencies = [ "anyhow", + "askama", "camino", "cargo_metadata", "fs-err", @@ -3603,9 +3968,8 @@ dependencies = [ "heck 0.5.0", "once_cell", "paste", - "rinja", "serde", - "textwrap 0.16.2", + "textwrap 0.16.1", "toml 0.5.11", "uniffi_meta", "uniffi_udl", @@ -3613,75 +3977,92 @@ dependencies = [ [[package]] name = "uniffi_build" -version = "0.29.0" +version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c887a6c9a2857d8dc2ab0c8d578e8aa4978145b4fd65ed44296341e89aebc3cc" +checksum = "4c7cf32576e08104b7dc2a6a5d815f37616e66c6866c2a639fe16e6d2286b75b" dependencies = [ "anyhow", "camino", "uniffi_bindgen", ] +[[package]] +name = "uniffi_checksum_derive" +version = "0.28.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "802d2051a700e3ec894c79f80d2705b69d85844dafbbe5d1a92776f8f48b563a" +dependencies = [ + "quote", + "syn 2.0.100", +] + [[package]] name = "uniffi_core" -version = "0.29.0" +version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cad9fbdeb7ae4daf8d0f7704a3b638c37018eb16bb701e30fa17a2dd3e2d39c1" +checksum = "bc7687007d2546c454d8ae609b105daceb88175477dac280707ad6d95bcd6f1f" dependencies = [ "anyhow", "bytes", + "log", "once_cell", "paste", "static_assertions", ] -[[package]] -name = "uniffi_internal_macros" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22a9dba1d78b9ce429439891089c223478043d52a1c3176a0fcea2b5573a7fcf" -dependencies = [ - "quote", - "syn 2.0.99", -] - [[package]] name = "uniffi_macros" -version = "0.29.0" +version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78dd5f8eefba5898b901086f5e7916da67b9a5286a01cc44e910cd75fa37c630" +checksum = "12c65a5b12ec544ef136693af8759fb9d11aefce740fb76916721e876639033b" dependencies = [ + "bincode", "camino", "fs-err", "once_cell", "proc-macro2", "quote", "serde", - "syn 2.0.99", + "syn 2.0.100", "toml 0.5.11", "uniffi_meta", ] [[package]] name = "uniffi_meta" -version = "0.29.0" +version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5965b1d4ffacef1eaa72fef9c00d2491641e87ad910f6c5859b9c503ddb16a" +checksum = "4a74ed96c26882dac1ca9b93ca23c827e284bacbd7ec23c6f0b0372f747d59e4" dependencies = [ "anyhow", + "bytes", "siphasher", - "uniffi_internal_macros", + "uniffi_checksum_derive", +] + +[[package]] +name = "uniffi_testing" +version = "0.28.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6f984f0781f892cc864a62c3a5c60361b1ccbd68e538e6c9fbced5d82268ac" +dependencies = [ + "anyhow", + "camino", + "cargo_metadata", + "fs-err", + "once_cell", ] [[package]] name = "uniffi_udl" -version = "0.29.0" +version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "279b82bac9a382c796a0d210bb8354a0b813499b28aa1de046c85d78ca389805" +checksum = "037820a4cfc4422db1eaa82f291a3863c92c7d1789dc513489c36223f9b4cdfc" dependencies = [ "anyhow", - "textwrap 0.16.2", + "textwrap 0.16.1", "uniffi_meta", + "uniffi_testing", "weedle2", ] @@ -3728,13 +4109,19 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.15.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f540e3240398cce6128b64ba83fdbdd86129c16a3aa1a3a252efd66eb3d587" +checksum = "8c1f41ffb7cf259f1ecc2876861a17e7142e63ead296f671f81f6ae85903e0d6" dependencies = [ "getrandom 0.3.1", ] +[[package]] +name = "value-bag" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" + [[package]] name = "version_check" version = "0.9.5" @@ -3770,7 +4157,7 @@ checksum = "59195a1db0e95b920366d949ba5e0d3fc0e70b67c09be15ce5abb790106b0571" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -3810,7 +4197,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", "wasm-bindgen-shared", ] @@ -3845,7 +4232,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3872,6 +4259,21 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wasm-timer" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" +dependencies = [ + "futures", + "js-sys", + "parking_lot 0.11.2", + "pin-utils", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "web-dioxus" version = "0.1.0" @@ -3906,6 +4308,7 @@ dependencies = [ name = "web-yew" version = "0.1.0" dependencies = [ + "async-std", "shared", "yew", ] @@ -3919,6 +4322,22 @@ dependencies = [ "nom", ] +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + [[package]] name = "winapi-util" version = "0.1.9" @@ -3928,6 +4347,12 @@ dependencies = [ "windows-sys", ] +[[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-sys" version = "0.59.0" @@ -4012,9 +4437,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.3" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" +checksum = "59690dea168f2198d1a3b0cac23b8063efcd11012f10ae4698f284808c8ef603" dependencies = [ "memchr", ] @@ -4025,7 +4450,7 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" dependencies = [ - "bitflags", + "bitflags 2.8.0", ] [[package]] @@ -4089,7 +4514,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] @@ -4112,7 +4537,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", "synstructure", ] @@ -4134,27 +4559,27 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", "synstructure", ] @@ -4177,5 +4602,5 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.99", + "syn 2.0.100", ] diff --git a/examples/simple_counter/Cargo.toml b/examples/simple_counter/Cargo.toml index afcd8f9d4..20dc880e4 100644 --- a/examples/simple_counter/Cargo.toml +++ b/examples/simple_counter/Cargo.toml @@ -13,6 +13,7 @@ rust-version = "1.66" [workspace.dependencies] anyhow = "1.0.97" crux_core = { path = "../../crux_core" } +# crux_core = "0.12.0" serde = "1.0.218" [workspace.metadata.bin] diff --git a/examples/simple_counter/iOS/SimpleCounter.xcodeproj/project.pbxproj b/examples/simple_counter/iOS/SimpleCounter.xcodeproj/project.pbxproj index d82722a4b..a129cba1d 100644 --- a/examples/simple_counter/iOS/SimpleCounter.xcodeproj/project.pbxproj +++ b/examples/simple_counter/iOS/SimpleCounter.xcodeproj/project.pbxproj @@ -7,9 +7,9 @@ objects = { /* Begin PBXBuildFile section */ - 1989BD3C863A9FB37C889B6D /* SharedTypes in Frameworks */ = {isa = PBXBuildFile; productRef = ADFA4530638891CDAA6FCC5D /* SharedTypes */; }; 2AD69AC61D674BB2BC300FC2 /* uniffi-bindgen in Resources */ = {isa = PBXBuildFile; fileRef = E75E53B837C6A0E03FDCEC5A /* uniffi-bindgen */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 401EA3CBD0D2AD8D475C10AF /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842F8D01CC76E9BFCDBD2862 /* ContentView.swift */; }; + 84BF53E12D73534800EF5B47 /* SharedTypes in Frameworks */ = {isa = PBXBuildFile; productRef = 84BF53E02D73534800EF5B47 /* SharedTypes */; }; 94DCD6C97BBC86B89673CA0E /* core.swift in Sources */ = {isa = PBXBuildFile; fileRef = 258EC994D7C693E3141C4563 /* core.swift */; }; A022BC4B1B16254762ED55B3 /* shared.udl in Sources */ = {isa = PBXBuildFile; fileRef = 8B8EC4C63F3ECC2B26BBAEC2 /* shared.udl */; }; C26A1E5DDAB1ED32518E8F2A /* libshared_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2EA4D4AAE1A6C4D3400A9A06 /* libshared_static.a */; }; @@ -76,7 +76,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 1974E5BC3D6D22A1D5676B40 /* SimpleCounter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SimpleCounter.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 1974E5BC3D6D22A1D5676B40 /* SimpleCounter.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = SimpleCounter.app; sourceTree = BUILT_PRODUCTS_DIR; }; 258EC994D7C693E3141C4563 /* core.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = core.swift; sourceTree = "<group>"; }; 642CF26F4B57B0FF7348C6BF /* SharedTypes */ = {isa = PBXFileReference; lastKnownFileType = folder; name = SharedTypes; path = ../shared_types/generated/swift/SharedTypes; sourceTree = SOURCE_ROOT; }; 842F8D01CC76E9BFCDBD2862 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; }; @@ -92,7 +92,7 @@ buildActionMask = 2147483647; files = ( C26A1E5DDAB1ED32518E8F2A /* libshared_static.a in Frameworks */, - 1989BD3C863A9FB37C889B6D /* SharedTypes in Frameworks */, + 84BF53E12D73534800EF5B47 /* SharedTypes in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -107,6 +107,7 @@ A58FEB50EA86B3FEA463FCF0 /* src */, D4D259F256E0F508B61E0EA9 /* Products */, B6068D7E9E67CAA3B5F4F827 /* Projects */, + 84BF53DF2D73534800EF5B47 /* Frameworks */, ); sourceTree = "<group>"; }; @@ -120,6 +121,13 @@ name = Products; sourceTree = "<group>"; }; + 84BF53DF2D73534800EF5B47 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = "<group>"; + }; A58FEB50EA86B3FEA463FCF0 /* src */ = { isa = PBXGroup; children = ( @@ -184,7 +192,7 @@ ); name = SimpleCounter; packageProductDependencies = ( - ADFA4530638891CDAA6FCC5D /* SharedTypes */, + 84BF53E02D73534800EF5B47 /* SharedTypes */, ); productName = SimpleCounter; productReference = 1974E5BC3D6D22A1D5676B40 /* SimpleCounter.app */; @@ -470,7 +478,7 @@ /* End XCConfigurationList section */ /* Begin XCSwiftPackageProductDependency section */ - ADFA4530638891CDAA6FCC5D /* SharedTypes */ = { + 84BF53E02D73534800EF5B47 /* SharedTypes */ = { isa = XCSwiftPackageProductDependency; productName = SharedTypes; }; diff --git a/examples/simple_counter/iOS/SimpleCounter/ContentView.swift b/examples/simple_counter/iOS/SimpleCounter/ContentView.swift index 243659d8b..221f5f4ef 100644 --- a/examples/simple_counter/iOS/SimpleCounter/ContentView.swift +++ b/examples/simple_counter/iOS/SimpleCounter/ContentView.swift @@ -11,8 +11,8 @@ struct ContentView: View { .foregroundColor(.accentColor) Text(core.view.count) HStack { - ActionButton(label: "Reset", color: .red) { - core.update(.reset) + ActionButton(label: "0", color: .red) { + core.update(.delayReset) } ActionButton(label: "Inc", color: .green) { core.update(.increment) @@ -20,6 +20,9 @@ struct ContentView: View { ActionButton(label: "Dec", color: .yellow) { core.update(.decrement) } + ActionButton(label: "int", color: .blue) { + core.update(.startInterval) + } } } } diff --git a/examples/simple_counter/iOS/SimpleCounter/core.swift b/examples/simple_counter/iOS/SimpleCounter/core.swift index bbe1cb366..602527083 100644 --- a/examples/simple_counter/iOS/SimpleCounter/core.swift +++ b/examples/simple_counter/iOS/SimpleCounter/core.swift @@ -1,12 +1,32 @@ import Foundation import SharedTypes +import OSLog + +extension Core: Shell { + nonisolated + func handleEffects(_ requests: Data) { + let requests: [Request] = try! .bincodeDeserialize(input: [UInt8](requests)) + let logger = Logger(subsystem: "com.example.my-app", category: "app") + logger.log("async requests received") + dump(requests) + Task { + for request in requests { + await processEffect(request) + } + } + } +} + @MainActor class Core: ObservableObject { - @Published var view: ViewModel + @Published var view: ViewModel! init() { + // TODO: maybe unregister somewhere? + new(self) self.view = try! .bincodeDeserialize(input: [UInt8](SimpleCounter.view())) + self.update(.startInterval) } func update(_ event: Event) { diff --git a/examples/simple_counter/shared/Cargo.toml b/examples/simple_counter/shared/Cargo.toml index 16233bc98..01845f923 100644 --- a/examples/simple_counter/shared/Cargo.toml +++ b/examples/simple_counter/shared/Cargo.toml @@ -15,11 +15,17 @@ typegen = ["crux_core/typegen"] crux_core.workspace = true serde = { workspace = true, features = ["derive"] } lazy_static = "1.5.0" -uniffi = "0.29.0" +uniffi = "=0.28.3" wasm-bindgen = "0.2.100" +async-std = "1.13.0" +async-stream = "0.3.6" +futures = "0.3.31" +futures-util = "0.3.31" +wasm-bindgen-futures = "0.4.50" +wasm-timer = "0.2.5" [target.uniffi-bindgen.dependencies] -uniffi = { version = "0.29.0", features = ["cli"] } +uniffi = { version = "=0.28.3", features = ["cli"] } [build-dependencies] -uniffi = { version = "0.29.0", features = ["build"] } +uniffi = { version = "=0.28.3", features = ["build"] } diff --git a/examples/simple_counter/shared/src/app.rs b/examples/simple_counter/shared/src/app.rs index 43353dbb7..5d43662ca 100644 --- a/examples/simple_counter/shared/src/app.rs +++ b/examples/simple_counter/shared/src/app.rs @@ -1,4 +1,6 @@ // ANCHOR: app +use super::capabilities::delay::Delay; +use super::capabilities::interval::Interval; use crux_core::{ render::{render, Render}, App, Command, @@ -7,6 +9,8 @@ use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Clone, Debug)] pub enum Event { + StartInterval, + DelayReset, Increment, Decrement, Reset, @@ -27,6 +31,10 @@ pub struct ViewModel { #[allow(unused)] pub struct Capabilities { render: Render<Event>, + #[effect(stream_handler = crate::capabilities::interval::interval)] + interval: Interval<Event>, + #[effect(request_handler = crate::capabilities::delay::delay)] + delay: Delay<Event>, } #[derive(Default)] @@ -44,39 +52,33 @@ impl App for Counter { &self, event: Self::Event, model: &mut Self::Model, - _caps: &Self::Capabilities, + caps: &Self::Capabilities, ) -> Command<Effect, Event> { - // we no longer use the capabilities directly, but they are passed in - // until the migration to managed effects with `Command` is complete - // (at which point the capabilities will be removed from the `update` - // signature). Until then we delegate to our own `update` method so that - // we can test the app without needing to use AppTester. - self.update(event, model) - } - - fn view(&self, model: &Self::Model) -> Self::ViewModel { - ViewModel { - count: format!("Count is: {}", model.count), - } - } -} -// ANCHOR_END: impl_app - -impl Counter { - // note: this function can be moved into the `App` trait implementation, above, - // once the `App` trait has been updated (as the final part of the migration - // to managed effects with `Command`). - fn update(&self, event: Event, model: &mut Model) -> Command<Effect, Event> { match event { Event::Increment => model.count += 1, Event::Decrement => model.count -= 1, + Event::DelayReset => { + caps.delay.start(5000, Event::Reset); + return Command::done(); + } Event::Reset => model.count = 0, + // Increment every one second, 10 times + Event::StartInterval => { + caps.interval.start(1000, 10, |_| Event::Increment); + return Command::done(); + } }; render() } + + fn view(&self, model: &Self::Model) -> Self::ViewModel { + ViewModel { + count: format!("Count is: {}", model.count), + } + } } -// ANCHOR_END: app +// ANCHOR_END: impl_app // ANCHOR: test #[cfg(test)] diff --git a/examples/simple_counter/shared/src/capabilities/delay.rs b/examples/simple_counter/shared/src/capabilities/delay.rs new file mode 100644 index 000000000..0707d2c44 --- /dev/null +++ b/examples/simple_counter/shared/src/capabilities/delay.rs @@ -0,0 +1,66 @@ +use crux_core::capability::{CapabilityContext, Operation}; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +pub enum DelayOperation { + Start { millis: usize }, +} + +impl Operation for DelayOperation { + type Output = (); +} + +#[derive(crux_core::macros::Capability)] +pub struct Delay<Event> { + context: CapabilityContext<DelayOperation, Event>, +} + +impl<Ev> Delay<Ev> +where + Ev: 'static, +{ + pub fn new(context: CapabilityContext<DelayOperation, Ev>) -> Self { + Self { context } + } + + pub fn start(&self, millis: usize, event: Ev) + where + Ev: Send, + { + self.context.spawn({ + let context = self.context.clone(); + + async move { + context + .request_from_shell(DelayOperation::Start { millis }) + .await; + + context.update_app(event); + } + }) + } +} + +#[allow(unused)] +#[cfg(target_arch = "wasm32")] +pub async fn delay(delay: &DelayOperation) -> <DelayOperation as Operation>::Output { + let (sender, receiver) = async_std::channel::bounded(1); + let DelayOperation::Start { millis } = delay; + let duration = std::time::Duration::from_millis(*millis as u64); + wasm_bindgen_futures::spawn_local(async move { + _delay(duration).await; + sender.send(()).await.unwrap(); + }); + receiver.recv().await; +} + +#[cfg(not(target_arch = "wasm32"))] +pub async fn delay(delay: &DelayOperation) -> <DelayOperation as Operation>::Output { + let DelayOperation::Start { millis } = delay; + let duration = std::time::Duration::from_millis(*millis as u64); + _delay(duration).await; +} + +pub async fn _delay(duration: std::time::Duration) -> <DelayOperation as Operation>::Output { + async_std::task::sleep(duration).await; +} diff --git a/examples/simple_counter/shared/src/capabilities/interval.rs b/examples/simple_counter/shared/src/capabilities/interval.rs new file mode 100644 index 000000000..fe07b70db --- /dev/null +++ b/examples/simple_counter/shared/src/capabilities/interval.rs @@ -0,0 +1,84 @@ +use crux_core::capability::{CapabilityContext, Operation}; +use futures::future::Future; +use futures_util::stream::StreamExt; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +pub enum IntervalOperation { + Start { millis: usize, times: usize }, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)] +pub struct IntervalTick {} + +impl Operation for IntervalOperation { + type Output = IntervalTick; +} + +#[derive(crux_core::macros::Capability)] +pub struct Interval<Event> { + context: CapabilityContext<IntervalOperation, Event>, +} + +impl<Ev> Interval<Ev> +where + Ev: Send + 'static, +{ + pub fn new(context: CapabilityContext<IntervalOperation, Ev>) -> Self { + Self { context } + } + + pub fn start<F>(&self, millis: usize, times: usize, callback: F) + where + F: Fn(IntervalTick) -> Ev + Send + 'static, + { + let ctx = self.context.clone(); + self.context.spawn(async move { + let mut stream = ctx.stream_from_shell(IntervalOperation::Start { millis, times }); + + while let Some(res) = stream.next().await { + ctx.update_app(callback(res)); + } + }); + } +} + +#[allow(unused)] +pub fn interval( + interval: &IntervalOperation, +) -> impl futures::Stream<Item = <IntervalOperation as Operation>::Output> { + let IntervalOperation::Start { millis, times } = interval; + let times = *times; + let millis = *millis as u64; + + let (sender, receiver) = async_std::channel::bounded(1); + spawn(async move { + let duration = std::time::Duration::from_millis(millis as u64); + for i in 0..times { + async_std::task::sleep(duration).await; + sender.send(IntervalTick {}).await.unwrap(); + } + }); + + receiver +} + +#[cfg(not(target_arch = "wasm32"))] +pub fn spawn<F>(f: F) +where + F: Future + Send + 'static, +{ + async_std::task::spawn(async { + f.await; + }); +} + +#[cfg(target_arch = "wasm32")] +pub fn spawn<F>(f: F) +where + F: Future + 'static, +{ + wasm_bindgen_futures::spawn_local(async { + f.await; + }); +} diff --git a/examples/simple_counter/shared/src/capabilities/mod.rs b/examples/simple_counter/shared/src/capabilities/mod.rs new file mode 100644 index 000000000..b43ab1680 --- /dev/null +++ b/examples/simple_counter/shared/src/capabilities/mod.rs @@ -0,0 +1,2 @@ +pub mod delay; +pub mod interval; diff --git a/examples/simple_counter/shared/src/lib.rs b/examples/simple_counter/shared/src/lib.rs index 99ea87b87..97333e30f 100644 --- a/examples/simple_counter/shared/src/lib.rs +++ b/examples/simple_counter/shared/src/lib.rs @@ -1,40 +1,71 @@ pub mod app; +mod capabilities; +use wasm_bindgen::prelude::*; +use wasm_bindgen_futures::js_sys; -use lazy_static::lazy_static; -use wasm_bindgen::prelude::wasm_bindgen; - -pub use crux_core::{bridge::Bridge, Core, Request}; +use std::sync::{Arc, Mutex, OnceLock}; pub use app::*; - -// TODO hide this plumbing +use crux_core::bridge::Bridge; +pub use crux_core::Middleware; +pub use crux_core::{ + bridge::{Nacre, NacreBridge, Shell}, + Request, +}; uniffi::include_scaffolding!("shared"); -lazy_static! { - static ref CORE: Bridge<Counter> = Bridge::new(Core::new()); +static CORE: OnceLock<Bridge<NacreBridge<Counter>>> = OnceLock::new(); + +pub struct JsShell { + handle_effects: Arc<Mutex<js_sys::Function>>, +} + +// SAFETY: All callback instances are wrapped into Arc<Mutex> so this is safe to mark +unsafe impl Send for JsShell {} +// SAFETY: All callback instances are wrapped into Arc<Mutex> so this is safe to mark +unsafe impl Sync for JsShell {} + +impl JsShell { + pub fn new(handle_effects: js_sys::Function) -> Self { + Self { + handle_effects: Arc::new(handle_effects.into()), + } + } +} + +impl Shell for JsShell { + fn handle_effects(&self, effects: Vec<u8>) { + self.handle_effects + .lock() + .unwrap() + .call1(&JsValue::null(), &JsValue::from(effects)) + .unwrap(); + } +} + +#[wasm_bindgen] +pub fn init(handle_effects: js_sys::Function) { + new(Arc::new(JsShell::new(handle_effects))); +} + +pub fn new(shell: Arc<dyn Shell>) { + let (sender, receiver) = async_std::channel::bounded(1); + let nacre = NacreBridge::new(sender, shell); + let _ = CORE.set(Bridge::from_nacre(nacre, receiver)); } #[wasm_bindgen] pub fn process_event(data: &[u8]) -> Vec<u8> { - match CORE.process_event(data) { - Ok(effects) => effects, - Err(e) => panic!("{e}"), - } + CORE.get().unwrap().process_event(data).unwrap() } #[wasm_bindgen] pub fn handle_response(id: u32, data: &[u8]) -> Vec<u8> { - match CORE.handle_response(id, data) { - Ok(effects) => effects, - Err(e) => panic!("{e}"), - } + CORE.get().unwrap().handle_response(id, data).unwrap() } #[wasm_bindgen] pub fn view() -> Vec<u8> { - match CORE.view() { - Ok(view) => view, - Err(e) => panic!("{e}"), - } + CORE.get().unwrap().view().unwrap() } diff --git a/examples/simple_counter/shared/src/shared.udl b/examples/simple_counter/shared/src/shared.udl index db535214b..6c6b42aea 100644 --- a/examples/simple_counter/shared/src/shared.udl +++ b/examples/simple_counter/shared/src/shared.udl @@ -1,4 +1,11 @@ +[Trait, WithForeign] +interface Shell { + void handle_effects(bytes requests); +}; + namespace shared { + void new(Shell shell); + bytes process_event([ByRef] bytes msg); bytes handle_response(u32 id, [ByRef] bytes res); bytes view(); diff --git a/examples/simple_counter/web-nextjs/next.config.js b/examples/simple_counter/web-nextjs/next.config.js new file mode 100644 index 000000000..767719fc4 --- /dev/null +++ b/examples/simple_counter/web-nextjs/next.config.js @@ -0,0 +1,4 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = {} + +module.exports = nextConfig diff --git a/examples/simple_counter/web-nextjs/pnpm-lock.yaml b/examples/simple_counter/web-nextjs/pnpm-lock.yaml index 100546462..bb8afa3e1 100644 --- a/examples/simple_counter/web-nextjs/pnpm-lock.yaml +++ b/examples/simple_counter/web-nextjs/pnpm-lock.yaml @@ -19,7 +19,7 @@ importers: version: 15.2.1(eslint@9.21.0)(typescript@5.8.2) next: specifier: 15.2.1 - version: 15.2.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) + version: 15.2.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0) react: specifier: 19.0.0 version: 19.0.0 @@ -69,8 +69,8 @@ packages: resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.0': - resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/js@9.21.0': @@ -394,51 +394,51 @@ packages: '@types/react@19.0.10': resolution: {integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==} - '@typescript-eslint/eslint-plugin@8.26.0': - resolution: {integrity: sha512-cLr1J6pe56zjKYajK6SSSre6nl1Gj6xDp1TY0trpgPzjVbgDwd09v2Ws37LABxzkicmUjhEeg/fAUjPJJB1v5Q==} + '@typescript-eslint/eslint-plugin@8.24.1': + resolution: {integrity: sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.26.0': - resolution: {integrity: sha512-mNtXP9LTVBy14ZF3o7JG69gRPBK/2QWtQd0j0oH26HcY/foyJJau6pNUez7QrM5UHnSvwlQcJXKsk0I99B9pOA==} + '@typescript-eslint/parser@8.24.1': + resolution: {integrity: sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.26.0': - resolution: {integrity: sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA==} + '@typescript-eslint/scope-manager@8.24.1': + resolution: {integrity: sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.26.0': - resolution: {integrity: sha512-ruk0RNChLKz3zKGn2LwXuVoeBcUMh+jaqzN461uMMdxy5H9epZqIBtYj7UiPXRuOpaALXGbmRuZQhmwHhaS04Q==} + '@typescript-eslint/type-utils@8.24.1': + resolution: {integrity: sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.26.0': - resolution: {integrity: sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA==} + '@typescript-eslint/types@8.24.1': + resolution: {integrity: sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.26.0': - resolution: {integrity: sha512-tiJ1Hvy/V/oMVRTbEOIeemA2XoylimlDQ03CgPPNaHYZbpsc78Hmngnt+WXZfJX1pjQ711V7g0H7cSJThGYfPQ==} + '@typescript-eslint/typescript-estree@8.24.1': + resolution: {integrity: sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.26.0': - resolution: {integrity: sha512-2L2tU3FVwhvU14LndnQCA2frYC8JnPDVKyQtWFPf8IYFMt/ykEN1bPolNhNbCVgOmdzTlWdusCTKA/9nKrf8Ig==} + '@typescript-eslint/utils@8.24.1': + resolution: {integrity: sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.26.0': - resolution: {integrity: sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg==} + '@typescript-eslint/visitor-keys@8.24.1': + resolution: {integrity: sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} acorn-jsx@5.3.2: @@ -446,8 +446,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true @@ -508,8 +508,8 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axe-core@4.10.3: - resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} + axe-core@4.10.2: + resolution: {integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==} engines: {node: '>=4'} axobject-query@4.1.0: @@ -544,16 +544,16 @@ packages: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} engines: {node: '>= 0.4'} callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001702: - resolution: {integrity: sha512-LoPe/D7zioC0REI5W73PeR1e1MLCipRGq/VkovJnd6Df+QVqT+vT33OXCp8QUd7kA7RZrHWxb1B36OQKI/0gOA==} + caniuse-lite@1.0.30001700: + resolution: {integrity: sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -581,7 +581,7 @@ packages: engines: {node: '>=12.5.0'} concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} @@ -705,8 +705,8 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-typescript@3.8.3: - resolution: {integrity: sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==} + eslint-import-resolver-typescript@3.8.1: + resolution: {integrity: sha512-qw5TPA12HTmb9CkcuiNrFtwhM1ae2FWysLeRrTbQ+/JKS///gbL3fQ5LRhAZnzkcqkScOvkB5Y5o+xgyQz1VVg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -755,8 +755,8 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - eslint-plugin-react-hooks@5.2.0: - resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + eslint-plugin-react-hooks@5.1.0: + resolution: {integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 @@ -826,8 +826,8 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fastq@1.19.0: + resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} fdir@6.4.3: resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} @@ -870,8 +870,8 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} engines: {node: '>= 0.4'} get-proto@1.0.1: @@ -1143,8 +1143,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.9: - resolution: {integrity: sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==} + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -1311,8 +1311,8 @@ packages: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} run-parallel@1.2.0: @@ -1330,8 +1330,8 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} - sass@1.85.1: - resolution: {integrity: sha512-Uk8WpxM5v+0cMR0XjX9KfRIacmSG86RH4DCCZjLU2rFh5tyutt9siAXJ7G+YfxQ99Q6wrRMbMlVl6KqUms71ag==} + sass@1.85.0: + resolution: {integrity: sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==} engines: {node: '>=14.0.0'} hasBin: true @@ -1457,8 +1457,8 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - tinyglobby@0.2.12: - resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + tinyglobby@0.2.11: + resolution: {integrity: sha512-32TmKeeKUahv0Go8WmQgiEp9Y21NuxjwjqiRC1nrUB51YacfSwuB44xgXD+HdIppmMRgjQNPdrHyA6vIybYZ+g==} engines: {node: '>=12.0.0'} to-regex-range@5.0.1: @@ -1567,7 +1567,7 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.0': + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 debug: 4.4.0 @@ -1718,7 +1718,7 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 + fastq: 1.19.0 '@nolyfill/is-core-module@1.0.39': {} @@ -1811,14 +1811,14 @@ snapshots: dependencies: csstype: 3.1.3 - '@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)': + '@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.26.0(eslint@9.21.0)(typescript@5.8.2) - '@typescript-eslint/scope-manager': 8.26.0 - '@typescript-eslint/type-utils': 8.26.0(eslint@9.21.0)(typescript@5.8.2) - '@typescript-eslint/utils': 8.26.0(eslint@9.21.0)(typescript@5.8.2) - '@typescript-eslint/visitor-keys': 8.26.0 + '@typescript-eslint/parser': 8.24.1(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/scope-manager': 8.24.1 + '@typescript-eslint/type-utils': 8.24.1(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/utils': 8.24.1(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 8.24.1 eslint: 9.21.0 graphemer: 1.4.0 ignore: 5.3.2 @@ -1828,27 +1828,27 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2)': + '@typescript-eslint/parser@8.24.1(eslint@9.21.0)(typescript@5.8.2)': dependencies: - '@typescript-eslint/scope-manager': 8.26.0 - '@typescript-eslint/types': 8.26.0 - '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.8.2) - '@typescript-eslint/visitor-keys': 8.26.0 + '@typescript-eslint/scope-manager': 8.24.1 + '@typescript-eslint/types': 8.24.1 + '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 8.24.1 debug: 4.4.0 eslint: 9.21.0 typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.26.0': + '@typescript-eslint/scope-manager@8.24.1': dependencies: - '@typescript-eslint/types': 8.26.0 - '@typescript-eslint/visitor-keys': 8.26.0 + '@typescript-eslint/types': 8.24.1 + '@typescript-eslint/visitor-keys': 8.24.1 - '@typescript-eslint/type-utils@8.26.0(eslint@9.21.0)(typescript@5.8.2)': + '@typescript-eslint/type-utils@8.24.1(eslint@9.21.0)(typescript@5.8.2)': dependencies: - '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.8.2) - '@typescript-eslint/utils': 8.26.0(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.8.2) + '@typescript-eslint/utils': 8.24.1(eslint@9.21.0)(typescript@5.8.2) debug: 4.4.0 eslint: 9.21.0 ts-api-utils: 2.0.1(typescript@5.8.2) @@ -1856,12 +1856,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.26.0': {} + '@typescript-eslint/types@8.24.1': {} - '@typescript-eslint/typescript-estree@8.26.0(typescript@5.8.2)': + '@typescript-eslint/typescript-estree@8.24.1(typescript@5.8.2)': dependencies: - '@typescript-eslint/types': 8.26.0 - '@typescript-eslint/visitor-keys': 8.26.0 + '@typescript-eslint/types': 8.24.1 + '@typescript-eslint/visitor-keys': 8.24.1 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -1872,27 +1872,27 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.26.0(eslint@9.21.0)(typescript@5.8.2)': + '@typescript-eslint/utils@8.24.1(eslint@9.21.0)(typescript@5.8.2)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0) - '@typescript-eslint/scope-manager': 8.26.0 - '@typescript-eslint/types': 8.26.0 - '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.8.2) + '@typescript-eslint/scope-manager': 8.24.1 + '@typescript-eslint/types': 8.24.1 + '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.8.2) eslint: 9.21.0 typescript: 5.8.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.26.0': + '@typescript-eslint/visitor-keys@8.24.1': dependencies: - '@typescript-eslint/types': 8.26.0 + '@typescript-eslint/types': 8.24.1 eslint-visitor-keys: 4.2.0 - acorn-jsx@5.3.2(acorn@8.14.1): + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: - acorn: 8.14.1 + acorn: 8.14.0 - acorn@8.14.1: {} + acorn@8.14.0: {} ajv@6.12.6: dependencies: @@ -1911,7 +1911,7 @@ snapshots: array-buffer-byte-length@1.0.2: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 is-array-buffer: 3.0.5 array-includes@3.1.8: @@ -1920,7 +1920,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 is-string: 1.1.1 array.prototype.findlast@1.2.5: @@ -1970,7 +1970,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 is-array-buffer: 3.0.5 ast-types-flow@0.0.8: {} @@ -1981,7 +1981,7 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - axe-core@4.10.3: {} + axe-core@4.10.2: {} axobject-query@4.1.0: {} @@ -2015,17 +2015,17 @@ snapshots: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 set-function-length: 1.2.2 - call-bound@1.0.4: + call-bound@1.0.3: dependencies: call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 callsites@3.1.0: {} - caniuse-lite@1.0.30001702: {} + caniuse-lite@1.0.30001700: {} chalk@4.1.2: dependencies: @@ -2071,19 +2071,19 @@ snapshots: data-view-buffer@1.0.2: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 es-errors: 1.3.0 is-data-view: 1.0.2 data-view-byte-length@1.0.2: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 es-errors: 1.3.0 is-data-view: 1.0.2 data-view-byte-offset@1.0.1: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 es-errors: 1.3.0 is-data-view: 1.0.2 @@ -2138,7 +2138,7 @@ snapshots: arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 call-bind: 1.0.8 - call-bound: 1.0.4 + call-bound: 1.0.3 data-view-buffer: 1.0.2 data-view-byte-length: 1.0.2 data-view-byte-offset: 1.0.1 @@ -2148,7 +2148,7 @@ snapshots: es-set-tostringtag: 2.1.0 es-to-primitive: 1.3.0 function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 get-proto: 1.0.1 get-symbol-description: 1.1.0 globalthis: 1.0.4 @@ -2193,13 +2193,13 @@ snapshots: es-iterator-helpers@1.2.1: dependencies: call-bind: 1.0.8 - call-bound: 1.0.4 + call-bound: 1.0.3 define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 globalthis: 1.0.4 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -2216,7 +2216,7 @@ snapshots: es-set-tostringtag@2.1.0: dependencies: es-errors: 1.3.0 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -2236,15 +2236,15 @@ snapshots: dependencies: '@next/eslint-plugin-next': 15.2.1 '@rushstack/eslint-patch': 1.10.5 - '@typescript-eslint/eslint-plugin': 8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2) - '@typescript-eslint/parser': 8.26.0(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/eslint-plugin': 8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/parser': 8.24.1(eslint@9.21.0)(typescript@5.8.2) eslint: 9.21.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0) + eslint-import-resolver-typescript: 3.8.1(eslint-plugin-import@2.31.0)(eslint@9.21.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.21.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.8.1)(eslint@9.21.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.21.0) eslint-plugin-react: 7.37.4(eslint@9.21.0) - eslint-plugin-react-hooks: 5.2.0(eslint@9.21.0) + eslint-plugin-react-hooks: 5.1.0(eslint@9.21.0) optionalDependencies: typescript: 5.8.2 transitivePeerDependencies: @@ -2260,7 +2260,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0): + eslint-import-resolver-typescript@3.8.1(eslint-plugin-import@2.31.0)(eslint@9.21.0): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0 @@ -2269,24 +2269,24 @@ snapshots: get-tsconfig: 4.10.0 is-bun-module: 1.3.0 stable-hash: 0.0.4 - tinyglobby: 0.2.12 + tinyglobby: 0.2.11 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.21.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.8.1)(eslint@9.21.0) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0))(eslint@9.21.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.21.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.1)(eslint@9.21.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.26.0(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/parser': 8.24.1(eslint@9.21.0)(typescript@5.8.2) eslint: 9.21.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0) + eslint-import-resolver-typescript: 3.8.1(eslint-plugin-import@2.31.0)(eslint@9.21.0) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.21.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.8.1)(eslint@9.21.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -2297,7 +2297,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.21.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0))(eslint@9.21.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.21.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.1)(eslint@9.21.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -2309,7 +2309,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.26.0(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/parser': 8.24.1(eslint@9.21.0)(typescript@5.8.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -2321,7 +2321,7 @@ snapshots: array-includes: 3.1.8 array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 - axe-core: 4.10.3 + axe-core: 4.10.2 axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 @@ -2334,7 +2334,7 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.2.0(eslint@9.21.0): + eslint-plugin-react-hooks@5.1.0(eslint@9.21.0): dependencies: eslint: 9.21.0 @@ -2375,7 +2375,7 @@ snapshots: '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.2 '@eslint/core': 0.12.0 - '@eslint/eslintrc': 3.3.0 + '@eslint/eslintrc': 3.3.1 '@eslint/js': 9.21.0 '@eslint/plugin-kit': 0.2.7 '@humanfs/node': 0.16.6 @@ -2410,8 +2410,8 @@ snapshots: espree@10.3.0: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 4.2.0 esquery@1.6.0: @@ -2448,9 +2448,9 @@ snapshots: fast-levenshtein@2.0.6: {} - fastq@1.19.1: + fastq@1.19.0: dependencies: - reusify: 1.1.0 + reusify: 1.0.4 fdir@6.4.3(picomatch@4.0.2): optionalDependencies: @@ -2485,7 +2485,7 @@ snapshots: function.prototype.name@1.1.8: dependencies: call-bind: 1.0.8 - call-bound: 1.0.4 + call-bound: 1.0.3 define-properties: 1.2.1 functions-have-names: 1.2.3 hasown: 2.0.2 @@ -2493,7 +2493,7 @@ snapshots: functions-have-names@1.2.3: {} - get-intrinsic@1.3.0: + get-intrinsic@1.2.7: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 @@ -2513,9 +2513,9 @@ snapshots: get-symbol-description@1.1.0: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 get-tsconfig@4.10.0: dependencies: @@ -2585,8 +2585,8 @@ snapshots: is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 is-arrayish@0.3.2: optional: true @@ -2594,7 +2594,7 @@ snapshots: is-async-function@2.1.1: dependencies: async-function: 1.0.0 - call-bound: 1.0.4 + call-bound: 1.0.3 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -2605,7 +2605,7 @@ snapshots: is-boolean-object@1.2.2: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-bun-module@1.3.0: @@ -2620,24 +2620,24 @@ snapshots: is-data-view@1.0.2: dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 is-typed-array: 1.1.15 is-date-object@1.1.0: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 is-generator-function@1.1.0: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -2650,14 +2650,14 @@ snapshots: is-number-object@1.1.1: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-number@7.0.0: {} is-regex@1.2.1: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 gopd: 1.2.0 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -2666,16 +2666,16 @@ snapshots: is-shared-array-buffer@1.0.4: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 is-string@1.1.1: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-symbol@1.1.1: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 has-symbols: 1.1.0 safe-regex-test: 1.1.0 @@ -2687,12 +2687,12 @@ snapshots: is-weakref@1.1.1: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 is-weakset@2.0.4: dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 isarray@2.0.5: {} @@ -2702,7 +2702,7 @@ snapshots: dependencies: define-data-property: 1.1.4 es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 get-proto: 1.0.1 has-symbols: 1.1.0 set-function-name: 2.0.2 @@ -2776,17 +2776,17 @@ snapshots: ms@2.1.3: {} - nanoid@3.3.9: {} + nanoid@3.3.8: {} natural-compare@1.4.0: {} - next@15.2.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1): + next@15.2.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.0): dependencies: '@next/env': 15.2.1 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 - caniuse-lite: 1.0.30001702 + caniuse-lite: 1.0.30001700 postcss: 8.4.31 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -2800,7 +2800,7 @@ snapshots: '@next/swc-linux-x64-musl': 15.2.1 '@next/swc-win32-arm64-msvc': 15.2.1 '@next/swc-win32-x64-msvc': 15.2.1 - sass: 1.85.1 + sass: 1.85.0 sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' @@ -2818,7 +2818,7 @@ snapshots: object.assign@4.1.7: dependencies: call-bind: 1.0.8 - call-bound: 1.0.4 + call-bound: 1.0.3 define-properties: 1.2.1 es-object-atoms: 1.1.1 has-symbols: 1.1.0 @@ -2846,7 +2846,7 @@ snapshots: object.values@1.2.1: dependencies: call-bind: 1.0.8 - call-bound: 1.0.4 + call-bound: 1.0.3 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -2861,7 +2861,7 @@ snapshots: own-keys@1.0.1: dependencies: - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 object-keys: 1.1.1 safe-push-apply: 1.0.0 @@ -2893,7 +2893,7 @@ snapshots: postcss@8.4.31: dependencies: - nanoid: 3.3.9 + nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -2928,7 +2928,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 get-proto: 1.0.1 which-builtin-type: 1.2.1 @@ -2957,7 +2957,7 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - reusify@1.1.0: {} + reusify@1.0.4: {} run-parallel@1.2.0: dependencies: @@ -2966,8 +2966,8 @@ snapshots: safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 has-symbols: 1.1.0 isarray: 2.0.5 @@ -2978,11 +2978,11 @@ snapshots: safe-regex-test@1.1.0: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 es-errors: 1.3.0 is-regex: 1.2.1 - sass@1.85.1: + sass@1.85.0: dependencies: chokidar: 4.0.3 immutable: 5.0.3 @@ -3002,7 +3002,7 @@ snapshots: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -3059,16 +3059,16 @@ snapshots: side-channel-map@1.0.1: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 object-inspect: 1.13.4 side-channel-weakmap@1.0.2: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 object-inspect: 1.13.4 side-channel-map: 1.0.1 @@ -3100,12 +3100,12 @@ snapshots: string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.8 - call-bound: 1.0.4 + call-bound: 1.0.3 define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 gopd: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 @@ -3121,7 +3121,7 @@ snapshots: string.prototype.trim@1.2.10: dependencies: call-bind: 1.0.8 - call-bound: 1.0.4 + call-bound: 1.0.3 define-data-property: 1.1.4 define-properties: 1.2.1 es-abstract: 1.23.9 @@ -3131,7 +3131,7 @@ snapshots: string.prototype.trimend@1.0.9: dependencies: call-bind: 1.0.8 - call-bound: 1.0.4 + call-bound: 1.0.3 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -3158,7 +3158,7 @@ snapshots: tapable@2.2.1: {} - tinyglobby@0.2.12: + tinyglobby@0.2.11: dependencies: fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 @@ -3186,7 +3186,7 @@ snapshots: typed-array-buffer@1.0.3: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 es-errors: 1.3.0 is-typed-array: 1.1.15 @@ -3221,7 +3221,7 @@ snapshots: unbox-primitive@1.1.0: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 has-bigints: 1.1.0 has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 @@ -3242,7 +3242,7 @@ snapshots: which-builtin-type@1.2.1: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 is-async-function: 2.1.1 @@ -3267,7 +3267,7 @@ snapshots: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - call-bound: 1.0.4 + call-bound: 1.0.3 for-each: 0.3.5 gopd: 1.2.0 has-tostringtag: 1.0.2 diff --git a/examples/simple_counter/web-remix/app/core.ts b/examples/simple_counter/web-remix/app/core.ts index afa1a50e7..78cc70445 100644 --- a/examples/simple_counter/web-remix/app/core.ts +++ b/examples/simple_counter/web-remix/app/core.ts @@ -1,17 +1,32 @@ import type { Dispatch, SetStateAction } from "react"; -import { process_event, view } from "shared/shared"; +import { process_event, view, init } from "shared/shared"; import type { Effect, Event } from "shared_types/types/shared_types"; import { EffectVariantRender, ViewModel, Request, + // EffectVariantInterval, + EventVariantStartInterval, + // IntervalTick, } from "shared_types/types/shared_types"; import { BincodeSerializer, BincodeDeserializer, } from "shared_types/bincode/mod"; +export function initialize(callback: Dispatch<SetStateAction<ViewModel>>) { + init((data: Uint8Array) => handleEffects(callback, data)); + update(new EventVariantStartInterval(), () => {}); +} + +function handleEffects(callback: Dispatch<SetStateAction<ViewModel>>, data: Uint8Array) { + const requests = deserializeRequests(data); + for (const { id, effect } of requests) { + processEffect(id, effect, callback); + } +} + export function update( event: Event, callback: Dispatch<SetStateAction<ViewModel>>, @@ -30,7 +45,7 @@ export function update( } function processEffect( - _id: number, + id: number, effect: Effect, callback: Dispatch<SetStateAction<ViewModel>>, ) { diff --git a/examples/simple_counter/web-remix/app/routes/_index.tsx b/examples/simple_counter/web-remix/app/routes/_index.tsx index 7be97e086..47bfdbfb9 100644 --- a/examples/simple_counter/web-remix/app/routes/_index.tsx +++ b/examples/simple_counter/web-remix/app/routes/_index.tsx @@ -5,8 +5,9 @@ import { EventVariantReset, EventVariantIncrement, EventVariantDecrement, + EventVariantDelayReset, } from "shared_types/types/shared_types"; -import { update } from "../core"; +import { initialize, update } from "../core"; export const meta = () => { return [ @@ -25,6 +26,7 @@ export default function Index() { if (!initialized.current) { initialized.current = true; + initialize(setView); // Initial event update(new EventVariantReset(), setView); } @@ -40,7 +42,7 @@ export default function Index() { <div className="buttons section is-centered"> <button className="button is-primary is-danger" - onClick={() => update(new EventVariantReset(), setView)} + onClick={() => update(new EventVariantDelayReset(), setView)} > {"Reset"} </button> diff --git a/examples/simple_counter/web-remix/package.json b/examples/simple_counter/web-remix/package.json index 23cdb7e94..03eb77145 100644 --- a/examples/simple_counter/web-remix/package.json +++ b/examples/simple_counter/web-remix/package.json @@ -29,6 +29,5 @@ }, "engines": { "node": ">=14.0.0" - }, - "packageManager": "pnpm@10.4.1+sha512.c753b6c3ad7afa13af388fa6d808035a008e30ea9993f58c6663e2bc5ff21679aa834db094987129aa4d488b86df57f7b634981b2f827cdcacc698cc0cfb88af" + } } diff --git a/examples/simple_counter/web-remix/pnpm-lock.yaml b/examples/simple_counter/web-remix/pnpm-lock.yaml index 6ee0560a2..88bb4bb21 100644 --- a/examples/simple_counter/web-remix/pnpm-lock.yaml +++ b/examples/simple_counter/web-remix/pnpm-lock.yaml @@ -10,19 +10,19 @@ importers: dependencies: '@remix-run/css-bundle': specifier: ^2.16.0 - version: 2.16.0 + version: 2.16.2 '@remix-run/node': specifier: ^2.16.0 - version: 2.16.0(typescript@5.8.2) + version: 2.16.2(typescript@5.8.2) '@remix-run/react': specifier: ^2.16.0 - version: 2.16.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) + version: 2.16.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) '@remix-run/serve': specifier: ^2.16.0 - version: 2.16.0(typescript@5.8.2) + version: 2.16.2(typescript@5.8.2) isbot: specifier: ^5.1.23 - version: 5.1.23 + version: 5.1.25 react: specifier: ^19.0.0 version: 19.0.0 @@ -38,10 +38,10 @@ importers: devDependencies: '@remix-run/dev': specifier: ^2.16.0 - version: 2.16.0(@remix-run/react@2.16.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(@remix-run/serve@2.16.0(typescript@5.8.2))(@types/node@22.13.9)(typescript@5.8.2)(vite@6.2.1(@types/node@22.13.9)(yaml@2.7.0))(yaml@2.7.0) + version: 2.16.2(@remix-run/react@2.16.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(@remix-run/serve@2.16.2(typescript@5.8.2))(@types/node@22.13.4)(typescript@5.8.2)(vite@5.4.14(@types/node@22.13.4)) '@remix-run/eslint-config': specifier: ^2.16.0 - version: 2.16.0(eslint@9.21.0)(react@19.0.0)(typescript@5.8.2) + version: 2.16.2(eslint@9.23.0)(react@19.0.0)(typescript@5.8.2) '@types/react': specifier: ^19.0.10 version: 19.0.10 @@ -50,7 +50,7 @@ importers: version: 19.0.4(@types/react@19.0.10) eslint: specifier: ^9.21.0 - version: 9.21.0 + version: 9.23.0 typescript: specifier: ^5.8.2 version: 5.8.2 @@ -242,12 +242,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.25.0': - resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/android-arm64@0.17.6': resolution: {integrity: sha512-YnYSCceN/dUzUr5kdtUzB+wZprCafuD89Hs0Aqv9QSdwhYQybhXTaSTcrl6X/aWThn1a/j0eEpUBGOE7269REg==} engines: {node: '>=12'} @@ -260,12 +254,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.0': - resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm@0.17.6': resolution: {integrity: sha512-bSC9YVUjADDy1gae8RrioINU6e1lCkg3VGVwm0QQ2E1CWcC4gnMce9+B6RpxuSsrsXsk1yojn7sp1fnG8erE2g==} engines: {node: '>=12'} @@ -278,12 +266,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.0': - resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-x64@0.17.6': resolution: {integrity: sha512-MVcYcgSO7pfu/x34uX9u2QIZHmXAB7dEiLQC5bBl5Ryqtpj9lT2sg3gNDEsrPEmimSJW2FXIaxqSQ501YLDsZQ==} engines: {node: '>=12'} @@ -296,12 +278,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.0': - resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/darwin-arm64@0.17.6': resolution: {integrity: sha512-bsDRvlbKMQMt6Wl08nHtFz++yoZHsyTOxnjfB2Q95gato+Yi4WnRl13oC2/PJJA9yLCoRv9gqT/EYX0/zDsyMA==} engines: {node: '>=12'} @@ -314,12 +290,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.0': - resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-x64@0.17.6': resolution: {integrity: sha512-xh2A5oPrYRfMFz74QXIQTQo8uA+hYzGWJFoeTE8EvoZGHb+idyV4ATaukaUvnnxJiauhs/fPx3vYhU4wiGfosg==} engines: {node: '>=12'} @@ -332,12 +302,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.0': - resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/freebsd-arm64@0.17.6': resolution: {integrity: sha512-EnUwjRc1inT4ccZh4pB3v1cIhohE2S4YXlt1OvI7sw/+pD+dIE4smwekZlEPIwY6PhU6oDWwITrQQm5S2/iZgg==} engines: {node: '>=12'} @@ -350,12 +314,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.0': - resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-x64@0.17.6': resolution: {integrity: sha512-Uh3HLWGzH6FwpviUcLMKPCbZUAFzv67Wj5MTwK6jn89b576SR2IbEp+tqUHTr8DIl0iDmBAf51MVaP7pw6PY5Q==} engines: {node: '>=12'} @@ -368,12 +326,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.0': - resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/linux-arm64@0.17.6': resolution: {integrity: sha512-bUR58IFOMJX523aDVozswnlp5yry7+0cRLCXDsxnUeQYJik1DukMY+apBsLOZJblpH+K7ox7YrKrHmJoWqVR9w==} engines: {node: '>=12'} @@ -386,12 +338,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.0': - resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm@0.17.6': resolution: {integrity: sha512-7YdGiurNt7lqO0Bf/U9/arrPWPqdPqcV6JCZda4LZgEn+PTQ5SMEI4MGR52Bfn3+d6bNEGcWFzlIxiQdS48YUw==} engines: {node: '>=12'} @@ -404,12 +350,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.0': - resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-ia32@0.17.6': resolution: {integrity: sha512-ujp8uoQCM9FRcbDfkqECoARsLnLfCUhKARTP56TFPog8ie9JG83D5GVKjQ6yVrEVdMie1djH86fm98eY3quQkQ==} engines: {node: '>=12'} @@ -422,12 +362,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.0': - resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-loong64@0.17.6': resolution: {integrity: sha512-y2NX1+X/Nt+izj9bLoiaYB9YXT/LoaQFYvCkVD77G/4F+/yuVXYCWz4SE9yr5CBMbOxOfBcy/xFL4LlOeNlzYQ==} engines: {node: '>=12'} @@ -440,12 +374,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.0': - resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-mips64el@0.17.6': resolution: {integrity: sha512-09AXKB1HDOzXD+j3FdXCiL/MWmZP0Ex9eR8DLMBVcHorrWJxWmY8Nms2Nm41iRM64WVx7bA/JVHMv081iP2kUA==} engines: {node: '>=12'} @@ -458,12 +386,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.0': - resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-ppc64@0.17.6': resolution: {integrity: sha512-AmLhMzkM8JuqTIOhxnX4ubh0XWJIznEynRnZAVdA2mMKE6FAfwT2TWKTwdqMG+qEaeyDPtfNoZRpJbD4ZBv0Tg==} engines: {node: '>=12'} @@ -476,12 +398,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.0': - resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-riscv64@0.17.6': resolution: {integrity: sha512-Y4Ri62PfavhLQhFbqucysHOmRamlTVK10zPWlqjNbj2XMea+BOs4w6ASKwQwAiqf9ZqcY9Ab7NOU4wIgpxwoSQ==} engines: {node: '>=12'} @@ -494,12 +410,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.0': - resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-s390x@0.17.6': resolution: {integrity: sha512-SPUiz4fDbnNEm3JSdUW8pBJ/vkop3M1YwZAVwvdwlFLoJwKEZ9L98l3tzeyMzq27CyepDQ3Qgoba44StgbiN5Q==} engines: {node: '>=12'} @@ -512,12 +422,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.0': - resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-x64@0.17.6': resolution: {integrity: sha512-a3yHLmOodHrzuNgdpB7peFGPx1iJ2x6m+uDvhP2CKdr2CwOaqEFMeSqYAHU7hG+RjCq8r2NFujcd/YsEsFgTGw==} engines: {node: '>=12'} @@ -530,18 +434,6 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.0': - resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.25.0': - resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-x64@0.17.6': resolution: {integrity: sha512-EanJqcU/4uZIBreTrnbnre2DXgXSa+Gjap7ifRfllpmyAU7YMvaXmljdArptTHmjrkkKm9BK6GH5D5Yo+p6y5A==} engines: {node: '>=12'} @@ -554,18 +446,6 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.0': - resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.25.0': - resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-x64@0.17.6': resolution: {integrity: sha512-xaxeSunhQRsTNGFanoOkkLtnmMn5QbA0qBhNet/XLVsc+OVkpIWPHcr3zTW2gxVU5YOHFbIHR9ODuaUdNza2Vw==} engines: {node: '>=12'} @@ -578,12 +458,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.0': - resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/sunos-x64@0.17.6': resolution: {integrity: sha512-gnMnMPg5pfMkZvhHee21KbKdc6W3GR8/JuE0Da1kjwpK6oiFU3nqfHuVPgUX2rsOx9N2SadSQTIYV1CIjYG+xw==} engines: {node: '>=12'} @@ -596,12 +470,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.0': - resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/win32-arm64@0.17.6': resolution: {integrity: sha512-G95n7vP1UnGJPsVdKXllAJPtqjMvFYbN20e8RK8LVLhlTiSOH1sd7+Gt7rm70xiG+I5tM58nYgwWrLs6I1jHqg==} engines: {node: '>=12'} @@ -614,12 +482,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.0': - resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-ia32@0.17.6': resolution: {integrity: sha512-96yEFzLhq5bv9jJo5JhTs1gI+1cKQ83cUpyxHuGqXVwQtY5Eq54ZEsKs8veKtiKwlrNimtckHEkj4mRh4pPjsg==} engines: {node: '>=12'} @@ -632,12 +494,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.0': - resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-x64@0.17.6': resolution: {integrity: sha512-n6d8MOyUrNp6G4VSpRcgjs5xj4A91svJSaiwLIDWVWEsZtpN5FA9NlBbZHDmAJc2e8e6SF4tkBD3HAvPF+7igA==} engines: {node: '>=12'} @@ -650,12 +506,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.0': - resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -670,16 +520,20 @@ packages: resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-helpers@0.2.0': + resolution: {integrity: sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@0.12.0': resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.0': - resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.21.0': - resolution: {integrity: sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==} + '@eslint/js@9.23.0': + resolution: {integrity: sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': @@ -732,8 +586,8 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@jspm/core@2.1.0': - resolution: {integrity: sha512-3sRl+pkyFY/kLmHl0cgHiFp2xEqErA8N3ECjMs7serSUBmoJ70lBa0PG5t0IM6WJgdZNyyI0R8YFfi5wM8+mzg==} + '@jspm/core@2.0.1': + resolution: {integrity: sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==} '@mdx-js/mdx@2.3.0': resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} @@ -777,17 +631,17 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@remix-run/css-bundle@2.16.0': - resolution: {integrity: sha512-nnxoQQ0fPnQrXd/NXyfdZA9RPHbpHi4tqIFlz46bOwNcO325xFsbzmEJnXHRepmP+rYwoXClbzNP5V05WjHNSg==} + '@remix-run/css-bundle@2.16.2': + resolution: {integrity: sha512-n4xjxSpM7xBAthuTbJq2mrrhXnqbHPYwHTM069EGewQXFLyoIhduE29iAUT3jGOaaDftPtTtIbaqgAQc3iGpXg==} engines: {node: '>=18.0.0'} - '@remix-run/dev@2.16.0': - resolution: {integrity: sha512-zfb93zJatWRMmBU4dQFM9pTgYfkZi1orDYtd18f9YNZM6pbshmhqlsiGZmrMAhAuYLGB983aqkXY3pxtZhoDkQ==} + '@remix-run/dev@2.16.2': + resolution: {integrity: sha512-0uB2iIsZ/5YgbZxW6YztmzF0VdsbdUB28XhTlYx3VR8GLrxLE3S8pIvong/hMtHMIWtAGMQ0ywtYe+6AcPCpbg==} engines: {node: '>=18.0.0'} hasBin: true peerDependencies: - '@remix-run/react': ^2.16.0 - '@remix-run/serve': ^2.16.0 + '@remix-run/react': ^2.16.2 + '@remix-run/serve': ^2.16.2 typescript: ^5.1.0 vite: ^5.1.0 || ^6.0.0 wrangler: ^3.28.2 @@ -801,8 +655,8 @@ packages: wrangler: optional: true - '@remix-run/eslint-config@2.16.0': - resolution: {integrity: sha512-SkIE4ExtoxHaco2qFrkIRna5hiXLOSLnV2pkd7CACd0iETanVZatOSCK4Mi/s5CYQ25UNBpIzAUIIePfqWT+SQ==} + '@remix-run/eslint-config@2.16.2': + resolution: {integrity: sha512-0GDD6sOIPzp7Ux/rmWHNn2eSMSrc0wJ4B8x8zOc+YRkfMMIbLM/E9bNK8WSdtZZDIp66CU/zkI4bG5tdk0ZjXg==} engines: {node: '>=18.0.0'} peerDependencies: eslint: ^8.0.0 @@ -812,8 +666,8 @@ packages: typescript: optional: true - '@remix-run/express@2.16.0': - resolution: {integrity: sha512-JuN+HjwJqlJqvMIWxWEw6Oj6u/TfwW4itHJg2hGAvQftBCwSD49kkAMUwBzdZr2BOepdwjuS/UKJpannp4PWKQ==} + '@remix-run/express@2.16.2': + resolution: {integrity: sha512-QpDYiWvVB8+LBRGuAZDYGaS5z5jRFUbSb3tBQRCfOQvDJ/WzLjEtf5Wy9l3Nexbe6RTRuDW/tsIr3L94lTKmYg==} engines: {node: '>=18.0.0'} peerDependencies: express: ^4.20.0 @@ -822,8 +676,8 @@ packages: typescript: optional: true - '@remix-run/node@2.16.0': - resolution: {integrity: sha512-9yYBYCHYO1+bIScGAtOy5/r4BoTS8E5lpQmjWP99UxSCSiKHPEO76V9Z8mmmarTNis/FPN+sUwfmbQWNHLA2vw==} + '@remix-run/node@2.16.2': + resolution: {integrity: sha512-Q+DdX9YU1eCqwtWxJG2rIk2sYVZokCzb/T3ZsnhkWkSc0/NTMcrtkQY6JRymcMEoR+oVnJaJ9xPHt1P/BV4k9Q==} engines: {node: '>=18.0.0'} peerDependencies: typescript: ^5.1.0 @@ -831,8 +685,8 @@ packages: typescript: optional: true - '@remix-run/react@2.16.0': - resolution: {integrity: sha512-eTi60/7AO8vnIL+IT33ZixT0tLjUrilgKhimdZtddBc/XIawUeslC01mNUHIlLXS+zUDM05iBmY2aLTKkqyy6Q==} + '@remix-run/react@2.16.2': + resolution: {integrity: sha512-EhsUXUP/GbnLdVs4docgVndb0eGJncCRbIJduLe+IVGVcpJNeZO+lHZPfLHa0Hv+KvL17lMWg5bmKAVdl4RVoA==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0.0 @@ -846,13 +700,13 @@ packages: resolution: {integrity: sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==} engines: {node: '>=14.0.0'} - '@remix-run/serve@2.16.0': - resolution: {integrity: sha512-KF3ofzLcXf2lY1jFa8o7iDbRblSDIlzpUaxhcvPWPatrJwfB6ww/aVEesERKD+AUUonx6kB4KkEj5eAn0U86MA==} + '@remix-run/serve@2.16.2': + resolution: {integrity: sha512-Mz/L7XKuYcOagNU3taTLGkAdSsjUYdQxhTwT+vOuxxzBfRuLp6tX1Vuy2LObxkmZFEaBNSpcteRvxmD4Ppio1g==} engines: {node: '>=18.0.0'} hasBin: true - '@remix-run/server-runtime@2.16.0': - resolution: {integrity: sha512-gbuc4slxPi+pT47MrUYprX/wCuDlYL6H3LHZSvimWO1kDCBt8oefHzdHDPjLi4B1xzqXZomswTbuJzpZ7xRRTg==} + '@remix-run/server-runtime@2.16.2': + resolution: {integrity: sha512-tleEyGfFcczyUzBumDXRV4ns8ghqoCXgiNUrTWmvtI+8Vaw9bIB9Y4/m852YNLz1Kum1d936SobATzijhnEPsA==} engines: {node: '>=18.0.0'} peerDependencies: typescript: ^5.1.0 @@ -876,98 +730,98 @@ packages: '@remix-run/web-stream@1.1.0': resolution: {integrity: sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA==} - '@rollup/rollup-android-arm-eabi@4.34.9': - resolution: {integrity: sha512-qZdlImWXur0CFakn2BJ2znJOdqYZKiedEPEVNTBrpfPjc/YuTGcaYZcdmNFTkUj3DU0ZM/AElcM8Ybww3xVLzA==} + '@rollup/rollup-android-arm-eabi@4.34.8': + resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.34.9': - resolution: {integrity: sha512-4KW7P53h6HtJf5Y608T1ISKvNIYLWRKMvfnG0c44M6In4DQVU58HZFEVhWINDZKp7FZps98G3gxwC1sb0wXUUg==} + '@rollup/rollup-android-arm64@4.34.8': + resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.34.9': - resolution: {integrity: sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==} + '@rollup/rollup-darwin-arm64@4.34.8': + resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.34.9': - resolution: {integrity: sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==} + '@rollup/rollup-darwin-x64@4.34.8': + resolution: {integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.34.9': - resolution: {integrity: sha512-2lzjQPJbN5UnHm7bHIUKFMulGTQwdvOkouJDpPysJS+QFBGDJqcfh+CxxtG23Ik/9tEvnebQiylYoazFMAgrYw==} + '@rollup/rollup-freebsd-arm64@4.34.8': + resolution: {integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.34.9': - resolution: {integrity: sha512-SLl0hi2Ah2H7xQYd6Qaiu01kFPzQ+hqvdYSoOtHYg/zCIFs6t8sV95kaoqjzjFwuYQLtOI0RZre/Ke0nPaQV+g==} + '@rollup/rollup-freebsd-x64@4.34.8': + resolution: {integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.34.9': - resolution: {integrity: sha512-88I+D3TeKItrw+Y/2ud4Tw0+3CxQ2kLgu3QvrogZ0OfkmX/DEppehus7L3TS2Q4lpB+hYyxhkQiYPJ6Mf5/dPg==} + '@rollup/rollup-linux-arm-gnueabihf@4.34.8': + resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.34.9': - resolution: {integrity: sha512-3qyfWljSFHi9zH0KgtEPG4cBXHDFhwD8kwg6xLfHQ0IWuH9crp005GfoUUh/6w9/FWGBwEHg3lxK1iHRN1MFlA==} + '@rollup/rollup-linux-arm-musleabihf@4.34.8': + resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.34.9': - resolution: {integrity: sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==} + '@rollup/rollup-linux-arm64-gnu@4.34.8': + resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.34.9': - resolution: {integrity: sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==} + '@rollup/rollup-linux-arm64-musl@4.34.8': + resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.34.9': - resolution: {integrity: sha512-dRAgTfDsn0TE0HI6cmo13hemKpVHOEyeciGtvlBTkpx/F65kTvShtY/EVyZEIfxFkV5JJTuQ9tP5HGBS0hfxIg==} + '@rollup/rollup-linux-loongarch64-gnu@4.34.8': + resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.34.9': - resolution: {integrity: sha512-PHcNOAEhkoMSQtMf+rJofwisZqaU8iQ8EaSps58f5HYll9EAY5BSErCZ8qBDMVbq88h4UxaNPlbrKqfWP8RfJA==} + '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': + resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.34.9': - resolution: {integrity: sha512-Z2i0Uy5G96KBYKjeQFKbbsB54xFOL5/y1P5wNBsbXB8yE+At3oh0DVMjQVzCJRJSfReiB2tX8T6HUFZ2k8iaKg==} + '@rollup/rollup-linux-riscv64-gnu@4.34.8': + resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.34.9': - resolution: {integrity: sha512-U+5SwTMoeYXoDzJX5dhDTxRltSrIax8KWwfaaYcynuJw8mT33W7oOgz0a+AaXtGuvhzTr2tVKh5UO8GVANTxyQ==} + '@rollup/rollup-linux-s390x-gnu@4.34.8': + resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.34.9': - resolution: {integrity: sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==} + '@rollup/rollup-linux-x64-gnu@4.34.8': + resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.34.9': - resolution: {integrity: sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==} + '@rollup/rollup-linux-x64-musl@4.34.8': + resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.34.9': - resolution: {integrity: sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==} + '@rollup/rollup-win32-arm64-msvc@4.34.8': + resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.34.9': - resolution: {integrity: sha512-KB48mPtaoHy1AwDNkAJfHXvHp24H0ryZog28spEs0V48l3H1fr4i37tiyHsgKZJnCmvxsbATdZGBpbmxTE3a9w==} + '@rollup/rollup-win32-ia32-msvc@4.34.8': + resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.34.9': - resolution: {integrity: sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==} + '@rollup/rollup-win32-x64-msvc@4.34.8': + resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==} cpu: [x64] os: [win32] @@ -1017,8 +871,8 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@22.13.9': - resolution: {integrity: sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==} + '@types/node@22.13.4': + resolution: {integrity: sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==} '@types/react-dom@19.0.4': resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} @@ -1123,8 +977,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true @@ -1226,8 +1080,8 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axe-core@4.10.3: - resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} + axe-core@4.10.2: + resolution: {integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==} engines: {node: '>=4'} axobject-query@4.1.0: @@ -1302,16 +1156,16 @@ packages: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} engines: {node: '>= 0.4'} callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001702: - resolution: {integrity: sha512-LoPe/D7zioC0REI5W73PeR1e1MLCipRGq/VkovJnd6Df+QVqT+vT33OXCp8QUd7kA7RZrHWxb1B36OQKI/0gOA==} + caniuse-lite@1.0.30001700: + resolution: {integrity: sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -1383,9 +1237,6 @@ packages: confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - confbox@0.2.1: - resolution: {integrity: sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==} - content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -1475,8 +1326,8 @@ packages: supports-color: optional: true - decode-named-character-reference@1.1.0: - resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} dedent@1.5.3: resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} @@ -1555,8 +1406,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.113: - resolution: {integrity: sha512-wjT2O4hX+wdWPJ76gWSkMhcHAV2PTMX+QetUCPYEdCIe+cxmgzzSSiGRCKW8nuh4mwKZlpv0xvoW7OF2X+wmHg==} + electron-to-chromium@1.5.102: + resolution: {integrity: sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1620,11 +1471,11 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild-plugins-node-modules-polyfill@1.7.0: - resolution: {integrity: sha512-Z81w5ReugIBAgufGeGWee+Uxzgs5Na4LprUAK3XlJEh2ktY3LkNuEGMaZyBXxQxGK8SQDS5yKLW5QKGF5qLjYA==} + esbuild-plugins-node-modules-polyfill@1.6.8: + resolution: {integrity: sha512-bRB4qbgUDWrdY1eMk123KiaCSW9VzQ+QLZrmU7D//cCFkmksPd9mUMpmWoFK/rxjIeTfTSOpKCoGoimlvI+AWw==} engines: {node: '>=14.0.0'} peerDependencies: - esbuild: '>=0.14.0 <=0.25.x' + esbuild: '>=0.14.0 <=0.24.x' esbuild@0.17.6: resolution: {integrity: sha512-TKFRp9TxrJDdRWfSsSERKEovm6v30iHnrjlcGhLBOtReE28Yp1VSBRfO3GTaOFMoxsNerx4TjrhzSuma9ha83Q==} @@ -1636,11 +1487,6 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.25.0: - resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} - engines: {node: '>=18'} - hasBin: true - escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -1658,8 +1504,8 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-typescript@3.8.3: - resolution: {integrity: sha512-A0bu4Ks2QqDWNpeEgTQMPTngaMhuDu4yv6xpftBMAf+1ziXnpx+eSR1WRfoPTe2BAiAjHFZ7kSNx1fvr5g5pmQ==} + eslint-import-resolver-typescript@3.8.1: + resolution: {integrity: sha512-qw5TPA12HTmb9CkcuiNrFtwhM1ae2FWysLeRrTbQ+/JKS///gbL3fQ5LRhAZnzkcqkScOvkB5Y5o+xgyQz1VVg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -1761,8 +1607,8 @@ packages: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - eslint-scope@8.2.0: - resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + eslint-scope@8.3.0: + resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-utils@2.1.0: @@ -1785,8 +1631,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.21.0: - resolution: {integrity: sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==} + eslint@9.23.0: + resolution: {integrity: sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1868,9 +1714,6 @@ packages: resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} - exsolve@1.0.2: - resolution: {integrity: sha512-ZEcIMbthn2zeX4/wD/DLxDUjuCltHXT8Htvm/JFlTkdYgWh2+HGppgwwNUnIVxzxP7yJOPtuBAec0dLx6lVY8w==} - extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -1887,8 +1730,8 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fastq@1.19.0: + resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} @@ -1928,8 +1771,8 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} format@0.2.2: @@ -1981,8 +1824,8 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} engines: {node: '>= 0.4'} get-port@5.1.1: @@ -2297,8 +2140,8 @@ packages: isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isbot@5.1.23: - resolution: {integrity: sha512-ie3ehy2iXdkuzaZx32SoKb9b8l9Cm8cqQ1lJjQXnq8GRTrk/Jx7IUDcB4mhlw6H3gWaMqGYoWeV0lPv1P/20Ig==} + isbot@5.1.25: + resolution: {integrity: sha512-mqU76fmT7cpGG0JX1EzhCZIC+xovpH6TD2SAK18alonk0RG/RgChpGduJTYzRaq9a0COoFA99M9JVtEUOcScIw==} engines: {node: '>=18'} isexe@2.0.0: @@ -2381,8 +2224,8 @@ packages: resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} engines: {node: '>= 12.13.0'} - local-pkg@1.1.1: - resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} engines: {node: '>=14'} locate-path@6.0.0: @@ -2670,8 +2513,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.9: - resolution: {integrity: sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==} + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -2876,9 +2719,6 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - pkg-types@2.1.0: - resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} - possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -2937,8 +2777,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + postcss@8.5.2: + resolution: {integrity: sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -3004,9 +2844,6 @@ packages: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} - quansync@0.2.8: - resolution: {integrity: sha512-4+saucphJMazjt7iOM27mbFCk+D9dd/zmgMDCzRZ8MEoBfYp7lAvoN38et/phRQF6wOPMy/OROBGgoWeSKyluA==} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -3127,12 +2964,12 @@ packages: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.34.9: - resolution: {integrity: sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==} + rollup@4.34.8: + resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3380,8 +3217,8 @@ packages: through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - tinyglobby@0.2.12: - resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + tinyglobby@0.2.11: + resolution: {integrity: sha512-32TmKeeKUahv0Go8WmQgiEp9Y21NuxjwjqiRC1nrUB51YacfSwuB44xgXD+HdIppmMRgjQNPdrHyA6vIybYZ+g==} engines: {node: '>=12.0.0'} to-regex-range@5.0.1: @@ -3506,8 +3343,8 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + update-browserslist-db@1.1.2: + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -3596,46 +3433,6 @@ packages: terser: optional: true - vite@6.2.1: - resolution: {integrity: sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -3756,11 +3553,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/eslint-parser@7.26.8(@babel/core@7.26.9)(eslint@9.21.0)': + '@babel/eslint-parser@7.26.8(@babel/core@7.26.9)(eslint@9.23.0)': dependencies: '@babel/core': 7.26.9 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 9.21.0 + eslint: 9.23.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 @@ -3975,216 +3772,141 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/aix-ppc64@0.25.0': - optional: true - '@esbuild/android-arm64@0.17.6': optional: true '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm64@0.25.0': - optional: true - '@esbuild/android-arm@0.17.6': optional: true '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-arm@0.25.0': - optional: true - '@esbuild/android-x64@0.17.6': optional: true '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/android-x64@0.25.0': - optional: true - '@esbuild/darwin-arm64@0.17.6': optional: true '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.25.0': - optional: true - '@esbuild/darwin-x64@0.17.6': optional: true '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/darwin-x64@0.25.0': - optional: true - '@esbuild/freebsd-arm64@0.17.6': optional: true '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.25.0': - optional: true - '@esbuild/freebsd-x64@0.17.6': optional: true '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.25.0': - optional: true - '@esbuild/linux-arm64@0.17.6': optional: true '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm64@0.25.0': - optional: true - '@esbuild/linux-arm@0.17.6': optional: true '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-arm@0.25.0': - optional: true - '@esbuild/linux-ia32@0.17.6': optional: true '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-ia32@0.25.0': - optional: true - '@esbuild/linux-loong64@0.17.6': optional: true '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-loong64@0.25.0': - optional: true - '@esbuild/linux-mips64el@0.17.6': optional: true '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-mips64el@0.25.0': - optional: true - '@esbuild/linux-ppc64@0.17.6': optional: true '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.25.0': - optional: true - '@esbuild/linux-riscv64@0.17.6': optional: true '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.25.0': - optional: true - '@esbuild/linux-s390x@0.17.6': optional: true '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.25.0': - optional: true - '@esbuild/linux-x64@0.17.6': optional: true '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/linux-x64@0.25.0': - optional: true - - '@esbuild/netbsd-arm64@0.25.0': - optional: true - '@esbuild/netbsd-x64@0.17.6': optional: true '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.25.0': - optional: true - - '@esbuild/openbsd-arm64@0.25.0': - optional: true - '@esbuild/openbsd-x64@0.17.6': optional: true '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.25.0': - optional: true - '@esbuild/sunos-x64@0.17.6': optional: true '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.25.0': - optional: true - '@esbuild/win32-arm64@0.17.6': optional: true '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-arm64@0.25.0': - optional: true - '@esbuild/win32-ia32@0.17.6': optional: true '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-ia32@0.25.0': - optional: true - '@esbuild/win32-x64@0.17.6': optional: true '@esbuild/win32-x64@0.21.5': optional: true - '@esbuild/win32-x64@0.25.0': - optional: true - - '@eslint-community/eslint-utils@4.4.1(eslint@9.21.0)': + '@eslint-community/eslint-utils@4.4.1(eslint@9.23.0)': dependencies: - eslint: 9.21.0 + eslint: 9.23.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -4197,11 +3919,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/config-helpers@0.2.0': {} + '@eslint/core@0.12.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.0': + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 debug: 4.4.0 @@ -4215,7 +3939,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.21.0': {} + '@eslint/js@9.23.0': {} '@eslint/object-schema@2.1.6': {} @@ -4263,7 +3987,7 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@jspm/core@2.1.0': {} + '@jspm/core@2.0.1': {} '@mdx-js/mdx@2.3.0': dependencies: @@ -4301,7 +4025,7 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 + fastq: 1.19.0 '@nolyfill/is-core-module@1.0.39': {} @@ -4341,9 +4065,9 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@remix-run/css-bundle@2.16.0': {} + '@remix-run/css-bundle@2.16.2': {} - '@remix-run/dev@2.16.0(@remix-run/react@2.16.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(@remix-run/serve@2.16.0(typescript@5.8.2))(@types/node@22.13.9)(typescript@5.8.2)(vite@6.2.1(@types/node@22.13.9)(yaml@2.7.0))(yaml@2.7.0)': + '@remix-run/dev@2.16.2(@remix-run/react@2.16.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2))(@remix-run/serve@2.16.2(typescript@5.8.2))(@types/node@22.13.4)(typescript@5.8.2)(vite@5.4.14(@types/node@22.13.4))': dependencies: '@babel/core': 7.26.9 '@babel/generator': 7.26.9 @@ -4355,12 +4079,12 @@ snapshots: '@babel/types': 7.26.9 '@mdx-js/mdx': 2.3.0 '@npmcli/package-json': 4.0.1 - '@remix-run/node': 2.16.0(typescript@5.8.2) - '@remix-run/react': 2.16.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) + '@remix-run/node': 2.16.2(typescript@5.8.2) + '@remix-run/react': 2.16.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2) '@remix-run/router': 1.23.0 - '@remix-run/server-runtime': 2.16.0(typescript@5.8.2) + '@remix-run/server-runtime': 2.16.2(typescript@5.8.2) '@types/mdx': 2.0.13 - '@vanilla-extract/integration': 6.5.0(@types/node@22.13.9) + '@vanilla-extract/integration': 6.5.0(@types/node@22.13.4) arg: 5.0.2 cacache: 17.1.4 chalk: 4.1.2 @@ -4369,7 +4093,7 @@ snapshots: dotenv: 16.4.7 es-module-lexer: 1.6.0 esbuild: 0.17.6 - esbuild-plugins-node-modules-polyfill: 1.7.0(esbuild@0.17.6) + esbuild-plugins-node-modules-polyfill: 1.6.8(esbuild@0.17.6) execa: 5.1.1 exit-hook: 2.2.1 express: 4.21.2 @@ -4386,10 +4110,10 @@ snapshots: picocolors: 1.1.1 picomatch: 2.3.1 pidtree: 0.6.0 - postcss: 8.5.3 - postcss-discard-duplicates: 5.1.0(postcss@8.5.3) - postcss-load-config: 4.0.2(postcss@8.5.3) - postcss-modules: 6.0.1(postcss@8.5.3) + postcss: 8.5.2 + postcss-discard-duplicates: 5.1.0(postcss@8.5.2) + postcss-load-config: 4.0.2(postcss@8.5.2) + postcss-modules: 6.0.1(postcss@8.5.2) prettier: 2.8.8 pretty-ms: 7.0.1 react-refresh: 0.14.2 @@ -4400,18 +4124,17 @@ snapshots: tar-fs: 2.1.2 tsconfig-paths: 4.2.0 valibot: 0.41.0(typescript@5.8.2) - vite-node: 3.0.0-beta.2(@types/node@22.13.9)(yaml@2.7.0) + vite-node: 3.0.0-beta.2(@types/node@22.13.4) ws: 7.5.10 optionalDependencies: - '@remix-run/serve': 2.16.0(typescript@5.8.2) + '@remix-run/serve': 2.16.2(typescript@5.8.2) typescript: 5.8.2 - vite: 6.2.1(@types/node@22.13.9)(yaml@2.7.0) + vite: 5.4.14(@types/node@22.13.4) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - bluebird - bufferutil - - jiti - less - lightningcss - sass @@ -4421,29 +4144,27 @@ snapshots: - supports-color - terser - ts-node - - tsx - utf-8-validate - - yaml - '@remix-run/eslint-config@2.16.0(eslint@9.21.0)(react@19.0.0)(typescript@5.8.2)': + '@remix-run/eslint-config@2.16.2(eslint@9.23.0)(react@19.0.0)(typescript@5.8.2)': dependencies: '@babel/core': 7.26.9 - '@babel/eslint-parser': 7.26.8(@babel/core@7.26.9)(eslint@9.21.0) + '@babel/eslint-parser': 7.26.8(@babel/core@7.26.9)(eslint@9.23.0) '@babel/preset-react': 7.26.3(@babel/core@7.26.9) '@rushstack/eslint-patch': 1.10.5 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2) - '@typescript-eslint/parser': 5.62.0(eslint@9.21.0)(typescript@5.8.2) - eslint: 9.21.0 + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/parser': 5.62.0(eslint@9.23.0)(typescript@5.8.2) + eslint: 9.23.0 eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.21.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0) - eslint-plugin-jest: 26.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2) - eslint-plugin-jest-dom: 4.0.3(eslint@9.21.0) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.21.0) - eslint-plugin-node: 11.1.0(eslint@9.21.0) - eslint-plugin-react: 7.37.4(eslint@9.21.0) - eslint-plugin-react-hooks: 4.6.2(eslint@9.21.0) - eslint-plugin-testing-library: 5.11.1(eslint@9.21.0)(typescript@5.8.2) + eslint-import-resolver-typescript: 3.8.1(eslint-plugin-import@2.31.0)(eslint@9.23.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.8.1)(eslint@9.23.0) + eslint-plugin-jest: 26.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2) + eslint-plugin-jest-dom: 4.0.3(eslint@9.23.0) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.23.0) + eslint-plugin-node: 11.1.0(eslint@9.23.0) + eslint-plugin-react: 7.37.4(eslint@9.23.0) + eslint-plugin-react-hooks: 4.6.2(eslint@9.23.0) + eslint-plugin-testing-library: 5.11.1(eslint@9.23.0)(typescript@5.8.2) react: 19.0.0 optionalDependencies: typescript: 5.8.2 @@ -4453,16 +4174,16 @@ snapshots: - jest - supports-color - '@remix-run/express@2.16.0(express@4.21.2)(typescript@5.8.2)': + '@remix-run/express@2.16.2(express@4.21.2)(typescript@5.8.2)': dependencies: - '@remix-run/node': 2.16.0(typescript@5.8.2) + '@remix-run/node': 2.16.2(typescript@5.8.2) express: 4.21.2 optionalDependencies: typescript: 5.8.2 - '@remix-run/node@2.16.0(typescript@5.8.2)': + '@remix-run/node@2.16.2(typescript@5.8.2)': dependencies: - '@remix-run/server-runtime': 2.16.0(typescript@5.8.2) + '@remix-run/server-runtime': 2.16.2(typescript@5.8.2) '@remix-run/web-fetch': 4.4.2 '@web3-storage/multipart-parser': 1.0.0 cookie-signature: 1.2.2 @@ -4472,10 +4193,10 @@ snapshots: optionalDependencies: typescript: 5.8.2 - '@remix-run/react@2.16.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2)': + '@remix-run/react@2.16.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.8.2)': dependencies: '@remix-run/router': 1.23.0 - '@remix-run/server-runtime': 2.16.0(typescript@5.8.2) + '@remix-run/server-runtime': 2.16.2(typescript@5.8.2) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) react-router: 6.30.0(react@19.0.0) @@ -4486,10 +4207,10 @@ snapshots: '@remix-run/router@1.23.0': {} - '@remix-run/serve@2.16.0(typescript@5.8.2)': + '@remix-run/serve@2.16.2(typescript@5.8.2)': dependencies: - '@remix-run/express': 2.16.0(express@4.21.2)(typescript@5.8.2) - '@remix-run/node': 2.16.0(typescript@5.8.2) + '@remix-run/express': 2.16.2(express@4.21.2)(typescript@5.8.2) + '@remix-run/node': 2.16.2(typescript@5.8.2) chokidar: 3.6.0 compression: 1.8.0 express: 4.21.2 @@ -4500,7 +4221,7 @@ snapshots: - supports-color - typescript - '@remix-run/server-runtime@2.16.0(typescript@5.8.2)': + '@remix-run/server-runtime@2.16.2(typescript@5.8.2)': dependencies: '@remix-run/router': 1.23.0 '@types/cookie': 0.6.0 @@ -4540,61 +4261,61 @@ snapshots: dependencies: web-streams-polyfill: 3.3.3 - '@rollup/rollup-android-arm-eabi@4.34.9': + '@rollup/rollup-android-arm-eabi@4.34.8': optional: true - '@rollup/rollup-android-arm64@4.34.9': + '@rollup/rollup-android-arm64@4.34.8': optional: true - '@rollup/rollup-darwin-arm64@4.34.9': + '@rollup/rollup-darwin-arm64@4.34.8': optional: true - '@rollup/rollup-darwin-x64@4.34.9': + '@rollup/rollup-darwin-x64@4.34.8': optional: true - '@rollup/rollup-freebsd-arm64@4.34.9': + '@rollup/rollup-freebsd-arm64@4.34.8': optional: true - '@rollup/rollup-freebsd-x64@4.34.9': + '@rollup/rollup-freebsd-x64@4.34.8': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.34.9': + '@rollup/rollup-linux-arm-gnueabihf@4.34.8': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.34.9': + '@rollup/rollup-linux-arm-musleabihf@4.34.8': optional: true - '@rollup/rollup-linux-arm64-gnu@4.34.9': + '@rollup/rollup-linux-arm64-gnu@4.34.8': optional: true - '@rollup/rollup-linux-arm64-musl@4.34.9': + '@rollup/rollup-linux-arm64-musl@4.34.8': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.34.9': + '@rollup/rollup-linux-loongarch64-gnu@4.34.8': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.34.9': + '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.34.9': + '@rollup/rollup-linux-riscv64-gnu@4.34.8': optional: true - '@rollup/rollup-linux-s390x-gnu@4.34.9': + '@rollup/rollup-linux-s390x-gnu@4.34.8': optional: true - '@rollup/rollup-linux-x64-gnu@4.34.9': + '@rollup/rollup-linux-x64-gnu@4.34.8': optional: true - '@rollup/rollup-linux-x64-musl@4.34.9': + '@rollup/rollup-linux-x64-musl@4.34.8': optional: true - '@rollup/rollup-win32-arm64-msvc@4.34.9': + '@rollup/rollup-win32-arm64-msvc@4.34.8': optional: true - '@rollup/rollup-win32-ia32-msvc@4.34.9': + '@rollup/rollup-win32-ia32-msvc@4.34.8': optional: true - '@rollup/rollup-win32-x64-msvc@4.34.9': + '@rollup/rollup-win32-x64-msvc@4.34.8': optional: true '@rtsao/scc@1.1.0': {} @@ -4646,7 +4367,7 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@22.13.9': + '@types/node@22.13.4': dependencies: undici-types: 6.20.0 @@ -4662,15 +4383,15 @@ snapshots: '@types/unist@2.0.11': {} - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 5.62.0(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/parser': 5.62.0(eslint@9.23.0)(typescript@5.8.2) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@9.21.0)(typescript@5.8.2) - '@typescript-eslint/utils': 5.62.0(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/type-utils': 5.62.0(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/utils': 5.62.0(eslint@9.23.0)(typescript@5.8.2) debug: 4.4.0 - eslint: 9.21.0 + eslint: 9.23.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare-lite: 1.4.0 @@ -4681,13 +4402,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@5.62.0(eslint@9.21.0)(typescript@5.8.2)': + '@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.8.2)': dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.2) debug: 4.4.0 - eslint: 9.21.0 + eslint: 9.23.0 optionalDependencies: typescript: 5.8.2 transitivePeerDependencies: @@ -4698,12 +4419,12 @@ snapshots: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - '@typescript-eslint/type-utils@5.62.0(eslint@9.21.0)(typescript@5.8.2)': + '@typescript-eslint/type-utils@5.62.0(eslint@9.23.0)(typescript@5.8.2)': dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.2) - '@typescript-eslint/utils': 5.62.0(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/utils': 5.62.0(eslint@9.23.0)(typescript@5.8.2) debug: 4.4.0 - eslint: 9.21.0 + eslint: 9.23.0 tsutils: 3.21.0(typescript@5.8.2) optionalDependencies: typescript: 5.8.2 @@ -4726,15 +4447,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.62.0(eslint@9.21.0)(typescript@5.8.2)': + '@typescript-eslint/utils@5.62.0(eslint@9.23.0)(typescript@5.8.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.23.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.2) - eslint: 9.21.0 + eslint: 9.23.0 eslint-scope: 5.1.1 semver: 7.7.1 transitivePeerDependencies: @@ -4769,7 +4490,7 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros - '@vanilla-extract/integration@6.5.0(@types/node@22.13.9)': + '@vanilla-extract/integration@6.5.0(@types/node@22.13.4)': dependencies: '@babel/core': 7.26.9 '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.9) @@ -4782,8 +4503,8 @@ snapshots: lodash: 4.17.21 mlly: 1.7.4 outdent: 0.8.0 - vite: 5.4.14(@types/node@22.13.9) - vite-node: 1.6.1(@types/node@22.13.9) + vite: 5.4.14(@types/node@22.13.4) + vite-node: 1.6.1(@types/node@22.13.4) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -4812,11 +4533,11 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-jsx@5.3.2(acorn@8.14.1): + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: - acorn: 8.14.1 + acorn: 8.14.0 - acorn@8.14.1: {} + acorn@8.14.0: {} aggregate-error@3.1.0: dependencies: @@ -4859,7 +4580,7 @@ snapshots: array-buffer-byte-length@1.0.2: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 is-array-buffer: 3.0.5 array-flatten@1.1.1: {} @@ -4870,7 +4591,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 is-string: 1.1.1 array-union@2.1.0: {} @@ -4922,7 +4643,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 is-array-buffer: 3.0.5 ast-types-flow@0.0.8: {} @@ -4935,7 +4656,7 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - axe-core@4.10.3: {} + axe-core@4.10.2: {} axobject-query@4.1.0: {} @@ -4993,10 +4714,10 @@ snapshots: browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001702 - electron-to-chromium: 1.5.113 + caniuse-lite: 1.0.30001700 + electron-to-chromium: 1.5.102 node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.24.4) + update-browserslist-db: 1.1.2(browserslist@4.24.4) buffer-from@1.1.2: {} @@ -5033,17 +4754,17 @@ snapshots: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 set-function-length: 1.2.2 - call-bound@1.0.4: + call-bound@1.0.3: dependencies: call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 callsites@3.1.0: {} - caniuse-lite@1.0.30001702: {} + caniuse-lite@1.0.30001700: {} ccount@2.0.1: {} @@ -5114,8 +4835,6 @@ snapshots: confbox@0.1.8: {} - confbox@0.2.1: {} - content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 @@ -5152,19 +4871,19 @@ snapshots: data-view-buffer@1.0.2: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 es-errors: 1.3.0 is-data-view: 1.0.2 data-view-byte-length@1.0.2: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 es-errors: 1.3.0 is-data-view: 1.0.2 data-view-byte-offset@1.0.1: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 es-errors: 1.3.0 is-data-view: 1.0.2 @@ -5180,7 +4899,7 @@ snapshots: dependencies: ms: 2.1.3 - decode-named-character-reference@1.1.0: + decode-named-character-reference@1.0.2: dependencies: character-entities: 2.0.2 @@ -5191,7 +4910,7 @@ snapshots: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 es-get-iterator: 1.1.3 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 is-arguments: 1.2.0 is-array-buffer: 3.0.5 is-date-object: 1.1.0 @@ -5266,7 +4985,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.113: {} + electron-to-chromium@1.5.102: {} emoji-regex@8.0.0: {} @@ -5293,7 +5012,7 @@ snapshots: arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 call-bind: 1.0.8 - call-bound: 1.0.4 + call-bound: 1.0.3 data-view-buffer: 1.0.2 data-view-byte-length: 1.0.2 data-view-byte-offset: 1.0.1 @@ -5303,7 +5022,7 @@ snapshots: es-set-tostringtag: 2.1.0 es-to-primitive: 1.3.0 function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 get-proto: 1.0.1 get-symbol-description: 1.1.0 globalthis: 1.0.4 @@ -5348,7 +5067,7 @@ snapshots: es-get-iterator@1.1.3: dependencies: call-bind: 1.0.8 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 has-symbols: 1.1.0 is-arguments: 1.2.0 is-map: 2.0.3 @@ -5360,13 +5079,13 @@ snapshots: es-iterator-helpers@1.2.1: dependencies: call-bind: 1.0.8 - call-bound: 1.0.4 + call-bound: 1.0.3 define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 globalthis: 1.0.4 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -5385,7 +5104,7 @@ snapshots: es-set-tostringtag@2.1.0: dependencies: es-errors: 1.3.0 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -5399,11 +5118,11 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild-plugins-node-modules-polyfill@1.7.0(esbuild@0.17.6): + esbuild-plugins-node-modules-polyfill@1.6.8(esbuild@0.17.6): dependencies: - '@jspm/core': 2.1.0 + '@jspm/core': 2.0.1 esbuild: 0.17.6 - local-pkg: 1.1.1 + local-pkg: 0.5.1 resolve.exports: 2.0.3 esbuild@0.17.6: @@ -5457,34 +5176,6 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - esbuild@0.25.0: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.0 - '@esbuild/android-arm': 0.25.0 - '@esbuild/android-arm64': 0.25.0 - '@esbuild/android-x64': 0.25.0 - '@esbuild/darwin-arm64': 0.25.0 - '@esbuild/darwin-x64': 0.25.0 - '@esbuild/freebsd-arm64': 0.25.0 - '@esbuild/freebsd-x64': 0.25.0 - '@esbuild/linux-arm': 0.25.0 - '@esbuild/linux-arm64': 0.25.0 - '@esbuild/linux-ia32': 0.25.0 - '@esbuild/linux-loong64': 0.25.0 - '@esbuild/linux-mips64el': 0.25.0 - '@esbuild/linux-ppc64': 0.25.0 - '@esbuild/linux-riscv64': 0.25.0 - '@esbuild/linux-s390x': 0.25.0 - '@esbuild/linux-x64': 0.25.0 - '@esbuild/netbsd-arm64': 0.25.0 - '@esbuild/netbsd-x64': 0.25.0 - '@esbuild/openbsd-arm64': 0.25.0 - '@esbuild/openbsd-x64': 0.25.0 - '@esbuild/sunos-x64': 0.25.0 - '@esbuild/win32-arm64': 0.25.0 - '@esbuild/win32-ia32': 0.25.0 - '@esbuild/win32-x64': 0.25.0 - escalade@3.2.0: {} escape-html@1.0.3: {} @@ -5507,39 +5198,39 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0): + eslint-import-resolver-typescript@3.8.1(eslint-plugin-import@2.31.0)(eslint@9.23.0): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0 enhanced-resolve: 5.18.1 - eslint: 9.21.0 + eslint: 9.23.0 get-tsconfig: 4.10.0 is-bun-module: 1.3.0 stable-hash: 0.0.4 - tinyglobby: 0.2.12 + tinyglobby: 0.2.11 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.21.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.8.1)(eslint@9.23.0) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0(eslint@9.21.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.1)(eslint@9.23.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@9.21.0)(typescript@5.8.2) - eslint: 9.21.0 + '@typescript-eslint/parser': 5.62.0(eslint@9.23.0)(typescript@5.8.2) + eslint: 9.23.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0) + eslint-import-resolver-typescript: 3.8.1(eslint-plugin-import@2.31.0)(eslint@9.23.0) transitivePeerDependencies: - supports-color - eslint-plugin-es@3.0.1(eslint@9.21.0): + eslint-plugin-es@3.0.1(eslint@9.23.0): dependencies: - eslint: 9.21.0 + eslint: 9.23.0 eslint-utils: 2.1.0 regexpp: 3.2.0 - eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.21.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.8.1)(eslint@9.23.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -5548,9 +5239,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.21.0 + eslint: 9.23.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0(eslint@9.21.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.1)(eslint@9.23.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -5562,40 +5253,40 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/parser': 5.62.0(eslint@9.23.0)(typescript@5.8.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest-dom@4.0.3(eslint@9.21.0): + eslint-plugin-jest-dom@4.0.3(eslint@9.23.0): dependencies: '@babel/runtime': 7.26.9 '@testing-library/dom': 8.20.1 - eslint: 9.21.0 + eslint: 9.23.0 requireindex: 1.2.0 - eslint-plugin-jest@26.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2): + eslint-plugin-jest@26.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2): dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@9.21.0)(typescript@5.8.2) - eslint: 9.21.0 + '@typescript-eslint/utils': 5.62.0(eslint@9.23.0)(typescript@5.8.2) + eslint: 9.23.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jsx-a11y@6.10.2(eslint@9.21.0): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.23.0): dependencies: aria-query: 5.3.2 array-includes: 3.1.8 array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 - axe-core: 4.10.3 + axe-core: 4.10.2 axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.21.0 + eslint: 9.23.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -5604,21 +5295,21 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-node@11.1.0(eslint@9.21.0): + eslint-plugin-node@11.1.0(eslint@9.23.0): dependencies: - eslint: 9.21.0 - eslint-plugin-es: 3.0.1(eslint@9.21.0) + eslint: 9.23.0 + eslint-plugin-es: 3.0.1(eslint@9.23.0) eslint-utils: 2.1.0 ignore: 5.3.2 minimatch: 3.1.2 resolve: 1.22.10 semver: 6.3.1 - eslint-plugin-react-hooks@4.6.2(eslint@9.21.0): + eslint-plugin-react-hooks@4.6.2(eslint@9.23.0): dependencies: - eslint: 9.21.0 + eslint: 9.23.0 - eslint-plugin-react@7.37.4(eslint@9.21.0): + eslint-plugin-react@7.37.4(eslint@9.23.0): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -5626,7 +5317,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.21.0 + eslint: 9.23.0 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -5640,10 +5331,10 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-testing-library@5.11.1(eslint@9.21.0)(typescript@5.8.2): + eslint-plugin-testing-library@5.11.1(eslint@9.23.0)(typescript@5.8.2): dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@9.21.0)(typescript@5.8.2) - eslint: 9.21.0 + '@typescript-eslint/utils': 5.62.0(eslint@9.23.0)(typescript@5.8.2) + eslint: 9.23.0 transitivePeerDependencies: - supports-color - typescript @@ -5653,7 +5344,7 @@ snapshots: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@8.2.0: + eslint-scope@8.3.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 @@ -5670,14 +5361,15 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.21.0: + eslint@9.23.0: dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.23.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.2 + '@eslint/config-helpers': 0.2.0 '@eslint/core': 0.12.0 - '@eslint/eslintrc': 3.3.0 - '@eslint/js': 9.21.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.23.0 '@eslint/plugin-kit': 0.2.7 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 @@ -5689,7 +5381,7 @@ snapshots: cross-spawn: 7.0.6 debug: 4.4.0 escape-string-regexp: 4.0.0 - eslint-scope: 8.2.0 + eslint-scope: 8.3.0 eslint-visitor-keys: 4.2.0 espree: 10.3.0 esquery: 1.6.0 @@ -5711,8 +5403,8 @@ snapshots: espree@10.3.0: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 4.2.0 esquery@1.6.0: @@ -5766,7 +5458,7 @@ snapshots: eval@0.1.8: dependencies: - '@types/node': 22.13.9 + '@types/node': 22.13.4 require-like: 0.1.2 event-target-shim@5.0.1: {} @@ -5821,8 +5513,6 @@ snapshots: transitivePeerDependencies: - supports-color - exsolve@1.0.2: {} - extend@3.0.2: {} fast-deep-equal@3.1.3: {} @@ -5839,9 +5529,9 @@ snapshots: fast-levenshtein@2.0.6: {} - fastq@1.19.1: + fastq@1.19.0: dependencies: - reusify: 1.1.0 + reusify: 1.0.4 fault@2.0.1: dependencies: @@ -5887,7 +5577,7 @@ snapshots: dependencies: is-callable: 1.2.7 - foreground-child@3.3.1: + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 @@ -5922,7 +5612,7 @@ snapshots: function.prototype.name@1.1.8: dependencies: call-bind: 1.0.8 - call-bound: 1.0.4 + call-bound: 1.0.3 define-properties: 1.2.1 functions-have-names: 1.2.3 hasown: 2.0.2 @@ -5936,7 +5626,7 @@ snapshots: gensync@1.0.0-beta.2: {} - get-intrinsic@1.3.0: + get-intrinsic@1.2.7: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 @@ -5960,9 +5650,9 @@ snapshots: get-symbol-description@1.1.0: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 get-tsconfig@4.10.0: dependencies: @@ -5978,7 +5668,7 @@ snapshots: glob@10.4.5: dependencies: - foreground-child: 3.3.1 + foreground-child: 3.3.0 jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 @@ -6080,9 +5770,9 @@ snapshots: dependencies: safer-buffer: 2.1.2 - icss-utils@5.1.0(postcss@8.5.3): + icss-utils@5.1.0(postcss@8.5.2): dependencies: - postcss: 8.5.3 + postcss: 8.5.2 ieee754@1.2.1: {} @@ -6118,19 +5808,19 @@ snapshots: is-arguments@1.2.0: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 is-async-function@2.1.1: dependencies: async-function: 1.0.0 - call-bound: 1.0.4 + call-bound: 1.0.3 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -6145,7 +5835,7 @@ snapshots: is-boolean-object@1.2.2: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-buffer@2.0.5: {} @@ -6162,13 +5852,13 @@ snapshots: is-data-view@1.0.2: dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 is-typed-array: 1.1.15 is-date-object@1.1.0: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-decimal@2.0.1: {} @@ -6179,13 +5869,13 @@ snapshots: is-finalizationregistry@1.1.1: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 is-fullwidth-code-point@3.0.0: {} is-generator-function@1.1.0: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -6204,7 +5894,7 @@ snapshots: is-number-object@1.1.1: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-number@7.0.0: {} @@ -6219,7 +5909,7 @@ snapshots: is-regex@1.2.1: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 gopd: 1.2.0 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -6228,18 +5918,18 @@ snapshots: is-shared-array-buffer@1.0.4: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 is-stream@2.0.1: {} is-string@1.1.1: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-symbol@1.1.1: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 has-symbols: 1.1.0 safe-regex-test: 1.1.0 @@ -6253,18 +5943,18 @@ snapshots: is-weakref@1.1.1: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 is-weakset@2.0.4: dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 isarray@1.0.0: {} isarray@2.0.5: {} - isbot@5.1.23: {} + isbot@5.1.25: {} isexe@2.0.0: {} @@ -6272,7 +5962,7 @@ snapshots: dependencies: define-data-property: 1.1.4 es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 get-proto: 1.0.1 has-symbols: 1.1.0 set-function-name: 2.0.2 @@ -6341,11 +6031,10 @@ snapshots: loader-utils@3.3.1: {} - local-pkg@1.1.1: + local-pkg@0.5.1: dependencies: mlly: 1.7.4 - pkg-types: 2.1.0 - quansync: 0.2.8 + pkg-types: 1.3.1 locate-path@6.0.0: dependencies: @@ -6394,7 +6083,7 @@ snapshots: dependencies: '@types/mdast': 3.0.15 '@types/unist': 2.0.11 - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.0.2 mdast-util-to-string: 3.2.0 micromark: 3.2.0 micromark-util-decode-numeric-character-reference: 1.1.0 @@ -6507,7 +6196,7 @@ snapshots: micromark-core-commonmark@1.1.0: dependencies: - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.0.2 micromark-factory-destination: 1.1.0 micromark-factory-label: 1.1.0 micromark-factory-space: 1.1.0 @@ -6573,8 +6262,8 @@ snapshots: micromark-extension-mdxjs@1.0.1: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) micromark-extension-mdx-expression: 1.0.8 micromark-extension-mdx-jsx: 1.0.5 micromark-extension-mdx-md: 1.0.1 @@ -6651,7 +6340,7 @@ snapshots: micromark-util-decode-string@1.1.0: dependencies: - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.0.2 micromark-util-character: 1.2.0 micromark-util-decode-numeric-character-reference: 1.1.0 micromark-util-symbol: 1.1.0 @@ -6700,7 +6389,7 @@ snapshots: dependencies: '@types/debug': 4.1.12 debug: 4.4.0 - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 @@ -6776,7 +6465,7 @@ snapshots: mlly@1.7.4: dependencies: - acorn: 8.14.1 + acorn: 8.14.0 pathe: 2.0.3 pkg-types: 1.3.1 ufo: 1.5.4 @@ -6801,7 +6490,7 @@ snapshots: ms@2.1.3: {} - nanoid@3.3.9: {} + nanoid@3.3.8: {} natural-compare-lite@1.4.0: {} @@ -6860,7 +6549,7 @@ snapshots: object.assign@4.1.7: dependencies: call-bind: 1.0.8 - call-bound: 1.0.4 + call-bound: 1.0.3 define-properties: 1.2.1 es-object-atoms: 1.1.1 has-symbols: 1.1.0 @@ -6888,7 +6577,7 @@ snapshots: object.values@1.2.1: dependencies: call-bind: 1.0.8 - call-bound: 1.0.4 + call-bound: 1.0.3 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -6935,7 +6624,7 @@ snapshots: own-keys@1.0.1: dependencies: - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 object-keys: 1.1.1 safe-push-apply: 1.0.0 @@ -6964,7 +6653,7 @@ snapshots: '@types/unist': 2.0.11 character-entities-legacy: 3.0.0 character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.0.2 is-alphanumerical: 2.0.1 is-decimal: 2.0.1 is-hexadecimal: 2.0.1 @@ -7018,56 +6707,50 @@ snapshots: mlly: 1.7.4 pathe: 2.0.3 - pkg-types@2.1.0: - dependencies: - confbox: 0.2.1 - exsolve: 1.0.2 - pathe: 2.0.3 - possible-typed-array-names@1.1.0: {} - postcss-discard-duplicates@5.1.0(postcss@8.5.3): + postcss-discard-duplicates@5.1.0(postcss@8.5.2): dependencies: - postcss: 8.5.3 + postcss: 8.5.2 - postcss-load-config@4.0.2(postcss@8.5.3): + postcss-load-config@4.0.2(postcss@8.5.2): dependencies: lilconfig: 3.1.3 yaml: 2.7.0 optionalDependencies: - postcss: 8.5.3 + postcss: 8.5.2 - postcss-modules-extract-imports@3.1.0(postcss@8.5.3): + postcss-modules-extract-imports@3.1.0(postcss@8.5.2): dependencies: - postcss: 8.5.3 + postcss: 8.5.2 - postcss-modules-local-by-default@4.2.0(postcss@8.5.3): + postcss-modules-local-by-default@4.2.0(postcss@8.5.2): dependencies: - icss-utils: 5.1.0(postcss@8.5.3) - postcss: 8.5.3 + icss-utils: 5.1.0(postcss@8.5.2) + postcss: 8.5.2 postcss-selector-parser: 7.1.0 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.2.1(postcss@8.5.3): + postcss-modules-scope@3.2.1(postcss@8.5.2): dependencies: - postcss: 8.5.3 + postcss: 8.5.2 postcss-selector-parser: 7.1.0 - postcss-modules-values@4.0.0(postcss@8.5.3): + postcss-modules-values@4.0.0(postcss@8.5.2): dependencies: - icss-utils: 5.1.0(postcss@8.5.3) - postcss: 8.5.3 + icss-utils: 5.1.0(postcss@8.5.2) + postcss: 8.5.2 - postcss-modules@6.0.1(postcss@8.5.3): + postcss-modules@6.0.1(postcss@8.5.2): dependencies: generic-names: 4.0.0 - icss-utils: 5.1.0(postcss@8.5.3) + icss-utils: 5.1.0(postcss@8.5.2) lodash.camelcase: 4.3.0 - postcss: 8.5.3 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.3) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.3) - postcss-modules-scope: 3.2.1(postcss@8.5.3) - postcss-modules-values: 4.0.0(postcss@8.5.3) + postcss: 8.5.2 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.2) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.2) + postcss-modules-scope: 3.2.1(postcss@8.5.2) + postcss-modules-values: 4.0.0(postcss@8.5.2) string-hash: 1.1.3 postcss-selector-parser@7.1.0: @@ -7077,9 +6760,9 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.5.3: + postcss@8.5.2: dependencies: - nanoid: 3.3.9 + nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -7143,8 +6826,6 @@ snapshots: dependencies: side-channel: 1.1.0 - quansync@0.2.8: {} - queue-microtask@1.2.3: {} range-parser@1.2.1: {} @@ -7208,7 +6889,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 get-proto: 1.0.1 which-builtin-type: 1.2.1 @@ -7290,31 +6971,31 @@ snapshots: retry@0.12.0: {} - reusify@1.1.0: {} + reusify@1.0.4: {} - rollup@4.34.9: + rollup@4.34.8: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.34.9 - '@rollup/rollup-android-arm64': 4.34.9 - '@rollup/rollup-darwin-arm64': 4.34.9 - '@rollup/rollup-darwin-x64': 4.34.9 - '@rollup/rollup-freebsd-arm64': 4.34.9 - '@rollup/rollup-freebsd-x64': 4.34.9 - '@rollup/rollup-linux-arm-gnueabihf': 4.34.9 - '@rollup/rollup-linux-arm-musleabihf': 4.34.9 - '@rollup/rollup-linux-arm64-gnu': 4.34.9 - '@rollup/rollup-linux-arm64-musl': 4.34.9 - '@rollup/rollup-linux-loongarch64-gnu': 4.34.9 - '@rollup/rollup-linux-powerpc64le-gnu': 4.34.9 - '@rollup/rollup-linux-riscv64-gnu': 4.34.9 - '@rollup/rollup-linux-s390x-gnu': 4.34.9 - '@rollup/rollup-linux-x64-gnu': 4.34.9 - '@rollup/rollup-linux-x64-musl': 4.34.9 - '@rollup/rollup-win32-arm64-msvc': 4.34.9 - '@rollup/rollup-win32-ia32-msvc': 4.34.9 - '@rollup/rollup-win32-x64-msvc': 4.34.9 + '@rollup/rollup-android-arm-eabi': 4.34.8 + '@rollup/rollup-android-arm64': 4.34.8 + '@rollup/rollup-darwin-arm64': 4.34.8 + '@rollup/rollup-darwin-x64': 4.34.8 + '@rollup/rollup-freebsd-arm64': 4.34.8 + '@rollup/rollup-freebsd-x64': 4.34.8 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.8 + '@rollup/rollup-linux-arm-musleabihf': 4.34.8 + '@rollup/rollup-linux-arm64-gnu': 4.34.8 + '@rollup/rollup-linux-arm64-musl': 4.34.8 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.8 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.8 + '@rollup/rollup-linux-riscv64-gnu': 4.34.8 + '@rollup/rollup-linux-s390x-gnu': 4.34.8 + '@rollup/rollup-linux-x64-gnu': 4.34.8 + '@rollup/rollup-linux-x64-musl': 4.34.8 + '@rollup/rollup-win32-arm64-msvc': 4.34.8 + '@rollup/rollup-win32-ia32-msvc': 4.34.8 + '@rollup/rollup-win32-x64-msvc': 4.34.8 fsevents: 2.3.3 run-parallel@1.2.0: @@ -7328,8 +7009,8 @@ snapshots: safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 has-symbols: 1.1.0 isarray: 2.0.5 @@ -7344,7 +7025,7 @@ snapshots: safe-regex-test@1.1.0: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 es-errors: 1.3.0 is-regex: 1.2.1 @@ -7390,7 +7071,7 @@ snapshots: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -7422,16 +7103,16 @@ snapshots: side-channel-map@1.0.1: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 object-inspect: 1.13.4 side-channel-weakmap@1.0.2: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 object-inspect: 1.13.4 side-channel-map: 1.0.1 @@ -7516,12 +7197,12 @@ snapshots: string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.8 - call-bound: 1.0.4 + call-bound: 1.0.3 define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.7 gopd: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 @@ -7537,7 +7218,7 @@ snapshots: string.prototype.trim@1.2.10: dependencies: call-bind: 1.0.8 - call-bound: 1.0.4 + call-bound: 1.0.3 define-data-property: 1.1.4 define-properties: 1.2.1 es-abstract: 1.23.9 @@ -7547,7 +7228,7 @@ snapshots: string.prototype.trimend@1.0.9: dependencies: call-bind: 1.0.8 - call-bound: 1.0.4 + call-bound: 1.0.3 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -7625,7 +7306,7 @@ snapshots: readable-stream: 2.3.8 xtend: 4.0.2 - tinyglobby@0.2.12: + tinyglobby@0.2.11: dependencies: fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 @@ -7675,7 +7356,7 @@ snapshots: typed-array-buffer@1.0.3: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 es-errors: 1.3.0 is-typed-array: 1.1.15 @@ -7712,7 +7393,7 @@ snapshots: unbox-primitive@1.1.0: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 has-bigints: 1.1.0 has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 @@ -7777,7 +7458,7 @@ snapshots: unpipe@1.0.0: {} - update-browserslist-db@1.1.3(browserslist@4.24.4): + update-browserslist-db@1.1.2(browserslist@4.24.4): dependencies: browserslist: 4.24.4 escalade: 3.2.0 @@ -7831,13 +7512,13 @@ snapshots: unist-util-stringify-position: 3.0.3 vfile-message: 3.1.4 - vite-node@1.6.1(@types/node@22.13.9): + vite-node@1.6.1(@types/node@22.13.4): dependencies: cac: 6.7.14 debug: 4.4.0 pathe: 1.1.2 picocolors: 1.1.1 - vite: 5.4.14(@types/node@22.13.9) + vite: 5.4.14(@types/node@22.13.4) transitivePeerDependencies: - '@types/node' - less @@ -7849,16 +7530,15 @@ snapshots: - supports-color - terser - vite-node@3.0.0-beta.2(@types/node@22.13.9)(yaml@2.7.0): + vite-node@3.0.0-beta.2(@types/node@22.13.4): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 1.1.2 - vite: 6.2.1(@types/node@22.13.9)(yaml@2.7.0) + vite: 5.4.14(@types/node@22.13.4) transitivePeerDependencies: - '@types/node' - - jiti - less - lightningcss - sass @@ -7867,27 +7547,15 @@ snapshots: - sugarss - supports-color - terser - - tsx - - yaml - vite@5.4.14(@types/node@22.13.9): + vite@5.4.14(@types/node@22.13.4): dependencies: esbuild: 0.21.5 - postcss: 8.5.3 - rollup: 4.34.9 - optionalDependencies: - '@types/node': 22.13.9 - fsevents: 2.3.3 - - vite@6.2.1(@types/node@22.13.9)(yaml@2.7.0): - dependencies: - esbuild: 0.25.0 - postcss: 8.5.3 - rollup: 4.34.9 + postcss: 8.5.2 + rollup: 4.34.8 optionalDependencies: - '@types/node': 22.13.9 + '@types/node': 22.13.4 fsevents: 2.3.3 - yaml: 2.7.0 wcwidth@1.0.1: dependencies: @@ -7911,7 +7579,7 @@ snapshots: which-builtin-type@1.2.1: dependencies: - call-bound: 1.0.4 + call-bound: 1.0.3 function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 is-async-function: 2.1.1 @@ -7936,7 +7604,7 @@ snapshots: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - call-bound: 1.0.4 + call-bound: 1.0.3 for-each: 0.3.5 gopd: 1.2.0 has-tostringtag: 1.0.2 diff --git a/examples/simple_counter/web-yew/Cargo.toml b/examples/simple_counter/web-yew/Cargo.toml index afbf7aa8a..b6b3848c0 100644 --- a/examples/simple_counter/web-yew/Cargo.toml +++ b/examples/simple_counter/web-yew/Cargo.toml @@ -4,5 +4,6 @@ version = "0.1.0" edition = "2021" [dependencies] +async-std = "1.13.0" shared = { path = "../shared" } yew = { version = "0.21.0", features = ["csr"] } diff --git a/examples/simple_counter/web-yew/src/core.rs b/examples/simple_counter/web-yew/src/core.rs index 603a2bac4..aaac1c809 100644 --- a/examples/simple_counter/web-yew/src/core.rs +++ b/examples/simple_counter/web-yew/src/core.rs @@ -1,27 +1,44 @@ -use shared::{Counter, Effect, Event}; +use shared::{Counter, Event, Middleware, Nacre, ShellEffect, ViewModel}; use std::rc::Rc; use yew::Callback; -pub type Core = Rc<shared::Core<Counter>>; +pub type Core = Rc<Nacre<Counter>>; pub enum Message { Event(Event), #[allow(dead_code)] - Effect(Effect), + Effect(ShellEffect), } -pub fn new() -> Core { - Rc::new(shared::Core::new()) +pub fn new(cb: Callback<Message>) -> Core { + let (sender, receiver) = async_std::channel::bounded(1); + + let nacre = Nacre::new(sender); + let this = Rc::new(nacre); + let cloned = this.clone(); + + async_std::task::spawn_local(async move { + while let Ok(effects) = receiver.recv().await { + for effect in effects { + process_effect(&cloned, effect, &cb); + } + } + }); + this } pub fn update(core: &Core, event: Event, callback: &Callback<Message>) { for effect in core.process_event(event) { - process_effect(core, effect, callback); + process_effect(core, effect.into(), callback); } } -pub fn process_effect(_core: &Core, effect: Effect, callback: &Callback<Message>) { +pub fn process_effect(_core: &Core, effect: ShellEffect, callback: &Callback<Message>) { match effect { - render @ Effect::Render(_) => callback.emit(Message::Effect(render)), + render @ ShellEffect::Render(_) => callback.emit(Message::Effect(render)), } } + +pub fn view(core: &Core) -> ViewModel { + core.view() +} diff --git a/examples/simple_counter/web-yew/src/main.rs b/examples/simple_counter/web-yew/src/main.rs index 156a05ffa..04647ba95 100644 --- a/examples/simple_counter/web-yew/src/main.rs +++ b/examples/simple_counter/web-yew/src/main.rs @@ -4,17 +4,31 @@ use crate::core::{Core, Message}; use shared::Event; use yew::prelude::*; -#[derive(Default)] struct RootComponent { core: Core, } +impl RootComponent { + fn new(callback: Callback<Message>) -> Self { + Self { + core: crate::core::new(callback), + } + } +} + impl Component for RootComponent { type Message = Message; type Properties = (); - fn create(_ctx: &Context<Self>) -> Self { - Self { core: core::new() } + fn create(ctx: &Context<Self>) -> Self { + let link = ctx.link().clone(); + let callback = Callback::from(move |msg| { + link.send_message(msg); + }); + let this = RootComponent::new(callback); + ctx.link() + .send_message(Message::Event(Event::StartInterval)); + this } fn update(&mut self, ctx: &Context<Self>, msg: Self::Message) -> bool { @@ -32,14 +46,14 @@ impl Component for RootComponent { fn view(&self, ctx: &Context<Self>) -> Html { let link = ctx.link(); - let view = self.core.view(); + let view = core::view(&self.core); html! { <section class="box container has-text-centered m-5"> <p class="is-size-5">{&view.count}</p> <div class="buttons section is-centered"> <button class="button is-primary is-danger" - onclick={link.callback(|_| Message::Event(Event::Reset))}> + onclick={link.callback(|_| Message::Event(Event::DelayReset))}> {"Reset"} </button> <button class="button is-primary is-success"