rspack_loader_react_refresh 0.100.0-rc.3

rspack react refresh loader
Documentation
use std::sync::Arc;

use rspack_core::{
  BoxLoader, Context, ModuleRuleUseLoader, NormalModuleFactoryResolveLoader, Plugin, Resolver,
};
use rspack_error::Result;
use rspack_hook::{plugin, plugin_hook};

use crate::REACT_REFRESH_LOADER_IDENTIFIER;

#[plugin]
#[derive(Debug)]
pub struct ReactRefreshLoaderPlugin;

impl ReactRefreshLoaderPlugin {
  pub fn new() -> Self {
    Self::new_inner()
  }
}

impl Default for ReactRefreshLoaderPlugin {
  fn default() -> Self {
    Self::new()
  }
}

impl Plugin for ReactRefreshLoaderPlugin {
  fn name(&self) -> &'static str {
    "ReactRefreshLoaderPlugin"
  }

  fn apply(&self, ctx: &mut rspack_core::ApplyContext<'_>) -> Result<()> {
    ctx
      .normal_module_factory_hooks
      .resolve_loader
      .tap(resolve_loader::new(self));
    Ok(())
  }
}

#[plugin_hook(NormalModuleFactoryResolveLoader for ReactRefreshLoaderPlugin)]
pub(crate) async fn resolve_loader(
  &self,
  _context: &Context,
  _resolver: &Resolver,
  l: &ModuleRuleUseLoader,
) -> Result<Option<BoxLoader>> {
  let loader_request = &l.loader;

  if loader_request.starts_with(REACT_REFRESH_LOADER_IDENTIFIER) {
    return Ok(Some(Arc::new(
      crate::ReactRefreshLoader::default().with_identifier(loader_request.as_str().into()),
    )));
  }

  Ok(None)
}