From d04eef5aea7ca971cfc7d96fcff25f9cf442b6ff Mon Sep 17 00:00:00 2001 From: dangreen Date: Wed, 15 Jul 2026 14:36:15 +0400 Subject: [PATCH] fix(router): preserve `statusCode` of loadable `notFound` pages `getViewRefGetter` returned the loadable ref loader directly and dropped the extra page module fields, so `notFound(loadable(...))` rendered with status 200 instead of 404. --- packages/router/src/router.spec.ts | 22 ++++++++++++++++++++++ packages/router/src/router.ts | 7 ++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/packages/router/src/router.spec.ts b/packages/router/src/router.spec.ts index 3d2ae1c9..9b8e28f0 100644 --- a/packages/router/src/router.spec.ts +++ b/packages/router/src/router.spec.ts @@ -107,6 +107,28 @@ describe('router', () => { expect($page()?.default).toBe('Not Found Page') }) + it('should keep status code for loadable not found page', async () => { + const [$location, navigation] = virtualNavigation('/', { + home: '/home' + }) + const notFoundPagePromise = Promise.resolve({ + default: 'Not Found Page' + }) + const $page = router($location, [ + page('home', 'Home Page'), + notFound(loadable(() => notFoundPagePromise)) + ]) + + navigation.push('/unknown') + + expect($page()?.statusCode).toBe(404) + + await notFoundPagePromise + + expect($page()?.default).toBe('Not Found Page') + expect($page()?.statusCode).toBe(404) + }) + it('should expose page stores when provided', () => { const [$location, navigation] = virtualNavigation('/', { home: '/home', diff --git a/packages/router/src/router.ts b/packages/router/src/router.ts index 23ef48ad..3b5f4b44 100644 --- a/packages/router/src/router.ts +++ b/packages/router/src/router.ts @@ -82,7 +82,12 @@ function getViewRefGetter( let getter: PageRefGetter if (isLoadable(page)) { - getter = page.load + getter = extra + ? tasks => ({ + ...extra, + ...page.load(tasks) + }) + : page.load } else { const ref = isModule(page) ? {