Skip to content

Commit 7a47ed5

Browse files
authored
[metadata] Merge the metadata resolve apis into one api (vercel#74191)
1 parent 75a9dfa commit 7a47ed5

File tree

2 files changed

+102
-48
lines changed

2 files changed

+102
-48
lines changed

packages/next/src/lib/metadata/metadata.tsx

Lines changed: 59 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,9 @@ import {
2121
} from './generate/opengraph'
2222
import { IconsMetadata } from './generate/icons'
2323
import {
24-
resolveMetadataItems,
25-
accumulateMetadata,
26-
accumulateViewport,
2724
type MetadataErrorType,
25+
resolveMetadata,
26+
resolveViewport,
2827
} from './resolve-metadata'
2928
import { MetaFilter } from './generate/meta'
3029
import type {
@@ -196,24 +195,14 @@ async function getResolvedMetadataImpl(
196195
errorType?: MetadataErrorType | 'redirect'
197196
): Promise<React.ReactNode> {
198197
const errorConvention = errorType === 'redirect' ? undefined : errorType
199-
200-
const metadataItems = await resolveMetadataItems(
198+
return renderMetadata(
201199
tree,
202200
searchParams,
203-
errorConvention,
204201
getDynamicParamFromSegment,
202+
metadataContext,
205203
createServerParamsForMetadata,
206-
workStore
207-
)
208-
const elements: Array<React.ReactNode> = createMetadataElements(
209-
await accumulateMetadata(metadataItems, metadataContext)
210-
)
211-
return (
212-
<>
213-
{elements.map((el, index) => {
214-
return cloneElement(el as React.ReactElement, { key: index })
215-
})}
216-
</>
204+
workStore,
205+
errorConvention
217206
)
218207
}
219208

@@ -227,24 +216,14 @@ async function getNotFoundMetadataImpl(
227216
workStore: WorkStore
228217
): Promise<React.ReactNode> {
229218
const notFoundErrorConvention = 'not-found'
230-
const notFoundMetadataItems = await resolveMetadataItems(
219+
return renderMetadata(
231220
tree,
232221
searchParams,
233-
notFoundErrorConvention,
234222
getDynamicParamFromSegment,
223+
metadataContext,
235224
createServerParamsForMetadata,
236-
workStore
237-
)
238-
239-
const elements: Array<React.ReactNode> = createMetadataElements(
240-
await accumulateMetadata(notFoundMetadataItems, metadataContext)
241-
)
242-
return (
243-
<>
244-
{elements.map((el, index) => {
245-
return cloneElement(el as React.ReactElement, { key: index })
246-
})}
247-
</>
225+
workStore,
226+
notFoundErrorConvention
248227
)
249228
}
250229

@@ -258,18 +237,55 @@ async function getResolvedViewportImpl(
258237
errorType?: MetadataErrorType | 'redirect'
259238
): Promise<React.ReactNode> {
260239
const errorConvention = errorType === 'redirect' ? undefined : errorType
240+
return renderViewport(
241+
tree,
242+
searchParams,
243+
getDynamicParamFromSegment,
244+
createServerParamsForMetadata,
245+
workStore,
246+
errorConvention
247+
)
248+
}
261249

262-
const metadataItems = await resolveMetadataItems(
250+
const getNotFoundViewport = cache(getNotFoundViewportImpl)
251+
async function getNotFoundViewportImpl(
252+
tree: LoaderTree,
253+
searchParams: Promise<ParsedUrlQuery>,
254+
getDynamicParamFromSegment: GetDynamicParamFromSegment,
255+
createServerParamsForMetadata: CreateServerParamsForMetadata,
256+
workStore: WorkStore
257+
): Promise<React.ReactNode> {
258+
const notFoundErrorConvention = 'not-found'
259+
return renderViewport(
263260
tree,
264261
searchParams,
265-
errorConvention,
266262
getDynamicParamFromSegment,
267263
createServerParamsForMetadata,
268-
workStore
264+
workStore,
265+
notFoundErrorConvention
269266
)
270-
const elements: Array<React.ReactNode> = createViewportElements(
271-
await accumulateViewport(metadataItems)
267+
}
268+
269+
async function renderMetadata(
270+
tree: LoaderTree,
271+
searchParams: Promise<ParsedUrlQuery>,
272+
getDynamicParamFromSegment: GetDynamicParamFromSegment,
273+
metadataContext: MetadataContext,
274+
createServerParamsForMetadata: CreateServerParamsForMetadata,
275+
workStore: WorkStore,
276+
errorConvention?: MetadataErrorType
277+
) {
278+
const resolvedMetadata = await resolveMetadata(
279+
tree,
280+
searchParams,
281+
errorConvention,
282+
getDynamicParamFromSegment,
283+
createServerParamsForMetadata,
284+
workStore,
285+
metadataContext
272286
)
287+
const elements: Array<React.ReactNode> =
288+
createMetadataElements(resolvedMetadata)
273289
return (
274290
<>
275291
{elements.map((el, index) => {
@@ -279,26 +295,25 @@ async function getResolvedViewportImpl(
279295
)
280296
}
281297

282-
const getNotFoundViewport = cache(getNotFoundViewportImpl)
283-
async function getNotFoundViewportImpl(
298+
async function renderViewport(
284299
tree: LoaderTree,
285300
searchParams: Promise<ParsedUrlQuery>,
286301
getDynamicParamFromSegment: GetDynamicParamFromSegment,
287302
createServerParamsForMetadata: CreateServerParamsForMetadata,
288-
workStore: WorkStore
289-
): Promise<React.ReactNode> {
290-
const notFoundErrorConvention = 'not-found'
291-
const notFoundMetadataItems = await resolveMetadataItems(
303+
workStore: WorkStore,
304+
errorConvention?: MetadataErrorType
305+
) {
306+
const notFoundResolvedViewport = await resolveViewport(
292307
tree,
293308
searchParams,
294-
notFoundErrorConvention,
309+
errorConvention,
295310
getDynamicParamFromSegment,
296311
createServerParamsForMetadata,
297312
workStore
298313
)
299314

300315
const elements: Array<React.ReactNode> = createViewportElements(
301-
await accumulateViewport(notFoundMetadataItems)
316+
notFoundResolvedViewport
302317
)
303318
return (
304319
<>

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

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -470,9 +470,7 @@ async function collectMetadata({
470470
}
471471
}
472472

473-
const cachedResolveMetadataItems = cache(resolveMetadataItems)
474-
export { cachedResolveMetadataItems as resolveMetadataItems }
475-
async function resolveMetadataItems(
473+
const resolveMetadataItems = cache(async function (
476474
tree: LoaderTree,
477475
searchParams: Promise<ParsedUrlQuery>,
478476
errorConvention: MetadataErrorType | undefined,
@@ -496,7 +494,7 @@ async function resolveMetadataItems(
496494
createServerParamsForMetadata,
497495
workStore
498496
)
499-
}
497+
})
500498

501499
async function resolveMetadataItemsImpl(
502500
metadataItems: MetadataItems,
@@ -901,3 +899,44 @@ export async function accumulateViewport(
901899
}
902900
return resolvedViewport
903901
}
902+
903+
// Exposed API for metadata component, that directly resolve the loader tree and related context as resolved metadata.
904+
export async function resolveMetadata(
905+
tree: LoaderTree,
906+
searchParams: Promise<ParsedUrlQuery>,
907+
errorConvention: MetadataErrorType | undefined,
908+
getDynamicParamFromSegment: GetDynamicParamFromSegment,
909+
createServerParamsForMetadata: CreateServerParamsForMetadata,
910+
workStore: WorkStore,
911+
metadataContext: MetadataContext
912+
): Promise<ResolvedMetadata> {
913+
const metadataItems = await resolveMetadataItems(
914+
tree,
915+
searchParams,
916+
errorConvention,
917+
getDynamicParamFromSegment,
918+
createServerParamsForMetadata,
919+
workStore
920+
)
921+
return accumulateMetadata(metadataItems, metadataContext)
922+
}
923+
924+
// Exposed API for viewport component, that directly resolve the loader tree and related context as resolved viewport.
925+
export async function resolveViewport(
926+
tree: LoaderTree,
927+
searchParams: Promise<ParsedUrlQuery>,
928+
errorConvention: MetadataErrorType | undefined,
929+
getDynamicParamFromSegment: GetDynamicParamFromSegment,
930+
createServerParamsForMetadata: CreateServerParamsForMetadata,
931+
workStore: WorkStore
932+
): Promise<ResolvedViewport> {
933+
const metadataItems = await resolveMetadataItems(
934+
tree,
935+
searchParams,
936+
errorConvention,
937+
getDynamicParamFromSegment,
938+
createServerParamsForMetadata,
939+
workStore
940+
)
941+
return accumulateViewport(metadataItems)
942+
}

0 commit comments

Comments
 (0)