11import type { Rollup } from 'vite'
22import { describe , expect , it , vi } from 'vitest'
33import {
4+ SERVER_FUNCTION_DIRECTIVE_MARKER ,
45 vitePluginServerFunctionDirectives ,
56 type ServerFunctionDirective ,
67} from './server-function-directives'
@@ -181,7 +182,7 @@ export const metadata = { title: "test" };
181182 expect ( expandExportAll ) . toHaveBeenCalledOnce ( )
182183 expect ( result ?. code ) . toMatchInlineSnapshot ( `
183184 "/* __vite_rsc_server_function_directives__ */
184-
185+ import * as $$ReactServer from "/rsc-runtime.js";
185186
186187 /* "use cache" */;
187188 async function getData() { return 1 }
@@ -199,17 +200,38 @@ export const metadata = { title: "test" };
199200 )
200201 } )
201202
202- it ( 'creates module proxies in client ' , async ( ) => {
203+ it ( 'ignores jsxDEV source metadata while rejecting user this expressions ' , async ( ) => {
203204 const { run } = createHarness ( [ cacheDirective ( ) ] )
205+ await expect (
206+ run ( `
207+ export async function Page() {
208+ "use cache";
209+ return _jsxDEV("p", { children: "test" }, void 0, false, { fileName: "page.tsx" }, this);
210+ }
211+ ` ) ,
212+ ) . resolves . toBeDefined ( )
213+ await expect (
214+ run ( `export async function getData() { "use cache"; return this.value }` ) ,
215+ ) . rejects . toThrow ( '"use cache" functions cannot use "this"' )
216+ } )
217+
218+ it ( 'creates module proxies in client' , async ( ) => {
219+ const { manager, run } = createHarness ( [ cacheDirective ( ) ] )
204220 const result = await run (
205221 `"use cache"; export async function getData() { return 1 }` ,
206222 'client' ,
207223 )
208224 expect ( result ?. code ) . toMatchInlineSnapshot ( `
209- "import * as $$ReactClient from "/browser-runtime.js";
225+ "/* __vite_rsc_server_function_directives__ */
226+ import * as $$ReactClient from "/browser-runtime.js";
210227 export const getData = /* #__PURE__ */ $$ReactClient.createServerReference("53eb073e2100#getData",$$ReactClient.callServer,undefined,undefined,"getData");
211228 "
212229 ` )
230+ expect ( manager . serverReferenceMetaMap [ '/src/example.ts' ] ) . toEqual ( {
231+ importId : '/src/example.ts' ,
232+ referenceKey : '53eb073e2100' ,
233+ exportNames : [ 'getData' ] ,
234+ } )
213235 } )
214236
215237 it ( 'creates module proxies in SSR' , async ( ) => {
@@ -219,7 +241,8 @@ export const metadata = { title: "test" };
219241 'ssr' ,
220242 )
221243 expect ( result ?. code ) . toMatchInlineSnapshot ( `
222- "import * as $$ReactClient from "/ssr-runtime.js";
244+ "/* __vite_rsc_server_function_directives__ */
245+ import * as $$ReactClient from "/ssr-runtime.js";
223246 export const getData = /* #__PURE__ */ $$ReactClient.createServerReference("53eb073e2100#getData",$$ReactClient.callServer,undefined,undefined,"getData");
224247 "
225248 ` )
@@ -386,6 +409,18 @@ export class CacheClass {
386409 expect ( manager . serverReferenceMetaMap [ '/src/example.ts' ] ) . toBeUndefined ( )
387410 } )
388411
412+ it ( 'preserves metadata when transformed output is processed again' , async ( ) => {
413+ const { manager, run } = createHarness ( [ cacheDirective ( ) ] )
414+ const result = await run (
415+ `"use cache"; export async function getData() { return 1 }` ,
416+ )
417+ expect ( result ?. code ) . toContain ( SERVER_FUNCTION_DIRECTIVE_MARKER )
418+ const metadata = manager . serverReferenceMetaMap [ '/src/example.ts' ]
419+
420+ await expect ( run ( result ! . code ! ) ) . resolves . toBeUndefined ( )
421+ expect ( manager . serverReferenceMetaMap [ '/src/example.ts' ] ) . toEqual ( metadata )
422+ } )
423+
389424 it ( 'rejects overlapping module directive definitions' , async ( ) => {
390425 const { run } = createHarness ( [
391426 cacheDirective ( { directive : / ^ u s e c a c h e / } ) ,
0 commit comments