rspack_plugin_mf 0.100.0

rspack module federation plugin
Documentation
use async_trait::async_trait;
use rspack_core::{
  Dependency, DependencyType, ModuleExt, ModuleFactory, ModuleFactoryCreateData,
  ModuleFactoryResult,
};
use rspack_error::Result;

use super::{
  container_entry_dependency::ContainerEntryDependency,
  container_entry_module::ContainerEntryModule,
};

#[derive(Debug)]
pub struct ContainerEntryModuleFactory;

#[async_trait]
impl ModuleFactory for ContainerEntryModuleFactory {
  async fn create(&self, data: &mut ModuleFactoryCreateData) -> Result<ModuleFactoryResult> {
    let dep = data.dependencies[0]
      .downcast_ref::<ContainerEntryDependency>()
      .expect("dependency of ContainerEntryModuleFactory should be ContainerEntryDependency");
    if *dep.dependency_type() == DependencyType::ShareContainerEntry {
      Ok(ModuleFactoryResult::new_with_module(
        ContainerEntryModule::new_share_container_entry(
          dep.name.clone(),
          dep.request.clone().expect("should have request"),
          dep.version.clone().expect("should have version"),
        )
        .boxed(),
      ))
    } else {
      Ok(ModuleFactoryResult::new_with_module(
        ContainerEntryModule::new(
          dep.name.clone(),
          dep.exposes.clone(),
          dep.share_scope.clone(),
          dep.enhanced,
        )
        .boxed(),
      ))
    }
  }
}