@@ -211,6 +211,44 @@ describe('renderPath()', () => {
211211 assert . ok ( errors . length > 0 , 'error should be logged before re-throwing' ) ;
212212 } ) ;
213213
214+ // Regression: #16185 — extensionless endpoints with trailingSlash: 'always'
215+ // must have a trailing slash in the prerender request URL so that BaseApp.render()
216+ // does not emit a redirect instead of the endpoint's actual response.
217+ it ( 'sends a trailing-slash request URL for extensionless endpoints when trailingSlash is always' , async ( ) => {
218+ const endpointOptions = await createStaticBuildOptions ( {
219+ inlineConfig : { trailingSlash : 'always' } ,
220+ } ) ;
221+
222+ let capturedUrl ;
223+ const prerenderer = createMockPrerenderer ( { '/demo' : 'hello' } ) ;
224+ const originalRender = prerenderer . render . bind ( prerenderer ) ;
225+ prerenderer . render = async ( request , opts ) => {
226+ capturedUrl = new URL ( request . url ) ;
227+ return originalRender ( request , opts ) ;
228+ } ;
229+
230+ const route = createRouteData ( {
231+ route : '/demo' ,
232+ type : 'endpoint' ,
233+ trailingSlash : 'always' ,
234+ component : 'src/pages/demo.ts' ,
235+ } ) ;
236+
237+ await renderPath ( {
238+ prerenderer,
239+ pathname : '/demo' ,
240+ route,
241+ options : endpointOptions ,
242+ logger : endpointOptions . logger ,
243+ } ) ;
244+
245+ assert . ok ( capturedUrl , 'prerenderer.render should have been called' ) ;
246+ assert . ok (
247+ capturedUrl . pathname . endsWith ( '/' ) ,
248+ `expected trailing slash in request URL pathname, got "${ capturedUrl . pathname } "` ,
249+ ) ;
250+ } ) ;
251+
214252 it ( 'writes the rendered body to the filesystem (integration smoke)' , async ( ) => {
215253 const html = '<html><body>Written to disk</body></html>' ;
216254 const prerenderer = createMockPrerenderer ( { '/disk-test' : html } ) ;
0 commit comments