@@ -76,6 +76,19 @@ describe('typed routing in generated Workers', () => {
7676 renderMode : 'server' ,
7777 shouldPrerender : false ,
7878 } ,
79+ {
80+ pattern : '/client-only' ,
81+ params : [ ] ,
82+ catchAll : false ,
83+ componentPath : 'client-only.tsx' ,
84+ componentId : 'client-only' ,
85+ serverPath : null ,
86+ methods : [ ] ,
87+ ssrMode : 'client' ,
88+ prerenderMode : 'disabled' ,
89+ renderMode : 'client' ,
90+ shouldPrerender : false ,
91+ } ,
7992 ] ;
8093 const routeTable = join ( directory , 'generated-routes.ts' ) ;
8194 const entry = join ( directory , 'generated-worker.ts' ) ;
@@ -113,6 +126,10 @@ describe('typed routing in generated Workers', () => {
113126 ) ,
114127 ) ;
115128 writeFileSync ( entry , compileWorkerEntry ( { runtimeEnvPath : source ( 'env.ts' ) } ) ) ;
129+ const preambleScript = dev
130+ ? '<script type="module">window.__fixturePreamble = true</script>'
131+ : '' ;
132+ const undefinedImports : Array < string > = [ ] ;
116133 await build ( {
117134 configFile : false ,
118135 logLevel : 'silent' ,
@@ -134,7 +151,8 @@ describe('typed routing in generated Workers', () => {
134151 } ,
135152 load ( id ) {
136153 if ( id === '\0virtual:void-pages-renderer' ) {
137- return `export async function renderPage(page) { return '<html><body>' + page.props.title + '</body></html>'; }` ;
154+ return `export async function renderPage(page) { return '<html><body>' + page.props.title + '</body></html>'; }
155+ renderPage.preambleScript = ${ JSON . stringify ( preambleScript ) } ;` ;
138156 }
139157 if ( id === '\0virtual:void-pages-dev-assets' ) {
140158 return 'export async function getVoidPagesDevCss() { return []; }' ;
@@ -150,11 +168,18 @@ describe('typed routing in generated Workers', () => {
150168 ssr : entry ,
151169 target : 'esnext' ,
152170 rollupOptions : {
171+ onwarn ( warning , defaultHandler ) {
172+ if ( warning . code === 'IMPORT_IS_UNDEFINED' ) {
173+ undefinedImports . push ( warning . message ) ;
174+ }
175+ defaultHandler ( warning ) ;
176+ } ,
153177 external : [ / ^ c l o u d f l a r e : / , / ^ n o d e : / ] ,
154178 output : { entryFileNames : 'worker.mjs' , codeSplitting : false } ,
155179 } ,
156180 } ,
157181 } ) ;
182+ expect ( undefinedImports ) . toEqual ( [ ] ) ;
158183 runtime = new Miniflare (
159184 convertV4MiniflareOptions ( {
160185 compatibilityDate : '2026-07-01' ,
@@ -201,6 +226,11 @@ describe('typed routing in generated Workers', () => {
201226 }
202227 const page = await runtime . dispatchFetch ( 'https://app.test/' ) ;
203228 expect ( await page . text ( ) ) . toContain ( 'real page loader' ) ;
229+ const clientOnlyPage = await runtime . dispatchFetch ( 'https://app.test/client-only' ) ;
230+ const clientOnlyHtml = await clientOnlyPage . text ( ) ;
231+ expect ( clientOnlyPage . status ) . toBe ( 200 ) ;
232+ expect ( clientOnlyHtml ) . toContain ( 'data-void-ssr="false"' ) ;
233+ expect ( clientOnlyHtml . includes ( 'window.__fixturePreamble = true' ) ) . toBe ( dev ) ;
204234 const protocol = await runtime . dispatchFetch ( 'https://app.test/' , {
205235 headers : { 'x-voidpages' : 'true' } ,
206236 } ) ;
0 commit comments