diff --git a/src/package_json.rs b/src/package_json.rs index b4a9a673df..61785f67d2 100644 --- a/src/package_json.rs +++ b/src/package_json.rs @@ -356,4 +356,20 @@ mod tests { Some("1.2.0".to_string()) ); } + + #[test] + fn test_deno_dev_engines() { + let pkg: PackageJson = serde_json::from_str( + r#"{ + "devEngines": { + "runtime": { + "name": "deno", + "version": "1.40.0" + } + } + }"#, + ) + .unwrap(); + assert_eq!(pkg.runtime_version("deno"), Some("1.40.0".to_string())); + } } diff --git a/src/plugins/core/deno.rs b/src/plugins/core/deno.rs index 9314e43dc2..6b6e610ada 100644 --- a/src/plugins/core/deno.rs +++ b/src/plugins/core/deno.rs @@ -120,7 +120,18 @@ impl Backend for DenoPlugin { } async fn idiomatic_filenames(&self) -> Result> { - Ok(vec![".deno-version".into()]) + Ok(vec![".deno-version".into(), "package.json".into()]) + } + + async fn parse_idiomatic_file(&self, path: &Path) -> Result { + if path.file_name().is_some_and(|f| f == "package.json") { + let pkg = crate::package_json::PackageJson::parse(path)?; + return pkg + .runtime_version("deno") + .ok_or_else(|| eyre::eyre!("no deno version found in package.json")); + } + let body = file::read_to_string(path)?; + Ok(body.trim().to_string()) } async fn install_version_(