use rustc_hash::FxHashMap;
use fallow_types::discover::FileId;
use super::ResolvedModule;
use super::path_info::is_bare_specifier;
use super::types::ResolveResult;
pub(super) fn apply_specifier_upgrades(resolved: &mut [ResolvedModule]) {
let mut specifier_upgrades: FxHashMap<String, FileId> = FxHashMap::default();
for module in resolved.iter() {
for imp in module
.resolved_imports
.iter()
.chain(module.resolved_dynamic_imports.iter())
{
if is_bare_specifier(&imp.info.source)
&& let ResolveResult::InternalModule(file_id) = &imp.target
{
specifier_upgrades
.entry(imp.info.source.clone())
.or_insert(*file_id);
}
}
for re in &module.re_exports {
if is_bare_specifier(&re.info.source)
&& let ResolveResult::InternalModule(file_id) = &re.target
{
specifier_upgrades
.entry(re.info.source.clone())
.or_insert(*file_id);
}
}
}
if specifier_upgrades.is_empty() {
return;
}
for module in resolved.iter_mut() {
for imp in module
.resolved_imports
.iter_mut()
.chain(module.resolved_dynamic_imports.iter_mut())
{
if matches!(imp.target, ResolveResult::NpmPackage(_))
&& let Some(&file_id) = specifier_upgrades.get(&imp.info.source)
{
imp.target = ResolveResult::InternalModule(file_id);
}
}
for re in &mut module.re_exports {
if matches!(re.target, ResolveResult::NpmPackage(_))
&& let Some(&file_id) = specifier_upgrades.get(&re.info.source)
{
re.target = ResolveResult::InternalModule(file_id);
}
}
}
}