summaryrefslogtreecommitdiff
path: root/cli/resolver.rs
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2023-03-03 18:27:05 -0400
committerGitHub <noreply@github.com>2023-03-03 18:27:05 -0400
commit84bafd11d52609e74a52df8e57752d5e3c25f717 (patch)
treecdc282ab3a808bc29987cdb45c0b462ae1e080ec /cli/resolver.rs
parent5c43e2a665c9dae7aff3ba757e589f10ec3aa062 (diff)
fix: lazily surface errors in package.json deps parsing (#17974)
Closes #17941
Diffstat (limited to 'cli/resolver.rs')
-rw-r--r--cli/resolver.rs34
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,);