diff --git a/.changeset/clever-geckos-confess.md b/.changeset/clever-geckos-confess.md new file mode 100644 index 000000000000..498d12fe7995 --- /dev/null +++ b/.changeset/clever-geckos-confess.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +Set cookies when redirecting from shadow endpoint diff --git a/.changeset/pre.json b/.changeset/pre.json index daf1802f679f..210575ee4cf7 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -87,6 +87,7 @@ "clever-dolls-poke", "clever-donuts-smile", "clever-eagles-live", + "clever-geckos-confess", "clever-lizards-grab", "clever-pillows-sing", "clever-readers-turn", diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index def71a06ea67..cc1f7bad208a 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 1.0.0-next.267 + +### Patch Changes + +- Set cookies when redirecting from shadow endpoint ([#3874](https://github.com/sveltejs/kit/pull/3874)) + ## 1.0.0-next.266 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 817c6918e29a..a202b9176ce0 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "1.0.0-next.266", + "version": "1.0.0-next.267", "repository": { "type": "git", "url": "https://github.com/sveltejs/kit", diff --git a/packages/kit/src/runtime/server/index.js b/packages/kit/src/runtime/server/index.js index 634ad06df0cf..9e52cde695d3 100644 --- a/packages/kit/src/runtime/server/index.js +++ b/packages/kit/src/runtime/server/index.js @@ -149,11 +149,11 @@ export async function respond(request, options, state = {}) { const location = response.headers.get('location'); if (location) { + const headers = new Headers(response.headers); + headers.set('x-sveltekit-location', location); response = new Response(undefined, { status: 204, - headers: { - 'x-sveltekit-location': location - } + headers }); } } diff --git a/packages/kit/src/runtime/server/page/load_node.js b/packages/kit/src/runtime/server/page/load_node.js index 0fb94b7da89e..994dac98cdfa 100644 --- a/packages/kit/src/runtime/server/page/load_node.js +++ b/packages/kit/src/runtime/server/page/load_node.js @@ -396,22 +396,21 @@ async function load_shadow_data(route, event, prerender) { if (result.fallthrough) return result; const { status, headers, body } = validate_shadow_output(result); + data.status = status; + add_cookies(/** @type {string[]} */ (data.cookies), headers); // Redirects are respected... if (status >= 300 && status < 400) { - return { - status, - redirect: /** @type {string} */ ( - headers instanceof Headers ? headers.get('location') : headers.location - ) - }; + data.redirect = /** @type {string} */ ( + headers instanceof Headers ? headers.get('location') : headers.location + ); + return data; } // ...but 4xx and 5xx status codes _don't_ result in the error page // rendering for non-GET requests — instead, we allow the page // to render with any validation errors etc that were returned - data.status = status; data.body = body; } @@ -422,21 +421,18 @@ async function load_shadow_data(route, event, prerender) { const { status, headers, body } = validate_shadow_output(result); add_cookies(/** @type {string[]} */ (data.cookies), headers); + data.status = status; if (status >= 400) { - return { - status, - error: new Error('Failed to load data') - }; + data.error = new Error('Failed to load data'); + return data; } if (status >= 300) { - return { - status, - redirect: /** @type {string} */ ( - headers instanceof Headers ? headers.get('location') : headers.location - ) - }; + data.redirect = /** @type {string} */ ( + headers instanceof Headers ? headers.get('location') : headers.location + ); + return data; } data.body = { ...body, ...data.body }; diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/index.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/index.svelte index 7943e4b81a59..3cb53095aea4 100644 --- a/packages/kit/test/apps/basics/src/routes/shadowed/index.svelte +++ b/packages/kit/test/apps/basics/src/routes/shadowed/index.svelte @@ -1,11 +1,16 @@ simple redirect-get +redirect-get-with-cookie error-get
+
+ +
+
diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie.js b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie.js new file mode 100644 index 000000000000..c2e4a2053ac2 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie.js @@ -0,0 +1,9 @@ +export function get() { + return { + status: 302, + headers: { + location: '/shadowed/redirected', + 'set-cookie': 'shadow-redirect=happy' + } + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie.svelte new file mode 100644 index 000000000000..3c3d6df7a541 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-get-with-cookie.svelte @@ -0,0 +1 @@ +

This should not be visible

diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie.js b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie.js new file mode 100644 index 000000000000..de4595fe2015 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie.js @@ -0,0 +1,9 @@ +export function post() { + return { + status: 302, + headers: { + location: '/shadowed/redirected', + 'set-cookie': 'shadow-redirect=happy' + } + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie.svelte new file mode 100644 index 000000000000..3c3d6df7a541 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/shadowed/redirect-post-with-cookie.svelte @@ -0,0 +1 @@ +

This should not be visible

diff --git a/packages/kit/test/apps/basics/test/test.js b/packages/kit/test/apps/basics/test/test.js index d3df15630a69..2e5cdb63b1fc 100644 --- a/packages/kit/test/apps/basics/test/test.js +++ b/packages/kit/test/apps/basics/test/test.js @@ -359,12 +359,34 @@ test.describe.parallel('Shadowed pages', () => { expect(await page.textContent('h1')).toBe('Redirection was successful'); }); + test('Handles GET redirects with cookies', async ({ page, context, clicknav }) => { + await page.goto('/shadowed'); + await clicknav('[href="/shadowed/redirect-get-with-cookie"]'); + expect(await page.textContent('h1')).toBe('Redirection was successful'); + + const cookies = await context.cookies(); + expect(cookies).toEqual( + expect.arrayContaining([expect.objectContaining({ name: 'shadow-redirect', value: 'happy' })]) + ); + }); + test('Handles POST redirects', async ({ page }) => { await page.goto('/shadowed'); await Promise.all([page.waitForNavigation(), page.click('#redirect-post')]); expect(await page.textContent('h1')).toBe('Redirection was successful'); }); + test('Handles POST redirects with cookies', async ({ page, context }) => { + await page.goto('/shadowed'); + await Promise.all([page.waitForNavigation(), page.click('#redirect-post-with-cookie')]); + expect(await page.textContent('h1')).toBe('Redirection was successful'); + + const cookies = await context.cookies(); + expect(cookies).toEqual( + expect.arrayContaining([expect.objectContaining({ name: 'shadow-redirect', value: 'happy' })]) + ); + }); + test('Renders error page for 4xx and 5xx responses from GET', async ({ page, clicknav }) => { await page.goto('/shadowed'); await clicknav('[href="/shadowed/error-get"]'); diff --git a/sites/kit.svelte.dev/src/lib/docs/Contents.svelte b/sites/kit.svelte.dev/src/lib/docs/Contents.svelte index de15d840ca27..2f4045c7833a 100644 --- a/sites/kit.svelte.dev/src/lib/docs/Contents.svelte +++ b/sites/kit.svelte.dev/src/lib/docs/Contents.svelte @@ -20,9 +20,6 @@ // wait for fonts to load... const timeouts = [setTimeout(onresize, 1000), setTimeout(onscroll, 5000)]; - update(); - highlight(); - return () => { window.removeEventListener('scroll', onscroll, true); window.removeEventListener('resize', onresize, true); diff --git a/sites/kit.svelte.dev/src/lib/search/SearchBox.svelte b/sites/kit.svelte.dev/src/lib/search/SearchBox.svelte index 3a114fcd95b1..5161adb6330c 100644 --- a/sites/kit.svelte.dev/src/lib/search/SearchBox.svelte +++ b/sites/kit.svelte.dev/src/lib/search/SearchBox.svelte @@ -106,7 +106,7 @@ { - if (e.code === 'KeyK' && (navigator.platform === 'MacIntel' ? e.metaKey : e.ctrlKey)) { + if (e.key === 'k' && (navigator.platform === 'MacIntel' ? e.metaKey : e.ctrlKey)) { e.preventDefault(); $query = ''; $searching = !$searching;