Skip to content

Commit 187878a

Browse files
huozhikdy1
authored andcommitted
Fix client reference access causing metadata missing (#70732)
1 parent e6503c5 commit 187878a

File tree

7 files changed

+72
-9
lines changed

7 files changed

+72
-9
lines changed

packages/next/src/lib/metadata/resolve-metadata.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import {
3232
import { resolveOpenGraph, resolveTwitter } from './resolvers/resolve-opengraph'
3333
import { resolveTitle } from './resolvers/resolve-title'
3434
import { resolveAsArrayOrUndefined } from './generate/utils'
35-
import { isClientReference } from '../client-reference'
3635
import {
3736
getComponentTypeModule,
3837
getLayoutOrPageModule,
@@ -331,9 +330,6 @@ async function getDefinedViewport(
331330
props: any,
332331
tracingProps: { route: string }
333332
): Promise<Viewport | ViewportResolver | null> {
334-
if (isClientReference(mod)) {
335-
return null
336-
}
337333
if (typeof mod.generateViewport === 'function') {
338334
const { route } = tracingProps
339335
return (parent: ResolvingViewport) =>
@@ -356,11 +352,6 @@ async function getDefinedMetadata(
356352
props: any,
357353
tracingProps: { route: string }
358354
): Promise<Metadata | MetadataResolver | null> {
359-
// Layer is a client component, we just skip it. It can't have metadata exported.
360-
// Return early to avoid accessing properties error for client references.
361-
if (isClientReference(mod)) {
362-
return null
363-
}
364355
if (typeof mod.generateMetadata === 'function') {
365356
const { route } = tracingProps
366357
return (parent: ResolvingMetadata) =>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export default function Layout({ children }: { children: React.ReactNode }) {
2+
return (
3+
<html>
4+
<body>{children}</body>
5+
</html>
6+
)
7+
}
8+
9+
export const metadata = {
10+
title: 'Root Layout',
11+
description: 'Root Description',
12+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
'use client'
2+
3+
export default function PageContent() {
4+
return <h1>Page 2 Content</h1>
5+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import PageContent from './page-content'
2+
3+
export default PageContent
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
'use client'
2+
3+
export default function PageContent() {
4+
return <h1>Page 1 Content</h1>
5+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import PageContent from './page-content'
2+
3+
export const metadata = {
4+
title: 'Page 1',
5+
description: 'Page 1 Description',
6+
}
7+
8+
export default PageContent
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { nextTestSetup } from 'e2e-utils'
2+
3+
describe('app-dir - reexport-client-component-metadata', () => {
4+
const { next } = nextTestSetup({
5+
files: __dirname,
6+
})
7+
8+
it('should render the page metadata if override', async () => {
9+
const $ = await next.render$('/override')
10+
expect($('title').text()).toBe('Page 1')
11+
expect($('meta[name="description"]').attr('content')).toBe(
12+
'Page 1 Description'
13+
)
14+
15+
const browser = await next.browser('/override')
16+
expect(await browser.elementByCss('title').text()).toBe('Page 1')
17+
expect(
18+
await browser
19+
.elementByCss('meta[name="description"]')
20+
.getAttribute('content')
21+
).toBe('Page 1 Description')
22+
})
23+
24+
it('should render the layout metadata if not override', async () => {
25+
const $ = await next.render$('/no-override')
26+
expect($('title').text()).toBe('Root Layout')
27+
expect($('meta[name="description"]').attr('content')).toBe(
28+
'Root Description'
29+
)
30+
31+
const browser = await next.browser('/no-override')
32+
expect(await browser.elementByCss('title').text()).toBe('Root Layout')
33+
expect(
34+
await browser
35+
.elementByCss('meta[name="description"]')
36+
.getAttribute('content')
37+
).toBe('Root Description')
38+
})
39+
})

0 commit comments

Comments
 (0)