Skip to content

Commit

Permalink
Revert "Initial support for metadata (#44729)" (#45111)
Browse files Browse the repository at this point in the history
ijjk authored Jan 20, 2023
1 parent e8ae4e2 commit e0865b1
Showing 37 changed files with 45 additions and 2,318 deletions.
83 changes: 15 additions & 68 deletions packages/next/src/build/webpack/loaders/next-app-loader.ts
Original file line number Diff line number Diff line change
@@ -7,7 +7,6 @@ import { sep } from 'path'
import { verifyRootLayout } from '../../../lib/verifyRootLayout'
import * as Log from '../../../build/output/log'
import { APP_DIR_ALIAS } from '../../../lib/constants'
import { resolveFileBasedMetadataForLoader } from '../../../lib/metadata/resolve-metadata'

const FILE_TYPES = {
layout: 'layout',
@@ -37,26 +36,21 @@ async function createTreeCodeFromPath({
resolveParallelSegments,
}: {
pagePath: string
resolve: (
pathname: string,
resolveDir?: boolean
) => Promise<string | undefined>
resolve: (pathname: string) => Promise<string | undefined>
resolveParallelSegments: (
pathname: string
) => [key: string, segment: string][]
}) {
const splittedPath = pagePath.split(/[\\/]/)
const appDirPrefix = splittedPath[0]
const pages: string[] = []

let rootLayout: string | undefined
let globalError: string | undefined

async function createSubtreePropsFromSegmentPath(
segments: string[]
): Promise<{
treeCode: string
treeMetadataCode: string
}> {
const segmentPath = segments.join('/')

@@ -71,26 +65,12 @@ async function createTreeCodeFromPath({
parallelSegments.push(...resolveParallelSegments(segmentPath))
}

let metadataCode = ''

for (const [parallelKey, parallelSegment] of parallelSegments) {
if (parallelSegment === PAGE_SEGMENT) {
const matchedPagePath = `${appDirPrefix}${segmentPath}/page`
const resolvedPagePath = await resolve(matchedPagePath)
if (resolvedPagePath) pages.push(resolvedPagePath)

metadataCode += `{
type: 'page',
layer: ${
// There's an extra virtual segment.
segments.length - 1
},
mod: () => import(/* webpackMode: "eager" */ ${JSON.stringify(
resolvedPagePath
)}),
path: ${JSON.stringify(resolvedPagePath)},
},`

// Use '' for segment as it's the page. There can't be a segment called '' so this is the safest way to add it.
props[parallelKey] = `['', {}, {
page: [() => import(/* webpackMode: "eager" */ ${JSON.stringify(
@@ -100,8 +80,9 @@ async function createTreeCodeFromPath({
}

const parallelSegmentPath = segmentPath + '/' + parallelSegment
const { treeCode: subtreeCode, treeMetadataCode: subTreeMetadataCode } =
await createSubtreePropsFromSegmentPath([...segments, parallelSegment])
const { treeCode: subtreeCode } = await createSubtreePropsFromSegmentPath(
[...segments, parallelSegment]
)

// `page` is not included here as it's added above.
const filePaths = await Promise.all(
@@ -120,27 +101,6 @@ async function createTreeCodeFromPath({
rootLayout = layoutPath
}

// Collect metadata for the layout
if (layoutPath) {
metadataCode += `{
type: 'layout',
layer: ${segments.length},
mod: () => import(/* webpackMode: "eager" */ ${JSON.stringify(
layoutPath
)}),
path: ${JSON.stringify(layoutPath)},
},`
}
metadataCode += await resolveFileBasedMetadataForLoader(
segments.length,
(await resolve(`${appDirPrefix}${parallelSegmentPath}/`, true))!
)
metadataCode += subTreeMetadataCode

if (!rootLayout) {
rootLayout = layoutPath
}

if (!globalError) {
globalError = await resolve(
`${appDirPrefix}${parallelSegmentPath}/${GLOBAL_ERROR_FILE_TYPE}`
@@ -173,16 +133,13 @@ async function createTreeCodeFromPath({
.map(([key, value]) => `${key}: ${value}`)
.join(',\n')}
}`,
treeMetadataCode: metadataCode,
}
}

const { treeCode, treeMetadataCode } =
await createSubtreePropsFromSegmentPath([])
const { treeCode } = await createSubtreePropsFromSegmentPath([])
return {
treeCode: `const tree = ${treeCode}.children;`,
treeMetadataCode: `const metadata = [${treeMetadataCode}];`,
pages: `const pages = ${JSON.stringify(pages)};`,
pages,
rootLayout,
globalError,
}
@@ -240,7 +197,7 @@ const nextAppLoader: webpack.LoaderDefinitionFunction<{
const rest = path.slice(pathname.length + 1).split('/')

let matchedSegment = rest[0]
// It is the actual page, mark it specially.
// It is the actual page, mark it sepcially.
if (rest.length === 1 && matchedSegment === 'page') {
matchedSegment = PAGE_SEGMENT
}
@@ -255,11 +212,7 @@ const nextAppLoader: webpack.LoaderDefinitionFunction<{
return Object.entries(matched)
}

const resolver = async (pathname: string, resolveDir?: boolean) => {
if (resolveDir) {
return createAbsolutePath(appDir, pathname)
}

const resolver = async (pathname: string) => {
try {
const resolved = await resolve(this.rootContext, pathname)
this.addDependency(resolved)
@@ -277,17 +230,12 @@ const nextAppLoader: webpack.LoaderDefinitionFunction<{
}
}

const {
treeCode,
treeMetadataCode,
pages: pageListCode,
rootLayout,
globalError,
} = await createTreeCodeFromPath({
pagePath,
resolve: resolver,
resolveParallelSegments,
})
const { treeCode, pages, rootLayout, globalError } =
await createTreeCodeFromPath({
pagePath,
resolve: resolver,
resolveParallelSegments,
})

if (!rootLayout) {
const errorMessage = `${chalk.bold(
@@ -315,8 +263,7 @@ const nextAppLoader: webpack.LoaderDefinitionFunction<{

const result = `
export ${treeCode}
export ${treeMetadataCode}
export ${pageListCode}
export const pages = ${JSON.stringify(pages)}
export { default as AppRouter } from 'next/dist/client/components/app-router'
export { default as LayoutRouter } from 'next/dist/client/components/layout-router'
Original file line number Diff line number Diff line change
@@ -64,7 +64,6 @@ interface IEntry {
? "runtime?: 'nodejs' | 'experimental-edge' | 'edge'"
: ''
}
metadata?: any
}
// =============
10 changes: 10 additions & 0 deletions packages/next/src/client/components/head.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import React from 'react'

export function DefaultHead() {
return (
<>
<meta charSet="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
</>
)
}
41 changes: 0 additions & 41 deletions packages/next/src/lib/metadata/default-metadata.ts

This file was deleted.

51 changes: 0 additions & 51 deletions packages/next/src/lib/metadata/generate/alternate.tsx

This file was deleted.

56 changes: 0 additions & 56 deletions packages/next/src/lib/metadata/generate/basic.tsx

This file was deleted.

223 changes: 0 additions & 223 deletions packages/next/src/lib/metadata/generate/opengraph.tsx

This file was deleted.

82 changes: 0 additions & 82 deletions packages/next/src/lib/metadata/generate/utils.tsx

This file was deleted.

224 changes: 0 additions & 224 deletions packages/next/src/lib/metadata/resolve-metadata.ts

This file was deleted.

92 changes: 0 additions & 92 deletions packages/next/src/lib/metadata/resolve-opengraph.ts

This file was deleted.

41 changes: 0 additions & 41 deletions packages/next/src/lib/metadata/resolve-title.ts

This file was deleted.

261 changes: 0 additions & 261 deletions packages/next/src/lib/metadata/types/alternative-urls-types.ts

This file was deleted.

84 changes: 0 additions & 84 deletions packages/next/src/lib/metadata/types/extra-types.ts

This file was deleted.

3 changes: 0 additions & 3 deletions packages/next/src/lib/metadata/types/manifest-types.ts

This file was deleted.

204 changes: 0 additions & 204 deletions packages/next/src/lib/metadata/types/metadata-interface.ts

This file was deleted.

93 changes: 0 additions & 93 deletions packages/next/src/lib/metadata/types/metadata-types.ts

This file was deleted.

267 changes: 0 additions & 267 deletions packages/next/src/lib/metadata/types/opengraph-types.ts

This file was deleted.

66 changes: 0 additions & 66 deletions packages/next/src/lib/metadata/types/twitter-types.ts

This file was deleted.

19 changes: 0 additions & 19 deletions packages/next/src/lib/metadata/ui.tsx

This file was deleted.

54 changes: 18 additions & 36 deletions packages/next/src/server/app-render.tsx
Original file line number Diff line number Diff line change
@@ -45,8 +45,8 @@ import {
RSC,
} from '../client/components/app-router-headers'
import type { StaticGenerationAsyncStorage } from '../client/components/static-generation-async-storage'
import { DefaultHead } from '../client/components/head'
import { formatServerError } from '../lib/format-server-error'
import { Metadata } from '../lib/metadata/ui'
import type { RequestAsyncStorage } from '../client/components/request-async-storage'
import { runWithRequestAsyncStorage } from './run-with-request-async-storage'
import { runWithStaticGenerationAsyncStorage } from './run-with-static-generation-async-storage'
@@ -949,12 +949,6 @@ export async function renderToHTMLOrFlight(
*/
const loaderTree: LoaderTree = ComponentMod.tree

/**
* The metadata items array created in next-app-loader with all relevant information
* that we need to resolve the final metadata.
*/
const metadataItems = ComponentMod.metadata

stripInternalQueries(query)

const LayoutRouter =
@@ -1038,7 +1032,8 @@ export async function renderToHTMLOrFlight(

async function resolveHead(
[segment, parallelRoutes, { head }]: LoaderTree,
parentParams: { [key: string]: any }
parentParams: { [key: string]: any },
isRootHead: boolean
): Promise<React.ReactNode> {
// Handle dynamic segment params.
const segmentParam = getDynamicParamFromSegment(segment)
@@ -1056,7 +1051,7 @@ export async function renderToHTMLOrFlight(
parentParams
for (const key in parallelRoutes) {
const childTree = parallelRoutes[key]
const returnedHead = await resolveHead(childTree, currentParams)
const returnedHead = await resolveHead(childTree, currentParams, false)
if (returnedHead) {
return returnedHead
}
@@ -1065,6 +1060,8 @@ export async function renderToHTMLOrFlight(
if (head) {
const Head = await interopDefault(await head[0]())
return <Head params={currentParams} />
} else if (isRootHead) {
return <DefaultHead />
}

return null
@@ -1667,7 +1664,7 @@ export async function renderToHTMLOrFlight(
return [actualSegment]
}

const rscPayloadHead = await resolveHead(loaderTree, {})
const rscPayloadHead = await resolveHead(loaderTree, {}, true)
// Flight data that is going to be passed to the browser.
// Currently a single item array but in the future multiple patches might be combined in a single request.
const flightData: FlightData = [
@@ -1678,13 +1675,7 @@ export async function renderToHTMLOrFlight(
parentParams: {},
flightRouterState: providedFlightRouterState,
isFirst: true,
rscPayloadHead: (
<>
{/* @ts-expect-error allow to use async server component */}
<Metadata metadata={metadataItems} />
{rscPayloadHead}
</>
),
rscPayloadHead,
injectedCSS: new Set(),
rootLayoutIncluded: false,
})
@@ -1751,7 +1742,7 @@ export async function renderToHTMLOrFlight(
}
: {}

const initialHead = await resolveHead(loaderTree, {})
const initialHead = await resolveHead(loaderTree, {}, true)

/**
* A new React Component that renders the provided React Component
@@ -1768,27 +1759,18 @@ export async function renderToHTMLOrFlight(
injectedCSS: new Set(),
rootLayoutIncluded: false,
})

const initialTree = createFlightRouterStateFromLoaderTree(loaderTree)

return (
<>
<AppRouter
assetPrefix={assetPrefix}
initialCanonicalUrl={initialCanonicalUrl}
initialTree={initialTree}
initialHead={
<>
{/* @ts-expect-error allow to use async server component */}
<Metadata metadata={metadataItems} />
{initialHead}
</>
}
globalErrorComponent={GlobalError}
>
<ComponentTree />
</AppRouter>
</>
<AppRouter
assetPrefix={assetPrefix}
initialCanonicalUrl={initialCanonicalUrl}
initialTree={initialTree}
initialHead={initialHead}
globalErrorComponent={GlobalError}
>
<ComponentTree />
</AppRouter>
)
},
ComponentMod,
2 changes: 1 addition & 1 deletion test/e2e/app-dir/app/index.test.ts
Original file line number Diff line number Diff line change
@@ -85,7 +85,7 @@ createNextDescribe(

it('should pass props from getServerSideProps in root layout', async () => {
const $ = await next.render$('/dashboard')
expect($('title').first().text()).toBe('hello world')
expect($('title').text()).toBe('hello world')
})

it('should serve from pages', async () => {
19 changes: 0 additions & 19 deletions test/e2e/app-dir/metadata/app/alternate/page.js

This file was deleted.

25 changes: 0 additions & 25 deletions test/e2e/app-dir/metadata/app/basic/page.js

This file was deleted.

13 changes: 0 additions & 13 deletions test/e2e/app-dir/metadata/app/layout.js

This file was deleted.

13 changes: 0 additions & 13 deletions test/e2e/app-dir/metadata/app/opengraph/article/page.js

This file was deleted.

27 changes: 0 additions & 27 deletions test/e2e/app-dir/metadata/app/opengraph/page.js

This file was deleted.

23 changes: 0 additions & 23 deletions test/e2e/app-dir/metadata/app/page.js

This file was deleted.

This file was deleted.

9 changes: 0 additions & 9 deletions test/e2e/app-dir/metadata/app/title-template/extra/layout.js

This file was deleted.

7 changes: 0 additions & 7 deletions test/e2e/app-dir/metadata/app/title-template/extra/page.js

This file was deleted.

9 changes: 0 additions & 9 deletions test/e2e/app-dir/metadata/app/title-template/layout.js

This file was deleted.

7 changes: 0 additions & 7 deletions test/e2e/app-dir/metadata/app/title-template/page.js

This file was deleted.

15 changes: 0 additions & 15 deletions test/e2e/app-dir/metadata/app/title/page.js

This file was deleted.

11 changes: 0 additions & 11 deletions test/e2e/app-dir/metadata/app/viewport/object/page.js

This file was deleted.

214 changes: 0 additions & 214 deletions test/e2e/app-dir/metadata/metadata.test.ts

This file was deleted.

3 changes: 0 additions & 3 deletions test/e2e/app-dir/metadata/next.config.js

This file was deleted.

4 changes: 1 addition & 3 deletions test/e2e/app-dir/rsc-basic/rsc-basic.test.ts
Original file line number Diff line number Diff line change
@@ -103,11 +103,9 @@ describe('app dir - rsc basics', () => {
// should have only 1 DOCTYPE
expect(homeHTML).toMatch(/^<!DOCTYPE html><html/)
// should have default head when there's no head.js provided
expect(homeHTML).toContain('<meta charSet="utf-8"/>')
expect(homeHTML).toContain(
'<meta name="viewport" content="width=device-width, initial-scale=1"/>'
'<meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/>'
)

expect(homeHTML).toContain('component:index.server')
expect(homeHTML).toContain('header:test-util')

0 comments on commit e0865b1

Please sign in to comment.