{"version":3,"sources":["../../../src/lib/metadata/metadata.tsx"],"sourcesContent":["import React, { Suspense, cache, cloneElement } from 'react'\nimport type { ParsedUrlQuery } from 'querystring'\nimport type { GetDynamicParamFromSegment } from '../../server/app-render/app-render'\nimport type { LoaderTree } from '../../server/lib/app-dir-module'\nimport type { SearchParams } from '../../server/request/search-params'\nimport {\n AppleWebAppMeta,\n FormatDetectionMeta,\n ItunesMeta,\n BasicMeta,\n ViewportMeta,\n VerificationMeta,\n FacebookMeta,\n PinterestMeta,\n} from './generate/basic'\nimport { AlternatesMetadata } from './generate/alternate'\nimport {\n OpenGraphMetadata,\n TwitterMetadata,\n AppLinksMeta,\n} from './generate/opengraph'\nimport { IconsMetadata } from './generate/icons'\nimport {\n type MetadataErrorType,\n resolveMetadata,\n resolveViewport,\n} from './resolve-metadata'\nimport { MetaFilter } from './generate/meta'\nimport type {\n ResolvedMetadata,\n ResolvedViewport,\n} from './types/metadata-interface'\nimport { isHTTPAccessFallbackError } from '../../client/components/http-access-fallback/http-access-fallback'\nimport type { MetadataContext } from './types/resolvers'\nimport type { WorkStore } from '../../server/app-render/work-async-storage.external'\nimport { createServerSearchParamsForMetadata } from '../../server/request/search-params'\nimport { createServerPathnameForMetadata } from '../../server/request/pathname'\nimport { isPostpone } from '../../server/lib/router-utils/is-postpone'\n\nimport {\n MetadataBoundary,\n ViewportBoundary,\n OutletBoundary,\n} from '../framework/boundary-components'\n\n// Use a promise to share the status of the metadata resolving,\n// returning two components `MetadataTree` and `MetadataOutlet`\n// `MetadataTree` is the one that will be rendered at first in the content sequence for metadata tags.\n// `MetadataOutlet` is the one that will be rendered under error boundaries for metadata resolving errors.\n// In this way we can let the metadata tags always render successfully,\n// and the error will be caught by the error boundary and trigger fallbacks.\nexport function createMetadataComponents({\n tree,\n pathname,\n parsedQuery,\n metadataContext,\n getDynamicParamFromSegment,\n errorType,\n workStore,\n serveStreamingMetadata,\n}: {\n tree: LoaderTree\n pathname: string\n parsedQuery: SearchParams\n metadataContext: MetadataContext\n getDynamicParamFromSegment: GetDynamicParamFromSegment\n errorType?: MetadataErrorType | 'redirect'\n workStore: WorkStore\n serveStreamingMetadata: boolean\n}): {\n Viewport: React.ComponentType\n Metadata: React.ComponentType\n MetadataOutlet: React.ComponentType\n} {\n const searchParams = createServerSearchParamsForMetadata(\n parsedQuery,\n workStore\n )\n const pathnameForMetadata = createServerPathnameForMetadata(\n pathname,\n workStore\n )\n\n function Viewport() {\n const pendingViewportTags = getResolvedViewport(\n tree,\n searchParams,\n getDynamicParamFromSegment,\n workStore,\n errorType\n ).catch((viewportErr) => {\n // When Legacy PPR is enabled viewport can reject with a Postpone type\n // This will go away once Legacy PPR is removed and dynamic metadata will\n // stay pending until after the prerender is complete when it is dynamic\n if (isPostpone(viewportErr)) {\n throw viewportErr\n }\n if (!errorType && isHTTPAccessFallbackError(viewportErr)) {\n return getNotFoundViewport(\n tree,\n searchParams,\n getDynamicParamFromSegment,\n workStore\n ).catch(() => null)\n }\n // We're going to throw the error from the metadata outlet so we just render null here instead\n return null\n })\n\n return (\n