From 1717fd2dbc1665fd3f32f49f42005fd9e1ae6ce7 Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Wed, 1 Mar 2023 18:25:25 +0100 Subject: [PATCH] Fix IntelliSense for generateMetadata (#46624) Related to #46431, this makes sure the IntelliSense for both sync and async `generateMetadata` is correct. ## Bug - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Errors have a helpful link attached, see [`contributing.md`](https://github.com/vercel/next.js/blob/canary/contributing.md) ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [ ] [e2e](https://github.com/vercel/next.js/blob/canary/contributing/core/testing.md#writing-tests-for-nextjs) tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. - [ ] Errors have a helpful link attached, see [`contributing.md`](https://github.com/vercel/next.js/blob/canary/contributing.md) ## Documentation / Examples - [ ] Make sure the linting passes by running `pnpm build && pnpm lint` - [ ] The "examples guidelines" are followed from [our contributing doc](https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md) --- packages/next/src/server/typescript/rules/metadata.ts | 5 ++++- .../metadata/app/type-checking/generate-async/page.tsx | 9 +++++++++ .../metadata/app/type-checking/generate-sync/page.tsx | 9 +++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 test/e2e/app-dir/metadata/app/type-checking/generate-async/page.tsx create mode 100644 test/e2e/app-dir/metadata/app/type-checking/generate-sync/page.tsx diff --git a/packages/next/src/server/typescript/rules/metadata.ts b/packages/next/src/server/typescript/rules/metadata.ts index 5824fac72d960..5fda52bfb5997 100644 --- a/packages/next/src/server/typescript/rules/metadata.ts +++ b/packages/next/src/server/typescript/rules/metadata.ts @@ -158,7 +158,10 @@ function updateVirtualFileWithType( if (ts.isFunctionDeclaration(node)) { if (isGenerateMetadata) { nodeEnd = node.body!.getFullStart() - annotation = TYPE_ANOTATION_ASYNC + const isAsync = node.modifiers?.some( + (m) => m.kind === ts.SyntaxKind.AsyncKeyword + ) + annotation = isAsync ? TYPE_ANOTATION_ASYNC : TYPE_ANOTATION } else { return } diff --git a/test/e2e/app-dir/metadata/app/type-checking/generate-async/page.tsx b/test/e2e/app-dir/metadata/app/type-checking/generate-async/page.tsx new file mode 100644 index 0000000000000..d17bc146fd295 --- /dev/null +++ b/test/e2e/app-dir/metadata/app/type-checking/generate-async/page.tsx @@ -0,0 +1,9 @@ +export default function Page() { + return null +} + +export async function generateMetadata() { + return { + title: 'foo', + } +} diff --git a/test/e2e/app-dir/metadata/app/type-checking/generate-sync/page.tsx b/test/e2e/app-dir/metadata/app/type-checking/generate-sync/page.tsx new file mode 100644 index 0000000000000..99eb4f999cd49 --- /dev/null +++ b/test/e2e/app-dir/metadata/app/type-checking/generate-sync/page.tsx @@ -0,0 +1,9 @@ +export default function Page() { + return null +} + +export function generateMetadata() { + return { + title: 'foo', + } +}