Skip to content

Commit

Permalink
fff
Browse files Browse the repository at this point in the history
  • Loading branch information
kwonoj committed Feb 3, 2024
1 parent 525d6eb commit 3a5018b
Show file tree
Hide file tree
Showing 5 changed files with 112 additions and 29 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
52 changes: 47 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,59 @@ 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
};
*/

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

Check failure on line 99 in packages/next-swc/crates/next-core/src/next_server/transforms.rs

View workflow job for this annotation

GitHub Actions / rust check / build

Diff in /root/actions-runner/_work/next.js/next.js/packages/next-swc/crates/next-core/src/next_server/transforms.rs
}


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,
));
}

rules.push(
get_next_react_server_components_transform_rule(
next_config,
Some(app_dir),
true,
None,
)

Check failure on line 121 in packages/next-swc/crates/next-core/src/next_server/transforms.rs

View workflow job for this annotation

GitHub Actions / rust check / build

Diff in /root/actions-runner/_work/next.js/next.js/packages/next-swc/crates/next-core/src/next_server/transforms.rs
.await?,
);


(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,84 @@ use swc_core::{
},
};
use turbo_tasks::Vc;
use turbo_tasks_fs::FileSystemPath;
use turbopack_binding::turbopack::{
ecmascript::{CustomTransformer, TransformContext},
turbopack::module_options::ModuleRule,
core::reference_type::{ReferenceType, UrlReferenceSubType},
ecmascript::{CustomTransformer, EcmascriptInputTransform, TransformContext},
turbopack::module_options::{ModuleRule, ModuleRuleCondition, ModuleRuleEffect},
};

use super::get_ecma_transform_rule;
use super::{get_ecma_transform_rule, match_js_extension, 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();
let cond = ModuleRuleCondition::all(vec![
ModuleRuleCondition::not(ModuleRuleCondition::ReferenceType(ReferenceType::Url(
UrlReferenceSubType::Undefined,
))),
ModuleRuleCondition::any(match_js_extension(*next_config.mdx_rs().await?)),
ModuleRuleCondition::not(ModuleRuleCondition::ResourcePathInDirectory(
"next/dist/esm".to_string(),
)),
]); */

/*Ok(ModuleRule::new(
cond,
vec![ModuleRuleEffect::ExtendEcmascriptTransforms {
prepend: Vc::cell(transformers),
append: Vc::cell(vec![]),
}],

Check failure on line 65 in packages/next-swc/crates/next-core/src/next_shared/transforms/next_react_server_components.rs

View workflow job for this annotation

GitHub Actions / rust check / build

Diff in /root/actions-runner/_work/next.js/next.js/packages/next-swc/crates/next-core/src/next_shared/transforms/next_react_server_components.rs
));*/


Ok(get_ecma_transform_rule(
Box::new(NextJsReactServerComponents::new(is_react_server_layer)),
enable_mdx_rs,
Box::new(NextJsReactServerComponents::new(
is_react_server_layer,
app_dir,
)),
*next_config.mdx_rs().await?,
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 +107,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 @@ -161,6 +161,8 @@ impl<C: Comments> VisitMut for ReactServerComponents<C> {
self.collect_top_level_directives_and_imports(module);

Check failure on line 161 in packages/next-swc/crates/next-custom-transforms/src/transforms/react_server_components.rs

View workflow job for this annotation

GitHub Actions / rust check / build

Diff in /root/actions-runner/_work/next.js/next.js/packages/next-swc/crates/next-custom-transforms/src/transforms/react_server_components.rs
let is_cjs = contains_cjs(module);

println!("rsc_transform {:#?} is_client_entry {}", self.filepath, is_client_entry);

if self.is_react_server_layer {
if is_client_entry {
self.to_module_ref(module, is_cjs);
Expand Down Expand Up @@ -367,6 +369,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 @@ -421,8 +424,8 @@ impl<C: Comments> ReactServerComponents<C> {
]
.into_iter(),
);

self.prepend_comment_node(module, is_cjs);
*/
}

fn assert_server_graph(&self, imports: &[ModuleImports], module: &Module) {
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
2 changes: 1 addition & 1 deletion test/e2e/app-dir/global-error/basic/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ createNextDescribe(
}
})

it('should catch metadata error in error boundary if presented', async () => {
it.only('should catch metadata error in error boundary if presented', async () => {
const browser = await next.browser('/metadata-error-with-boundary')

expect(await browser.elementByCss('#error').text()).toBe(
Expand Down

0 comments on commit 3a5018b

Please sign in to comment.