diff --git a/rewatch/src/build/deps.rs b/rewatch/src/build/deps.rs index c8ca6a12d2..2abf80731d 100644 --- a/rewatch/src/build/deps.rs +++ b/rewatch/src/build/deps.rs @@ -10,6 +10,7 @@ fn get_dep_modules( package_modules: &AHashSet, valid_modules: &AHashSet, package: &packages::Package, + build_state: &BuildState, ) -> AHashSet { let mut deps = AHashSet::new(); let ast_file = package.get_build_path().join(ast_file); @@ -33,6 +34,24 @@ fn get_dep_modules( } } + // Get the list of allowed dependency packages for this package + let allowed_dependencies: AHashSet = package + .config + .bs_dependencies + .as_ref() + .unwrap_or(&vec![]) + .iter() + .chain( + package + .config + .bs_dev_dependencies + .as_ref() + .unwrap_or(&vec![]) + .iter(), + ) + .cloned() + .collect(); + return deps .iter() .map(|dep| { @@ -59,11 +78,28 @@ fn get_dep_modules( } }) .filter(|dep| { - valid_modules.contains(dep) + // First check if the module exists + let module_exists = valid_modules.contains(dep) && match namespace.to_owned() { Some(namespace) => !dep.eq(&namespace), None => true, + }; + + if !module_exists { + return false; + } + + if let Some(dep_module) = build_state.modules.get(dep) { + // If the module exists, check if it's in the same package (always allowed) + if dep_module.package_name == package.name { + return true; } + + // If it's in a different package, check if that package is a declared dependency + return allowed_dependencies.contains(&dep_module.package_name); + } + + true }) .collect::>(); } @@ -87,6 +123,7 @@ pub fn get_deps(build_state: &mut BuildState, deleted_modules: &AHashSet package.modules.as_ref().unwrap(), all_mod, &package, + build_state, ); if let Some(interface) = &source_file.interface { @@ -98,6 +135,7 @@ pub fn get_deps(build_state: &mut BuildState, deleted_modules: &AHashSet package.modules.as_ref().unwrap(), all_mod, &package, + build_state, )) } match &package.namespace {