Skip to content

Commit 6158c1f

Browse files
authored
Fix default export and exported function expressions handling of cache directive transform (#71334)
This PR fixes the transform of handling `export default async function() {}` and `export const foo = async function() {}` cases (both are exported `fnExpr`, instead of `fnDecl`) in a `"use cache"` annotated file.
1 parent 1255f20 commit 6158c1f

File tree

3 files changed

+46
-32
lines changed

3 files changed

+46
-32
lines changed

crates/next-custom-transforms/src/transforms/server_actions.rs

Lines changed: 29 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -895,40 +895,38 @@ impl<C: Comments> VisitMut for ServerActions<C> {
895895
}
896896

897897
if let Some(cache_type_str) = cache_type {
898-
if !(self.in_cache_file.is_some() && self.in_export_decl) {
899-
// It's a cache function. If it doesn't have a name, give it one.
900-
match f.ident.as_mut() {
901-
None => {
902-
let action_name = gen_cache_ident(&mut self.reference_index);
903-
let ident = Ident::new(action_name, DUMMY_SP, Default::default());
904-
f.ident.insert(ident)
905-
}
906-
Some(i) => i,
907-
};
898+
// It's a cache function. If it doesn't have a name, give it one.
899+
match f.ident.as_mut() {
900+
None => {
901+
let action_name = gen_cache_ident(&mut self.reference_index);
902+
let ident = Ident::new(action_name, DUMMY_SP, Default::default());
903+
f.ident.insert(ident)
904+
}
905+
Some(i) => i,
906+
};
908907

909-
// Collect all the identifiers defined inside the closure and used
910-
// in the cache function. With deduplication.
911-
retain_names_from_declared_idents(
912-
&mut child_names,
913-
&self.declared_idents[..declared_idents_until],
914-
);
908+
// Collect all the identifiers defined inside the closure and used
909+
// in the cache function. With deduplication.
910+
retain_names_from_declared_idents(
911+
&mut child_names,
912+
&self.declared_idents[..declared_idents_until],
913+
);
915914

916-
let new_expr = self.maybe_hoist_and_create_proxy_for_cache_function(
917-
child_names.clone(),
918-
f.ident.clone(),
919-
cache_type_str.as_str(),
920-
&mut f.function,
921-
);
915+
let new_expr = self.maybe_hoist_and_create_proxy_for_cache_function(
916+
child_names.clone(),
917+
f.ident.clone(),
918+
cache_type_str.as_str(),
919+
&mut f.function,
920+
);
922921

923-
if self.in_default_export_decl {
924-
// This function expression is also the default export:
925-
// `export default async function() {}`
926-
// This specific case (default export) isn't handled by `visit_mut_expr`.
927-
// Replace the original function expr with a action proxy expr.
928-
self.rewrite_default_fn_expr_to_proxy_expr = Some(new_expr);
929-
} else {
930-
self.rewrite_expr_to_proxy_expr = Some(new_expr);
931-
}
922+
if self.in_default_export_decl {
923+
// This function expression is also the default export:
924+
// `export default async function() {}`
925+
// This specific case (default export) isn't handled by `visit_mut_expr`.
926+
// Replace the original function expr with a action proxy expr.
927+
self.rewrite_default_fn_expr_to_proxy_expr = Some(new_expr);
928+
} else {
929+
self.rewrite_expr_to_proxy_expr = Some(new_expr);
932930
}
933931
}
934932

crates/next-custom-transforms/tests/fixture/server-actions/server/36/input.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,11 @@ export async function foo() {
77
export async function bar() {
88
return 'data B'
99
}
10+
11+
export default async function Cached({ children }) {
12+
return children
13+
}
14+
15+
export const baz = async function () {
16+
return 'data C'
17+
}

crates/next-custom-transforms/tests/fixture/server-actions/server/36/output.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* __next_internal_action_entry_do_not_use__ {"3128060c414d59f8552e4788b846c0d2b7f74743":"$$RSC_SERVER_CACHE_0","951c375b4a6a6e89d67b743ec5808127cfde405d":"$$RSC_SERVER_CACHE_1"} */ import { registerServerReference } from "private-next-rsc-server-reference";
1+
/* __next_internal_action_entry_do_not_use__ {"3128060c414d59f8552e4788b846c0d2b7f74743":"$$RSC_SERVER_CACHE_0","4acc55633206134002149ce873fe498be64a6fef":"$$RSC_SERVER_CACHE_4","69348c79fce073bae2f70f139565a2fda1c74c74":"$$RSC_SERVER_CACHE_2","951c375b4a6a6e89d67b743ec5808127cfde405d":"$$RSC_SERVER_CACHE_1"} */ import { registerServerReference } from "private-next-rsc-server-reference";
22
import { encryptActionBoundArgs, decryptActionBoundArgs } from "private-next-rsc-action-encryption";
33
import { cache as $$cache__ } from "private-next-rsc-cache-wrapper";
44
export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "3128060c414d59f8552e4788b846c0d2b7f74743", async function foo() {
@@ -9,3 +9,11 @@ export var $$RSC_SERVER_CACHE_1 = $$cache__("default", "951c375b4a6a6e89d67b743e
99
return 'data B';
1010
});
1111
export var bar = registerServerReference($$RSC_SERVER_CACHE_1, "951c375b4a6a6e89d67b743ec5808127cfde405d", null);
12+
export var $$RSC_SERVER_CACHE_2 = $$cache__("default", "69348c79fce073bae2f70f139565a2fda1c74c74", async function Cached({ children }) {
13+
return children;
14+
});
15+
export default registerServerReference($$RSC_SERVER_CACHE_2, "69348c79fce073bae2f70f139565a2fda1c74c74", null);
16+
export var $$RSC_SERVER_CACHE_4 = $$cache__("default", "4acc55633206134002149ce873fe498be64a6fef", async function $$RSC_SERVER_CACHE_3() {
17+
return 'data C';
18+
});
19+
export const baz = registerServerReference($$RSC_SERVER_CACHE_4, "4acc55633206134002149ce873fe498be64a6fef", null);

0 commit comments

Comments
 (0)