Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 3 additions & 6 deletions packages/kit/src/runtime/server/page/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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')) {
Expand Down Expand Up @@ -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;

Expand Down
4 changes: 2 additions & 2 deletions packages/kit/src/runtime/server/page/load_data.js
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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);
}

Expand Down
20 changes: 12 additions & 8 deletions packages/kit/src/runtime/server/page/render.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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"');
}
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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')}`;
Expand All @@ -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`);
Expand Down Expand Up @@ -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) {
Expand Down
4 changes: 3 additions & 1 deletion packages/kit/src/runtime/server/respond.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
11 changes: 11 additions & 0 deletions packages/kit/src/runtime/server/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,17 @@ export function count_non_ssi_comments(str) {
return (str.match(/<!--(?!#)/g) ?? []).length;
}

/**
* Whether the response should be rendered as prerendered output, either because we're
* inside the prerendering pass at build time or because the page is prerenderable
* and dev output should match the build
* @param {import('types').SSRState} state
* @returns {boolean}
*/
export function renders_prerendered_output(state) {
return !!state.prerendering || (__SVELTEKIT_DEV__ && state.prerender_default === true);
}

/**
* Creates a serialiser for non-arbitrary POJOs using the app's transport hook
* @param {ServerHooks['transport']} transport
Expand Down
Loading