Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
kwonoj committed Jan 29, 2024
1 parent a655645 commit d1c95a3
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 9 deletions.
13 changes: 12 additions & 1 deletion packages/next-swc/crates/next-core/src/next_server/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ use crate::{
},
transforms::{
emotion::get_emotion_transform_plugin, get_relay_transform_plugin,
next_react_server_components::get_next_react_server_components_transform_plugin,
styled_components::get_styled_components_transform_plugin,
styled_jsx::get_styled_jsx_transform_plugin,
swc_ecma_transform_plugins::get_swc_ecma_transform_plugin,
Expand Down Expand Up @@ -277,7 +278,9 @@ pub async fn get_server_module_options_context(
mode: NextMode,
next_config: Vc<NextConfig>,
) -> Result<Vc<ModuleOptionsContext>> {
let custom_rules = get_next_server_transforms_rules(next_config, ty.into_value(), mode).await?;
let server_context_type = ty.into_value();
let custom_rules =
get_next_server_transforms_rules(next_config, server_context_type, mode).await?;
let internal_custom_rules =
get_next_server_internal_transforms_rules(ty.into_value(), *next_config.mdx_rs().await?)
.await?;
Expand Down Expand Up @@ -339,6 +342,10 @@ pub async fn get_server_module_options_context(
*get_styled_components_transform_plugin(next_config).await?;
let styled_jsx_transform_plugin =
*get_styled_jsx_transform_plugin(use_lightningcss, versions).await?;
let rsc_server_layer_transform_plugin =
*get_next_react_server_components_transform_plugin(true).await?;
let rsc_non_server_layer_transform_plugin =
*get_next_react_server_components_transform_plugin(false).await?;

// ModuleOptionsContext related options
let tsconfig = get_typescript_transform_options(project_path);
Expand Down Expand Up @@ -542,6 +549,10 @@ pub async fn get_server_module_options_context(
base_source_transforms.push(Vc::cell(Box::new(ClientDirectiveTransformer::new(
ecmascript_client_reference_transition_name,
)) as _));
} else {
if let Some(rsc_server_layer_transform_plugin) = rsc_server_layer_transform_plugin {
base_source_transforms.insert(0, rsc_server_layer_transform_plugin);
}
}

let base_ecma_transform_plugins = Some(CustomEcmascriptTransformPlugins::cell(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,7 @@ use crate::{
get_server_actions_transform_rule, next_amp_attributes::get_next_amp_attr_rule,
next_cjs_optimizer::get_next_cjs_optimizer_rule,
next_disallow_re_export_all_in_page::get_next_disallow_export_all_in_page_rule,
next_pure::get_next_pure_rule,
next_react_server_components::get_next_react_server_components_transform_rule,
server_actions::ActionsTransform,
next_pure::get_next_pure_rule, server_actions::ActionsTransform,
},
};

Expand Down Expand Up @@ -74,10 +72,6 @@ pub async fn get_next_server_transforms_rules(
mdx_rs,
));

rules.push(get_next_react_server_components_transform_rule(
true, mdx_rs,
));

if let Some(client_transition) = client_transition {
rules.push(get_next_css_client_reference_transforms_rule(
client_transition,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ use swc_core::{
};
use turbo_tasks::Vc;
use turbopack_binding::turbopack::{
ecmascript::{CustomTransformer, EcmascriptInputTransform, TransformContext},
ecmascript::{
CustomTransformer, EcmascriptInputTransform, OptionTransformPlugin, TransformContext,
},
turbopack::module_options::{ModuleRule, ModuleRuleEffect},
};

Expand All @@ -36,6 +38,19 @@ pub fn get_next_react_server_components_transform_rule(
)
}

/// Returns a transform plugin which applies the Next.js react server components
/// transform.
#[turbo_tasks::function]
pub async fn get_next_react_server_components_transform_plugin(
is_react_server_layer: bool,
) -> Result<Vc<OptionTransformPlugin>> {
Ok(Vc::cell(Some(Vc::cell(
Box::new(NextJsReactServerComponents {
is_react_server_layer,
}) as _,
))))
}

#[derive(Debug)]
struct NextJsReactServerComponents {
is_react_server_layer: bool,
Expand All @@ -50,6 +65,7 @@ impl CustomTransformer for NextJsReactServerComponents {
FileName::Custom(ctx.file_path_str.to_string()),
Config::WithOptions(Options {
is_react_server_layer: self.is_react_server_layer,
transform_module_ref: self.is_react_server_layer,
}),
ctx.comments,
Some(PathBuf::from(ctx.file_path.parent().await?.path.clone())),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,12 @@ impl Config {
#[serde(rename_all = "camelCase")]
pub struct Options {
pub is_react_server_layer: bool,
pub transform_module_ref: bool,
}

struct ReactServerComponents<C: Comments> {
is_react_server_layer: bool,
transform_module_ref: bool,
filepath: String,
app_dir: Option<PathBuf>,
comments: C,
Expand Down Expand Up @@ -366,6 +368,10 @@ impl<C: Comments> ReactServerComponents<C> {
// Convert the client module to the module reference code and add a special
// comment to the top of the file.
fn to_module_ref(&self, module: &mut Module, is_cjs: bool) {
if !self.transform_module_ref {
return;
}

// Clear all the statements and module declarations.
module.body.clear();

Expand Down Expand Up @@ -639,8 +645,19 @@ pub fn server_components<C: Comments>(
Config::WithOptions(x) => x.is_react_server_layer,
_ => false,
};
let transform_module_ref = if let Config::WithOptions(Options {
transform_module_ref,
..
}) = &config
{
*transform_module_ref
} else {
true
};

as_folder(ReactServerComponents {
is_react_server_layer,
transform_module_ref,
comments,
filepath: filename.to_string(),
app_dir,
Expand Down
1 change: 1 addition & 0 deletions packages/next/src/build/swc/options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,7 @@ function getBaseSWCOptions({
serverComponents && !jest
? {
isReactServerLayer,
transformModuleRef: true,
}
: undefined,
serverActions:
Expand Down

0 comments on commit d1c95a3

Please sign in to comment.