react-seomatic
Version:
Renders SEOmatic data for a Next.js app.
433 lines (410 loc) • 12.9 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var React = require('react');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
function ownKeys(object, enumerableOnly) {
var keys = Object.keys(object);
if (Object.getOwnPropertySymbols) {
var symbols = Object.getOwnPropertySymbols(object);
enumerableOnly && (symbols = symbols.filter(function (sym) {
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
})), keys.push.apply(keys, symbols);
}
return keys;
}
function _objectSpread2(target) {
for (var i = 1; i < arguments.length; i++) {
var source = null != arguments[i] ? arguments[i] : {};
i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
_defineProperty(target, key, source[key]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
});
}
return target;
}
function _defineProperty(obj, key, value) {
key = _toPropertyKey(key);
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _objectWithoutPropertiesLoose(source, excluded) {
if (source == null) return {};
var target = {};
var sourceKeys = Object.keys(source);
var key, i;
for (i = 0; i < sourceKeys.length; i++) {
key = sourceKeys[i];
if (excluded.indexOf(key) >= 0) continue;
target[key] = source[key];
}
return target;
}
function _objectWithoutProperties(source, excluded) {
if (source == null) return {};
var target = _objectWithoutPropertiesLoose(source, excluded);
var key, i;
if (Object.getOwnPropertySymbols) {
var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
for (i = 0; i < sourceSymbolKeys.length; i++) {
key = sourceSymbolKeys[i];
if (excluded.indexOf(key) >= 0) continue;
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
target[key] = source[key];
}
}
return target;
}
function _toPrimitive(input, hint) {
if (typeof input !== "object" || input === null) return input;
var prim = input[Symbol.toPrimitive];
if (prim !== undefined) {
var res = prim.call(input, hint || "default");
if (typeof res !== "object") return res;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (hint === "string" ? String : Number)(input);
}
function _toPropertyKey(arg) {
var key = _toPrimitive(arg, "string");
return typeof key === "symbol" ? key : String(key);
}
var _excluded = ["children", "Head"];
/**
* Renders SEOmatic `<head>` and `<body>` tags.
*
* @example
* <body>
* <!-- ... -->
* <Seomatic {...pageProps.entry.seomatic} />
* </body>
*
* @example
* // Next.js
* <body>
* <!-- ... -->
* <Seomatic Head={Head} {...pageProps.entry.seomatic} />
* </body>
*
* @param {Class|function|null} Head
* @param {string|null} metaJsonLdContainer
* @param {string|null} metaLinkContainer
* @param {string|null} metaScriptContainer
* @param {string|null} metaTagContainer
* @param {string|null} metaTitleContainer
* @returns {JSX.Element}
* @constructor
*/
function Seomatic(_ref) {
var Head = _ref.Head,
metaJsonLdContainer = _ref.metaJsonLdContainer,
metaLinkContainer = _ref.metaLinkContainer,
metaScriptContainer = _ref.metaScriptContainer,
metaTagContainer = _ref.metaTagContainer,
metaTitleContainer = _ref.metaTitleContainer;
return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(SeomaticHead, {
Head: Head,
metaJsonLdContainer: metaJsonLdContainer,
metaLinkContainer: metaLinkContainer,
metaScriptContainer: metaScriptContainer,
metaTagContainer: metaTagContainer,
metaTitleContainer: metaTitleContainer
}), /*#__PURE__*/React__default["default"].createElement(SeomaticBody, {
metaScriptContainer: metaScriptContainer
}));
}
/**
* Renders SEOmatic `<head>` tags.
*
* @example
* <head>
* <SeomaticHead {...pageProps.entry.seomatic} />
* </head>
*
* @example
* // Next.js
* <SeomaticHead Head={Head} {...pageProps.entry.seomatic} />
*
* @param {Class|function|null} Head
* @param {string|null} metaJsonLdContainer
* @param {string|null} metaLinkContainer
* @param {string|null} metaScriptContainer
* @param {string|null} metaTagContainer
* @param {string|null} metaTitleContainer
* @returns {JSX.Element}
* @constructor
*/
function SeomaticHead(_ref2) {
var Head = _ref2.Head,
metaJsonLdContainer = _ref2.metaJsonLdContainer,
metaLinkContainer = _ref2.metaLinkContainer,
metaScriptContainer = _ref2.metaScriptContainer,
metaTagContainer = _ref2.metaTagContainer,
metaTitleContainer = _ref2.metaTitleContainer;
return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(SeomaticMetaJsonLd, {
Head: Head,
metaJsonLdContainer: metaJsonLdContainer
}), /*#__PURE__*/React__default["default"].createElement(SeomaticMetaLinks, {
Head: Head,
metaLinkContainer: metaLinkContainer
}), /*#__PURE__*/React__default["default"].createElement(SeomaticMetaScripts, {
Head: Head,
metaScriptContainer: metaScriptContainer
}), /*#__PURE__*/React__default["default"].createElement(SeomaticMetaTags, {
Head: Head,
metaTagContainer: metaTagContainer
}), /*#__PURE__*/React__default["default"].createElement(SeomaticMetaTitle, {
Head: Head,
metaTitleContainer: metaTitleContainer
}));
}
/**
* Renders SEOmatic `<body>` tags.
*
* @example
* <body>
* <!-- ... -->
* <SeomaticBody {...pageProps.entry.seomatic} />
* </body>
*
* @param {string|null} metaScriptContainer
* @returns {JSX.Element}
* @constructor
*/
function SeomaticBody(_ref3) {
var metaScriptContainer = _ref3.metaScriptContainer;
return /*#__PURE__*/React__default["default"].createElement(SeomaticMetaBodyScripts, {
metaScriptContainer: metaScriptContainer
});
}
/**
* Renders SEOmatic’s `metaJsonLdContainer` value.
* @param {Class|function|null} Head
* @param {string|null} metaJsonLdContainer
* @returns {JSX.Element|null}
* @constructor
*/
function SeomaticMetaJsonLd(_ref4) {
var Head = _ref4.Head,
metaJsonLdContainer = _ref4.metaJsonLdContainer;
if (!metaJsonLdContainer) {
return null;
}
var container = JSON.parse(metaJsonLdContainer);
if (!container.mainEntityOfPage) {
return null;
}
return /*#__PURE__*/React__default["default"].createElement(HeadWrapper, {
Head: Head
}, /*#__PURE__*/React__default["default"].createElement("script", {
key: "metaJsonLdContainer.mainEntityOfPage",
type: "application/ld+json",
dangerouslySetInnerHTML: {
__html: JSON.stringify(container.mainEntityOfPage)
}
}));
}
/**
* Renders SEOmatic’s `metaLinkContainer` value.
* @param {Class|function|null} Head
* @param {string|null} metaLinkContainer
* @returns {JSX.Element|null}
* @constructor
*/
function SeomaticMetaLinks(_ref5) {
var Head = _ref5.Head,
metaLinkContainer = _ref5.metaLinkContainer;
if (!metaLinkContainer) {
return null;
}
return /*#__PURE__*/React__default["default"].createElement(HeadTagsWrapper, {
container: JSON.parse(metaLinkContainer),
Head: Head,
type: "link"
});
}
/**
* Renders SEOmatic’s `metaScriptContainer` value.
* @param {Class|function|null} Head
* @param {string|null} metaScriptContainer
* @returns {JSX.Element[]|null}
* @constructor
*/
function SeomaticMetaScripts(_ref6) {
var Head = _ref6.Head,
metaScriptContainer = _ref6.metaScriptContainer;
if (!metaScriptContainer) {
return null;
}
var container = JSON.parse(metaScriptContainer);
return Object.entries(container).map(function (entry, index) {
if (!entry[0] || !entry[1]) {
return null;
}
var key = entry[0];
var script = entry[1].script;
if (!script) {
return null;
}
return /*#__PURE__*/React__default["default"].createElement(HeadWrapper, {
key: index,
Head: Head
}, /*#__PURE__*/React__default["default"].createElement("script", {
key: key,
dangerouslySetInnerHTML: {
__html: script
}
}));
});
}
/**
* Renders SEOmatic’s `metaScriptContainer` value.
* @param {string|null} metaScriptContainer
* @returns {JSX.Element[]|null}
* @constructor
*/
function SeomaticMetaBodyScripts(_ref7) {
var metaScriptContainer = _ref7.metaScriptContainer;
if (!metaScriptContainer) {
return null;
}
var container = JSON.parse(metaScriptContainer);
return Object.entries(container).map(function (entry) {
if (!entry[0] || !entry[1]) {
return null;
}
var key = entry[0];
var bodyScript = entry[1].bodyScript;
if (!bodyScript) {
return null;
}
return /*#__PURE__*/React__default["default"].createElement("div", {
key: key,
style: {
display: "none !important"
},
dangerouslySetInnerHTML: {
__html: bodyScript
}
});
});
}
/**
* Renders SEOmatic’s `metaTagContainer` value.
* @param {Class|function|null} Head
* @param {string|null} metaTagContainer
* @returns {JSX.Element|null}
* @constructor
*/
function SeomaticMetaTags(_ref8) {
var Head = _ref8.Head,
metaTagContainer = _ref8.metaTagContainer;
if (!metaTagContainer) {
return null;
}
return /*#__PURE__*/React__default["default"].createElement(HeadTagsWrapper, {
container: JSON.parse(metaTagContainer),
Head: Head,
type: "meta"
});
}
/**
* Renders SEOmatic’s `metaTitleContainer` value.
* @param {Class|function|null} Head
* @param {string|null} metaTitleContainer
* @returns {JSX.Element|null}
* @constructor
*/
function SeomaticMetaTitle(_ref9) {
var Head = _ref9.Head,
metaTitleContainer = _ref9.metaTitleContainer;
if (!metaTitleContainer) {
return null;
}
var container = JSON.parse(metaTitleContainer);
if (!container || !container.title || !container.title.title) {
return null;
}
return /*#__PURE__*/React__default["default"].createElement(HeadWrapper, {
Head: Head
}, /*#__PURE__*/React__default["default"].createElement("title", null, container.title.title));
}
/**
* Enables support for `next/head` via the `Head` property.
* @param children
* @param Head
* @param props
* @returns {JSX.Element|*}
* @constructor
*/
function HeadWrapper(_ref10) {
var children = _ref10.children,
Head = _ref10.Head,
props = _objectWithoutProperties(_ref10, _excluded);
if (Head) {
return /*#__PURE__*/React__default["default"].createElement(Head, props, children);
}
return children;
}
/**
* Parses a container object and renders out head tags (i.e. `link` or `meta`).
* @param {Class|function|null} Head
* @param {Object} container
* @param string|null type
* @returns {Object[]}
* @constructor
*/
function HeadTagsWrapper(_ref11) {
var Head = _ref11.Head,
container = _ref11.container,
type = _ref11.type;
return Object.entries(container).flatMap(function (entry) {
var key = entry[0];
var props = entry[1];
// Check that we actually have values before proceeding
if (!key && !props) {
return null;
}
// If `props` isn’t an array we can assume it’s an object
if (!Array.isArray(props)) {
return _objectSpread2({
key: key
}, props);
}
// If `props` is an array, make sure that there’s at least 1 to process
if (props.length === 0) {
return null;
}
// Loop through and create index suffixed keys for each
return props.map(function (props, index) {
return _objectSpread2({
key: "".concat(key).concat(index)
}, props);
});
}).map(function (props, index) {
return props && /*#__PURE__*/React__default["default"].createElement(HeadWrapper, {
key: index,
Head: Head
}, /*#__PURE__*/React__default["default"].createElement(type, props));
});
}
exports.Seomatic = Seomatic;
exports.SeomaticBody = SeomaticBody;
exports.SeomaticHead = SeomaticHead;
exports.SeomaticMetaBodyScripts = SeomaticMetaBodyScripts;
exports.SeomaticMetaJsonLd = SeomaticMetaJsonLd;
exports.SeomaticMetaLinks = SeomaticMetaLinks;
exports.SeomaticMetaScripts = SeomaticMetaScripts;
exports.SeomaticMetaTags = SeomaticMetaTags;
exports.SeomaticMetaTitle = SeomaticMetaTitle;
//# sourceMappingURL=index.js.map