diff --git a/packages/next-swc/crates/next-core/src/next_app/app_page_entry.rs b/packages/next-swc/crates/next-core/src/next_app/app_page_entry.rs index d6d16e7dde629..c74cd2dc9fade 100644 --- a/packages/next-swc/crates/next-core/src/next_app/app_page_entry.rs +++ b/packages/next-swc/crates/next-core/src/next_app/app_page_entry.rs @@ -101,14 +101,14 @@ pub async fn get_app_page_entry( let file = File::from(result.build()); let source = VirtualSource::new(source.ident().path(), AssetContent::file(file.into())); - let rsc_entry = context.process( + let mut rsc_entry = context.process( Vc::upcast(source), Value::new(ReferenceType::Internal(Vc::cell(inner_assets))), ); if is_edge { - todo!("edge pages are not supported yet") - } + rsc_entry = wrap_edge_entry(context, project_root, rsc_entry).await?; + }; let Some(rsc_entry) = Vc::try_resolve_downcast::>(rsc_entry).await? @@ -124,3 +124,30 @@ pub async fn get_app_page_entry( } .cell()) } + +async fn wrap_edge_entry( + context: Vc, + project_root: Vc, + entry: Vc>, +) -> Result>> { + const INNER: &str = "INNER_RSC_ENTRY"; + + let source = load_next_js_template( + "edge-app-route.js", + project_root, + indexmap! { + "VAR_USERLAND" => INNER.to_string(), + }, + indexmap! {}, + ) + .await?; + + let inner_assets = indexmap! { + INNER.to_string() => entry + }; + + Ok(context.process( + Vc::upcast(source), + Value::new(ReferenceType::Internal(Vc::cell(inner_assets))), + )) +}