diff --git a/.changeset/empty-poets-check.md b/.changeset/empty-poets-check.md new file mode 100644 index 000000000000..5a92c427ae2f --- /dev/null +++ b/.changeset/empty-poets-check.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +[fix] deeply-nested error components render with correct layout diff --git a/packages/kit/src/core/create_manifest_data/index.js b/packages/kit/src/core/create_manifest_data/index.js index acef1c8ea6a7..aa93bf7a457b 100644 --- a/packages/kit/src/core/create_manifest_data/index.js +++ b/packages/kit/src/core/create_manifest_data/index.js @@ -220,23 +220,24 @@ export default function create_manifest_data({ config, output, cwd = process.cwd components.push(item.file); const concatenated = layout_stack.concat(item.file); + const errors = error_stack.slice(); const pattern = get_pattern(segments, true); let i = concatenated.length; while (i--) { - if (!error_stack[i] && !concatenated[i]) { - error_stack.splice(i, 1); + if (!errors[i] && !concatenated[i]) { + errors.splice(i, 1); concatenated.splice(i, 1); } } - i = error_stack.length; + i = errors.length; while (i--) { - if (error_stack[i]) break; + if (errors[i]) break; } - error_stack.splice(i + 1); + errors.splice(i + 1); const path = segments.every((segment) => segment.length === 1 && !segment[0].dynamic) ? `/${segments.map((segment) => segment[0].content).join('/')}` @@ -248,7 +249,7 @@ export default function create_manifest_data({ config, output, cwd = process.cwd params, path, a: /** @type {string[]} */ (concatenated), - b: /** @type {string[]} */ (error_stack) + b: /** @type {string[]} */ (errors) }); } else { const pattern = get_pattern(segments, !item.route_suffix); diff --git a/packages/kit/test/apps/basics/src/routes/nested-layout/_tests.js b/packages/kit/test/apps/basics/src/routes/nested-layout/_tests.js index d6cfb982a3aa..549b97d351a4 100644 --- a/packages/kit/test/apps/basics/src/routes/nested-layout/_tests.js +++ b/packages/kit/test/apps/basics/src/routes/nested-layout/_tests.js @@ -32,4 +32,16 @@ export default function (test) { assert.equal(await page.textContent('h1'), '500'); } ); + + test( + 'renders deeply-nested errors in the right layout', + '/nested-layout/foo/bar/nope', + async ({ page }) => { + assert.equal(await page.textContent('footer'), 'Custom layout'); + assert.ok(await page.evaluate(() => document.querySelector('p#nested'))); + assert.ok(await page.evaluate(() => document.querySelector('p#nested-foo'))); + assert.ok(await page.evaluate(() => document.querySelector('p#nested-bar'))); + assert.equal(await page.textContent('#nested-error-message'), 'error.message: nope'); + } + ); } diff --git a/packages/kit/test/apps/basics/src/routes/nested-layout/foo/__layout.svelte b/packages/kit/test/apps/basics/src/routes/nested-layout/foo/__layout.svelte new file mode 100644 index 000000000000..badf55425927 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/nested-layout/foo/__layout.svelte @@ -0,0 +1,2 @@ + +

Nested layout foo

diff --git a/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/__error.svelte b/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/__error.svelte new file mode 100644 index 000000000000..e74d57cc7c61 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/__error.svelte @@ -0,0 +1,34 @@ + + + + +

Nested error page

+

status: {status}

+

error.message: {error && error.message}

+

answer: {answer}

+ + diff --git a/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/__layout.svelte b/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/__layout.svelte new file mode 100644 index 000000000000..30358a5ba292 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/__layout.svelte @@ -0,0 +1,2 @@ + +

Nested layout bar

diff --git a/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/nope.svelte b/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/nope.svelte new file mode 100644 index 000000000000..8c852515d266 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/nested-layout/foo/bar/nope.svelte @@ -0,0 +1,7 @@ + + +

should not see this

diff --git a/packages/kit/test/apps/basics/src/routes/nested-layout/foo/baz.svelte b/packages/kit/test/apps/basics/src/routes/nested-layout/foo/baz.svelte new file mode 100644 index 000000000000..9e891e88fcd3 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/nested-layout/foo/baz.svelte @@ -0,0 +1 @@ +

baz