@tdb/web
Version:
Common condiguration for serving a web-site and testing web-based UI components.
147 lines (117 loc) • 4.64 kB
JavaScript
;
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;