diff --git a/.changeset/silent-bushes-grow.md b/.changeset/silent-bushes-grow.md
new file mode 100644
index 000000000000..d2befebda630
--- /dev/null
+++ b/.changeset/silent-bushes-grow.md
@@ -0,0 +1,5 @@
+---
+'@sveltejs/kit': patch
+---
+
+fix: surface prerender errors during development
diff --git a/packages/kit/src/runtime/server/page/index.js b/packages/kit/src/runtime/server/page/index.js
index bd90f2a48423..22a577417c23 100644
--- a/packages/kit/src/runtime/server/page/index.js
+++ b/packages/kit/src/runtime/server/page/index.js
@@ -122,7 +122,10 @@ 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 && should_prerender_data)) {
+ if (
+ ssr === false &&
+ !((state.prerendering || state.prerender_default === true) && 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')) {
@@ -173,7 +176,7 @@ export async function render_page(
const data_serializer = server_data_serializer(event, event_state, options);
const data_serializer_json =
- state.prerendering && should_prerender_data
+ (state.prerendering || state.prerender_default === true) && 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 a7043ff8028b..08993c606297 100644
--- a/packages/kit/src/runtime/server/page/load_data.js
+++ b/packages/kit/src/runtime/server/page/load_data.js
@@ -67,7 +67,7 @@ export async function load_server_data({ event, event_state, state, node, parent
}
);
- if (state.prerendering) {
+ if (state.prerendering || state.prerender_default === true) {
disable_search(url);
}
diff --git a/packages/kit/src/runtime/server/page/render.js b/packages/kit/src/runtime/server/page/render.js
index 676afaf8f56d..a543f91de230 100644
--- a/packages/kit/src/runtime/server/page/render.js
+++ b/packages/kit/src/runtime/server/page/render.js
@@ -58,7 +58,7 @@ export async function render_response({
data_serializer,
error_components
}) {
- if (state.prerendering) {
+ if (state.prerendering || state.prerender_default === true) {
if (options.csp.mode === 'nonce') {
throw new Error('Cannot use prerendering if config.csp.mode === "nonce"');
}
@@ -106,7 +106,7 @@ export async function render_response({
let base_expression = s(paths.base);
const csp = new Csp(options.csp, {
- prerender: !!state.prerendering
+ prerender: !!(state.prerendering || state.prerender_default === true)
});
// if appropriate, use relative paths for greater portability
@@ -310,7 +310,7 @@ export async function render_response({
* @param {string[]} attributes
*/
const add_preload = (path, attributes) => {
- if (options.link_header_preload && !state.prerendering) {
+ if (options.link_header_preload && !(state.prerendering || state.prerender_default === true)) {
link_headers.add(`<${encodeURI(path)}>; ${attributes.join('; ')}; nopush`);
} else {
head.add_link_tag(path, attributes);
@@ -351,7 +351,11 @@ export async function render_response({
if (page_config.ssr && page_config.csr) {
body += `\n\t\t\t${fetched
.map((item) =>
- serialize_data(item, resolve_opts.filterSerializedResponseHeaders, !!state.prerendering)
+ serialize_data(
+ item,
+ resolve_opts.filterSerializedResponseHeaders,
+ !!(state.prerendering || state.prerender_default === true)
+ )
)
.join('\n\t\t\t')}`;
}
@@ -363,7 +367,8 @@ 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;
+ const load_env_eagerly =
+ client.uses_env_dynamic_public && (state.prerendering || state.prerender_default === true);
if (load_env_eagerly) {
modulepreloads.add(`${paths.app_dir}/env.js`);
@@ -568,14 +573,14 @@ export async function render_response({
'content-type': 'text/html'
});
- if (state.prerendering) {
+ if (state.prerendering || state.prerender_default === true) {
// TODO read headers set with setHeaders and convert into http-equiv where possible
const csp_headers = csp.csp_provider.get_meta();
if (csp_headers) {
head.add_http_equiv(csp_headers);
}
- if (state.prerendering.cache) {
+ if (state.prerendering?.cache) {
head.add_http_equiv(
``
);
diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js
index be9b86052bec..788d855b1c7f 100644
--- a/packages/kit/src/runtime/server/respond.js
+++ b/packages/kit/src/runtime/server/respond.js
@@ -435,7 +435,7 @@ export async function internal_respond(request, options, manifest, state) {
prerender = node.prerender ?? prerender;
} else if (page_nodes) {
config = page_nodes.get_config() ?? config;
- prerender = page_nodes.prerender();
+ prerender = state.prerender_default = page_nodes.prerender();
}
if (state.emulator?.platform) {
diff --git a/packages/kit/src/types/internal.d.ts b/packages/kit/src/types/internal.d.ts
index 1eeb6f6dee94..7093c8db58f4 100644
--- a/packages/kit/src/types/internal.d.ts
+++ b/packages/kit/src/types/internal.d.ts
@@ -233,6 +233,7 @@ export interface PrerenderDependency {
body: null | string | Uint8Array;
}
+/** Internal context for the prerendering process */
export interface PrerenderOptions {
cache?: string; // including this here is a bit of a hack, but it makes it easy to add
fallback?: boolean;