use rspack_collections::IdentifierMap;
use rspack_core::{
BoxModule, ChunkUkey, Compilation, CompilationBuildModule, CompilationId,
CompilationRuntimeModule, CompilerId, ModuleIdentifier, Plugin, RuntimeModule,
};
use rspack_error::Result;
use rspack_hook::{plugin, plugin_hook};
use rspack_util::source_map::SourceMapKind;
pub struct SourceMapDevToolModuleOptionsPluginOptions {
pub module: bool,
pub cheap: bool,
}
#[plugin]
#[derive(Debug)]
pub struct SourceMapDevToolModuleOptionsPlugin {
module: bool,
cheap: bool,
}
impl SourceMapDevToolModuleOptionsPlugin {
pub fn new(options: SourceMapDevToolModuleOptionsPluginOptions) -> Self {
Self::new_inner(options.module, options.cheap)
}
}
#[plugin_hook(CompilationBuildModule for SourceMapDevToolModuleOptionsPlugin)]
async fn build_module(
&self,
_compiler_id: CompilerId,
_compilation_id: CompilationId,
module: &mut BoxModule,
) -> Result<()> {
if self.module {
module.set_source_map_kind(SourceMapKind::SourceMap);
} else {
module.set_source_map_kind(SourceMapKind::SimpleSourceMap);
}
if self.cheap {
let current_kind = *module.get_source_map_kind();
module.set_source_map_kind(current_kind | SourceMapKind::Cheap)
}
Ok(())
}
#[plugin_hook(CompilationRuntimeModule for SourceMapDevToolModuleOptionsPlugin)]
async fn runtime_module(
&self,
_compilation: &Compilation,
module_identifier: &ModuleIdentifier,
_chunk: &ChunkUkey,
runtime_modules: &mut IdentifierMap<Box<dyn RuntimeModule>>,
) -> Result<()> {
let Some(runtime_module) = runtime_modules.get_mut(module_identifier) else {
return Ok(());
};
if self.module {
runtime_module.set_source_map_kind(SourceMapKind::SourceMap);
} else {
runtime_module.set_source_map_kind(SourceMapKind::SimpleSourceMap);
}
if self.cheap {
let current_kind = *runtime_module.get_source_map_kind();
runtime_module.set_source_map_kind(current_kind | SourceMapKind::Cheap)
}
Ok(())
}
impl Plugin for SourceMapDevToolModuleOptionsPlugin {
fn name(&self) -> &'static str {
"SourceMapDevToolModuleOptionsPlugin"
}
fn apply(&self, ctx: &mut rspack_core::ApplyContext<'_>) -> Result<()> {
ctx
.compilation_hooks
.build_module
.tap(build_module::new(self));
ctx
.compilation_hooks
.runtime_module
.tap(runtime_module::new(self));
Ok(())
}
}