summaryrefslogtreecommitdiff
path: root/cli/npm
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2023-11-04 12:41:51 -0400
committerGitHub <noreply@github.com>2023-11-04 16:41:51 +0000
commite4c947dd2b63726ecc9b4303e03921b6839adade (patch)
tree9619bdb6649d1f460fb02ab8e448c27c95dbfa74 /cli/npm
parent0b75a7169b2e123cac04e7ffcaf16a28eb356fd0 (diff)
fix(node): use closest package.json to resolve package.json imports (#21075)
Diffstat (limited to 'cli/npm')
-rw-r--r--cli/npm/byonm.rs44
-rw-r--r--cli/npm/managed/mod.rs18
2 files changed, 3 insertions, 59 deletions
diff --git a/cli/npm/byonm.rs b/cli/npm/byonm.rs
index 6ddac42e4..da36e3b53 100644
--- a/cli/npm/byonm.rs
+++ b/cli/npm/byonm.rs
@@ -91,16 +91,16 @@ impl NpmResolver for ByonmCliNpmResolver {
fn inner(
fs: &dyn FileSystem,
name: &str,
- package_root_path: &Path,
referrer: &ModuleSpecifier,
mode: NodeResolutionMode,
) -> Result<PathBuf, AnyError> {
+ let referrer_file = specifier_to_file_path(referrer)?;
let types_pkg_name = if mode.is_types() && !name.starts_with("@types/") {
Some(types_package_name(name))
} else {
None
};
- let mut current_folder = package_root_path;
+ let mut current_folder = referrer_file.parent().unwrap();
loop {
let node_modules_folder = if current_folder.ends_with("node_modules") {
Cow::Borrowed(current_folder)
@@ -135,48 +135,10 @@ impl NpmResolver for ByonmCliNpmResolver {
);
}
- let package_root_path =
- self.resolve_package_folder_from_path(referrer)?.unwrap(); // todo(byonm): don't unwrap
- let path = inner(&*self.fs, name, &package_root_path, referrer, mode)?;
+ let path = inner(&*self.fs, name, referrer, mode)?;
Ok(self.fs.realpath_sync(&path)?)
}
- fn resolve_package_folder_from_path(
- &self,
- specifier: &deno_core::ModuleSpecifier,
- ) -> Result<Option<PathBuf>, AnyError> {
- let path = specifier.to_file_path().unwrap(); // todo(byonm): don't unwrap
- let path = self.fs.realpath_sync(&path)?;
- if self.in_npm_package(specifier) {
- let mut path = path.as_path();
- while let Some(parent) = path.parent() {
- if parent
- .file_name()
- .and_then(|f| f.to_str())
- .map(|s| s.to_ascii_lowercase())
- .as_deref()
- == Some("node_modules")
- {
- return Ok(Some(path.to_path_buf()));
- } else {
- path = parent;
- }
- }
- } else {
- // find the folder with a package.json
- // todo(dsherret): not exactly correct, but good enough for a first pass
- let mut path = path.as_path();
- while let Some(parent) = path.parent() {
- if self.fs.exists_sync(&parent.join("package.json")) {
- return Ok(Some(parent.to_path_buf()));
- } else {
- path = parent;
- }
- }
- }
- Ok(None)
- }
-
fn in_npm_package(&self, specifier: &ModuleSpecifier) -> bool {
specifier.scheme() == "file"
&& specifier
diff --git a/cli/npm/managed/mod.rs b/cli/npm/managed/mod.rs
index 68b5c2134..d59b81912 100644
--- a/cli/npm/managed/mod.rs
+++ b/cli/npm/managed/mod.rs
@@ -505,24 +505,6 @@ impl NpmResolver for ManagedCliNpmResolver {
Ok(path)
}
- fn resolve_package_folder_from_path(
- &self,
- specifier: &ModuleSpecifier,
- ) -> Result<Option<PathBuf>, AnyError> {
- let Some(path) = self
- .fs_resolver
- .resolve_package_folder_from_specifier(specifier)?
- else {
- return Ok(None);
- };
- log::debug!(
- "Resolved package folder of {} to {}",
- specifier,
- path.display()
- );
- Ok(Some(path))
- }
-
fn in_npm_package(&self, specifier: &ModuleSpecifier) -> bool {
let root_dir_url = self.fs_resolver.root_dir_url();
debug_assert!(root_dir_url.as_str().ends_with('/'));