rspack_loader_react_refresh/
lib.rs1mod plugin;
2
3pub use plugin::ReactRefreshLoaderPlugin;
4use rspack_cacheable::{cacheable, cacheable_dyn};
5use rspack_core::RunnerContext;
6use rspack_error::Result;
7use rspack_loader_runner::{Identifier, Loader, LoaderContext};
8
9#[cacheable]
10pub struct ReactRefreshLoader {
11 identifier: Identifier,
12}
13
14impl Default for ReactRefreshLoader {
15 fn default() -> Self {
16 Self {
17 identifier: REACT_REFRESH_LOADER_IDENTIFIER.into(),
18 }
19 }
20}
21
22impl ReactRefreshLoader {
23 pub fn with_identifier(mut self, identifier: Identifier) -> Self {
26 debug_assert!(identifier.starts_with(REACT_REFRESH_LOADER_IDENTIFIER));
27 self.identifier = identifier;
28 self
29 }
30}
31
32#[cacheable_dyn]
33#[async_trait::async_trait]
34impl Loader<RunnerContext> for ReactRefreshLoader {
35 fn identifier(&self) -> Identifier {
36 self.identifier
37 }
38
39 async fn run(&self, loader_context: &mut LoaderContext<RunnerContext>) -> Result<()> {
40 let Some(content) = loader_context.take_content() else {
41 return Ok(());
42 };
43 let mut source = content.try_into_string()?;
44 source += r#"
45function $RefreshSig$() {
46 return $ReactRefreshRuntime$.createSignatureFunctionForTransform();
47}
48function $RefreshReg$(type, id) {
49 $ReactRefreshRuntime$.register(type, __webpack_module__.id + "_" + id);
50}
51Promise.resolve().then(function() {
52 $ReactRefreshRuntime$.refresh(__webpack_module__.id, __webpack_module__.hot);
53});
54"#;
55 let sm = loader_context.take_source_map();
56 loader_context.finish_with((source, sm));
57 Ok(())
58 }
59}
60
61pub const REACT_REFRESH_LOADER_IDENTIFIER: &str = "builtin:react-refresh-loader";