summaryrefslogtreecommitdiff
path: root/ext/node_resolver/resolution.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ext/node_resolver/resolution.rs')
-rw-r--r--ext/node_resolver/resolution.rs38
1 files changed, 30 insertions, 8 deletions
diff --git a/ext/node_resolver/resolution.rs b/ext/node_resolver/resolution.rs
index 25316c385..f4b2e8056 100644
--- a/ext/node_resolver/resolution.rs
+++ b/ext/node_resolver/resolution.rs
@@ -1370,15 +1370,37 @@ impl<TEnv: NodeResolverEnv> NodeResolver<TEnv> {
&self,
file_path: &Path,
) -> Result<Option<PackageJsonRc>, ClosestPkgJsonError> {
+ // we use this for deno compile using byonm because the script paths
+ // won't be in virtual file system, but the package.json paths will be
+ fn canonicalize_first_ancestor_exists(
+ dir_path: &Path,
+ env: &dyn NodeResolverEnv,
+ ) -> Result<Option<PathBuf>, std::io::Error> {
+ for ancestor in dir_path.ancestors() {
+ match env.realpath_sync(ancestor) {
+ Ok(dir_path) => return Ok(Some(dir_path)),
+ Err(err) if err.kind() == std::io::ErrorKind::NotFound => {
+ // keep searching
+ }
+ Err(err) => return Err(err),
+ }
+ }
+ Ok(None)
+ }
+
let parent_dir = file_path.parent().unwrap();
- let current_dir =
- strip_unc_prefix(self.env.realpath_sync(parent_dir).map_err(
- |source| CanonicalizingPkgJsonDirError {
- dir_path: parent_dir.to_path_buf(),
- source,
- },
- )?);
- for current_dir in current_dir.ancestors() {
+ let Some(start_dir) = canonicalize_first_ancestor_exists(
+ parent_dir, &self.env,
+ )
+ .map_err(|source| CanonicalizingPkgJsonDirError {
+ dir_path: parent_dir.to_path_buf(),
+ source,
+ })?
+ else {
+ return Ok(None);
+ };
+ let start_dir = strip_unc_prefix(start_dir);
+ for current_dir in start_dir.ancestors() {
let package_json_path = current_dir.join("package.json");
if let Some(pkg_json) = self.load_package_json(&package_json_path)? {
return Ok(Some(pkg_json));