UNPKG

gatsby-plugin-next-seo

Version:
563 lines (479 loc) 18.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.BaseSeo = exports.__resetDefaults = void 0; var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _reactHelmetAsync = require("react-helmet-async"); function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var BASE_DEFAULTS = { noindex: false, nofollow: false, defaultOpenGraphImageWidth: 0, defaultOpenGraphImageHeight: 0, defaultOpenGraphVideoWidth: 0, defaultOpenGraphVideoHeight: 0 }; var DEFAULTS = _objectSpread({}, BASE_DEFAULTS); /** * Reset all the defaults. * * @internal */ var __resetDefaults = function __resetDefaults() { DEFAULTS = _objectSpread({}, BASE_DEFAULTS); }; /** * This is the BaseSeo component which also takes in the default seo props. * * @remarks * * It should be used for setting default props and is used internally as the * base for the `GatsbySeo` component. * * ```tsx * import { BaseSeo } from 'gatsby-plugin-next-seo'; * * const Page = () => { * return ( * <> * <BaseSeo title='Fun times' defaultOpenGraphImageWidth={100} /> * <h1>Look at me!</h1> * </> * ); * }; * ``` * * @public */ exports.__resetDefaults = __resetDefaults; var BaseSeo = function BaseSeo(_ref) { var _props$noindex, _props$nofollow; var _ref$defer = _ref.defer, defer = _ref$defer === void 0 ? false : _ref$defer, _ref$metaTags = _ref.metaTags, metaTags = _ref$metaTags === void 0 ? [] : _ref$metaTags, _ref$linkTags = _ref.linkTags, linkTags = _ref$linkTags === void 0 ? [] : _ref$linkTags, props = (0, _objectWithoutProperties2["default"])(_ref, ["defer", "metaTags", "linkTags"]); var meta = []; var link = []; var noindex = ((_props$noindex = props.noindex) !== null && _props$noindex !== void 0 ? _props$noindex : DEFAULTS.noindex) || props.dangerouslySetAllPagesToNoIndex; var nofollow = ((_props$nofollow = props.nofollow) !== null && _props$nofollow !== void 0 ? _props$nofollow : DEFAULTS.nofollow) || props.dangerouslySetAllPagesToNoFollow; var indexTags = ['robots', 'googlebot']; if (noindex || nofollow) { if (props.dangerouslySetAllPagesToNoIndex) { DEFAULTS.noindex = true; } if (props.dangerouslySetAllPagesToNoFollow) { DEFAULTS.nofollow = true; } var _iterator = _createForOfIteratorHelper(indexTags), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var name = _step.value; meta.push({ name: name, content: "".concat(noindex ? 'noindex' : 'index', ",").concat(nofollow ? 'nofollow' : 'follow') }); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } } else { var _iterator2 = _createForOfIteratorHelper(indexTags), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var _name = _step2.value; meta.push({ name: _name, content: 'index,follow' }); } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } } if (props.description) { meta.push({ name: 'description', content: props.description }); } if (props.mobileAlternate) { link.push({ rel: 'alternate', media: props.mobileAlternate.media, href: props.mobileAlternate.href }); } if (props.languageAlternates && props.languageAlternates.length > 0) { props.languageAlternates.forEach(function (languageAlternate) { link.push({ rel: 'alternate', key: "languageAlternate-".concat(languageAlternate.hrefLang), hrefLang: languageAlternate.hrefLang, href: languageAlternate.href }); }); } if (props.twitter) { if (props.twitter.cardType) { meta.push({ name: 'twitter:card', content: props.twitter.cardType }); } if (props.twitter.site) { meta.push({ name: 'twitter:site', content: props.twitter.site }); } if (props.twitter.handle) { meta.push({ name: 'twitter:creator', content: props.twitter.handle }); } } if (props.facebook) { if (props.facebook.appId) { meta.push({ property: 'fb:app_id', content: props.facebook.appId }); } } if (props.openGraph) { var _props$openGraph$imag, _props$openGraph$vide5; if (props.openGraph.url || props.canonical) { var _props$openGraph$url; meta.push({ property: 'og:url', content: (_props$openGraph$url = props.openGraph.url) !== null && _props$openGraph$url !== void 0 ? _props$openGraph$url : props.canonical }); } if (props.openGraph.type) { var type = props.openGraph.type.toLowerCase(); meta.push({ property: 'og:type', content: type }); if (type === 'profile' && props.openGraph.profile) { if (props.openGraph.profile.firstName) { meta.push({ property: 'profile:first_name', content: props.openGraph.profile.firstName }); } if (props.openGraph.profile.lastName) { meta.push({ property: 'profile:last_name', content: props.openGraph.profile.lastName }); } if (props.openGraph.profile.username) { meta.push({ property: 'profile:username', content: props.openGraph.profile.username }); } if (props.openGraph.profile.gender) { meta.push({ property: 'profile:gender', content: props.openGraph.profile.gender }); } } else if (type === 'book' && props.openGraph.book) { var _props$openGraph$book, _props$openGraph$book2; if ((_props$openGraph$book = props.openGraph.book.authors) === null || _props$openGraph$book === void 0 ? void 0 : _props$openGraph$book.length) { props.openGraph.book.authors.forEach(function (author) { meta.push({ property: 'book:author', content: author }); }); } if (props.openGraph.book.isbn) { meta.push({ property: 'book:isbn', content: props.openGraph.book.isbn }); } if (props.openGraph.book.releaseDate) { meta.push({ property: 'book:release_date', content: props.openGraph.book.releaseDate }); } if ((_props$openGraph$book2 = props.openGraph.book.tags) === null || _props$openGraph$book2 === void 0 ? void 0 : _props$openGraph$book2.length) { props.openGraph.book.tags.forEach(function (tag) { meta.push({ property: 'book:tag', content: tag }); }); } } else if (type === 'article' && props.openGraph.article) { var _props$openGraph$arti, _props$openGraph$arti2; if (props.openGraph.article.publishedTime) { meta.push({ property: 'article:published_time', content: props.openGraph.article.publishedTime }); } if (props.openGraph.article.modifiedTime) { meta.push({ property: 'article:modified_time', content: props.openGraph.article.modifiedTime }); } if (props.openGraph.article.expirationTime) { meta.push({ property: 'article:expiration_time', content: props.openGraph.article.expirationTime }); } if ((_props$openGraph$arti = props.openGraph.article.authors) === null || _props$openGraph$arti === void 0 ? void 0 : _props$openGraph$arti.length) { props.openGraph.article.authors.forEach(function (author) { meta.push({ property: 'article:author', content: author }); }); } if (props.openGraph.article.section) { meta.push({ property: 'article:section', content: props.openGraph.article.section }); } if ((_props$openGraph$arti2 = props.openGraph.article.tags) === null || _props$openGraph$arti2 === void 0 ? void 0 : _props$openGraph$arti2.length) { props.openGraph.article.tags.forEach(function (tag) { meta.push({ property: 'article:tag', content: tag }); }); } } else if ((type === 'video.movie' || type === 'video.episode' || type === 'video.tv_show' || type === 'video.other') && props.openGraph.video) { var _props$openGraph$vide, _props$openGraph$vide2, _props$openGraph$vide3, _props$openGraph$vide4; if ((_props$openGraph$vide = props.openGraph.video.actors) === null || _props$openGraph$vide === void 0 ? void 0 : _props$openGraph$vide.length) { props.openGraph.video.actors.forEach(function (actor) { if (actor.profile) { meta.push({ property: 'video:actor', content: actor.profile }); } if (actor.role) { meta.push({ property: 'video:actor:role', content: actor.role }); } }); } if ((_props$openGraph$vide2 = props.openGraph.video.directors) === null || _props$openGraph$vide2 === void 0 ? void 0 : _props$openGraph$vide2.length) { props.openGraph.video.directors.forEach(function (director) { meta.push({ property: 'video:director', content: director }); }); } if ((_props$openGraph$vide3 = props.openGraph.video.writers) === null || _props$openGraph$vide3 === void 0 ? void 0 : _props$openGraph$vide3.length) { props.openGraph.video.writers.forEach(function (writer) { meta.push({ property: 'video:writer', content: writer }); }); } if (props.openGraph.video.duration) { meta.push({ property: 'video:duration', content: props.openGraph.video.duration.toString() }); } if (props.openGraph.video.releaseDate) { meta.push({ property: 'video:release_date', content: props.openGraph.video.releaseDate }); } if ((_props$openGraph$vide4 = props.openGraph.video.tags) === null || _props$openGraph$vide4 === void 0 ? void 0 : _props$openGraph$vide4.length) { props.openGraph.video.tags.forEach(function (tag) { meta.push({ property: 'video:tag', content: tag }); }); } if (props.openGraph.video.series) { meta.push({ property: 'video:series', content: props.openGraph.video.series }); } } } if (props.openGraph.title || props.title) { var _props$openGraph$titl, _props$titleTemplate, _props$title; meta.push({ property: 'og:title', content: (_props$openGraph$titl = props.openGraph.title) !== null && _props$openGraph$titl !== void 0 ? _props$openGraph$titl : ((_props$titleTemplate = props.titleTemplate) !== null && _props$titleTemplate !== void 0 ? _props$titleTemplate : '').replace('%s', (_props$title = props.title) !== null && _props$title !== void 0 ? _props$title : '') }); } if (props.openGraph.description || props.description) { var _props$openGraph$desc; meta.push({ property: 'og:description', content: (_props$openGraph$desc = props.openGraph.description) !== null && _props$openGraph$desc !== void 0 ? _props$openGraph$desc : props.description }); } // images if (props.defaultOpenGraphImageWidth) { DEFAULTS.defaultOpenGraphImageWidth = props.defaultOpenGraphImageWidth; } if (props.defaultOpenGraphImageHeight) { DEFAULTS.defaultOpenGraphImageHeight = props.defaultOpenGraphImageHeight; } if ((_props$openGraph$imag = props.openGraph.images) === null || _props$openGraph$imag === void 0 ? void 0 : _props$openGraph$imag.length) { props.openGraph.images.forEach(function (image) { meta.push({ property: 'og:image', content: image.url }); if (image.alt) { meta.push({ property: 'og:image:alt', content: image.alt }); } if (image.width) { meta.push({ property: 'og:image:width', content: image.width.toString() }); } else if (DEFAULTS.defaultOpenGraphImageWidth) { meta.push({ property: 'og:image:width', content: DEFAULTS.defaultOpenGraphImageWidth.toString() }); } if (image.height) { meta.push({ property: 'og:image:height', content: image.height.toString() }); } else if (DEFAULTS.defaultOpenGraphImageHeight) { meta.push({ property: 'og:image:height', content: DEFAULTS.defaultOpenGraphImageHeight.toString() }); } }); } // videos if (props.defaultOpenGraphVideoWidth) { DEFAULTS.defaultOpenGraphVideoWidth = props.defaultOpenGraphVideoWidth; } if (props.defaultOpenGraphVideoHeight) { DEFAULTS.defaultOpenGraphVideoHeight = props.defaultOpenGraphVideoHeight; } if ((_props$openGraph$vide5 = props.openGraph.videos) === null || _props$openGraph$vide5 === void 0 ? void 0 : _props$openGraph$vide5.length) { props.openGraph.videos.forEach(function (video) { meta.push({ property: 'og:video', content: video.url }); if (video.alt) { meta.push({ property: 'og:video:alt', content: video.alt }); } if (video.width) { meta.push({ property: 'og:video:width', content: video.width.toString() }); } else if (DEFAULTS.defaultOpenGraphVideoWidth) { meta.push({ property: 'og:video:width', content: DEFAULTS.defaultOpenGraphVideoWidth.toString() }); } if (video.height) { meta.push({ property: 'og:video:height', content: video.height.toString() }); } else if (DEFAULTS.defaultOpenGraphVideoHeight) { meta.push({ property: 'og:video:height', content: DEFAULTS.defaultOpenGraphVideoHeight.toString() }); } }); } if (props.openGraph.locale) { meta.push({ property: 'og:locale', content: props.openGraph.locale }); } if (props.openGraph.site_name) { meta.push({ property: 'og:site_name', content: props.openGraph.site_name }); } } if (props.canonical) { link.push({ rel: 'canonical', href: props.canonical, key: 'canonical' }); } metaTags.forEach(function (tag) { meta.push(tag); }); linkTags.forEach(function (tag) { link.push(tag); }); var htmlAttributes = props.language ? _objectSpread({ lang: props.language }, props.htmlAttributes) : _objectSpread({}, props.htmlAttributes); var helmetProps = { meta: meta, link: link, defer: defer, htmlAttributes: htmlAttributes }; if (props.title) { helmetProps['title'] = props.title; } if (props.titleTemplate) { helmetProps['titleTemplate'] = props.titleTemplate; } if (props.base) { helmetProps['base'] = props.base; } return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_reactHelmetAsync.Helmet, helmetProps)); }; exports.BaseSeo = BaseSeo;