Skip to content

Commit

Permalink
Fix client reference access causing metadata missing (#70732)
Browse files Browse the repository at this point in the history
  • Loading branch information
huozhi authored Oct 4, 2024
1 parent 3b9889e commit 0a450c9
Show file tree
Hide file tree
Showing 7 changed files with 72 additions and 9 deletions.
9 changes: 0 additions & 9 deletions packages/next/src/lib/metadata/resolve-metadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ import {
import { resolveOpenGraph, resolveTwitter } from './resolvers/resolve-opengraph'
import { resolveTitle } from './resolvers/resolve-title'
import { resolveAsArrayOrUndefined } from './generate/utils'
import { isClientReference } from '../client-reference'
import {
getComponentTypeModule,
getLayoutOrPageModule,
Expand Down Expand Up @@ -331,9 +330,6 @@ async function getDefinedViewport(
props: any,
tracingProps: { route: string }
): Promise<Viewport | ViewportResolver | null> {
if (isClientReference(mod)) {
return null
}
if (typeof mod.generateViewport === 'function') {
const { route } = tracingProps
return (parent: ResolvingViewport) =>
Expand All @@ -356,11 +352,6 @@ async function getDefinedMetadata(
props: any,
tracingProps: { route: string }
): Promise<Metadata | MetadataResolver | null> {
// Layer is a client component, we just skip it. It can't have metadata exported.
// Return early to avoid accessing properties error for client references.
if (isClientReference(mod)) {
return null
}
if (typeof mod.generateMetadata === 'function') {
const { route } = tracingProps
return (parent: ResolvingMetadata) =>
Expand Down
12 changes: 12 additions & 0 deletions test/e2e/app-dir/reexport-client-component-metadata/app/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
export default function Layout({ children }: { children: React.ReactNode }) {
return (
<html>
<body>{children}</body>
</html>
)
}

export const metadata = {
title: 'Root Layout',
description: 'Root Description',
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
'use client'

export default function PageContent() {
return <h1>Page 2 Content</h1>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import PageContent from './page-content'

export default PageContent
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
'use client'

export default function PageContent() {
return <h1>Page 1 Content</h1>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import PageContent from './page-content'

export const metadata = {
title: 'Page 1',
description: 'Page 1 Description',
}

export default PageContent
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { nextTestSetup } from 'e2e-utils'

describe('app-dir - reexport-client-component-metadata', () => {
const { next } = nextTestSetup({
files: __dirname,
})

it('should render the page metadata if override', async () => {
const $ = await next.render$('/override')
expect($('title').text()).toBe('Page 1')
expect($('meta[name="description"]').attr('content')).toBe(
'Page 1 Description'
)

const browser = await next.browser('/override')
expect(await browser.elementByCss('title').text()).toBe('Page 1')
expect(
await browser
.elementByCss('meta[name="description"]')
.getAttribute('content')
).toBe('Page 1 Description')
})

it('should render the layout metadata if not override', async () => {
const $ = await next.render$('/no-override')
expect($('title').text()).toBe('Root Layout')
expect($('meta[name="description"]').attr('content')).toBe(
'Root Description'
)

const browser = await next.browser('/no-override')
expect(await browser.elementByCss('title').text()).toBe('Root Layout')
expect(
await browser
.elementByCss('meta[name="description"]')
.getAttribute('content')
).toBe('Root Description')
})
})

0 comments on commit 0a450c9

Please sign in to comment.