use rspack_core::ConstDependency;
use rspack_plugin_javascript::{JavascriptParserPlugin, visitors::JavascriptParser};
use swc_core::ecma::ast::Program;
pub struct HashbangParserPlugin;
#[rspack_plugin_javascript::implemented_javascript_parser_hooks]
impl JavascriptParserPlugin for HashbangParserPlugin {
fn program(&self, parser: &mut JavascriptParser, ast: &Program) -> Option<bool> {
let hashbang = ast
.as_module()
.and_then(|m| m.shebang.as_ref())
.or_else(|| ast.as_script().and_then(|s| s.shebang.as_ref()))?;
let normalized_hashbang = if hashbang.starts_with("#!") {
hashbang.to_string()
} else {
format!("#!{hashbang}")
};
parser.build_info.extras.insert(
"hashbang".to_string(),
serde_json::Value::String(normalized_hashbang),
);
let replace_len = if hashbang.starts_with("#!") {
hashbang.len() as u32
} else {
hashbang.len() as u32 + 2 };
parser.add_presentational_dependency(Box::new(ConstDependency::new(
(0, replace_len).into(),
"".into(),
)));
None
}
}