From 012f7495fd73d7de9e2a911145ca11d22fd6bc5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Born=C3=B6?= Date: Fri, 11 Nov 2022 14:47:09 +0100 Subject: [PATCH 1/3] Add failing test --- test/e2e/app-dir/async-page-redirect.test.ts | 29 +++++++++++++++++++ .../app-dir/async-page-redirect/app/layout.js | 12 ++++++++ .../app-dir/async-page-redirect/app/page.js | 6 ++++ .../async-page-redirect/app/success/page.js | 3 ++ .../async-page-redirect/next.config.js | 5 ++++ 5 files changed, 55 insertions(+) create mode 100644 test/e2e/app-dir/async-page-redirect.test.ts create mode 100644 test/e2e/app-dir/async-page-redirect/app/layout.js create mode 100644 test/e2e/app-dir/async-page-redirect/app/page.js create mode 100644 test/e2e/app-dir/async-page-redirect/app/success/page.js create mode 100644 test/e2e/app-dir/async-page-redirect/next.config.js diff --git a/test/e2e/app-dir/async-page-redirect.test.ts b/test/e2e/app-dir/async-page-redirect.test.ts new file mode 100644 index 000000000000..69ce45650fde --- /dev/null +++ b/test/e2e/app-dir/async-page-redirect.test.ts @@ -0,0 +1,29 @@ +import { createNext, FileRef } from 'e2e-utils' +import { NextInstance } from 'test/lib/next-modes/base' +import webdriver from 'next-webdriver' +import path from 'path' + +describe('app-dir alias handling', () => { + if ((global as any).isNextDeploy) { + it('should skip next deploy for now', () => {}) + return + } + + let next: NextInstance + + beforeAll(async () => { + next = await createNext({ + files: new FileRef(path.join(__dirname, 'async-page-redirect')), + dependencies: { + react: 'latest', + 'react-dom': 'latest', + }, + }) + }) + afterAll(() => next.destroy()) + + it('should handle redirect in an async page', async () => { + const browser = await webdriver(next.url, '/') + expect(await browser.waitForElementByCss('#success').text()).toBe('Success') + }) +}) diff --git a/test/e2e/app-dir/async-page-redirect/app/layout.js b/test/e2e/app-dir/async-page-redirect/app/layout.js new file mode 100644 index 000000000000..4bd4188663bd --- /dev/null +++ b/test/e2e/app-dir/async-page-redirect/app/layout.js @@ -0,0 +1,12 @@ +export const revalidate = 0 + +export default async function RootLayout({ children }) { + await new Promise((resolve) => setTimeout(resolve, 0)) + + return ( + + + {children} + + ) +} diff --git a/test/e2e/app-dir/async-page-redirect/app/page.js b/test/e2e/app-dir/async-page-redirect/app/page.js new file mode 100644 index 000000000000..653523d875aa --- /dev/null +++ b/test/e2e/app-dir/async-page-redirect/app/page.js @@ -0,0 +1,6 @@ +import { redirect } from 'next/navigation' + +export default async function Home() { + redirect('success') + return

Home

+} diff --git a/test/e2e/app-dir/async-page-redirect/app/success/page.js b/test/e2e/app-dir/async-page-redirect/app/success/page.js new file mode 100644 index 000000000000..3e3cf2bf3b8a --- /dev/null +++ b/test/e2e/app-dir/async-page-redirect/app/success/page.js @@ -0,0 +1,3 @@ +export default function Success() { + return

Success

+} diff --git a/test/e2e/app-dir/async-page-redirect/next.config.js b/test/e2e/app-dir/async-page-redirect/next.config.js new file mode 100644 index 000000000000..cfa3ac3d7aa9 --- /dev/null +++ b/test/e2e/app-dir/async-page-redirect/next.config.js @@ -0,0 +1,5 @@ +module.exports = { + experimental: { + appDir: true, + }, +} From d50eec65a3ea1d4a8e02ec3b9c329935a36345fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Born=C3=B6?= Date: Mon, 14 Nov 2022 08:20:45 +0100 Subject: [PATCH 2/3] Make sure rejection is catched --- packages/next/server/app-render.tsx | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/packages/next/server/app-render.tsx b/packages/next/server/app-render.tsx index b42541e85ec7..b91eb6d13f24 100644 --- a/packages/next/server/app-render.tsx +++ b/packages/next/server/app-render.tsx @@ -59,6 +59,24 @@ function preloadComponent(Component: any, props: any) { } try { let result = Component(props) + if (result && result.then) { + result = result + .then((res: any) => { + return { success: res } + }) + .catch((err: Error) => { + return { error: err } + }) + return async () => { + const res = await result + if (res.error) { + throw res.error + } + if (res.success) { + return res.success + } + } + } return function () { // We know what this component will render already. return result From 9a31180d4c6dacced478ddc01a6915899842097a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Born=C3=B6?= Date: Tue, 15 Nov 2022 13:03:28 +0100 Subject: [PATCH 3/3] Update test naming --- ...-page-redirect.test.ts => async-component-preload.test.ts} | 4 ++-- .../app/layout.js | 0 .../app/page.js | 0 .../app/success/page.js | 0 .../next.config.js | 0 5 files changed, 2 insertions(+), 2 deletions(-) rename test/e2e/app-dir/{async-page-redirect.test.ts => async-component-preload.test.ts} (85%) rename test/e2e/app-dir/{async-page-redirect => async-component-preload}/app/layout.js (100%) rename test/e2e/app-dir/{async-page-redirect => async-component-preload}/app/page.js (100%) rename test/e2e/app-dir/{async-page-redirect => async-component-preload}/app/success/page.js (100%) rename test/e2e/app-dir/{async-page-redirect => async-component-preload}/next.config.js (100%) diff --git a/test/e2e/app-dir/async-page-redirect.test.ts b/test/e2e/app-dir/async-component-preload.test.ts similarity index 85% rename from test/e2e/app-dir/async-page-redirect.test.ts rename to test/e2e/app-dir/async-component-preload.test.ts index 69ce45650fde..813892ac949e 100644 --- a/test/e2e/app-dir/async-page-redirect.test.ts +++ b/test/e2e/app-dir/async-component-preload.test.ts @@ -3,7 +3,7 @@ import { NextInstance } from 'test/lib/next-modes/base' import webdriver from 'next-webdriver' import path from 'path' -describe('app-dir alias handling', () => { +describe('async-component-preload', () => { if ((global as any).isNextDeploy) { it('should skip next deploy for now', () => {}) return @@ -13,7 +13,7 @@ describe('app-dir alias handling', () => { beforeAll(async () => { next = await createNext({ - files: new FileRef(path.join(__dirname, 'async-page-redirect')), + files: new FileRef(path.join(__dirname, 'async-component-preload')), dependencies: { react: 'latest', 'react-dom': 'latest', diff --git a/test/e2e/app-dir/async-page-redirect/app/layout.js b/test/e2e/app-dir/async-component-preload/app/layout.js similarity index 100% rename from test/e2e/app-dir/async-page-redirect/app/layout.js rename to test/e2e/app-dir/async-component-preload/app/layout.js diff --git a/test/e2e/app-dir/async-page-redirect/app/page.js b/test/e2e/app-dir/async-component-preload/app/page.js similarity index 100% rename from test/e2e/app-dir/async-page-redirect/app/page.js rename to test/e2e/app-dir/async-component-preload/app/page.js diff --git a/test/e2e/app-dir/async-page-redirect/app/success/page.js b/test/e2e/app-dir/async-component-preload/app/success/page.js similarity index 100% rename from test/e2e/app-dir/async-page-redirect/app/success/page.js rename to test/e2e/app-dir/async-component-preload/app/success/page.js diff --git a/test/e2e/app-dir/async-page-redirect/next.config.js b/test/e2e/app-dir/async-component-preload/next.config.js similarity index 100% rename from test/e2e/app-dir/async-page-redirect/next.config.js rename to test/e2e/app-dir/async-component-preload/next.config.js