diff --git a/.changeset/dry-snails-own.md b/.changeset/dry-snails-own.md new file mode 100644 index 000000000000..747dbe0f3007 --- /dev/null +++ b/.changeset/dry-snails-own.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +Set correct `$page.status` when using `enhance` and result is of type `'error'` diff --git a/packages/kit/src/runtime/app/forms.js b/packages/kit/src/runtime/app/forms.js index 734f91b993da..f2b73fba0b8d 100644 --- a/packages/kit/src/runtime/app/forms.js +++ b/packages/kit/src/runtime/app/forms.js @@ -107,6 +107,7 @@ export function enhance(form, submit = () => {}) { }); result = deserialize(await response.text()); + if (result.type === 'error') result.status = response.status; } catch (error) { if (/** @type {any} */ (error)?.name === 'AbortError') return; result = { type: 'error', error }; diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 0bf95223e29b..53e2d84bcf9c 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -1387,7 +1387,7 @@ export function create_client({ target, base }) { url, params: current.params, branch: branch.slice(0, error_load.idx).concat(error_load.node), - status: 500, // TODO might not be 500? + status: result.status ?? 500, error: result.error, route }); diff --git a/packages/kit/test/apps/basics/src/routes/actions/enhance/+page.server.js b/packages/kit/test/apps/basics/src/routes/actions/enhance/+page.server.js index b77d167aefca..da8b3975d012 100644 --- a/packages/kit/test/apps/basics/src/routes/actions/enhance/+page.server.js +++ b/packages/kit/test/apps/basics/src/routes/actions/enhance/+page.server.js @@ -1,3 +1,5 @@ +import { error } from '@sveltejs/kit'; + /** @type {import('./$types').PageServerLoad} */ export function load() { return { @@ -27,5 +29,8 @@ export const actions = { return { result: 'submitter: ' + fields.get('submitter') }; + }, + error: () => { + throw error(400, 'error'); } }; diff --git a/packages/kit/test/apps/basics/src/routes/actions/enhance/+page.svelte b/packages/kit/test/apps/basics/src/routes/actions/enhance/+page.svelte index 5ee9f544e8ec..e3b46da4bc1c 100644 --- a/packages/kit/test/apps/basics/src/routes/actions/enhance/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/actions/enhance/+page.svelte @@ -20,6 +20,7 @@ + {count} diff --git a/packages/kit/test/apps/basics/test/test.js b/packages/kit/test/apps/basics/test/test.js index 4e9e5e779a28..0193fbbada92 100644 --- a/packages/kit/test/apps/basics/test/test.js +++ b/packages/kit/test/apps/basics/test/test.js @@ -2019,6 +2019,17 @@ test.describe('Actions', () => { expect(page.url()).toContain('/actions/enhance'); }); + + test('$page.status reflects error status', async ({ page, app }) => { + await page.goto('/actions/enhance'); + + await Promise.all([ + page.waitForRequest((request) => request.url().includes('/actions/enhance')), + page.click('button.form1-error') + ]); + + await expect(page.locator('h1')).toHaveText('400'); + }); }); // Run in serial to not pollute the log with (correct) cookie warnings diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 5fc2715313f0..d41d2050298d 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -1074,7 +1074,7 @@ export type ActionResult< | { type: 'success'; status: number; data?: Success } | { type: 'failure'; status: number; data?: Invalid } | { type: 'redirect'; status: number; location: string } - | { type: 'error'; error: any }; + | { type: 'error'; status?: number; error: any }; /** * Creates an `HttpError` object with an HTTP status code and an optional message.