UNPKG

react-super-seo

Version:

The React SEO component that handles metadata so you don't have to. Supports Google, OpenGraph, Twitter, and beyond. 🚀

1,065 lines (1,064 loc) • 33.9 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SuperSEO = void 0; const React = __importStar(require("react")); const react_helmet_1 = require("react-helmet"); /** * See documentation: [SuperSEO](https://justinmahar.github.io/react-super-seo/?path=/story/components-superseo--docs) * * An SEO component that adds a `title`, `description`, [OpenGraph](https://ogp.me/), and [Twitter Cards](https://developer.twitter.com/en/docs/tweets/optimize-with-cards/overview/abouts-cards) meta properties to the `head`. * * Also supports adding an [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) `lang` attribute to the `html` element. * * Uses sensible fallbacks where possible and features automatic [MIME type inference](https://justinmahar.github.io/react-super-seo/?path=/story/docs-list-of-mime-types--docs) for media URLs. */ function SuperSEO(props) { const title = props.title; const description = props.description; const lang = props.lang; const titleElement = title ? React.createElement("title", null, title) : undefined; const htmlAttributes = lang ? { lang } : undefined; const meta = []; if (description) { meta.push({ name: 'description', content: description, }); } meta.push(...createOpenGraphMetadataObjects(props.openGraph, title, description)); meta.push(...createTwitterMetadataObjects(props.twitter, title, description)); meta.push(...createGoogleMetadataObjects(props.google)); // Additional meta properties if (props.robots) { meta.push({ name: 'robots', content: props.robots, }); } if (props.googlebot) { meta.push({ name: 'googlebot', content: props.googlebot, }); } if (props.googleSiteVerification) { meta.push({ name: 'google-site-verification', content: props.googleSiteVerification, }); } if (props.viewport) { meta.push({ name: 'viewport', content: props.viewport, }); } if (props.rating) { meta.push({ name: 'rating', content: props.rating, }); } return (React.createElement(React.Fragment, null, React.createElement(react_helmet_1.Helmet, null, props.contentType && React.createElement("meta", { httpEquiv: "content-type", content: props.contentType }), props.charset && React.createElement("meta", { charSet: props.charset })), React.createElement(react_helmet_1.Helmet, { htmlAttributes: htmlAttributes, meta: meta }, titleElement), typeof props.children !== 'undefined' && React.createElement(react_helmet_1.Helmet, null, props.children))); } exports.SuperSEO = SuperSEO; function createOpenGraphMetadataObjects(data, fallbackTitle, fallbackDescription) { data = data ? data : {}; const meta = []; // og:title if (data.ogTitle) { meta.push({ property: 'og:title', content: data.ogTitle, }); } else if (fallbackTitle) { meta.push({ property: 'og:title', content: fallbackTitle, }); } // og:type meta.push({ property: 'og:type', content: data.ogType ? data.ogType : 'website', }); if (data.ogType) { switch (data.ogType) { case 'article': meta.push(...createOpenGraphTypeArticleMetadataObjects(data.ogTypeObject)); break; case 'book': meta.push(...createOpenGraphTypeBookMetadataObjects(data.ogTypeObject)); break; case 'profile': meta.push(...createOpenGraphTypeProfileMetadataObjects(data.ogTypeObject)); break; case 'website': // No additional properties needed for website. break; default: // Otherwise, assume they provided MetaPropertiesFunction themselves. if (data.ogTypeObject) { const metaPropsFunction = data.ogTypeObject; if (typeof metaPropsFunction === 'function') { meta.push(...metaPropsFunction()); } } break; } } // og:image if (data.ogImage) { const images = Array.isArray(data.ogImage) ? data.ogImage : [data.ogImage]; images.forEach((image) => { meta.push(...createOpenGraphImageMetadataObjects(image)); }); } // END og:image // og:url if (data.ogUrl) { meta.push({ property: 'og:url', content: data.ogUrl, }); } // END og:url // og:audio if (data.ogAudio) { const audios = Array.isArray(data.ogAudio) ? data.ogAudio : [data.ogAudio]; audios.forEach((audio) => { meta.push(...createOpenGraphAudioMetadataObjects(audio)); }); } // END og:audio // og:description if (data.ogDescription) { meta.push({ property: 'og:description', content: data.ogDescription, }); } else if (fallbackDescription) { meta.push({ property: 'og:description', content: fallbackDescription, }); } // END og:description // og:determiner if (data.ogDeterminer) { meta.push({ property: 'og:determiner', content: data.ogDeterminer, }); } // END og:determiner // og:locale if (data.ogLocale) { meta.push({ property: 'og:locale', content: data.ogLocale, }); } // END og:locale // og:locale:alternate if (data.ogLocaleAlternate) { data.ogLocaleAlternate.forEach((localeAlternate) => { meta.push({ property: 'og:locale:alternate', content: localeAlternate, }); }); } // END og:locale:alternate // og:site_name if (data.ogSiteName) { meta.push({ property: 'og:site_name', content: data.ogSiteName, }); } // END og:site_name // og:video if (data.ogVideo) { const videos = Array.isArray(data.ogVideo) ? data.ogVideo : [data.ogVideo]; videos.forEach((video) => { meta.push(...createOpenGraphVideoMetadataObjects(video)); }); } // END og:video // fb:app_id if (data.fbAppId) { meta.push({ property: 'fb:app_id', content: data.fbAppId, }); } // END fb:app_id return meta; } function createOpenGraphImageMetadataObjects(image) { if (!image) { return []; } const meta = []; if (image.ogImage) { // og:image meta.push({ property: 'og:image', content: image.ogImage, }); // og:image:url meta.push({ property: 'og:image:url', content: image.ogImage, }); // og:image:secure_url if (image.ogImageSecureUrl) { meta.push({ property: 'og:image:secure_url', content: image.ogImageSecureUrl, }); } else if (image.ogImage.startsWith('https')) { // If the link is already secure, supply it. meta.push({ property: 'og:image:secure_url', content: image.ogImage, }); } // og:image:type if (image.ogImageType) { meta.push({ property: 'og:image:type', content: image.ogImageType, }); } else { // If not specified, infer the MIME type for common image formats const mimeTypes = { '.art': 'image/x-jg', '.bm': 'image/bmp', '.bmp': 'image/bmp', '.dwg': 'image/vnd.dwg', '.dxf': 'image/vnd.dwg', '.fif': 'image/fif', '.flo': 'image/florian', '.fpx': 'image/vnd.fpx', '.g3': 'image/g3fax', '.gif': 'image/gif', '.ico': 'image/x-icon', '.ief': 'image/ief', '.iefs': 'image/ief', '.jfif': 'image/jpeg', '.jfif-tbnl': 'image/jpeg', '.jpe': 'image/jpeg', '.jpeg': 'image/jpeg', '.jpg': 'image/jpeg', '.jps': 'image/x-jps', '.jut': 'image/jutvision', '.mcf': 'image/vasa', '.nap': 'image/naplps', '.naplps': 'image/naplps', '.nif': 'image/x-niff', '.niff': 'image/x-niff', '.pbm': 'image/x-portable-bitmap', '.pct': 'image/x-pict', '.pcx': 'image/x-pcx', '.pgm': 'image/x-portable-graymap', '.pic': 'image/pict', '.pict': 'image/pict', '.pm': 'image/x-xpixmap', '.png': 'image/png', '.pnm': 'image/x-portable-anymap', '.ppm': 'image/x-portable-pixmap', '.qif': 'image/x-quicktime', '.qti': 'image/x-quicktime', '.qtif': 'image/x-quicktime', '.ras': 'image/cmu-raster', '.rast': 'image/cmu-raster', '.rf': 'image/vnd.rn-realflash', '.rgb': 'image/x-rgb', '.rp': 'image/vnd.rn-realpix', '.svf': 'image/vnd.dwg', '.tif': 'image/tiff', '.tiff': 'image/tiff', '.turbot': 'image/florian', '.wbmp': 'image/vnd.wap.wbmp', '.webp': 'image/webp', '.x-png': 'image/png', '.xbm': 'image/xbm', '.xif': 'image/vnd.xiff', '.xpm': 'image/xpm', '.xwd': 'image/x-xwd', }; const mimeTypeKeys = Object.keys(mimeTypes); for (let i = 0; i < mimeTypeKeys.length; i++) { const extension = mimeTypeKeys[i]; if (image && image.ogImage && image.ogImage.endsWith(extension)) { meta.push({ property: 'og:image:type', content: mimeTypes[extension], }); break; } } } // og:image:width if (image.ogImageWidth) { meta.push({ property: 'og:image:width', content: image.ogImageWidth + '', }); } // og:image:height if (image.ogImageHeight) { meta.push({ property: 'og:image:height', content: image.ogImageHeight + '', }); } // og:image:alt if (image.ogImageAlt) { meta.push({ property: 'og:image:alt', content: image.ogImageAlt, }); } } return meta; } function createOpenGraphVideoMetadataObjects(video) { if (!video) { return []; } const meta = []; if (video.ogVideo) { // og:video meta.push({ property: 'og:video', content: video.ogVideo, }); // og:video:url meta.push({ property: 'og:video:url', content: video.ogVideo, }); // og:video:secure_url if (video.ogVideoSecureUrl) { meta.push({ property: 'og:video:secure_url', content: video.ogVideoSecureUrl, }); } else if (video.ogVideo.startsWith('https')) { // If the link is already secure, supply it. meta.push({ property: 'og:video:secure_url', content: video.ogVideo, }); } // og:video:type if (video.ogVideoType) { meta.push({ property: 'og:video:type', content: video.ogVideoType, }); } else { // If not specified, infer the MIME type for common video formats const mimeTypes = { '.ts': 'video/MP2T', '.webm': 'video/webm', '.3gp': 'video/3gpp', '.afl': 'video/animaflex', '.asf': 'video/x-ms-asf', '.asx': 'video/x-ms-asf', '.avi': 'video/avi', '.avs': 'video/avs-video', '.dif': 'video/x-dv', '.dl': 'video/dl', '.dv': 'video/x-dv', '.fli': 'video/fli', '.flv': 'video/x-flv', '.fmf': 'video/x-atomic3d-feature', '.gl': 'video/gl', '.isu': 'video/x-isvideo', '.m1v': 'video/mpeg', '.m2v': 'video/mpeg', '.m3u8': 'application/x-mpegURL', '.m4a': 'video/mp4', '.m4b': 'video/mp4', '.m4p': 'video/mp4', '.m4r': 'video/mp4', '.m4v': 'video/mp4', '.mjpg': 'video/x-motion-jpeg', '.moov': 'video/quicktime', '.mov': 'video/quicktime', '.movie': 'video/x-sgi-movie', '.mp2': 'video/mpeg', '.mp3': 'video/mpeg', '.mp4': 'video/mp4', '.mpa': 'video/mpeg', '.mpe': 'video/mpeg', '.mpeg': 'video/mpeg', '.mpg': 'video/mpeg', '.mv': 'video/x-sgi-movie', '.ogg': 'video/ogg', '.qt': 'video/quicktime', '.qtc': 'video/x-qtc', '.rv': 'video/vnd.rn-realvideo', '.scm': 'video/x-scm', '.vdo': 'video/vdo', '.viv': 'video/vivo', '.vivo': 'video/vivo', '.vos': 'video/vosaic', '.wmv': 'video/x-ms-wmv', '.xdr': 'video/x-amt-demorun', '.xsr': 'video/x-amt-showrun', }; const mimeTypeKeys = Object.keys(mimeTypes); for (let i = 0; i < mimeTypeKeys.length; i++) { const extension = mimeTypeKeys[i]; if (video && video.ogVideo && video.ogVideo.endsWith(extension)) { meta.push({ property: 'og:video:type', content: mimeTypes[extension], }); break; } } } // og:video:width if (video.ogVideoWidth) { meta.push({ property: 'og:video:width', content: video.ogVideoWidth + '', }); } // og:video:height if (video.ogVideoHeight) { meta.push({ property: 'og:video:height', content: video.ogVideoHeight + '', }); } } return meta; } function createOpenGraphAudioMetadataObjects(audio) { if (!audio) { return []; } const meta = []; if (audio.ogAudio) { // og:audio meta.push({ property: 'og:audio', content: audio.ogAudio, }); // og:audio:url meta.push({ property: 'og:audio:url', content: audio.ogAudio, }); // og:audio:secure_url if (audio.ogAudioSecureUrl) { meta.push({ property: 'og:audio:secure_url', content: audio.ogAudioSecureUrl, }); } else if (audio.ogAudio.startsWith('https')) { // If the link is already secure, supply it. meta.push({ property: 'og:audio:secure_url', content: audio.ogAudio, }); } // og:audio:type if (audio.ogAudioType) { meta.push({ property: 'og:audio:type', content: audio.ogAudioType, }); } else { // If not specified, infer the MIME type for common audio formats const mimeTypes = { '.aac': 'audio/aac', '.aif': 'audio/aiff', '.aifc': 'audio/aiff', '.aiff': 'audio/aiff', '.au': 'audio/basic', '.funk': 'audio/make', '.gsd': 'audio/x-gsm', '.gsm': 'audio/x-gsm', '.it': 'audio/it', '.jam': 'audio/x-jam', '.kar': 'audio/midi', '.la': 'audio/nspaudio', '.lam': 'audio/x-liveaudio', '.lma': 'audio/nspaudio', '.m2a': 'audio/mpeg', '.m3u': 'audio/x-mpequrl', '.mid': 'audio/midi', '.midi': 'audio/midi', '.mjf': 'audio/x-vnd.audioexplosion.mjuicemediafile', '.mod': 'audio/mod', '.mp2': 'audio/mpeg', '.mp3': 'audio/mpeg3', '.mp4': 'audio/mp4', '.mpa': 'audio/mpeg', '.mpg': 'audio/mpeg', '.mpga': 'audio/mpeg', '.my': 'audio/make', '.oga': 'audio/ogg', '.pfunk': 'audio/make', '.qcp': 'audio/vnd.qcelp', '.ra': 'audio/x-pn-realaudio', '.ram': 'audio/x-pn-realaudio', '.rm': 'audio/x-pn-realaudio', '.rmi': 'audio/mid', '.rmm': 'audio/x-pn-realaudio', '.rmp': 'audio/x-pn-realaudio', '.rpm': 'audio/x-pn-realaudio-plugin', '.s3m': 'audio/s3m', '.sid': 'audio/x-psid', '.snd': 'audio/basic', '.tsi': 'audio/tsp-audio', '.tsp': 'audio/tsplayer', '.voc': 'audio/voc', '.vox': 'audio/voxware', '.vqe': 'audio/x-twinvq-plugin', '.vqf': 'audio/x-twinvq', '.vql': 'audio/x-twinvq-plugin', '.wav': 'audio/wav', '.weba': 'audio/webm', '.xm': 'audio/xm', }; const mimeTypeKeys = Object.keys(mimeTypes); for (let i = 0; i < mimeTypeKeys.length; i++) { const extension = mimeTypeKeys[i]; if (audio && audio.ogAudio && audio.ogAudio.endsWith(extension)) { meta.push({ property: 'og:audio:type', content: mimeTypes[extension], }); break; } } } } return meta; } function createOpenGraphTypeArticleMetadataObjects(article) { if (!article) { return []; } const meta = []; // article:published_time if (article.articlePublishedTime) { meta.push({ property: 'article:published_time', content: article.articlePublishedTime, }); } // article:modified_time if (article.articleModifiedTime) { meta.push({ property: 'article:modified_time', content: article.articleModifiedTime, }); } // article:expiration_time if (article.articleExpirationTime) { meta.push({ property: 'article:expiration_time', content: article.articleExpirationTime, }); } // article:author if (article.articleAuthor) { article.articleAuthor.forEach((authorUri) => { meta.push({ property: 'article:author', content: authorUri, }); }); } // article:section if (article.articleSection) { meta.push({ property: 'article:section', content: article.articleSection, }); } // article:tag if (article.articleTag) { article.articleTag.forEach((tag) => { meta.push({ property: 'article:tag', content: tag, }); }); } return meta; } function createOpenGraphTypeBookMetadataObjects(book) { if (!book) { return []; } const meta = []; // book:author if (book.bookAuthor) { book.bookAuthor.forEach((authorUri) => { meta.push({ property: 'book:author', content: authorUri, }); }); } // book:isbn if (book.bookIsbn) { meta.push({ property: 'book:isbn', content: book.bookIsbn, }); } // book:release_date if (book.bookReleaseDate) { meta.push({ property: 'book:release_date', content: book.bookReleaseDate, }); } // book:tag if (book.bookTag) { book.bookTag.forEach((tag) => { meta.push({ property: 'book:tag', content: tag, }); }); } return meta; } function createOpenGraphTypeProfileMetadataObjects(profile) { if (!profile) { return []; } const meta = []; // profile:first_name if (profile.profileFirstName) { meta.push({ property: 'profile:first_name', content: profile.profileFirstName, }); } // profile:last_name if (profile.profileLastName) { meta.push({ property: 'profile:last_name', content: profile.profileLastName, }); } // profile:username if (profile.profileUsername) { meta.push({ property: 'profile:username', content: profile.profileUsername, }); } // profile:gender if (profile.profileGender) { meta.push({ property: 'profile:gender', content: profile.profileGender, }); } return meta; } function createTwitterMetadataObjects(data, fallbackTitle, fallbackDescription) { if (!data) { return []; } const meta = []; if (data.twitterSummaryCard) { meta.push(...createTwitterSummaryCardMetadataObjects(data.twitterSummaryCard, fallbackTitle, fallbackDescription)); } if (data.twitterSummaryCardWithLargeImage) { meta.push(...createTwitterSummaryCardWithLargeImageMetadataObjects(data.twitterSummaryCardWithLargeImage, fallbackTitle, fallbackDescription)); } if (data.twitterPlayerCard) { meta.push(...createTwitterPlayerCardMetadataObjects(data.twitterPlayerCard, fallbackTitle, fallbackDescription)); } if (data.twitterAppCard) { meta.push(...createTwitterAppCardMetadataObjects(data.twitterAppCard, fallbackTitle, fallbackDescription)); } return meta; } function createTwitterSummaryCardMetadataObjects(summaryCard, fallbackTitle, fallbackDescription) { if (!summaryCard) { return []; } const meta = []; // twitter:card meta.push({ property: 'twitter:card', content: 'summary', }); // twitter:site if (summaryCard.summaryCardSiteUsername) { meta.push({ property: 'twitter:site', content: summaryCard.summaryCardSiteUsername, }); } // twitter:title if (summaryCard.summaryCardTitle) { meta.push({ property: 'twitter:title', content: summaryCard.summaryCardTitle, }); } else if (fallbackTitle) { meta.push({ property: 'twitter:title', content: fallbackTitle, }); } // twitter:description if (summaryCard.summaryCardDescription) { meta.push({ property: 'twitter:description', content: summaryCard.summaryCardDescription, }); } else if (fallbackDescription) { meta.push({ property: 'twitter:description', content: fallbackDescription, }); } // twitter:image if (summaryCard.summaryCardImage) { meta.push({ property: 'twitter:image', content: summaryCard.summaryCardImage, }); } // twitter:image:alt if (summaryCard.summaryCardImageAlt) { meta.push({ property: 'twitter:image:alt', content: summaryCard.summaryCardImageAlt, }); } return meta; } function createTwitterSummaryCardWithLargeImageMetadataObjects(summaryCard, fallbackTitle, fallbackDescription) { if (!summaryCard) { return []; } const meta = []; // twitter:card meta.push({ property: 'twitter:card', content: 'summary_large_image', }); // twitter:site if (summaryCard.summaryCardSiteUsername) { meta.push({ property: 'twitter:site', content: summaryCard.summaryCardSiteUsername, }); } // twitter:title if (summaryCard.summaryCardTitle) { meta.push({ property: 'twitter:title', content: summaryCard.summaryCardTitle, }); } else if (fallbackTitle) { meta.push({ property: 'twitter:title', content: fallbackTitle, }); } // twitter:description if (summaryCard.summaryCardDescription) { meta.push({ property: 'twitter:description', content: summaryCard.summaryCardDescription, }); } else if (fallbackDescription) { meta.push({ property: 'twitter:description', content: fallbackDescription, }); } // twitter:image if (summaryCard.summaryCardImage) { meta.push({ property: 'twitter:image', content: summaryCard.summaryCardImage, }); } // twitter:image:alt if (summaryCard.summaryCardImageAlt) { meta.push({ property: 'twitter:image:alt', content: summaryCard.summaryCardImageAlt, }); } return meta; } function createTwitterPlayerCardMetadataObjects(playerCard, fallbackTitle, fallbackDescription) { if (!playerCard) { return []; } const meta = []; // twitter:card meta.push({ property: 'twitter:card', content: 'player', }); // twitter:title if (playerCard.playerCardTitle) { meta.push({ property: 'twitter:title', content: playerCard.playerCardTitle, }); } else if (fallbackTitle) { meta.push({ property: 'twitter:title', content: fallbackTitle, }); } // twitter:site if (playerCard.playerCardSiteUsername) { meta.push({ property: 'twitter:site', content: playerCard.playerCardSiteUsername, }); } // twitter:description if (playerCard.playerCardDescription) { meta.push({ property: 'twitter:description', content: playerCard.playerCardDescription, }); } else if (fallbackDescription) { meta.push({ property: 'twitter:description', content: fallbackDescription, }); } // twitter:player if (playerCard.playerCardPlayer) { meta.push({ property: 'twitter:player', content: playerCard.playerCardPlayer, }); } // twitter:player:width if (playerCard.playerCardPlayerWidth) { meta.push({ property: 'twitter:player:width', content: playerCard.playerCardPlayerWidth + '', }); } // twitter:player:height if (playerCard.playerCardPlayerHeight) { meta.push({ property: 'twitter:player:height', content: playerCard.playerCardPlayerHeight + '', }); } // twitter:image if (playerCard.playerCardImage) { meta.push({ property: 'twitter:image', content: playerCard.playerCardImage, }); } // twitter:image:alt if (playerCard.playerCardImageAlt) { meta.push({ property: 'twitter:image:alt', content: playerCard.playerCardImageAlt, }); } return meta; } function createTwitterAppCardMetadataObjects(appCard, fallbackTitle, fallbackDescription) { if (!appCard) { return []; } const meta = []; // twitter:card meta.push({ property: 'twitter:card', content: 'app', }); // twitter:site if (appCard.appCardSiteUsername) { meta.push({ property: 'twitter:site', content: appCard.appCardSiteUsername, }); } // twitter:app:name:iphone if (appCard.appCardAppNameIphone) { meta.push({ property: 'twitter:app:name:iphone', content: appCard.appCardAppNameIphone, }); } else if (fallbackTitle && (appCard.appCardAppIdIphone || appCard.appCardAppUrlIphone)) { // Use fallback title if they gave iphone details but left out the title. meta.push({ property: 'twitter:app:name:iphone', content: fallbackTitle, }); } // twitter:app:name:ipad if (appCard.appCardAppNameIpad) { meta.push({ property: 'twitter:app:name:ipad', content: appCard.appCardAppNameIpad, }); } else if (fallbackTitle && (appCard.appCardAppIdIpad || appCard.appCardAppUrlIpad)) { // Use fallback title if they gave ipad details but left out the title. meta.push({ property: 'twitter:app:name:ipad', content: fallbackTitle, }); } // twitter:app:name:googleplay if (appCard.appCardAppNameGoogleplay) { meta.push({ property: 'twitter:app:name:googleplay', content: appCard.appCardAppNameGoogleplay, }); } else if (fallbackTitle && (appCard.appCardAppIdGoogleplay || appCard.appCardAppUrlGoogleplay)) { // Use fallback title if they gave googleplay details but left out the title. meta.push({ property: 'twitter:app:name:googleplay', content: fallbackTitle, }); } // twitter:description if (appCard.appCardDescription) { meta.push({ property: 'twitter:description', content: appCard.appCardDescription, }); } else if (fallbackDescription) { meta.push({ property: 'twitter:description', content: fallbackDescription, }); } // twitter:app:id:iphone if (appCard.appCardAppIdIphone) { meta.push({ property: 'twitter:app:id:iphone', content: appCard.appCardAppIdIphone, }); } // twitter:app:id:ipad if (appCard.appCardAppIdIpad) { meta.push({ property: 'twitter:app:id:ipad', content: appCard.appCardAppIdIpad, }); } // twitter:app:id:googleplay if (appCard.appCardAppIdGoogleplay) { meta.push({ property: 'twitter:app:id:googleplay', content: appCard.appCardAppIdGoogleplay, }); } // twitter:app:url:iphone if (appCard.appCardAppUrlIphone) { meta.push({ property: 'twitter:app:url:iphone', content: appCard.appCardAppUrlIphone, }); } // twitter:app:url:ipad if (appCard.appCardAppUrlIpad) { meta.push({ property: 'twitter:app:url:ipad', content: appCard.appCardAppUrlIpad, }); } // twitter:app:country if (appCard.appCardAppCountry) { meta.push({ property: 'twitter:app:country', content: appCard.appCardAppCountry, }); } // twitter:app:url:googleplay if (appCard.appCardAppUrlGoogleplay) { meta.push({ property: 'twitter:app:url:googleplay', content: appCard.appCardAppUrlGoogleplay, }); } return meta; } function createGoogleMetadataObjects(data) { data = data ? data : {}; const meta = []; if (data.noSiteLinksSearchBox) { meta.push({ property: 'google', content: 'nositelinkssearchbox', }); } if (data.noTranslate) { meta.push({ property: 'google', content: 'notranslate', }); } if (data.noPageReadAloud) { meta.push({ property: 'google', content: 'nopagereadaloud', }); } return meta; }