rspack_binding_values 0.2.0

rspack binding values
use napi_derive::napi;
use rspack_core::{ChunkGroup, ChunkGroupUkey, Compilation};

use crate::{JsChunk, JsCompilation, JsModuleWrapper};

#[napi(object, object_from_js = false)]
pub struct JsChunkGroup {
  #[napi(js_name = "__inner_parents")]
  pub inner_parents: Vec<u32>,
  #[napi(js_name = "__inner_ukey")]
  pub inner_ukey: u32,
  pub chunks: Vec<JsChunk>,
  pub index: Option<u32>,
  pub name: Option<String>,
  pub is_initial: bool,
  pub origins: Vec<JsChunkGroupOrigin>,
}

#[napi(object, object_from_js = false)]
pub struct JsChunkGroupOrigin {
  #[napi(ts_type = "JsModule | undefined")]
  pub module: Option<JsModuleWrapper>,
  pub request: Option<String>,
}

impl JsChunkGroup {
  pub fn from_chunk_group(
    cg: &rspack_core::ChunkGroup,
    compilation: &rspack_core::Compilation,
  ) -> Self {
    Self {
      chunks: cg
        .chunks
        .iter()
        .map(|k| JsChunk::from(compilation.chunk_by_ukey.expect_get(k), compilation))
        .collect(),
      index: cg.index,
      inner_parents: cg.parents.iter().map(|ukey| ukey.as_u32()).collect(),
      inner_ukey: cg.ukey.as_u32(),
      name: cg.name().map(|name| name.to_string()),
      is_initial: cg.is_initial(),
      origins: cg
        .origins()
        .iter()
        .map(|origin| JsChunkGroupOrigin {
          module: origin.module_id.map(|module_id| {
            let module = compilation
              .module_by_identifier(&module_id)
              .unwrap_or_else(|| panic!("failed to retrieve module by id: {}", module_id));
            JsModuleWrapper::new(module.as_ref(), compilation.id(), Some(compilation))
          }),
          request: origin.request.clone(),
        })
        .collect::<Vec<_>>(),
    }
  }
}

fn chunk_group(ukey: u32, compilation: &Compilation) -> &ChunkGroup {
  let ukey = ChunkGroupUkey::from(ukey);
  compilation.chunk_group_by_ukey.expect_get(&ukey)
}

#[napi(js_name = "__chunk_group_inner_get_chunk_group")]
pub fn get_chunk_group(ukey: u32, js_compilation: &JsCompilation) -> JsChunkGroup {
  let compilation = unsafe { js_compilation.inner.as_ref() };

  let cg = chunk_group(ukey, compilation);
  JsChunkGroup::from_chunk_group(cg, compilation)
}

#[napi(js_name = "__entrypoint_inner_get_runtime_chunk")]
pub fn get_runtime_chunk(ukey: u32, js_compilation: &JsCompilation) -> JsChunk {
  let compilation = unsafe { js_compilation.inner.as_ref() };

  let entrypoint = chunk_group(ukey, compilation);
  let chunk_ukey = entrypoint.get_runtime_chunk(&compilation.chunk_group_by_ukey);
  let chunk = compilation.chunk_by_ukey.expect_get(&chunk_ukey);
  JsChunk::from(chunk, compilation)
}