Skip to content

Commit

Permalink
Fix default export and exported function expressions handling of cach…
Browse files Browse the repository at this point in the history
…e directive transform (vercel#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.
  • Loading branch information
shuding authored Oct 16, 2024
1 parent 1255f20 commit 6158c1f
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 32 deletions.
60 changes: 29 additions & 31 deletions crates/next-custom-transforms/src/transforms/server_actions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -895,40 +895,38 @@ impl<C: Comments> VisitMut for ServerActions<C> {
}

if let Some(cache_type_str) = cache_type {
if !(self.in_cache_file.is_some() && self.in_export_decl) {
// It's a cache function. If it doesn't have a name, give it one.
match f.ident.as_mut() {
None => {
let action_name = gen_cache_ident(&mut self.reference_index);
let ident = Ident::new(action_name, DUMMY_SP, Default::default());
f.ident.insert(ident)
}
Some(i) => i,
};
// It's a cache function. If it doesn't have a name, give it one.
match f.ident.as_mut() {
None => {
let action_name = gen_cache_ident(&mut self.reference_index);
let ident = Ident::new(action_name, DUMMY_SP, Default::default());
f.ident.insert(ident)
}
Some(i) => i,
};

// Collect all the identifiers defined inside the closure and used
// in the cache function. With deduplication.
retain_names_from_declared_idents(
&mut child_names,
&self.declared_idents[..declared_idents_until],
);
// Collect all the identifiers defined inside the closure and used
// in the cache function. With deduplication.
retain_names_from_declared_idents(
&mut child_names,
&self.declared_idents[..declared_idents_until],
);

let new_expr = self.maybe_hoist_and_create_proxy_for_cache_function(
child_names.clone(),
f.ident.clone(),
cache_type_str.as_str(),
&mut f.function,
);
let new_expr = self.maybe_hoist_and_create_proxy_for_cache_function(
child_names.clone(),
f.ident.clone(),
cache_type_str.as_str(),
&mut f.function,
);

if self.in_default_export_decl {
// This function expression is also the default export:
// `export default async function() {}`
// This specific case (default export) isn't handled by `visit_mut_expr`.
// Replace the original function expr with a action proxy expr.
self.rewrite_default_fn_expr_to_proxy_expr = Some(new_expr);
} else {
self.rewrite_expr_to_proxy_expr = Some(new_expr);
}
if self.in_default_export_decl {
// This function expression is also the default export:
// `export default async function() {}`
// This specific case (default export) isn't handled by `visit_mut_expr`.
// Replace the original function expr with a action proxy expr.
self.rewrite_default_fn_expr_to_proxy_expr = Some(new_expr);
} else {
self.rewrite_expr_to_proxy_expr = Some(new_expr);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,11 @@ export async function foo() {
export async function bar() {
return 'data B'
}

export default async function Cached({ children }) {
return children
}

export const baz = async function () {
return 'data C'
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* __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";
/* __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";
import { encryptActionBoundArgs, decryptActionBoundArgs } from "private-next-rsc-action-encryption";
import { cache as $$cache__ } from "private-next-rsc-cache-wrapper";
export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "3128060c414d59f8552e4788b846c0d2b7f74743", async function foo() {
Expand All @@ -9,3 +9,11 @@ export var $$RSC_SERVER_CACHE_1 = $$cache__("default", "951c375b4a6a6e89d67b743e
return 'data B';
});
export var bar = registerServerReference($$RSC_SERVER_CACHE_1, "951c375b4a6a6e89d67b743ec5808127cfde405d", null);
export var $$RSC_SERVER_CACHE_2 = $$cache__("default", "69348c79fce073bae2f70f139565a2fda1c74c74", async function Cached({ children }) {
return children;
});
export default registerServerReference($$RSC_SERVER_CACHE_2, "69348c79fce073bae2f70f139565a2fda1c74c74", null);
export var $$RSC_SERVER_CACHE_4 = $$cache__("default", "4acc55633206134002149ce873fe498be64a6fef", async function $$RSC_SERVER_CACHE_3() {
return 'data C';
});
export const baz = registerServerReference($$RSC_SERVER_CACHE_4, "4acc55633206134002149ce873fe498be64a6fef", null);

0 comments on commit 6158c1f

Please sign in to comment.