UNPKG

@tdb/web

Version:

Common condiguration for serving a web-site and testing web-based UI components.

147 lines (117 loc) 4.64 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.defaultHead = defaultHead; exports.default = void 0; var _set = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/set")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _sideEffect = _interopRequireDefault(require("./side-effect")); var Head = /*#__PURE__*/ function (_React$Component) { (0, _inherits2.default)(Head, _React$Component); function Head() { (0, _classCallCheck2.default)(this, Head); return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Head).apply(this, arguments)); } (0, _createClass2.default)(Head, [{ key: "render", value: function render() { return null; } }]); return Head; }(_react.default.Component); (0, _defineProperty2.default)(Head, "contextTypes", { headManager: _propTypes.default.object }); var NEXT_HEAD_IDENTIFIER = 'next-head'; function defaultHead() { var className = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : NEXT_HEAD_IDENTIFIER; return [_react.default.createElement("meta", { key: "charSet", charSet: "utf-8", className: className })]; } function reduceComponents(components) { return components.map(function (component) { return _react.default.Children.toArray(component.props.children); }).reduce(function (a, b) { return a.concat(b); }, []).reduce(function (a, b) { if (_react.default.Fragment && b.type === _react.default.Fragment) { return a.concat(_react.default.Children.toArray(b.props.children)); } return a.concat(b); }, []).reverse().concat(defaultHead('')).filter(Boolean).filter(unique()).reverse().map(function (c, i) { var className = (c.props && c.props.className ? c.props.className + ' ' : '') + NEXT_HEAD_IDENTIFIER; var key = c.key || i; return _react.default.cloneElement(c, { key: key, className: className }); }); } function mapOnServer(head) { return head; } function onStateChange(head) { if (this.context && this.context.headManager) { this.context.headManager.updateHead(head); } } var METATYPES = ['name', 'httpEquiv', 'charSet', 'itemProp', 'property']; var ALLOWED_DUPLICATES = ['article:tag', 'og:image', 'og:image:alt', 'og:image:width', 'og:image:height', 'og:image:type', 'og:image:secure_url', 'og:image:url']; /* returns a function for filtering head child elements which shouldn't be duplicated, like <title/>, except we explicit allow it in ALLOWED_DUPLICATES array */ function unique() { var keys = new _set.default(); var tags = new _set.default(); var metaTypes = new _set.default(); var metaCategories = {}; return function (h) { if (h.key && h.key.indexOf('.$') === 0) { if (keys.has(h.key)) return false; keys.add(h.key); } switch (h.type) { case 'title': case 'base': if (tags.has(h.type)) return false; tags.add(h.type); break; case 'meta': for (var i = 0, len = METATYPES.length; i < len; i++) { var metatype = METATYPES[i]; if (!h.props.hasOwnProperty(metatype)) continue; if (metatype === 'charSet') { if (metaTypes.has(metatype)) return false; metaTypes.add(metatype); } else { var category = h.props[metatype]; var categories = metaCategories[metatype] || new _set.default(); if (categories.has(category) && ALLOWED_DUPLICATES.indexOf(category) === -1) return false; categories.add(category); metaCategories[metatype] = categories; } } break; } return true; }; } var _default = (0, _sideEffect.default)(reduceComponents, onStateChange, mapOnServer)(Head); exports.default = _default;