rspack_loader_swc 0.102.2

rspack builtin swc loader
mod cjs_finder;
mod import_analyzer;
mod react_server_components;
mod server_actions;
mod to_client_ref;
mod to_server_entry;

#[cfg(test)]
mod tests;

use std::{cell::RefCell, rc::Rc, sync::Arc};

pub use react_server_components::{Config, Options, server_components};
use rspack_core::RscMeta;
pub use server_actions::{Config as ServerActionsConfig, server_actions};
use swc_core::{
  common::{FileName, comments::SingleThreadedComments},
  ecma::ast::Pass,
};
pub use to_server_entry::to_server_entry;

#[derive(Debug, Clone)]
pub(crate) struct RscTransformOptions {
  pub is_react_server_layer: bool,
  pub enable_server_entry: bool,
  pub disable_client_api_checks: bool,
  pub is_development: bool,
  pub hash_salt: String,
}

pub fn rsc_transform(
  filename: Arc<FileName>,
  resource_path: String,
  module_resource: String,
  comments: Rc<SingleThreadedComments>,
  rsc_meta: &RefCell<Option<RscMeta>>,
  options: RscTransformOptions,
) -> impl Pass {
  (
    server_components(
      filename,
      module_resource,
      Config::WithOptions(Options {
        is_react_server_layer: options.is_react_server_layer,
        enable_server_entry: options.enable_server_entry,
        disable_client_api_checks: options.disable_client_api_checks,
      }),
      rsc_meta,
    ),
    server_actions(
      resource_path,
      ServerActionsConfig {
        is_react_server_layer: options.is_react_server_layer,
        is_development: options.is_development,
        hash_salt: options.hash_salt,
      },
      comments,
      rsc_meta,
    ),
  )
}