diff --git a/.changeset/famous-birds-cheer.md b/.changeset/famous-birds-cheer.md new file mode 100644 index 000000000000..8b4141cbb1a1 --- /dev/null +++ b/.changeset/famous-birds-cheer.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +Throw load validation errors so that they are caught by handleError diff --git a/packages/kit/src/runtime/load.js b/packages/kit/src/runtime/load.js index 5e031989c9d8..099e3ccafc98 100644 --- a/packages/kit/src/runtime/load.js +++ b/packages/kit/src/runtime/load.js @@ -46,19 +46,13 @@ export function normalize(loaded) { if (loaded.redirect) { if (!loaded.status || Math.floor(loaded.status / 100) !== 3) { - return { - status: 500, - error: new Error( - '"redirect" property returned from load() must be accompanied by a 3xx status code' - ) - }; + throw new Error( + '"redirect" property returned from load() must be accompanied by a 3xx status code' + ); } if (typeof loaded.redirect !== 'string') { - return { - status: 500, - error: new Error('"redirect" property returned from load() must be a string') - }; + throw new Error('"redirect" property returned from load() must be a string'); } } @@ -67,10 +61,7 @@ export function normalize(loaded) { !Array.isArray(loaded.dependencies) || loaded.dependencies.some((dep) => typeof dep !== 'string') ) { - return { - status: 500, - error: new Error('"dependencies" property returned from load() must be of type string[]') - }; + throw new Error('"dependencies" property returned from load() must be of type string[]'); } } diff --git a/packages/kit/test/apps/basics/package.json b/packages/kit/test/apps/basics/package.json index 066d8c4dcea9..6d7fac230ff5 100644 --- a/packages/kit/test/apps/basics/package.json +++ b/packages/kit/test/apps/basics/package.json @@ -8,8 +8,8 @@ "preview": "node ../../cli.js preview", "check": "tsc && svelte-check", "test": "npm run test:dev && npm run test:build", - "test:dev": "cross-env DEV=true playwright test", - "test:build": "playwright test" + "test:dev": "rimraf test/errors.json && cross-env DEV=true playwright test", + "test:build": "rimraf test/errors.json && playwright test" }, "devDependencies": { "@sveltejs/kit": "workspace:*", diff --git a/packages/kit/test/apps/basics/test/test.js b/packages/kit/test/apps/basics/test/test.js index 2da6fdbd1de2..c642da079cfe 100644 --- a/packages/kit/test/apps/basics/test/test.js +++ b/packages/kit/test/apps/basics/test/test.js @@ -1927,7 +1927,13 @@ test.describe.parallel('Redirects', () => { } }); - test('errors on missing status', async ({ baseURL, page, clicknav }) => { + test('errors on missing status', async ({ + baseURL, + page, + clicknav, + javaScriptEnabled, + read_errors + }) => { await page.goto('/redirect'); await clicknav('[href="/redirect/missing-status/a"]'); @@ -1937,6 +1943,14 @@ test.describe.parallel('Redirects', () => { expect(await page.textContent('#message')).toBe( 'This is your custom error page saying: ""redirect" property returned from load() must be accompanied by a 3xx status code"' ); + + if (!javaScriptEnabled) { + // handleError is not invoked for client-side navigation + const lines = read_errors('/redirect/missing-status/a').split('\n'); + expect(lines[0]).toBe( + 'Error: "redirect" property returned from load() must be accompanied by a 3xx status code' + ); + } }); test('errors on invalid status', async ({ baseURL, page, clicknav }) => {