diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 921734b98e2e..1a30d3edd66a 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -648,7 +648,14 @@ export function create_client({ target, session, base, trailing_slash }) { props = await res.json(); } else { status = res.status; - error = new Error('Failed to load data'); + let error_message = 'Failed to load data'; + try { + const { error } = await res.json(); + if ('string' === typeof error) error_message = error; + } catch (e) { + // ignore + } + error = new Error(error_message); } } diff --git a/packages/kit/src/runtime/server/page/load_node.js b/packages/kit/src/runtime/server/page/load_node.js index f2d29b3b97ad..04f91d4cfa95 100644 --- a/packages/kit/src/runtime/server/page/load_node.js +++ b/packages/kit/src/runtime/server/page/load_node.js @@ -431,7 +431,9 @@ async function load_shadow_data(route, event, options, prerender) { data.status = status; if (status >= 400) { - data.error = new Error('Failed to load data'); + let error_message = 'Failed to load data'; + if ('string' === typeof body.error) error_message = body.error; + data.error = new Error(error_message); return data; } diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/error-message/__error.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/error-message/__error.svelte new file mode 100644 index 000000000000..144402c61272 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/shadowed/error-message/__error.svelte @@ -0,0 +1,14 @@ + + + + +
{error.message}
diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/error-message/err.js b/packages/kit/test/apps/basics/src/routes/shadowed/error-message/err.js new file mode 100644 index 000000000000..6e7b9f1f1881 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/shadowed/error-message/err.js @@ -0,0 +1,8 @@ +export function get() { + return { + body: { + error: 'A custom error message' + }, + status: 451 + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/error-message/err.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/error-message/err.svelte new file mode 100644 index 000000000000..94fdc6f1ba5d --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/shadowed/error-message/err.svelte @@ -0,0 +1 @@ +you can't see me
diff --git a/packages/kit/test/apps/basics/src/routes/shadowed/error-message/index.svelte b/packages/kit/test/apps/basics/src/routes/shadowed/error-message/index.svelte new file mode 100644 index 000000000000..48a9d2a00737 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/shadowed/error-message/index.svelte @@ -0,0 +1 @@ +shadow diff --git a/packages/kit/test/apps/basics/test/test.js b/packages/kit/test/apps/basics/test/test.js index ab9dfc7588c2..e5e0d7c1f78a 100644 --- a/packages/kit/test/apps/basics/test/test.js +++ b/packages/kit/test/apps/basics/test/test.js @@ -522,6 +522,20 @@ test.describe.parallel('Shadowed pages', () => { await clicknav('[href="/shadowed/redirect/a"]'); expect(await page.textContent('h1')).toBe('done'); }); + + test('Display custom error message on client side shadow page', async ({ page, clicknav }) => { + await page.goto('/shadowed/error-message'); + await clicknav('[href="/shadowed/error-message/err"]'); + expect(await page.textContent('h1')).toBe('451'); + expect(await page.textContent('p')).toBe('A custom error message'); + await page.goto('/shadowed/error-message/shadow'); + }); + + test('Display custom error message on server side shadow page', async ({ page }) => { + await page.goto('/shadowed/error-message/err'); + expect(await page.textContent('h1')).toBe('451'); + expect(await page.textContent('p')).toBe('A custom error message'); + }); }); test.describe.parallel('Endpoints', () => {