diff --git a/packages/next-swc/crates/next-api/src/server_actions.rs b/packages/next-swc/crates/next-api/src/server_actions.rs index 172c62fc7e71c..b9681a4caaa26 100644 --- a/packages/next-swc/crates/next-api/src/server_actions.rs +++ b/packages/next-swc/crates/next-api/src/server_actions.rs @@ -29,7 +29,8 @@ use turbopack_binding::{ virtual_source::VirtualSource, }, ecmascript::{ - chunk::EcmascriptChunkPlaceable, parse::ParseResult, EcmascriptModuleAsset, + chunk::EcmascriptChunkPlaceable, parse::ParseResult, + tree_shake::asset::EcmascriptModulePartAsset, EcmascriptModuleAsset, EcmascriptModuleAssetType, }, }, @@ -246,6 +247,14 @@ async fn to_rsc_context( } else { ReferenceType::TypeScript(TypeScriptReferenceSubType::Undefined) } + } else if let Some(module) = + Vc::try_resolve_downcast_type::(module).await? + { + if module.await?.full_module.await?.ty == EcmascriptModuleAssetType::Ecmascript { + ReferenceType::EcmaScriptModules(EcmaScriptModulesReferenceSubType::Undefined) + } else { + ReferenceType::TypeScript(TypeScriptReferenceSubType::Undefined) + } } else { ReferenceType::TypeScript(TypeScriptReferenceSubType::Undefined) }; @@ -294,14 +303,21 @@ pub fn parse_server_actions( /// the exported action function. If not, we return a None. #[turbo_tasks::function] async fn parse_actions(module: Vc>) -> Result> { - let Some(ecmascript_asset) = + let parsed = if let Some(ecmascript_asset) = Vc::try_resolve_downcast_type::(module).await? - else { + { + ecmascript_asset.failsafe_parse() + } else if let Some(ecmascript_asset) = + Vc::try_resolve_downcast_type::(module).await? + { + ecmascript_asset.await?.full_module.failsafe_parse() + } else { return Ok(OptionActionMap::none()); }; + let ParseResult::Ok { comments, program, .. - } = &*ecmascript_asset.parse().await? + } = &*parsed.await? else { // The file might be be parse-able, but this is reported separately. return Ok(OptionActionMap::none());