From 9c6b60a53428aa506e65b2477dbfa619e712db80 Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Mon, 23 Oct 2023 13:12:51 -0400 Subject: [PATCH 01/12] Revert "Remove ServerDirectiveTransformer (#56496)" This reverts commit bfdb349ebadced0346aa5b9c017851a166c493f6. --- .../next-core/src/next_client/context.rs | 6 +++++ .../next-core/src/next_server/context.rs | 23 ++++++++++++++----- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/packages/next-swc/crates/next-core/src/next_client/context.rs b/packages/next-swc/crates/next-core/src/next_client/context.rs index 8e0c3563dd361..d62499a3dabf1 100644 --- a/packages/next-swc/crates/next-core/src/next_client/context.rs +++ b/packages/next-swc/crates/next-core/src/next_client/context.rs @@ -18,6 +18,7 @@ use turbopack_binding::{ }, dev::{react_refresh::assert_can_resolve_react_refresh, DevChunkingContext}, ecmascript::chunk::EcmascriptChunkingContext, + ecmascript_plugin::transform::directives::server::ServerDirectiveTransformer, node::execution_context::ExecutionContext, turbopack::{ condition::ContextCondition, @@ -243,6 +244,11 @@ pub async fn get_client_module_options_context( *get_emotion_transform_plugin(next_config).await?, *get_styled_components_transform_plugin(next_config).await?, *get_styled_jsx_transform_plugin().await?, + Some(Vc::cell(Box::new(ServerDirectiveTransformer::new( + // ServerDirective is not implemented yet and always reports an issue. + // We don't have to pass a valid transition name yet, but the API is prepared. + &Vc::cell("TODO".to_string()), + )) as _)), ] .into_iter() .flatten() diff --git a/packages/next-swc/crates/next-core/src/next_server/context.rs b/packages/next-swc/crates/next-core/src/next_server/context.rs index d42d7c5c0856a..53fdcfdc12dfd 100644 --- a/packages/next-swc/crates/next-core/src/next_server/context.rs +++ b/packages/next-swc/crates/next-core/src/next_server/context.rs @@ -18,7 +18,9 @@ use turbopack_binding::{ resolve::{parse::Request, pattern::Pattern}, }, ecmascript::TransformPlugin, - ecmascript_plugin::transform::directives::client::ClientDirectiveTransformer, + ecmascript_plugin::transform::directives::{ + client::ClientDirectiveTransformer, server::ServerDirectiveTransformer, + }, node::execution_context::ExecutionContext, turbopack::{ condition::ContextCondition, @@ -289,6 +291,12 @@ pub async fn get_server_module_options_context( let styled_components_transform_plugin = *get_styled_components_transform_plugin(next_config).await?; let styled_jsx_transform_plugin = *get_styled_jsx_transform_plugin().await?; + let server_directive_transform_plugin = + Some(Vc::cell(Box::new(ServerDirectiveTransformer::new( + // ServerDirective is not implemented yet and always reports an issue. + // We don't have to pass a valid transition name yet, but the API is prepared. + &Vc::cell("TODO".to_string()), + )) as _)); // ModuleOptionsContext related options let tsconfig = get_typescript_transform_options(project_path); @@ -387,6 +395,7 @@ pub async fn get_server_module_options_context( let mut base_source_transforms: Vec> = vec![ styled_components_transform_plugin, styled_jsx_transform_plugin, + server_directive_transform_plugin, ] .into_iter() .flatten() @@ -460,11 +469,13 @@ pub async fn get_server_module_options_context( ecmascript_client_reference_transition_name, .. } => { - let mut base_source_transforms: Vec> = - vec![styled_components_transform_plugin] - .into_iter() - .flatten() - .collect(); + let mut base_source_transforms: Vec> = vec![ + styled_components_transform_plugin, + server_directive_transform_plugin, + ] + .into_iter() + .flatten() + .collect(); if let Some(ecmascript_client_reference_transition_name) = ecmascript_client_reference_transition_name From 98c098cc4fdd3ce8985d8393e60cda3b6ee28672 Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Mon, 23 Oct 2023 18:41:28 -0400 Subject: [PATCH 02/12] Tmp --- packages/next-swc/crates/next-api/src/app.rs | 16 ++++++++++++++++ packages/next-swc/crates/next-api/src/pages.rs | 3 +++ .../next-swc/crates/next-api/src/project.rs | 1 + .../next-build/src/next_app/app_entries.rs | 17 +++++++++++++++-- .../next-build/src/next_pages/page_entries.rs | 2 ++ .../crates/next-core/src/next_client/context.rs | 8 +++----- .../crates/next-core/src/next_server/context.rs | 9 +++------ 7 files changed, 43 insertions(+), 13 deletions(-) diff --git a/packages/next-swc/crates/next-api/src/app.rs b/packages/next-swc/crates/next-api/src/app.rs index eab5ef193d0e7..071c371c98d36 100644 --- a/packages/next-swc/crates/next-api/src/app.rs +++ b/packages/next-swc/crates/next-api/src/app.rs @@ -99,6 +99,7 @@ impl AppProject { } const ECMASCRIPT_CLIENT_TRANSITION_NAME: &str = "next-ecmascript-client-reference"; +const ECMASCRIPT_SERVER_TRANSITION_NAME: &str = "next-ecmascript-server-reference"; #[turbo_tasks::value_impl] impl AppProject { @@ -142,6 +143,7 @@ impl AppProject { Value::new(self.client_ty()), this.mode, self.project().next_config(), + Some(self.server_transition_name()), )) } @@ -162,6 +164,11 @@ impl AppProject { Vc::cell(ECMASCRIPT_CLIENT_TRANSITION_NAME.to_string()) } + #[turbo_tasks::function] + fn server_transition_name(self: Vc) -> Vc { + Vc::cell(ECMASCRIPT_SERVER_TRANSITION_NAME.to_string()) + } + #[turbo_tasks::function] fn client_transition(self: Vc) -> Vc { ContextTransition::new( @@ -181,6 +188,7 @@ impl AppProject { Value::new(self.rsc_ty()), this.mode, self.project().next_config(), + Some(self.server_transition_name()), )) } @@ -218,6 +226,13 @@ impl AppProject { self.ssr_transition(), )), ), + ( + ECMASCRIPT_SERVER_TRANSITION_NAME.to_string(), + Vc::upcast(NextEcmascriptClientReferenceTransition::new( + self.client_transition(), + self.ssr_transition(), + )), + ), ( "next-dynamic".to_string(), Vc::upcast(NextDynamicTransition::new(self.client_transition())), @@ -285,6 +300,7 @@ impl AppProject { Value::new(self.ssr_ty()), this.mode, self.project().next_config(), + Some(self.server_transition_name()), )) } diff --git a/packages/next-swc/crates/next-api/src/pages.rs b/packages/next-swc/crates/next-api/src/pages.rs index 10197cab3224b..1bcca728a7c5e 100644 --- a/packages/next-swc/crates/next-api/src/pages.rs +++ b/packages/next-swc/crates/next-api/src/pages.rs @@ -280,6 +280,7 @@ impl PagesProject { }), this.mode, self.project().next_config(), + None, )) } @@ -363,6 +364,7 @@ impl PagesProject { }), this.mode, self.project().next_config(), + None, )) } @@ -377,6 +379,7 @@ impl PagesProject { }), this.mode, self.project().next_config(), + None, )) } diff --git a/packages/next-swc/crates/next-api/src/project.rs b/packages/next-swc/crates/next-api/src/project.rs index 1bb274708e47c..7a9b46c9ad397 100644 --- a/packages/next-swc/crates/next-api/src/project.rs +++ b/packages/next-swc/crates/next-api/src/project.rs @@ -691,6 +691,7 @@ impl Project { Value::new(ServerContextType::Middleware), NextMode::Development, self.next_config(), + None, ), get_edge_resolve_options_context( self.project_path(), diff --git a/packages/next-swc/crates/next-build/src/next_app/app_entries.rs b/packages/next-swc/crates/next-build/src/next_app/app_entries.rs index cad98506bb4f3..d22cfc25c9609 100644 --- a/packages/next-swc/crates/next-build/src/next_app/app_entries.rs +++ b/packages/next-swc/crates/next-build/src/next_app/app_entries.rs @@ -40,6 +40,9 @@ use turbopack_binding::{ }, }; +const ECMASCRIPT_CLIENT_TRANSITION_NAME: &str = "next-ecmascript-client-reference"; +const ECMASCRIPT_SERVER_TRANSITION_NAME: &str = "next-ecmascript-server-reference"; + #[turbo_tasks::value] pub struct AppEntries { /// All app entries. @@ -98,6 +101,7 @@ pub async fn get_app_entries( client_ty, mode, next_config, + Some(Vc::cell(ECMASCRIPT_SERVER_TRANSITION_NAME.to_string())), ); let client_resolve_options_context = get_client_resolve_options_context( @@ -123,12 +127,14 @@ pub async fn get_app_entries( execution_context, ); + let server_transition_name = Vc::cell(ECMASCRIPT_SERVER_TRANSITION_NAME.to_string()); let ssr_module_options_context = get_server_module_options_context( project_root, execution_context, ssr_ty, mode, next_config, + Some(server_transition_name), ); let ssr_transition = ContextTransition::new( @@ -140,8 +146,6 @@ pub async fn get_app_entries( transitions.insert("next-ssr".to_string(), Vc::upcast(ssr_transition)); - const ECMASCRIPT_CLIENT_TRANSITION_NAME: &str = "next-ecmascript-client-reference"; - transitions.insert( ECMASCRIPT_CLIENT_TRANSITION_NAME.to_string(), Vc::upcast(NextEcmascriptClientReferenceTransition::new( @@ -149,6 +153,14 @@ pub async fn get_app_entries( ssr_transition, )), ); + // TODO: + // transitions.insert( + // ECMASCRIPT_SERVER_TRANSITION_NAME.to_string(), + // Vc::upcast(NextEcmascriptClientReferenceTransition::new( + // client_transition, + // ssr_transition, + // )), + // ); let client_ty = Value::new(ClientContextType::App { app_dir }); transitions.insert( @@ -170,6 +182,7 @@ pub async fn get_app_entries( rsc_ty, mode, next_config, + Some(server_transition_name), ); let rsc_resolve_options_context = get_server_resolve_options_context( project_root, diff --git a/packages/next-swc/crates/next-build/src/next_pages/page_entries.rs b/packages/next-swc/crates/next-build/src/next_pages/page_entries.rs index fb4b0b80ff34b..b4f7bbf560575 100644 --- a/packages/next-swc/crates/next-build/src/next_pages/page_entries.rs +++ b/packages/next-swc/crates/next-build/src/next_pages/page_entries.rs @@ -86,6 +86,7 @@ pub async fn get_page_entries( client_ty, mode, next_config, + None, ); let client_resolve_options_context = get_client_resolve_options_context( @@ -142,6 +143,7 @@ pub async fn get_page_entries( ssr_ty, mode, next_config, + None, ); let ssr_module_context = Vc::upcast(ModuleAssetContext::new( diff --git a/packages/next-swc/crates/next-core/src/next_client/context.rs b/packages/next-swc/crates/next-core/src/next_client/context.rs index d62499a3dabf1..01d34bf88691f 100644 --- a/packages/next-swc/crates/next-core/src/next_client/context.rs +++ b/packages/next-swc/crates/next-core/src/next_client/context.rs @@ -181,6 +181,7 @@ pub async fn get_client_module_options_context( ty: Value, mode: NextMode, next_config: Vc, + server_transition_name: Option>, ) -> Result> { let custom_rules = get_next_client_transforms_rules(next_config, ty.into_value(), mode).await?; let resolve_options_context = @@ -244,11 +245,8 @@ pub async fn get_client_module_options_context( *get_emotion_transform_plugin(next_config).await?, *get_styled_components_transform_plugin(next_config).await?, *get_styled_jsx_transform_plugin().await?, - Some(Vc::cell(Box::new(ServerDirectiveTransformer::new( - // ServerDirective is not implemented yet and always reports an issue. - // We don't have to pass a valid transition name yet, but the API is prepared. - &Vc::cell("TODO".to_string()), - )) as _)), + server_transition_name + .map(|name| Vc::cell(Box::new(ServerDirectiveTransformer::new(name)) as _)), ] .into_iter() .flatten() diff --git a/packages/next-swc/crates/next-core/src/next_server/context.rs b/packages/next-swc/crates/next-core/src/next_server/context.rs index 53fdcfdc12dfd..0a0baf503dfbb 100644 --- a/packages/next-swc/crates/next-core/src/next_server/context.rs +++ b/packages/next-swc/crates/next-core/src/next_server/context.rs @@ -244,6 +244,7 @@ pub async fn get_server_module_options_context( ty: Value, mode: NextMode, next_config: Vc, + server_transition_name: Option>, ) -> Result> { let custom_rules = get_next_server_transforms_rules(next_config, ty.into_value(), mode).await?; let internal_custom_rules = get_next_server_internal_transforms_rules(ty.into_value()).await?; @@ -291,12 +292,8 @@ pub async fn get_server_module_options_context( let styled_components_transform_plugin = *get_styled_components_transform_plugin(next_config).await?; let styled_jsx_transform_plugin = *get_styled_jsx_transform_plugin().await?; - let server_directive_transform_plugin = - Some(Vc::cell(Box::new(ServerDirectiveTransformer::new( - // ServerDirective is not implemented yet and always reports an issue. - // We don't have to pass a valid transition name yet, but the API is prepared. - &Vc::cell("TODO".to_string()), - )) as _)); + let server_directive_transform_plugin = server_transition_name + .map(|name| Vc::cell(Box::new(ServerDirectiveTransformer::new(name)) as _)); // ModuleOptionsContext related options let tsconfig = get_typescript_transform_options(project_path); From e2647b990159166422bb5f509be58ec1fd4e87d4 Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Mon, 23 Oct 2023 18:52:50 -0400 Subject: [PATCH 03/12] Enable server actions, fix encryption --- packages/next-swc/crates/next-core/src/next_import_map.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/next-swc/crates/next-core/src/next_import_map.rs b/packages/next-swc/crates/next-core/src/next_import_map.rs index f25b6d6f097f1..6289d0e865faf 100644 --- a/packages/next-swc/crates/next-core/src/next_import_map.rs +++ b/packages/next-swc/crates/next-core/src/next_import_map.rs @@ -319,6 +319,13 @@ pub async fn get_next_server_import_map( "next/dist/build/webpack/loaders/next-flight-loader/action-validate", ), ); + import_map.insert_exact_alias( + "private-next-rsc-action-encryption", + request_to_import_mapping( + project_path, + "next/dist/server/app-render/action-encryption", + ), + ); import_map.insert_exact_alias( "next/head", request_to_import_mapping(project_path, "next/dist/client/components/noop-head"), From f3090016e8e5ee55b0a78e8775d5407ac6a7b888 Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Mon, 23 Oct 2023 22:49:59 -0400 Subject: [PATCH 04/12] Map private RSC modules in client bundles, too --- .../crates/next-core/src/next_import_map.rs | 57 ++++++++++--------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/packages/next-swc/crates/next-core/src/next_import_map.rs b/packages/next-swc/crates/next-core/src/next_import_map.rs index 6289d0e865faf..334969f1aa074 100644 --- a/packages/next-swc/crates/next-core/src/next_import_map.rs +++ b/packages/next-swc/crates/next-core/src/next_import_map.rs @@ -298,34 +298,6 @@ pub async fn get_next_server_import_map( ServerContextType::AppSSR { .. } | ServerContextType::AppRSC { .. } | ServerContextType::AppRoute { .. } => { - import_map.insert_exact_alias( - "private-next-rsc-action-proxy", - request_to_import_mapping( - project_path, - "next/dist/build/webpack/loaders/next-flight-loader/action-proxy", - ), - ); - import_map.insert_exact_alias( - "private-next-rsc-action-client-wrapper", - request_to_import_mapping( - project_path, - "next/dist/build/webpack/loaders/next-flight-loader/action-client-wrapper", - ), - ); - import_map.insert_exact_alias( - "private-next-rsc-action-validate", - request_to_import_mapping( - project_path, - "next/dist/build/webpack/loaders/next-flight-loader/action-validate", - ), - ); - import_map.insert_exact_alias( - "private-next-rsc-action-encryption", - request_to_import_mapping( - project_path, - "next/dist/server/app-render/action-encryption", - ), - ); import_map.insert_exact_alias( "next/head", request_to_import_mapping(project_path, "next/dist/client/components/noop-head"), @@ -835,6 +807,35 @@ async fn insert_next_shared_aliases( request_to_import_mapping(project_path, "next/dist/compiled/setimmediate"), ); + import_map.insert_exact_alias( + "private-next-rsc-action-proxy", + request_to_import_mapping( + project_path, + "next/dist/build/webpack/loaders/next-flight-loader/action-proxy", + ), + ); + import_map.insert_exact_alias( + "private-next-rsc-action-client-wrapper", + request_to_import_mapping( + project_path, + "next/dist/build/webpack/loaders/next-flight-loader/action-client-wrapper", + ), + ); + import_map.insert_exact_alias( + "private-next-rsc-action-validate", + request_to_import_mapping( + project_path, + "next/dist/build/webpack/loaders/next-flight-loader/action-validate", + ), + ); + import_map.insert_exact_alias( + "private-next-rsc-action-encryption", + request_to_import_mapping( + project_path, + "next/dist/server/app-render/action-encryption", + ), + ); + insert_turbopack_dev_alias(import_map); insert_package_alias( import_map, From c4505b10f11fec72172dbacdc71670c257f4847f Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Mon, 23 Oct 2023 22:50:24 -0400 Subject: [PATCH 05/12] Generate a proper encryptionKey --- .../src/server/lib/router-utils/setup-dev-bundler.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/next/src/server/lib/router-utils/setup-dev-bundler.ts b/packages/next/src/server/lib/router-utils/setup-dev-bundler.ts index 260e347003fee..0c5f08d05f7ce 100644 --- a/packages/next/src/server/lib/router-utils/setup-dev-bundler.ts +++ b/packages/next/src/server/lib/router-utils/setup-dev-bundler.ts @@ -126,6 +126,7 @@ import { clearModuleContext } from '../render-server' import type { ActionManifest } from '../../../build/webpack/plugins/flight-client-entry-plugin' import { denormalizePagePath } from '../../../shared/lib/page-path/denormalize-page-path' import type { LoadableManifest } from '../../load-components' +import { generateRandomActionKeyRaw } from '../../app-render/action-encryption-utils' const wsServer = new ws.Server({ noServer: true }) @@ -736,12 +737,12 @@ async function startWatcher(opts: SetupOpts) { return manifest } - function mergeActionManifests(manifests: Iterable) { + async function mergeActionManifests(manifests: Iterable) { type ActionEntries = ActionManifest['edge' | 'node'] const manifest: ActionManifest = { node: {}, edge: {}, - encryptionKey: '', + encryptionKey: await generateRandomActionKeyRaw(true), } function mergeActionIds( @@ -761,7 +762,6 @@ async function startWatcher(opts: SetupOpts) { for (const m of manifests) { mergeActionIds(manifest.node, m.node) mergeActionIds(manifest.edge, m.edge) - manifest.encryptionKey = m.encryptionKey } return manifest @@ -909,7 +909,9 @@ async function startWatcher(opts: SetupOpts) { } async function writeActionManifest(): Promise { - const actionManifest = mergeActionManifests(actionManifests.values()) + const actionManifest = await mergeActionManifests( + actionManifests.values() + ) const actionManifestJsonPath = path.join( distDir, 'server', From 21bd3def19ea2e8614a15309f9d72bea9043064e Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Mon, 23 Oct 2023 23:30:19 -0400 Subject: [PATCH 06/12] Mock server-only in AppSSR --- packages/next-swc/crates/next-core/src/next_import_map.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/next-swc/crates/next-core/src/next_import_map.rs b/packages/next-swc/crates/next-core/src/next_import_map.rs index 334969f1aa074..55bd0161b563a 100644 --- a/packages/next-swc/crates/next-core/src/next_import_map.rs +++ b/packages/next-swc/crates/next-core/src/next_import_map.rs @@ -558,9 +558,7 @@ async fn insert_next_server_special_aliases( // see https://github.com/vercel/next.js/blob/8013ef7372fc545d49dbd060461224ceb563b454/packages/next/src/build/webpack-config.ts#L1449-L1531 match ty { - ServerContextType::Pages { .. } - | ServerContextType::PagesData { .. } - | ServerContextType::AppSSR { .. } => { + ServerContextType::Pages { .. } | ServerContextType::PagesData { .. } => { insert_exact_alias_map( import_map, project_path, @@ -575,6 +573,7 @@ async fn insert_next_server_special_aliases( // TODO: should include `ServerContextType::PagesApi` routes, but that type doesn't exist. ServerContextType::AppRSC { .. } | ServerContextType::AppRoute { .. } + | ServerContextType::AppSSR { .. } | ServerContextType::Middleware => { insert_exact_alias_map( import_map, From a909f3bef5f3b689eee3a6945ae817c700bb2850 Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Mon, 23 Oct 2023 22:50:42 -0400 Subject: [PATCH 07/12] Crawl client->server references for actions --- packages/next-swc/crates/next-api/src/app.rs | 7 ++- .../crates/next-api/src/server_actions.rs | 50 +++++++++++-------- .../next_app/app_client_references_chunks.rs | 28 ++++++++++- .../next-core/src/next_manifests/mod.rs | 18 ++++++- 4 files changed, 77 insertions(+), 26 deletions(-) diff --git a/packages/next-swc/crates/next-api/src/app.rs b/packages/next-swc/crates/next-api/src/app.rs index 071c371c98d36..39192db9ca733 100644 --- a/packages/next-swc/crates/next-api/src/app.rs +++ b/packages/next-swc/crates/next-api/src/app.rs @@ -9,6 +9,7 @@ use next_core::{ get_edge_resolve_options_context, mode::NextMode, next_app::{ + app_client_references_chunks::get_app_server_reference_modules, get_app_client_references_chunks, get_app_client_shared_chunks, get_app_page_entry, get_app_route_entry, metadata::route::get_app_metadata_route_entry, AppEntry, AppPage, }, @@ -839,7 +840,8 @@ impl AppEndpoint { evaluatable_assets.push(evaluatable); let (loader, manifest) = create_server_actions_manifest( - app_entry.rsc_entry, + Vc::upcast(app_entry.rsc_entry), + get_app_server_reference_modules(client_reference_types), node_root, &app_entry.pathname, &app_entry.original_name, @@ -989,7 +991,8 @@ impl AppEndpoint { this.app_project.rsc_runtime_entries().await?.clone_value(); let (loader, manifest) = create_server_actions_manifest( - app_entry.rsc_entry, + Vc::upcast(app_entry.rsc_entry), + get_app_server_reference_modules(client_reference_types), node_root, &app_entry.pathname, &app_entry.original_name, 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 412e99ff6104d..4204f7aeef895 100644 --- a/packages/next-swc/crates/next-api/src/server_actions.rs +++ b/packages/next-swc/crates/next-api/src/server_actions.rs @@ -1,4 +1,4 @@ -use std::io::Write; +use std::{io::Write, iter::once}; use anyhow::{bail, Result}; use indexmap::IndexMap; @@ -42,7 +42,8 @@ use turbopack_binding::{ /// If Server Actions are not enabled, this returns an empty manifest and a None /// loader. pub(crate) async fn create_server_actions_manifest( - entry: Vc>, + rsc_entry: Vc>, + server_reference_modules: Vc>>>, node_root: Vc, pathname: &str, page_name: &str, @@ -53,7 +54,7 @@ pub(crate) async fn create_server_actions_manifest( Option>>, Vc>, )> { - let actions = get_actions(Vc::upcast(entry)); + let actions = get_actions(rsc_entry, server_reference_modules); let loader = build_server_actions_loader(node_root, page_name, actions, asset_context).await?; let Some(evaluable) = Vc::try_resolve_sidecast::>(loader).await? else { @@ -101,7 +102,7 @@ async fn build_server_actions_loader( ", )?; } - import_map.insert(module_name, *module); + import_map.insert(module_name, module.1); } write!(contents, "}});")?; @@ -147,17 +148,15 @@ async fn build_manifest( NextRuntime::NodeJs => &mut manifest.node, }; - for value in actions_value.values() { - let value = value.await?; - for hash in value.keys() { + for ((layer, _), action_map) in actions_value { + let action_map = action_map.await?; + for hash in action_map.keys() { let entry = mapping.entry(hash.clone()).or_default(); entry.workers.insert( format!("app{page_name}"), ActionManifestWorkerEntry::String(loader_id_value.clone_value()), ); - entry - .layer - .insert(format!("app{page_name}"), ActionLayer::Rsc); + entry.layer.insert(format!("app{page_name}"), *layer); } } @@ -171,10 +170,21 @@ async fn build_manifest( /// comment which identifies server actions. Every found server action will be /// returned along with the module which exports that action. #[turbo_tasks::function] -async fn get_actions(module: Vc>) -> Result> { +async fn get_actions( + rsc_entry: Vc>, + server_reference_modules: Vc>>>, +) -> Result> { let mut all_actions = NonDeterministic::new() .skip_duplicates() - .visit([module], get_referenced_modules) + .visit( + once((ActionLayer::Rsc, rsc_entry)).chain( + server_reference_modules + .await? + .iter() + .map(|m| (ActionLayer::ActionBrowser, *m)), + ), + get_referenced_modules, + ) .await .completed()? .into_inner() @@ -192,11 +202,11 @@ async fn get_actions(module: Vc>) -> Result> /// Our graph traversal visitor, which finds the primary modules directly /// referenced by [parent]. async fn get_referenced_modules( - parent: Vc>, -) -> Result>> + Send> { - primary_referenced_modules(parent) + (layer, module): (ActionLayer, Vc>), +) -> Result>)> + Send> { + primary_referenced_modules(module) .await - .map(|modules| modules.clone_value().into_iter()) + .map(|modules| modules.clone_value().into_iter().map(move |m| (layer, m))) } /// Inspects the comments inside [module] looking for the magic actions comment. @@ -231,19 +241,19 @@ async fn parse_actions(module: Vc>) -> Result>, -) -> Result>, Vc)>> { + (layer, module): (ActionLayer, Vc>), +) -> Result>), Vc)>> { parse_actions(module).await.map(|option_action_map| { option_action_map .clone_value() - .map(|action_map| (module, action_map)) + .map(|action_map| ((layer, module), action_map)) }) } /// A mapping of every module which exports a Server Action, with the hashed id /// and exported name of each found action. #[turbo_tasks::value(transparent)] -struct ModuleActionMap(IndexMap>, Vc>); +struct ModuleActionMap(IndexMap<(ActionLayer, Vc>), Vc>); #[turbo_tasks::value_impl] impl ModuleActionMap { diff --git a/packages/next-swc/crates/next-core/src/next_app/app_client_references_chunks.rs b/packages/next-swc/crates/next-core/src/next_app/app_client_references_chunks.rs index 30333762d684d..2a759b7b1087b 100644 --- a/packages/next-swc/crates/next-core/src/next_app/app_client_references_chunks.rs +++ b/packages/next-swc/crates/next-core/src/next_app/app_client_references_chunks.rs @@ -1,9 +1,11 @@ use anyhow::Result; use indexmap::IndexMap; use serde::{Deserialize, Serialize}; -use turbo_tasks::{debug::ValueDebugFormat, trace::TraceRawVcs, TryJoinIterExt, Vc}; +use turbo_tasks::{ + debug::ValueDebugFormat, trace::TraceRawVcs, TryFlatJoinIterExt, TryJoinIterExt, Vc, +}; use turbopack_binding::turbopack::{ - core::{chunk::ChunkingContextExt, output::OutputAssets}, + core::{chunk::ChunkingContextExt, module::Module, output::OutputAssets}, ecmascript::chunk::EcmascriptChunkingContext, }; @@ -70,3 +72,25 @@ pub async fn get_app_client_references_chunks( Ok(Vc::cell(app_client_references_chunks)) } + +#[turbo_tasks::function] +pub async fn get_app_server_reference_modules( + app_client_reference_types: Vc, +) -> Result>>>> { + Ok(Vc::cell( + app_client_reference_types + .await? + .iter() + .map(|client_reference_ty| async move { + Ok(match client_reference_ty { + ClientReferenceType::EcmascriptClientReference(ecmascript_client_reference) => { + let ecmascript_client_reference_ref = ecmascript_client_reference.await?; + Some(Vc::upcast(ecmascript_client_reference_ref.ssr_module)) + } + _ => None, + }) + }) + .try_flat_join() + .await?, + )) +} diff --git a/packages/next-swc/crates/next-core/src/next_manifests/mod.rs b/packages/next-swc/crates/next-core/src/next_manifests/mod.rs index 9d1b98bb0b1a4..b6f727de4ccd0 100644 --- a/packages/next-swc/crates/next-core/src/next_manifests/mod.rs +++ b/packages/next-swc/crates/next-core/src/next_manifests/mod.rs @@ -4,7 +4,8 @@ pub(crate) mod client_reference_manifest; use std::collections::HashMap; -use serde::Serialize; +use serde::{Deserialize, Serialize}; +use turbo_tasks::{trace::TraceRawVcs, TaskInput}; use crate::next_config::Rewrites; @@ -183,7 +184,20 @@ pub enum ActionManifestWorkerEntry { Number(f64), } -#[derive(Serialize, Debug)] +#[derive( + Debug, + Copy, + Clone, + Hash, + Eq, + PartialEq, + Ord, + PartialOrd, + TaskInput, + TraceRawVcs, + Serialize, + Deserialize, +)] #[serde(rename_all = "camelCase")] pub enum ActionLayer { Rsc, From d103b4c0e76029eb712e88f4d7d0897aa6688e7e Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Wed, 25 Oct 2023 00:35:52 -0400 Subject: [PATCH 08/12] Cleanup --- packages/next-swc/crates/next-api/src/app.rs | 16 ------------ .../next-swc/crates/next-api/src/pages.rs | 3 --- .../next-swc/crates/next-api/src/project.rs | 1 - .../crates/next-api/src/server_actions.rs | 26 ++++++++++++++++--- .../next-build/src/next_app/app_entries.rs | 13 ---------- .../next-build/src/next_pages/page_entries.rs | 2 -- .../next_app/app_client_references_chunks.rs | 2 +- .../next-core/src/next_client/context.rs | 4 --- .../next-core/src/next_server/context.rs | 20 +++++--------- .../next-core/src/next_server/transforms.rs | 3 ++- 10 files changed, 31 insertions(+), 59 deletions(-) diff --git a/packages/next-swc/crates/next-api/src/app.rs b/packages/next-swc/crates/next-api/src/app.rs index 39192db9ca733..aabbb4dd067ca 100644 --- a/packages/next-swc/crates/next-api/src/app.rs +++ b/packages/next-swc/crates/next-api/src/app.rs @@ -100,7 +100,6 @@ impl AppProject { } const ECMASCRIPT_CLIENT_TRANSITION_NAME: &str = "next-ecmascript-client-reference"; -const ECMASCRIPT_SERVER_TRANSITION_NAME: &str = "next-ecmascript-server-reference"; #[turbo_tasks::value_impl] impl AppProject { @@ -144,7 +143,6 @@ impl AppProject { Value::new(self.client_ty()), this.mode, self.project().next_config(), - Some(self.server_transition_name()), )) } @@ -165,11 +163,6 @@ impl AppProject { Vc::cell(ECMASCRIPT_CLIENT_TRANSITION_NAME.to_string()) } - #[turbo_tasks::function] - fn server_transition_name(self: Vc) -> Vc { - Vc::cell(ECMASCRIPT_SERVER_TRANSITION_NAME.to_string()) - } - #[turbo_tasks::function] fn client_transition(self: Vc) -> Vc { ContextTransition::new( @@ -189,7 +182,6 @@ impl AppProject { Value::new(self.rsc_ty()), this.mode, self.project().next_config(), - Some(self.server_transition_name()), )) } @@ -227,13 +219,6 @@ impl AppProject { self.ssr_transition(), )), ), - ( - ECMASCRIPT_SERVER_TRANSITION_NAME.to_string(), - Vc::upcast(NextEcmascriptClientReferenceTransition::new( - self.client_transition(), - self.ssr_transition(), - )), - ), ( "next-dynamic".to_string(), Vc::upcast(NextDynamicTransition::new(self.client_transition())), @@ -301,7 +286,6 @@ impl AppProject { Value::new(self.ssr_ty()), this.mode, self.project().next_config(), - Some(self.server_transition_name()), )) } diff --git a/packages/next-swc/crates/next-api/src/pages.rs b/packages/next-swc/crates/next-api/src/pages.rs index 1bcca728a7c5e..10197cab3224b 100644 --- a/packages/next-swc/crates/next-api/src/pages.rs +++ b/packages/next-swc/crates/next-api/src/pages.rs @@ -280,7 +280,6 @@ impl PagesProject { }), this.mode, self.project().next_config(), - None, )) } @@ -364,7 +363,6 @@ impl PagesProject { }), this.mode, self.project().next_config(), - None, )) } @@ -379,7 +377,6 @@ impl PagesProject { }), this.mode, self.project().next_config(), - None, )) } diff --git a/packages/next-swc/crates/next-api/src/project.rs b/packages/next-swc/crates/next-api/src/project.rs index 7a9b46c9ad397..1bb274708e47c 100644 --- a/packages/next-swc/crates/next-api/src/project.rs +++ b/packages/next-swc/crates/next-api/src/project.rs @@ -691,7 +691,6 @@ impl Project { Value::new(ServerContextType::Middleware), NextMode::Development, self.next_config(), - None, ), get_edge_resolve_options_context( self.project_path(), 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 4204f7aeef895..281f8453a5f19 100644 --- a/packages/next-swc/crates/next-api/src/server_actions.rs +++ b/packages/next-swc/crates/next-api/src/server_actions.rs @@ -16,20 +16,20 @@ use turbopack_binding::{ turbo::tasks_fs::{rope::RopeBuilder, File, FileSystemPath}, turbopack::{ core::{ - asset::AssetContent, + asset::{Asset, AssetContent}, chunk::{ChunkItemExt, ChunkableModule, EvaluatableAsset}, context::AssetContext, module::Module, output::OutputAsset, reference::primary_referenced_modules, - reference_type::ReferenceType, + reference_type::{EcmaScriptModulesReferenceSubType, ReferenceType}, virtual_output::VirtualOutputAsset, virtual_source::VirtualSource, }, ecmascript::{ chunk::{EcmascriptChunkPlaceable, EcmascriptChunkingContext}, parse::ParseResult, - EcmascriptModuleAsset, + EcmascriptModuleAsset, EcmascriptModuleAssetType, }, }, }; @@ -54,7 +54,7 @@ pub(crate) async fn create_server_actions_manifest( Option>>, Vc>, )> { - let actions = get_actions(rsc_entry, server_reference_modules); + let actions = get_actions(rsc_entry, server_reference_modules, asset_context); let loader = build_server_actions_loader(node_root, page_name, actions, asset_context).await?; let Some(evaluable) = Vc::try_resolve_sidecast::>(loader).await? else { @@ -173,6 +173,7 @@ async fn build_manifest( async fn get_actions( rsc_entry: Vc>, server_reference_modules: Vc>>>, + asset_context: Vc>, ) -> Result> { let mut all_actions = NonDeterministic::new() .skip_duplicates() @@ -193,6 +194,23 @@ async fn get_actions( .try_flat_join() .await? .into_iter() + .map(|((layer, module), actions)| { + let module = if layer == ActionLayer::Rsc { + module + } else { + let source = VirtualSource::new( + module.ident().path().join("action.js".to_string()), + module.content(), + ); + asset_context.process( + Vc::upcast(source), + Value::new(ReferenceType::EcmaScriptModules( + EcmaScriptModulesReferenceSubType::Undefined, + )), + ) + }; + ((layer, module), actions) + }) .collect::>(); all_actions.sort_keys(); diff --git a/packages/next-swc/crates/next-build/src/next_app/app_entries.rs b/packages/next-swc/crates/next-build/src/next_app/app_entries.rs index d22cfc25c9609..d9c8e1664a63d 100644 --- a/packages/next-swc/crates/next-build/src/next_app/app_entries.rs +++ b/packages/next-swc/crates/next-build/src/next_app/app_entries.rs @@ -41,7 +41,6 @@ use turbopack_binding::{ }; const ECMASCRIPT_CLIENT_TRANSITION_NAME: &str = "next-ecmascript-client-reference"; -const ECMASCRIPT_SERVER_TRANSITION_NAME: &str = "next-ecmascript-server-reference"; #[turbo_tasks::value] pub struct AppEntries { @@ -101,7 +100,6 @@ pub async fn get_app_entries( client_ty, mode, next_config, - Some(Vc::cell(ECMASCRIPT_SERVER_TRANSITION_NAME.to_string())), ); let client_resolve_options_context = get_client_resolve_options_context( @@ -127,14 +125,12 @@ pub async fn get_app_entries( execution_context, ); - let server_transition_name = Vc::cell(ECMASCRIPT_SERVER_TRANSITION_NAME.to_string()); let ssr_module_options_context = get_server_module_options_context( project_root, execution_context, ssr_ty, mode, next_config, - Some(server_transition_name), ); let ssr_transition = ContextTransition::new( @@ -153,14 +149,6 @@ pub async fn get_app_entries( ssr_transition, )), ); - // TODO: - // transitions.insert( - // ECMASCRIPT_SERVER_TRANSITION_NAME.to_string(), - // Vc::upcast(NextEcmascriptClientReferenceTransition::new( - // client_transition, - // ssr_transition, - // )), - // ); let client_ty = Value::new(ClientContextType::App { app_dir }); transitions.insert( @@ -182,7 +170,6 @@ pub async fn get_app_entries( rsc_ty, mode, next_config, - Some(server_transition_name), ); let rsc_resolve_options_context = get_server_resolve_options_context( project_root, diff --git a/packages/next-swc/crates/next-build/src/next_pages/page_entries.rs b/packages/next-swc/crates/next-build/src/next_pages/page_entries.rs index b4f7bbf560575..fb4b0b80ff34b 100644 --- a/packages/next-swc/crates/next-build/src/next_pages/page_entries.rs +++ b/packages/next-swc/crates/next-build/src/next_pages/page_entries.rs @@ -86,7 +86,6 @@ pub async fn get_page_entries( client_ty, mode, next_config, - None, ); let client_resolve_options_context = get_client_resolve_options_context( @@ -143,7 +142,6 @@ pub async fn get_page_entries( ssr_ty, mode, next_config, - None, ); let ssr_module_context = Vc::upcast(ModuleAssetContext::new( diff --git a/packages/next-swc/crates/next-core/src/next_app/app_client_references_chunks.rs b/packages/next-swc/crates/next-core/src/next_app/app_client_references_chunks.rs index 2a759b7b1087b..9678e0b710d06 100644 --- a/packages/next-swc/crates/next-core/src/next_app/app_client_references_chunks.rs +++ b/packages/next-swc/crates/next-core/src/next_app/app_client_references_chunks.rs @@ -85,7 +85,7 @@ pub async fn get_app_server_reference_modules( Ok(match client_reference_ty { ClientReferenceType::EcmascriptClientReference(ecmascript_client_reference) => { let ecmascript_client_reference_ref = ecmascript_client_reference.await?; - Some(Vc::upcast(ecmascript_client_reference_ref.ssr_module)) + Some(Vc::upcast(ecmascript_client_reference_ref.client_module)) } _ => None, }) diff --git a/packages/next-swc/crates/next-core/src/next_client/context.rs b/packages/next-swc/crates/next-core/src/next_client/context.rs index 01d34bf88691f..8e0c3563dd361 100644 --- a/packages/next-swc/crates/next-core/src/next_client/context.rs +++ b/packages/next-swc/crates/next-core/src/next_client/context.rs @@ -18,7 +18,6 @@ use turbopack_binding::{ }, dev::{react_refresh::assert_can_resolve_react_refresh, DevChunkingContext}, ecmascript::chunk::EcmascriptChunkingContext, - ecmascript_plugin::transform::directives::server::ServerDirectiveTransformer, node::execution_context::ExecutionContext, turbopack::{ condition::ContextCondition, @@ -181,7 +180,6 @@ pub async fn get_client_module_options_context( ty: Value, mode: NextMode, next_config: Vc, - server_transition_name: Option>, ) -> Result> { let custom_rules = get_next_client_transforms_rules(next_config, ty.into_value(), mode).await?; let resolve_options_context = @@ -245,8 +243,6 @@ pub async fn get_client_module_options_context( *get_emotion_transform_plugin(next_config).await?, *get_styled_components_transform_plugin(next_config).await?, *get_styled_jsx_transform_plugin().await?, - server_transition_name - .map(|name| Vc::cell(Box::new(ServerDirectiveTransformer::new(name)) as _)), ] .into_iter() .flatten() diff --git a/packages/next-swc/crates/next-core/src/next_server/context.rs b/packages/next-swc/crates/next-core/src/next_server/context.rs index 0a0baf503dfbb..d42d7c5c0856a 100644 --- a/packages/next-swc/crates/next-core/src/next_server/context.rs +++ b/packages/next-swc/crates/next-core/src/next_server/context.rs @@ -18,9 +18,7 @@ use turbopack_binding::{ resolve::{parse::Request, pattern::Pattern}, }, ecmascript::TransformPlugin, - ecmascript_plugin::transform::directives::{ - client::ClientDirectiveTransformer, server::ServerDirectiveTransformer, - }, + ecmascript_plugin::transform::directives::client::ClientDirectiveTransformer, node::execution_context::ExecutionContext, turbopack::{ condition::ContextCondition, @@ -244,7 +242,6 @@ pub async fn get_server_module_options_context( ty: Value, mode: NextMode, next_config: Vc, - server_transition_name: Option>, ) -> Result> { let custom_rules = get_next_server_transforms_rules(next_config, ty.into_value(), mode).await?; let internal_custom_rules = get_next_server_internal_transforms_rules(ty.into_value()).await?; @@ -292,8 +289,6 @@ pub async fn get_server_module_options_context( let styled_components_transform_plugin = *get_styled_components_transform_plugin(next_config).await?; let styled_jsx_transform_plugin = *get_styled_jsx_transform_plugin().await?; - let server_directive_transform_plugin = server_transition_name - .map(|name| Vc::cell(Box::new(ServerDirectiveTransformer::new(name)) as _)); // ModuleOptionsContext related options let tsconfig = get_typescript_transform_options(project_path); @@ -392,7 +387,6 @@ pub async fn get_server_module_options_context( let mut base_source_transforms: Vec> = vec![ styled_components_transform_plugin, styled_jsx_transform_plugin, - server_directive_transform_plugin, ] .into_iter() .flatten() @@ -466,13 +460,11 @@ pub async fn get_server_module_options_context( ecmascript_client_reference_transition_name, .. } => { - let mut base_source_transforms: Vec> = vec![ - styled_components_transform_plugin, - server_directive_transform_plugin, - ] - .into_iter() - .flatten() - .collect(); + let mut base_source_transforms: Vec> = + vec![styled_components_transform_plugin] + .into_iter() + .flatten() + .collect(); if let Some(ecmascript_client_reference_transition_name) = ecmascript_client_reference_transition_name diff --git a/packages/next-swc/crates/next-core/src/next_server/transforms.rs b/packages/next-swc/crates/next-core/src/next_server/transforms.rs index 85533ca34ca26..5503863f455f1 100644 --- a/packages/next-swc/crates/next-core/src/next_server/transforms.rs +++ b/packages/next-swc/crates/next-core/src/next_server/transforms.rs @@ -39,7 +39,8 @@ pub async fn get_next_server_transforms_rules( (false, Some(pages_dir)) } ServerContextType::AppSSR { .. } => { - rules.push(get_server_actions_transform_rule(ActionsTransform::Server)); + // Yah, this is SSR, but for some reason that's not "Server". + rules.push(get_server_actions_transform_rule(ActionsTransform::Client)); (false, None) } ServerContextType::AppRSC { From 0b8f319f2dc730b9b506ba02a10e00b946500afd Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Wed, 25 Oct 2023 01:22:15 -0400 Subject: [PATCH 09/12] Disambiguate actions layer in hash id --- .../next-core/src/next_shared/transforms/server_actions.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/next-swc/crates/next-core/src/next_shared/transforms/server_actions.rs b/packages/next-swc/crates/next-core/src/next_shared/transforms/server_actions.rs index 87c10281c4e52..f87c30d50a469 100644 --- a/packages/next-swc/crates/next-core/src/next_shared/transforms/server_actions.rs +++ b/packages/next-swc/crates/next-core/src/next_shared/transforms/server_actions.rs @@ -40,7 +40,9 @@ struct NextServerActions { impl CustomTransformer for NextServerActions { async fn transform(&self, program: &mut Program, ctx: &TransformContext<'_>) -> Result<()> { let mut actions = server_actions( - &FileName::Real(ctx.file_path_str.into()), + // The same action can be imported by both server and client, and we need to give both + // types a distinct Action hash ID. + &FileName::Real(format!("{}_{:?}", ctx.file_path_str, self.transform).into()), Config { is_server: matches!(self.transform, ActionsTransform::Server), enabled: true, From 96f830b01a22efe107113c1a8afbcda621c7b485 Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Wed, 25 Oct 2023 01:33:12 -0400 Subject: [PATCH 10/12] Comments --- packages/next-swc/crates/next-api/src/server_actions.rs | 2 ++ .../next-core/src/next_app/app_client_references_chunks.rs | 2 ++ .../next-swc/crates/next-core/src/next_server/transforms.rs | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) 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 281f8453a5f19..f79213f240343 100644 --- a/packages/next-swc/crates/next-api/src/server_actions.rs +++ b/packages/next-swc/crates/next-api/src/server_actions.rs @@ -198,6 +198,8 @@ async fn get_actions( let module = if layer == ActionLayer::Rsc { module } else { + // The ActionBrowser layer's module is in the Client context, and we need to + // bring it into the RSC context. let source = VirtualSource::new( module.ident().path().join("action.js".to_string()), module.content(), diff --git a/packages/next-swc/crates/next-core/src/next_app/app_client_references_chunks.rs b/packages/next-swc/crates/next-core/src/next_app/app_client_references_chunks.rs index 9678e0b710d06..236ad146ef10a 100644 --- a/packages/next-swc/crates/next-core/src/next_app/app_client_references_chunks.rs +++ b/packages/next-swc/crates/next-core/src/next_app/app_client_references_chunks.rs @@ -73,6 +73,8 @@ pub async fn get_app_client_references_chunks( Ok(Vc::cell(app_client_references_chunks)) } +/// Crawls all modules emitted in the client transition, returning a list of all +/// client JS modules. #[turbo_tasks::function] pub async fn get_app_server_reference_modules( app_client_reference_types: Vc, diff --git a/packages/next-swc/crates/next-core/src/next_server/transforms.rs b/packages/next-swc/crates/next-core/src/next_server/transforms.rs index 5503863f455f1..a9495b1441e66 100644 --- a/packages/next-swc/crates/next-core/src/next_server/transforms.rs +++ b/packages/next-swc/crates/next-core/src/next_server/transforms.rs @@ -39,7 +39,7 @@ pub async fn get_next_server_transforms_rules( (false, Some(pages_dir)) } ServerContextType::AppSSR { .. } => { - // Yah, this is SSR, but for some reason that's not "Server". + // Yah, this is SSR, but this is still treated as a Client transform layer. rules.push(get_server_actions_transform_rule(ActionsTransform::Client)); (false, None) } From 84251f1b81fa4a03e1b319ad1c4448bc77c46dbe Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Wed, 25 Oct 2023 01:50:23 -0400 Subject: [PATCH 11/12] Eliminated unneeded Option --- packages/next-swc/crates/next-api/src/app.rs | 8 ++------ packages/next-swc/crates/next-api/src/server_actions.rs | 7 ++----- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/packages/next-swc/crates/next-api/src/app.rs b/packages/next-swc/crates/next-api/src/app.rs index aabbb4dd067ca..f3f706f96a779 100644 --- a/packages/next-swc/crates/next-api/src/app.rs +++ b/packages/next-swc/crates/next-api/src/app.rs @@ -835,9 +835,7 @@ impl AppEndpoint { ) .await?; server_assets.push(manifest); - if let Some(loader) = loader { - evaluatable_assets.push(loader); - } + evaluatable_assets.push(loader); let files = chunking_context.evaluated_chunk_group( app_entry.rsc_entry.ident(), @@ -986,9 +984,7 @@ impl AppEndpoint { ) .await?; server_assets.push(manifest); - if let Some(loader) = loader { - evaluatable_assets.push(loader); - } + evaluatable_assets.push(loader); let rsc_chunk = this .app_project 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 f79213f240343..b5f242be39c49 100644 --- a/packages/next-swc/crates/next-api/src/server_actions.rs +++ b/packages/next-swc/crates/next-api/src/server_actions.rs @@ -50,10 +50,7 @@ pub(crate) async fn create_server_actions_manifest( runtime: NextRuntime, asset_context: Vc>, chunking_context: Vc>, -) -> Result<( - Option>>, - Vc>, -)> { +) -> Result<(Vc>, Vc>)> { let actions = get_actions(rsc_entry, server_reference_modules, asset_context); let loader = build_server_actions_loader(node_root, page_name, actions, asset_context).await?; let Some(evaluable) = Vc::try_resolve_sidecast::>(loader).await? @@ -67,7 +64,7 @@ pub(crate) async fn create_server_actions_manifest( .to_string(); let manifest = build_manifest(node_root, pathname, page_name, runtime, actions, loader_id).await?; - Ok((Some(evaluable), manifest)) + Ok((evaluable, manifest)) } /// Builds the "action loader" entry point, which reexports every found action From ab587139824bc3b2041b7e010763e9e1347cd2d2 Mon Sep 17 00:00:00 2001 From: Justin Ridgewell Date: Wed, 25 Oct 2023 02:01:08 -0400 Subject: [PATCH 12/12] Clippy --- packages/next-swc/crates/next-api/src/server_actions.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 b5f242be39c49..3e4180c98d718 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,7 @@ use turbopack_binding::{ ecmascript::{ chunk::{EcmascriptChunkPlaceable, EcmascriptChunkingContext}, parse::ParseResult, - EcmascriptModuleAsset, EcmascriptModuleAssetType, + EcmascriptModuleAsset, }, }, }; @@ -267,10 +267,12 @@ async fn parse_actions_filter_map( }) } +type LayerModuleActionMap = IndexMap<(ActionLayer, Vc>), Vc>; + /// A mapping of every module which exports a Server Action, with the hashed id /// and exported name of each found action. #[turbo_tasks::value(transparent)] -struct ModuleActionMap(IndexMap<(ActionLayer, Vc>), Vc>); +struct ModuleActionMap(LayerModuleActionMap); #[turbo_tasks::value_impl] impl ModuleActionMap {