From 80dbf604548687705cefb11d22508e4c856efe18 Mon Sep 17 00:00:00 2001 From: Tee Ming Chew Date: Sat, 25 Jul 2026 05:36:18 +0800 Subject: [PATCH 1/5] poc --- packages/adapter-static/index.js | 59 ++++++++++--------- packages/adapter-static/package.json | 3 +- packages/adapter-static/src/dev.js | 55 +++++++++++++++++ .../adapter-static/src/global-private.d.ts | 5 ++ .../test/apps/prerendered/jsconfig.json | 4 ++ .../routes/disabled-search/+page.server.js | 5 ++ .../src/routes/disabled-search/+page.svelte | 0 .../src/routes/no-prerender/+page.js | 1 + .../src/routes/no-prerender/+page.svelte | 1 + .../prerendered/src/routes/query/+page.svelte | 7 +++ .../prerendered/src/routes/query/remote.js | 5 ++ .../test/apps/prerendered/test/test.js | 4 ++ .../test/apps/prerendered/vite.config.js | 10 +++- packages/adapter-static/tsconfig.json | 2 +- packages/adapter-static/utils.js | 31 ++++++++++ packages/kit/src/runtime/server/respond.js | 7 ++- packages/kit/src/types/internal.d.ts | 3 +- vitest.config.js | 19 +----- 18 files changed, 171 insertions(+), 50 deletions(-) create mode 100644 packages/adapter-static/src/dev.js create mode 100644 packages/adapter-static/src/global-private.d.ts create mode 100644 packages/adapter-static/test/apps/prerendered/jsconfig.json create mode 100644 packages/adapter-static/test/apps/prerendered/src/routes/disabled-search/+page.server.js create mode 100644 packages/adapter-static/test/apps/prerendered/src/routes/disabled-search/+page.svelte create mode 100644 packages/adapter-static/test/apps/prerendered/src/routes/no-prerender/+page.js create mode 100644 packages/adapter-static/test/apps/prerendered/src/routes/no-prerender/+page.svelte create mode 100644 packages/adapter-static/test/apps/prerendered/src/routes/query/+page.svelte create mode 100644 packages/adapter-static/test/apps/prerendered/src/routes/query/remote.js create mode 100644 packages/adapter-static/utils.js diff --git a/packages/adapter-static/index.js b/packages/adapter-static/index.js index a1d65f277019..468cdb73b3f2 100644 --- a/packages/adapter-static/index.js +++ b/packages/adapter-static/index.js @@ -1,5 +1,6 @@ import path from 'node:path'; import { platforms } from './platforms.js'; +import { get_options_message } from './utils.js'; /** @type {import('./index.js').default} */ export default function (options) { @@ -17,36 +18,13 @@ export default function (options) { ${dynamic_routes.map((route) => ` - ${path.posix.join(prefix, route.id)}`).join('\n')}\n` ); - const options = [ - 'set the `fallback` option — see https://svelte.dev/docs/kit/single-page-apps#usage for more info.', - 'add `export const prerender = true` to your root `+layout.js/.ts` or `+layout.server.js/.ts` file. This will try to prerender all pages.', - 'add `export const prerender = true` to any `+server.js/ts` files that are not fetched by page `load` functions.' - ]; - - if ( - has_param_routes || - JSON.stringify(builder.config.kit.prerender.entries) !== '["*"]' - ) { - let option = 'adjust the `prerender.entries` config option'; - if (has_param_routes) - option += ' (routes with parameters are not part of entry points by default)'; - options.push(option); - } - - options.push( - "pass `strict: false` to `adapter-static` to ignore this error. Only do this if you are sure you don't need the routes in question in your final app, as they will be unavailable. See https://github.com/sveltejs/kit/tree/main/packages/adapter-static#strict for more info." - ); - builder.log( - `You have the following options:${options.map((o) => `\n - ${o}`).join('')}\n` + get_options_message( + has_param_routes, + JSON.stringify(builder.config.kit.prerender.entries) !== '["*"]' + ) ); - builder.log( - `If this doesn't help, you may need to use a different adapter. @sveltejs/adapter-static can only be used for sites that don't need a server for dynamic rendering, and can run on just a static file server.\n` - ); - - builder.log(`See https://svelte.dev/docs/kit/page-options#prerender for more details\n`); - const error = new Error('Encountered dynamic routes'); error.stack = ''; throw error; @@ -99,6 +77,33 @@ ${dynamic_routes.map((route) => ` - ${path.posix.join(prefix, route.id)}`).join } if (!options) platform?.done(builder); + }, + vite: { + plugins: [ + { + name: 'vite-plugin-sveltekit-adapter-static', + configEnvironment(name) { + if (name === 'ssr') { + return { + define: { + __SVELTEKIT_ADAPTER_STATIC_FALLBACK__: options?.fallback ? 'true' : 'false' + } + }; + } + }, + applyToEnvironment(environment) { + return environment.name === 'ssr'; + }, + resolveId: { + filter: { + id: /^sveltekit:server-entry$/ + }, + handler() { + return this.resolve(import.meta.resolve('./src/dev.js')); + } + } + } + ] } }; } diff --git a/packages/adapter-static/package.json b/packages/adapter-static/package.json index 16efa568a11e..2d00004fa995 100644 --- a/packages/adapter-static/package.json +++ b/packages/adapter-static/package.json @@ -30,7 +30,8 @@ "files": [ "index.js", "index.d.ts", - "platforms.js" + "platforms.js", + "src/**/*.js" ], "scripts": { "lint": "prettier --check .", diff --git a/packages/adapter-static/src/dev.js b/packages/adapter-static/src/dev.js new file mode 100644 index 000000000000..9efc20327546 --- /dev/null +++ b/packages/adapter-static/src/dev.js @@ -0,0 +1,55 @@ +import { env } from 'sveltekit:env'; +import { Server } from 'sveltekit:server'; +import { manifest } from 'sveltekit:server-manifest'; +import { createReadableStream } from '@sveltejs/kit/node'; +import { styleText } from 'node:util'; +import { get_options_message } from '../utils.js'; +import { set_prerendering } from '$app/env/internal'; + +set_prerendering(true); + +/** @type {import('../../kit/src/types/internal.js').InternalServer} */ +const server = new Server(manifest); + +await server.init({ + env, + read: (file) => createReadableStream(file) +}); + +/** + * @param {Request} request + * @returns {Promise} + */ +export async function fetch(request) { + return await server.respond(request, { + // simulate prerendering during development to surface errors earlier + prerendering: { + dependencies: new Map(), + remote_responses: new Map(), + fallback: __SVELTEKIT_ADAPTER_STATIC_FALLBACK__ + }, + getClientAddress() { + throw new Error('Cannot read clientAddress on prerendered pages'); + }, + // @ts-expect-error this is only needed during actual prerendering + read: undefined, + before_handle: async (event, _config, prerender, handle) => { + if (!event.isSubRequest && !event.isDataRequest && !event.isRemoteRequest && !prerender) { + const error = new Error('Encountered dynamic routes'); + error.stack = ''; + + console.error( + styleText( + ['bold', 'red'], + `@sveltejs/adapter-static: all routes must be fully prerenderable, but the ${event.url.pathname} route is dynamic\n` + ) + ); + + console.log(get_options_message(!!Object.keys(event.params).length, false)); + + throw error; + } + return await handle(); + } + }); +} diff --git a/packages/adapter-static/src/global-private.d.ts b/packages/adapter-static/src/global-private.d.ts new file mode 100644 index 000000000000..5b9e62c964da --- /dev/null +++ b/packages/adapter-static/src/global-private.d.ts @@ -0,0 +1,5 @@ +declare global { + export const __SVELTEKIT_ADAPTER_STATIC_FALLBACK__: boolean; +} + +export {}; diff --git a/packages/adapter-static/test/apps/prerendered/jsconfig.json b/packages/adapter-static/test/apps/prerendered/jsconfig.json new file mode 100644 index 000000000000..681df462f63f --- /dev/null +++ b/packages/adapter-static/test/apps/prerendered/jsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "$app/tsconfig", + "include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.svelte"] +} diff --git a/packages/adapter-static/test/apps/prerendered/src/routes/disabled-search/+page.server.js b/packages/adapter-static/test/apps/prerendered/src/routes/disabled-search/+page.server.js new file mode 100644 index 000000000000..3a0d54475c9f --- /dev/null +++ b/packages/adapter-static/test/apps/prerendered/src/routes/disabled-search/+page.server.js @@ -0,0 +1,5 @@ +export function load({ url }) { + return { + search: url.search + }; +} diff --git a/packages/adapter-static/test/apps/prerendered/src/routes/disabled-search/+page.svelte b/packages/adapter-static/test/apps/prerendered/src/routes/disabled-search/+page.svelte new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/adapter-static/test/apps/prerendered/src/routes/no-prerender/+page.js b/packages/adapter-static/test/apps/prerendered/src/routes/no-prerender/+page.js new file mode 100644 index 000000000000..d43d0cd2a55d --- /dev/null +++ b/packages/adapter-static/test/apps/prerendered/src/routes/no-prerender/+page.js @@ -0,0 +1 @@ +export const prerender = false; diff --git a/packages/adapter-static/test/apps/prerendered/src/routes/no-prerender/+page.svelte b/packages/adapter-static/test/apps/prerendered/src/routes/no-prerender/+page.svelte new file mode 100644 index 000000000000..b1387648182b --- /dev/null +++ b/packages/adapter-static/test/apps/prerendered/src/routes/no-prerender/+page.svelte @@ -0,0 +1 @@ +

not prerendered

diff --git a/packages/adapter-static/test/apps/prerendered/src/routes/query/+page.svelte b/packages/adapter-static/test/apps/prerendered/src/routes/query/+page.svelte new file mode 100644 index 000000000000..c7e550b0f10f --- /dev/null +++ b/packages/adapter-static/test/apps/prerendered/src/routes/query/+page.svelte @@ -0,0 +1,7 @@ + + +

{str}

diff --git a/packages/adapter-static/test/apps/prerendered/src/routes/query/remote.js b/packages/adapter-static/test/apps/prerendered/src/routes/query/remote.js new file mode 100644 index 000000000000..1ff06ff4705c --- /dev/null +++ b/packages/adapter-static/test/apps/prerendered/src/routes/query/remote.js @@ -0,0 +1,5 @@ +import { query } from '$app/server'; + +export const not_allowed = query(() => { + return 'foo'; +}); diff --git a/packages/adapter-static/test/apps/prerendered/test/test.js b/packages/adapter-static/test/apps/prerendered/test/test.js index 6b16d2fed83b..aa97da9d2085 100644 --- a/packages/adapter-static/test/apps/prerendered/test/test.js +++ b/packages/adapter-static/test/apps/prerendered/test/test.js @@ -27,3 +27,7 @@ test('exposes public env vars to the client', async ({ page }) => { expect(await page.textContent('h1')).toEqual('The answer is 42'); expect(await page.textContent('h2')).toEqual('The dynamic answer is 42'); }); + +test.describe('dev', () => { + // TODO: add tests for prerender errors during development +}); diff --git a/packages/adapter-static/test/apps/prerendered/vite.config.js b/packages/adapter-static/test/apps/prerendered/vite.config.js index dc6532d9578d..486bb4f887dc 100644 --- a/packages/adapter-static/test/apps/prerendered/vite.config.js +++ b/packages/adapter-static/test/apps/prerendered/vite.config.js @@ -8,7 +8,15 @@ const config = { }, plugins: [ sveltekit({ - adapter: adapter() + adapter: adapter(), + experimental: { + remoteFunctions: true + }, + compilerOptions: { + experimental: { + async: true + } + } }) ] }; diff --git a/packages/adapter-static/tsconfig.json b/packages/adapter-static/tsconfig.json index 22ea3b1d6c08..1e7feddb95d5 100644 --- a/packages/adapter-static/tsconfig.json +++ b/packages/adapter-static/tsconfig.json @@ -11,5 +11,5 @@ }, "types": ["node"] }, - "include": ["index.js", "test/utils.js"] + "include": ["index.js", "utils.js", "src/*.js", "src/*.ts", "test/utils.js"] } diff --git a/packages/adapter-static/utils.js b/packages/adapter-static/utils.js new file mode 100644 index 000000000000..74f17766de72 --- /dev/null +++ b/packages/adapter-static/utils.js @@ -0,0 +1,31 @@ +/** + * Returns a message with a list of options to correctly configure the app. + * @param {boolean} has_param_routes + * @param {boolean} has_custom_entries + * @returns {string} + */ +export function get_options_message(has_param_routes, has_custom_entries) { + const options = [ + 'add `export const prerender = true` to your root `+layout.js/.ts` or `+layout.server.js/.ts` file. This will try to prerender all pages.', + 'add `export const prerender = true` to any `+server.js/ts` files that are not fetched by page `load` functions.' + ]; + + if (has_param_routes || has_custom_entries) { + let option = 'adjust the `prerender.entries` config option'; + if (has_param_routes) + option += ' (routes with parameters are not part of entry points by default)'; + options.push(option); + } + + options.push( + 'set the `fallback` option — see https://svelte.dev/docs/kit/single-page-apps#usage for more info.', + "pass `strict: false` to `adapter-static` to ignore this error. Only do this if you are sure you don't need the routes in question in your final app, as they will be unavailable. See https://github.com/sveltejs/kit/tree/main/packages/adapter-static#strict for more info." + ); + + let message = `You have the following options:${options.map((o) => `\n - ${o}`).join('')}`; + message += + "\n\nIf this doesn't help, you may need to use a different adapter. @sveltejs/adapter-static can only be used for sites that don't need a server for dynamic rendering, and can run on just a static file server."; + message += '\n\nSee https://svelte.dev/docs/kit/page-options#prerender for more details\n'; + + return message; +} diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js index be9b86052bec..add4f13dd425 100644 --- a/packages/kit/src/runtime/server/respond.js +++ b/packages/kit/src/runtime/server/respond.js @@ -136,6 +136,7 @@ export async function internal_respond(request, options, manifest, state) { /** @type {boolean[] | undefined} */ let invalidated_data_nodes; + /** Skipped for query remote function requests */ let skip_route_resolution = false; if (is_route_resolution_request) { @@ -368,7 +369,7 @@ export async function internal_respond(request, options, manifest, state) { return text('Not found', { status: 404, headers }); } - if (!state.prerendering?.fallback && !skip_route_resolution) { + if ((!state.prerendering?.fallback && !skip_route_resolution) || is_data_request) { try { const matchers = await manifest._.matchers(); const result = find_route(resolved_path, manifest._.routes, matchers); @@ -435,7 +436,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) { @@ -614,7 +615,7 @@ export async function internal_respond(request, options, manifest, state) { }); } - if (options.hash_routing || state.prerendering?.fallback) { + if ((options.hash_routing || state.prerendering?.fallback) && !is_data_request) { return await render_response({ event, event_state, diff --git a/packages/kit/src/types/internal.d.ts b/packages/kit/src/types/internal.d.ts index 8a2bb1bf211e..9b4cd6079e6e 100644 --- a/packages/kit/src/types/internal.d.ts +++ b/packages/kit/src/types/internal.d.ts @@ -185,7 +185,7 @@ export class InternalServer extends Server { /** @internal used during development to check feature availability depending on the current route */ before_handle?: ( event: RequestEvent, - config: any, + config: Record, prerender: PrerenderOption, handle: () => Promise ) => Promise; @@ -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; diff --git a/vitest.config.js b/vitest.config.js index 36b774f3b08c..cb86aceef9d2 100644 --- a/vitest.config.js +++ b/vitest.config.js @@ -1,27 +1,14 @@ import { defineConfig } from 'vitest/config'; +// used by the Vitest IDE extension export default defineConfig({ test: { projects: [ 'packages/*', - // prevent Vitest from crawling nested Vite apps in the kit test directory - // which do not use Vitest but have a vite.config.js file + // Kit app has a custom name for the vitest config '!packages/kit', { - extends: 'packages/kit/kit.vitest.config.js', - root: 'packages/kit' - }, - { - extends: 'packages/kit/test/apps/basics/vite.config.js', - root: 'packages/kit/test/apps/basics' - }, - 'packages/kit/test/build-errors', - { - extends: 'packages/kit/test/prerendering/basics/vite.config.js', - root: 'packages/kit/test/prerendering/basics', - test: { - name: 'kit-prerendering-basics' - } + extends: import.meta.dirname + '/packages/kit/kit.vitest.config.js' } ] } From 010aa37df59a790a633d69543904e0d3db6868ee Mon Sep 17 00:00:00 2001 From: Tee Ming Chew Date: Sat, 25 Jul 2026 06:09:04 +0800 Subject: [PATCH 2/5] not needed --- .../prerendered/src/routes/disabled-search/+page.server.js | 5 ----- .../apps/prerendered/src/routes/disabled-search/+page.svelte | 0 2 files changed, 5 deletions(-) delete mode 100644 packages/adapter-static/test/apps/prerendered/src/routes/disabled-search/+page.server.js delete mode 100644 packages/adapter-static/test/apps/prerendered/src/routes/disabled-search/+page.svelte diff --git a/packages/adapter-static/test/apps/prerendered/src/routes/disabled-search/+page.server.js b/packages/adapter-static/test/apps/prerendered/src/routes/disabled-search/+page.server.js deleted file mode 100644 index 3a0d54475c9f..000000000000 --- a/packages/adapter-static/test/apps/prerendered/src/routes/disabled-search/+page.server.js +++ /dev/null @@ -1,5 +0,0 @@ -export function load({ url }) { - return { - search: url.search - }; -} diff --git a/packages/adapter-static/test/apps/prerendered/src/routes/disabled-search/+page.svelte b/packages/adapter-static/test/apps/prerendered/src/routes/disabled-search/+page.svelte deleted file mode 100644 index e69de29bb2d1..000000000000 From 114507eeec357df68d59ff4a9856362628808a58 Mon Sep 17 00:00:00 2001 From: Tee Ming Chew Date: Sat, 25 Jul 2026 06:09:25 +0800 Subject: [PATCH 3/5] prerender behaviour during development --- packages/kit/src/runtime/server/page/index.js | 4 ++-- packages/kit/src/runtime/server/page/load_data.js | 2 +- packages/kit/src/runtime/server/page/render.js | 14 +++++++------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/kit/src/runtime/server/page/index.js b/packages/kit/src/runtime/server/page/index.js index bd90f2a48423..3b4067314b8e 100644 --- a/packages/kit/src/runtime/server/page/index.js +++ b/packages/kit/src/runtime/server/page/index.js @@ -122,7 +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 && should_prerender_data)) { + if (ssr === false && !(should_prerender && 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 +173,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 + should_prerender && 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..b139f25f1d3b 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.prerender_default) { 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..9c132c0623c0 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.prerender_default) { 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.prerender_default }); // 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.prerender_default) { link_headers.add(`<${encodeURI(path)}>; ${attributes.join('; ')}; nopush`); } else { head.add_link_tag(path, attributes); @@ -351,7 +351,7 @@ 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.prerender_default) ) .join('\n\t\t\t')}`; } @@ -363,7 +363,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; + const load_env_eagerly = client.uses_env_dynamic_public && !!state.prerender_default; if (load_env_eagerly) { modulepreloads.add(`${paths.app_dir}/env.js`); @@ -568,14 +568,14 @@ export async function render_response({ 'content-type': 'text/html' }); - if (state.prerendering) { + if (state.prerendering || state.prerender_default) { // 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( `` ); From 9720621d8bb756b0a410a761d9ca839e8f57eaec Mon Sep 17 00:00:00 2001 From: Tee Ming Chew Date: Sat, 25 Jul 2026 06:22:43 +0800 Subject: [PATCH 4/5] revert --- vitest.config.js | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/vitest.config.js b/vitest.config.js index cb86aceef9d2..36b774f3b08c 100644 --- a/vitest.config.js +++ b/vitest.config.js @@ -1,14 +1,27 @@ import { defineConfig } from 'vitest/config'; -// used by the Vitest IDE extension export default defineConfig({ test: { projects: [ 'packages/*', - // Kit app has a custom name for the vitest config + // prevent Vitest from crawling nested Vite apps in the kit test directory + // which do not use Vitest but have a vite.config.js file '!packages/kit', { - extends: import.meta.dirname + '/packages/kit/kit.vitest.config.js' + extends: 'packages/kit/kit.vitest.config.js', + root: 'packages/kit' + }, + { + extends: 'packages/kit/test/apps/basics/vite.config.js', + root: 'packages/kit/test/apps/basics' + }, + 'packages/kit/test/build-errors', + { + extends: 'packages/kit/test/prerendering/basics/vite.config.js', + root: 'packages/kit/test/prerendering/basics', + test: { + name: 'kit-prerendering-basics' + } } ] } From f0d04add53cfdcd79482940f2d0c0469a4fc9f2d Mon Sep 17 00:00:00 2001 From: Tee Ming Chew Date: Sat, 25 Jul 2026 06:40:58 +0800 Subject: [PATCH 5/5] split into different pr --- packages/kit/src/runtime/server/page/index.js | 4 ++-- packages/kit/src/runtime/server/page/load_data.js | 2 +- packages/kit/src/runtime/server/page/render.js | 14 +++++++------- packages/kit/src/types/internal.d.ts | 3 +-- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/packages/kit/src/runtime/server/page/index.js b/packages/kit/src/runtime/server/page/index.js index 3b4067314b8e..bd90f2a48423 100644 --- a/packages/kit/src/runtime/server/page/index.js +++ b/packages/kit/src/runtime/server/page/index.js @@ -122,7 +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 && !(should_prerender && should_prerender_data)) { + if (ssr === false && !(state.prerendering && 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 +173,7 @@ export async function render_page( const data_serializer = server_data_serializer(event, event_state, options); const data_serializer_json = - should_prerender && should_prerender_data + state.prerendering && 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 b139f25f1d3b..a7043ff8028b 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.prerender_default) { + if (state.prerendering) { disable_search(url); } diff --git a/packages/kit/src/runtime/server/page/render.js b/packages/kit/src/runtime/server/page/render.js index 9c132c0623c0..676afaf8f56d 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.prerender_default) { + if (state.prerendering) { 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.prerender_default + prerender: !!state.prerendering }); // 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.prerender_default) { + if (options.link_header_preload && !state.prerendering) { link_headers.add(`<${encodeURI(path)}>; ${attributes.join('; ')}; nopush`); } else { head.add_link_tag(path, attributes); @@ -351,7 +351,7 @@ 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.prerender_default) + serialize_data(item, resolve_opts.filterSerializedResponseHeaders, !!state.prerendering) ) .join('\n\t\t\t')}`; } @@ -363,7 +363,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.prerender_default; + const load_env_eagerly = client.uses_env_dynamic_public && !!state.prerendering; if (load_env_eagerly) { modulepreloads.add(`${paths.app_dir}/env.js`); @@ -568,14 +568,14 @@ export async function render_response({ 'content-type': 'text/html' }); - if (state.prerendering || state.prerender_default) { + if (state.prerendering) { // 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/types/internal.d.ts b/packages/kit/src/types/internal.d.ts index e29764189a06..1eeb6f6dee94 100644 --- a/packages/kit/src/types/internal.d.ts +++ b/packages/kit/src/types/internal.d.ts @@ -185,7 +185,7 @@ export class InternalServer extends Server { /** @internal used during development to check feature availability depending on the current route */ before_handle?: ( event: RequestEvent, - config: Record, + config: any, prerender: PrerenderOption, handle: () => Promise ) => Promise; @@ -233,7 +233,6 @@ 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;