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;