Compare commits

...

31 Commits

Author SHA1 Message Date
renovate[bot] 567d2d0ea1 chore(deps): update devdependencies (eslint) 2026-07-24 18:41:44 +00:00
renovate[bot] 32d7d83d79 fix(deps): update dependency vite to v6.3.5 (#813)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-23 08:34:11 +02:00
renovate[bot] 0a2ee1ab02 chore(deps): update dependency @vitejs/plugin-react-swc to v3.11.0 (#797)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-22 08:48:20 +02:00
renovate[bot] 77c9e1f7c8 chore(deps): update dependency oxc-transform to v0.77.3 (#825)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-21 08:48:14 +02:00
Valerio Ageno 183f1c498d chore: dedupe upgraded dependencies (#824) 2025-07-20 18:18:41 +02:00
renovate[bot] 3e07d57956 chore(deps): update node.js to v22.17.1 (#808)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-20 18:09:16 +02:00
renovate[bot] d5c0dd4365 chore(deps): update dependency happy-dom to v18 (#817) 2025-07-20 08:50:00 +02:00
renovate[bot] 4d187e506f chore(deps): update dependency typescript to v5.8.3 (#796) 2025-07-19 19:49:28 +02:00
renovate[bot] 71d3440d23 chore(deps): update dependency vitest to v3.2.4 (#806)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-19 18:42:27 +02:00
renovate[bot] 4856af992b fix(deps): update rust crate tungstenite to 0.27.0 (#816)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-19 18:42:16 +02:00
renovate[bot] 6ccc91c4a8 fix(deps): update rust crate tokio-tungstenite to 0.27.0 (#815)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-19 18:35:56 +02:00
renovate[bot] 468bc48a0c chore(deps): update pnpm to v10.13.1 (#809)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-19 18:34:37 +02:00
renovate[bot] 1ef6a9dc90 fix(deps): update dependency prettier to v3.6.2 (#812)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-19 18:33:25 +02:00
renovate[bot] 27c546d8e3 fix(deps): update rust crate colored to v3 (#819)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-19 18:32:56 +02:00
renovate[bot] fbaf411992 fix(deps): update rust crate console to 0.16.0 (#814)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-19 18:31:53 +02:00
renovate[bot] 403d548a07 fix(deps): update babel monorepo (#810)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-19 18:30:56 +02:00
renovate[bot] be48dbda09 fix(deps): update dependency @vitejs/plugin-react-swc to v3.11.0 (#811)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-19 18:30:44 +02:00
renovate[bot] 038d9e4a46 chore(deps): update dependency oxc-transform to v0.77.2 (#802)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-19 18:29:57 +02:00
renovate[bot] a5dd7cb537 chore(deps): update dependency turbo to v2.5.5 (#799)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-19 18:24:30 +02:00
renovate[bot] 8ac2132a2e chore(deps): update react monorepo (#794)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-19 18:21:39 +02:00
renovate[bot] bc49ec3193 chore(deps): update dependency @playwright/test to v1.54.1 (#800)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-19 18:19:42 +02:00
renovate[bot] 022b548af1 chore(deps): update dependency happy-dom to v17.6.3 (#792)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-19 18:08:18 +02:00
Valerio Ageno a1f5811eda fix: lifetime notation (#798) 2025-07-19 17:49:49 +02:00
renovate[bot] 5990cf3d27 chore(deps): update dependency @vitejs/plugin-react-swc to v3.10.1 (#787) 2025-06-03 14:22:54 +02:00
renovate[bot] c0719c6edb chore(deps): update react monorepo (#782) 2025-06-03 07:33:36 +02:00
renovate[bot] 9404946269 chore(deps): update dependency oxc-transform to v0.72.2 (#789) 2025-06-03 07:32:12 +02:00
renovate[bot] eab8d67203 chore(deps): update dependency turbo to v2.5.4 (#790) 2025-06-03 07:32:04 +02:00
renovate[bot] a9a76f8b09 chore(deps): update dependency happy-dom to v17.6.1 (#791) 2025-06-03 07:31:55 +02:00
renovate[bot] f7ba80c5c4 chore(deps): update dependency @vitest/eslint-plugin to v1.2.1 (#774)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-27 08:56:09 +02:00
renovate[bot] a4667c4c2c chore(deps): update dependency @playwright/test to v1.52.0 (#786)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-27 08:55:57 +02:00
renovate[bot] 998a3191b4 chore(deps): update dependency oxc-transform to v0.72.0 (#788)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-27 08:55:45 +02:00
21 changed files with 1966 additions and 967 deletions
+1 -1
View File
@@ -1 +1 @@
22.14.0
22.17.1
+2 -2
View File
@@ -23,7 +23,7 @@ tracing = "0.1.41"
tracing-subscriber = {version = "0.3.19", features = ["env-filter"]}
miette = "7.2.0"
colored = "2.1.0"
colored = "3.0.0"
once_cell = "1.19.0"
watchexec = "5.0.0"
watchexec-signals = "4.0.0"
@@ -39,7 +39,7 @@ fs_extra = "1.3.0"
http = "1.1.0"
tuono_internal = {path = "../tuono_internal", version = "0.19.7"}
spinners = "4.1.1"
console = "0.15.10"
console = "0.16.0"
convert_case = "0.8.0"
[dev-dependencies]
+2 -3
View File
@@ -164,10 +164,9 @@ impl App {
std::net::TcpListener::bind(format!("{}:{}", config.server.host, vite_port));
if let Err(_e) = vite_listener {
eprintln!("Error: Failed to bind to port {}", vite_port);
eprintln!("Error: Failed to bind to port {vite_port}");
eprintln!(
"Please ensure that port {} is not already in use by another process or application.",
vite_port
"Please ensure that port {vite_port} is not already in use by another process or application."
);
std::process::exit(1);
}
+8 -10
View File
@@ -33,7 +33,7 @@ struct GithubTreeResponse<T> {
}
fn exit_with_error(message: &str) -> ! {
eprintln!("{}", message);
eprintln!("{message}");
std::process::exit(1);
}
@@ -125,7 +125,7 @@ pub fn create_new_project(
let folder_path = current_dir.join(folder_name);
create_directories(&new_project_files, &folder_path, &template)
.unwrap_or_else(|err| exit_with_error(&format!("Failed to create directories: {}", err)));
.unwrap_or_else(|err| exit_with_error(&format!("Failed to create directories: {err}")));
for GithubFile {
element_type, path, ..
@@ -231,19 +231,17 @@ fn update_package_json_version(folder_path: &Path) -> io::Result<()> {
let v = crate_version!();
let package_json_path = folder_path.join(PathBuf::from("package.json"));
let package_json = fs::read_to_string(&package_json_path)
.unwrap_or_else(|err| exit_with_error(&format!("Failed to read package.json: {}", err)));
.unwrap_or_else(|err| exit_with_error(&format!("Failed to read package.json: {err}")));
let package_json = package_json.replace("link:../../packages/tuono", v);
let mut file = OpenOptions::new()
.write(true)
.truncate(true)
.open(package_json_path)
.unwrap_or_else(|err| exit_with_error(&format!("Failed to open package.json: {}", err)));
.unwrap_or_else(|err| exit_with_error(&format!("Failed to open package.json: {err}")));
file.write_all(package_json.as_bytes())
.unwrap_or_else(|err| {
exit_with_error(&format!("Failed to write to package.json: {}", err))
});
.unwrap_or_else(|err| exit_with_error(&format!("Failed to write to package.json: {err}")));
Ok(())
}
@@ -252,7 +250,7 @@ fn update_cargo_toml_version(folder_path: &Path) -> io::Result<()> {
let v = crate_version!();
let cargo_toml_path = folder_path.join(PathBuf::from("Cargo.toml"));
let cargo_toml = fs::read_to_string(&cargo_toml_path)
.unwrap_or_else(|err| exit_with_error(&format!("Failed to read Cargo.toml: {}", err)));
.unwrap_or_else(|err| exit_with_error(&format!("Failed to read Cargo.toml: {err}")));
let cargo_toml = cargo_toml.replace(
"{ path = \"../../crates/tuono_lib/\" }",
&format!("\"{v}\""),
@@ -262,10 +260,10 @@ fn update_cargo_toml_version(folder_path: &Path) -> io::Result<()> {
.write(true)
.truncate(true)
.open(cargo_toml_path)
.unwrap_or_else(|err| exit_with_error(&format!("Failed to open Cargo.toml: {}", err)));
.unwrap_or_else(|err| exit_with_error(&format!("Failed to open Cargo.toml: {err}")));
file.write_all(cargo_toml.as_bytes())
.unwrap_or_else(|err| exit_with_error(&format!("Failed to write to Cargo.toml: {}", err)));
.unwrap_or_else(|err| exit_with_error(&format!("Failed to write to Cargo.toml: {err}")));
Ok(())
}
+1 -1
View File
@@ -94,7 +94,7 @@ impl ProcessManager {
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);
let server_base_url = format!("http://{server_address}");
println!();
tuono_println!("⚡ Tuono v{}", crate_version!());
+10 -17
View File
@@ -169,7 +169,7 @@ impl Route {
trace!("Requesting the page: {}", url);
let mut response = match reqwest.get(format!("http://localhost:3000{path}")).send() {
Ok(response) => response,
Err(_) => return Err(format!("Failed to get the response: {}", url)),
Err(_) => return Err(format!("Failed to get the response: {url}")),
};
let file_path = self.output_file_path();
@@ -177,18 +177,14 @@ impl Route {
let parent_dir = match file_path.parent() {
Some(parent_dir) => parent_dir,
None => {
return Err(format!(
"Failed to get the parent directory {:?}",
file_path
));
return Err(format!("Failed to get the parent directory {file_path:?}"));
}
};
if !parent_dir.is_dir() {
if let Err(err) = create_all(parent_dir, false) {
return Err(format!(
"Failed to create the parent directory {:?}\nError: {err}",
parent_dir
"Failed to create the parent directory {parent_dir:?}\nError: {err}"
));
}
}
@@ -197,11 +193,11 @@ impl Route {
let mut file = match File::create(&file_path) {
Ok(file) => file,
Err(_) => return Err(format!("Failed to create the file: {:?}", file_path)),
Err(_) => return Err(format!("Failed to create the file: {file_path:?}")),
};
if io::copy(&mut response, &mut file).is_err() {
return Err(format!("Failed to write the file: {:?}", file_path));
return Err(format!("Failed to write the file: {file_path:?}"));
}
// Saving also the server response
@@ -214,8 +210,7 @@ impl Route {
Some(parent_dir) => parent_dir,
None => {
return Err(format!(
"Failed to get the parent directory {:?}",
data_file_path
"Failed to get the parent directory {data_file_path:?}"
));
}
};
@@ -223,8 +218,7 @@ impl Route {
if !data_parent_dir.is_dir() {
if let Err(err) = create_all(data_parent_dir, false) {
return Err(format!(
"Failed to create the parent directory {:?}\n Error: {err}",
data_parent_dir
"Failed to create the parent directory {data_parent_dir:?}\n Error: {err}"
));
}
}
@@ -253,8 +247,7 @@ impl Route {
Ok(file) => file,
Err(_) => {
return Err(format!(
"Failed to create the JSON file: {:?}",
data_file_path
"Failed to create the JSON file: {data_file_path:?}"
));
}
};
@@ -274,10 +267,10 @@ impl Route {
.iter()
.any(|extension| self.path.ends_with(extension))
{
return PathBuf::from(format!("out/static{}", cleaned_path));
return PathBuf::from(format!("out/static{cleaned_path}"));
}
PathBuf::from(format!("out/static{}/index.html", cleaned_path))
PathBuf::from(format!("out/static{cleaned_path}/index.html"))
}
}
@@ -22,7 +22,7 @@ pub fn parse_enum(element: &syn::ItemEnum) -> (String, String) {
match &variant.fields {
syn::Fields::Named(field) => {
parsed_variant = format!("{{\"{}\": {{ ", parsed_variant);
parsed_variant = format!("{{\"{parsed_variant}\": {{ ");
let mut variant_fields: Vec<String> = Vec::new();
for field in &field.named {
@@ -79,7 +79,7 @@ mod tests {
}
"#;
let parsed_enum = syn::parse_str::<syn::ItemEnum>(&enum_str).unwrap();
let parsed_enum = syn::parse_str::<syn::ItemEnum>(enum_str).unwrap();
let (enum_name, typescript_definition) = parse_enum(&parsed_enum);
assert_eq!(enum_name, "MyEnum");
@@ -101,7 +101,7 @@ mod tests {
}
"#;
let parsed_enum = syn::parse_str::<syn::ItemEnum>(&enum_str).unwrap();
let parsed_enum = syn::parse_str::<syn::ItemEnum>(enum_str).unwrap();
let (enum_name, typescript_definition) = parse_enum(&parsed_enum);
assert_eq!(enum_name, "MyEnum");
@@ -125,7 +125,7 @@ mod tests {
}
"#;
let parsed_enum = syn::parse_str::<syn::ItemEnum>(&enum_str).unwrap();
let parsed_enum = syn::parse_str::<syn::ItemEnum>(enum_str).unwrap();
let (_, typescript_definition) = parse_enum(&parsed_enum);
assert_eq!(
@@ -147,7 +147,7 @@ mod tests {
}
"#;
let parsed_enum = syn::parse_str::<syn::ItemEnum>(&enum_str).unwrap();
let parsed_enum = syn::parse_str::<syn::ItemEnum>(enum_str).unwrap();
let (_, typescript_definition) = parse_enum(&parsed_enum);
assert_eq!(
@@ -167,7 +167,7 @@ mod tests {
}
"#;
let parsed_enum = syn::parse_str::<syn::ItemEnum>(&enum_str).unwrap();
let parsed_enum = syn::parse_str::<syn::ItemEnum>(enum_str).unwrap();
let (_, typescript_definition) = parse_enum(&parsed_enum);
assert_eq!(
@@ -187,7 +187,7 @@ mod tests {
}
"#;
let parsed_enum = syn::parse_str::<syn::ItemEnum>(&enum_str).unwrap();
let parsed_enum = syn::parse_str::<syn::ItemEnum>(enum_str).unwrap();
let (_, typescript_definition) = parse_enum(&parsed_enum);
assert_eq!(
@@ -209,7 +209,7 @@ mod tests {
}
"#;
let parsed_enum = syn::parse_str::<syn::ItemEnum>(&enum_str).unwrap();
let parsed_enum = syn::parse_str::<syn::ItemEnum>(enum_str).unwrap();
let (enum_name, typescript_definition) = parse_enum(&parsed_enum);
assert_eq!(enum_name, "MyEnum");
@@ -229,7 +229,7 @@ mod tests {
}
"#;
let parsed_enum = syn::parse_str::<syn::ItemEnum>(&enum_str).unwrap();
let parsed_enum = syn::parse_str::<syn::ItemEnum>(enum_str).unwrap();
let (_, typescript_definition) = parse_enum(&parsed_enum);
assert_eq!(
+4 -4
View File
@@ -114,11 +114,11 @@ fn it_successfully_import_mixed_case_routes() {
for method in ["get", "post", "put", "delete", "patch"] {
temp_tuono_project.add_file_with_content(
&format!("./src/routes/api/{}_lower.rs", method),
&format!(r"#[tuono_lib::api({})]", method),
&format!("./src/routes/api/{method}_lower.rs"),
&format!(r"#[tuono_lib::api({method})]"),
);
temp_tuono_project.add_file_with_content(
&format!("./src/routes/api/{}_upper.rs", method),
&format!("./src/routes/api/{method}_upper.rs"),
&format!(r"#[tuono_lib::api({})]", method.to_uppercase()),
);
}
@@ -136,7 +136,7 @@ fn it_successfully_import_mixed_case_routes() {
fs::read_to_string(&temp_main_rs_path).expect("Failed to read '.tuono/main.rs' content.");
for method in ["get", "post", "put", "delete", "patch"] {
let expected = format!(r#"use tuono_lib::axum::routing::{};"#, method);
let expected = format!(r#"use tuono_lib::axum::routing::{method};"#);
let imports = temp_main_rs_content.match_indices(&expected);
assert_eq!(imports.count(), 1);
}
@@ -24,9 +24,8 @@ impl GitHubServerMock {
);
Mock::given(method("GET"))
.and(path(&format!(
"repos/tuono-labs/tuono/git/ref/tags/v{}",
tuono_version
.and(path(format!(
"repos/tuono-labs/tuono/git/ref/tags/v{tuono_version}"
)))
.respond_with(sha_response_template)
.mount(&server)
@@ -57,7 +56,7 @@ impl GitHubServerMock {
);
Mock::given(method("GET"))
.and(path(&format!("repos/tuono-labs/tuono/git/trees/{}", sha)))
.and(path(format!("repos/tuono-labs/tuono/git/trees/{sha}")))
.respond_with(tree_response_template)
.mount(&server)
.await;
+6
View File
@@ -13,6 +13,12 @@ pub struct TempTuonoProject {
temp_dir: TempDir,
}
impl Default for TempTuonoProject {
fn default() -> Self {
Self::new()
}
}
impl TempTuonoProject {
pub fn new() -> Self {
let original_dir = env::current_dir().expect("Failed to read current_dir");
+2 -2
View File
@@ -35,9 +35,9 @@ colored = "3.0.0"
tuono_lib_macros = {path = "../tuono_lib_macros", version = "0.19.7"}
tuono_internal = {path = "../tuono_internal", version = "0.19.7"}
# Match the same version used by axum
tokio-tungstenite = "0.26.0"
tokio-tungstenite = "0.27.0"
futures-util = { version = "0.3", default-features = false, features = ["sink", "std"] }
tungstenite = "0.26.0"
tungstenite = "0.27.0"
http = "1.1.0"
pin-project = "1.1.7"
tower = "0.5.1"
+2 -2
View File
@@ -16,9 +16,9 @@ pub unsafe fn load_env_vars(mode: Mode) {
Mode::Prod => "production",
};
env_files.push(format!(".env.{}", mode_name));
env_files.push(format!(".env.{mode_name}"));
env_files.push(String::from(".env.local"));
env_files.push(format!(".env.{}.local", mode_name));
env_files.push(format!(".env.{mode_name}.local"));
let system_env_names: HashSet<String> = env::vars().map(|(k, _)| k).collect();
+1 -1
View File
@@ -120,7 +120,7 @@ mod tests {
}
}"#;
fn prepare_payload(uri: Option<&str>, mode: Mode) -> Payload {
fn prepare_payload(uri: Option<&str>, mode: Mode) -> Payload<'_> {
let manifest_mock = serde_json::from_str::<ViteManifest>(MANIFEST_EXAMPLE)
.expect("Failed to parse the manifest example");
MANIFEST.get_or_init(|| manifest_mock.into());
+2 -2
View File
@@ -26,14 +26,14 @@ pub async fn vite_reverse_proxy(
let query_string = query
.0
.iter()
.map(|(k, v)| format!("{}={}", k, v))
.map(|(k, v)| format!("{k}={v}"))
.collect::<Vec<_>>()
.join("&");
let query_string = if query_string.is_empty() {
String::new()
} else {
format!("?{}", query_string)
format!("?{query_string}")
};
match client
+1 -1
View File
@@ -15,7 +15,7 @@ pub fn api_core(attrs: TokenStream, item: TokenStream) -> TokenStream {
.to_lowercase();
let api_fn_name = Ident::new(
&format!("{}_tuono_internal_api", http_method),
&format!("{http_method}_tuono_internal_api"),
Span::call_site().into(),
);
+1 -1
View File
@@ -15,7 +15,7 @@
"types": "tsc --noEmit"
},
"devDependencies": {
"oxc-transform": "0.63.0",
"oxc-transform": "0.77.3",
"rollup-plugin-preserve-directives": "0.4.0",
"unplugin-isolated-decl": "0.13.6",
"vite": "6.1.3",
+11 -11
View File
@@ -2,7 +2,7 @@
"name": "workspace",
"private": true,
"type": "module",
"packageManager": "pnpm@10.7.1+sha512.2d92c86b7928dc8284f53494fb4201f983da65f0fb4f0d40baafa5cf628fa31dae3e5968f12466f17df7e97310e30f343a648baea1b9b350685dafafffdf5808",
"packageManager": "pnpm@10.13.1+sha512.37ebf1a5c7a30d5fabe0c5df44ee8da4c965ca0c5af3dbab28c3a1681b70a256218d05c81c9c0dcf767ef6b8551eb5b960042b9ed4300c59242336377e01cfad",
"scripts": {
"dev": "turbo dev --filter=./devtools/* --filter=./packages/*",
"build": "turbo build --filter=./devtools/* --filter=./packages/*",
@@ -25,18 +25,18 @@
"author": "Valerio Ageno",
"license": "MIT",
"devDependencies": {
"@eslint/js": "9.24.0",
"@playwright/test": "1.51.1",
"@types/node": "22.14.1",
"@vitest/eslint-plugin": "1.1.42",
"eslint": "9.24.0",
"eslint-import-resolver-typescript": "4.3.2",
"eslint-plugin-import": "2.31.0",
"@eslint/js": "9.39.5",
"@playwright/test": "1.54.1",
"@types/node": "22.16.5",
"@vitest/eslint-plugin": "1.2.1",
"eslint": "9.39.5",
"eslint-import-resolver-typescript": "4.4.5",
"eslint-plugin-import": "2.32.0",
"eslint-plugin-react": "7.37.5",
"eslint-plugin-react-hooks": "5.2.0",
"prettier": "3.5.3",
"turbo": "2.5.3",
"typescript": "5.7.3",
"typescript-eslint": "8.29.1"
"turbo": "2.5.5",
"typescript": "5.8.3",
"typescript-eslint": "8.65.0"
}
}
@@ -46,6 +46,6 @@
"devDependencies": {
"@types/babel__core": "7.20.5",
"vite-config": "workspace:*",
"vitest": "3.1.4"
"vitest": "3.2.4"
}
}
+4 -4
View File
@@ -45,12 +45,12 @@
},
"devDependencies": {
"@testing-library/react": "16.3.0",
"@types/react": "19.1.3",
"@vitejs/plugin-react-swc": "3.8.1",
"happy-dom": "17.4.7",
"@types/react": "19.1.8",
"@vitejs/plugin-react-swc": "3.11.0",
"happy-dom": "18.0.1",
"react": "19.1.0",
"vite": "6.1.3",
"vite-config": "workspace:*",
"vitest": "3.1.4"
"vitest": "3.2.4"
}
}
+4 -4
View File
@@ -80,13 +80,13 @@
"devDependencies": {
"@types/babel__core": "7.20.5",
"@types/babel__traverse": "7.20.7",
"@types/node": "22.14.1",
"@types/react": "19.1.3",
"@types/react-dom": "19.1.3",
"@types/node": "22.16.5",
"@types/react": "19.1.8",
"@types/react-dom": "19.1.6",
"react": "19.1.0",
"react-dom": "19.1.0",
"vite-config": "workspace:*",
"vitest": "3.1.4"
"vitest": "3.2.4"
},
"sideEffects": false,
"keywords": [
+1891 -887
View File
File diff suppressed because it is too large Load Diff