Skip to content

Commit ad7bceb

Browse files
fhammerschmidtcknitt
authored andcommitted
Fix rewatch transitive local workspace detection (#8411)
* Fix rewatch transitive local workspace detection Signed-off-by: Florian Hammerschmidt <florianh89@gmail.com> * Add changelog entry for rewatch workspace fix Signed-off-by: Florian Hammerschmidt <florianh89@gmail.com> --------- Signed-off-by: Florian Hammerschmidt <florianh89@gmail.com> # Conflicts: # CHANGELOG.md # rewatch/src/build/packages.rs
1 parent 2100788 commit ad7bceb

2 files changed

Lines changed: 56 additions & 17 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
- Fix issue where warning 56 would blow up with `dict{}` patterns. https://github.com/rescript-lang/rescript/pull/8403
3333
- Acquire rewatch build lock before initialization. https://github.com/rescript-lang/rescript/pull/8409
3434
- Close remaining rewatch build.lock gaps. https://github.com/rescript-lang/rescript/pull/8410
35+
- Rewatch: treat transitive workspace dependencies as local packages in monorepo roots. https://github.com/rescript-lang/rescript/pull/8411
3536

3637
#### :nail_care: Polish
3738

rewatch/src/build/packages.rs

Lines changed: 55 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -377,23 +377,7 @@ fn read_dependencies(
377377
}
378378
};
379379

380-
let is_local_dep = {
381-
match &project_context.monorepo_context {
382-
None => project_context.current_config.name.as_str() == package_name
383-
,
384-
Some(MonoRepoContext::MonorepoRoot {
385-
local_dependencies,
386-
local_dev_dependencies,
387-
}) => {
388-
local_dependencies.contains(package_name) || local_dev_dependencies.contains(package_name)
389-
},
390-
Some(MonoRepoContext::MonorepoPackage {
391-
parent_config,
392-
}) => {
393-
helpers::is_local_package(&parent_config.path, &canonical_path)
394-
}
395-
}
396-
};
380+
let is_local_dep = is_local_dependency(project_context, package_name, &canonical_path);
397381

398382
let dependencies = read_dependencies(
399383
&mut registered_dependencies_set.to_owned(),
@@ -414,6 +398,18 @@ fn read_dependencies(
414398
.collect()
415399
}
416400

401+
fn is_local_dependency(project_context: &ProjectContext, package_name: &str, canonical_path: &Path) -> bool {
402+
match &project_context.monorepo_context {
403+
None => project_context.current_config.name.as_str() == package_name,
404+
Some(MonoRepoContext::MonorepoRoot { .. }) => {
405+
helpers::is_local_package(project_context.get_root_path(), canonical_path)
406+
}
407+
Some(MonoRepoContext::MonorepoPackage { parent_config }) => {
408+
helpers::is_local_package(&parent_config.path, canonical_path)
409+
}
410+
}
411+
}
412+
417413
fn flatten_dependencies(dependencies: Vec<Dependency>) -> Vec<Dependency> {
418414
let mut flattened: Vec<Dependency> = Vec::new();
419415
for dep in dependencies {
@@ -1035,11 +1031,13 @@ pub fn validate_packages_dependencies(packages: &AHashMap<String, Package>) -> b
10351031
#[cfg(test)]
10361032
mod test {
10371033
use crate::config;
1034+
use crate::project_context::{MonoRepoContext, ProjectContext};
10381035

10391036
use super::{Namespace, Package, read_package_name};
10401037
use ahash::{AHashMap, AHashSet};
10411038
use std::fs;
10421039
use std::path::PathBuf;
1040+
use std::sync::RwLock;
10431041
use tempfile::TempDir;
10441042

10451043
pub struct CreatePackageArgs {
@@ -1170,4 +1168,44 @@ mod test {
11701168
)
11711169
);
11721170
}
1171+
#[test]
1172+
fn monorepo_root_marks_transitive_workspace_dependencies_as_local() {
1173+
let temp_dir = TempDir::new().unwrap();
1174+
let root = temp_dir.path();
1175+
1176+
let mut local_dependencies = AHashSet::new();
1177+
local_dependencies.insert("direct".to_string());
1178+
1179+
let project_context = ProjectContext {
1180+
current_config: config::tests::create_config(config::tests::CreateConfigArgs {
1181+
name: "root".to_string(),
1182+
bs_deps: vec!["direct".to_string()],
1183+
build_dev_deps: vec![],
1184+
allowed_dependents: None,
1185+
path: root.join("rescript.json"),
1186+
}),
1187+
monorepo_context: Some(MonoRepoContext::MonorepoRoot {
1188+
local_dependencies,
1189+
local_dev_dependencies: AHashSet::new(),
1190+
}),
1191+
node_modules_exist_cache: RwLock::new(AHashMap::new()),
1192+
packages_cache: RwLock::new(AHashMap::new()),
1193+
};
1194+
1195+
assert!(super::is_local_dependency(
1196+
&project_context,
1197+
"direct",
1198+
&root.join("packages/direct")
1199+
));
1200+
assert!(super::is_local_dependency(
1201+
&project_context,
1202+
"transitive",
1203+
&root.join("packages/transitive")
1204+
));
1205+
assert!(!super::is_local_dependency(
1206+
&project_context,
1207+
"external",
1208+
&root.join("node_modules/external")
1209+
));
1210+
}
11731211
}

0 commit comments

Comments
 (0)