diff --git a/.github/workflows/e2e-ci.yml b/.github/workflows/e2e-ci.yml index 088d4b73..3ba1fbf9 100644 --- a/.github/workflows/e2e-ci.yml +++ b/.github/workflows/e2e-ci.yml @@ -45,17 +45,9 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 1 if: always() - needs: [e2e] - env: - FAILURE: ${{ contains(join(needs.*.result, ','), 'failure') }} - CANCELLED: ${{ contains(join(needs.*.result, ','), 'cancelled') }} + needs: + - e2e steps: - - name: Check for failure or cancelled jobs result - shell: bash - run: | - echo "Failure: $FAILURE - Cancelled: $CANCELLED" - if [ "$FAILURE" = "false" ] && [ "$CANCELLED" = "false" ]; then - exit 0 - else - exit 1 - fi + - name: Exit with error if some jobs are not successful + run: exit 1 + if: ${{ always() && (contains(needs.*.result, 'failure') || contains(needs.*.result, 'skipped') || contains(needs.*.result, 'cancelled')) }} diff --git a/.github/workflows/repo-root-ci.yml b/.github/workflows/repo-root-ci.yml index 8607a495..be53474d 100644 --- a/.github/workflows/repo-root-ci.yml +++ b/.github/workflows/repo-root-ci.yml @@ -35,17 +35,9 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 1 if: always() - needs: [format] - env: - FAILURE: ${{ contains(join(needs.*.result, ','), 'failure') }} - CANCELLED: ${{ contains(join(needs.*.result, ','), 'cancelled') }} + needs: + - format steps: - - name: Check for failure or cancelled jobs result - shell: bash - run: | - echo "Failure: $FAILURE - Cancelled: $CANCELLED" - if [ "$FAILURE" = "false" ] && [ "$CANCELLED" = "false" ]; then - exit 0 - else - exit 1 - fi + - name: Exit with error if some jobs are not successful + run: exit 1 + if: ${{ always() && (contains(needs.*.result, 'failure') || contains(needs.*.result, 'skipped') || contains(needs.*.result, 'cancelled')) }} diff --git a/.github/workflows/rust-ci.yml b/.github/workflows/rust-ci.yml index 809d7ce0..32502dfa 100644 --- a/.github/workflows/rust-ci.yml +++ b/.github/workflows/rust-ci.yml @@ -70,17 +70,10 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 1 if: always() - needs: [build_and_test, lint_and_fmt] - env: - FAILURE: ${{ contains(join(needs.*.result, ','), 'failure') }} - CANCELLED: ${{ contains(join(needs.*.result, ','), 'cancelled') }} + needs: + - build_and_test + - lint_and_fmt steps: - - name: Check for failure or cancelled jobs result - shell: bash - run: | - echo "Failure: $FAILURE - Cancelled: $CANCELLED" - if [ "$FAILURE" = "false" ] && [ "$CANCELLED" = "false" ]; then - exit 0 - else - exit 1 - fi + - name: Exit with error if some jobs are not successful + run: exit 1 + if: ${{ always() && (contains(needs.*.result, 'failure') || contains(needs.*.result, 'skipped') || contains(needs.*.result, 'cancelled')) }} diff --git a/.github/workflows/typescript-ci.yml b/.github/workflows/typescript-ci.yml index b9d33b06..b6307a2c 100644 --- a/.github/workflows/typescript-ci.yml +++ b/.github/workflows/typescript-ci.yml @@ -64,17 +64,10 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 1 if: always() - needs: [build_and_test, lint_and_fmt] - env: - FAILURE: ${{ contains(join(needs.*.result, ','), 'failure') }} - CANCELLED: ${{ contains(join(needs.*.result, ','), 'cancelled') }} + needs: + - build_and_test + - lint_and_fmt steps: - - name: Check for failure or cancelled jobs result - shell: bash - run: | - echo "Failure: $FAILURE - Cancelled: $CANCELLED" - if [ "$FAILURE" = "false" ] && [ "$CANCELLED" = "false" ]; then - exit 0 - else - exit 1 - fi + - name: Exit with error if some jobs are not successful + run: exit 1 + if: ${{ always() && (contains(needs.*.result, 'failure') || contains(needs.*.result, 'skipped') || contains(needs.*.result, 'cancelled')) }} diff --git a/CODEOWNERS b/CODEOWNERS index 3a4722c0..bff3751b 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,9 +1,2 @@ -* @Valerioageno @marcalexiei - -# Rust -/crates/ @Valerioageno -/Cargo.toml @Valerioageno - -# Misc -/.github/ @marcalexiei +* @Valerioageno diff --git a/crates/tuono/Cargo.toml b/crates/tuono/Cargo.toml index 487348dd..4a3a6e3f 100644 --- a/crates/tuono/Cargo.toml +++ b/crates/tuono/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tuono" -version = "0.19.0" +version = "0.19.2" edition = "2024" authors = ["V. Ageno "] description = "Superfast React fullstack framework" @@ -10,7 +10,7 @@ repository = "https://github.com/tuono-labs/tuono" readme = "../../README.md" license-file = "../../LICENSE.md" categories = ["web-programming"] -include = ["src/**/*.rs", "Cargo.toml"] +include = ["src/**/*.rs", "templates/*", "Cargo.toml"] [lib] name = "tuono" @@ -18,21 +18,24 @@ path = "src/lib.rs" [dependencies] clap = { version = "4.5.4", features = ["derive", "cargo"] } -watchexec = "5.0.0" tracing = "0.1.41" tracing-subscriber = {version = "0.3.19", features = ["env-filter"]} miette = "7.2.0" + +colored = "2.1.0" +watchexec = "5.0.0" watchexec-signals = "4.0.0" +watchexec-events = "4.0.0" +watchexec-supervisor = "3.0.0" tokio = { version = "1", features = ["full"] } serde = { version = "1.0.202", features = ["derive"] } -watchexec-supervisor = "3.0.0" glob = "0.3.1" regex = "1.10.4" reqwest = { version = "0.12.4", features = ["blocking", "json"] } serde_json = "1.0" fs_extra = "1.3.0" http = "1.1.0" -tuono_internal = {path = "../tuono_internal", version = "0.19.0"} +tuono_internal = {path = "../tuono_internal", version = "0.19.2"} spinners = "4.1.1" console = "0.15.10" diff --git a/crates/tuono/src/commands/dev.rs b/crates/tuono/src/commands/dev.rs index 37f8c0f1..f4365fe1 100644 --- a/crates/tuono/src/commands/dev.rs +++ b/crates/tuono/src/commands/dev.rs @@ -1,79 +1,22 @@ use std::fs; use std::path::Path; -use std::sync::{Arc, RwLock}; -use watchexec_supervisor::command::{Command, Program}; +use std::sync::RwLock; +use std::sync::{Arc, Mutex}; +use std::time::Duration; +use tuono_internal::tuono_println; +use watchexec_events::Tag; +use watchexec_events::filekind::FileEventKind; + +use crate::process_manager::{ProcessId, ProcessManager}; use miette::{IntoDiagnostic, Result}; use watchexec::Watchexec; use watchexec_signals::Signal; -use watchexec_supervisor::job::{Job, start_job}; use crate::source_builder::SourceBuilder; use console::Term; use spinners::{Spinner, Spinners}; -#[cfg(target_os = "windows")] -const DEV_WATCH_BIN_SRC: &str = "node_modules\\.bin\\tuono-dev-watch.cmd"; -#[cfg(target_os = "windows")] -const DEV_SSR_BIN_SRC: &str = "node_modules\\.bin\\tuono-dev-ssr.cmd"; - -#[cfg(not(target_os = "windows"))] -const DEV_WATCH_BIN_SRC: &str = "node_modules/.bin/tuono-dev-watch"; -#[cfg(not(target_os = "windows"))] -const DEV_SSR_BIN_SRC: &str = "node_modules/.bin/tuono-dev-ssr"; - -fn watch_react_src() -> Job { - if !Path::new(DEV_SSR_BIN_SRC).exists() { - eprintln!("Failed to find script to run dev watch. Please run `npm install`"); - std::process::exit(1); - } - start_job(Arc::new(Command { - program: Program::Exec { - prog: DEV_WATCH_BIN_SRC.into(), - args: vec![], - }, - options: Default::default(), - })) - .0 -} - -fn run_rust_dev_server() -> Job { - start_job(Arc::new(Command { - program: Program::Exec { - prog: "cargo".into(), - args: vec!["run".to_string(), "-q".to_string()], - }, - options: Default::default(), - })) - .0 -} - -fn build_rust_src() -> Job { - start_job(Arc::new(Command { - program: Program::Exec { - prog: "cargo".into(), - args: vec!["build".to_string(), "-q".to_string()], - }, - options: Default::default(), - })) - .0 -} - -fn build_react_ssr_src() -> Job { - if !Path::new(DEV_SSR_BIN_SRC).exists() { - eprintln!("Failed to find script to run dev ssr. Please run `npm install`"); - std::process::exit(1); - } - start_job(Arc::new(Command { - program: Program::Exec { - prog: DEV_SSR_BIN_SRC.into(), - args: vec![], - }, - options: Default::default(), - })) - .0 -} - fn ssr_reload_needed(path: &Path) -> bool { let file_name_starts_with_env = path .file_name() @@ -85,73 +28,121 @@ fn ssr_reload_needed(path: &Path) -> bool { file_name_starts_with_env || file_path.ends_with("sx") || file_path.ends_with("mdx") } +#[allow( + clippy::await_holding_lock, + reason = "At this point there is no other thread waiting for the lock" +)] +async fn start_all_processes(process_manager: Arc>) { + if let Ok(mut pm) = process_manager.lock() { + pm.start_dev_processes().await + } +} + +fn detect_existing_env_files() -> Vec { + if let Ok(dir) = fs::read_dir("./") { + dir.filter_map(|entry| entry.ok()) + .filter(|entry| entry.file_name().to_string_lossy().starts_with(".env")) + .map(|entry| entry.path().to_string_lossy().into_owned()) + .collect::>() + } else { + Vec::new() + } +} + #[tokio::main] pub async fn watch(source_builder: SourceBuilder) -> Result<()> { let source_builder = RwLock::new(source_builder); let term = Term::stdout(); let mut sp = Spinner::new(Spinners::Dots, "Starting dev server...".into()); - watch_react_src().start().await; + let process_manager = Arc::new(Mutex::new(ProcessManager::new())); - let rust_server = run_rust_dev_server(); - let build_rust_src = build_rust_src(); + let env_files = detect_existing_env_files(); - let build_ssr_bundle = build_react_ssr_src(); - - let env_files = fs::read_dir("./") - .expect("Error reading env files from current directory") - .filter_map(|entry| entry.ok()) - .filter(|entry| entry.file_name().to_string_lossy().starts_with(".env")) - .map(|entry| entry.path().to_string_lossy().into_owned()) - .collect::>(); - - build_ssr_bundle.start().await; - build_rust_src.start().await; - - // Wait vite and rust builds - build_ssr_bundle.to_wait().await; - build_rust_src.to_wait().await; - - rust_server.start().await; + start_all_processes(process_manager.clone()).await; // Remove the spinner sp.stop(); - term.clear_line().unwrap(); + _ = term.clear_line(); + + // Server address log for production + // is done on the server process. + if let Ok(builder) = source_builder.read() { + if let Ok(pm) = process_manager.lock() { + pm.log_server_address(builder.app.config.clone().unwrap_or_default()); + } + } let wx = Watchexec::new(move |mut action| { + let process_manager = process_manager.clone(); + // if Ctrl-C is received, quit + if action.signals().any(|sig| sig == Signal::Interrupt) { + if let Ok(mut pm) = process_manager.lock() { + pm.abort_all(); + } + + action.quit_gracefully(Signal::Quit, Duration::from_secs(30)); + return action; + } + + // The best way to trigger the processes is to use these + // flags. + // This because the same event can be triggered multiple times + // and we don't want to restart the process multiple times for the same + // purpose. let mut should_reload_ssr_bundle = false; let mut should_reload_rust_server = false; + let mut should_refresh_axum_source = false; for event in action.events.iter() { - for path in event.paths() { - let file_path = path.0.to_string_lossy(); - if file_path.ends_with(".rs") { - should_reload_rust_server = true - } + for event_type in event.tags.iter() { + if let Tag::FileEventKind(kind) = event_type { + match kind { + FileEventKind::Remove(_) => { + if event.paths().any(|(path, _)| { + path.extension().is_some_and(|ext| ext == "rs") || + // APIs might define new HTTP methods that requires + // a refresh of the axum source + path.to_str().unwrap_or("").contains("api") + }) { + should_refresh_axum_source = true; + } + } + FileEventKind::Modify(_) => { + if event + .paths() + .any(|(path, _)| path.extension().is_some_and(|ext| ext == "rs")) + { + should_reload_rust_server = true; + } - if ssr_reload_needed(path.0) { - should_reload_ssr_bundle = true + if event.paths().any(|(path, _)| ssr_reload_needed(path)) { + should_reload_ssr_bundle = true; + } + } + _ => {} + } } } } - if should_reload_rust_server { - println!(" Reloading..."); - rust_server.stop(); - let mut builder = source_builder.write().unwrap(); - builder.app.collect_routes(); - _ = builder.refresh_axum_source(); - rust_server.start(); + if should_reload_rust_server || should_refresh_axum_source { + tuono_println!("Reloading..."); + if should_refresh_axum_source { + if let Ok(mut builder) = source_builder.write() { + builder.app.collect_routes(); + _ = builder.refresh_axum_source(); + } + } + if let Ok(mut pm) = process_manager.lock() { + pm.restart_process(ProcessId::RunRustDevServer); + } } if should_reload_ssr_bundle { - build_ssr_bundle.stop(); - build_ssr_bundle.start(); - } - - // if Ctrl-C is received, quit - if action.signals().any(|sig| sig == Signal::Interrupt) { - action.quit(); + if let Ok(mut pm) = process_manager.lock() { + pm.restart_process(ProcessId::BuildReactSSRSrc); + } } action diff --git a/crates/tuono/src/commands/new.rs b/crates/tuono/src/commands/new.rs index 22b3ce9f..538b1396 100644 --- a/crates/tuono/src/commands/new.rs +++ b/crates/tuono/src/commands/new.rs @@ -6,6 +6,8 @@ use std::env; use std::fs::{self, File, OpenOptions, create_dir}; use std::io::{self, prelude::*}; use std::path::{Path, PathBuf}; +use std::process::Command; +use tracing::trace; #[derive(Deserialize, Debug)] enum GithubFileType { @@ -156,6 +158,9 @@ pub fn create_new_project( update_package_json_version(&folder_path).expect("Failed to update package.json version"); update_cargo_toml_version(&folder_path).expect("Failed to update Cargo.toml version"); + + init_new_git_repo(&folder_path); + outro(folder); } @@ -265,6 +270,16 @@ fn update_cargo_toml_version(folder_path: &Path) -> io::Result<()> { Ok(()) } +fn init_new_git_repo(folder_path: &Path) { + if let Ok(output) = Command::new("git").arg("init").arg(folder_path).output() { + if !output.status.success() { + trace!("Failed to initialise a new git repo") + } + } else { + trace!("Failed to initialise a new git repo") + } +} + fn outro(folder_name: String) { println!("Success! 🎉"); diff --git a/crates/tuono/src/lib.rs b/crates/tuono/src/lib.rs index edb76ef7..4c97e79f 100644 --- a/crates/tuono/src/lib.rs +++ b/crates/tuono/src/lib.rs @@ -7,5 +7,6 @@ mod app; pub mod cli; mod commands; mod mode; +mod process_manager; mod route; mod source_builder; diff --git a/crates/tuono/src/process_manager.rs b/crates/tuono/src/process_manager.rs new file mode 100644 index 00000000..aed8c496 --- /dev/null +++ b/crates/tuono/src/process_manager.rs @@ -0,0 +1,140 @@ +use std::collections::HashMap; + +use clap::crate_version; +use std::path::Path; +use std::sync::Arc; +use tokio::task::JoinHandle; + +use colored::Colorize; + +use tracing::trace; +use tuono_internal::config::Config; +use tuono_internal::tuono_println; +use watchexec_supervisor::command::{Command, Program}; +use watchexec_supervisor::job::{Job, start_job}; + +#[cfg(target_os = "windows")] +const DEV_WATCH_BIN_SRC: &str = "node_modules\\.bin\\tuono-dev-watch.cmd"; +#[cfg(target_os = "windows")] +const DEV_SSR_BIN_SRC: &str = "node_modules\\.bin\\tuono-dev-ssr.cmd"; + +#[cfg(not(target_os = "windows"))] +const DEV_WATCH_BIN_SRC: &str = "node_modules/.bin/tuono-dev-watch"; +#[cfg(not(target_os = "windows"))] +const DEV_SSR_BIN_SRC: &str = "node_modules/.bin/tuono-dev-ssr"; + +#[derive(PartialEq, Eq, Hash, Debug)] +pub enum ProcessId { + WatchReactSrc, + RunRustDevServer, + BuildRustSrc, + BuildReactSSRSrc, +} + +// This struct manages all the processes spawned by the dev server +// That are not the dev server itself +#[derive(Debug)] +pub struct ProcessManager { + processes: HashMap)>, +} + +impl ProcessManager { + pub fn new() -> Self { + trace!("Creating process manager"); + if !Path::new(DEV_SSR_BIN_SRC).exists() { + eprintln!("Failed to find script to run dev watch. Please run `npm install`"); + std::process::exit(1); + } + let mut processes = HashMap::new(); + processes.insert( + ProcessId::WatchReactSrc, + start_supervisor_job(DEV_WATCH_BIN_SRC, vec![]), + ); + + processes.insert( + ProcessId::RunRustDevServer, + start_supervisor_job("cargo", vec!["run", "-q"]), + ); + + processes.insert( + ProcessId::BuildRustSrc, + start_supervisor_job("cargo", vec!["build", "-q"]), + ); + + processes.insert( + ProcessId::BuildReactSSRSrc, + start_supervisor_job(DEV_SSR_BIN_SRC, vec![]), + ); + + Self { processes } + } + + pub fn start_process(&mut self, id: ProcessId) { + trace!("start process {:?}", id); + if let Some((job, _)) = self.processes.get(&id) { + job.start(); + } + } + + // Start all the processes needed for the dev server + pub async fn start_dev_processes(&mut self) { + trace!("Starting dev processes"); + self.start_process(ProcessId::WatchReactSrc); + self.start_process(ProcessId::BuildRustSrc); + self.start_process(ProcessId::BuildReactSSRSrc); + + self.wait_for_process(ProcessId::BuildRustSrc).await; + self.wait_for_process(ProcessId::BuildReactSSRSrc).await; + + // This needs to start after having built the rust and react sources + self.start_process(ProcessId::RunRustDevServer); + } + + pub fn log_server_address(&self, config: Config) { + let server_address = format!("{}:{}", config.server.host, config.server.port); + // Format the server address as a valid URL so that it becomes clickable in the CLI + // @see https://github.com/tuono-labs/tuono/issues/460 + let server_base_url = format!("http://{}", server_address); + + println!(); + tuono_println!("⚡ Tuono v{}", crate_version!()); + + tuono_println!("Development server at: {}\n", server_base_url.blue().bold()); + if let Some(origin) = config.server.origin { + tuono_println!("Origin: {}\n", origin.blue().bold()); + } + } + + pub fn restart_process(&mut self, id: ProcessId) { + trace!("Restarting process {:?}", id); + if let Some((job, _)) = self.processes.get(&id) { + job.stop(); + job.start(); + } + } + + pub async fn wait_for_process(&mut self, id: ProcessId) { + trace!("Waiting for process {:?}", id); + if let Some((job, _)) = self.processes.get(&id) { + job.to_wait().await; + } + } + + pub fn abort_all(&mut self) { + trace!("Aborting all processes"); + for (_, (job, handle)) in self.processes.iter() { + job.stop(); + handle.abort(); + } + } +} + +fn start_supervisor_job(prog: &str, args: Vec<&str>) -> (Job, JoinHandle<()>) { + start_job(Arc::new(Command { + program: Program::Exec { + prog: prog.into(), + args: args.into_iter().map(|arg| arg.to_string()).collect(), + }, + options: Default::default(), + })) +} diff --git a/crates/tuono/src/source_builder.rs b/crates/tuono/src/source_builder.rs index 6edda842..ebc292ad 100644 --- a/crates/tuono/src/source_builder.rs +++ b/crates/tuono/src/source_builder.rs @@ -1,4 +1,3 @@ -use std::collections::HashMap; use std::fs; use std::io; use std::io::prelude::*; @@ -13,76 +12,14 @@ use crate::mode::Mode; use crate::route::AxumInfo; use crate::route::Route; -const FALLBACK_HTML: &str = r#" - - - - - - - -"#; - -const SERVER_ENTRY_DATA: &str = "// File automatically generated by tuono -// Do not manually update this file -import { routeTree } from './routeTree.gen' -import { serverSideRendering } from 'tuono/ssr' - -export const renderFn = serverSideRendering(routeTree) -"; - -const CLIENT_ENTRY_DATA: &str = "// File automatically generated by tuono -// Do not manually update this file -import 'vite/modulepreload-polyfill' -import { hydrate } from 'tuono/hydration' - -// Import the generated route tree -import { routeTree } from './routeTree.gen' - -hydrate(routeTree) -"; - -const AXUM_ENTRY_POINT: &str = r##" -// File automatically generated -// Do not manually change it - -use tuono_lib::{tokio, Mode, Server, axum::Router, tuono_internal_init_v8_platform}; -// AXUM_GET_ROUTE_HANDLER - -const MODE: Mode = /*MODE*/; - -// MODULE_IMPORTS - -//MAIN_FILE_IMPORT// - -#[tokio::main] -async fn main() { - tuono_internal_init_v8_platform(); - println!("\n ⚡ Tuono v/*VERSION*/"); - - //MAIN_FILE_DEFINITION// - - let router = Router::new() - // ROUTE_BUILDER - //MAIN_FILE_USAGE//; - - Server::init(router, MODE).await.start().await -} -"##; - -#[cfg(target_os = "windows")] -const MAIN_FILE_PATH: &str = ".\\.tuono\\main.rs"; - -#[cfg(target_os = "windows")] -const FALLBACK_HTML_PATH: &str = ".\\.tuono\\index.html"; +#[cfg(not(target_os = "windows"))] +const FALLBACK_HTML: &str = include_str!("../templates/fallback.html"); +#[cfg(not(target_os = "windows"))] +const SERVER_ENTRY_DATA: &str = include_str!("../templates/server.ts"); +#[cfg(not(target_os = "windows"))] +const CLIENT_ENTRY_DATA: &str = include_str!("../templates/client.ts"); +#[cfg(not(target_os = "windows"))] +const AXUM_ENTRY_POINT: &str = include_str!("../templates/server.rs"); #[cfg(not(target_os = "windows"))] const MAIN_FILE_PATH: &str = "./.tuono/main.rs"; @@ -93,6 +30,21 @@ const FALLBACK_HTML_PATH: &str = "./.tuono/index.html"; const ROUTE_FOLDER: &str = "src/routes"; const DEV_FOLDER: &str = ".tuono"; +#[cfg(target_os = "windows")] +const FALLBACK_HTML: &str = include_str!("..\\templates\\fallback.html"); +#[cfg(target_os = "windows")] +const SERVER_ENTRY_DATA: &str = include_str!("..\\templates\\server.ts"); +#[cfg(target_os = "windows")] +const CLIENT_ENTRY_DATA: &str = include_str!("..\\templates\\client.ts"); +#[cfg(target_os = "windows")] +const AXUM_ENTRY_POINT: &str = include_str!("..\\templates\\server.rs"); + +#[cfg(target_os = "windows")] +const MAIN_FILE_PATH: &str = ".\\.tuono\\main.rs"; + +#[cfg(target_os = "windows")] +const FALLBACK_HTML_PATH: &str = ".\\.tuono\\index.html"; + // Use this function to instruct the users on how to // fix their setup to make tuono work fn recoverable_error(message: &str) -> ! { @@ -124,8 +76,6 @@ impl SourceBuilder { let base_path = std::env::current_dir()?; - create_client_entry_files()?; - Ok(Self { app, mode, @@ -138,11 +88,14 @@ impl SourceBuilder { let Self { mode, .. } = &self; self.refresh_axum_source()?; + let dev_folder = Path::new(DEV_FOLDER); + self.create_file(dev_folder.join("server-main.tsx"), SERVER_ENTRY_DATA)?; + self.create_file(dev_folder.join("client-main.tsx"), CLIENT_ENTRY_DATA)?; if mode == &Mode::Dev { self.app.build_tuono_config()?; - let fallback_html = create_html_fallback(&self.app); - self.create_file(FALLBACK_HTML_PATH, &fallback_html)?; + let fallback_html = self.build_html_fallback(); + self.create_file(PathBuf::from(FALLBACK_HTML_PATH), &fallback_html)?; } Ok(()) @@ -152,14 +105,9 @@ impl SourceBuilder { let Self { app, mode, .. } = &self; let src = AXUM_ENTRY_POINT - .replace( - "// ROUTE_BUILDER\n", - &create_routes_declaration(&app.route_map), - ) - .replace( - "// MODULE_IMPORTS\n", - &create_modules_declaration(&app.route_map), - ) + .replace("\r", "") + .replace("// ROUTE_BUILDER\n", &self.create_routes_declaration()) + .replace("// MODULE_IMPORTS\n", &self.create_modules_declaration()) .replace("/*VERSION*/", crate_version!()) .replace("/*MODE*/", mode.as_str()) .replace( @@ -204,97 +152,87 @@ impl SourceBuilder { pub fn refresh_axum_source(&self) -> io::Result<()> { let axum_source = self.generate_axum_source(); - self.create_file(MAIN_FILE_PATH, &axum_source)?; + self.create_file(PathBuf::from(MAIN_FILE_PATH), &axum_source)?; Ok(()) } - fn create_file(&self, path: &str, content: &str) -> io::Result<()> { + fn create_file(&self, path: PathBuf, content: &str) -> io::Result<()> { let mut data_file = fs::File::create(self.base_path.join(path))?; data_file.write_all(content.as_bytes())?; Ok(()) } -} -fn create_routes_declaration(routes: &HashMap) -> String { - let mut route_declarations = String::from("// ROUTE_BUILDER\n"); + fn create_routes_declaration(&self) -> String { + let routes = &self.app.route_map; + let mut route_declarations = String::from("// ROUTE_BUILDER\n"); - for (_, route) in routes.iter() { - let Route { axum_info, .. } = &route; + for (_, route) in routes.iter() { + let Route { axum_info, .. } = &route; - if axum_info.is_some() { - let AxumInfo { - axum_route, - module_import, - } = axum_info.as_ref().unwrap(); + if axum_info.is_some() { + let AxumInfo { + axum_route, + module_import, + } = axum_info.as_ref().unwrap(); - if !route.is_api() { - route_declarations.push_str(&format!( - r#".route("{axum_route}", get({module_import}::tuono_internal_route))"# - )); - - route_declarations.push_str(&format!( - r#".route("/__tuono/data{axum_route}", get({module_import}::tuono_internal_api))"# - )); - } else { - for method in route.api_data.as_ref().unwrap().methods.clone() { - let method = method.to_string().to_lowercase(); + if !route.is_api() { route_declarations.push_str(&format!( - r#".route("{axum_route}", {method}({module_import}::{method}_tuono_internal_api))"# + r#".route("{axum_route}", get({module_import}::tuono_internal_route))"# )); + + route_declarations.push_str(&format!( + r#".route("/__tuono/data{axum_route}", get({module_import}::tuono_internal_api))"# + )); + } else { + for method in route.api_data.as_ref().unwrap().methods.clone() { + let method = method.to_string().to_lowercase(); + route_declarations.push_str(&format!( + r#".route("{axum_route}", {method}({module_import}::{method}_tuono_internal_api))"# + )); + } } } } + + route_declarations } - route_declarations -} + fn create_modules_declaration(&self) -> String { + let routes = &self.app.route_map; + let mut route_declarations = String::from("// MODULE_IMPORTS\n"); -fn create_modules_declaration(routes: &HashMap) -> String { - let mut route_declarations = String::from("// MODULE_IMPORTS\n"); + for (path, route) in routes.iter() { + if route.axum_info.is_some() { + let AxumInfo { module_import, .. } = route.axum_info.as_ref().unwrap(); - for (path, route) in routes.iter() { - if route.axum_info.is_some() { - let AxumInfo { module_import, .. } = route.axum_info.as_ref().unwrap(); - - route_declarations.push_str(&format!( - r#"#[path="../{ROUTE_FOLDER}{path}.rs"] + route_declarations.push_str(&format!( + r#"#[path="../{ROUTE_FOLDER}{path}.rs"] mod {module_import}; "# - )) + )) + } } + + route_declarations } - route_declarations -} - -fn create_html_fallback(app: &App) -> String { - if let Some(config) = app.config.as_ref() { - if let Some(origin) = &config.server.origin { - FALLBACK_HTML.replace("[BASE_URL]", origin) + fn build_html_fallback(&self) -> String { + if let Some(config) = &self.app.config.as_ref() { + if let Some(origin) = &config.server.origin { + FALLBACK_HTML.replace("[BASE_URL]", origin) + } else { + let url = format!("http://{}:{}", config.server.host, config.server.port); + FALLBACK_HTML.replace("[BASE_URL]", url.as_str()) + } } else { - let url = format!("http://{}:{}", config.server.host, config.server.port); - FALLBACK_HTML.replace("[BASE_URL]", url.as_str()) + "".to_string() } - } else { - "".to_string() } } -pub fn create_client_entry_files() -> io::Result<()> { - let dev_folder = Path::new(DEV_FOLDER); - - let mut server_entry = fs::File::create(dev_folder.join("server-main.tsx"))?; - let mut client_entry = fs::File::create(dev_folder.join("client-main.tsx"))?; - - server_entry.write_all(SERVER_ENTRY_DATA.as_bytes())?; - client_entry.write_all(CLIENT_ENTRY_DATA.as_bytes())?; - - Ok(()) -} - #[cfg(test)] mod tests { @@ -358,7 +296,13 @@ mod tests { let mut app = App::new(); app.config = Some(Default::default()); - let fallback_html = create_html_fallback(&app); + let source_builder = SourceBuilder { + app, + mode: Mode::Dev, + base_path: PathBuf::new(), + }; + + let fallback_html = source_builder.build_html_fallback(); assert!(fallback_html.contains("http://localhost:3000/vite-server/@react-refresh")); assert!(fallback_html.contains("http://localhost:3000/vite-server/@vite/client")); diff --git a/crates/tuono/templates/client.ts b/crates/tuono/templates/client.ts new file mode 100644 index 00000000..b1bc7049 --- /dev/null +++ b/crates/tuono/templates/client.ts @@ -0,0 +1,9 @@ +// File automatically generated by tuono +// Do not manually update this file +import 'vite/modulepreload-polyfill' +import { hydrate } from 'tuono/hydration' + +// Import the generated route tree +import { routeTree } from './routeTree.gen' + +hydrate(routeTree) diff --git a/crates/tuono/templates/fallback.html b/crates/tuono/templates/fallback.html new file mode 100644 index 00000000..2bda889d --- /dev/null +++ b/crates/tuono/templates/fallback.html @@ -0,0 +1,19 @@ + + + + + + + + + + + diff --git a/crates/tuono/templates/server.rs b/crates/tuono/templates/server.rs new file mode 100644 index 00000000..832291f9 --- /dev/null +++ b/crates/tuono/templates/server.rs @@ -0,0 +1,29 @@ +// File automatically generated +// Do not manually change it + +use tuono_lib::{tokio, Mode, Server, axum::Router, tuono_internal_init_v8_platform}; +// AXUM_GET_ROUTE_HANDLER + +const MODE: Mode = /*MODE*/; + +// MODULE_IMPORTS + +//MAIN_FILE_IMPORT// + +#[tokio::main] +async fn main() { + tuono_internal_init_v8_platform(); + + if MODE == Mode::Prod { + println!("\n ⚡ Tuono v/*VERSION*/"); + } + + //MAIN_FILE_DEFINITION// + + let router = Router::new() + // ROUTE_BUILDER + //MAIN_FILE_USAGE//; + + Server::init(router, MODE).await.start().await +} + diff --git a/crates/tuono/templates/server.ts b/crates/tuono/templates/server.ts new file mode 100644 index 00000000..8d7b985d --- /dev/null +++ b/crates/tuono/templates/server.ts @@ -0,0 +1,7 @@ +// File automatically generated by tuono +// Do not manually update this file +import { serverSideRendering } from 'tuono/ssr' + +import { routeTree } from './routeTree.gen' + +export const renderFn = serverSideRendering(routeTree) diff --git a/crates/tuono_internal/Cargo.toml b/crates/tuono_internal/Cargo.toml index 9a3475c8..2abb93f1 100644 --- a/crates/tuono_internal/Cargo.toml +++ b/crates/tuono_internal/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tuono_internal" -version = "0.19.0" +version = "0.19.2" edition = "2024" authors = ["V. Ageno "] description = "Superfast React fullstack framework" diff --git a/crates/tuono_internal/src/lib.rs b/crates/tuono_internal/src/lib.rs index ef68c369..32a25e93 100644 --- a/crates/tuono_internal/src/lib.rs +++ b/crates/tuono_internal/src/lib.rs @@ -1 +1,2 @@ pub mod config; +pub mod tuono_println; diff --git a/crates/tuono_internal/src/tuono_println.rs b/crates/tuono_internal/src/tuono_println.rs new file mode 100644 index 00000000..a49346e4 --- /dev/null +++ b/crates/tuono_internal/src/tuono_println.rs @@ -0,0 +1,11 @@ +#[macro_export] +/// Log a message in the terminal using the custom tuono formatter. +/// The messages printed with this macro should inform or +/// guide the user. +/// +/// The debug/error messages should be printed using the `tracing` crate +macro_rules! tuono_println { + ($($arg:tt)*) => {{ + println!(" {}", format!($($arg)*)); + }}; +} diff --git a/crates/tuono_lib/Cargo.toml b/crates/tuono_lib/Cargo.toml index 76abcf8f..0c42219d 100644 --- a/crates/tuono_lib/Cargo.toml +++ b/crates/tuono_lib/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tuono_lib" -version = "0.19.0" +version = "0.19.2" edition = "2024" authors = ["V. Ageno "] description = "Superfast React fullstack framework" @@ -30,10 +30,10 @@ once_cell = "1.19.0" regex = "1.10.5" either = "1.13.0" tower-http = {version = "0.6.0", features = ["fs"]} -colored = "2.1.0" +colored = "3.0.0" -tuono_lib_macros = {path = "../tuono_lib_macros", version = "0.19.0"} -tuono_internal = {path = "../tuono_internal", version = "0.19.0"} +tuono_lib_macros = {path = "../tuono_lib_macros", version = "0.19.2"} +tuono_internal = {path = "../tuono_internal", version = "0.19.2"} # Match the same version used by axum tokio-tungstenite = "0.26.0" futures-util = { version = "0.3", default-features = false, features = ["sink", "std"] } diff --git a/crates/tuono_lib/src/request.rs b/crates/tuono_lib/src/request.rs index 9247add0..762652cf 100644 --- a/crates/tuono_lib/src/request.rs +++ b/crates/tuono_lib/src/request.rs @@ -1,8 +1,8 @@ +use axum::http::{HeaderMap, Uri}; +use serde::de::DeserializeOwned; use serde::{Deserialize, Serialize}; use std::collections::HashMap; -use axum::http::{HeaderMap, Uri}; - /// Location must match client side interface #[derive(Serialize, Debug)] pub struct Location { @@ -70,12 +70,40 @@ impl Request { "Failed to read body", ))) } + + pub fn form_data(&self) -> Result + where + T: DeserializeOwned, + { + let content_type = self + .headers + .get("content-type") + .and_then(|v| v.to_str().ok()) + .unwrap_or(""); + + if !content_type.contains("application/x-www-form-urlencoded") { + return Err(BodyParseError::ContentType( + "Invalid content type, expected application/x-www-form-urlencoded".to_string(), + )); + } + + let body = self.body.as_ref().ok_or_else(|| { + BodyParseError::Io(std::io::Error::new( + std::io::ErrorKind::InvalidData, + "Missing request body", + )) + })?; + + serde_urlencoded::from_bytes::(body).map_err(BodyParseError::UrlEncoded) + } } #[derive(Debug)] pub enum BodyParseError { Io(std::io::Error), Serde(serde_json::Error), + UrlEncoded(serde_urlencoded::de::Error), + ContentType(String), } impl From for BodyParseError { @@ -95,6 +123,12 @@ mod tests { field2: String, } + #[derive(Debug, Deserialize)] + struct FormData { + name: String, + email: Option, + } + #[test] fn it_correctly_parse_the_body() { let request = Request::new( @@ -123,4 +157,70 @@ mod tests { assert!(body.is_err()); } + + #[test] + fn it_correctly_parses_form_data() { + let mut request = Request::new( + Uri::from_static("http://localhost:3000"), + HeaderMap::new(), + HashMap::new(), + None, + ); + + request.headers.insert( + "content-type", + "application/x-www-form-urlencoded".parse().unwrap(), + ); + + request.body = Some("name=John+Doe&email=john%40example.com".as_bytes().to_vec()); + + let form_data: Result = request.form_data(); + + assert!(form_data.is_ok()); + let data = form_data.unwrap(); + assert_eq!(data.name, "John Doe"); + assert_eq!(data.email, Some("john@example.com".to_string())); + } + + #[test] + fn it_rejects_wrong_form_content_type() { + let mut request = Request::new( + Uri::from_static("http://localhost:3000"), + HeaderMap::new(), + HashMap::new(), + None, + ); + + request + .headers + .insert("content-type", "application/json".parse().unwrap()); + + request.headers.insert( + "body", + "name=John+Doe&email=john%40example.com".parse().unwrap(), + ); + + let form_data: Result = request.form_data(); + + assert!(form_data.is_err()); + } + + #[test] + fn it_handles_missing_form_body() { + let mut request = Request::new( + Uri::from_static("http://localhost:3000"), + HeaderMap::new(), + HashMap::new(), + None, + ); + + request.headers.insert( + "content-type", + "application/x-www-form-urlencoded".parse().unwrap(), + ); + + let form_data: Result = request.form_data(); + + assert!(form_data.is_err()); + } } diff --git a/crates/tuono_lib/src/server.rs b/crates/tuono_lib/src/server.rs index c011b5a3..48a425f6 100644 --- a/crates/tuono_lib/src/server.rs +++ b/crates/tuono_lib/src/server.rs @@ -6,6 +6,7 @@ use colored::Colorize; use ssr_rs::Ssr; use tower_http::services::ServeDir; use tuono_internal::config::Config; +use tuono_internal::tuono_println; use crate::env::load_env_vars; use crate::vite::{vite_reverse_proxy, vite_websocket_proxy}; @@ -29,23 +30,19 @@ pub struct Server { impl Server { fn display_start_message(&self) { - /* - * Format the server address as a valid URL so that it becomes clickable in the CLI - * @see https://github.com/tuono-labs/tuono/issues/460 - */ + // Format the server address as a valid URL so that it becomes clickable in the CLI + // @see https://github.com/tuono-labs/tuono/issues/460 let server_base_url = format!("http://{}", self.address); - if self.mode == Mode::Dev { - println!(" Ready at: {}\n", server_base_url.blue().bold()); + // In order to avoid multiple logs on `tuono dev` + // the server address prompt for tuono dev is made on the CLI process + if self.mode == Mode::Prod { + tuono_println!("Production server at: {}\n", server_base_url.blue().bold()); + if let Some(origin) = &self.origin { + tuono_println!("Origin: {}\n", origin.blue().bold()); + } } else { - println!( - " Production server at: {}\n", - server_base_url.blue().bold() - ); - } - - if let Some(origin) = &self.origin { - println!(" Origin: {}\n", origin.blue().bold()); + tuono_println!("Ready\n"); } } diff --git a/crates/tuono_lib/tests/server_test.rs b/crates/tuono_lib/tests/server_test.rs index d1319973..81c43634 100644 --- a/crates/tuono_lib/tests/server_test.rs +++ b/crates/tuono_lib/tests/server_test.rs @@ -1,4 +1,6 @@ mod utils; +use std::collections::HashMap; + use crate::utils::mock_server::MockTuonoServer; use serial_test::serial; @@ -194,3 +196,30 @@ async fn it_parses_the_http_body() { assert!(response.status().is_success()); assert_eq!(response.text().await.unwrap(), "payload"); } + +#[tokio::test] +#[serial] +async fn it_parses_the_form_encoded_url() { + let app = MockTuonoServer::spawn().await; + + let client = reqwest::Client::builder() + .redirect(reqwest::redirect::Policy::none()) + .build() + .unwrap(); + + let server_url = format!("http://{}:{}", &app.address, &app.port); + + let mut form_params = HashMap::new(); + form_params.insert("data", "payload"); + + let response = client + .post(format!("{server_url}/api/form_data")) + .header("content-type", "application/x-www-form-urlencoded") + .form(&form_params) + .send() + .await + .expect("Failed to execute request."); + + assert!(response.status().is_success()); + assert_eq!(response.text().await.unwrap(), "payload"); +} diff --git a/crates/tuono_lib/tests/utils/form_data.rs b/crates/tuono_lib/tests/utils/form_data.rs new file mode 100644 index 00000000..5485ba2b --- /dev/null +++ b/crates/tuono_lib/tests/utils/form_data.rs @@ -0,0 +1,13 @@ +use serde::Deserialize; +use tuono_lib::Request; + +#[derive(Deserialize)] +struct Payload { + data: String, +} + +#[tuono_lib::api(POST)] +async fn form_data(req: Request) -> String { + let form = req.form_data::().unwrap(); + form.data +} diff --git a/crates/tuono_lib/tests/utils/mock_server.rs b/crates/tuono_lib/tests/utils/mock_server.rs index 674f1e27..15e16db7 100644 --- a/crates/tuono_lib/tests/utils/mock_server.rs +++ b/crates/tuono_lib/tests/utils/mock_server.rs @@ -10,6 +10,7 @@ use tuono_lib::{Mode, Server, axum::Router, tuono_internal_init_v8_platform}; use crate::utils::catch_all::get_tuono_internal_api as catch_all; use crate::utils::dynamic_parameter::get_tuono_internal_api as dynamic_parameter; use crate::utils::env::get_tuono_internal_api as test_env; +use crate::utils::form_data::post_tuono_internal_api as form_data_api; use crate::utils::health_check::get_tuono_internal_api as health_check; use crate::utils::post_api::post_tuono_internal_api as post_api; use crate::utils::route as html_route; @@ -86,6 +87,7 @@ impl MockTuonoServer { .route("/catch_all/{*catch_all}", get(catch_all)) .route("/dynamic/{parameter}", get(dynamic_parameter)) .route("/api/post", post(post_api)) + .route("/api/form_data", post(form_data_api)) .route("/env", get(test_env)); let server = Server::init(router, Mode::Prod).await; diff --git a/crates/tuono_lib/tests/utils/mod.rs b/crates/tuono_lib/tests/utils/mod.rs index a12fd7e0..855cfbd4 100644 --- a/crates/tuono_lib/tests/utils/mod.rs +++ b/crates/tuono_lib/tests/utils/mod.rs @@ -1,6 +1,7 @@ pub mod catch_all; pub mod dynamic_parameter; pub mod env; +pub mod form_data; pub mod health_check; pub mod mock_server; pub mod post_api; diff --git a/crates/tuono_lib_macros/Cargo.toml b/crates/tuono_lib_macros/Cargo.toml index a1f19b5d..f8aa49b0 100644 --- a/crates/tuono_lib_macros/Cargo.toml +++ b/crates/tuono_lib_macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tuono_lib_macros" -version = "0.19.0" +version = "0.19.2" edition = "2024" description = "Superfast React fullstack framework" homepage = "https://tuono.dev" diff --git a/devtools/vite-config/package.json b/devtools/vite-config/package.json index 604281d6..8d853ea8 100644 --- a/devtools/vite-config/package.json +++ b/devtools/vite-config/package.json @@ -15,10 +15,10 @@ "types": "tsc --noEmit" }, "devDependencies": { - "oxc-transform": "0.61.2", + "oxc-transform": "0.62.0", "rollup-plugin-preserve-directives": "0.4.0", - "unplugin-isolated-decl": "0.11.2", - "vite": "6.1.2", + "unplugin-isolated-decl": "0.13.6", + "vite": "6.1.3", "vite-plugin-externalize-deps": "0.9.0" } } diff --git a/examples/tuono-app/src/routes/__layout.tsx b/examples/tuono-app/src/routes/__layout.tsx index 38172cef..62a5a79a 100644 --- a/examples/tuono-app/src/routes/__layout.tsx +++ b/examples/tuono-app/src/routes/__layout.tsx @@ -1,13 +1,12 @@ -import type { ReactNode, JSX } from 'react' +import type { JSX } from 'react' import { TuonoScripts } from 'tuono' +import type { TuonoLayoutProps } from 'tuono' import '../styles/global.css' -interface RootLayoutProps { - children: ReactNode -} - -export default function RootLayout({ children }: RootLayoutProps): JSX.Element { +export default function RootLayout({ + children, +}: TuonoLayoutProps): JSX.Element { return ( diff --git a/examples/tuono-tutorial/src/routes/__layout.tsx b/examples/tuono-tutorial/src/routes/__layout.tsx index 38172cef..62a5a79a 100644 --- a/examples/tuono-tutorial/src/routes/__layout.tsx +++ b/examples/tuono-tutorial/src/routes/__layout.tsx @@ -1,13 +1,12 @@ -import type { ReactNode, JSX } from 'react' +import type { JSX } from 'react' import { TuonoScripts } from 'tuono' +import type { TuonoLayoutProps } from 'tuono' import '../styles/global.css' -interface RootLayoutProps { - children: ReactNode -} - -export default function RootLayout({ children }: RootLayoutProps): JSX.Element { +export default function RootLayout({ + children, +}: TuonoLayoutProps): JSX.Element { return ( diff --git a/examples/with-mdx/src/routes/__layout.tsx b/examples/with-mdx/src/routes/__layout.tsx index 16c4f0ac..fe1c295d 100644 --- a/examples/with-mdx/src/routes/__layout.tsx +++ b/examples/with-mdx/src/routes/__layout.tsx @@ -1,14 +1,13 @@ -import type { ReactNode, JSX } from 'react' +import type { JSX } from 'react' import { MDXProvider } from '@mdx-js/react' import { TuonoScripts } from 'tuono' +import type { TuonoLayoutProps } from 'tuono' import '../styles/global.css' -interface RootLayoutProps { - children: ReactNode -} - -export default function RootLayout({ children }: RootLayoutProps): JSX.Element { +export default function RootLayout({ + children, +}: TuonoLayoutProps): JSX.Element { return ( diff --git a/examples/with-tailwind/src/routes/__layout.tsx b/examples/with-tailwind/src/routes/__layout.tsx index a15ffd5b..91fc31c7 100644 --- a/examples/with-tailwind/src/routes/__layout.tsx +++ b/examples/with-tailwind/src/routes/__layout.tsx @@ -1,13 +1,12 @@ -import type { ReactNode, JSX } from 'react' +import type { JSX } from 'react' import { TuonoScripts } from 'tuono' +import type { TuonoLayoutProps } from 'tuono' import '../styles/global.css' -interface RootLayoutProps { - children: ReactNode -} - -export default function RootLayout({ children }: RootLayoutProps): JSX.Element { +export default function RootLayout({ + children, +}: TuonoLayoutProps): JSX.Element { return ( diff --git a/package.json b/package.json index e940b0fb..d4ac097d 100644 --- a/package.json +++ b/package.json @@ -2,17 +2,17 @@ "name": "workspace", "private": true, "type": "module", - "packageManager": "pnpm@10.7.0+sha512.6b865ad4b62a1d9842b61d674a393903b871d9244954f652b8842c2b553c72176b278f64c463e52d40fff8aba385c235c8c9ecf5cc7de4fd78b8bb6d49633ab6", + "packageManager": "pnpm@10.7.1+sha512.2d92c86b7928dc8284f53494fb4201f983da65f0fb4f0d40baafa5cf628fa31dae3e5968f12466f17df7e97310e30f343a648baea1b9b350685dafafffdf5808", "scripts": { "dev": "turbo dev --filter=./devtools/* --filter=./packages/*", "build": "turbo build --filter=./devtools/* --filter=./packages/*", "lint": "turbo lint --filter=./devtools/* --filter=./packages/*", - "format:fix": "turbo format --filter=./devtools/* --filter=./packages/*", + "format:fix": "turbo format:fix --filter=./devtools/* --filter=./packages/*", "format": "turbo format --filter=./devtools/* --filter=./packages/*", "typecheck": "turbo typecheck --filter=./devtools/* --filter=./packages/*", "test": "turbo test --filter=./devtools/* --filter=./packages/*", "test:watch": "turbo test:watch --filter=./devtools/* --filter=./packages/*", - "test:e2e": "pnpm --filter='fixture-*' run test:e2e", + "test:e2e": "pnpm --filter \"./e2e/fixtures/*\" run test:e2e", "examples:format": "prettier ./examples/** --check", "examples:format:fix": "prettier ./examples/** --write", "examples:typecheck": "pnpm --filter \"./examples/*\" exec tsc --noEmit", @@ -25,18 +25,18 @@ "author": "Valerio Ageno", "license": "MIT", "devDependencies": { - "@eslint/js": "9.20.0", + "@eslint/js": "9.24.0", "@playwright/test": "1.51.1", - "@types/node": "22.13.13", - "@vitest/eslint-plugin": "1.1.36", - "eslint": "9.20.0", - "eslint-import-resolver-typescript": "3.7.0", + "@types/node": "22.14.0", + "@vitest/eslint-plugin": "1.1.39", + "eslint": "9.24.0", + "eslint-import-resolver-typescript": "4.3.2", "eslint-plugin-import": "2.31.0", - "eslint-plugin-react": "7.37.4", - "eslint-plugin-react-hooks": "5.1.0", + "eslint-plugin-react": "7.37.5", + "eslint-plugin-react-hooks": "5.2.0", "prettier": "3.5.3", - "turbo": "2.4.4", + "turbo": "2.5.0", "typescript": "5.7.3", - "typescript-eslint": "8.24.0" + "typescript-eslint": "8.29.0" } } diff --git a/packages/tuono-fs-router-vite-plugin/package.json b/packages/tuono-fs-router-vite-plugin/package.json index 4d148b2e..3f170044 100644 --- a/packages/tuono-fs-router-vite-plugin/package.json +++ b/packages/tuono-fs-router-vite-plugin/package.json @@ -1,6 +1,6 @@ { "name": "tuono-fs-router-vite-plugin", - "version": "0.19.0", + "version": "0.19.2", "description": "Plugin for the tuono's file system router. Tuono is the react/rust fullstack framework", "homepage": "https://tuono.dev", "scripts": { @@ -46,6 +46,6 @@ "devDependencies": { "@types/babel__core": "7.20.5", "vite-config": "workspace:*", - "vitest": "3.0.9" + "vitest": "3.1.1" } } diff --git a/packages/tuono-router/package.json b/packages/tuono-router/package.json index 9fd44313..ef3068ef 100644 --- a/packages/tuono-router/package.json +++ b/packages/tuono-router/package.json @@ -1,6 +1,6 @@ { "name": "tuono-router", - "version": "0.19.0", + "version": "0.19.2", "description": "React routing component for the framework tuono. Tuono is the react/rust fullstack framework", "homepage": "https://tuono.dev", "scripts": { @@ -44,13 +44,13 @@ "react-intersection-observer": "^9.13.0" }, "devDependencies": { - "@testing-library/react": "16.2.0", - "@types/react": "19.0.10", - "@vitejs/plugin-react-swc": "3.8.0", + "@testing-library/react": "16.3.0", + "@types/react": "19.1.0", + "@vitejs/plugin-react-swc": "3.8.1", "happy-dom": "17.4.4", - "react": "19.0.0", - "vite": "6.1.2", + "react": "19.1.0", + "vite": "6.1.3", "vite-config": "workspace:*", - "vitest": "3.0.9" + "vitest": "3.1.1" } } diff --git a/packages/tuono/package.json b/packages/tuono/package.json index a206cbba..b5a428cf 100644 --- a/packages/tuono/package.json +++ b/packages/tuono/package.json @@ -1,6 +1,6 @@ { "name": "tuono", - "version": "0.19.0", + "version": "0.19.2", "description": "Superfast React fullstack framework", "homepage": "https://tuono.dev", "scripts": { @@ -79,14 +79,14 @@ }, "devDependencies": { "@types/babel__core": "7.20.5", - "@types/babel__traverse": "7.20.6", - "@types/node": "22.13.13", - "@types/react": "19.0.10", - "@types/react-dom": "19.0.4", - "react": "19.0.0", - "react-dom": "19.0.0", + "@types/babel__traverse": "7.20.7", + "@types/node": "22.14.0", + "@types/react": "19.1.0", + "@types/react-dom": "19.1.1", + "react": "19.1.0", + "react-dom": "19.1.0", "vite-config": "workspace:*", - "vitest": "3.0.9" + "vitest": "3.1.1" }, "sideEffects": false, "keywords": [ diff --git a/packages/tuono/src/build/types.ts b/packages/tuono/src/build/types.ts index a4187588..8733abf2 100644 --- a/packages/tuono/src/build/types.ts +++ b/packages/tuono/src/build/types.ts @@ -1,5 +1,5 @@ -import type { TuonoConfig } from '../config' +import type { TuonoConfig, TuonoConfigServer } from '../config' export interface InternalTuonoConfig extends Omit { - server: Required> + server: TuonoConfigServer } diff --git a/packages/tuono/src/config/index.ts b/packages/tuono/src/config/index.ts index b7c6b20d..61f6efe8 100644 --- a/packages/tuono/src/config/index.ts +++ b/packages/tuono/src/config/index.ts @@ -1 +1 @@ -export type { TuonoConfig } from './types' +export type { TuonoConfig, TuonoConfigServer } from './types' diff --git a/packages/tuono/src/config/types.ts b/packages/tuono/src/config/types.ts index 43941f83..d5e62079 100644 --- a/packages/tuono/src/config/types.ts +++ b/packages/tuono/src/config/types.ts @@ -5,15 +5,17 @@ import type { CSSOptions, } from 'vite' +export interface TuonoConfigServer { + host: string + origin: string | null + port: number +} + /** * @see http://tuono.dev/documentation/configuration */ export interface TuonoConfig { - server?: { - host?: string - origin?: string | null - port?: number - } + server?: Partial vite?: { alias?: AliasOptions css?: CSSOptions diff --git a/packages/tuono/src/index.ts b/packages/tuono/src/index.ts index ca9022b8..51c73e9a 100644 --- a/packages/tuono/src/index.ts +++ b/packages/tuono/src/index.ts @@ -13,4 +13,4 @@ export { export { TuonoScripts } from './shared/TuonoScripts' -export type { TuonoRouteProps } from './types' +export type { TuonoRouteProps, TuonoLayoutProps } from './types' diff --git a/packages/tuono/src/shared/DevResources.tsx b/packages/tuono/src/shared/DevResources.tsx index 7808d52e..50697143 100644 --- a/packages/tuono/src/shared/DevResources.tsx +++ b/packages/tuono/src/shared/DevResources.tsx @@ -1,12 +1,17 @@ import type { JSX } from 'react' -import { useTuonoContextServerPayload } from './TuonoContext' +import type { TuonoConfigServer } from '../config' const VITE_PROXY_PATH = '/vite-server' const DEFAULT_SERVER_CONFIG = { host: 'localhost', origin: null, port: 3000 } -export const DevResources = (): JSX.Element => { - const { devServerConfig } = useTuonoContextServerPayload() +interface DevResourcesProps { + devServerConfig?: TuonoConfigServer +} + +export const DevResources = ({ + devServerConfig, +}: DevResourcesProps): JSX.Element => { const { host, origin, port } = devServerConfig ?? DEFAULT_SERVER_CONFIG const viteBaseUrl = diff --git a/packages/tuono/src/shared/ProdResources.tsx b/packages/tuono/src/shared/ProdResources.tsx index c28e2976..79900452 100644 --- a/packages/tuono/src/shared/ProdResources.tsx +++ b/packages/tuono/src/shared/ProdResources.tsx @@ -1,10 +1,14 @@ import type { JSX } from 'react' -import { useTuonoContextServerPayload } from './TuonoContext' - -export const ProdResources = (): JSX.Element => { - const { cssBundles, jsBundles } = useTuonoContextServerPayload() +interface ProdResourcesProps { + jsBundles: Array | null + cssBundles: Array | null +} +export const ProdResources = ({ + cssBundles, + jsBundles, +}: ProdResourcesProps): JSX.Element => { return ( <> {cssBundles?.map((cssHref) => ( diff --git a/packages/tuono/src/shared/TuonoScripts.tsx b/packages/tuono/src/shared/TuonoScripts.tsx index 0e10c571..9e0dfb47 100644 --- a/packages/tuono/src/shared/TuonoScripts.tsx +++ b/packages/tuono/src/shared/TuonoScripts.tsx @@ -12,8 +12,15 @@ export function TuonoScripts(): JSX.Element { return ( <> - {serverPayload.mode === 'Dev' && } - {serverPayload.mode === 'Prod' && } + {serverPayload.mode === 'Dev' && ( + + )} + {serverPayload.mode === 'Prod' && ( + + )} ) } diff --git a/packages/tuono/src/types.ts b/packages/tuono/src/types.ts index 6177d14b..dca6021a 100644 --- a/packages/tuono/src/types.ts +++ b/packages/tuono/src/types.ts @@ -1,3 +1,7 @@ +import type { ReactNode } from 'react' + +import type { TuonoConfigServer } from './config' + /** * Provided by the rust server and used in the ssr env * @see tuono-router {@link ServerInitialLocation} @@ -11,27 +15,11 @@ export interface ServerPayloadLocation { /** * @see crates/tuono_lib/src/payload.rs */ -export interface ServerPayload { - mode: 'Prod' | 'Dev' - +export type ServerPayload = { location: ServerPayloadLocation data: TData - - /** Available only on 'Prod' mode */ - jsBundles: Array | null - cssBundles: Array | null - - /** Available only on 'Dev' mode */ - devServerConfig?: { - port: number - origin: string | null - host: string - } -} - -/* the above type could be refined with an union like this -( +} & ( | { mode: 'Prod' jsBundles: Array @@ -39,13 +27,9 @@ export interface ServerPayload { } | { mode: 'Dev' - devServerConfig: { - port: number - host: string - } + devServerConfig?: TuonoConfigServer } ) -*/ export type TuonoRouteProps = | { @@ -56,3 +40,7 @@ export type TuonoRouteProps = data: TData isLoading: false } + +export interface TuonoLayoutProps { + children: ReactNode +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bd274f92..e5394c41 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,81 +9,81 @@ importers: .: devDependencies: '@eslint/js': - specifier: 9.20.0 - version: 9.20.0 + specifier: 9.24.0 + version: 9.24.0 '@playwright/test': specifier: 1.51.1 version: 1.51.1 '@types/node': - specifier: 22.13.13 - version: 22.13.13 + specifier: 22.14.0 + version: 22.14.0 '@vitest/eslint-plugin': - specifier: 1.1.36 - version: 1.1.36(@typescript-eslint/utils@8.24.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3)(vitest@3.0.9(@types/debug@4.1.12)(@types/node@22.13.13)(happy-dom@17.4.4)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3))) + specifier: 1.1.39 + version: 1.1.39(@typescript-eslint/utils@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3)(vitest@3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(happy-dom@17.4.4)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3))) eslint: - specifier: 9.20.0 - version: 9.20.0(jiti@2.4.2) + specifier: 9.24.0 + version: 9.24.0(jiti@2.4.2) eslint-import-resolver-typescript: - specifier: 3.7.0 - version: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.20.0(jiti@2.4.2)) + specifier: 4.3.2 + version: 4.3.2(eslint-plugin-import@2.31.0)(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-import: specifier: 2.31.0 - version: 2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.20.0(jiti@2.4.2)) + version: 2.31.0(@typescript-eslint/parser@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@4.3.2)(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-react: - specifier: 7.37.4 - version: 7.37.4(eslint@9.20.0(jiti@2.4.2)) + specifier: 7.37.5 + version: 7.37.5(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-react-hooks: - specifier: 5.1.0 - version: 5.1.0(eslint@9.20.0(jiti@2.4.2)) + specifier: 5.2.0 + version: 5.2.0(eslint@9.24.0(jiti@2.4.2)) prettier: specifier: 3.5.3 version: 3.5.3 turbo: - specifier: 2.4.4 - version: 2.4.4 + specifier: 2.5.0 + version: 2.5.0 typescript: specifier: 5.7.3 version: 5.7.3 typescript-eslint: - specifier: 8.24.0 - version: 8.24.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) + specifier: 8.29.0 + version: 8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) devtools/vite-config: devDependencies: oxc-transform: - specifier: 0.61.2 - version: 0.61.2 + specifier: 0.62.0 + version: 0.62.0 rollup-plugin-preserve-directives: specifier: 0.4.0 - version: 0.4.0(rollup@4.37.0) + version: 0.4.0(rollup@4.38.0) unplugin-isolated-decl: - specifier: 0.11.2 - version: 0.11.2(@swc/core@1.10.18)(oxc-transform@0.61.2)(typescript@5.8.2) + specifier: 0.13.6 + version: 0.13.6(@swc/core@1.11.16)(typescript@5.8.3) vite: - specifier: 6.1.2 - version: 6.1.2(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) + specifier: 6.1.3 + version: 6.1.3(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) vite-plugin-externalize-deps: specifier: 0.9.0 - version: 0.9.0(vite@6.1.2(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3))) + version: 0.9.0(vite@6.1.3(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3))) e2e/fixtures/base: dependencies: react: specifier: ^19.0.0 - version: 19.0.0 + version: 19.1.0 react-dom: specifier: ^19.0.0 - version: 19.0.0(react@19.0.0) + version: 19.1.0(react@19.1.0) tuono: specifier: workspace:* version: link:../../../packages/tuono devDependencies: '@types/react': specifier: ^19.0.2 - version: 19.0.10 + version: 19.1.0 '@types/react-dom': specifier: ^19.0.2 - version: 19.0.4(@types/react@19.0.10) + version: 19.1.1(@types/react@19.1.0) typescript: specifier: ^5.6.3 version: 5.7.3 @@ -92,20 +92,20 @@ importers: dependencies: react: specifier: ^19.0.0 - version: 19.0.0 + version: 19.1.0 react-dom: specifier: ^19.0.0 - version: 19.0.0(react@19.0.0) + version: 19.1.0(react@19.1.0) tuono: specifier: link:../../packages/tuono version: link:../../packages/tuono devDependencies: '@types/react': specifier: ^19.0.2 - version: 19.0.10 + version: 19.1.0 '@types/react-dom': specifier: ^19.0.2 - version: 19.0.4(@types/react@19.0.10) + version: 19.1.1(@types/react@19.1.0) typescript: specifier: ^5.6.3 version: 5.7.3 @@ -114,20 +114,20 @@ importers: dependencies: react: specifier: ^19.0.0 - version: 19.0.0 + version: 19.1.0 react-dom: specifier: ^19.0.0 - version: 19.0.0(react@19.0.0) + version: 19.1.0(react@19.1.0) tuono: specifier: link:../../packages/tuono version: link:../../packages/tuono devDependencies: '@types/react': specifier: ^19.0.2 - version: 19.0.10 + version: 19.1.0 '@types/react-dom': specifier: ^19.0.2 - version: 19.0.4(@types/react@19.0.10) + version: 19.1.1(@types/react@19.1.0) typescript: specifier: ^5.6.3 version: 5.7.3 @@ -136,26 +136,26 @@ importers: dependencies: '@mdx-js/react': specifier: ^3.1.0 - version: 3.1.0(@types/react@19.0.10)(react@19.0.0) + version: 3.1.0(@types/react@19.1.0)(react@19.1.0) react: specifier: ^19.0.0 - version: 19.0.0 + version: 19.1.0 react-dom: specifier: ^19.0.0 - version: 19.0.0(react@19.0.0) + version: 19.1.0(react@19.1.0) tuono: specifier: link:../../packages/tuono version: link:../../packages/tuono devDependencies: '@mdx-js/rollup': specifier: ^3.1.0 - version: 3.1.0(acorn@8.14.0)(rollup@4.37.0) + version: 3.1.0(acorn@8.14.1)(rollup@4.38.0) '@types/react': specifier: ^19.0.2 - version: 19.0.10 + version: 19.1.0 '@types/react-dom': specifier: ^19.0.2 - version: 19.0.4(@types/react@19.0.10) + version: 19.1.1(@types/react@19.1.0) typescript: specifier: ^5.6.3 version: 5.7.3 @@ -164,13 +164,13 @@ importers: dependencies: '@tailwindcss/vite': specifier: ^4.0.6 - version: 4.0.6(vite@6.1.2(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3))) + version: 4.0.6(vite@6.1.3(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3))) react: specifier: ^19.0.0 - version: 19.0.0 + version: 19.1.0 react-dom: specifier: ^19.0.0 - version: 19.0.0(react@19.0.0) + version: 19.1.0(react@19.1.0) tailwindcss: specifier: ^4.0.6 version: 4.0.6 @@ -180,10 +180,10 @@ importers: devDependencies: '@types/react': specifier: ^19.0.2 - version: 19.0.10 + version: 19.1.0 '@types/react-dom': specifier: ^19.0.2 - version: 19.0.4(@types/react@19.0.10) + version: 19.1.1(@types/react@19.1.0) typescript: specifier: ^5.6.3 version: 5.7.3 @@ -201,10 +201,10 @@ importers: version: 7.25.9(@babel/core@7.26.0) '@rollup/plugin-inject': specifier: ^5.0.5 - version: 5.0.5(rollup@4.37.0) + version: 5.0.5(rollup@4.38.0) '@vitejs/plugin-react-swc': specifier: ^3.8.0 - version: 3.8.0(vite@6.1.2(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3))) + version: 3.8.1(vite@6.1.3(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3))) fast-text-encoding: specifier: ^1.0.6 version: 1.0.6 @@ -219,7 +219,7 @@ importers: version: 8.2.5 vite: specifier: ^6.1.1 - version: 6.1.2(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) + version: 6.1.3(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) web-streams-polyfill: specifier: ^4.0.0 version: 4.0.0 @@ -228,29 +228,29 @@ importers: specifier: 7.20.5 version: 7.20.5 '@types/babel__traverse': - specifier: 7.20.6 - version: 7.20.6 + specifier: 7.20.7 + version: 7.20.7 '@types/node': - specifier: 22.13.13 - version: 22.13.13 + specifier: 22.14.0 + version: 22.14.0 '@types/react': - specifier: 19.0.10 - version: 19.0.10 + specifier: 19.1.0 + version: 19.1.0 '@types/react-dom': - specifier: 19.0.4 - version: 19.0.4(@types/react@19.0.10) + specifier: 19.1.1 + version: 19.1.1(@types/react@19.1.0) react: - specifier: 19.0.0 - version: 19.0.0 + specifier: 19.1.0 + version: 19.1.0 react-dom: - specifier: 19.0.0 - version: 19.0.0(react@19.0.0) + specifier: 19.1.0 + version: 19.1.0(react@19.1.0) vite-config: specifier: workspace:* version: link:../../devtools/vite-config vitest: - specifier: 3.0.9 - version: 3.0.9(@types/debug@4.1.12)(@types/node@22.13.13)(happy-dom@17.4.4)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) + specifier: 3.1.1 + version: 3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(happy-dom@17.4.4)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) packages/tuono-fs-router-vite-plugin: dependencies: @@ -265,7 +265,7 @@ importers: version: 3.5.3 vite: specifier: ^6.1.1 - version: 6.1.2(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) + version: 6.1.3(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) devDependencies: '@types/babel__core': specifier: 7.20.5 @@ -274,39 +274,39 @@ importers: specifier: workspace:* version: link:../../devtools/vite-config vitest: - specifier: 3.0.9 - version: 3.0.9(@types/debug@4.1.12)(@types/node@22.13.13)(happy-dom@17.4.4)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) + specifier: 3.1.1 + version: 3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(happy-dom@17.4.4)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) packages/tuono-router: dependencies: react-intersection-observer: specifier: ^9.13.0 - version: 9.16.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 9.16.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) devDependencies: '@testing-library/react': - specifier: 16.2.0 - version: 16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + specifier: 16.3.0 + version: 16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@types/react': - specifier: 19.0.10 - version: 19.0.10 + specifier: 19.1.0 + version: 19.1.0 '@vitejs/plugin-react-swc': - specifier: 3.8.0 - version: 3.8.0(vite@6.1.2(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3))) + specifier: 3.8.1 + version: 3.8.1(vite@6.1.3(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3))) happy-dom: specifier: 17.4.4 version: 17.4.4 react: - specifier: 19.0.0 - version: 19.0.0 + specifier: 19.1.0 + version: 19.1.0 vite: - specifier: 6.1.2 - version: 6.1.2(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) + specifier: 6.1.3 + version: 6.1.3(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) vite-config: specifier: workspace:* version: link:../../devtools/vite-config vitest: - specifier: 3.0.9 - version: 3.0.9(@types/debug@4.1.12)(@types/node@22.13.13)(happy-dom@17.4.4)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) + specifier: 3.1.1 + version: 3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(happy-dom@17.4.4)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) packages: @@ -397,11 +397,11 @@ packages: resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} engines: {node: '>=6.9.0'} - '@emnapi/core@1.3.1': - resolution: {integrity: sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==} + '@emnapi/core@1.4.0': + resolution: {integrity: sha512-H+N/FqT07NmLmt6OFFtDfwe8PNygprzBikrEMyQfgqSmT0vzE515Pz7R8izwB9q/zsH/MA64AKoul3sA6/CzVg==} - '@emnapi/runtime@1.3.1': - resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + '@emnapi/runtime@1.4.0': + resolution: {integrity: sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==} '@emnapi/wasi-threads@1.0.1': resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} @@ -566,32 +566,36 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.19.0': - resolution: {integrity: sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==} + '@eslint/config-array@0.20.0': + resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.10.0': - resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} + '@eslint/config-helpers@0.2.1': + resolution: {integrity: sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.11.0': - resolution: {integrity: sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==} + '@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.2.0': - resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + '@eslint/core@0.13.0': + resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.20.0': - resolution: {integrity: sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==} + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.4': - resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + '@eslint/js@9.24.0': + resolution: {integrity: sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.5': - resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.8': + resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanfs/core@0.19.1': @@ -610,8 +614,8 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.1': - resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'} '@jridgewell/gen-mapping@0.3.8': @@ -646,8 +650,8 @@ packages: peerDependencies: rollup: '>=2' - '@napi-rs/wasm-runtime@0.2.7': - resolution: {integrity: sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw==} + '@napi-rs/wasm-runtime@0.2.8': + resolution: {integrity: sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -661,108 +665,123 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nolyfill/is-core-module@1.0.39': - resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} - engines: {node: '>=12.4.0'} - - '@oxc-parser/binding-darwin-arm64@0.51.0': - resolution: {integrity: sha512-/e7+bNVVLm35qFToVjRzFpYpEXc6JYl2UOBGKwxmGovby8zWyeO+AlvX93JawVbk9+ht/VxJuXS27KHxsedqqw==} - cpu: [arm64] - os: [darwin] - - '@oxc-parser/binding-darwin-x64@0.51.0': - resolution: {integrity: sha512-xRV6ZBA/bBPriRtxC2c3rl1PNeKmXYfZtujwciNkLTaneOYzKuatYV1FHJFgSzLRod/oaEeSwn3q/uYd77vwYQ==} - cpu: [x64] - os: [darwin] - - '@oxc-parser/binding-linux-arm64-gnu@0.51.0': - resolution: {integrity: sha512-WgScqMulaLtNhtKRYsOrY8WI5Apt/wjuvpc/2axE5hdZBsvB5aDgaGig8MYPHHuQWPeH4ennizKrL3UMKZZpBA==} - cpu: [arm64] - os: [linux] - - '@oxc-parser/binding-linux-arm64-musl@0.51.0': - resolution: {integrity: sha512-Dt8JvLI53JsfJ3ewb1WNgarVfkCUA9kK39peJPNFrUZ0D3T+ja4Ibc/4eN9/sAr+iqRL/ocWxts8ZAqt4ntbCA==} - cpu: [arm64] - os: [linux] - - '@oxc-parser/binding-linux-x64-gnu@0.51.0': - resolution: {integrity: sha512-R6l1s51v119bsPETpcka1AE+lKoPI8NFzdUWFxv/cqc8jzRwpSVu4LsItKWdLFjiBGxj4D8NbsmOVm9G+QMofQ==} - cpu: [x64] - os: [linux] - - '@oxc-parser/binding-linux-x64-musl@0.51.0': - resolution: {integrity: sha512-Tu3L7MneVq6tm7x8oBB4Bvg74J6xhyU2b6vbaEK9CSHFmHssSfITs8aDxX/ZAboiXZe3fBYGqHT6gbcUfHxRGQ==} - cpu: [x64] - os: [linux] - - '@oxc-parser/binding-win32-arm64-msvc@0.51.0': - resolution: {integrity: sha512-VQJMqPUn6/qN8tNV54UW9m4125+gbmgtzOBCTAkuKjSRZ+efpSScWp6TNYX3A4ZzeBl/7N7TbxvXQYasbNj94A==} - cpu: [arm64] - os: [win32] - - '@oxc-parser/binding-win32-x64-msvc@0.51.0': - resolution: {integrity: sha512-60OTzCk9N8V6hJfBL/4EfeSmZUdrf6TuRRK6lpJcwIJJb/Y8G8vIBnKhkjo/CGJPJEuGOo1+oAJ/g+hdtiKTCQ==} - cpu: [x64] - os: [win32] - - '@oxc-project/types@0.51.0': - resolution: {integrity: sha512-rDHFQBU2lS0Fh1t1rgvSWK21OfgkzjIWqj+FKKRJueecgvdZ6hO+qqstwBy2v9lFhg2DPuaDdLyCXZNGwsKjMw==} - - '@oxc-transform/binding-darwin-arm64@0.61.2': - resolution: {integrity: sha512-iIfSuRCS3FA7bCUwXtSkG62ux+OW53DvugFCuV81MxbGm1laE0j5ZAOY3QHdNyTmPIXolGRQEsyRVqtItGNipw==} + '@oxc-parser/binding-darwin-arm64@0.62.0': + resolution: {integrity: sha512-p9haXzG2mE0PvfITKY3bTQpwDc+T4H9bG5SC4vp8PbwikmIWGrahASpuO5c2keiahspGTCzqUnl+8PXU/saT/A==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [darwin] - '@oxc-transform/binding-darwin-x64@0.61.2': - resolution: {integrity: sha512-oQ6xdMveATlerJM6Scz38vhlxjs3Rkwpfma/GItXZ46Gqm0SDMk6jJk9Wq3gmqfGUuFLEckzr0AmUzPH7EXQcg==} + '@oxc-parser/binding-darwin-x64@0.62.0': + resolution: {integrity: sha512-nUFVTz0DcQCtoHL/wiZ3fNPXRIdghDlExRqiEG00J7RprD3L8CtZ1hXwcWOqUNR1I/xWHQCu1ZrRlI30Wb+NCw==} engines: {node: '>=14.0.0'} cpu: [x64] os: [darwin] - '@oxc-transform/binding-linux-arm-gnueabihf@0.61.2': - resolution: {integrity: sha512-FJVk3+S59YPklf0mTYT2VlJ69L877dUMnaEalDsOjWkDraC7BBj+HGRzfTwvdtkHJIOiiUHI4Qf7LYSCscxbSA==} + '@oxc-parser/binding-linux-arm-gnueabihf@0.62.0': + resolution: {integrity: sha512-fzL/QklCwZRBkPvdr0zBtAFBnksd42xiBMlm0GQi2dIynCDz2IKrc+hq0UZMtqMEjuvr991WOlh0iU6elZDn6g==} engines: {node: '>=14.0.0'} cpu: [arm] os: [linux] - '@oxc-transform/binding-linux-arm64-gnu@0.61.2': - resolution: {integrity: sha512-6bCI6+qN42LUexGRO8bvTLypMgItjjMZmJEJ1nM83nMPeOZ4Ws/FvldNBjuLUHrdJawT3EdKLS8ouOmW+4NTYw==} + '@oxc-parser/binding-linux-arm64-gnu@0.62.0': + resolution: {integrity: sha512-dgymg4cMO+5hfSUC4zHnNoNIKoasUiaaYZRIs3lhRPFB2ultth4uJTV+iMlBTNtGDSKSs10ennHvm7CBGJVgVg==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [linux] - '@oxc-transform/binding-linux-arm64-musl@0.61.2': - resolution: {integrity: sha512-fEE9h8zmr8jlZnFJn3XGExwVZJDIx9SGBtpVs5ZpwXvbYJvoLdWP8BBf1oGKQwHy0tOhEzux7PaoYfitaNqdqg==} + '@oxc-parser/binding-linux-arm64-musl@0.62.0': + resolution: {integrity: sha512-sKhAyRsP6DNeFMRevAN28HccFKEO6l3OqC8MuAV+HNzzyzUOKx2HGnYlkLxCmDZ7lyzzl7vA7YRQFBLYXgsWSA==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [linux] - '@oxc-transform/binding-linux-x64-gnu@0.61.2': - resolution: {integrity: sha512-oOUJwYv8L3Hf1f2uoAFP8UrqPCEq061DEhU+2DdcDqhgA7aMNz4vTGhTZWFsidlJcZ03gVWIyevRylUnKhSNxA==} + '@oxc-parser/binding-linux-x64-gnu@0.62.0': + resolution: {integrity: sha512-WAPgDelo20F5An0SW8X+0hWVPF7dHKhHwZo5doOt8Dn9NX6nONQCmEDUUPtp/BqISBxRFSH+rZbaENn8GGlBqg==} engines: {node: '>=14.0.0'} cpu: [x64] os: [linux] - '@oxc-transform/binding-linux-x64-musl@0.61.2': - resolution: {integrity: sha512-YpLcnV+H/tecjU5JcjFVsVb9FJU2IFbodet2iCWghiA7Aitz8zPkP7LKYhWypkbeYeKMDmrrTDrbGm2k3wVofw==} + '@oxc-parser/binding-linux-x64-musl@0.62.0': + resolution: {integrity: sha512-JJ0WIPVXiuiWmPLKL+W3/OX1O5aDWMoX47eODKdNoM46bTcxIUe+wpHou731WuqhfrwACBi3Bsljn6VsIFPe9A==} engines: {node: '>=14.0.0'} cpu: [x64] os: [linux] - '@oxc-transform/binding-wasm32-wasi@0.61.2': - resolution: {integrity: sha512-9EYM95xU/8iE6aVGagTVP/gXkW9wMNLPCHUnVIqqMbYJbJnDZEcHgsZslNvXctjt9XFykNOF0TBrMSDuHiWzZw==} + '@oxc-parser/binding-wasm32-wasi@0.62.0': + resolution: {integrity: sha512-FuGOzv4FJWSBnG9jkCgZysU6ZMTKWHyHXEr40J1HjRnyw58bQ1sPfVmHZusNTSDCXmBlBz0ZuELLTJFHTI3DVQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@oxc-transform/binding-win32-arm64-msvc@0.61.2': - resolution: {integrity: sha512-/PKdSYnfvDBWgQTmNfrQ62i31eengiwsXqJSSmfraYzfEm9/xoJaJci88C3YjjJ+PAv3gWtMiHY/hbjBiDoaKw==} + '@oxc-parser/binding-win32-arm64-msvc@0.62.0': + resolution: {integrity: sha512-3XEM9fgnrC2Eav/csJaAn125bQIgsdAeyksTGq2xnydnomHY9G+/nfIfgS76X/K0TZiyjOOakctwl4vsObDyGA==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [win32] - '@oxc-transform/binding-win32-x64-msvc@0.61.2': - resolution: {integrity: sha512-r+UsmEAEXUPUYs9bQxc23w2Xm3r2gXSKxSy4Pu0v1S3BH5ShFv0YZw6jO9uuXLxiK/4q8jkrM1RAH2fIwuiF4Q==} + '@oxc-parser/binding-win32-x64-msvc@0.62.0': + resolution: {integrity: sha512-YbLsb6Z/FS7tNheETyvf6FYhqo/AUipHca9eF5cB4XAdGc+Yt9bcrnwG9g9RGD33nxaMDI1ead2KYAcNeDYzGA==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [win32] + + '@oxc-project/types@0.62.0': + resolution: {integrity: sha512-rC3YQjrntGvg8vkHHKaiFqZFBCDU/F3BPfokssD02q5Sn4dSZGYzJVdojqYIEFECpEMEqKBxqIRmVex1+WXI5w==} + + '@oxc-transform/binding-darwin-arm64@0.62.0': + resolution: {integrity: sha512-aUD548g1WJKk+hUPxMDPr2yfvMSGp6M0B1KjORYxdQSI70Fsi3SCmtDmmPNVWsuuugkeCDjqceFr56uYMMrBog==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [darwin] + + '@oxc-transform/binding-darwin-x64@0.62.0': + resolution: {integrity: sha512-Ocxqqm9a+QEgIf/AOE0MRYkgVC7ZWehAonG2YNBp/qnX8rrKGQ12oYpoQA1QJ5sVTr5kF4NgttjpTzKqJ3mKuw==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [darwin] + + '@oxc-transform/binding-linux-arm-gnueabihf@0.62.0': + resolution: {integrity: sha512-4z8LniTGjccnJVY7hS8pmh3gswPNmeeMVmvZpIzd1gaUwL6ZVWUuDHGGAAfjsOYzHruzw73HUvRPmfTDDie0lw==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + + '@oxc-transform/binding-linux-arm64-gnu@0.62.0': + resolution: {integrity: sha512-zdsTHhkUOSfHhyxJed1SpP8qccKODwQdQMcB8yFvVIoVX3re0qqTRy2aYxofeMTdT9HCqmX7hUXmy1bFYqAQJA==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + + '@oxc-transform/binding-linux-arm64-musl@0.62.0': + resolution: {integrity: sha512-NoM2Ymf0oKBlxu1DFjBQ7fAAz92JQ1MgbLT6apR2UCmOn7xIZAiyYloyXM43qDf6nTOAs3zmH6kNcEPZ8KaDrg==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + + '@oxc-transform/binding-linux-x64-gnu@0.62.0': + resolution: {integrity: sha512-ltHIWB0eBT5iDt9hvC6LI90JV7DVbUdXzCjuNzUl/qcXXpKKLFjuRUuAs0npg3B+bsw75N2UKdwJ+E+mGf+D9A==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + + '@oxc-transform/binding-linux-x64-musl@0.62.0': + resolution: {integrity: sha512-PODsXb/+a/380bdoJVruJSNuRm362b2fqgoRcQyDliIYVIlyNjhuRluNnXZt3Rcn+NMJuD6bR4UNDGIQawoaEg==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + + '@oxc-transform/binding-wasm32-wasi@0.62.0': + resolution: {integrity: sha512-1Ws06cA9bm7sNTUopUJWVhWx+fimKaazjTCIARHJDkJZZLCBuUOFOLzThqVmu0go0D8PXYA9IVe1caqSVjoHYg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-transform/binding-win32-arm64-msvc@0.62.0': + resolution: {integrity: sha512-D1HFN2aNm/bkgBLRgvadq12/eMIRe3NgxH2sSQk+AZcorS8vqrHXv6lhiKMEyQTT1nCzr1RzvWDflHwCxoUfqg==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [win32] + + '@oxc-transform/binding-win32-x64-msvc@0.62.0': + resolution: {integrity: sha512-3koMjqUz+LMRtAWBBsg50rsyNxKqpsN2Ft5NzcK+dsMN8dxq1vdMU7TaXdPSriY1buOPOAiqAEeGgdQRjoIBbQ==} engines: {node: '>=14.0.0'} cpu: [x64] os: [win32] @@ -790,171 +809,171 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.37.0': - resolution: {integrity: sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==} + '@rollup/rollup-android-arm-eabi@4.38.0': + resolution: {integrity: sha512-ldomqc4/jDZu/xpYU+aRxo3V4mGCV9HeTgUBANI3oIQMOL+SsxB+S2lxMpkFp5UamSS3XuTMQVbsS24R4J4Qjg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.37.0': - resolution: {integrity: sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==} + '@rollup/rollup-android-arm64@4.38.0': + resolution: {integrity: sha512-VUsgcy4GhhT7rokwzYQP+aV9XnSLkkhlEJ0St8pbasuWO/vwphhZQxYEKUP3ayeCYLhk6gEtacRpYP/cj3GjyQ==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.37.0': - resolution: {integrity: sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==} + '@rollup/rollup-darwin-arm64@4.38.0': + resolution: {integrity: sha512-buA17AYXlW9Rn091sWMq1xGUvWQFOH4N1rqUxGJtEQzhChxWjldGCCup7r/wUnaI6Au8sKXpoh0xg58a7cgcpg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.37.0': - resolution: {integrity: sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==} + '@rollup/rollup-darwin-x64@4.38.0': + resolution: {integrity: sha512-Mgcmc78AjunP1SKXl624vVBOF2bzwNWFPMP4fpOu05vS0amnLcX8gHIge7q/lDAHy3T2HeR0TqrriZDQS2Woeg==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.37.0': - resolution: {integrity: sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==} + '@rollup/rollup-freebsd-arm64@4.38.0': + resolution: {integrity: sha512-zzJACgjLbQTsscxWqvrEQAEh28hqhebpRz5q/uUd1T7VTwUNZ4VIXQt5hE7ncs0GrF+s7d3S4on4TiXUY8KoQA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.37.0': - resolution: {integrity: sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==} + '@rollup/rollup-freebsd-x64@4.38.0': + resolution: {integrity: sha512-hCY/KAeYMCyDpEE4pTETam0XZS4/5GXzlLgpi5f0IaPExw9kuB+PDTOTLuPtM10TlRG0U9OSmXJ+Wq9J39LvAg==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.37.0': - resolution: {integrity: sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==} + '@rollup/rollup-linux-arm-gnueabihf@4.38.0': + resolution: {integrity: sha512-mimPH43mHl4JdOTD7bUMFhBdrg6f9HzMTOEnzRmXbOZqjijCw8LA5z8uL6LCjxSa67H2xiLFvvO67PT05PRKGg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.37.0': - resolution: {integrity: sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==} + '@rollup/rollup-linux-arm-musleabihf@4.38.0': + resolution: {integrity: sha512-tPiJtiOoNuIH8XGG8sWoMMkAMm98PUwlriOFCCbZGc9WCax+GLeVRhmaxjJtz6WxrPKACgrwoZ5ia/uapq3ZVg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.37.0': - resolution: {integrity: sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==} + '@rollup/rollup-linux-arm64-gnu@4.38.0': + resolution: {integrity: sha512-wZco59rIVuB0tjQS0CSHTTUcEde+pXQWugZVxWaQFdQQ1VYub/sTrNdY76D1MKdN2NB48JDuGABP6o6fqos8mA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.37.0': - resolution: {integrity: sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==} + '@rollup/rollup-linux-arm64-musl@4.38.0': + resolution: {integrity: sha512-fQgqwKmW0REM4LomQ+87PP8w8xvU9LZfeLBKybeli+0yHT7VKILINzFEuggvnV9M3x1Ed4gUBmGUzCo/ikmFbQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.37.0': - resolution: {integrity: sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==} + '@rollup/rollup-linux-loongarch64-gnu@4.38.0': + resolution: {integrity: sha512-hz5oqQLXTB3SbXpfkKHKXLdIp02/w3M+ajp8p4yWOWwQRtHWiEOCKtc9U+YXahrwdk+3qHdFMDWR5k+4dIlddg==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.37.0': - resolution: {integrity: sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==} + '@rollup/rollup-linux-powerpc64le-gnu@4.38.0': + resolution: {integrity: sha512-NXqygK/dTSibQ+0pzxsL3r4Xl8oPqVoWbZV9niqOnIHV/J92fe65pOir0xjkUZDRSPyFRvu+4YOpJF9BZHQImw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.37.0': - resolution: {integrity: sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==} + '@rollup/rollup-linux-riscv64-gnu@4.38.0': + resolution: {integrity: sha512-GEAIabR1uFyvf/jW/5jfu8gjM06/4kZ1W+j1nWTSSB3w6moZEBm7iBtzwQ3a1Pxos2F7Gz+58aVEnZHU295QTg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.37.0': - resolution: {integrity: sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==} + '@rollup/rollup-linux-riscv64-musl@4.38.0': + resolution: {integrity: sha512-9EYTX+Gus2EGPbfs+fh7l95wVADtSQyYw4DfSBcYdUEAmP2lqSZY0Y17yX/3m5VKGGJ4UmIH5LHLkMJft3bYoA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.37.0': - resolution: {integrity: sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==} + '@rollup/rollup-linux-s390x-gnu@4.38.0': + resolution: {integrity: sha512-Mpp6+Z5VhB9VDk7RwZXoG2qMdERm3Jw07RNlXHE0bOnEeX+l7Fy4bg+NxfyN15ruuY3/7Vrbpm75J9QHFqj5+Q==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.37.0': - resolution: {integrity: sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==} + '@rollup/rollup-linux-x64-gnu@4.38.0': + resolution: {integrity: sha512-vPvNgFlZRAgO7rwncMeE0+8c4Hmc+qixnp00/Uv3ht2x7KYrJ6ERVd3/R0nUtlE6/hu7/HiiNHJ/rP6knRFt1w==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.37.0': - resolution: {integrity: sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==} + '@rollup/rollup-linux-x64-musl@4.38.0': + resolution: {integrity: sha512-q5Zv+goWvQUGCaL7fU8NuTw8aydIL/C9abAVGCzRReuj5h30TPx4LumBtAidrVOtXnlB+RZkBtExMsfqkMfb8g==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.37.0': - resolution: {integrity: sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==} + '@rollup/rollup-win32-arm64-msvc@4.38.0': + resolution: {integrity: sha512-u/Jbm1BU89Vftqyqbmxdq14nBaQjQX1HhmsdBWqSdGClNaKwhjsg5TpW+5Ibs1mb8Es9wJiMdl86BcmtUVXNZg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.37.0': - resolution: {integrity: sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==} + '@rollup/rollup-win32-ia32-msvc@4.38.0': + resolution: {integrity: sha512-mqu4PzTrlpNHHbu5qleGvXJoGgHpChBlrBx/mEhTPpnAL1ZAYFlvHD7rLK839LLKQzqEQMFJfGrrOHItN4ZQqA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.37.0': - resolution: {integrity: sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==} + '@rollup/rollup-win32-x64-msvc@4.38.0': + resolution: {integrity: sha512-jjqy3uWlecfB98Psxb5cD6Fny9Fupv9LrDSPTQZUROqjvZmcCqNu4UMl7qqhlUUGpwiAkotj6GYu4SZdcr/nLw==} cpu: [x64] os: [win32] '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@swc/core-darwin-arm64@1.10.18': - resolution: {integrity: sha512-FdGqzAIKVQJu8ROlnHElP59XAUsUzCFSNsou+tY/9ba+lhu8R9v0OI5wXiPErrKGZpQFMmx/BPqqhx3X4SuGNg==} + '@swc/core-darwin-arm64@1.11.16': + resolution: {integrity: sha512-l6uWMU+MUdfLHCl3dJgtVEdsUHPskoA4BSu0L1hh9SGBwPZ8xeOz8iLIqZM27lTuXxL4KsYH6GQR/OdQ/vhLtg==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.10.18': - resolution: {integrity: sha512-RZ73gZRituL/ZVLgrW6BYnQ5g8tuStG4cLUiPGJsUZpUm0ullSH6lHFvZTCBNFTfpQChG6eEhi2IdG6DwFp1lw==} + '@swc/core-darwin-x64@1.11.16': + resolution: {integrity: sha512-TH0IW8Ao1WZ4ARFHIh29dAQHYBEl4YnP74n++rjppmlCjY+8v3s5nXMA7IqxO3b5LVHyggWtU4+46DXTyMJM7g==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.10.18': - resolution: {integrity: sha512-8iJqI3EkxJuuq21UHoen1VS+QlS23RvynRuk95K+Q2HBjygetztCGGEc+Xelx9a0uPkDaaAtFvds4JMDqb9SAA==} + '@swc/core-linux-arm-gnueabihf@1.11.16': + resolution: {integrity: sha512-2IxD9t09oNZrbv37p4cJ9cTHMUAK6qNiShi9s2FJ9LcqSnZSN4iS4hvaaX6KZuG54d58vWnMU7yycjkdOTQcMg==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.10.18': - resolution: {integrity: sha512-8f1kSktWzMB6PG+r8lOlCfXz5E8Qhsmfwonn77T/OfjvGwQaWrcoASh2cdjpk3dydbf8jsKGPQE1lSc7GyjXRQ==} + '@swc/core-linux-arm64-gnu@1.11.16': + resolution: {integrity: sha512-AYkN23DOiPh1bf3XBf/xzZQDKSsgZTxlbyTyUIhprLJpAAAT0ZCGAUcS5mHqydk0nWQ13ABUymodvHoroutNzw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.10.18': - resolution: {integrity: sha512-4rv+E4VLdgQw6zjbTAauCAEExxChvxMpBUMCiZweTNPKbJJ2dY6BX2WGJ1ea8+RcgqR/Xysj3AFbOz1LBz6dGA==} + '@swc/core-linux-arm64-musl@1.11.16': + resolution: {integrity: sha512-n/nWXDRCIhM51dDGELfBcTMNnCiFatE7LDvsbYxb7DJt1HGjaCNvHHCKURb/apJTh/YNtWfgFap9dbsTgw8yPA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.10.18': - resolution: {integrity: sha512-vTNmyRBVP+sZca+vtwygYPGTNudTU6Gl6XhaZZ7cEUTBr8xvSTgEmYXoK/2uzyXpaTUI4Bmtp1x81cGN0mMoLQ==} + '@swc/core-linux-x64-gnu@1.11.16': + resolution: {integrity: sha512-xr182YQrF47n7Awxj+/ruI21bYw+xO/B26KFVnb+i3ezF9NOhqoqTX+33RL1ZLA/uFTq8ksPZO/y+ZVS/odtQA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.10.18': - resolution: {integrity: sha512-1TZPReKhFCeX776XaT6wegknfg+g3zODve+r4oslFHI+g7cInfWlxoGNDS3niPKyuafgCdOjme2g3OF+zzxfsQ==} + '@swc/core-linux-x64-musl@1.11.16': + resolution: {integrity: sha512-k2JBfiwWfXCIKrBRjFO9/vEdLSYq0QLJ+iNSLdfrejZ/aENNkbEg8O7O2GKUSb30RBacn6k8HMfJrcPLFiEyCQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.10.18': - resolution: {integrity: sha512-o/2CsaWSN3bkzVQ6DA+BiFKSVEYvhWGA1h+wnL2zWmIDs2Knag54sOEXZkCaf8YQyZesGeXJtPEy9hh/vjJgkA==} + '@swc/core-win32-arm64-msvc@1.11.16': + resolution: {integrity: sha512-taOb5U+abyEhQgex+hr6cI48BoqSvSdfmdirWcxprIEUBHCxa1dSriVwnJRAJOFI9T+5BEz88by6rgbB9MjbHA==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.10.18': - resolution: {integrity: sha512-eTPASeJtk4mJDfWiYEiOC6OYUi/N7meHbNHcU8e+aKABonhXrIo/FmnTE8vsUtC6+jakT1TQBdiQ8fzJ1kJVwA==} + '@swc/core-win32-ia32-msvc@1.11.16': + resolution: {integrity: sha512-b7yYggM9LBDiMY+XUt5kYWvs5sn0U3PXSOGvF3CbLufD/N/YQiDcYON2N3lrWHYL8aYnwbuZl45ojmQHSQPcdA==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.10.18': - resolution: {integrity: sha512-1Dud8CDBnc34wkBOboFBQud9YlV1bcIQtKSg7zC8LtwR3h+XAaCayZPkpGmmAlCv1DLQPvkF+s0JcaVC9mfffQ==} + '@swc/core-win32-x64-msvc@1.11.16': + resolution: {integrity: sha512-/ibq/YDc3B5AROkpOKPGxVkSyCKOg+ml8k11RxrW7FAPy6a9y5y9KPcWIqV74Ahq4RuaMNslTQqHWAGSm0xJsQ==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.10.18': - resolution: {integrity: sha512-IUWKD6uQYGRy8w2X9EZrtYg1O3SCijlHbCXzMaHQYc1X7yjijQh4H3IVL9ssZZyVp2ZDfQZu4bD5DWxxvpyjvg==} + '@swc/core@1.11.16': + resolution: {integrity: sha512-wgjrJqVUss8Lxqilg0vkiE0tkEKU3mZkoybQM1Ehy+PKWwwB6lFAwKi20cAEFlSSWo8jFR8hRo19ZELAoLDowg==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '*' @@ -965,8 +984,8 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/types@0.1.17': - resolution: {integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==} + '@swc/types@0.1.21': + resolution: {integrity: sha512-2YEtj5HJVbKivud9N4bpPBAyZhj4S2Ipe5LkUG94alTpr7in/GU/EARgPAd3BwU+YOmFVJC2+kjqhGRi3r0ZpQ==} '@tailwindcss/node@4.0.6': resolution: {integrity: sha512-jb6E0WeSq7OQbVYcIJ6LxnZTeC4HjMvbzFBMCrQff4R50HBlo/obmYNk6V2GCUXDeqiXtvtrQgcIbT+/boB03Q==} @@ -1050,8 +1069,8 @@ packages: resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} engines: {node: '>=18'} - '@testing-library/react@16.2.0': - resolution: {integrity: sha512-2cSskAvA1QNtKc8Y9VJQRv0tm3hLVgxRGDB+KYhIaPQJ1I+RHbhIXcM+zClKXzMes/wshsMVzf4B9vS4IZpqDQ==} + '@testing-library/react@16.3.0': + resolution: {integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==} engines: {node: '>=18'} peerDependencies: '@testing-library/dom': ^10.0.0 @@ -1083,8 +1102,8 @@ packages: '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.6': - resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/babel__traverse@7.20.7': + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -1092,8 +1111,8 @@ packages: '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -1113,16 +1132,16 @@ packages: '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - '@types/node@22.13.13': - resolution: {integrity: sha512-ClsL5nMwKaBRwPcCvH8E7+nU4GxHVx1axNvMZTFHMEfNI7oahimt26P5zjVCRrjiIWj6YFXfE1v3dEp94wLcGQ==} + '@types/node@22.14.0': + resolution: {integrity: sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==} - '@types/react-dom@19.0.4': - resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} + '@types/react-dom@19.1.1': + resolution: {integrity: sha512-jFf/woGTVTjUJsl2O7hcopJ1r0upqoq/vIOoCj0yLh3RIXxWcljlpuZ+vEBRXsymD1jhfeJrlyTy/S1UW+4y1w==} peerDependencies: '@types/react': ^19.0.0 - '@types/react@19.0.10': - resolution: {integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==} + '@types/react@19.1.0': + resolution: {integrity: sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==} '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -1130,63 +1149,138 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@typescript-eslint/eslint-plugin@8.24.0': - resolution: {integrity: sha512-aFcXEJJCI4gUdXgoo/j9udUYIHgF23MFkg09LFz2dzEmU0+1Plk4rQWv/IYKvPHAtlkkGoB3m5e6oUp+JPsNaQ==} + '@typescript-eslint/eslint-plugin@8.29.0': + resolution: {integrity: sha512-PAIpk/U7NIS6H7TEtN45SPGLQaHNgB7wSjsQV/8+KYokAb2T/gloOA/Bee2yd4/yKVhPKe5LlaUGhAZk5zmSaQ==} 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.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.24.0': - resolution: {integrity: sha512-MFDaO9CYiard9j9VepMNa9MTcqVvSny2N4hkY6roquzj8pdCBRENhErrteaQuu7Yjn1ppk0v1/ZF9CG3KIlrTA==} + '@typescript-eslint/parser@8.29.0': + resolution: {integrity: sha512-8C0+jlNJOwQso2GapCVWWfW/rzaq7Lbme+vGUFKE31djwNncIpgXD7Cd4weEsDdkoZDjH0lwwr3QDQFuyrMg9g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@8.24.0': - resolution: {integrity: sha512-HZIX0UByphEtdVBKaQBgTDdn9z16l4aTUz8e8zPQnyxwHBtf5vtl1L+OhH+m1FGV9DrRmoDuYKqzVrvWDcDozw==} + '@typescript-eslint/scope-manager@8.29.0': + resolution: {integrity: sha512-aO1PVsq7Gm+tcghabUpzEnVSFMCU4/nYIgC2GOatJcllvWfnhrgW0ZEbnTxm36QsikmCN1K/6ZgM7fok2I7xNw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.24.0': - resolution: {integrity: sha512-8fitJudrnY8aq0F1wMiPM1UUgiXQRJ5i8tFjq9kGfRajU+dbPyOuHbl0qRopLEidy0MwqgTHDt6CnSeXanNIwA==} + '@typescript-eslint/type-utils@8.29.0': + resolution: {integrity: sha512-ahaWQ42JAOx+NKEf5++WC/ua17q5l+j1GFrbbpVKzFL/tKVc0aYY8rVSYUpUvt2hUP1YBr7mwXzx+E/DfUWI9Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@8.24.0': - resolution: {integrity: sha512-VacJCBTyje7HGAw7xp11q439A+zeGG0p0/p2zsZwpnMzjPB5WteaWqt4g2iysgGFafrqvyLWqq6ZPZAOCoefCw==} + '@typescript-eslint/types@8.29.0': + resolution: {integrity: sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.24.0': - resolution: {integrity: sha512-ITjYcP0+8kbsvT9bysygfIfb+hBj6koDsu37JZG7xrCiy3fPJyNmfVtaGsgTUSEuTzcvME5YI5uyL5LD1EV5ZQ==} + '@typescript-eslint/typescript-estree@8.29.0': + resolution: {integrity: sha512-yOfen3jE9ISZR/hHpU/bmNvTtBW1NjRbkSFdZOksL1N+ybPEE7UVGMwqvS6CP022Rp00Sb0tdiIkhSCe6NI8ow==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.24.0': - resolution: {integrity: sha512-07rLuUBElvvEb1ICnafYWr4hk8/U7X9RDCOqd9JcAMtjh/9oRmcfN4yGzbPVirgMR0+HLVHehmu19CWeh7fsmQ==} + '@typescript-eslint/utils@8.29.0': + resolution: {integrity: sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@8.24.0': - resolution: {integrity: sha512-kArLq83QxGLbuHrTMoOEWO+l2MwsNS2TGISEdx8xgqpkbytB07XmlQyQdNDrCc1ecSqx0cnmhGvpX+VBwqqSkg==} + '@typescript-eslint/visitor-keys@8.29.0': + resolution: {integrity: sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vitejs/plugin-react-swc@3.8.0': - resolution: {integrity: sha512-T4sHPvS+DIqDP51ifPqa9XIRAz/kIvIi8oXcnOZZgHmMotgmmdxe/DD5tMFlt5nuIRzT0/QuiwmKlH0503Aapw==} + '@unrs/resolver-binding-darwin-arm64@1.4.1': + resolution: {integrity: sha512-8Tv+Bsd0BjGwfEedIyor4inw8atppRxM5BdUnIt+3mAm/QXUm7Dw74CHnXpfZKXkp07EXJGiA8hStqCINAWhdw==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.4.1': + resolution: {integrity: sha512-X8c3PhWziEMKAzZz+YAYWfwawi5AEgzy/hmfizAB4C70gMHLKmInJcp1270yYAOs7z07YVFI220pp50z24Jk3A==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.4.1': + resolution: {integrity: sha512-UUr/nREy1UdtxXQnmLaaTXFGOcGxPwNIzeJdb3KXai3TKtC1UgNOB9s8KOA4TaxOUBR/qVgL5BvBwmUjD5yuVA==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.4.1': + resolution: {integrity: sha512-e3pII53dEeS8inkX6A1ad2UXE0nuoWCqik4kOxaDnls0uJUq0ntdj5d9IYd+bv5TDwf9DSge/xPOvCmRYH+Tsw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.4.1': + resolution: {integrity: sha512-e/AKKd9gR+HNmVyDEPI/PIz2t0DrA3cyonHNhHVjrkxe8pMCiYiqhtn1+h+yIpHUtUlM6Y1FNIdivFa+r7wrEQ==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.4.1': + resolution: {integrity: sha512-vtIu34luF1jRktlHtiwm2mjuE8oJCsFiFr8hT5+tFQdqFKjPhbJXn83LswKsOhy0GxAEevpXDI4xxEwkjuXIPA==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-musl@1.4.1': + resolution: {integrity: sha512-H3PaOuGyhFXiyJd+09uPhGl4gocmhyi1BRzvsP8Lv5AQO3p3/ZY7WjV4t2NkBksm9tMjf3YbOVHyPWi2eWsNYw==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.4.1': + resolution: {integrity: sha512-4+GmJcaaFntCi1S01YByqp8wLMjV/FyQyHVGm0vedIhL1Vfx7uHkz/sZmKsidRwokBGuxi92GFmSzqT2O8KcNA==} + cpu: [ppc64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.4.1': + resolution: {integrity: sha512-6RDQVCmtFYTlhy89D5ixTqo9bTQqFhvNN0Ey1wJs5r+01Dq15gPHRXv2jF2bQATtMrOfYwv+R2ZR9ew1N1N3YQ==} + cpu: [s390x] + os: [linux] + + '@unrs/resolver-binding-linux-x64-gnu@1.4.1': + resolution: {integrity: sha512-XpU9uzIkD86+19NjCXxlVPISMUrVXsXo5htxtuG+uJ59p5JauSRZsIxQxzzfKzkxEjdvANPM/lS1HFoX6A6QeA==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-linux-x64-musl@1.4.1': + resolution: {integrity: sha512-3CDjG/spbTKCSHl66QP2ekHSD+H34i7utuDIM5gzoNBcZ1gTO0Op09Wx5cikXnhORRf9+HyDWzm37vU1PLSM1A==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-wasm32-wasi@1.4.1': + resolution: {integrity: sha512-50tYhvbCTnuzMn7vmP8IV2UKF7ITo1oihygEYq9wW2DUb/Y+QMqBHJUSCABRngATjZ4shOK6f2+s0gQX6ElENQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.4.1': + resolution: {integrity: sha512-KyJiIne/AqV4IW0wyQO34wSMuJwy3VxVQOfIXIPyQ/Up6y/zi2P/WwXb78gHsLiGRUqCA9LOoCX+6dQZde0g1g==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.4.1': + resolution: {integrity: sha512-y2NUD7pygrBolN2NoXUrwVqBpKPhF8DiSNE5oB5/iFO49r2DpoYqdj5HPb3F42fPBH5qNqj6Zg63+xCEzAD2hw==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.4.1': + resolution: {integrity: sha512-hVXaObGI2lGFmrtT77KSbPQ3I+zk9IU500wobjk0+oX59vg/0VqAzABNtt3YSQYgXTC2a/LYxekLfND/wlt0yQ==} + cpu: [x64] + os: [win32] + + '@vitejs/plugin-react-swc@3.8.1': + resolution: {integrity: sha512-aEUPCckHDcFyxpwFm0AIkbtv6PpUp3xTb9wYGFjtABynXjCYKkWoxX0AOK9NT9XCrdk6mBBUOeHQS+RKdcNO1A==} peerDependencies: vite: ^4 || ^5 || ^6 - '@vitest/eslint-plugin@1.1.36': - resolution: {integrity: sha512-IjBV/fcL9NJRxGw221ieaDsqKqj8qUo7rvSupDxMjTXyhsCusHC6M+jFUNqBp4PCkYFcf5bjrKxeZoCEWoPxig==} + '@vitest/eslint-plugin@1.1.39': + resolution: {integrity: sha512-l5/MUFCYI8nxwr62JHlWwXfeQNS8E7xy71lSLGQ3CrjGjBdWLs1Rtee+BvYwy2m4YVPwYqUwdcAIOaZOwPUpfg==} peerDependencies: '@typescript-eslint/utils': ^8.24.0 eslint: '>= 8.57.0' @@ -1198,11 +1292,11 @@ packages: vitest: optional: true - '@vitest/expect@3.0.9': - resolution: {integrity: sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==} + '@vitest/expect@3.1.1': + resolution: {integrity: sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==} - '@vitest/mocker@3.0.9': - resolution: {integrity: sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==} + '@vitest/mocker@3.1.1': + resolution: {integrity: sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 @@ -1212,28 +1306,28 @@ packages: vite: optional: true - '@vitest/pretty-format@3.0.9': - resolution: {integrity: sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==} + '@vitest/pretty-format@3.1.1': + resolution: {integrity: sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==} - '@vitest/runner@3.0.9': - resolution: {integrity: sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==} + '@vitest/runner@3.1.1': + resolution: {integrity: sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==} - '@vitest/snapshot@3.0.9': - resolution: {integrity: sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==} + '@vitest/snapshot@3.1.1': + resolution: {integrity: sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==} - '@vitest/spy@3.0.9': - resolution: {integrity: sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==} + '@vitest/spy@3.1.1': + resolution: {integrity: sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==} - '@vitest/utils@3.0.9': - resolution: {integrity: sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==} + '@vitest/utils@3.1.1': + resolution: {integrity: sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} engines: {node: '>=0.4.0'} hasBin: true @@ -1331,6 +1425,10 @@ packages: resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} engines: {node: '>= 0.4'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + call-bind@1.0.8: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} @@ -1339,6 +1437,10 @@ packages: resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} engines: {node: '>= 0.4'} + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -1499,6 +1601,10 @@ packages: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} @@ -1532,9 +1638,9 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-typescript@3.7.0: - resolution: {integrity: sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==} - engines: {node: ^14.18.0 || >=16.0.0} + eslint-import-resolver-typescript@4.3.2: + resolution: {integrity: sha512-T2LqBXj87ndEC9t1LrDiPkzalSFzD4rrXr6BTzGdgMx1jdQM4T972guQvg7Ih+LNO51GURXI/qMHS5GF3h1ilw==} + engines: {node: ^16.17.0 || >=18.6.0} peerDependencies: eslint: '*' eslint-plugin-import: '*' @@ -1576,20 +1682,20 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-react-hooks@5.1.0: - resolution: {integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==} + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} 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 - eslint-plugin-react@7.37.4: - resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - 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-visitor-keys@3.4.3: @@ -1600,8 +1706,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.20.0: - resolution: {integrity: sha512-aL4F8167Hg4IvsW89ejnpTwx+B/UQRzJPGgbIOl+4XqffWsahVVsLEWoZvnrVuwpWmnRd7XeXmQI1zlKcFDteA==} + eslint@9.24.0: + resolution: {integrity: sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1654,8 +1760,8 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - expect-type@1.1.0: - resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + expect-type@1.2.1: + resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} engines: {node: '>=12.0.0'} extend@3.0.2: @@ -1680,6 +1786,14 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -1730,12 +1844,20 @@ packages: resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} engines: {node: '>= 0.4'} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.8.1: - resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} + get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -1850,8 +1972,8 @@ packages: resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} engines: {node: '>= 0.4'} - is-bun-module@1.2.1: - resolution: {integrity: sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==} + is-bun-module@2.0.0: + resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} @@ -2256,8 +2378,8 @@ packages: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} - object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} engines: {node: '>= 0.4'} object.fromentries@2.0.8: @@ -2276,11 +2398,12 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - oxc-parser@0.51.0: - resolution: {integrity: sha512-IXcs/e4cFoAogqCGqzrUI0jWxktAb89qVqFcHZLxAWkQU4QoO1IKDsaSvG03Uw/7WUcp7QMR1b92D9GnsSFIBQ==} + oxc-parser@0.62.0: + resolution: {integrity: sha512-WwSVsS8e7KH8an4rQJJZuO2QiIxNA0ryPESmmdxy1KYRSKEscyBgbIGGv2lCWy3uTksQtAjB2s2YAohESfrfOQ==} + engines: {node: '>=14.0.0'} - oxc-transform@0.61.2: - resolution: {integrity: sha512-U0ZlYI80/3QK1VcmG73jpMLLN92BtgGO0gUWVMa6nnooJ9YfLWIeFAxifXsMyzqqJNbpzzT8E6myrSXZ1z371A==} + oxc-transform@0.62.0: + resolution: {integrity: sha512-4aycc3KlhwtUj1DVrFWGvfvX0OI6CmSkaPfhox4eY5UNknxZ0WSvj9p3NZIw8wPZiT6uj/acV3LcdO2o8HcSHQ==} engines: {node: '>=14.0.0'} p-limit@3.1.0: @@ -2371,10 +2494,10 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - react-dom@19.0.0: - resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} + react-dom@19.1.0: + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} peerDependencies: - react: ^19.0.0 + react: ^19.1.0 react-intersection-observer@9.16.0: resolution: {integrity: sha512-w9nJSEp+DrW9KmQmeWHQyfaP6b03v+TdXynaoA964Wxt7mdR3An11z4NNCQgL4gKSK7y1ver2Fq+JKH6CWEzUA==} @@ -2391,8 +2514,8 @@ packages: react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react@19.0.0: - resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} + react@19.1.0: + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} engines: {node: '>=0.10.0'} recma-build-jsx@1.0.0: @@ -2454,8 +2577,8 @@ packages: peerDependencies: rollup: 2.x || 3.x || 4.x - rollup@4.37.0: - resolution: {integrity: sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==} + rollup@4.38.0: + resolution: {integrity: sha512-5SsIRtJy9bf1ErAOiFMFzl64Ex9X5V7bnJ+WlFMb+zmP459OSWCEG7b0ERZ+PEU7xPt4OG3RHbrp1LJlXxYTrw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2470,8 +2593,8 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} - scheduler@0.25.0: - resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} @@ -2482,6 +2605,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -2528,14 +2656,14 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - stable-hash@0.0.4: - resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} + stable-hash@0.0.5: + resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@3.8.0: - resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + std-env@3.8.1: + resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==} string.prototype.matchall@4.0.12: resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} @@ -2600,6 +2728,10 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} + tinypool@1.0.2: resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -2634,38 +2766,38 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - turbo-darwin-64@2.4.4: - resolution: {integrity: sha512-5kPvRkLAfmWI0MH96D+/THnDMGXlFNmjeqNRj5grLKiry+M9pKj3pRuScddAXPdlxjO5Ptz06UNaOQrrYGTx1g==} + turbo-darwin-64@2.5.0: + resolution: {integrity: sha512-fP1hhI9zY8hv0idym3hAaXdPi80TLovmGmgZFocVAykFtOxF+GlfIgM/l4iLAV9ObIO4SUXPVWHeBZQQ+Hpjag==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.4.4: - resolution: {integrity: sha512-/gtHPqbGQXDFhrmy+Q/MFW2HUTUlThJ97WLLSe4bxkDrKHecDYhAjbZ4rN3MM93RV9STQb3Tqy4pZBtsd4DfCw==} + turbo-darwin-arm64@2.5.0: + resolution: {integrity: sha512-p9sYq7kXH7qeJwIQE86cOWv/xNqvow846l6c/qWc26Ib1ci5W7V0sI5thsrP3eH+VA0d+SHalTKg5SQXgNQBWA==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.4.4: - resolution: {integrity: sha512-SR0gri4k0bda56hw5u9VgDXLKb1Q+jrw4lM7WAhnNdXvVoep4d6LmnzgMHQQR12Wxl3KyWPbkz9d1whL6NTm2Q==} + turbo-linux-64@2.5.0: + resolution: {integrity: sha512-1iEln2GWiF3iPPPS1HQJT6ZCFXynJPd89gs9SkggH2EJsj3eRUSVMmMC8y6d7bBbhBFsiGGazwFIYrI12zs6uQ==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.4.4: - resolution: {integrity: sha512-COXXwzRd3vslQIfJhXUklgEqlwq35uFUZ7hnN+AUyXx7hUOLIiD5NblL+ETrHnhY4TzWszrbwUMfe2BYWtaPQg==} + turbo-linux-arm64@2.5.0: + resolution: {integrity: sha512-bKBcbvuQHmsX116KcxHJuAcppiiBOfivOObh2O5aXNER6mce7YDDQJy00xQQNp1DhEfcSV2uOsvb3O3nN2cbcA==} cpu: [arm64] os: [linux] - turbo-windows-64@2.4.4: - resolution: {integrity: sha512-PV9rYNouGz4Ff3fd6sIfQy5L7HT9a4fcZoEv8PKRavU9O75G7PoDtm8scpHU10QnK0QQNLbE9qNxOAeRvF0fJg==} + turbo-windows-64@2.5.0: + resolution: {integrity: sha512-9BCo8oQ7BO7J0K913Czbc3tw8QwLqn2nTe4E47k6aVYkM12ASTScweXPTuaPFP5iYXAT6z5Dsniw704Ixa5eGg==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.4.4: - resolution: {integrity: sha512-403sqp9t5sx6YGEC32IfZTVWkRAixOQomGYB8kEc6ZD+//LirSxzeCHCnM8EmSXw7l57U1G+Fb0kxgTcKPU/Lg==} + turbo-windows-arm64@2.5.0: + resolution: {integrity: sha512-OUHCV+ueXa3UzfZ4co/ueIHgeq9B2K48pZwIxKSm5VaLVuv8M13MhM7unukW09g++dpdrrE1w4IOVgxKZ0/exg==} cpu: [arm64] os: [win32] - turbo@2.4.4: - resolution: {integrity: sha512-N9FDOVaY3yz0YCOhYIgOGYad7+m2ptvinXygw27WPLQvcZDl3+0Sa77KGVlLSiuPDChOUEnTKE9VJwLSi9BPGQ==} + turbo@2.5.0: + resolution: {integrity: sha512-PvSRruOsitjy6qdqwIIyolv99+fEn57gP6gn4zhsHTEcCYgXPhv6BAxzAjleS8XKpo+Y582vTTA9nuqYDmbRuA==} hasBin: true type-check@0.4.0: @@ -2688,20 +2820,20 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.24.0: - resolution: {integrity: sha512-/lmv4366en/qbB32Vz5+kCNZEMf6xYHwh1z48suBwZvAtnXKbP+YhGe8OLE2BqC67LMqKkCNLtjejdwsdW6uOQ==} + typescript-eslint@8.29.0: + resolution: {integrity: sha512-ep9rVd9B4kQsZ7ZnWCVxUE/xDLUUUsRzE0poAeNu+4CkFErLfuvPt/qtm2EpnSyfvsR0S6QzDFSrPCFBwf64fg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' typescript@5.7.3: resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} engines: {node: '>=14.17'} hasBin: true - typescript@5.8.2: - resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true @@ -2709,8 +2841,8 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} @@ -2733,18 +2865,15 @@ packages: unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - unplugin-isolated-decl@0.11.2: - resolution: {integrity: sha512-D6nTHHMo9FpJzdpfiGyeBUBPBnJF76LgU8kL6lNRP6SMu7+QC1EV4zuGi8nPinJNIo++5HM2I7sVReC1WcE8jg==} + unplugin-isolated-decl@0.13.6: + resolution: {integrity: sha512-+dNEvuNHfqohQEcXdHtUop/FhK3BXiqtAreHX7oc0M64RMg59rsizH2Sk38O7hgMrXnokbiAJTgORETQyqDp/Q==} engines: {node: '>=18.12.0'} peerDependencies: '@swc/core': ^1.6.6 - oxc-transform: '>=0.42.0' typescript: ^5.5.2 peerDependenciesMeta: '@swc/core': optional: true - oxc-transform: - optional: true typescript: optional: true @@ -2752,10 +2881,13 @@ packages: resolution: {integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==} engines: {node: '>=18.12.0'} - unplugin@2.2.0: - resolution: {integrity: sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw==} + unplugin@2.2.2: + resolution: {integrity: sha512-Qp+iiD+qCRnUek+nDoYvtWX7tfnYyXsrOnJ452FRTgOyKmTM7TUJ3l+PLPJOOWPTUyKISKp4isC5JJPSXUjGgw==} engines: {node: '>=18.12.0'} + unrs-resolver@1.4.1: + resolution: {integrity: sha512-MhPB3wBI5BR8TGieTb08XuYlE8oFVEXdSAgat3psdlRyejl8ojQ8iqPcjh094qCZ1r+TnkxzP6BeCd/umfHckQ==} + update-browserslist-db@1.1.1: resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} hasBin: true @@ -2774,8 +2906,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@3.0.9: - resolution: {integrity: sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==} + vite-node@3.1.1: + resolution: {integrity: sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true @@ -2784,8 +2916,8 @@ packages: peerDependencies: vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 - vite@6.1.2: - resolution: {integrity: sha512-EiXfDyO/uNKhYOSlZ6+9qBz4H46A8Lr07pyjmb88KTbJ+xkXvnqtxvgtg2VxPU6Kfj8Ep0un9JLqdrCWLqIanw==} + vite@6.1.3: + resolution: {integrity: sha512-JMnf752ldN0UhZoPYXuWiRPsC2Z5hPy9JeUwfNSPBY8TyFZbSHRE1f6/WA8umOEJp0EN3zTddgNNSLT6Fc10UQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -2824,16 +2956,16 @@ packages: yaml: optional: true - vitest@3.0.9: - resolution: {integrity: sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==} + vitest@3.1.1: + resolution: {integrity: sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.0.9 - '@vitest/ui': 3.0.9 + '@vitest/browser': 3.1.1 + '@vitest/ui': 3.1.1 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -3028,13 +3160,13 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@emnapi/core@1.3.1': + '@emnapi/core@1.4.0': dependencies: '@emnapi/wasi-threads': 1.0.1 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.3.1': + '@emnapi/runtime@1.4.0': dependencies: tslib: 2.8.1 optional: true @@ -3119,30 +3251,32 @@ snapshots: '@esbuild/win32-x64@0.24.2': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.20.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.4.1(eslint@9.24.0(jiti@2.4.2))': dependencies: - eslint: 9.20.0(jiti@2.4.2) + eslint: 9.24.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.0': + '@eslint/config-array@0.20.0': dependencies: - '@eslint/object-schema': 2.1.4 + '@eslint/object-schema': 2.1.6 debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/core@0.10.0': + '@eslint/config-helpers@0.2.1': {} + + '@eslint/core@0.12.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/core@0.11.0': + '@eslint/core@0.13.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.2.0': + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 debug: 4.4.0 @@ -3156,13 +3290,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.20.0': {} + '@eslint/js@9.24.0': {} - '@eslint/object-schema@2.1.4': {} + '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.5': + '@eslint/plugin-kit@0.2.8': dependencies: - '@eslint/core': 0.10.0 + '@eslint/core': 0.13.0 levn: 0.4.1 '@humanfs/core@0.19.1': {} @@ -3176,7 +3310,7 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.1': {} + '@humanwhocodes/retry@0.4.2': {} '@jridgewell/gen-mapping@0.3.8': dependencies: @@ -3195,9 +3329,9 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@mdx-js/mdx@3.1.0(acorn@8.14.0)': + '@mdx-js/mdx@3.1.0(acorn@8.14.1)': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 '@types/mdx': 2.0.13 @@ -3209,7 +3343,7 @@ snapshots: hast-util-to-jsx-runtime: 2.3.2 markdown-extensions: 2.0.0 recma-build-jsx: 1.0.0 - recma-jsx: 1.0.0(acorn@8.14.0) + recma-jsx: 1.0.0(acorn@8.14.1) recma-stringify: 1.0.0 rehype-recma: 1.0.0 remark-mdx: 3.1.0 @@ -3225,27 +3359,27 @@ snapshots: - acorn - supports-color - '@mdx-js/react@3.1.0(@types/react@19.0.10)(react@19.0.0)': + '@mdx-js/react@3.1.0(@types/react@19.1.0)(react@19.1.0)': dependencies: '@types/mdx': 2.0.13 - '@types/react': 19.0.10 - react: 19.0.0 + '@types/react': 19.1.0 + react: 19.1.0 - '@mdx-js/rollup@3.1.0(acorn@8.14.0)(rollup@4.37.0)': + '@mdx-js/rollup@3.1.0(acorn@8.14.1)(rollup@4.38.0)': dependencies: - '@mdx-js/mdx': 3.1.0(acorn@8.14.0) - '@rollup/pluginutils': 5.1.4(rollup@4.37.0) - rollup: 4.37.0 + '@mdx-js/mdx': 3.1.0(acorn@8.14.1) + '@rollup/pluginutils': 5.1.4(rollup@4.38.0) + rollup: 4.38.0 source-map: 0.7.4 vfile: 6.0.3 transitivePeerDependencies: - acorn - supports-color - '@napi-rs/wasm-runtime@0.2.7': + '@napi-rs/wasm-runtime@0.2.8': dependencies: - '@emnapi/core': 1.3.1 - '@emnapi/runtime': 1.3.1 + '@emnapi/core': 1.4.0 + '@emnapi/runtime': 1.4.0 '@tybys/wasm-util': 0.9.0 optional: true @@ -3261,197 +3395,203 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@nolyfill/is-core-module@1.0.39': {} - - '@oxc-parser/binding-darwin-arm64@0.51.0': + '@oxc-parser/binding-darwin-arm64@0.62.0': optional: true - '@oxc-parser/binding-darwin-x64@0.51.0': + '@oxc-parser/binding-darwin-x64@0.62.0': optional: true - '@oxc-parser/binding-linux-arm64-gnu@0.51.0': + '@oxc-parser/binding-linux-arm-gnueabihf@0.62.0': optional: true - '@oxc-parser/binding-linux-arm64-musl@0.51.0': + '@oxc-parser/binding-linux-arm64-gnu@0.62.0': optional: true - '@oxc-parser/binding-linux-x64-gnu@0.51.0': + '@oxc-parser/binding-linux-arm64-musl@0.62.0': optional: true - '@oxc-parser/binding-linux-x64-musl@0.51.0': + '@oxc-parser/binding-linux-x64-gnu@0.62.0': optional: true - '@oxc-parser/binding-win32-arm64-msvc@0.51.0': + '@oxc-parser/binding-linux-x64-musl@0.62.0': optional: true - '@oxc-parser/binding-win32-x64-msvc@0.51.0': - optional: true - - '@oxc-project/types@0.51.0': {} - - '@oxc-transform/binding-darwin-arm64@0.61.2': - optional: true - - '@oxc-transform/binding-darwin-x64@0.61.2': - optional: true - - '@oxc-transform/binding-linux-arm-gnueabihf@0.61.2': - optional: true - - '@oxc-transform/binding-linux-arm64-gnu@0.61.2': - optional: true - - '@oxc-transform/binding-linux-arm64-musl@0.61.2': - optional: true - - '@oxc-transform/binding-linux-x64-gnu@0.61.2': - optional: true - - '@oxc-transform/binding-linux-x64-musl@0.61.2': - optional: true - - '@oxc-transform/binding-wasm32-wasi@0.61.2': + '@oxc-parser/binding-wasm32-wasi@0.62.0': dependencies: - '@napi-rs/wasm-runtime': 0.2.7 + '@napi-rs/wasm-runtime': 0.2.8 optional: true - '@oxc-transform/binding-win32-arm64-msvc@0.61.2': + '@oxc-parser/binding-win32-arm64-msvc@0.62.0': optional: true - '@oxc-transform/binding-win32-x64-msvc@0.61.2': + '@oxc-parser/binding-win32-x64-msvc@0.62.0': + optional: true + + '@oxc-project/types@0.62.0': {} + + '@oxc-transform/binding-darwin-arm64@0.62.0': + optional: true + + '@oxc-transform/binding-darwin-x64@0.62.0': + optional: true + + '@oxc-transform/binding-linux-arm-gnueabihf@0.62.0': + optional: true + + '@oxc-transform/binding-linux-arm64-gnu@0.62.0': + optional: true + + '@oxc-transform/binding-linux-arm64-musl@0.62.0': + optional: true + + '@oxc-transform/binding-linux-x64-gnu@0.62.0': + optional: true + + '@oxc-transform/binding-linux-x64-musl@0.62.0': + optional: true + + '@oxc-transform/binding-wasm32-wasi@0.62.0': + dependencies: + '@napi-rs/wasm-runtime': 0.2.8 + optional: true + + '@oxc-transform/binding-win32-arm64-msvc@0.62.0': + optional: true + + '@oxc-transform/binding-win32-x64-msvc@0.62.0': optional: true '@playwright/test@1.51.1': dependencies: playwright: 1.51.1 - '@rollup/plugin-inject@5.0.5(rollup@4.37.0)': + '@rollup/plugin-inject@5.0.5(rollup@4.38.0)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.37.0) + '@rollup/pluginutils': 5.1.4(rollup@4.38.0) estree-walker: 2.0.2 magic-string: 0.30.17 optionalDependencies: - rollup: 4.37.0 + rollup: 4.38.0 - '@rollup/pluginutils@5.1.4(rollup@4.37.0)': + '@rollup/pluginutils@5.1.4(rollup@4.38.0)': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.37.0 + rollup: 4.38.0 - '@rollup/rollup-android-arm-eabi@4.37.0': + '@rollup/rollup-android-arm-eabi@4.38.0': optional: true - '@rollup/rollup-android-arm64@4.37.0': + '@rollup/rollup-android-arm64@4.38.0': optional: true - '@rollup/rollup-darwin-arm64@4.37.0': + '@rollup/rollup-darwin-arm64@4.38.0': optional: true - '@rollup/rollup-darwin-x64@4.37.0': + '@rollup/rollup-darwin-x64@4.38.0': optional: true - '@rollup/rollup-freebsd-arm64@4.37.0': + '@rollup/rollup-freebsd-arm64@4.38.0': optional: true - '@rollup/rollup-freebsd-x64@4.37.0': + '@rollup/rollup-freebsd-x64@4.38.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.37.0': + '@rollup/rollup-linux-arm-gnueabihf@4.38.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.37.0': + '@rollup/rollup-linux-arm-musleabihf@4.38.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.37.0': + '@rollup/rollup-linux-arm64-gnu@4.38.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.37.0': + '@rollup/rollup-linux-arm64-musl@4.38.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.37.0': + '@rollup/rollup-linux-loongarch64-gnu@4.38.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.37.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.38.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.37.0': + '@rollup/rollup-linux-riscv64-gnu@4.38.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.37.0': + '@rollup/rollup-linux-riscv64-musl@4.38.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.37.0': + '@rollup/rollup-linux-s390x-gnu@4.38.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.37.0': + '@rollup/rollup-linux-x64-gnu@4.38.0': optional: true - '@rollup/rollup-linux-x64-musl@4.37.0': + '@rollup/rollup-linux-x64-musl@4.38.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.37.0': + '@rollup/rollup-win32-arm64-msvc@4.38.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.37.0': + '@rollup/rollup-win32-ia32-msvc@4.38.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.37.0': + '@rollup/rollup-win32-x64-msvc@4.38.0': optional: true '@rtsao/scc@1.1.0': {} - '@swc/core-darwin-arm64@1.10.18': + '@swc/core-darwin-arm64@1.11.16': optional: true - '@swc/core-darwin-x64@1.10.18': + '@swc/core-darwin-x64@1.11.16': optional: true - '@swc/core-linux-arm-gnueabihf@1.10.18': + '@swc/core-linux-arm-gnueabihf@1.11.16': optional: true - '@swc/core-linux-arm64-gnu@1.10.18': + '@swc/core-linux-arm64-gnu@1.11.16': optional: true - '@swc/core-linux-arm64-musl@1.10.18': + '@swc/core-linux-arm64-musl@1.11.16': optional: true - '@swc/core-linux-x64-gnu@1.10.18': + '@swc/core-linux-x64-gnu@1.11.16': optional: true - '@swc/core-linux-x64-musl@1.10.18': + '@swc/core-linux-x64-musl@1.11.16': optional: true - '@swc/core-win32-arm64-msvc@1.10.18': + '@swc/core-win32-arm64-msvc@1.11.16': optional: true - '@swc/core-win32-ia32-msvc@1.10.18': + '@swc/core-win32-ia32-msvc@1.11.16': optional: true - '@swc/core-win32-x64-msvc@1.10.18': + '@swc/core-win32-x64-msvc@1.11.16': optional: true - '@swc/core@1.10.18': + '@swc/core@1.11.16': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.17 + '@swc/types': 0.1.21 optionalDependencies: - '@swc/core-darwin-arm64': 1.10.18 - '@swc/core-darwin-x64': 1.10.18 - '@swc/core-linux-arm-gnueabihf': 1.10.18 - '@swc/core-linux-arm64-gnu': 1.10.18 - '@swc/core-linux-arm64-musl': 1.10.18 - '@swc/core-linux-x64-gnu': 1.10.18 - '@swc/core-linux-x64-musl': 1.10.18 - '@swc/core-win32-arm64-msvc': 1.10.18 - '@swc/core-win32-ia32-msvc': 1.10.18 - '@swc/core-win32-x64-msvc': 1.10.18 + '@swc/core-darwin-arm64': 1.11.16 + '@swc/core-darwin-x64': 1.11.16 + '@swc/core-linux-arm-gnueabihf': 1.11.16 + '@swc/core-linux-arm64-gnu': 1.11.16 + '@swc/core-linux-arm64-musl': 1.11.16 + '@swc/core-linux-x64-gnu': 1.11.16 + '@swc/core-linux-x64-musl': 1.11.16 + '@swc/core-win32-arm64-msvc': 1.11.16 + '@swc/core-win32-ia32-msvc': 1.11.16 + '@swc/core-win32-x64-msvc': 1.11.16 '@swc/counter@0.1.3': {} - '@swc/types@0.1.17': + '@swc/types@0.1.21': dependencies: '@swc/counter': 0.1.3 @@ -3508,13 +3648,13 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.0.6 '@tailwindcss/oxide-win32-x64-msvc': 4.0.6 - '@tailwindcss/vite@4.0.6(vite@6.1.2(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)))': + '@tailwindcss/vite@4.0.6(vite@6.1.3(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)))': dependencies: '@tailwindcss/node': 4.0.6 '@tailwindcss/oxide': 4.0.6 lightningcss: 1.29.1 tailwindcss: 4.0.6 - vite: 6.1.2(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) + vite: 6.1.3(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) '@testing-library/dom@10.4.0': dependencies: @@ -3527,15 +3667,15 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/react@16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + '@testing-library/react@16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.1.1(@types/react@19.1.0))(@types/react@19.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@babel/runtime': 7.27.0 '@testing-library/dom': 10.4.0 - react: 19.0.0 - react-dom: 19.0.0(react@19.0.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) optionalDependencies: - '@types/react': 19.0.10 - '@types/react-dom': 19.0.4(@types/react@19.0.10) + '@types/react': 19.1.0 + '@types/react-dom': 19.1.1(@types/react@19.1.0) '@tybys/wasm-util@0.9.0': dependencies: @@ -3544,7 +3684,7 @@ snapshots: '@types/acorn@4.0.6': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/aria-query@5.0.4': {} @@ -3554,7 +3694,7 @@ snapshots: '@babel/types': 7.26.3 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.6 + '@types/babel__traverse': 7.20.7 '@types/babel__generator@7.6.8': dependencies: @@ -3565,7 +3705,7 @@ snapshots: '@babel/parser': 7.26.3 '@babel/types': 7.26.3 - '@types/babel__traverse@7.20.6': + '@types/babel__traverse@7.20.7': dependencies: '@babel/types': 7.26.3 @@ -3575,9 +3715,9 @@ snapshots: '@types/estree-jsx@1.0.5': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 - '@types/estree@1.0.6': {} + '@types/estree@1.0.7': {} '@types/hast@3.0.4': dependencies: @@ -3595,15 +3735,15 @@ snapshots: '@types/ms@0.7.34': {} - '@types/node@22.13.13': + '@types/node@22.14.0': dependencies: - undici-types: 6.20.0 + undici-types: 6.21.0 - '@types/react-dom@19.0.4(@types/react@19.0.10)': + '@types/react-dom@19.1.1(@types/react@19.1.0)': dependencies: - '@types/react': 19.0.10 + '@types/react': 19.1.0 - '@types/react@19.0.10': + '@types/react@19.1.0': dependencies: csstype: 3.1.3 @@ -3611,15 +3751,15 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.24.0(@typescript-eslint/parser@8.24.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.24.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/scope-manager': 8.24.0 - '@typescript-eslint/type-utils': 8.24.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/utils': 8.24.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.24.0 - eslint: 9.20.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.29.0 + '@typescript-eslint/type-utils': 8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.29.0 + eslint: 9.24.0(jiti@2.4.2) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -3628,40 +3768,40 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.24.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/parser@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 8.24.0 - '@typescript-eslint/types': 8.24.0 - '@typescript-eslint/typescript-estree': 8.24.0(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.24.0 + '@typescript-eslint/scope-manager': 8.29.0 + '@typescript-eslint/types': 8.29.0 + '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.29.0 debug: 4.4.0 - eslint: 9.20.0(jiti@2.4.2) + eslint: 9.24.0(jiti@2.4.2) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.24.0': + '@typescript-eslint/scope-manager@8.29.0': dependencies: - '@typescript-eslint/types': 8.24.0 - '@typescript-eslint/visitor-keys': 8.24.0 + '@typescript-eslint/types': 8.29.0 + '@typescript-eslint/visitor-keys': 8.29.0 - '@typescript-eslint/type-utils@8.24.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.24.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.24.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.7.3) + '@typescript-eslint/utils': 8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) debug: 4.4.0 - eslint: 9.20.0(jiti@2.4.2) + eslint: 9.24.0(jiti@2.4.2) ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.24.0': {} + '@typescript-eslint/types@8.29.0': {} - '@typescript-eslint/typescript-estree@8.24.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.29.0(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.24.0 - '@typescript-eslint/visitor-keys': 8.24.0 + '@typescript-eslint/types': 8.29.0 + '@typescript-eslint/visitor-keys': 8.29.0 debug: 4.4.0 fast-glob: 3.3.2 is-glob: 4.0.3 @@ -3672,84 +3812,131 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.24.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/utils@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.0(jiti@2.4.2)) - '@typescript-eslint/scope-manager': 8.24.0 - '@typescript-eslint/types': 8.24.0 - '@typescript-eslint/typescript-estree': 8.24.0(typescript@5.7.3) - eslint: 9.20.0(jiti@2.4.2) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.24.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.29.0 + '@typescript-eslint/types': 8.29.0 + '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.7.3) + eslint: 9.24.0(jiti@2.4.2) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.24.0': + '@typescript-eslint/visitor-keys@8.29.0': dependencies: - '@typescript-eslint/types': 8.24.0 + '@typescript-eslint/types': 8.29.0 eslint-visitor-keys: 4.2.0 '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react-swc@3.8.0(vite@6.1.2(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)))': + '@unrs/resolver-binding-darwin-arm64@1.4.1': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.4.1': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.4.1': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.4.1': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.4.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.4.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.4.1': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.4.1': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.4.1': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.4.1': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.4.1': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.4.1': dependencies: - '@swc/core': 1.10.18 - vite: 6.1.2(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) + '@napi-rs/wasm-runtime': 0.2.8 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.4.1': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.4.1': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.4.1': + optional: true + + '@vitejs/plugin-react-swc@3.8.1(vite@6.1.3(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)))': + dependencies: + '@swc/core': 1.11.16 + vite: 6.1.3(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) transitivePeerDependencies: - '@swc/helpers' - '@vitest/eslint-plugin@1.1.36(@typescript-eslint/utils@8.24.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3)(vitest@3.0.9(@types/debug@4.1.12)(@types/node@22.13.13)(happy-dom@17.4.4)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)))': + '@vitest/eslint-plugin@1.1.39(@typescript-eslint/utils@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3)(vitest@3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(happy-dom@17.4.4)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)))': dependencies: - '@typescript-eslint/utils': 8.24.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) - eslint: 9.20.0(jiti@2.4.2) + '@typescript-eslint/utils': 8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.24.0(jiti@2.4.2) optionalDependencies: typescript: 5.7.3 - vitest: 3.0.9(@types/debug@4.1.12)(@types/node@22.13.13)(happy-dom@17.4.4)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) + vitest: 3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(happy-dom@17.4.4)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) - '@vitest/expect@3.0.9': + '@vitest/expect@3.1.1': dependencies: - '@vitest/spy': 3.0.9 - '@vitest/utils': 3.0.9 + '@vitest/spy': 3.1.1 + '@vitest/utils': 3.1.1 chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.9(vite@6.1.2(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)))': + '@vitest/mocker@3.1.1(vite@6.1.3(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)))': dependencies: - '@vitest/spy': 3.0.9 + '@vitest/spy': 3.1.1 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.1.2(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) + vite: 6.1.3(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) - '@vitest/pretty-format@3.0.9': + '@vitest/pretty-format@3.1.1': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.0.9': + '@vitest/runner@3.1.1': dependencies: - '@vitest/utils': 3.0.9 + '@vitest/utils': 3.1.1 pathe: 2.0.3 - '@vitest/snapshot@3.0.9': + '@vitest/snapshot@3.1.1': dependencies: - '@vitest/pretty-format': 3.0.9 + '@vitest/pretty-format': 3.1.1 magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/spy@3.0.9': + '@vitest/spy@3.1.1': dependencies: tinyspy: 3.0.2 - '@vitest/utils@3.0.9': + '@vitest/utils@3.1.1': dependencies: - '@vitest/pretty-format': 3.0.9 + '@vitest/pretty-format': 3.1.1 loupe: 3.1.3 tinyrainbow: 2.0.0 - acorn-jsx@5.3.2(acorn@8.14.0): + acorn-jsx@5.3.2(acorn@8.14.1): dependencies: - acorn: 8.14.0 + acorn: 8.14.1 - acorn@8.14.0: {} + acorn@8.14.1: {} ajv@6.12.6: dependencies: @@ -3875,6 +4062,11 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + call-bind@1.0.8: dependencies: call-bind-apply-helpers: 1.0.1 @@ -3887,6 +4079,11 @@ snapshots: call-bind-apply-helpers: 1.0.1 get-intrinsic: 1.2.6 + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + callsites@3.1.0: {} caniuse-lite@1.0.30001680: {} @@ -4090,6 +4287,10 @@ snapshots: dependencies: es-errors: 1.3.0 + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + es-set-tostringtag@2.0.3: dependencies: get-intrinsic: 1.2.6 @@ -4116,7 +4317,7 @@ snapshots: esast-util-from-js@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 - acorn: 8.14.0 + acorn: 8.14.1 esast-util-from-estree: 2.0.0 vfile-message: 4.0.2 @@ -4160,34 +4361,32 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.20.0(jiti@2.4.2)): + eslint-import-resolver-typescript@4.3.2(eslint-plugin-import@2.31.0)(eslint@9.24.0(jiti@2.4.2)): dependencies: - '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0 - enhanced-resolve: 5.18.0 - eslint: 9.20.0(jiti@2.4.2) - fast-glob: 3.3.2 - get-tsconfig: 4.8.1 - is-bun-module: 1.2.1 - is-glob: 4.0.3 - stable-hash: 0.0.4 + eslint: 9.24.0(jiti@2.4.2) + get-tsconfig: 4.10.0 + is-bun-module: 2.0.0 + stable-hash: 0.0.5 + tinyglobby: 0.2.12 + unrs-resolver: 1.4.1 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.20.0(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@4.3.2)(eslint@9.24.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.20.0(jiti@2.4.2)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.3.2)(eslint@9.24.0(jiti@2.4.2)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.24.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) - eslint: 9.20.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.24.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.20.0(jiti@2.4.2)) + eslint-import-resolver-typescript: 4.3.2(eslint-plugin-import@2.31.0)(eslint@9.24.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.20.0(jiti@2.4.2)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@4.3.2)(eslint@9.24.0(jiti@2.4.2)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -4196,9 +4395,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.20.0(jiti@2.4.2) + eslint: 9.24.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.20.0(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.3.2)(eslint@9.24.0(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -4210,17 +4409,17 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.24.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': 8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-react-hooks@5.1.0(eslint@9.20.0(jiti@2.4.2)): + eslint-plugin-react-hooks@5.2.0(eslint@9.24.0(jiti@2.4.2)): dependencies: - eslint: 9.20.0(jiti@2.4.2) + eslint: 9.24.0(jiti@2.4.2) - eslint-plugin-react@7.37.4(eslint@9.20.0(jiti@2.4.2)): + eslint-plugin-react@7.37.5(eslint@9.24.0(jiti@2.4.2)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -4228,12 +4427,12 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.20.0(jiti@2.4.2) + eslint: 9.24.0(jiti@2.4.2) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.8 + object.entries: 1.1.9 object.fromentries: 2.0.8 object.values: 1.2.1 prop-types: 15.8.1 @@ -4242,7 +4441,7 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-scope@8.2.0: + eslint-scope@8.3.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 @@ -4251,26 +4450,27 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.20.0(jiti@2.4.2): + eslint@9.24.0(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.24.0(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.0 - '@eslint/core': 0.11.0 - '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.20.0 - '@eslint/plugin-kit': 0.2.5 + '@eslint/config-array': 0.20.0 + '@eslint/config-helpers': 0.2.1 + '@eslint/core': 0.12.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.24.0 + '@eslint/plugin-kit': 0.2.8 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.1 - '@types/estree': 1.0.6 + '@humanwhocodes/retry': 0.4.2 + '@types/estree': 1.0.7 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 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 @@ -4294,8 +4494,8 @@ snapshots: espree@10.3.0: dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) eslint-visitor-keys: 4.2.0 esquery@1.6.0: @@ -4310,7 +4510,7 @@ snapshots: estree-util-attach-comments@3.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 estree-util-build-jsx@3.0.1: dependencies: @@ -4323,7 +4523,7 @@ snapshots: estree-util-scope@1.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 devlop: 1.1.0 estree-util-to-js@2.0.0: @@ -4341,11 +4541,11 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 esutils@2.0.3: {} - expect-type@1.1.0: {} + expect-type@1.2.1: {} extend@3.0.2: {} @@ -4369,6 +4569,10 @@ snapshots: dependencies: reusify: 1.0.4 + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -4427,13 +4631,31 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + get-symbol-description@1.1.0: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 get-intrinsic: 1.2.6 - get-tsconfig@4.8.1: + get-tsconfig@4.10.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -4489,7 +4711,7 @@ snapshots: hast-util-to-estree@3.1.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 @@ -4510,7 +4732,7 @@ snapshots: hast-util-to-jsx-runtime@2.3.2: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/hast': 3.0.4 '@types/unist': 3.0.3 comma-separated-tokens: 2.0.3 @@ -4577,9 +4799,9 @@ snapshots: call-bound: 1.0.3 has-tostringtag: 1.0.2 - is-bun-module@1.2.1: + is-bun-module@2.0.0: dependencies: - semver: 7.6.3 + semver: 7.7.1 is-callable@1.2.7: {} @@ -4912,7 +5134,7 @@ snapshots: micromark-extension-mdx-expression@3.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 devlop: 1.1.0 micromark-factory-mdx-expression: 2.0.2 micromark-factory-space: 2.0.1 @@ -4924,7 +5146,7 @@ snapshots: micromark-extension-mdx-jsx@3.0.1: dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 micromark-factory-mdx-expression: 2.0.2 @@ -4941,7 +5163,7 @@ snapshots: micromark-extension-mdxjs-esm@3.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 devlop: 1.1.0 micromark-core-commonmark: 2.0.2 micromark-util-character: 2.1.1 @@ -4953,8 +5175,8 @@ snapshots: micromark-extension-mdxjs@3.0.0: dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) micromark-extension-mdx-expression: 3.0.0 micromark-extension-mdx-jsx: 3.0.1 micromark-extension-mdx-md: 2.0.0 @@ -4977,7 +5199,7 @@ snapshots: micromark-factory-mdx-expression@2.0.2: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 devlop: 1.1.0 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 @@ -5042,7 +5264,7 @@ snapshots: micromark-util-events-to-acorn@2.0.2: dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/unist': 3.0.3 devlop: 1.1.0 estree-util-visit: 2.0.0 @@ -5137,11 +5359,12 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 - object.entries@1.1.8: + object.entries@1.1.9: dependencies: call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 object.fromentries@2.0.8: dependencies: @@ -5172,31 +5395,33 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - oxc-parser@0.51.0: + oxc-parser@0.62.0: dependencies: - '@oxc-project/types': 0.51.0 + '@oxc-project/types': 0.62.0 optionalDependencies: - '@oxc-parser/binding-darwin-arm64': 0.51.0 - '@oxc-parser/binding-darwin-x64': 0.51.0 - '@oxc-parser/binding-linux-arm64-gnu': 0.51.0 - '@oxc-parser/binding-linux-arm64-musl': 0.51.0 - '@oxc-parser/binding-linux-x64-gnu': 0.51.0 - '@oxc-parser/binding-linux-x64-musl': 0.51.0 - '@oxc-parser/binding-win32-arm64-msvc': 0.51.0 - '@oxc-parser/binding-win32-x64-msvc': 0.51.0 + '@oxc-parser/binding-darwin-arm64': 0.62.0 + '@oxc-parser/binding-darwin-x64': 0.62.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.62.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.62.0 + '@oxc-parser/binding-linux-arm64-musl': 0.62.0 + '@oxc-parser/binding-linux-x64-gnu': 0.62.0 + '@oxc-parser/binding-linux-x64-musl': 0.62.0 + '@oxc-parser/binding-wasm32-wasi': 0.62.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.62.0 + '@oxc-parser/binding-win32-x64-msvc': 0.62.0 - oxc-transform@0.61.2: + oxc-transform@0.62.0: optionalDependencies: - '@oxc-transform/binding-darwin-arm64': 0.61.2 - '@oxc-transform/binding-darwin-x64': 0.61.2 - '@oxc-transform/binding-linux-arm-gnueabihf': 0.61.2 - '@oxc-transform/binding-linux-arm64-gnu': 0.61.2 - '@oxc-transform/binding-linux-arm64-musl': 0.61.2 - '@oxc-transform/binding-linux-x64-gnu': 0.61.2 - '@oxc-transform/binding-linux-x64-musl': 0.61.2 - '@oxc-transform/binding-wasm32-wasi': 0.61.2 - '@oxc-transform/binding-win32-arm64-msvc': 0.61.2 - '@oxc-transform/binding-win32-x64-msvc': 0.61.2 + '@oxc-transform/binding-darwin-arm64': 0.62.0 + '@oxc-transform/binding-darwin-x64': 0.62.0 + '@oxc-transform/binding-linux-arm-gnueabihf': 0.62.0 + '@oxc-transform/binding-linux-arm64-gnu': 0.62.0 + '@oxc-transform/binding-linux-arm64-musl': 0.62.0 + '@oxc-transform/binding-linux-x64-gnu': 0.62.0 + '@oxc-transform/binding-linux-x64-musl': 0.62.0 + '@oxc-transform/binding-wasm32-wasi': 0.62.0 + '@oxc-transform/binding-win32-arm64-msvc': 0.62.0 + '@oxc-transform/binding-win32-x64-msvc': 0.62.0 p-limit@3.1.0: dependencies: @@ -5275,32 +5500,32 @@ snapshots: queue-microtask@1.2.3: {} - react-dom@19.0.0(react@19.0.0): + react-dom@19.1.0(react@19.1.0): dependencies: - react: 19.0.0 - scheduler: 0.25.0 + react: 19.1.0 + scheduler: 0.26.0 - react-intersection-observer@9.16.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + react-intersection-observer@9.16.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: - react: 19.0.0 + react: 19.1.0 optionalDependencies: - react-dom: 19.0.0(react@19.0.0) + react-dom: 19.1.0(react@19.1.0) react-is@16.13.1: {} react-is@17.0.2: {} - react@19.0.0: {} + react@19.1.0: {} recma-build-jsx@1.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 estree-util-build-jsx: 3.0.1 vfile: 6.0.3 - recma-jsx@1.0.0(acorn@8.14.0): + recma-jsx@1.0.0(acorn@8.14.1): dependencies: - acorn-jsx: 5.3.2(acorn@8.14.0) + acorn-jsx: 5.3.2(acorn@8.14.1) estree-util-to-js: 2.0.0 recma-parse: 1.0.0 recma-stringify: 1.0.0 @@ -5310,14 +5535,14 @@ snapshots: recma-parse@1.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 esast-util-from-js: 2.0.1 unified: 11.0.5 vfile: 6.0.3 recma-stringify@1.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 estree-util-to-js: 2.0.0 unified: 11.0.5 vfile: 6.0.3 @@ -5344,7 +5569,7 @@ snapshots: rehype-recma@1.0.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/hast': 3.0.4 hast-util-to-estree: 3.1.0 transitivePeerDependencies: @@ -5392,36 +5617,36 @@ snapshots: reusify@1.0.4: {} - rollup-plugin-preserve-directives@0.4.0(rollup@4.37.0): + rollup-plugin-preserve-directives@0.4.0(rollup@4.38.0): dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.37.0) + '@rollup/pluginutils': 5.1.4(rollup@4.38.0) magic-string: 0.30.17 - rollup: 4.37.0 + rollup: 4.38.0 - rollup@4.37.0: + rollup@4.38.0: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.37.0 - '@rollup/rollup-android-arm64': 4.37.0 - '@rollup/rollup-darwin-arm64': 4.37.0 - '@rollup/rollup-darwin-x64': 4.37.0 - '@rollup/rollup-freebsd-arm64': 4.37.0 - '@rollup/rollup-freebsd-x64': 4.37.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.37.0 - '@rollup/rollup-linux-arm-musleabihf': 4.37.0 - '@rollup/rollup-linux-arm64-gnu': 4.37.0 - '@rollup/rollup-linux-arm64-musl': 4.37.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.37.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.37.0 - '@rollup/rollup-linux-riscv64-gnu': 4.37.0 - '@rollup/rollup-linux-riscv64-musl': 4.37.0 - '@rollup/rollup-linux-s390x-gnu': 4.37.0 - '@rollup/rollup-linux-x64-gnu': 4.37.0 - '@rollup/rollup-linux-x64-musl': 4.37.0 - '@rollup/rollup-win32-arm64-msvc': 4.37.0 - '@rollup/rollup-win32-ia32-msvc': 4.37.0 - '@rollup/rollup-win32-x64-msvc': 4.37.0 + '@rollup/rollup-android-arm-eabi': 4.38.0 + '@rollup/rollup-android-arm64': 4.38.0 + '@rollup/rollup-darwin-arm64': 4.38.0 + '@rollup/rollup-darwin-x64': 4.38.0 + '@rollup/rollup-freebsd-arm64': 4.38.0 + '@rollup/rollup-freebsd-x64': 4.38.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.38.0 + '@rollup/rollup-linux-arm-musleabihf': 4.38.0 + '@rollup/rollup-linux-arm64-gnu': 4.38.0 + '@rollup/rollup-linux-arm64-musl': 4.38.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.38.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.38.0 + '@rollup/rollup-linux-riscv64-gnu': 4.38.0 + '@rollup/rollup-linux-riscv64-musl': 4.38.0 + '@rollup/rollup-linux-s390x-gnu': 4.38.0 + '@rollup/rollup-linux-x64-gnu': 4.38.0 + '@rollup/rollup-linux-x64-musl': 4.38.0 + '@rollup/rollup-win32-arm64-msvc': 4.38.0 + '@rollup/rollup-win32-ia32-msvc': 4.38.0 + '@rollup/rollup-win32-x64-msvc': 4.38.0 fsevents: 2.3.3 run-parallel@1.2.0: @@ -5442,12 +5667,14 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 - scheduler@0.25.0: {} + scheduler@0.26.0: {} semver@6.3.1: {} semver@7.6.3: {} + semver@7.7.1: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -5506,11 +5733,11 @@ snapshots: space-separated-tokens@2.0.2: {} - stable-hash@0.0.4: {} + stable-hash@0.0.5: {} stackback@0.0.2: {} - std-env@3.8.0: {} + std-env@3.8.1: {} string.prototype.matchall@4.0.12: dependencies: @@ -5592,6 +5819,11 @@ snapshots: tinyexec@0.3.2: {} + tinyglobby@0.2.12: + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + tinypool@1.0.2: {} tinyrainbow@2.0.0: {} @@ -5620,32 +5852,32 @@ snapshots: tslib@2.8.1: optional: true - turbo-darwin-64@2.4.4: + turbo-darwin-64@2.5.0: optional: true - turbo-darwin-arm64@2.4.4: + turbo-darwin-arm64@2.5.0: optional: true - turbo-linux-64@2.4.4: + turbo-linux-64@2.5.0: optional: true - turbo-linux-arm64@2.4.4: + turbo-linux-arm64@2.5.0: optional: true - turbo-windows-64@2.4.4: + turbo-windows-64@2.5.0: optional: true - turbo-windows-arm64@2.4.4: + turbo-windows-arm64@2.5.0: optional: true - turbo@2.4.4: + turbo@2.5.0: optionalDependencies: - turbo-darwin-64: 2.4.4 - turbo-darwin-arm64: 2.4.4 - turbo-linux-64: 2.4.4 - turbo-linux-arm64: 2.4.4 - turbo-windows-64: 2.4.4 - turbo-windows-arm64: 2.4.4 + turbo-darwin-64: 2.5.0 + turbo-darwin-arm64: 2.5.0 + turbo-linux-64: 2.5.0 + turbo-linux-arm64: 2.5.0 + turbo-windows-64: 2.5.0 + turbo-windows-arm64: 2.5.0 type-check@0.4.0: dependencies: @@ -5684,19 +5916,19 @@ snapshots: possible-typed-array-names: 1.0.0 reflect.getprototypeof: 1.0.9 - typescript-eslint@8.24.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3): + typescript-eslint@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.24.0(@typescript-eslint/parser@8.24.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/parser': 8.24.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/utils': 8.24.0(eslint@9.20.0(jiti@2.4.2))(typescript@5.7.3) - eslint: 9.20.0(jiti@2.4.2) + '@typescript-eslint/eslint-plugin': 8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': 8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.7.3) + eslint: 9.24.0(jiti@2.4.2) typescript: 5.7.3 transitivePeerDependencies: - supports-color typescript@5.7.3: {} - typescript@5.8.2: + typescript@5.8.3: optional: true unbox-primitive@1.1.0: @@ -5706,7 +5938,7 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@6.20.0: {} + undici-types@6.21.0: {} unified@11.0.5: dependencies: @@ -5745,17 +5977,17 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - unplugin-isolated-decl@0.11.2(@swc/core@1.10.18)(oxc-transform@0.61.2)(typescript@5.8.2): + unplugin-isolated-decl@0.13.6(@swc/core@1.11.16)(typescript@5.8.3): dependencies: debug: 4.4.0 magic-string: 0.30.17 - oxc-parser: 0.51.0 - unplugin: 2.2.0 + oxc-parser: 0.62.0 + oxc-transform: 0.62.0 + unplugin: 2.2.2 unplugin-utils: 0.2.4 optionalDependencies: - '@swc/core': 1.10.18 - oxc-transform: 0.61.2 - typescript: 5.8.2 + '@swc/core': 1.11.16 + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -5764,11 +5996,29 @@ snapshots: pathe: 2.0.3 picomatch: 4.0.2 - unplugin@2.2.0: + unplugin@2.2.2: dependencies: - acorn: 8.14.0 + acorn: 8.14.1 webpack-virtual-modules: 0.6.2 + unrs-resolver@1.4.1: + optionalDependencies: + '@unrs/resolver-binding-darwin-arm64': 1.4.1 + '@unrs/resolver-binding-darwin-x64': 1.4.1 + '@unrs/resolver-binding-freebsd-x64': 1.4.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.4.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.4.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.4.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.4.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.4.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.4.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.4.1 + '@unrs/resolver-binding-linux-x64-musl': 1.4.1 + '@unrs/resolver-binding-wasm32-wasi': 1.4.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.4.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.4.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.4.1 + update-browserslist-db@1.1.1(browserslist@4.24.2): dependencies: browserslist: 4.24.2 @@ -5791,13 +6041,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.0.9(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)): + vite-node@3.1.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.1.2(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) + vite: 6.1.3(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) transitivePeerDependencies: - '@types/node' - jiti @@ -5812,47 +6062,47 @@ snapshots: - tsx - yaml - vite-plugin-externalize-deps@0.9.0(vite@6.1.2(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3))): + vite-plugin-externalize-deps@0.9.0(vite@6.1.3(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3))): dependencies: - vite: 6.1.2(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) + vite: 6.1.3(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) - vite@6.1.2(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)): + vite@6.1.3(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)): dependencies: esbuild: 0.24.2 postcss: 8.5.3 - rollup: 4.37.0 + rollup: 4.38.0 optionalDependencies: - '@types/node': 22.13.13 + '@types/node': 22.14.0 fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.29.1 sugarss: 4.0.1(postcss@8.5.3) - vitest@3.0.9(@types/debug@4.1.12)(@types/node@22.13.13)(happy-dom@17.4.4)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)): + vitest@3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(happy-dom@17.4.4)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)): dependencies: - '@vitest/expect': 3.0.9 - '@vitest/mocker': 3.0.9(vite@6.1.2(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3))) - '@vitest/pretty-format': 3.0.9 - '@vitest/runner': 3.0.9 - '@vitest/snapshot': 3.0.9 - '@vitest/spy': 3.0.9 - '@vitest/utils': 3.0.9 + '@vitest/expect': 3.1.1 + '@vitest/mocker': 3.1.1(vite@6.1.3(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3))) + '@vitest/pretty-format': 3.1.1 + '@vitest/runner': 3.1.1 + '@vitest/snapshot': 3.1.1 + '@vitest/spy': 3.1.1 + '@vitest/utils': 3.1.1 chai: 5.2.0 debug: 4.4.0 - expect-type: 1.1.0 + expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 - std-env: 3.8.0 + std-env: 3.8.1 tinybench: 2.9.0 tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.1.2(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) - vite-node: 3.0.9(@types/node@22.13.13)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) + vite: 6.1.3(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) + vite-node: 3.1.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.1)(sugarss@4.0.1(postcss@8.5.3)) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 22.13.13 + '@types/node': 22.14.0 happy-dom: 17.4.4 transitivePeerDependencies: - jiti