From e9b10731c40767a9783159faca1406a524ce9be9 Mon Sep 17 00:00:00 2001 From: Florian Hammerschmidt Date: Wed, 6 May 2026 10:31:51 +0200 Subject: [PATCH 1/2] Fix rewatch transitive local workspace detection Signed-off-by: Florian Hammerschmidt --- rewatch/src/build/packages.rs | 73 +++++++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 17 deletions(-) diff --git a/rewatch/src/build/packages.rs b/rewatch/src/build/packages.rs index 7e5c2c6219..958b600b93 100644 --- a/rewatch/src/build/packages.rs +++ b/rewatch/src/build/packages.rs @@ -389,23 +389,7 @@ fn read_dependencies( } }; - let is_local_dep = { - match &project_context.monorepo_context { - None => project_context.current_config.name.as_str() == package_name - , - Some(MonoRepoContext::MonorepoRoot { - local_dependencies, - local_dev_dependencies, - }) => { - local_dependencies.contains(package_name) || local_dev_dependencies.contains(package_name) - }, - Some(MonoRepoContext::MonorepoPackage { - parent_config, - }) => { - helpers::is_local_package(&parent_config.path, &canonical_path) - } - } - }; + let is_local_dep = is_local_dependency(project_context, package_name, &canonical_path); let dependencies = read_dependencies( &mut registered_dependencies_set.to_owned(), @@ -427,6 +411,18 @@ fn read_dependencies( .collect() } +fn is_local_dependency(project_context: &ProjectContext, package_name: &str, canonical_path: &Path) -> bool { + match &project_context.monorepo_context { + None => project_context.current_config.name.as_str() == package_name, + Some(MonoRepoContext::MonorepoRoot { .. }) => { + helpers::is_local_package(project_context.get_root_path(), canonical_path) + } + Some(MonoRepoContext::MonorepoPackage { parent_config }) => { + helpers::is_local_package(&parent_config.path, canonical_path) + } + } +} + fn flatten_dependencies(dependencies: Vec) -> Vec { let mut flattened: Vec = Vec::new(); for dep in dependencies { @@ -1252,11 +1248,13 @@ pub fn validate_packages_dependencies(packages: &AHashMap) -> b #[cfg(test)] mod test { use crate::config; + use crate::project_context::{MonoRepoContext, ProjectContext}; use super::{Namespace, Package, read_issue_tracker_url, read_package_name}; use ahash::{AHashMap, AHashSet}; use std::fs; use std::path::PathBuf; + use std::sync::RwLock; use tempfile::TempDir; pub struct CreatePackageArgs { @@ -1462,6 +1460,47 @@ mod test { assert_eq!(read_issue_tracker_url(temp_dir.path()), None); } + #[test] + fn monorepo_root_marks_transitive_workspace_dependencies_as_local() { + let temp_dir = TempDir::new().unwrap(); + let root = temp_dir.path(); + + let mut local_dependencies = AHashSet::new(); + local_dependencies.insert("direct".to_string()); + + let project_context = ProjectContext { + current_config: config::tests::create_config(config::tests::CreateConfigArgs { + name: "root".to_string(), + bs_deps: vec!["direct".to_string()], + build_dev_deps: vec![], + allowed_dependents: None, + path: root.join("rescript.json"), + }), + monorepo_context: Some(MonoRepoContext::MonorepoRoot { + local_dependencies, + local_dev_dependencies: AHashSet::new(), + }), + node_modules_exist_cache: RwLock::new(AHashMap::new()), + packages_cache: RwLock::new(AHashMap::new()), + }; + + assert!(super::is_local_dependency( + &project_context, + "direct", + &root.join("packages/direct") + )); + assert!(super::is_local_dependency( + &project_context, + "transitive", + &root.join("packages/transitive") + )); + assert!(!super::is_local_dependency( + &project_context, + "external", + &root.join("node_modules/external") + )); + } + fn root_package_with_features( features_map: Option>>, tagged_sources: Vec<(&str, Option<&str>)>, From 033cb5ccfc0929291908833d050319bd8f242ec6 Mon Sep 17 00:00:00 2001 From: Florian Hammerschmidt Date: Wed, 6 May 2026 10:35:35 +0200 Subject: [PATCH 2/2] Add changelog entry for rewatch workspace fix Signed-off-by: Florian Hammerschmidt --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f6bf44c5f4..03c164b64d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ - Fix duplicated comments in `for`..`of` formatter. https://github.com/rescript-lang/rescript/pull/8395 - Fix issue where warning 56 would blow up with `dict{}` patterns. https://github.com/rescript-lang/rescript/pull/8403 - Acquire rewatch build lock before initialization. https://github.com/rescript-lang/rescript/pull/8409 +- Rewatch: treat transitive workspace dependencies as local packages in monorepo roots. https://github.com/rescript-lang/rescript/pull/8411 #### :memo: Documentation