mirror of
https://github.com/tuono-labs/tuono
synced 2026-07-27 13:52:47 -07:00
Compare commits
31 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 567d2d0ea1 | |||
| 32d7d83d79 | |||
| 0a2ee1ab02 | |||
| 77c9e1f7c8 | |||
| 183f1c498d | |||
| 3e07d57956 | |||
| d5c0dd4365 | |||
| 4d187e506f | |||
| 71d3440d23 | |||
| 4856af992b | |||
| 6ccc91c4a8 | |||
| 468bc48a0c | |||
| 1ef6a9dc90 | |||
| 27c546d8e3 | |||
| fbaf411992 | |||
| 403d548a07 | |||
| be48dbda09 | |||
| 038d9e4a46 | |||
| a5dd7cb537 | |||
| 8ac2132a2e | |||
| bc49ec3193 | |||
| 022b548af1 | |||
| a1f5811eda | |||
| 5990cf3d27 | |||
| c0719c6edb | |||
| 9404946269 | |||
| eab8d67203 | |||
| a9a76f8b09 | |||
| f7ba80c5c4 | |||
| a4667c4c2c | |||
| 998a3191b4 |
@@ -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]
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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(())
|
||||
}
|
||||
|
||||
@@ -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
@@ -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!(
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(),
|
||||
);
|
||||
|
||||
|
||||
@@ -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
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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": [
|
||||
|
||||
Generated
+1891
-887
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user