1686 lines
70 KiB
JavaScript
1686 lines
70 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
Object.defineProperty(exports, "createMetadataComponents", {
|
|
enumerable: true,
|
|
get: function() {
|
|
return createMetadataComponents;
|
|
}
|
|
});
|
|
const _jsxruntime = require("react/jsx-runtime");
|
|
const _react = /*#__PURE__*/ _interop_require_wildcard(require("react"));
|
|
const _resolvemetadata = require("./resolve-metadata");
|
|
const _httpaccessfallback = require("../../client/components/http-access-fallback/http-access-fallback");
|
|
const _searchparams = require("../../server/request/search-params");
|
|
const _pathname = require("../../server/request/pathname");
|
|
const _ispostpone = require("../../server/lib/router-utils/is-postpone");
|
|
const _workunitasyncstorageexternal = require("../../server/app-render/work-unit-async-storage.external");
|
|
const _stagedrendering = require("../../server/app-render/staged-rendering");
|
|
const _boundarycomponents = require("../framework/boundary-components");
|
|
const _utils = require("./generate/utils");
|
|
const _iconmark = require("./generate/icon-mark");
|
|
function _getRequireWildcardCache(nodeInterop) {
|
|
if (typeof WeakMap !== "function") return null;
|
|
var cacheBabelInterop = new WeakMap();
|
|
var cacheNodeInterop = new WeakMap();
|
|
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
})(nodeInterop);
|
|
}
|
|
function _interop_require_wildcard(obj, nodeInterop) {
|
|
if (!nodeInterop && obj && obj.__esModule) {
|
|
return obj;
|
|
}
|
|
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
return {
|
|
default: obj
|
|
};
|
|
}
|
|
var cache = _getRequireWildcardCache(nodeInterop);
|
|
if (cache && cache.has(obj)) {
|
|
return cache.get(obj);
|
|
}
|
|
var newObj = {
|
|
__proto__: null
|
|
};
|
|
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
for(var key in obj){
|
|
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
if (desc && (desc.get || desc.set)) {
|
|
Object.defineProperty(newObj, key, desc);
|
|
} else {
|
|
newObj[key] = obj[key];
|
|
}
|
|
}
|
|
}
|
|
newObj.default = obj;
|
|
if (cache) {
|
|
cache.set(obj, newObj);
|
|
}
|
|
return newObj;
|
|
}
|
|
function createMetadataComponents({ tree, pathname, parsedQuery, metadataContext, interpolatedParams, errorType, serveStreamingMetadata, isRuntimePrefetchable }) {
|
|
const searchParams = (0, _searchparams.createServerSearchParamsForMetadata)(parsedQuery, isRuntimePrefetchable);
|
|
const pathnameForMetadata = (0, _pathname.createServerPathnameForMetadata)(pathname);
|
|
async function Viewport() {
|
|
// Gate metadata to the correct render stage. If the page is not
|
|
// runtime-prefetchable, defer until the Static stage so that
|
|
// prefetchable segments get a head start.
|
|
if (!isRuntimePrefetchable) {
|
|
const workUnitStore = _workunitasyncstorageexternal.workUnitAsyncStorage.getStore();
|
|
if (workUnitStore) {
|
|
const stagedRendering = (0, _workunitasyncstorageexternal.getStagedRenderingController)(workUnitStore);
|
|
if (stagedRendering) {
|
|
await stagedRendering.waitForStage(_stagedrendering.RenderStage.Static);
|
|
}
|
|
}
|
|
}
|
|
const tags = await getResolvedViewport(tree, searchParams, interpolatedParams, isRuntimePrefetchable, errorType).catch((viewportErr)=>{
|
|
// When Legacy PPR is enabled viewport can reject with a Postpone type
|
|
// This will go away once Legacy PPR is removed and dynamic metadata will
|
|
// stay pending until after the prerender is complete when it is dynamic
|
|
if ((0, _ispostpone.isPostpone)(viewportErr)) {
|
|
throw viewportErr;
|
|
}
|
|
if (!errorType && (0, _httpaccessfallback.isHTTPAccessFallbackError)(viewportErr)) {
|
|
return getNotFoundViewport(tree, searchParams, interpolatedParams, isRuntimePrefetchable).catch(()=>null);
|
|
}
|
|
// We're going to throw the error from the metadata outlet so we just render null here instead
|
|
return null;
|
|
});
|
|
return tags;
|
|
}
|
|
Viewport.displayName = 'Next.Viewport';
|
|
function ViewportWrapper() {
|
|
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_boundarycomponents.ViewportBoundary, {
|
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(Viewport, {})
|
|
});
|
|
}
|
|
async function Metadata() {
|
|
// Gate metadata to the correct render stage. If the page is not
|
|
// runtime-prefetchable, defer until the Static stage so that
|
|
// prefetchable segments get a head start.
|
|
if (!isRuntimePrefetchable) {
|
|
const workUnitStore = _workunitasyncstorageexternal.workUnitAsyncStorage.getStore();
|
|
if (workUnitStore) {
|
|
const stagedRendering = (0, _workunitasyncstorageexternal.getStagedRenderingController)(workUnitStore);
|
|
if (stagedRendering) {
|
|
await stagedRendering.waitForStage(_stagedrendering.RenderStage.Static);
|
|
}
|
|
}
|
|
}
|
|
const tags = await getResolvedMetadata(tree, pathnameForMetadata, searchParams, interpolatedParams, metadataContext, isRuntimePrefetchable, errorType).catch((metadataErr)=>{
|
|
// When Legacy PPR is enabled metadata can reject with a Postpone type
|
|
// This will go away once Legacy PPR is removed and dynamic metadata will
|
|
// stay pending until after the prerender is complete when it is dynamic
|
|
if ((0, _ispostpone.isPostpone)(metadataErr)) {
|
|
throw metadataErr;
|
|
}
|
|
if (!errorType && (0, _httpaccessfallback.isHTTPAccessFallbackError)(metadataErr)) {
|
|
return getNotFoundMetadata(tree, pathnameForMetadata, searchParams, interpolatedParams, metadataContext, isRuntimePrefetchable).catch(()=>null);
|
|
}
|
|
// We're going to throw the error from the metadata outlet so we just render null here instead
|
|
return null;
|
|
});
|
|
return tags;
|
|
}
|
|
Metadata.displayName = 'Next.Metadata';
|
|
function MetadataWrapper() {
|
|
// TODO: We shouldn't change what we render based on whether we are streaming or not.
|
|
// If we aren't streaming we should just block the response until we have resolved the
|
|
// metadata.
|
|
if (!serveStreamingMetadata) {
|
|
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_boundarycomponents.MetadataBoundary, {
|
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(Metadata, {})
|
|
});
|
|
}
|
|
return /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
|
|
hidden: true,
|
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_boundarycomponents.MetadataBoundary, {
|
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_react.Suspense, {
|
|
name: "Next.Metadata",
|
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(Metadata, {})
|
|
})
|
|
})
|
|
});
|
|
}
|
|
function MetadataOutlet() {
|
|
const pendingOutlet = Promise.all([
|
|
getResolvedMetadata(tree, pathnameForMetadata, searchParams, interpolatedParams, metadataContext, isRuntimePrefetchable, errorType),
|
|
getResolvedViewport(tree, searchParams, interpolatedParams, isRuntimePrefetchable, errorType)
|
|
]).then(()=>null);
|
|
// TODO: We shouldn't change what we render based on whether we are streaming or not.
|
|
// If we aren't streaming we should just block the response until we have resolved the
|
|
// metadata.
|
|
if (!serveStreamingMetadata) {
|
|
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_boundarycomponents.OutletBoundary, {
|
|
children: pendingOutlet
|
|
});
|
|
}
|
|
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_boundarycomponents.OutletBoundary, {
|
|
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_react.Suspense, {
|
|
name: "Next.MetadataOutlet",
|
|
children: pendingOutlet
|
|
})
|
|
});
|
|
}
|
|
MetadataOutlet.displayName = 'Next.MetadataOutlet';
|
|
return {
|
|
Viewport: ViewportWrapper,
|
|
Metadata: MetadataWrapper,
|
|
MetadataOutlet
|
|
};
|
|
}
|
|
const getResolvedMetadata = (0, _react.cache)(getResolvedMetadataImpl);
|
|
async function getResolvedMetadataImpl(tree, pathname, searchParams, interpolatedParams, metadataContext, isRuntimePrefetchable, errorType) {
|
|
const errorConvention = errorType === 'redirect' ? undefined : errorType;
|
|
return renderMetadata(tree, pathname, searchParams, interpolatedParams, metadataContext, isRuntimePrefetchable, errorConvention);
|
|
}
|
|
const getNotFoundMetadata = (0, _react.cache)(getNotFoundMetadataImpl);
|
|
async function getNotFoundMetadataImpl(tree, pathname, searchParams, interpolatedParams, metadataContext, isRuntimePrefetchable) {
|
|
const notFoundErrorConvention = 'not-found';
|
|
return renderMetadata(tree, pathname, searchParams, interpolatedParams, metadataContext, isRuntimePrefetchable, notFoundErrorConvention);
|
|
}
|
|
const getResolvedViewport = (0, _react.cache)(getResolvedViewportImpl);
|
|
async function getResolvedViewportImpl(tree, searchParams, interpolatedParams, isRuntimePrefetchable, errorType) {
|
|
const errorConvention = errorType === 'redirect' ? undefined : errorType;
|
|
return renderViewport(tree, searchParams, interpolatedParams, isRuntimePrefetchable, errorConvention);
|
|
}
|
|
const getNotFoundViewport = (0, _react.cache)(getNotFoundViewportImpl);
|
|
async function getNotFoundViewportImpl(tree, searchParams, interpolatedParams, isRuntimePrefetchable) {
|
|
const notFoundErrorConvention = 'not-found';
|
|
return renderViewport(tree, searchParams, interpolatedParams, isRuntimePrefetchable, notFoundErrorConvention);
|
|
}
|
|
async function renderMetadata(tree, pathname, searchParams, interpolatedParams, metadataContext, isRuntimePrefetchable, errorConvention) {
|
|
const resolvedMetadata = await (0, _resolvemetadata.resolveMetadata)(tree, pathname, searchParams, errorConvention, interpolatedParams, metadataContext, isRuntimePrefetchable);
|
|
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_jsxruntime.Fragment, {
|
|
children: createMetadataElements(resolvedMetadata)
|
|
});
|
|
}
|
|
async function renderViewport(tree, searchParams, interpolatedParams, isRuntimePrefetchable, errorConvention) {
|
|
const resolvedViewport = await (0, _resolvemetadata.resolveViewport)(tree, searchParams, errorConvention, interpolatedParams, isRuntimePrefetchable);
|
|
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_jsxruntime.Fragment, {
|
|
children: createViewportElements(resolvedViewport)
|
|
});
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
// Viewport tag rendering
|
|
// ---------------------------------------------------------------------------
|
|
function createViewportElements(viewport) {
|
|
const tags = [];
|
|
let i = 0;
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
charSet: "utf-8"
|
|
}, i++));
|
|
// Build viewport content string from layout properties
|
|
const viewportParts = [];
|
|
if (viewport.width != null) {
|
|
viewportParts.push(`width=${viewport.width}`);
|
|
}
|
|
if (viewport.height != null) {
|
|
viewportParts.push(`height=${viewport.height}`);
|
|
}
|
|
if (viewport.initialScale != null) {
|
|
viewportParts.push(`initial-scale=${viewport.initialScale}`);
|
|
}
|
|
if (viewport.minimumScale != null) {
|
|
viewportParts.push(`minimum-scale=${viewport.minimumScale}`);
|
|
}
|
|
if (viewport.maximumScale != null) {
|
|
viewportParts.push(`maximum-scale=${viewport.maximumScale}`);
|
|
}
|
|
if (viewport.userScalable != null) {
|
|
viewportParts.push(`user-scalable=${viewport.userScalable ? 'yes' : 'no'}`);
|
|
}
|
|
if (viewport.viewportFit) {
|
|
viewportParts.push(`viewport-fit=${viewport.viewportFit}`);
|
|
}
|
|
if (viewport.interactiveWidget) {
|
|
viewportParts.push(`interactive-widget=${viewport.interactiveWidget}`);
|
|
}
|
|
if (viewportParts.length) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "viewport",
|
|
content: viewportParts.join(', ')
|
|
}, i++));
|
|
}
|
|
if (viewport.themeColor) {
|
|
for (const themeColor of viewport.themeColor){
|
|
if (themeColor.media) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "theme-color",
|
|
content: themeColor.color,
|
|
media: themeColor.media
|
|
}, i++));
|
|
} else {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "theme-color",
|
|
content: themeColor.color
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
if (viewport.colorScheme) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "color-scheme",
|
|
content: viewport.colorScheme
|
|
}, i++));
|
|
}
|
|
return tags;
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
// Metadata tag rendering
|
|
// ---------------------------------------------------------------------------
|
|
function createMetadataElements(metadata) {
|
|
var _metadata_robots, _metadata_robots1;
|
|
const tags = [];
|
|
let i = 0;
|
|
// --- Title ---
|
|
if (metadata.title !== null && metadata.title.absolute) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("title", {
|
|
children: metadata.title.absolute
|
|
}, i++));
|
|
}
|
|
// --- Basic meta tags ---
|
|
if (metadata.description) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "description",
|
|
content: metadata.description
|
|
}, i++));
|
|
}
|
|
if (metadata.applicationName) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "application-name",
|
|
content: metadata.applicationName
|
|
}, i++));
|
|
}
|
|
// --- Authors ---
|
|
if (metadata.authors) {
|
|
for (const author of metadata.authors){
|
|
if (author.url) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("link", {
|
|
rel: "author",
|
|
href: author.url.toString()
|
|
}, i++));
|
|
}
|
|
if (author.name) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "author",
|
|
content: author.name
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
// --- Manifest ---
|
|
if (metadata.manifest) {
|
|
const manifestOrigin = (0, _utils.getOrigin)(metadata.manifest);
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("link", {
|
|
rel: "manifest",
|
|
href: metadata.manifest.toString(),
|
|
crossOrigin: !manifestOrigin && process.env.VERCEL_ENV === 'preview' ? 'use-credentials' : undefined
|
|
}, i++));
|
|
}
|
|
if (metadata.generator) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "generator",
|
|
content: metadata.generator
|
|
}, i++));
|
|
}
|
|
if (metadata.keywords && metadata.keywords.length) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "keywords",
|
|
content: metadata.keywords.join(',')
|
|
}, i++));
|
|
}
|
|
if (metadata.referrer) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "referrer",
|
|
content: metadata.referrer
|
|
}, i++));
|
|
}
|
|
if (metadata.creator) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "creator",
|
|
content: metadata.creator
|
|
}, i++));
|
|
}
|
|
if (metadata.publisher) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "publisher",
|
|
content: metadata.publisher
|
|
}, i++));
|
|
}
|
|
if ((_metadata_robots = metadata.robots) == null ? void 0 : _metadata_robots.basic) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "robots",
|
|
content: metadata.robots.basic
|
|
}, i++));
|
|
}
|
|
if ((_metadata_robots1 = metadata.robots) == null ? void 0 : _metadata_robots1.googleBot) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "googlebot",
|
|
content: metadata.robots.googleBot
|
|
}, i++));
|
|
}
|
|
if (metadata.abstract) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "abstract",
|
|
content: metadata.abstract
|
|
}, i++));
|
|
}
|
|
// --- Link rel arrays ---
|
|
if (metadata.archives) {
|
|
for (const archive of metadata.archives){
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("link", {
|
|
rel: "archives",
|
|
href: archive
|
|
}, i++));
|
|
}
|
|
}
|
|
if (metadata.assets) {
|
|
for (const asset of metadata.assets){
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("link", {
|
|
rel: "assets",
|
|
href: asset
|
|
}, i++));
|
|
}
|
|
}
|
|
if (metadata.bookmarks) {
|
|
for (const bookmark of metadata.bookmarks){
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("link", {
|
|
rel: "bookmarks",
|
|
href: bookmark
|
|
}, i++));
|
|
}
|
|
}
|
|
// --- Pagination ---
|
|
if (metadata.pagination) {
|
|
if (metadata.pagination.previous) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("link", {
|
|
rel: "prev",
|
|
href: metadata.pagination.previous
|
|
}, i++));
|
|
}
|
|
if (metadata.pagination.next) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("link", {
|
|
rel: "next",
|
|
href: metadata.pagination.next
|
|
}, i++));
|
|
}
|
|
}
|
|
if (metadata.category) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "category",
|
|
content: metadata.category
|
|
}, i++));
|
|
}
|
|
if (metadata.classification) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "classification",
|
|
content: metadata.classification
|
|
}, i++));
|
|
}
|
|
// --- Other (arbitrary name/value pairs) ---
|
|
if (metadata.other) {
|
|
for (const [name, content] of Object.entries(metadata.other)){
|
|
if (Array.isArray(content)) {
|
|
for (const contentItem of content){
|
|
if (contentItem != null && contentItem !== '') {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: name,
|
|
content: String(contentItem)
|
|
}, i++));
|
|
}
|
|
}
|
|
} else if (content != null && content !== '') {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: name,
|
|
content: String(content)
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
// --- Alternates ---
|
|
if (metadata.alternates) {
|
|
const { canonical, languages, media, types } = metadata.alternates;
|
|
if (canonical && canonical.url) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("link", {
|
|
rel: "canonical",
|
|
href: canonical.url.toString(),
|
|
...canonical.title ? {
|
|
title: canonical.title
|
|
} : undefined
|
|
}, i++));
|
|
}
|
|
if (languages) {
|
|
for (const [locale, descriptors] of Object.entries(languages)){
|
|
if (descriptors) {
|
|
for (const descriptor of descriptors){
|
|
if (descriptor.url) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("link", {
|
|
rel: "alternate",
|
|
hrefLang: locale,
|
|
href: descriptor.url.toString(),
|
|
...descriptor.title ? {
|
|
title: descriptor.title
|
|
} : undefined
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (media) {
|
|
for (const [mediaName, descriptors] of Object.entries(media)){
|
|
if (descriptors) {
|
|
for (const descriptor of descriptors){
|
|
if (descriptor.url) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("link", {
|
|
rel: "alternate",
|
|
media: mediaName,
|
|
href: descriptor.url.toString(),
|
|
...descriptor.title ? {
|
|
title: descriptor.title
|
|
} : undefined
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (types) {
|
|
for (const [type, descriptors] of Object.entries(types)){
|
|
if (descriptors) {
|
|
for (const descriptor of descriptors){
|
|
if (descriptor.url) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("link", {
|
|
rel: "alternate",
|
|
type: type,
|
|
href: descriptor.url.toString(),
|
|
...descriptor.title ? {
|
|
title: descriptor.title
|
|
} : undefined
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// --- iTunes ---
|
|
if (metadata.itunes) {
|
|
const { appId, appArgument } = metadata.itunes;
|
|
let itunesContent = `app-id=${appId}`;
|
|
if (appArgument) {
|
|
itunesContent += `, app-argument=${appArgument}`;
|
|
}
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "apple-itunes-app",
|
|
content: itunesContent
|
|
}, i++));
|
|
}
|
|
// --- Facebook ---
|
|
if (metadata.facebook) {
|
|
if (metadata.facebook.appId) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "fb:app_id",
|
|
content: metadata.facebook.appId
|
|
}, i++));
|
|
}
|
|
if (metadata.facebook.admins) {
|
|
for (const admin of metadata.facebook.admins){
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "fb:admins",
|
|
content: admin
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
// --- Pinterest ---
|
|
if (metadata.pinterest && metadata.pinterest.richPin !== undefined) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "pinterest-rich-pin",
|
|
content: metadata.pinterest.richPin.toString()
|
|
}, i++));
|
|
}
|
|
// --- Format Detection ---
|
|
if (metadata.formatDetection) {
|
|
const formatDetectionKeys = [
|
|
'telephone',
|
|
'date',
|
|
'address',
|
|
'email',
|
|
'url'
|
|
];
|
|
let formatContent = '';
|
|
for (const key of formatDetectionKeys){
|
|
if (metadata.formatDetection[key] === false) {
|
|
if (formatContent) formatContent += ', ';
|
|
formatContent += `${key}=no`;
|
|
}
|
|
}
|
|
if (formatContent) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "format-detection",
|
|
content: formatContent
|
|
}, i++));
|
|
}
|
|
}
|
|
// --- Verification ---
|
|
if (metadata.verification) {
|
|
const verification = metadata.verification;
|
|
if (verification.google) {
|
|
for (const value of verification.google){
|
|
if (value != null && value !== '') {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "google-site-verification",
|
|
content: String(value)
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
if (verification.yahoo) {
|
|
for (const value of verification.yahoo){
|
|
if (value != null && value !== '') {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "y_key",
|
|
content: String(value)
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
if (verification.yandex) {
|
|
for (const value of verification.yandex){
|
|
if (value != null && value !== '') {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "yandex-verification",
|
|
content: String(value)
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
if (verification.me) {
|
|
for (const value of verification.me){
|
|
if (value != null && value !== '') {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "me",
|
|
content: String(value)
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
if (verification.other) {
|
|
for (const [name, values] of Object.entries(verification.other)){
|
|
for (const value of values){
|
|
if (value != null && value !== '') {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: name,
|
|
content: String(value)
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// --- Apple Web App ---
|
|
if (metadata.appleWebApp) {
|
|
const { capable, title, startupImage, statusBarStyle } = metadata.appleWebApp;
|
|
if (capable) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "mobile-web-app-capable",
|
|
content: "yes"
|
|
}, i++));
|
|
}
|
|
if (title) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "apple-mobile-web-app-title",
|
|
content: title
|
|
}, i++));
|
|
}
|
|
if (startupImage) {
|
|
for (const image of startupImage){
|
|
if (image.media) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("link", {
|
|
href: image.url,
|
|
media: image.media,
|
|
rel: "apple-touch-startup-image"
|
|
}, i++));
|
|
} else {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("link", {
|
|
href: image.url,
|
|
rel: "apple-touch-startup-image"
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
if (statusBarStyle) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "apple-mobile-web-app-status-bar-style",
|
|
content: statusBarStyle
|
|
}, i++));
|
|
}
|
|
}
|
|
// --- Open Graph ---
|
|
if (metadata.openGraph) {
|
|
var _og_title;
|
|
const og = metadata.openGraph;
|
|
if (og.determiner) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:determiner",
|
|
content: og.determiner
|
|
}, i++));
|
|
}
|
|
if ((_og_title = og.title) == null ? void 0 : _og_title.absolute) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:title",
|
|
content: og.title.absolute
|
|
}, i++));
|
|
}
|
|
if (og.description) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:description",
|
|
content: og.description
|
|
}, i++));
|
|
}
|
|
if (og.url) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:url",
|
|
content: og.url.toString()
|
|
}, i++));
|
|
}
|
|
if (og.siteName) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:site_name",
|
|
content: og.siteName
|
|
}, i++));
|
|
}
|
|
if (og.locale) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:locale",
|
|
content: og.locale
|
|
}, i++));
|
|
}
|
|
if (og.countryName) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:country_name",
|
|
content: og.countryName
|
|
}, i++));
|
|
}
|
|
if (og.ttl != null) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:ttl",
|
|
content: og.ttl.toString()
|
|
}, i++));
|
|
}
|
|
// OG images
|
|
if (og.images) {
|
|
for (const image of og.images){
|
|
if (typeof image === 'string') {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:image",
|
|
content: image
|
|
}, i++));
|
|
} else {
|
|
if (image.url) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:image",
|
|
content: String(image.url)
|
|
}, i++));
|
|
}
|
|
if (image.secureUrl) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:image:secure_url",
|
|
content: String(image.secureUrl)
|
|
}, i++));
|
|
}
|
|
if (image.type) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:image:type",
|
|
content: image.type
|
|
}, i++));
|
|
}
|
|
if (image.width) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:image:width",
|
|
content: String(image.width)
|
|
}, i++));
|
|
}
|
|
if (image.height) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:image:height",
|
|
content: String(image.height)
|
|
}, i++));
|
|
}
|
|
if (image.alt) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:image:alt",
|
|
content: image.alt
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// OG videos
|
|
if (og.videos) {
|
|
for (const video of og.videos){
|
|
if (typeof video === 'string') {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:video",
|
|
content: video
|
|
}, i++));
|
|
} else {
|
|
if (video.url) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:video",
|
|
content: String(video.url)
|
|
}, i++));
|
|
}
|
|
if (video.secureUrl) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:video:secure_url",
|
|
content: String(video.secureUrl)
|
|
}, i++));
|
|
}
|
|
if (video.type) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:video:type",
|
|
content: video.type
|
|
}, i++));
|
|
}
|
|
if (video.width) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:video:width",
|
|
content: String(video.width)
|
|
}, i++));
|
|
}
|
|
if (video.height) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:video:height",
|
|
content: String(video.height)
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// OG audio
|
|
if (og.audio) {
|
|
for (const audio of og.audio){
|
|
if (typeof audio === 'string') {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:audio",
|
|
content: audio
|
|
}, i++));
|
|
} else {
|
|
if (audio.url) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:audio",
|
|
content: String(audio.url)
|
|
}, i++));
|
|
}
|
|
if (audio.secureUrl) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:audio:secure_url",
|
|
content: String(audio.secureUrl)
|
|
}, i++));
|
|
}
|
|
if (audio.type) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:audio:type",
|
|
content: audio.type
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// OG simple array properties
|
|
if (og.emails) {
|
|
for (const email of og.emails){
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:email",
|
|
content: email
|
|
}, i++));
|
|
}
|
|
}
|
|
if (og.phoneNumbers) {
|
|
for (const phone of og.phoneNumbers){
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:phone_number",
|
|
content: phone
|
|
}, i++));
|
|
}
|
|
}
|
|
if (og.faxNumbers) {
|
|
for (const fax of og.faxNumbers){
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:fax_number",
|
|
content: fax
|
|
}, i++));
|
|
}
|
|
}
|
|
if (og.alternateLocale) {
|
|
for (const locale of og.alternateLocale){
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:locale:alternate",
|
|
content: locale
|
|
}, i++));
|
|
}
|
|
}
|
|
// OG type-specific tags
|
|
if ('type' in og) {
|
|
const ogType = og.type;
|
|
switch(ogType){
|
|
case 'website':
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:type",
|
|
content: "website"
|
|
}, i++));
|
|
break;
|
|
case 'article':
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:type",
|
|
content: "article"
|
|
}, i++));
|
|
if (og.publishedTime) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "article:published_time",
|
|
content: og.publishedTime.toString()
|
|
}, i++));
|
|
}
|
|
if (og.modifiedTime) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "article:modified_time",
|
|
content: og.modifiedTime.toString()
|
|
}, i++));
|
|
}
|
|
if (og.expirationTime) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "article:expiration_time",
|
|
content: og.expirationTime.toString()
|
|
}, i++));
|
|
}
|
|
if (og.authors) {
|
|
for (const author of og.authors){
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "article:author",
|
|
content: String(author)
|
|
}, i++));
|
|
}
|
|
}
|
|
if (og.section) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "article:section",
|
|
content: og.section
|
|
}, i++));
|
|
}
|
|
if (og.tags) {
|
|
for (const tag of og.tags){
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "article:tag",
|
|
content: tag
|
|
}, i++));
|
|
}
|
|
}
|
|
break;
|
|
case 'book':
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:type",
|
|
content: "book"
|
|
}, i++));
|
|
if (og.isbn) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "book:isbn",
|
|
content: og.isbn
|
|
}, i++));
|
|
}
|
|
if (og.releaseDate) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "book:release_date",
|
|
content: og.releaseDate
|
|
}, i++));
|
|
}
|
|
if (og.authors) {
|
|
for (const author of og.authors){
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "book:author",
|
|
content: String(author)
|
|
}, i++));
|
|
}
|
|
}
|
|
if (og.tags) {
|
|
for (const tag of og.tags){
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "book:tag",
|
|
content: tag
|
|
}, i++));
|
|
}
|
|
}
|
|
break;
|
|
case 'profile':
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:type",
|
|
content: "profile"
|
|
}, i++));
|
|
if (og.firstName) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "profile:first_name",
|
|
content: og.firstName
|
|
}, i++));
|
|
}
|
|
if (og.lastName) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "profile:last_name",
|
|
content: og.lastName
|
|
}, i++));
|
|
}
|
|
if (og.username) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "profile:username",
|
|
content: og.username
|
|
}, i++));
|
|
}
|
|
if (og.gender) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "profile:gender",
|
|
content: og.gender
|
|
}, i++));
|
|
}
|
|
break;
|
|
case 'music.song':
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:type",
|
|
content: "music.song"
|
|
}, i++));
|
|
if (og.duration != null) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "music:duration",
|
|
content: og.duration.toString()
|
|
}, i++));
|
|
}
|
|
if (og.albums) {
|
|
for (const album of og.albums){
|
|
if (typeof album === 'string') {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "music:album",
|
|
content: album
|
|
}, i++));
|
|
} else {
|
|
if (album.url) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "music:album",
|
|
content: String(album.url)
|
|
}, i++));
|
|
}
|
|
if (album.disc != null) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "music:album:disc",
|
|
content: String(album.disc)
|
|
}, i++));
|
|
}
|
|
if (album.track != null) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "music:album:track",
|
|
content: String(album.track)
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (og.musicians) {
|
|
for (const musician of og.musicians){
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "music:musician",
|
|
content: String(musician)
|
|
}, i++));
|
|
}
|
|
}
|
|
break;
|
|
case 'music.album':
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:type",
|
|
content: "music.album"
|
|
}, i++));
|
|
if (og.songs) {
|
|
for (const song of og.songs){
|
|
if (typeof song === 'string') {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "music:song",
|
|
content: song
|
|
}, i++));
|
|
} else {
|
|
if (song.url) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "music:song",
|
|
content: String(song.url)
|
|
}, i++));
|
|
}
|
|
if (song.disc != null) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "music:song:disc",
|
|
content: String(song.disc)
|
|
}, i++));
|
|
}
|
|
if (song.track != null) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "music:song:track",
|
|
content: String(song.track)
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (og.musicians) {
|
|
for (const musician of og.musicians){
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "music:musician",
|
|
content: String(musician)
|
|
}, i++));
|
|
}
|
|
}
|
|
if (og.releaseDate) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "music:release_date",
|
|
content: og.releaseDate
|
|
}, i++));
|
|
}
|
|
break;
|
|
case 'music.playlist':
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:type",
|
|
content: "music.playlist"
|
|
}, i++));
|
|
if (og.songs) {
|
|
for (const song of og.songs){
|
|
if (typeof song === 'string') {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "music:song",
|
|
content: song
|
|
}, i++));
|
|
} else {
|
|
if (song.url) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "music:song",
|
|
content: String(song.url)
|
|
}, i++));
|
|
}
|
|
if (song.disc != null) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "music:song:disc",
|
|
content: String(song.disc)
|
|
}, i++));
|
|
}
|
|
if (song.track != null) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "music:song:track",
|
|
content: String(song.track)
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (og.creators) {
|
|
for (const creator of og.creators){
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "music:creator",
|
|
content: String(creator)
|
|
}, i++));
|
|
}
|
|
}
|
|
break;
|
|
case 'music.radio_station':
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:type",
|
|
content: "music.radio_station"
|
|
}, i++));
|
|
if (og.creators) {
|
|
for (const creator of og.creators){
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "music:creator",
|
|
content: String(creator)
|
|
}, i++));
|
|
}
|
|
}
|
|
break;
|
|
case 'video.movie':
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:type",
|
|
content: "video.movie"
|
|
}, i++));
|
|
if (og.actors) {
|
|
for (const actor of og.actors){
|
|
if (typeof actor === 'string') {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "video:actor",
|
|
content: actor
|
|
}, i++));
|
|
} else {
|
|
if (actor.url) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "video:actor",
|
|
content: String(actor.url)
|
|
}, i++));
|
|
}
|
|
if (actor.role) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "video:actor:role",
|
|
content: actor.role
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (og.directors) {
|
|
for (const director of og.directors){
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "video:director",
|
|
content: String(director)
|
|
}, i++));
|
|
}
|
|
}
|
|
if (og.writers) {
|
|
for (const writer of og.writers){
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "video:writer",
|
|
content: String(writer)
|
|
}, i++));
|
|
}
|
|
}
|
|
if (og.duration != null) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "video:duration",
|
|
content: String(og.duration)
|
|
}, i++));
|
|
}
|
|
if (og.releaseDate) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "video:release_date",
|
|
content: og.releaseDate
|
|
}, i++));
|
|
}
|
|
if (og.tags) {
|
|
for (const tag of og.tags){
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "video:tag",
|
|
content: tag
|
|
}, i++));
|
|
}
|
|
}
|
|
break;
|
|
case 'video.episode':
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:type",
|
|
content: "video.episode"
|
|
}, i++));
|
|
if (og.actors) {
|
|
for (const actor of og.actors){
|
|
if (typeof actor === 'string') {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "video:actor",
|
|
content: actor
|
|
}, i++));
|
|
} else {
|
|
if (actor.url) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "video:actor",
|
|
content: String(actor.url)
|
|
}, i++));
|
|
}
|
|
if (actor.role) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "video:actor:role",
|
|
content: actor.role
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (og.directors) {
|
|
for (const director of og.directors){
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "video:director",
|
|
content: String(director)
|
|
}, i++));
|
|
}
|
|
}
|
|
if (og.writers) {
|
|
for (const writer of og.writers){
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "video:writer",
|
|
content: String(writer)
|
|
}, i++));
|
|
}
|
|
}
|
|
if (og.duration != null) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "video:duration",
|
|
content: String(og.duration)
|
|
}, i++));
|
|
}
|
|
if (og.releaseDate) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "video:release_date",
|
|
content: og.releaseDate
|
|
}, i++));
|
|
}
|
|
if (og.tags) {
|
|
for (const tag of og.tags){
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "video:tag",
|
|
content: tag
|
|
}, i++));
|
|
}
|
|
}
|
|
if (og.series) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "video:series",
|
|
content: String(og.series)
|
|
}, i++));
|
|
}
|
|
break;
|
|
case 'video.tv_show':
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:type",
|
|
content: "video.tv_show"
|
|
}, i++));
|
|
break;
|
|
case 'video.other':
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "og:type",
|
|
content: "video.other"
|
|
}, i++));
|
|
break;
|
|
default:
|
|
const _exhaustiveCheck = ogType;
|
|
throw Object.defineProperty(new Error(`Invalid OpenGraph type: ${_exhaustiveCheck}`), "__NEXT_ERROR_CODE", {
|
|
value: "E237",
|
|
enumerable: false,
|
|
configurable: true
|
|
});
|
|
}
|
|
}
|
|
}
|
|
// --- Twitter ---
|
|
if (metadata.twitter) {
|
|
var _tw_title;
|
|
const tw = metadata.twitter;
|
|
const { card } = tw;
|
|
if (card) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "twitter:card",
|
|
content: card
|
|
}, i++));
|
|
}
|
|
if (tw.site) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "twitter:site",
|
|
content: tw.site
|
|
}, i++));
|
|
}
|
|
if (tw.siteId) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "twitter:site:id",
|
|
content: tw.siteId
|
|
}, i++));
|
|
}
|
|
if (tw.creator) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "twitter:creator",
|
|
content: tw.creator
|
|
}, i++));
|
|
}
|
|
if (tw.creatorId) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "twitter:creator:id",
|
|
content: tw.creatorId
|
|
}, i++));
|
|
}
|
|
if ((_tw_title = tw.title) == null ? void 0 : _tw_title.absolute) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "twitter:title",
|
|
content: tw.title.absolute
|
|
}, i++));
|
|
}
|
|
if (tw.description) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "twitter:description",
|
|
content: tw.description
|
|
}, i++));
|
|
}
|
|
// Twitter images
|
|
if (tw.images) {
|
|
for (const image of tw.images){
|
|
if (typeof image === 'string') {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "twitter:image",
|
|
content: image
|
|
}, i++));
|
|
} else {
|
|
if (image.url) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "twitter:image",
|
|
content: String(image.url)
|
|
}, i++));
|
|
}
|
|
if (image.alt) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "twitter:image:alt",
|
|
content: image.alt
|
|
}, i++));
|
|
}
|
|
if (image.secureUrl) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "twitter:image:secure_url",
|
|
content: String(image.secureUrl)
|
|
}, i++));
|
|
}
|
|
if (image.type) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "twitter:image:type",
|
|
content: image.type
|
|
}, i++));
|
|
}
|
|
if (image.width) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "twitter:image:width",
|
|
content: String(image.width)
|
|
}, i++));
|
|
}
|
|
if (image.height) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "twitter:image:height",
|
|
content: String(image.height)
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// Twitter player cards
|
|
if (card === 'player') {
|
|
for (const player of tw.players){
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "twitter:player",
|
|
content: player.playerUrl.toString()
|
|
}, i++));
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "twitter:player:stream",
|
|
content: player.streamUrl.toString()
|
|
}, i++));
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "twitter:player:width",
|
|
content: String(player.width)
|
|
}, i++));
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: "twitter:player:height",
|
|
content: String(player.height)
|
|
}, i++));
|
|
}
|
|
}
|
|
// Twitter app cards
|
|
if (card === 'app') {
|
|
const { app } = tw;
|
|
for (const platform of [
|
|
'iphone',
|
|
'ipad',
|
|
'googleplay'
|
|
]){
|
|
var _app_url;
|
|
if (app.name) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: `twitter:app:name:${platform}`,
|
|
content: app.name
|
|
}, i++));
|
|
}
|
|
if (app.id[platform]) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: `twitter:app:id:${platform}`,
|
|
content: String(app.id[platform])
|
|
}, i++));
|
|
}
|
|
if ((_app_url = app.url) == null ? void 0 : _app_url[platform]) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
name: `twitter:app:url:${platform}`,
|
|
content: app.url[platform].toString()
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// --- App Links ---
|
|
if (metadata.appLinks) {
|
|
const appLinks = metadata.appLinks;
|
|
// iOS / iPhone / iPad (AppLinksApple: url, app_store_id, app_name)
|
|
if (appLinks.ios) {
|
|
for (const item of appLinks.ios){
|
|
if (item.url) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "al:ios:url",
|
|
content: String(item.url)
|
|
}, i++));
|
|
}
|
|
if (item.app_store_id) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "al:ios:app_store_id",
|
|
content: String(item.app_store_id)
|
|
}, i++));
|
|
}
|
|
if (item.app_name) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "al:ios:app_name",
|
|
content: item.app_name
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
if (appLinks.iphone) {
|
|
for (const item of appLinks.iphone){
|
|
if (item.url) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "al:iphone:url",
|
|
content: String(item.url)
|
|
}, i++));
|
|
}
|
|
if (item.app_store_id) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "al:iphone:app_store_id",
|
|
content: String(item.app_store_id)
|
|
}, i++));
|
|
}
|
|
if (item.app_name) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "al:iphone:app_name",
|
|
content: item.app_name
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
if (appLinks.ipad) {
|
|
for (const item of appLinks.ipad){
|
|
if (item.url) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "al:ipad:url",
|
|
content: String(item.url)
|
|
}, i++));
|
|
}
|
|
if (item.app_store_id) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "al:ipad:app_store_id",
|
|
content: String(item.app_store_id)
|
|
}, i++));
|
|
}
|
|
if (item.app_name) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "al:ipad:app_name",
|
|
content: item.app_name
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
// Android (AppLinksAndroid: package, url, class, app_name)
|
|
if (appLinks.android) {
|
|
for (const item of appLinks.android){
|
|
if (item.package) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "al:android:package",
|
|
content: item.package
|
|
}, i++));
|
|
}
|
|
if (item.url) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "al:android:url",
|
|
content: String(item.url)
|
|
}, i++));
|
|
}
|
|
if (item.class) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "al:android:class",
|
|
content: item.class
|
|
}, i++));
|
|
}
|
|
if (item.app_name) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "al:android:app_name",
|
|
content: item.app_name
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
// Windows Phone (AppLinksWindows: url, app_id, app_name)
|
|
if (appLinks.windows_phone) {
|
|
for (const item of appLinks.windows_phone){
|
|
if (item.url) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "al:windows_phone:url",
|
|
content: String(item.url)
|
|
}, i++));
|
|
}
|
|
if (item.app_id) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "al:windows_phone:app_id",
|
|
content: item.app_id
|
|
}, i++));
|
|
}
|
|
if (item.app_name) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "al:windows_phone:app_name",
|
|
content: item.app_name
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
// Windows (AppLinksWindows: url, app_id, app_name)
|
|
if (appLinks.windows) {
|
|
for (const item of appLinks.windows){
|
|
if (item.url) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "al:windows:url",
|
|
content: String(item.url)
|
|
}, i++));
|
|
}
|
|
if (item.app_id) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "al:windows:app_id",
|
|
content: item.app_id
|
|
}, i++));
|
|
}
|
|
if (item.app_name) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "al:windows:app_name",
|
|
content: item.app_name
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
// Windows Universal (AppLinksWindows: url, app_id, app_name)
|
|
if (appLinks.windows_universal) {
|
|
for (const item of appLinks.windows_universal){
|
|
if (item.url) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "al:windows_universal:url",
|
|
content: String(item.url)
|
|
}, i++));
|
|
}
|
|
if (item.app_id) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "al:windows_universal:app_id",
|
|
content: item.app_id
|
|
}, i++));
|
|
}
|
|
if (item.app_name) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "al:windows_universal:app_name",
|
|
content: item.app_name
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
// Web (AppLinksWeb: url, should_fallback)
|
|
if (appLinks.web) {
|
|
for (const item of appLinks.web){
|
|
if (item.url) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "al:web:url",
|
|
content: String(item.url)
|
|
}, i++));
|
|
}
|
|
if (item.should_fallback != null) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("meta", {
|
|
property: "al:web:should_fallback",
|
|
content: String(item.should_fallback)
|
|
}, i++));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// --- Icons ---
|
|
if (metadata.icons) {
|
|
const { shortcut, icon, apple, other } = metadata.icons;
|
|
const hasIcon = Boolean((shortcut == null ? void 0 : shortcut.length) || (icon == null ? void 0 : icon.length) || (apple == null ? void 0 : apple.length) || (other == null ? void 0 : other.length));
|
|
if (shortcut) {
|
|
for (const ic of shortcut){
|
|
const { url, rel, ...props } = ic;
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("link", {
|
|
rel: rel || 'shortcut icon',
|
|
href: url.toString(),
|
|
...props
|
|
}, i++));
|
|
}
|
|
}
|
|
if (icon) {
|
|
for (const ic of icon){
|
|
const { url, rel, ...props } = ic;
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("link", {
|
|
rel: rel || 'icon',
|
|
href: url.toString(),
|
|
...props
|
|
}, i++));
|
|
}
|
|
}
|
|
if (apple) {
|
|
for (const ic of apple){
|
|
const { url, rel, ...props } = ic;
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("link", {
|
|
rel: rel || 'apple-touch-icon',
|
|
href: url.toString(),
|
|
...props
|
|
}, i++));
|
|
}
|
|
}
|
|
if (other) {
|
|
for (const ic of other){
|
|
const { url, rel, ...props } = ic;
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("link", {
|
|
rel: rel || 'icon',
|
|
href: url.toString(),
|
|
...props
|
|
}, i++));
|
|
}
|
|
}
|
|
if (hasIcon) {
|
|
tags.push(/*#__PURE__*/ (0, _jsxruntime.jsx)(_iconmark.IconMark, {}, i++));
|
|
}
|
|
}
|
|
return tags;
|
|
}
|
|
|
|
//# sourceMappingURL=metadata.js.map
|