Skip to content
Merged
Next Next commit
Traverse upwards for single context projects
  • Loading branch information
nojaf committed Sep 17, 2025
commit 870a6e8382b766e5985e30b2da77be816d820e66
51 changes: 51 additions & 0 deletions rewatch/src/helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -154,12 +154,63 @@ pub fn try_package_path(
} else if path_from_root.exists() {
Ok(path_from_root)
} else {
// As a last resort, when we're in a Single project context, traverse upwards
// starting from the parent of the package root (package_config.path.parent().parent())
// and probe each ancestor's node_modules for the dependency. This covers hoisted
// workspace setups when building a package standalone.
if project_context.monorepo_context.is_none() {
match package_config.path.parent().and_then(|p| p.parent()) {
Some(start_dir) => {
return find_dep_in_upward_node_modules(start_dir, package_name);
}
None => {
log::debug!(
"try_package_path: cannot compute start directory for upward traversal from '{}'",
package_config.path.to_string_lossy()
);
}
}
}

Err(anyhow!(
"The package \"{package_name}\" is not found (are node_modules up-to-date?)..."
))
}
}

fn find_dep_in_upward_node_modules(start_dir: &Path, package_name: &str) -> anyhow::Result<PathBuf> {
log::debug!(
"try_package_path: falling back to upward traversal for '{}' starting at '{}'",
package_name,
start_dir.to_string_lossy()
);

let mut current = Some(start_dir);
while let Some(dir) = current {
let candidate = package_path(dir, package_name);
log::debug!("try_package_path: checking '{}'", candidate.to_string_lossy());
if candidate.exists() {
log::debug!(
"try_package_path: found '{}' at '{}' via upward traversal",
package_name,
candidate.to_string_lossy()
);
return Ok(candidate);
}
current = dir.parent();
}
log::debug!(
"try_package_path: no '{}' found during upward traversal from '{}'",
package_name,
start_dir.to_string_lossy()
);
Err(anyhow!(
"try_package_path: upward traversal did not find '{}' starting at '{}'",
package_name,
start_dir.to_string_lossy()
))
}

pub fn get_abs_path(path: &Path) -> PathBuf {
let abs_path_buf = PathBuf::from(path);

Expand Down