From e7e2c499e1f9f0d1f00c4a11ca67aa4996f638a6 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 16 Aug 2022 20:56:01 -0400 Subject: [PATCH] Remove session (#5946) * remove session * remove session references * lint --- .changeset/happy-clouds-beam.md | 5 ++ documentation/docs/06-hooks.md | 52 +------------------ documentation/docs/16-types.md | 2 +- documentation/docs/80-migrating.md | 8 +-- .../test/apps/spa/src/routes/+error.svelte | 10 +--- packages/adapter-static/test/test.js | 2 - packages/kit/src/runtime/app/stores.js | 39 +++++++------- packages/kit/src/runtime/client/client.js | 39 +++----------- packages/kit/src/runtime/client/start.js | 4 +- packages/kit/src/runtime/client/types.d.ts | 1 - packages/kit/src/runtime/server/index.js | 5 -- packages/kit/src/runtime/server/page/index.js | 8 --- .../kit/src/runtime/server/page/load_data.js | 23 ++------ .../kit/src/runtime/server/page/render.js | 22 -------- .../runtime/server/page/respond_with_error.js | 14 +---- packages/kit/src/vite/build/build_server.js | 1 - packages/kit/src/vite/dev/index.js | 1 - packages/kit/test/apps/basics/src/app.d.ts | 5 -- packages/kit/test/apps/basics/src/hooks.js | 13 ----- .../change-detection/session/unused/+page.js | 7 --- .../session/unused/+page.svelte | 12 ----- .../change-detection/session/used/+page.js | 8 --- .../session/used/+page.svelte | 12 ----- .../src/routes/load/layout-props/+layout.js | 5 +- .../routes/load/layout-props/+layout.svelte | 3 -- .../basics/src/routes/prerendering/+page.js | 5 -- .../src/routes/prerendering/+page.svelte | 1 - .../apps/basics/src/routes/session/+page.js | 6 --- .../basics/src/routes/session/+page.svelte | 17 ------ .../apps/basics/src/routes/store/+page.svelte | 33 ------------ .../src/routes/store/data/foo/+page.svelte | 3 +- .../store/data/only-data-changes/+page.js | 3 -- .../store/data/only-data-changes/+page.svelte | 9 ---- .../src/routes/store/result/+page.svelte | 16 ------ .../kit/test/apps/basics/test/client.test.js | 34 ------------ packages/kit/test/apps/basics/test/test.js | 38 -------------- .../kit/test/apps/options/source/app.d.ts | 2 - packages/kit/test/apps/writes/src/app.d.ts | 2 - .../src/routes/accesses-session/+page.js | 3 -- .../src/routes/accesses-session/+page.svelte | 1 - .../kit/test/prerendering/basics/test/test.js | 6 --- packages/kit/types/ambient.d.ts | 23 ++------ packages/kit/types/index.d.ts | 5 -- packages/kit/types/internal.d.ts | 2 - 44 files changed, 53 insertions(+), 457 deletions(-) create mode 100644 .changeset/happy-clouds-beam.md delete mode 100644 packages/kit/test/apps/basics/src/routes/load/change-detection/session/unused/+page.js delete mode 100644 packages/kit/test/apps/basics/src/routes/load/change-detection/session/unused/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/load/change-detection/session/used/+page.js delete mode 100644 packages/kit/test/apps/basics/src/routes/load/change-detection/session/used/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/prerendering/+page.js delete mode 100644 packages/kit/test/apps/basics/src/routes/prerendering/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/session/+page.js delete mode 100644 packages/kit/test/apps/basics/src/routes/session/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/store/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/store/data/only-data-changes/+page.js delete mode 100644 packages/kit/test/apps/basics/src/routes/store/data/only-data-changes/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/store/result/+page.svelte delete mode 100644 packages/kit/test/prerendering/basics/src/routes/accesses-session/+page.js delete mode 100644 packages/kit/test/prerendering/basics/src/routes/accesses-session/+page.svelte diff --git a/.changeset/happy-clouds-beam.md b/.changeset/happy-clouds-beam.md new file mode 100644 index 000000000000..8a67fe4ba8aa --- /dev/null +++ b/.changeset/happy-clouds-beam.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +[breaking] Remove session object diff --git a/documentation/docs/06-hooks.md b/documentation/docs/06-hooks.md index a6809c6857bf..ded925961642 100644 --- a/documentation/docs/06-hooks.md +++ b/documentation/docs/06-hooks.md @@ -2,7 +2,7 @@ title: Hooks --- -An optional `src/hooks.js` (or `src/hooks.ts`, or `src/hooks/index.js`) file exports four functions, all optional, that run on the server — `handle`, `handleError`, `getSession`, and `externalFetch`. +An optional `src/hooks.js` (or `src/hooks.ts`, or `src/hooks/index.js`) file exports three functions, all optional, that run on the server — `handle`, `handleError` and `externalFetch`. > The location of this file can be [configured](/docs/configuration) as `config.kit.files.hooks` @@ -105,56 +105,6 @@ export function handleError({ error, event }) { > `handleError` is only called for _unexpected_ errors. It is not called for errors created with the [`error`](/docs/modules#sveltejs-kit-error) function imported from `@sveltejs/kit`, as these are _expected_ errors. -### getSession - -This function takes the `event` object and returns a `session` object that is [accessible on the client](/docs/modules#$app-stores) and therefore must be safe to expose to users. It runs whenever SvelteKit server-renders a page. - -If unimplemented, session is `{}`. - -```js -/// file: src/hooks.js -// @filename: ambient.d.ts -declare namespace App { - interface Locals { - user: { - name: string; - email: string; - avatar: string; - token: string; - } - } - interface Session { - user?: { - name: string; - email: string; - avatar: string; - } - } -} - -type MaybePromise = T | Promise; - -// @filename: index.js -// ---cut--- -/** @type {import('@sveltejs/kit').GetSession} */ -export function getSession(event) { - return event.locals.user - ? { - user: { - // only include properties needed client-side — - // exclude anything else attached to the user - // like access tokens etc - name: event.locals.user.name, - email: event.locals.user.email, - avatar: event.locals.user.avatar - } - } - : {}; -} -``` - -> `session` must be serializable, which means it must not contain things like functions or custom classes, just built-in JavaScript data types - ### externalFetch This function allows you to modify (or replace) a `fetch` request for an external resource that happens inside a `load` function that runs on the server (or during pre-rendering). diff --git a/documentation/docs/16-types.md b/documentation/docs/16-types.md index 2118ab259dc4..4a68b22a5937 100644 --- a/documentation/docs/16-types.md +++ b/documentation/docs/16-types.md @@ -81,7 +81,7 @@ export type PageLoad = Kit.Load; // @errors: 2355 // ---cut--- /** @type {import('./$types').PageLoad} */ -export async function load({ params, fetch, session }) { +export async function load({ params, fetch }) { // ... } ``` diff --git a/documentation/docs/80-migrating.md b/documentation/docs/80-migrating.md index adad9765a174..ce59f49a194a 100644 --- a/documentation/docs/80-migrating.md +++ b/documentation/docs/80-migrating.md @@ -49,7 +49,7 @@ This file has no equivalent in SvelteKit. Any custom logic (beyond `sapper.start #### src/server.js -When using `adapter-node` the equivalent is a [custom server](https://github.com/sveltejs/kit/tree/master/packages/adapter-node#custom-server). Otherwise, this file has no direct equivalent, since SvelteKit apps can run in serverless environments. You can, however, use the [hooks module](/docs/hooks) to implement session logic. +When using `adapter-node` the equivalent is a [custom server](https://github.com/sveltejs/kit/tree/master/packages/adapter-node#custom-server). Otherwise, this file has no direct equivalent, since SvelteKit apps can run in serverless environments. #### src/service-worker.js @@ -95,7 +95,7 @@ Any files you previously imported from directories in `src/node_modules` will ne As before, pages and layouts can export a function that allows data to be loaded before rendering takes place. -This function has been renamed from `preload` to [`load`](/docs/load), it now lives in a `+page.js` (or `+layout.js`) next to its `+page.svelte` (or `+layout.svelte`), and its API has changed. Instead of two arguments — `page` and `session` — there is a single argument that includes both, along with `fetch` (which replaces `this.fetch`) and a new `stuff` object. +This function has been renamed from `preload` to [`load`](/docs/load), it now lives in a `+page.js` (or `+layout.js`) next to its `+page.svelte` (or `+layout.svelte`), and its API has changed. Instead of two arguments — `page` and `session` — there is a single `event` argument. There is no more `this` object, and consequently no `this.fetch`, `this.error` or `this.redirect`. Instead of returning props directly, `load` now returns an object that _contains_ `props`, alongside various other things. @@ -115,9 +115,9 @@ import { stores } from '@sapper/app'; const { preloading, page, session } = stores(); ``` -The `page` and `session` stores still exist; `preloading` has been replaced with a `navigating` store that contains `from` and `to` properties. `page` now has `url` and `params` properties, but no `path` or `query`. +The `page` store still exists; `preloading` has been replaced with a `navigating` store that contains `from` and `to` properties. `page` now has `url` and `params` properties, but no `path` or `query`. -You access them differently in SvelteKit. `stores` is now `getStores`, but in most cases it is unnecessary since you can import `navigating`, `page` and `session` directly from [`$app/stores`](/docs/modules#$app-stores). +You access them differently in SvelteKit. `stores` is now `getStores`, but in most cases it is unnecessary since you can import `navigating`, and `page` directly from [`$app/stores`](/docs/modules#$app-stores). #### Routing diff --git a/packages/adapter-static/test/apps/spa/src/routes/+error.svelte b/packages/adapter-static/test/apps/spa/src/routes/+error.svelte index 915006a71fbd..9b0abbfdda47 100644 --- a/packages/adapter-static/test/apps/spa/src/routes/+error.svelte +++ b/packages/adapter-static/test/apps/spa/src/routes/+error.svelte @@ -1,13 +1,5 @@

{$page.status}

-

count: {$session.count}

- - diff --git a/packages/adapter-static/test/test.js b/packages/adapter-static/test/test.js index 93bbd1e97c77..ffc1f4072e7e 100644 --- a/packages/adapter-static/test/test.js +++ b/packages/adapter-static/test/test.js @@ -34,7 +34,5 @@ run('spa', (test) => { test('renders error page for missing page', async ({ base, page }) => { await page.goto(`${base}/nosuchpage`); assert.equal(await page.textContent('h1'), '404'); - await page.waitForLoadState('networkidle', { timeout: 1000 }); - assert.equal(await page.textContent('h2'), 'count: 1'); }); }); diff --git a/packages/kit/src/runtime/app/stores.js b/packages/kit/src/runtime/app/stores.js index 1b040d3ce4bc..d98e71715b12 100644 --- a/packages/kit/src/runtime/app/stores.js +++ b/packages/kit/src/runtime/app/stores.js @@ -32,7 +32,10 @@ export const getStores = () => { subscribe: stores.navigating.subscribe }; }, - session: stores.session, + get session() { + removed_session(); + return {}; + }, updated: stores.updated }; }; @@ -54,29 +57,17 @@ export const navigating = { } }; -/** @param {string} verb */ -const throw_error = (verb) => { +function removed_session() { + // TODO remove for 1.0 throw new Error( - browser - ? `Cannot ${verb} session store before subscribing` - : `Can only ${verb} session store in browser` + 'stores.session is no longer available. See https://github.com/sveltejs/kit/discussions/5883' ); -}; +} -/** @type {typeof import('$app/stores').session} */ export const session = { - subscribe(fn) { - const store = getStores().session; - - if (browser) { - session.set = store.set; - session.update = store.update; - } - - return store.subscribe(fn); - }, - set: () => throw_error('set'), - update: () => throw_error('update') + subscribe: removed_session, + set: removed_session, + update: removed_session }; /** @type {typeof import('$app/stores').updated} */ @@ -90,5 +81,11 @@ export const updated = { return store.subscribe(fn); }, - check: () => throw_error('check') + check: () => { + throw new Error( + browser + ? `Cannot check updated store before subscribing` + : `Can only check updated store in browser` + ); + } }; diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 491f1ef4b598..4600be85a1d9 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -50,13 +50,12 @@ function update_scroll_positions(index) { /** * @param {{ * target: Element; - * session: App.Session; * base: string; * trailing_slash: import('types').TrailingSlash; * }} opts * @returns {import('./types').Client} */ -export function create_client({ target, session, base, trailing_slash }) { +export function create_client({ target, base, trailing_slash }) { /** @type {Array<((href: string) => boolean)>} */ const invalidated = []; @@ -64,7 +63,6 @@ export function create_client({ target, session, base, trailing_slash }) { url: notifiable_store({}), page: notifiable_store({}), navigating: writable(/** @type {import('types').Navigation | null} */ (null)), - session: writable(session), updated: create_updated_store() }; @@ -102,23 +100,6 @@ export function create_client({ target, session, base, trailing_slash }) { /** @type {import('svelte').SvelteComponent} */ let root; - /** @type {App.Session} */ - let $session; - - let ready = false; - stores.session.subscribe(async (value) => { - $session = value; - - if (!ready) return; - session_id += 1; - - const current_load_uses_session = current.branch.some((node) => node?.uses.session); - if (!current_load_uses_session) return; - - update(new URL(location.href), []); - }); - ready = true; - let router_enabled = true; // keeping track of the history index in order to prevent popstate navigation events if needed @@ -475,7 +456,6 @@ export function create_client({ target, session, base, trailing_slash }) { const uses = { params: new Set(), url: false, - session: false, dependencies: new Set(), parent: false }; @@ -511,7 +491,6 @@ export function create_client({ target, session, base, trailing_slash }) { }); } - const session = $session; const load_url = new LoadURL(url); if (node.shared?.load) { @@ -524,10 +503,6 @@ export function create_client({ target, session, base, trailing_slash }) { uses.url = true; return load_url; }, - get session() { - uses.session = true; - return session; - }, async fetch(resource, init) { let requested; @@ -581,6 +556,12 @@ export function create_client({ target, session, base, trailing_slash }) { '@migration task: Replace `props` with `data` stuff https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292693' ); }, + get session() { + // TODO remove this for 1.0 + throw new Error( + 'session is no longer available. See https://github.com/sveltejs/kit/discussions/5883' + ); + }, get stuff() { throw new Error( '@migration task: Remove stuff https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292693' @@ -620,8 +601,7 @@ export function create_client({ target, session, base, trailing_slash }) { const changed = current.url && { url: id !== current.url.pathname + current.url.search, - params: Object.keys(params).filter((key) => current.params[key] !== params[key]), - session: session_id !== current.session_id + params: Object.keys(params).filter((key) => current.params[key] !== params[key]) }; // preload modules to avoid waterfall, but handle rejections @@ -643,7 +623,6 @@ export function create_client({ target, session, base, trailing_slash }) { !previous || (changed.url && previous.uses.url) || changed.params.some((param) => previous.uses.params.has(param)) || - (changed.session && previous.uses.session) || Array.from(previous.uses.dependencies).some((dep) => invalidated.some((fn) => fn(dep))) || (previous.uses.parent && nodes_changed_since_last_render.includes(true)); nodes_changed_since_last_render.push(changed_since_last_render); @@ -753,7 +732,6 @@ export function create_client({ target, session, base, trailing_slash }) { uses: { params: new Set(), url: false, - session: false, dependencies: new Set(), parent: false } @@ -825,7 +803,6 @@ export function create_client({ target, session, base, trailing_slash }) { uses: { params: new Set(), url: false, - session: false, dependencies: new Set(), parent: false } diff --git a/packages/kit/src/runtime/client/start.js b/packages/kit/src/runtime/client/start.js index 995a7eeb885d..2c679c8a6cc2 100644 --- a/packages/kit/src/runtime/client/start.js +++ b/packages/kit/src/runtime/client/start.js @@ -11,7 +11,6 @@ export { set_public_env } from '../env-public.js'; * base: string; * }, * target: Element; - * session: any; * route: boolean; * spa: boolean; * trailing_slash: import('types').TrailingSlash; @@ -24,10 +23,9 @@ export { set_public_env } from '../env-public.js'; * }; * }} opts */ -export async function start({ paths, target, session, route, spa, trailing_slash, hydrate }) { +export async function start({ paths, target, route, spa, trailing_slash, hydrate }) { const client = create_client({ target, - session, base: paths.base, trailing_slash }); diff --git a/packages/kit/src/runtime/client/types.d.ts b/packages/kit/src/runtime/client/types.d.ts index 1f07a90fcdf5..493d2fb6e432 100644 --- a/packages/kit/src/runtime/client/types.d.ts +++ b/packages/kit/src/runtime/client/types.d.ts @@ -69,7 +69,6 @@ export type BranchNode = { uses: { params: Set; url: boolean; // TODO make more granular? - session: boolean; dependencies: Set; parent: boolean; }; diff --git a/packages/kit/src/runtime/server/index.js b/packages/kit/src/runtime/server/index.js index d780c5458b96..3d7c8c2ebb3d 100644 --- a/packages/kit/src/runtime/server/index.js +++ b/packages/kit/src/runtime/server/index.js @@ -222,7 +222,6 @@ export async function respond(request, options, state) { event, options, state, - $session: await options.hooks.getSession(event), page_config: { router: true, hydrate: true }, status: 200, error: null, @@ -365,12 +364,10 @@ export async function respond(request, options, state) { // if this request came direct from the user, rather than // via a `fetch` in a `load`, render a 404 page if (!state.initiator) { - const $session = await options.hooks.getSession(event); return await respond_with_error({ event, options, state, - $session, status: 404, error: new Error(`Not found: ${event.url.pathname}`), resolve_opts @@ -418,12 +415,10 @@ export async function respond(request, options, state) { // TODO is this necessary? should we just return a plain 500 at this point? try { - const $session = await options.hooks.getSession(event); return await respond_with_error({ event, options, state, - $session, status: 500, error, resolve_opts diff --git a/packages/kit/src/runtime/server/page/index.js b/packages/kit/src/runtime/server/page/index.js index e1eaa4547e4d..c168cf56df71 100644 --- a/packages/kit/src/runtime/server/page/index.js +++ b/packages/kit/src/runtime/server/page/index.js @@ -43,8 +43,6 @@ export async function render_page(event, route, options, state, resolve_opts) { } } - const $session = await options.hooks.getSession(event); - const { fetcher, fetched, cookies } = create_fetch({ event, options, state, route }); try { @@ -112,7 +110,6 @@ export async function render_page(event, route, options, state, resolve_opts) { event, options, state, - $session, resolve_opts }); } @@ -180,11 +177,9 @@ export async function render_page(event, route, options, state, resolve_opts) { return Promise.resolve().then(async () => { try { return await load_data({ - $session, event, fetcher, node, - options, parent: async () => { const data = {}; for (let j = 0; j < i; j += 1) { @@ -240,7 +235,6 @@ export async function render_page(event, route, options, state, resolve_opts) { event, options, state, - $session, resolve_opts, page_config: { router: true, hydrate: true }, status, @@ -294,7 +288,6 @@ export async function render_page(event, route, options, state, resolve_opts) { event, options, state, - $session, resolve_opts, page_config: get_page_config(leaf_node, options), status, @@ -313,7 +306,6 @@ export async function render_page(event, route, options, state, resolve_opts) { event, options, state, - $session, status: 500, error: /** @type {Error} */ (error), resolve_opts diff --git a/packages/kit/src/runtime/server/page/load_data.js b/packages/kit/src/runtime/server/page/load_data.js index 08c308a92724..04872ad72bb4 100644 --- a/packages/kit/src/runtime/server/page/load_data.js +++ b/packages/kit/src/runtime/server/page/load_data.js @@ -33,26 +33,15 @@ export async function load_server_data({ event, node, parent }) { /** * Calls the user's `load` function. * @param {{ - * $session: Record; * event: import('types').RequestEvent; * fetcher: typeof fetch; * node: import('types').SSRNode | undefined; - * options: import('types').SSROptions; * parent: () => Promise>; * server_data_promise: Promise; * state: import('types').SSRState; * }} opts */ -export async function load_data({ - $session, - event, - fetcher, - node, - options, - parent, - server_data_promise, - state -}) { +export async function load_data({ event, fetcher, node, parent, server_data_promise, state }) { const server_data = await server_data_promise; if (!node?.shared?.load) { @@ -65,12 +54,10 @@ export async function load_data({ data: server_data, routeId: event.routeId, get session() { - if (node.shared.prerender ?? options.prerender.default) { - throw Error( - 'Attempted to access session from a prerendered page. Session would never be populated.' - ); - } - return $session; + // TODO remove for 1.0 + throw new Error( + 'session is no longer available. See https://github.com/sveltejs/kit/discussions/5883' + ); }, fetch: fetcher, setHeaders: event.setHeaders, diff --git a/packages/kit/src/runtime/server/page/render.js b/packages/kit/src/runtime/server/page/render.js index 1e1fc04b869d..835b0b7b0986 100644 --- a/packages/kit/src/runtime/server/page/render.js +++ b/packages/kit/src/runtime/server/page/render.js @@ -1,7 +1,6 @@ import devalue from 'devalue'; import { readable, writable } from 'svelte/store'; import * as cookie from 'cookie'; -import { coalesce_to_error } from '../../../utils/error.js'; import { hash } from '../../hash.js'; import { render_json_payload_script } from '../../../utils/escape.js'; import { s } from '../../../utils/misc.js'; @@ -25,7 +24,6 @@ const updated = { * cookies: import('set-cookie-parser').Cookie[]; * options: import('types').SSROptions; * state: import('types').SSRState; - * $session: any; * page_config: { hydrate: boolean, router: boolean }; * status: number; * error: HttpError | Error | null; @@ -40,7 +38,6 @@ export async function render_response({ cookies, options, state, - $session, page_config, status, error = null, @@ -79,14 +76,11 @@ export async function render_response({ } if (resolve_opts.ssr) { - const session = writable($session); - /** @type {Record} */ const props = { stores: { page: writable(null), navigating: writable(null), - session, updated }, /** @type {import('types').Page} */ @@ -165,9 +159,6 @@ export async function render_response({ start({ target: document.querySelector('[data-sveltekit-hydrate="${target}"]').parentNode, paths: ${s(options.paths)}, - session: ${try_serialize($session, (error) => { - throw new Error(`Failed to serialize session data: ${error.message}`); - })}, route: ${!!page_config.router}, spa: ${!resolve_opts.ssr}, trailing_slash: ${s(options.trailing_slash)}, @@ -348,16 +339,3 @@ export async function render_response({ headers }); } - -/** - * @param {any} data - * @param {(error: Error) => void} [fail] - */ -function try_serialize(data, fail) { - try { - return devalue(data); - } catch (err) { - if (fail) fail(coalesce_to_error(err)); - return null; - } -} diff --git a/packages/kit/src/runtime/server/page/respond_with_error.js b/packages/kit/src/runtime/server/page/respond_with_error.js index d7c14b73aea0..13e285e09959 100644 --- a/packages/kit/src/runtime/server/page/respond_with_error.js +++ b/packages/kit/src/runtime/server/page/respond_with_error.js @@ -15,21 +15,12 @@ import { create_fetch } from './fetch.js'; * event: import('types').RequestEvent; * options: SSROptions; * state: SSRState; - * $session: any; * status: number; * error: Error; * resolve_opts: import('types').RequiredResolveOptions; * }} opts */ -export async function respond_with_error({ - event, - options, - state, - $session, - status, - error, - resolve_opts -}) { +export async function respond_with_error({ event, options, state, status, error, resolve_opts }) { const { fetcher, fetched, cookies } = create_fetch({ event, options, @@ -52,11 +43,9 @@ export async function respond_with_error({ const server_data = await server_data_promise; const data = await load_data({ - $session, event, fetcher, node: default_layout, - options, parent: async () => ({}), server_data_promise, state @@ -79,7 +68,6 @@ export async function respond_with_error({ return await render_response({ options, state, - $session, page_config: { hydrate: options.hydrate, router: options.router diff --git a/packages/kit/src/vite/build/build_server.js b/packages/kit/src/vite/build/build_server.js index e7c358fdaf0d..e0a778c5f66f 100644 --- a/packages/kit/src/vite/build/build_server.js +++ b/packages/kit/src/vite/build/build_server.js @@ -110,7 +110,6 @@ export class Server { if (!this.options.hooks) { const module = await import(${s(hooks)}); this.options.hooks = { - getSession: module.getSession || (() => ({})), handle: module.handle || (({ event, resolve }) => resolve(event)), handleError: module.handleError || (({ error }) => console.error(error.stack)), externalFetch: module.externalFetch || fetch diff --git a/packages/kit/src/vite/dev/index.js b/packages/kit/src/vite/dev/index.js index 438c94fb0e7c..cba73ba589b8 100644 --- a/packages/kit/src/vite/dev/index.js +++ b/packages/kit/src/vite/dev/index.js @@ -343,7 +343,6 @@ export async function dev(vite, vite_config, svelte_config, illegal_imports) { /** @type {import('types').Hooks} */ const hooks = { - getSession: user_hooks.getSession || (() => ({})), handle, handleError: user_hooks.handleError || diff --git a/packages/kit/test/apps/basics/src/app.d.ts b/packages/kit/test/apps/basics/src/app.d.ts index 9ab8200fbbc4..36f8f27398d7 100644 --- a/packages/kit/test/apps/basics/src/app.d.ts +++ b/packages/kit/test/apps/basics/src/app.d.ts @@ -7,9 +7,4 @@ declare namespace App { } interface Platform {} - - interface Session { - answer?: number; - calls?: number; - } } diff --git a/packages/kit/test/apps/basics/src/hooks.js b/packages/kit/test/apps/basics/src/hooks.js index 9189f0b3acd4..d6b9caa9d274 100644 --- a/packages/kit/test/apps/basics/src/hooks.js +++ b/packages/kit/test/apps/basics/src/hooks.js @@ -2,19 +2,6 @@ import fs from 'fs'; import cookie from 'cookie'; import { sequence } from '../../../../src/hooks'; -/** @type {import('@sveltejs/kit').GetSession} */ -export function getSession(request) { - if (request.url.href.includes('caching') && !request.url.href.includes('session')) { - // necessary, else some caching tests fail - return {}; - } - - return { - answer: request.locals.answer, - calls: 0 - }; -} - /** @type {import('@sveltejs/kit').HandleError} */ export const handleError = ({ event, error }) => { // TODO we do this because there's no other way (that i'm aware of) diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/session/unused/+page.js b/packages/kit/test/apps/basics/src/routes/load/change-detection/session/unused/+page.js deleted file mode 100644 index 565755ef01e6..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/change-detection/session/unused/+page.js +++ /dev/null @@ -1,7 +0,0 @@ -/** @type {import('@sveltejs/kit').Load} */ -export async function load() { - return { - // Needs to be an object, else Svelte will do by-value-comparison and skip rerender - obj: {} - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/session/unused/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/change-detection/session/unused/+page.svelte deleted file mode 100644 index 2621e4656291..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/change-detection/session/unused/+page.svelte +++ /dev/null @@ -1,12 +0,0 @@ - - -

{count}

- diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/session/used/+page.js b/packages/kit/test/apps/basics/src/routes/load/change-detection/session/used/+page.js deleted file mode 100644 index 181c710e1efa..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/change-detection/session/used/+page.js +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('@sveltejs/kit').Load} */ -export async function load({ session }) { - session; - return { - // Needs to be an object, else Svelte will do by-value-comparison and skip rerender - obj: {} - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/load/change-detection/session/used/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/change-detection/session/used/+page.svelte deleted file mode 100644 index 2621e4656291..000000000000 --- a/packages/kit/test/apps/basics/src/routes/load/change-detection/session/used/+page.svelte +++ /dev/null @@ -1,12 +0,0 @@ - - -

{count}

- diff --git a/packages/kit/test/apps/basics/src/routes/load/layout-props/+layout.js b/packages/kit/test/apps/basics/src/routes/load/layout-props/+layout.js index 33cd8304ce77..383bdc9c2560 100644 --- a/packages/kit/test/apps/basics/src/routes/load/layout-props/+layout.js +++ b/packages/kit/test/apps/basics/src/routes/load/layout-props/+layout.js @@ -1,6 +1,5 @@ -/** @type {import('@sveltejs/kit').Load} */ -export async function load({ session }) { - session; // not necessary, but prevents the argument from being marked as unused +/** @type {import('./$types').LayoutLoad} */ +export async function load() { return { // Needs to be an object, else Svelte will do by-value-comparison and skip rerender obj: {} diff --git a/packages/kit/test/apps/basics/src/routes/load/layout-props/+layout.svelte b/packages/kit/test/apps/basics/src/routes/load/layout-props/+layout.svelte index b6c696ba75cb..d7d62c04dda5 100644 --- a/packages/kit/test/apps/basics/src/routes/load/layout-props/+layout.svelte +++ b/packages/kit/test/apps/basics/src/routes/load/layout-props/+layout.svelte @@ -1,6 +1,4 @@

{count}

- diff --git a/packages/kit/test/apps/basics/src/routes/prerendering/+page.js b/packages/kit/test/apps/basics/src/routes/prerendering/+page.js deleted file mode 100644 index 5816f68fb244..000000000000 --- a/packages/kit/test/apps/basics/src/routes/prerendering/+page.js +++ /dev/null @@ -1,5 +0,0 @@ -export const prerender = true; - -export const load = ({ session }) => { - return session; -}; diff --git a/packages/kit/test/apps/basics/src/routes/prerendering/+page.svelte b/packages/kit/test/apps/basics/src/routes/prerendering/+page.svelte deleted file mode 100644 index ce23336eadef..000000000000 --- a/packages/kit/test/apps/basics/src/routes/prerendering/+page.svelte +++ /dev/null @@ -1 +0,0 @@ -

You should never see me.

diff --git a/packages/kit/test/apps/basics/src/routes/session/+page.js b/packages/kit/test/apps/basics/src/routes/session/+page.js deleted file mode 100644 index ac75fa4c072c..000000000000 --- a/packages/kit/test/apps/basics/src/routes/session/+page.js +++ /dev/null @@ -1,6 +0,0 @@ -/** @type {import('@sveltejs/kit').Load} */ -export function load({ session }) { - return { - answer: session.answer - }; -} diff --git a/packages/kit/test/apps/basics/src/routes/session/+page.svelte b/packages/kit/test/apps/basics/src/routes/session/+page.svelte deleted file mode 100644 index 8a4b5c120b6d..000000000000 --- a/packages/kit/test/apps/basics/src/routes/session/+page.svelte +++ /dev/null @@ -1,17 +0,0 @@ - - -

answer via props: {data.answer}

-

answer via store: {$session.answer}

-{#if data.answer === 43} -

answer via props is 43

-{/if} -{#if $session.answer === 43} -

answer via store is 43

-{/if} - - diff --git a/packages/kit/test/apps/basics/src/routes/store/+page.svelte b/packages/kit/test/apps/basics/src/routes/store/+page.svelte deleted file mode 100644 index 047138cbad77..000000000000 --- a/packages/kit/test/apps/basics/src/routes/store/+page.svelte +++ /dev/null @@ -1,33 +0,0 @@ - - -

Test

-

Calls: {calls}

-results - -{#if $page.url.pathname === '/store/result'}{console.log( - (window.oops = 'this should not happen') - )}{/if} diff --git a/packages/kit/test/apps/basics/src/routes/store/data/foo/+page.svelte b/packages/kit/test/apps/basics/src/routes/store/data/foo/+page.svelte index 5d4378ac043d..a1ecfd93e2bf 100644 --- a/packages/kit/test/apps/basics/src/routes/store/data/foo/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/store/data/foo/+page.svelte @@ -2,6 +2,5 @@ export let data; -

stuff - foo

+

data - foo

Number prop: {data.number}

-store diff --git a/packages/kit/test/apps/basics/src/routes/store/data/only-data-changes/+page.js b/packages/kit/test/apps/basics/src/routes/store/data/only-data-changes/+page.js deleted file mode 100644 index 3db2ae6fe64b..000000000000 --- a/packages/kit/test/apps/basics/src/routes/store/data/only-data-changes/+page.js +++ /dev/null @@ -1,3 +0,0 @@ -export function load({ session }) { - return session; -} diff --git a/packages/kit/test/apps/basics/src/routes/store/data/only-data-changes/+page.svelte b/packages/kit/test/apps/basics/src/routes/store/data/only-data-changes/+page.svelte deleted file mode 100644 index 46978761d148..000000000000 --- a/packages/kit/test/apps/basics/src/routes/store/data/only-data-changes/+page.svelte +++ /dev/null @@ -1,9 +0,0 @@ - - -
{JSON.stringify(data)}
-
{JSON.stringify($page.data)}
- - diff --git a/packages/kit/test/apps/basics/src/routes/store/result/+page.svelte b/packages/kit/test/apps/basics/src/routes/store/result/+page.svelte deleted file mode 100644 index 0adaf8f06c93..000000000000 --- a/packages/kit/test/apps/basics/src/routes/store/result/+page.svelte +++ /dev/null @@ -1,16 +0,0 @@ - - -

Result

-

Calls: {calls}

diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js index cef1f37219ce..b8edb7e4f505 100644 --- a/packages/kit/test/apps/basics/test/client.test.js +++ b/packages/kit/test/apps/basics/test/client.test.js @@ -348,19 +348,6 @@ test.describe('Load', () => { expect(await page.textContent('h2')).toBe('x: b: 4'); }); - test('load function is only called on session change when used in load', async ({ page }) => { - await page.goto('/load/change-detection/session/used'); - expect(await page.textContent('h2')).toBe('1'); - await page.click('button'); - await page.waitForLoadState('networkidle'); - expect(await page.textContent('h2')).toBe('2'); - - await page.goto('/load/change-detection/session/unused'); - expect(await page.textContent('h2')).toBe('1'); - await page.click('button'); - expect(await page.textContent('h2')).toBe('1'); - }); - test('accessing url.hash from load errors and suggests using page store', async ({ page }) => { await page.goto('/load/url-hash#please-dont-send-me-to-load'); expect(await page.textContent('#message')).toBe( @@ -378,9 +365,6 @@ test.describe('Load', () => { expect(await page.textContent('h1')).toBe('1'); await clicknav('[href="/load/layout-props/b"]'); expect(await page.textContent('h1')).toBe('1'); - await page.click('button'); - await page.waitForLoadState('networkidle'); - expect(await page.textContent('h1')).toBe('2'); }); if (process.env.DEV) { @@ -603,24 +587,6 @@ test.describe('Shadow DOM', () => { }); }); -test.describe('Page Store', () => { - test('Updates data if changed even when no URL change visible', async ({ page }) => { - await page.goto('/store/data/only-data-changes'); - expect(await page.textContent('#page-data')).toBe('{"answer":42,"calls":0}'); - expect(await page.textContent('#store-data')).toBe( - '{"foo":{"bar":"Custom layout"},"name":"SvelteKit","value":123,"answer":42,"calls":0}' - ); - - await page.click('button'); - await page.waitForLoadState('networkidle'); - - expect(await page.textContent('#page-data')).toBe('{"answer":1337}'); - expect(await page.textContent('#store-data')).toBe( - '{"foo":{"bar":"Custom layout"},"name":"SvelteKit","value":123,"answer":1337}' - ); - }); -}); - test('Can use browser-only global on client-only page', async ({ page, read_errors }) => { await page.goto('/no-ssr/browser-only-global'); await expect(page.locator('p')).toHaveText('Works'); diff --git a/packages/kit/test/apps/basics/test/test.js b/packages/kit/test/apps/basics/test/test.js index 32e2903aa9fe..d03fa9600539 100644 --- a/packages/kit/test/apps/basics/test/test.js +++ b/packages/kit/test/apps/basics/test/test.js @@ -523,15 +523,6 @@ test.describe('Errors', () => { expect(await page.innerHTML('h1')).toBe('500'); }); - test('prerendering a page whose load accesses session results in a catchable error', async ({ - page - }) => { - await page.goto('/prerendering'); - expect(await page.textContent('h1')).toBe( - '500: Attempted to access session from a prerendered page. Session would never be populated.' - ); - }); - test('prerendering a page with a mutative page endpoint results in a catchable error', async ({ page }) => { @@ -1079,20 +1070,6 @@ test.describe('$app/stores', () => { expect(await page.textContent('h1')).toBe(baseURL); }); - test('page store functions as expected', async ({ page, clicknav, javaScriptEnabled }) => { - await page.goto('/store'); - - expect(await page.textContent('h1')).toBe('Test'); - expect(await page.textContent('h2')).toBe('Calls: 1'); - - await clicknav('a[href="/store/result"]'); - expect(await page.textContent('h1')).toBe('Result'); - expect(await page.textContent('h2')).toBe(javaScriptEnabled ? 'Calls: 1' : 'Calls: 0'); - - const oops = await page.evaluate(() => window.oops); - expect(oops).toBeUndefined(); - }); - test('page store contains data', async ({ page, clicknav }) => { await page.goto('/store/data/www'); @@ -1659,21 +1636,6 @@ test.describe('Routing', () => { }); }); -test.describe('Session', () => { - test('session is available', async ({ page, javaScriptEnabled }) => { - await page.goto('/session'); - - expect(await page.innerHTML('h1')).toBe('answer via props: 42'); - expect(await page.innerHTML('h2')).toBe('answer via store: 42'); - - if (javaScriptEnabled) { - await page.click('button'); - expect(await page.innerHTML('h3')).toBe('answer via props is 43'); - expect(await page.innerHTML('h4')).toBe('answer via store is 43'); - } - }); -}); - test.describe('Matchers', () => { test('Matches parameters', async ({ page, clicknav }) => { await page.goto('/routing/matched'); diff --git a/packages/kit/test/apps/options/source/app.d.ts b/packages/kit/test/apps/options/source/app.d.ts index 71207691df42..f691327e92ad 100644 --- a/packages/kit/test/apps/options/source/app.d.ts +++ b/packages/kit/test/apps/options/source/app.d.ts @@ -4,6 +4,4 @@ declare namespace App { interface Locals {} interface Platform {} - - interface Session {} } diff --git a/packages/kit/test/apps/writes/src/app.d.ts b/packages/kit/test/apps/writes/src/app.d.ts index 71207691df42..f691327e92ad 100644 --- a/packages/kit/test/apps/writes/src/app.d.ts +++ b/packages/kit/test/apps/writes/src/app.d.ts @@ -4,6 +4,4 @@ declare namespace App { interface Locals {} interface Platform {} - - interface Session {} } diff --git a/packages/kit/test/prerendering/basics/src/routes/accesses-session/+page.js b/packages/kit/test/prerendering/basics/src/routes/accesses-session/+page.js deleted file mode 100644 index bf5652d89fae..000000000000 --- a/packages/kit/test/prerendering/basics/src/routes/accesses-session/+page.js +++ /dev/null @@ -1,3 +0,0 @@ -export const load = ({ session }) => { - return session; -}; diff --git a/packages/kit/test/prerendering/basics/src/routes/accesses-session/+page.svelte b/packages/kit/test/prerendering/basics/src/routes/accesses-session/+page.svelte deleted file mode 100644 index bf15aa47df08..000000000000 --- a/packages/kit/test/prerendering/basics/src/routes/accesses-session/+page.svelte +++ /dev/null @@ -1 +0,0 @@ -

I should never be prerendered.

diff --git a/packages/kit/test/prerendering/basics/test/test.js b/packages/kit/test/prerendering/basics/test/test.js index 8e0a66230cb2..7afc184acf30 100644 --- a/packages/kit/test/prerendering/basics/test/test.js +++ b/packages/kit/test/prerendering/basics/test/test.js @@ -85,12 +85,6 @@ test('does not prerender page with shadow endpoint with non-load handler', () => assert.ok(!fs.existsSync(`${build}/shadowed-post/__data.json`)); }); -test('does not prerender page accessing session in load', () => { - // This should fail to prerender as session can never be populated - // for a prerendered page. - assert.ok(!fs.existsSync(`${build}/accesses-session.html`)); -}); - test('decodes paths when writing files', () => { let content = read('encoding/path with spaces.html'); assert.ok(content.includes('

path with spaces

')); diff --git a/packages/kit/types/ambient.d.ts b/packages/kit/types/ambient.d.ts index a19376eeae5a..25981f86bb25 100644 --- a/packages/kit/types/ambient.d.ts +++ b/packages/kit/types/ambient.d.ts @@ -12,12 +12,10 @@ * interface PrivateEnv {} * * interface PublicEnv {} - * - * interface Session {} * } * ``` * - * By populating these interfaces, you will gain type safety when using `env`, `event.locals`, `event.platform`, `session` and `stuff`. + * By populating these interfaces, you will gain type safety when using `env`, `event.locals` and `event.platform`. * * Note that since it's an ambient declaration file, you have to be careful when using `import` statements. Once you add an `import` * at the top level, the declaration file is no longer considered ambient and you lose access to these typings in other files. @@ -45,7 +43,7 @@ */ declare namespace App { /** - * The interface that defines `event.locals`, which can be accessed in [hooks](https://kit.svelte.dev/docs/hooks) (`handle`, `handleError` and `getSession`) and [endpoints](https://kit.svelte.dev/docs/routing#endpoints). + * The interface that defines `event.locals`, which can be accessed in [hooks](https://kit.svelte.dev/docs/hooks) (`handle`, and `handleError`), server-only `load` functions, and `+server.js` files. */ export interface Locals {} @@ -63,11 +61,6 @@ declare namespace App { * The interface that defines the dynamic environment variables exported from `$env/dynamic/public`. */ export interface PublicEnv extends Record {} - - /** - * The interface that defines `session`, both as an argument to [`load`](https://kit.svelte.dev/docs/load) functions and the value of the [session store](https://kit.svelte.dev/docs/modules#$app-stores). - */ - export interface Session {} } /** @@ -220,15 +213,15 @@ declare module '$app/paths' { /** * ```ts - * import { getStores, navigating, page, session, updated } from '$app/stores'; + * import { getStores, navigating, page, updated } from '$app/stores'; * ``` * - * Stores are _contextual_ — they are added to the [context](https://svelte.dev/tutorial/context-api) of your root component. This means that `session` and `page` are unique to each request on the server, rather than shared between multiple requests handled by the same server simultaneously, which is what makes it safe to include user-specific data in `session`. + * Stores are _contextual_ — they are added to the [context](https://svelte.dev/tutorial/context-api) of your root component. This means that `page` is unique to each request on the server, rather than shared between multiple requests handled by the same server simultaneously. * * Because of that, you must subscribe to the stores during component initialization (which happens automatically if you reference the store value, e.g. as `$page`, in a component) before you can use them. */ declare module '$app/stores' { - import { Readable, Writable } from 'svelte/store'; + import { Readable } from 'svelte/store'; import { Navigation, Page } from '@sveltejs/kit'; /** @@ -238,7 +231,6 @@ declare module '$app/stores' { export function getStores(): { navigating: typeof navigating; page: typeof page; - session: typeof session; updated: typeof updated; }; @@ -252,11 +244,6 @@ declare module '$app/stores' { * When navigating finishes, its value reverts to `null`. */ export const navigating: Readable; - /** - * A writable store whose initial value is whatever was returned from [`getSession`](https://kit.svelte.dev/docs/hooks#getsession). - * It can be written to, but this will not cause changes to persist on the server — this is something you must implement yourself. - */ - export const session: Writable; /** * A readable store whose initial value is `false`. If [`version.pollInterval`](https://kit.svelte.dev/docs/configuration#version) is a non-zero value, SvelteKit will poll for new versions of the app and update the store value to `true` when it detects one. `updated.check()` will force an immediate check, regardless of polling. */ diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index fa56a17111d6..8b5883beb608 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -177,10 +177,6 @@ export interface ExternalFetch { (req: Request): Promise; } -export interface GetSession { - (event: RequestEvent): MaybePromise; -} - export interface Handle { (input: { event: RequestEvent; @@ -214,7 +210,6 @@ export interface LoadEvent< params: Params; data: Data; routeId: string | null; - session: App.Session; setHeaders: (headers: ResponseHeaders) => void; url: URL; parent: () => Promise; diff --git a/packages/kit/types/internal.d.ts b/packages/kit/types/internal.d.ts index c6f2d141e72b..a9938d281c95 100644 --- a/packages/kit/types/internal.d.ts +++ b/packages/kit/types/internal.d.ts @@ -5,7 +5,6 @@ import { Config, ExternalFetch, ServerLoad, - GetSession, Handle, HandleError, KitConfig, @@ -92,7 +91,6 @@ export type GetParams = (match: RegExpExecArray) => Record; export interface Hooks { externalFetch: ExternalFetch; - getSession: GetSession; handle: Handle; handleError: HandleError; }