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