From c9d4a60457ef2bfbf3276bd97a3531960a193ddc Mon Sep 17 00:00:00 2001 From: seorii Date: Thu, 18 Sep 2025 14:52:51 +0000 Subject: [PATCH 1/5] feat: expose server object --- packages/kit/src/exports/public.d.ts | 8 ++++++++ packages/kit/src/runtime/server/page/load_data.js | 12 +++++++++++- packages/kit/types/index.d.ts | 8 ++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 4c0240d0bcd1..b2d0ce7e3561 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -1143,6 +1143,14 @@ export interface LoadEvent< /** The span associated with the current `load` function. */ current: Span; }; + + /** + * Server only properties when `LoadEvent` executed on server. + */ + server?: Omit< + ServerLoadEvent, + keyof LoadEvent + >; } export interface NavigationEvent< diff --git a/packages/kit/src/runtime/server/page/load_data.js b/packages/kit/src/runtime/server/page/load_data.js index 520d6ff5bb85..d4191f5cd31e 100644 --- a/packages/kit/src/runtime/server/page/load_data.js +++ b/packages/kit/src/runtime/server/page/load_data.js @@ -244,7 +244,17 @@ export async function load_data({ depends: () => {}, parent, untrack: (fn) => fn(), - tracing: traced_event.tracing + tracing: traced_event.tracing, + server: { + cookies: event.cookies, + getClientAddress: event.getClientAddress, + locals: event.locals, + platform: event.platform, + request: event.request, + isDataRequest: event.isDataRequest, + isSubRequest: event.isSubRequest, + isRemoteRequest: event.isRemoteRequest + } }) ); } diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 154243983a0b..7ef8f413adf5 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -1119,6 +1119,14 @@ declare module '@sveltejs/kit' { /** The span associated with the current `load` function. */ current: Span; }; + + /** + * Server only properties when `LoadEvent` executed on server. + */ + server?: Omit< + ServerLoadEvent, + keyof LoadEvent + >; } export interface NavigationEvent< From c2d20d5000ffd8980d144c7530e7d5daa368e2a3 Mon Sep 17 00:00:00 2001 From: seorii Date: Thu, 18 Sep 2025 14:55:31 +0000 Subject: [PATCH 2/5] test: add testcase --- .../basics/src/routes/load/universal-load/csr/+page.js | 8 ++++++++ .../src/routes/load/universal-load/csr/+page.svelte | 6 ++++++ .../basics/src/routes/load/universal-load/ssr/+page.js | 8 ++++++++ .../src/routes/load/universal-load/ssr/+page.svelte | 6 ++++++ 4 files changed, 28 insertions(+) create mode 100644 packages/kit/test/apps/basics/src/routes/load/universal-load/csr/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/universal-load/csr/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/universal-load/ssr/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/universal-load/ssr/+page.svelte diff --git a/packages/kit/test/apps/basics/src/routes/load/universal-load/csr/+page.js b/packages/kit/test/apps/basics/src/routes/load/universal-load/csr/+page.js new file mode 100644 index 000000000000..b793b63880e1 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/universal-load/csr/+page.js @@ -0,0 +1,8 @@ +import { browser } from '$app/environment'; + +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ server }) { + return { + correct: browser === !server && (!server || ((await server.request.arrayBuffer()) && true)) + }; +} \ No newline at end of file diff --git a/packages/kit/test/apps/basics/src/routes/load/universal-load/csr/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/universal-load/csr/+page.svelte new file mode 100644 index 000000000000..2275a5b568e3 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/universal-load/csr/+page.svelte @@ -0,0 +1,6 @@ + + +

Is it correct? {data.correct}

\ No newline at end of file diff --git a/packages/kit/test/apps/basics/src/routes/load/universal-load/ssr/+page.js b/packages/kit/test/apps/basics/src/routes/load/universal-load/ssr/+page.js new file mode 100644 index 000000000000..b793b63880e1 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/universal-load/ssr/+page.js @@ -0,0 +1,8 @@ +import { browser } from '$app/environment'; + +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ server }) { + return { + correct: browser === !server && (!server || ((await server.request.arrayBuffer()) && true)) + }; +} \ No newline at end of file diff --git a/packages/kit/test/apps/basics/src/routes/load/universal-load/ssr/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/universal-load/ssr/+page.svelte new file mode 100644 index 000000000000..2275a5b568e3 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/universal-load/ssr/+page.svelte @@ -0,0 +1,6 @@ + + +

Is it correct? {data.correct}

\ No newline at end of file From 22ec8757381c8e5dcb47901e842327e2a3ea6d82 Mon Sep 17 00:00:00 2001 From: seorii Date: Thu, 18 Sep 2025 14:55:38 +0000 Subject: [PATCH 3/5] chore: add changeset --- .changeset/fresh-pugs-yell.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/fresh-pugs-yell.md diff --git a/.changeset/fresh-pugs-yell.md b/.changeset/fresh-pugs-yell.md new file mode 100644 index 000000000000..4d88214f1136 --- /dev/null +++ b/.changeset/fresh-pugs-yell.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': minor +--- + +feat: add server property when load executes on server From de611294b9c0e561e8d2f341a81e108ba5dfe813 Mon Sep 17 00:00:00 2001 From: seorii Date: Thu, 18 Sep 2025 15:27:17 +0000 Subject: [PATCH 4/5] docs: update doc --- documentation/docs/20-core-concepts/20-load.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/documentation/docs/20-core-concepts/20-load.md b/documentation/docs/20-core-concepts/20-load.md index d6a1ccc21825..68adfbfa2926 100644 --- a/documentation/docs/20-core-concepts/20-load.md +++ b/documentation/docs/20-core-concepts/20-load.md @@ -202,6 +202,8 @@ Server `load` functions are called with a `ServerLoadEvent`, which inherits `cli Universal `load` functions are called with a `LoadEvent`, which has a `data` property. If you have `load` functions in both `+page.js` and `+page.server.js` (or `+layout.js` and `+layout.server.js`), the return value of the server `load` function is the `data` property of the universal `load` function's argument. +> [!NOTE] Since 2.??, when universal `load` functions are called on server, `LoadEvent` includes `server` object, which consists of `clientAddress`, `cookies`, `locals`, `platform` and `request`. `server` becomes `undefined` if `load` functions are called on client. + ### Output A universal `load` function can return an object containing any values, including things like custom classes and component constructors. From 9c6ea0ee9e6c604b916fd4f196836ee5805bbb3d Mon Sep 17 00:00:00 2001 From: seorii Date: Fri, 19 Sep 2025 09:58:09 +0000 Subject: [PATCH 5/5] format: format --- .../apps/basics/src/routes/load/universal-load/csr/+page.js | 2 +- .../apps/basics/src/routes/load/universal-load/csr/+page.svelte | 2 +- .../apps/basics/src/routes/load/universal-load/ssr/+page.js | 2 +- .../apps/basics/src/routes/load/universal-load/ssr/+page.svelte | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/kit/test/apps/basics/src/routes/load/universal-load/csr/+page.js b/packages/kit/test/apps/basics/src/routes/load/universal-load/csr/+page.js index b793b63880e1..b86c187920d7 100644 --- a/packages/kit/test/apps/basics/src/routes/load/universal-load/csr/+page.js +++ b/packages/kit/test/apps/basics/src/routes/load/universal-load/csr/+page.js @@ -5,4 +5,4 @@ export async function load({ server }) { return { correct: browser === !server && (!server || ((await server.request.arrayBuffer()) && true)) }; -} \ No newline at end of file +} diff --git a/packages/kit/test/apps/basics/src/routes/load/universal-load/csr/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/universal-load/csr/+page.svelte index 2275a5b568e3..f9e0cb98fdf7 100644 --- a/packages/kit/test/apps/basics/src/routes/load/universal-load/csr/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/load/universal-load/csr/+page.svelte @@ -3,4 +3,4 @@ export let data; -

Is it correct? {data.correct}

\ No newline at end of file +

Is it correct? {data.correct}

diff --git a/packages/kit/test/apps/basics/src/routes/load/universal-load/ssr/+page.js b/packages/kit/test/apps/basics/src/routes/load/universal-load/ssr/+page.js index b793b63880e1..b86c187920d7 100644 --- a/packages/kit/test/apps/basics/src/routes/load/universal-load/ssr/+page.js +++ b/packages/kit/test/apps/basics/src/routes/load/universal-load/ssr/+page.js @@ -5,4 +5,4 @@ export async function load({ server }) { return { correct: browser === !server && (!server || ((await server.request.arrayBuffer()) && true)) }; -} \ No newline at end of file +} diff --git a/packages/kit/test/apps/basics/src/routes/load/universal-load/ssr/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/universal-load/ssr/+page.svelte index 2275a5b568e3..f9e0cb98fdf7 100644 --- a/packages/kit/test/apps/basics/src/routes/load/universal-load/ssr/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/load/universal-load/ssr/+page.svelte @@ -3,4 +3,4 @@ export let data; -

Is it correct? {data.correct}

\ No newline at end of file +

Is it correct? {data.correct}