Skip to content

Commit 0d0448b

Browse files
authored
Fix client reference access causing metadata missing (#70732) (#70788)
1 parent 381d1f9 commit 0d0448b

File tree

7 files changed

+72
-9
lines changed

7 files changed

+72
-9
lines changed

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

-9
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ import {
2828
import { resolveOpenGraph, resolveTwitter } from './resolvers/resolve-opengraph'
2929
import { resolveTitle } from './resolvers/resolve-title'
3030
import { resolveAsArrayOrUndefined } from './generate/utils'
31-
import { isClientReference } from '../client-reference'
3231
import {
3332
getComponentTypeModule,
3433
getLayoutOrPageModule,
@@ -322,9 +321,6 @@ async function getDefinedViewport(
322321
props: any,
323322
tracingProps: { route: string }
324323
): Promise<Viewport | ViewportResolver | null> {
325-
if (isClientReference(mod)) {
326-
return null
327-
}
328324
if (typeof mod.generateViewport === 'function') {
329325
const { route } = tracingProps
330326
return (parent: ResolvingViewport) =>
@@ -347,11 +343,6 @@ async function getDefinedMetadata(
347343
props: any,
348344
tracingProps: { route: string }
349345
): Promise<Metadata | MetadataResolver | null> {
350-
// Layer is a client component, we just skip it. It can't have metadata exported.
351-
// Return early to avoid accessing properties error for client references.
352-
if (isClientReference(mod)) {
353-
return null
354-
}
355346
if (typeof mod.generateMetadata === 'function') {
356347
const { route } = tracingProps
357348
return (parent: ResolvingMetadata) =>
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+
}
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+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import PageContent from './page-content'
2+
3+
export default PageContent
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+
}
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
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)