diff --git a/src/build/deps.rs b/src/build/deps.rs index 59ddd3c..4cd78db 100644 --- a/src/build/deps.rs +++ b/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() + "/" + ast_file; @@ -30,6 +31,24 @@ fn get_dep_modules( panic!("Could not read file {}", ast_file); } + // 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| { @@ -56,11 +75,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::>(); } @@ -84,6 +120,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 { @@ -95,6 +132,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 {