Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
kwonoj committed Feb 2, 2024
1 parent bdac88f commit 8897694
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 27 deletions.
12 changes: 0 additions & 12 deletions packages/next-swc/crates/next-core/src/next_server/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -505,18 +505,6 @@ pub async fn get_server_module_options_context(
.flatten()
.collect();

if let Some(ecmascript_client_reference_transition_name) =
ecmascript_client_reference_transition_name
{
custom_source_transform_rules.push(get_ecma_transform_rule(
Box::new(ClientDirectiveTransformer::new(
ecmascript_client_reference_transition_name,
)),
enable_mdx_rs.is_some(),
true,
));
}

base_next_server_rules.extend(custom_source_transform_rules.clone());
base_next_server_rules.extend(source_transform_rules);

Expand Down
49 changes: 44 additions & 5 deletions packages/next-swc/crates/next-core/src/next_server/transforms.rs
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
use anyhow::Result;
use next_custom_transforms::transforms::strip_page_exports::ExportFilter;
use turbo_tasks::Vc;
use turbopack_binding::turbopack::turbopack::module_options::ModuleRule;
use turbopack_binding::turbopack::{
ecmascript_plugin::transform::directives::client::ClientDirectiveTransformer,
turbopack::module_options::ModuleRule,
};

use crate::{
mode::NextMode,
next_client_reference::css_client_reference::css_client_reference_rule::get_next_css_client_reference_transforms_rule,
next_config::NextConfig,
next_server::context::ServerContextType,
next_shared::transforms::{
get_next_dynamic_transform_rule, get_next_font_transform_rule, get_next_image_rule,
get_next_modularize_imports_rule, get_next_pages_transforms_rule,
get_ecma_transform_rule, get_next_dynamic_transform_rule, get_next_font_transform_rule,
get_next_image_rule, get_next_modularize_imports_rule, get_next_pages_transforms_rule,
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,
Expand Down Expand Up @@ -67,20 +70,56 @@ pub async fn get_next_server_transforms_rules(
(false, None)
}
ServerContextType::AppRSC {
client_transition, ..
app_dir,
client_transition,
ecmascript_client_reference_transition_name,
..
} => {
rules.push(get_server_actions_transform_rule(
ActionsTransform::Server,
mdx_rs,
));

rules.push(get_next_react_server_components_transform_rule(next_config, true).await?);
let client_directive_transformer =
if let Some(ecmascript_client_reference_transition_name) =
ecmascript_client_reference_transition_name
{
Some(Box::new(ClientDirectiveTransformer::new(
ecmascript_client_reference_transition_name,
)) as _)
} else {
None
};

rules.push(
get_next_react_server_components_transform_rule(
next_config,
Some(app_dir),
true,
client_directive_transformer,
)
.await?,
);

if let Some(client_transition) = client_transition {
rules.push(get_next_css_client_reference_transforms_rule(
client_transition,
));
}

/*
if let Some(ecmascript_client_reference_transition_name) =
ecmascript_client_reference_transition_name
{
rules.push(get_ecma_transform_rule(
Box::new(ClientDirectiveTransformer::new(
ecmascript_client_reference_transition_name,
)),
mdx_rs,
true,
));
} */

(true, None)
}
ServerContextType::AppRoute { .. } => (false, None),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
use std::path::PathBuf;

use anyhow::Result;
use async_trait::async_trait;
use next_custom_transforms::transforms::react_server_components::*;
Expand All @@ -11,36 +9,72 @@ use swc_core::{
},
};
use turbo_tasks::Vc;
use turbo_tasks_fs::FileSystemPath;
use turbopack_binding::turbopack::{
ecmascript::{CustomTransformer, TransformContext},
turbopack::module_options::ModuleRule,
ecmascript::{CustomTransformer, EcmascriptInputTransform, TransformContext},
turbopack::module_options::{ModuleRule, ModuleRuleEffect},
};

use super::get_ecma_transform_rule;
use super::{get_ecma_transform_rule, module_rule_match_js_no_url};
use crate::next_config::NextConfig;

/// Returns a rule which applies the Next.js react server components transform.
pub async fn get_next_react_server_components_transform_rule(
next_config: Vc<NextConfig>,
app_dir: Option<Vc<FileSystemPath>>,
is_react_server_layer: bool,
chain_transformer: Option<Box<dyn CustomTransformer + Send + Sync>>,
) -> Result<ModuleRule> {
let enable_mdx_rs = *next_config.mdx_rs().await?;
/*
let transformer = EcmascriptInputTransform::Plugin(Vc::cell(transformer as _));
let (prepend, append) = if prepend {
(Vc::cell(vec![transformer]), Vc::cell(vec![]))
} else {
(Vc::cell(vec![]), Vc::cell(vec![transformer]))
}; */

let transformers = vec![
Some(Box::new(NextJsReactServerComponents::new(
is_react_server_layer,
app_dir,
)) as _),
chain_transformer,
]
.into_iter()
.flatten()
.map(|v| EcmascriptInputTransform::Plugin(Vc::cell(v)))
.collect();

Ok(ModuleRule::new(
module_rule_match_js_no_url(*next_config.mdx_rs().await?),
vec![ModuleRuleEffect::ExtendEcmascriptTransforms {
prepend: Vc::cell(transformers),
append: Vc::cell(vec![]),
}],
))

/*
Ok(get_ecma_transform_rule(
Box::new(NextJsReactServerComponents::new(is_react_server_layer)),
Box::new(NextJsReactServerComponents::new(
is_react_server_layer,
app_dir,
)),
enable_mdx_rs,
true,
))
)) */
}

#[derive(Debug)]
struct NextJsReactServerComponents {
is_react_server_layer: bool,
app_dir: Option<Vc<FileSystemPath>>,
}

impl NextJsReactServerComponents {
fn new(is_react_server_layer: bool) -> Self {
fn new(is_react_server_layer: bool, app_dir: Option<Vc<FileSystemPath>>) -> Self {
Self {
is_react_server_layer,
app_dir,
}
}
}
Expand All @@ -61,7 +95,10 @@ impl CustomTransformer for NextJsReactServerComponents {
is_react_server_layer: self.is_react_server_layer,
}),
ctx.comments,
Some(PathBuf::from(ctx.file_path.parent().await?.path.clone())),
match self.app_dir {
None => None,
Some(path) => Some(path.await?.path.clone().into()),
},
);

*program = p.fold_with(&mut visitor);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,7 @@ impl<C: Comments> ReactServerComponents<C> {
// comment to the top of the file.
fn to_module_ref(&self, module: &mut Module, is_cjs: bool) {
// Clear all the statements and module declarations.
/*
module.body.clear();
let proxy_ident = quote_ident!("createProxy");
Expand Down Expand Up @@ -422,6 +423,8 @@ impl<C: Comments> ReactServerComponents<C> {
.into_iter(),
);
*/

self.prepend_comment_node(module, is_cjs);
}

Expand Down Expand Up @@ -471,6 +474,7 @@ impl<C: Comments> ReactServerComponents<C> {
let is_error_file = Regex::new(r"[\\/]error\.(ts|js)x?$")
.unwrap()
.is_match(&self.filepath);

if is_error_file {
if let Some(app_dir) = &self.app_dir {
if let Some(app_dir) = app_dir.to_str() {
Expand Down

0 comments on commit 8897694

Please sign in to comment.