@@ -24,7 +24,6 @@ import { json, text } from '../../exports/index.js';
24
24
import { action_json_redirect , is_action_json_request } from './page/actions.js' ;
25
25
import { INVALIDATED_PARAM , TRAILING_SLASH_PARAM } from '../shared.js' ;
26
26
import { get_public_env } from './env_module.js' ;
27
- import { load_page_nodes } from './page/load_page_nodes.js' ;
28
27
import { get_page_config } from '../../utils/route_config.js' ;
29
28
import { resolve_route } from './page/server_routing.js' ;
30
29
import { validateHeaders } from './validate-headers.js' ;
@@ -237,18 +236,19 @@ export async function respond(request, options, manifest, state) {
237
236
} ;
238
237
239
238
try {
239
+ /** @type {Array<import('types').SSRNode | undefined> | undefined } */
240
+ const page_nodes = route ?. page ? await load_page_nodes ( route . page , manifest ) : undefined ;
241
+
240
242
// determine whether we need to redirect to add/remove a trailing slash
241
243
if ( route ) {
242
244
// if `paths.base === '/a/b/c`, then the root route is `/a/b/c/`,
243
245
// regardless of the `trailingSlash` route option
244
246
if ( url . pathname === base || url . pathname === base + '/' ) {
245
247
trailing_slash = 'always' ;
246
- } else if ( route . page ) {
247
- const nodes = await load_page_nodes ( route . page , manifest ) ;
248
-
248
+ } else if ( page_nodes ) {
249
249
if ( DEV ) {
250
- const layouts = nodes . slice ( 0 , - 1 ) ;
251
- const page = nodes . at ( - 1 ) ;
250
+ const layouts = page_nodes . slice ( 0 , - 1 ) ;
251
+ const page = page_nodes . at ( - 1 ) ;
252
252
253
253
for ( const layout of layouts ) {
254
254
if ( layout ) {
@@ -269,7 +269,7 @@ export async function respond(request, options, manifest, state) {
269
269
}
270
270
}
271
271
272
- trailing_slash = get_option ( nodes , 'trailingSlash' ) ;
272
+ trailing_slash = get_option ( page_nodes , 'trailingSlash' ) ;
273
273
} else if ( route . endpoint ) {
274
274
const node = await route . endpoint ( ) ;
275
275
trailing_slash = node . trailingSlash ;
@@ -306,10 +306,9 @@ export async function respond(request, options, manifest, state) {
306
306
const node = await route . endpoint ( ) ;
307
307
config = node . config ?? config ;
308
308
prerender = node . prerender ?? prerender ;
309
- } else if ( route . page ) {
310
- const nodes = await load_page_nodes ( route . page , manifest ) ;
311
- config = get_page_config ( nodes ) ?? config ;
312
- prerender = get_option ( nodes , 'prerender' ) ?? false ;
309
+ } else if ( page_nodes ) {
310
+ config = get_page_config ( page_nodes ) ?? config ;
311
+ prerender = get_option ( page_nodes , 'prerender' ) ?? false ;
313
312
}
314
313
315
314
if ( state . before_handle ) {
@@ -349,7 +348,7 @@ export async function respond(request, options, manifest, state) {
349
348
const response = await options . hooks . handle ( {
350
349
event,
351
350
resolve : ( event , opts ) =>
352
- resolve ( event , opts ) . then ( ( response ) => {
351
+ resolve ( event , page_nodes , opts ) . then ( ( response ) => {
353
352
// add headers/cookies here, rather than inside `resolve`, so that we
354
353
// can do it once for all responses instead of once per `return`
355
354
for ( const key in headers ) {
@@ -426,9 +425,10 @@ export async function respond(request, options, manifest, state) {
426
425
427
426
/**
428
427
* @param {import('@sveltejs/kit').RequestEvent } event
428
+ * @param {Array<import('types').SSRNode | undefined> | undefined } page_nodes
429
429
* @param {import('@sveltejs/kit').ResolveOptions } [opts]
430
430
*/
431
- async function resolve ( event , opts ) {
431
+ async function resolve ( event , page_nodes , opts ) {
432
432
try {
433
433
if ( opts ) {
434
434
resolve_opts = {
@@ -472,8 +472,18 @@ export async function respond(request, options, manifest, state) {
472
472
} else if ( route . endpoint && ( ! route . page || is_endpoint_request ( event ) ) ) {
473
473
response = await render_endpoint ( event , await route . endpoint ( ) , state ) ;
474
474
} else if ( route . page ) {
475
- if ( page_methods . has ( method ) ) {
476
- response = await render_page ( event , route . page , options , manifest , state , resolve_opts ) ;
475
+ if ( ! page_nodes ) {
476
+ throw new Error ( 'page_nodes not found. This should never happen' ) ;
477
+ } else if ( page_methods . has ( method ) ) {
478
+ response = await render_page (
479
+ event ,
480
+ route . page ,
481
+ options ,
482
+ manifest ,
483
+ state ,
484
+ page_nodes ,
485
+ resolve_opts
486
+ ) ;
477
487
} else {
478
488
const allowed_methods = new Set ( allowed_page_methods ) ;
479
489
const node = await manifest . _ . nodes [ route . page . leaf ] ( ) ;
@@ -499,9 +509,8 @@ export async function respond(request, options, manifest, state) {
499
509
}
500
510
}
501
511
} else {
502
- // a route will always have a page or an endpoint, but TypeScript
503
- // doesn't know that
504
- throw new Error ( 'This should never happen' ) ;
512
+ // a route will always have a page or an endpoint, but TypeScript doesn't know that
513
+ throw new Error ( 'Route is neither page nor endpoint. This should never happen' ) ;
505
514
}
506
515
507
516
// If the route contains a page and an endpoint, we need to add a
@@ -578,3 +587,15 @@ export async function respond(request, options, manifest, state) {
578
587
}
579
588
}
580
589
}
590
+
591
+ /**
592
+ * @param {import('types').PageNodeIndexes } page
593
+ * @param {import('@sveltejs/kit').SSRManifest } manifest
594
+ */
595
+ export function load_page_nodes ( page , manifest ) {
596
+ return Promise . all ( [
597
+ // we use == here rather than === because [undefined] serializes as "[null]"
598
+ ...page . layouts . map ( ( n ) => ( n == undefined ? n : manifest . _ . nodes [ n ] ( ) ) ) ,
599
+ manifest . _ . nodes [ page . leaf ] ( )
600
+ ] ) ;
601
+ }
0 commit comments