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 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. 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/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..b86c187920d7 --- /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)) + }; +} 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..f9e0cb98fdf7 --- /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}

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..b86c187920d7 --- /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)) + }; +} 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..f9e0cb98fdf7 --- /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}

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<