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.