From 92969b8921600080bd75c864f812f7dfc48a5a67 Mon Sep 17 00:00:00 2001 From: Nic Polumeyv <162764842+Nic-Polumeyv@users.noreply.github.com> Date: Fri, 24 Jul 2026 19:52:38 -0400 Subject: [PATCH 1/3] consolidate prerender output gates into helper --- packages/kit/src/runtime/server/page/index.js | 9 +++------ .../kit/src/runtime/server/page/load_data.js | 4 ++-- .../kit/src/runtime/server/page/render.js | 20 +++++++++++-------- packages/kit/src/runtime/server/respond.js | 4 +++- packages/kit/src/runtime/server/utils.js | 12 +++++++++++ 5 files changed, 32 insertions(+), 17 deletions(-) diff --git a/packages/kit/src/runtime/server/page/index.js b/packages/kit/src/runtime/server/page/index.js index 22a577417c23..4d1c40797bba 100644 --- a/packages/kit/src/runtime/server/page/index.js +++ b/packages/kit/src/runtime/server/page/index.js @@ -7,7 +7,7 @@ import { compact } from '../../../utils/array.js'; import { get_status, normalize_error } from '../../../utils/error.js'; import { noop } from '../../../utils/functions.js'; import { add_data_suffix } from '../../pathname.js'; -import { redirect_response } from '../utils.js'; +import { redirect_response, renders_prerendered_output } from '../utils.js'; import { static_error_page, handle_error_and_jsonify } from '../errors.js'; import { handle_action_json_request, @@ -122,10 +122,7 @@ export async function render_page( // renders an empty 'shell' page if SSR is turned off and if there is // no server data to prerender. As a result, the load functions and rendering // only occur client-side. - if ( - ssr === false && - !((state.prerendering || state.prerender_default === true) && should_prerender_data) - ) { + if (ssr === false && !(renders_prerendered_output(state) && should_prerender_data)) { // if the user makes a request through a non-enhanced form, the returned value is lost // because there is no SSR or client-side handling of the response if (DEV && action_result && !event.request.headers.has('x-sveltekit-action')) { @@ -176,7 +173,7 @@ export async function render_page( const data_serializer = server_data_serializer(event, event_state, options); const data_serializer_json = - (state.prerendering || state.prerender_default === true) && should_prerender_data + renders_prerendered_output(state) && should_prerender_data ? server_data_serializer_json(event, event_state, options) : null; diff --git a/packages/kit/src/runtime/server/page/load_data.js b/packages/kit/src/runtime/server/page/load_data.js index 08993c606297..9f758f9bdd33 100644 --- a/packages/kit/src/runtime/server/page/load_data.js +++ b/packages/kit/src/runtime/server/page/load_data.js @@ -6,7 +6,7 @@ import { with_request_store, merge_tracing } from '@sveltejs/kit/internal/server import { record_span } from '../../telemetry/record_span.js'; import { base64_encode } from '../../utils.js'; import { NULL_BODY_STATUS } from '../constants.js'; -import { get_node_type } from '../utils.js'; +import { get_node_type, renders_prerendered_output } from '../utils.js'; /** * Calls the user's server `load` function. @@ -67,7 +67,7 @@ export async function load_server_data({ event, event_state, state, node, parent } ); - if (state.prerendering || state.prerender_default === true) { + if (renders_prerendered_output(state)) { disable_search(url); } diff --git a/packages/kit/src/runtime/server/page/render.js b/packages/kit/src/runtime/server/page/render.js index a543f91de230..05b709e4423a 100644 --- a/packages/kit/src/runtime/server/page/render.js +++ b/packages/kit/src/runtime/server/page/render.js @@ -14,7 +14,12 @@ import { create_server_routing_response, generate_route_object } from './server_ import { add_data_suffix, add_resolution_suffix } from '../../pathname.js'; import { try_get_request_store, with_request_store } from '@sveltejs/kit/internal/server'; import { text_encoder } from '../../utils.js'; -import { count_non_ssi_comments, create_replacer, get_global_name } from '../utils.js'; +import { + count_non_ssi_comments, + create_replacer, + get_global_name, + renders_prerendered_output +} from '../utils.js'; import { handle_error_and_jsonify } from '../errors.js'; import * as env from '__sveltekit/env'; import { collect_remote_data } from '../remote-functions.js'; @@ -58,7 +63,7 @@ export async function render_response({ data_serializer, error_components }) { - if (state.prerendering || state.prerender_default === true) { + if (renders_prerendered_output(state)) { if (options.csp.mode === 'nonce') { throw new Error('Cannot use prerendering if config.csp.mode === "nonce"'); } @@ -106,7 +111,7 @@ export async function render_response({ let base_expression = s(paths.base); const csp = new Csp(options.csp, { - prerender: !!(state.prerendering || state.prerender_default === true) + prerender: renders_prerendered_output(state) }); // if appropriate, use relative paths for greater portability @@ -310,7 +315,7 @@ export async function render_response({ * @param {string[]} attributes */ const add_preload = (path, attributes) => { - if (options.link_header_preload && !(state.prerendering || state.prerender_default === true)) { + if (options.link_header_preload && !renders_prerendered_output(state)) { link_headers.add(`<${encodeURI(path)}>; ${attributes.join('; ')}; nopush`); } else { head.add_link_tag(path, attributes); @@ -354,7 +359,7 @@ export async function render_response({ serialize_data( item, resolve_opts.filterSerializedResponseHeaders, - !!(state.prerendering || state.prerender_default === true) + renders_prerendered_output(state) ) ) .join('\n\t\t\t')}`; @@ -367,8 +372,7 @@ export async function render_response({ // import the env.js module so that it evaluates before any user code can evaluate. // TODO revert to using top-level await once https://bugs.webkit.org/show_bug.cgi?id=242740 is fixed // https://github.com/sveltejs/kit/pull/11601 - const load_env_eagerly = - client.uses_env_dynamic_public && (state.prerendering || state.prerender_default === true); + const load_env_eagerly = client.uses_env_dynamic_public && renders_prerendered_output(state); if (load_env_eagerly) { modulepreloads.add(`${paths.app_dir}/env.js`); @@ -573,7 +577,7 @@ export async function render_response({ 'content-type': 'text/html' }); - if (state.prerendering || state.prerender_default === true) { + if (renders_prerendered_output(state)) { // TODO read headers set with setHeaders and convert into http-equiv where possible const csp_headers = csp.csp_provider.get_meta(); if (csp_headers) { diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js index 788d855b1c7f..ec51ede28c13 100644 --- a/packages/kit/src/runtime/server/respond.js +++ b/packages/kit/src/runtime/server/respond.js @@ -435,7 +435,9 @@ export async function internal_respond(request, options, manifest, state) { prerender = node.prerender ?? prerender; } else if (page_nodes) { config = page_nodes.get_config() ?? config; - prerender = state.prerender_default = page_nodes.prerender(); + prerender = page_nodes.prerender(); + // data requests never reach render_page, so this assignment is what covers them + state.prerender_default = prerender; } if (state.emulator?.platform) { diff --git a/packages/kit/src/runtime/server/utils.js b/packages/kit/src/runtime/server/utils.js index 75351e22bd59..8590b30b9b5c 100644 --- a/packages/kit/src/runtime/server/utils.js +++ b/packages/kit/src/runtime/server/utils.js @@ -1,5 +1,6 @@ /** @import { ServerHooks } from 'types' */ import * as devalue from 'devalue'; +import { DEV } from 'esm-env'; import { text } from '@sveltejs/kit'; import { ENDPOINT_METHODS } from '../../constants.js'; @@ -140,6 +141,17 @@ export function count_non_ssi_comments(str) { return (str.match(/