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 @@ + + + + +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 @@ + + +baz