gatsby-plugin-next-seo
Version:
SEO plugin for Gatsby projects
563 lines (479 loc) • 18.8 kB
JavaScript
"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;