1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-28 16:20:57 -05:00

fix(npm): use more relaxed package.json version constraint parsing (#24202)

This commit is contained in:
David Sherret 2024-06-13 18:29:27 -04:00 committed by Bartek Iwańczuk
parent 22f277969e
commit b0fc1118fd
No known key found for this signature in database
GPG key ID: 0C6BCDDC3B3AD750
7 changed files with 41 additions and 22 deletions

4
Cargo.lock generated
View file

@ -1853,9 +1853,9 @@ dependencies = [
[[package]] [[package]]
name = "deno_semver" name = "deno_semver"
version = "0.5.4" version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b49e14effd9df8ed261f7a1a34ac19bbaf0fa940c59bd19a6d8313cf41525e1c" checksum = "389b5a8c2dd48cc1aad25396c92d7461ddb0fcfae1faf8e00205837c53e34d3e"
dependencies = [ dependencies = [
"monch", "monch",
"once_cell", "once_cell",

View file

@ -74,7 +74,7 @@ deno_lint = { version = "=0.60.0", features = ["docs"] }
deno_lockfile.workspace = true deno_lockfile.workspace = true
deno_npm = "=0.21.4" deno_npm = "=0.21.4"
deno_runtime = { workspace = true, features = ["include_js_files_for_snapshotting"] } deno_runtime = { workspace = true, features = ["include_js_files_for_snapshotting"] }
deno_semver = "=0.5.4" deno_semver = "=0.5.6"
deno_task_shell = "=0.16.1" deno_task_shell = "=0.16.1"
deno_terminal.workspace = true deno_terminal.workspace = true
eszip = "=0.71.0" eszip = "=0.71.0"

View file

@ -7,16 +7,16 @@ use deno_core::anyhow::bail;
use deno_core::error::AnyError; use deno_core::error::AnyError;
use deno_npm::registry::parse_dep_entry_name_and_raw_version; use deno_npm::registry::parse_dep_entry_name_and_raw_version;
use deno_runtime::deno_node::PackageJson; use deno_runtime::deno_node::PackageJson;
use deno_semver::npm::NpmVersionReqParseError;
use deno_semver::package::PackageReq; use deno_semver::package::PackageReq;
use deno_semver::VersionReq; use deno_semver::VersionReq;
use deno_semver::VersionReqSpecifierParseError;
use indexmap::IndexMap; use indexmap::IndexMap;
use thiserror::Error; use thiserror::Error;
#[derive(Debug, Error, Clone)] #[derive(Debug, Error, Clone)]
pub enum PackageJsonDepValueParseError { pub enum PackageJsonDepValueParseError {
#[error(transparent)] #[error(transparent)]
Specifier(#[from] VersionReqSpecifierParseError), VersionReq(#[from] NpmVersionReqParseError),
#[error("Not implemented scheme '{scheme}'")] #[error("Not implemented scheme '{scheme}'")]
Unsupported { scheme: String }, Unsupported { scheme: String },
} }
@ -75,13 +75,13 @@ pub fn get_local_package_json_version_reqs(
}); });
} }
let (name, version_req) = parse_dep_entry_name_and_raw_version(key, value); let (name, version_req) = parse_dep_entry_name_and_raw_version(key, value);
let result = VersionReq::parse_from_specifier(version_req); let result = VersionReq::parse_from_npm(version_req);
match result { match result {
Ok(version_req) => Ok(PackageReq { Ok(version_req) => Ok(PackageReq {
name: name.to_string(), name: name.to_string(),
version_req, version_req,
}), }),
Err(err) => Err(PackageJsonDepValueParseError::Specifier(err)), Err(err) => Err(PackageJsonDepValueParseError::VersionReq(err)),
} }
} }
@ -208,7 +208,7 @@ mod test {
let mut package_json = PackageJson::empty(PathBuf::from("/package.json")); let mut package_json = PackageJson::empty(PathBuf::from("/package.json"));
package_json.dependencies = Some(IndexMap::from([( package_json.dependencies = Some(IndexMap::from([(
"test".to_string(), "test".to_string(),
"1.x - 1.3".to_string(), "%*(#$%()".to_string(),
)])); )]));
let map = get_local_package_json_version_reqs_for_tests(&package_json); let map = get_local_package_json_version_reqs_for_tests(&package_json);
assert_eq!( assert_eq!(
@ -217,8 +217,8 @@ mod test {
"test".to_string(), "test".to_string(),
Err( Err(
concat!( concat!(
"Invalid specifier version requirement. Unexpected character.\n", "Invalid npm version requirement. Unexpected character.\n",
" - 1.3\n", " %*(#$%()\n",
" ~" " ~"
) )
.to_string() .to_string()
@ -227,6 +227,26 @@ mod test {
); );
} }
#[test]
fn test_get_local_package_json_version_reqs_range() {
let mut package_json = PackageJson::empty(PathBuf::from("/package.json"));
package_json.dependencies = Some(IndexMap::from([(
"test".to_string(),
"1.x - 1.3".to_string(),
)]));
let map = get_local_package_json_version_reqs_for_tests(&package_json);
assert_eq!(
map,
IndexMap::from([(
"test".to_string(),
Ok(PackageReq {
name: "test".to_string(),
version_req: VersionReq::parse_from_npm("1.x - 1.3").unwrap()
})
)])
);
}
#[test] #[test]
fn test_get_local_package_json_version_reqs_skips_certain_specifiers() { fn test_get_local_package_json_version_reqs_skips_certain_specifiers() {
let mut package_json = PackageJson::empty(PathBuf::from("/package.json")); let mut package_json = PackageJson::empty(PathBuf::from("/package.json"));

View file

@ -24,6 +24,7 @@ use deno_core::futures::AsyncSeekExt;
use deno_core::serde_json; use deno_core::serde_json;
use deno_core::url::Url; use deno_core::url::Url;
use deno_npm::NpmSystemInfo; use deno_npm::NpmSystemInfo;
use deno_semver::npm::NpmVersionReqParseError;
use deno_semver::package::PackageReq; use deno_semver::package::PackageReq;
use deno_semver::VersionReqSpecifierParseError; use deno_semver::VersionReqSpecifierParseError;
use log::Level; use log::Level;
@ -55,15 +56,15 @@ const MAGIC_TRAILER: &[u8; 8] = b"d3n0l4nd";
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
enum SerializablePackageJsonDepValueParseError { enum SerializablePackageJsonDepValueParseError {
Specifier(String), VersionReq(String),
Unsupported { scheme: String }, Unsupported { scheme: String },
} }
impl SerializablePackageJsonDepValueParseError { impl SerializablePackageJsonDepValueParseError {
pub fn from_err(err: PackageJsonDepValueParseError) -> Self { pub fn from_err(err: PackageJsonDepValueParseError) -> Self {
match err { match err {
PackageJsonDepValueParseError::Specifier(err) => { PackageJsonDepValueParseError::VersionReq(err) => {
Self::Specifier(err.source.to_string()) Self::VersionReq(err.source.to_string())
} }
PackageJsonDepValueParseError::Unsupported { scheme } => { PackageJsonDepValueParseError::Unsupported { scheme } => {
Self::Unsupported { scheme } Self::Unsupported { scheme }
@ -73,12 +74,10 @@ impl SerializablePackageJsonDepValueParseError {
pub fn into_err(self) -> PackageJsonDepValueParseError { pub fn into_err(self) -> PackageJsonDepValueParseError {
match self { match self {
SerializablePackageJsonDepValueParseError::Specifier(source) => { SerializablePackageJsonDepValueParseError::VersionReq(source) => {
PackageJsonDepValueParseError::Specifier( PackageJsonDepValueParseError::VersionReq(NpmVersionReqParseError {
VersionReqSpecifierParseError { source: monch::ParseErrorFailureError::new(source),
source: monch::ParseErrorFailureError::new(source), })
},
)
} }
SerializablePackageJsonDepValueParseError::Unsupported { scheme } => { SerializablePackageJsonDepValueParseError::Unsupported { scheme } => {
PackageJsonDepValueParseError::Unsupported { scheme } PackageJsonDepValueParseError::Unsupported { scheme }

View file

@ -2,7 +2,7 @@
"name": "npmrc_test", "name": "npmrc_test",
"version": "0.0.1", "version": "0.0.1",
"dependencies": { "dependencies": {
"@denotest/basic": "1.0.0", "@denotest/basic": "^=1.0.0",
"@denotest2/basic": "1.0.0" "@denotest2/basic": "1.0.0"
} }
} }

View file

@ -1,6 +1,6 @@
error: Parsing version constraints in the application-level package.json is more strict at the moment. error: Parsing version constraints in the application-level package.json is more strict at the moment.
Invalid specifier version requirement. Unexpected character. Invalid npm version requirement. Unexpected character.
invalid stuff that won't parse invalid stuff that won't parse
~ ~
at file:///[WILDCARD]/error.ts:2:23 at file:///[WILDCARD]/error.ts:2:23

View file

@ -1,4 +1,4 @@
Warning Ignoring dependency '@denotest/cjs-default-export' in package.json because its version requirement failed to parse: Invalid specifier version requirement. Unexpected character. Warning Ignoring dependency '@denotest/cjs-default-export' in package.json because its version requirement failed to parse: Invalid npm version requirement. Unexpected character.
invalid stuff that won't parse invalid stuff that won't parse
~ ~
Task test echo 1 Task test echo 1