diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2023-03-03 18:27:05 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-03 18:27:05 -0400 |
commit | 84bafd11d52609e74a52df8e57752d5e3c25f717 (patch) | |
tree | cdc282ab3a808bc29987cdb45c0b462ae1e080ec /cli/resolver.rs | |
parent | 5c43e2a665c9dae7aff3ba757e589f10ec3aa062 (diff) |
fix: lazily surface errors in package.json deps parsing (#17974)
Closes #17941
Diffstat (limited to 'cli/resolver.rs')
-rw-r--r-- | cli/resolver.rs | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/cli/resolver.rs b/cli/resolver.rs index e3d2eb37d..46ae16a67 100644 --- a/cli/resolver.rs +++ b/cli/resolver.rs @@ -1,5 +1,6 @@ // Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. +use deno_core::anyhow::anyhow; use deno_core::anyhow::bail; use deno_core::error::AnyError; use deno_core::futures::future; @@ -14,9 +15,9 @@ use deno_graph::source::UnknownBuiltInNodeModuleError; use deno_graph::source::DEFAULT_JSX_IMPORT_SOURCE_MODULE; use deno_runtime::deno_node::is_builtin_node_module; use import_map::ImportMap; -use std::collections::BTreeMap; use std::sync::Arc; +use crate::args::package_json::PackageJsonDeps; use crate::args::JsxImportSourceConfig; use crate::npm::NpmRegistryApi; use crate::npm::NpmResolution; @@ -144,16 +145,19 @@ impl Resolver for CliGraphResolver { fn resolve_package_json_dep( specifier: &str, - deps: &BTreeMap<String, NpmPackageReq>, -) -> Result<Option<ModuleSpecifier>, deno_core::url::ParseError> { - for (bare_specifier, req) in deps { + deps: &PackageJsonDeps, +) -> Result<Option<ModuleSpecifier>, AnyError> { + for (bare_specifier, req_result) in deps { if specifier.starts_with(bare_specifier) { - if specifier.len() == bare_specifier.len() { - return ModuleSpecifier::parse(&format!("npm:{req}")).map(Some); - } let path = &specifier[bare_specifier.len()..]; - if path.starts_with('/') { - return ModuleSpecifier::parse(&format!("npm:/{req}{path}")).map(Some); + if path.is_empty() || path.starts_with('/') { + let req = req_result.as_ref().map_err(|err| { + anyhow!( + "Parsing version constraints in the application-level package.json is more strict at the moment.\n\n{:#}", + err.clone() + ) + })?; + return Ok(Some(ModuleSpecifier::parse(&format!("npm:{req}{path}"))?)); } } } @@ -239,6 +243,8 @@ impl NpmResolver for CliGraphResolver { #[cfg(test)] mod test { + use std::collections::BTreeMap; + use super::*; #[test] @@ -247,7 +253,11 @@ mod test { specifier: &str, deps: &BTreeMap<String, NpmPackageReq>, ) -> Result<Option<String>, String> { - resolve_package_json_dep(specifier, deps) + let deps = deps + .iter() + .map(|(key, value)| (key.to_string(), Ok(value.clone()))) + .collect(); + resolve_package_json_dep(specifier, &deps) .map(|s| s.map(|s| s.to_string())) .map_err(|err| err.to_string()) } @@ -273,7 +283,7 @@ mod test { ); assert_eq!( resolve("package/some_path.ts", &deps).unwrap(), - Some("npm:/package@1.0/some_path.ts".to_string()), + Some("npm:package@1.0/some_path.ts".to_string()), ); assert_eq!( @@ -282,7 +292,7 @@ mod test { ); assert_eq!( resolve("@deno/test/some_path.ts", &deps).unwrap(), - Some("npm:/@deno/test@~0.2/some_path.ts".to_string()), + Some("npm:@deno/test@~0.2/some_path.ts".to_string()), ); // matches the start, but doesn't have the same length or a path assert_eq!(resolve("@deno/testing", &deps).unwrap(), None,); |