rspack_binding_api 0.100.7

Rspack shared binding API
Documentation
use crate::{
  impl_module_methods,
  module::{MODULE_PROPERTIES_BUFFER, Module},
};

#[napi]
#[repr(C)]
pub struct ExternalModule {
  pub(crate) module: Module,
}

impl ExternalModule {
  pub(crate) fn custom_into_instance(
    mut self,
    env: &napi::Env,
  ) -> napi::Result<napi::bindgen_prelude::ClassInstance<'_, Self>> {
    let (_, module) = self.as_ref()?;
    let user_request = env.create_string(module.user_request())?;

    MODULE_PROPERTIES_BUFFER.with(|ref_cell| {
      let mut properties = ref_cell.borrow_mut();
      properties.clear();

      properties.push(
        napi::Property::new()
          .with_utf8_name("userRequest")?
          .with_value(&user_request),
      );
      Self::new_inherited(self, env, &mut properties)
    })
  }

  fn as_ref(&mut self) -> napi::Result<(&rspack_core::Compilation, &rspack_core::ExternalModule)> {
    let (compilation, module) = self.module.as_ref()?;
    match module.as_external_module() {
      Some(external_module) => Ok((compilation, external_module)),
      None => Err(napi::Error::new(
        napi::Status::GenericFailure,
        "Module is not a ExternalModule",
      )),
    }
  }
}

impl_module_methods!(ExternalModule);