apeman-react-head
Version:
apeman react package for head component.
189 lines (172 loc) • 17.7 kB
JavaScript
/**
* apeman react package for head component.
* @class ApHead
*/
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _stringcase = require('stringcase');
var _stringcase2 = _interopRequireDefault(_stringcase);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/** @lends ApHead */
var ApHead = _react2.default.createClass({
displayName: 'ApHead',
// --------------------
// Specs
// --------------------
propTypes: {
/** CharSet */
charset: _react.PropTypes.string,
/** Document Title */
title: _react.PropTypes.string,
/** Favicon */
icon: _react.PropTypes.string,
/** Meta data */
meta: _react.PropTypes.oneOfType([_react.PropTypes.arrayOf(_react.PropTypes.object), _react.PropTypes.object]),
/** Micro data settings */
itemProps: _react.PropTypes.oneOfType([_react.PropTypes.arrayOf(_react.PropTypes.object), _react.PropTypes.object]),
/** CSS file urls */
css: _react.PropTypes.array,
/** JS file urls */
js: _react.PropTypes.array,
/** Version string */
version: _react.PropTypes.string,
/** Querystring key for version */
versionKey: _react.PropTypes.string,
/** Global variables */
globals: _react.PropTypes.object,
/** View port settings */
viewport: _react.PropTypes.object
},
mixins: [],
statics: {
renderCharset: function renderCharset(charset) {
if (!charset) {
return null;
}
return _react2.default.createElement('meta', { className: 'ap-head-meta', charSet: charset });
},
renderTitle: function renderTitle(title) {
if (!title) {
return null;
}
return _react2.default.createElement(
'title',
{ className: 'ap-head-title' },
title
);
},
renderIcon: function renderIcon(url, query) {
if (!url) {
return null;
}
return _react2.default.createElement('link', { rel: 'icon', href: ApHead._addQuery(url, query) });
},
renderMetaValues: function renderMetaValues(values) {
if (!values) {
return null;
}
return [].concat(values).map(function (values, i) {
return Object.keys(values).map(function (name, j) {
return _react2.default.createElement('meta', { name: name,
content: values[name],
key: 'meta-' + i + '-' + j });
});
}).reduce(function (a, b) {
return [].concat(a, b);
}, []);
},
renderItemProps: function renderItemProps(values) {
if (!values) {
return null;
}
return [].concat(values).map(function (values, i) {
return Object.keys(values).map(function (name, j) {
return _react2.default.createElement('meta', { itemProp: name,
content: values[name],
key: 'item-prop' + i + '-' + j });
});
}).reduce(function (a, b) {
return [].concat(a, b);
}, []);
},
renderCss: function renderCss(urls, query) {
if (!urls) {
return null;
}
return [].concat(urls).map(function (url, i) {
return _react2.default.createElement('link', { rel: 'stylesheet',
type: 'text/css',
key: 'css-' + i + '-' + url,
href: ApHead._addQuery(url, query) });
});
},
renderJs: function renderJs(urls, query) {
if (!urls) {
return null;
}
return [].concat(urls).map(function (url, i) {
return _react2.default.createElement('script', { type: 'text/javascript',
key: 'js-' + i + '-' + url,
src: ApHead._addQuery(url, query) });
});
},
renderGlobals: function renderGlobals(values) {
var _stringify = function _stringify(data) {
return data ? JSON.stringify(data || {}) : "null";
};
return Object.keys(values || {}).map(function (key, i) {
return _react2.default.createElement('script', { type: 'text/javascript',
key: 'global-' + i + '-' + key,
dangerouslySetInnerHTML: { __html: 'window.' + key + '=' + _stringify(values[key]) } });
});
},
renderViewPort: function renderViewPort(values) {
var content = Object.keys(values || {}).map(function (key) {
return [_stringcase2.default.spinalcase(key), values[key]].join('=');
}).join(',');
return _react2.default.createElement('meta', { name: 'viewport', content: content });
},
_addQuery: function _addQuery(url, query) {
var joiner = /\?/.test(url) ? '&' : '?';
return [url, query].join(joiner);
}
},
getInitialState: function getInitialState() {
return {};
},
getDefaultProps: function getDefaultProps() {
return {
version: 'unknown',
versionKey: 'v',
viewport: {
width: 'device-width',
initialScale: '1.0'
}
};
},
render: function render() {
var s = this;
var props = s.props;
var query = [props.versionKey, props.version].join('=');
return _react2.default.createElement(
'head',
{ className: 'ap-head' },
ApHead.renderCharset(props.charset),
ApHead.renderTitle(props.title),
ApHead.renderMetaValues(props.meta),
ApHead.renderItemProps(props.itemProps),
ApHead.renderIcon(props.icon, query),
ApHead.renderJs(props.js, query),
ApHead.renderCss(props.css, query),
ApHead.renderGlobals(props.globals),
ApHead.renderViewPort(props.viewport),
props.children
);
}
});
exports.default = ApHead;
//# sourceMappingURL=data:application/json;base64,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O0FBQ1IsUUFBTSxJQUFJLElBQVY7QUFEUSxRQUVGLEtBRkUsR0FFUSxDQUZSLENBRUYsS0FGRTs7O0FBSVIsUUFBSSxRQUFRLENBQUUsTUFBTSxVQUFSLEVBQW9CLE1BQU0sT0FBMUIsRUFBb0MsSUFBcEMsQ0FBeUMsR0FBekMsQ0FBWjtBQUNBLFdBQ0U7QUFBQTtNQUFBLEVBQU0sV0FBVSxTQUFoQjtNQUNJLE9BQU8sYUFBUCxDQUFxQixNQUFNLE9BQTNCLENBREo7TUFFSSxPQUFPLFdBQVAsQ0FBbUIsTUFBTSxLQUF6QixDQUZKO01BR0ksT0FBTyxnQkFBUCxDQUF3QixNQUFNLElBQTlCLENBSEo7TUFJSSxPQUFPLGVBQVAsQ0FBdUIsTUFBTSxTQUE3QixDQUpKO01BS0ksT0FBTyxVQUFQLENBQWtCLE1BQU0sSUFBeEIsRUFBOEIsS0FBOUIsQ0FMSjtNQU1JLE9BQU8sUUFBUCxDQUFnQixNQUFNLEVBQXRCLEVBQTBCLEtBQTFCLENBTko7TUFPSSxPQUFPLFNBQVAsQ0FBaUIsTUFBTSxHQUF2QixFQUE0QixLQUE1QixDQVBKO01BUUksT0FBTyxhQUFQLENBQXFCLE1BQU0sT0FBM0IsQ0FSSjtNQVNJLE9BQU8sY0FBUCxDQUFzQixNQUFNLFFBQTVCLENBVEo7TUFVSSxNQUFNO0FBVlYsS0FERjtBQWNEO0FBcks4QixDQUFsQixDQUFmOztrQkF3S2UsTSIsImZpbGUiOiJhcF9oZWFkLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9va3VuaXNoaW5pc2hpL1Byb2plY3RzL2FwZW1hbi1wcm9qZWN0cy9hcGVtYW4tcmVhY3QtaGVhZC9saWIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGFwZW1hbiByZWFjdCBwYWNrYWdlIGZvciBoZWFkIGNvbXBvbmVudC5cbiAqIEBjbGFzcyBBcEhlYWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzIGFzIHR5cGVzfSBmcm9tICdyZWFjdCdcbmltcG9ydCBzdHJpbmdjYXNlIGZyb20gJ3N0cmluZ2Nhc2UnXG5cbi8qKiBAbGVuZHMgQXBIZWFkICovXG5jb25zdCBBcEhlYWQgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFNwZWNzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJvcFR5cGVzOiB7XG4gICAgLyoqIENoYXJTZXQgKi9cbiAgICBjaGFyc2V0OiB0eXBlcy5zdHJpbmcsXG4gICAgLyoqIERvY3VtZW50IFRpdGxlICovXG4gICAgdGl0bGU6IHR5cGVzLnN0cmluZyxcbiAgICAvKiogRmF2aWNvbiAqL1xuICAgIGljb246IHR5cGVzLnN0cmluZyxcbiAgICAvKiogTWV0YSBkYXRhICovXG4gICAgbWV0YTogdHlwZXMub25lT2ZUeXBlKFtcbiAgICAgIHR5cGVzLmFycmF5T2YodHlwZXMub2JqZWN0KSxcbiAgICAgIHR5cGVzLm9iamVjdFxuICAgIF0pLFxuICAgIC8qKiBNaWNybyBkYXRhIHNldHRpbmdzICovXG4gICAgaXRlbVByb3BzOiB0eXBlcy5vbmVPZlR5cGUoW1xuICAgICAgdHlwZXMuYXJyYXlPZih0eXBlcy5vYmplY3QpLFxuICAgICAgdHlwZXMub2JqZWN0XG4gICAgXSksXG4gICAgLyoqIENTUyBmaWxlIHVybHMgKi9cbiAgICBjc3M6IHR5cGVzLmFycmF5LFxuICAgIC8qKiBKUyBmaWxlIHVybHMgKi9cbiAgICBqczogdHlwZXMuYXJyYXksXG4gICAgLyoqIFZlcnNpb24gc3RyaW5nICovXG4gICAgdmVyc2lvbjogdHlwZXMuc3RyaW5nLFxuICAgIC8qKiBRdWVyeXN0cmluZyBrZXkgZm9yIHZlcnNpb24gKi9cbiAgICB2ZXJzaW9uS2V5OiB0eXBlcy5zdHJpbmcsXG4gICAgLyoqIEdsb2JhbCB2YXJpYWJsZXMgKi9cbiAgICBnbG9iYWxzOiB0eXBlcy5vYmplY3QsXG4gICAgLyoqIFZpZXcgcG9ydCBzZXR0aW5ncyAqL1xuICAgIHZpZXdwb3J0OiB0eXBlcy5vYmplY3RcbiAgfSxcblxuICBtaXhpbnM6IFtdLFxuXG4gIHN0YXRpY3M6IHtcbiAgICByZW5kZXJDaGFyc2V0IChjaGFyc2V0KSB7XG4gICAgICBpZiAoIWNoYXJzZXQpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxtZXRhIGNsYXNzTmFtZT1cImFwLWhlYWQtbWV0YVwiIGNoYXJTZXQ9e2NoYXJzZXR9Lz5cbiAgICAgIClcbiAgICB9LFxuICAgIHJlbmRlclRpdGxlICh0aXRsZSkge1xuICAgICAgaWYgKCF0aXRsZSkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPHRpdGxlIGNsYXNzTmFtZT1cImFwLWhlYWQtdGl0bGVcIj57dGl0bGV9PC90aXRsZT5cbiAgICAgIClcbiAgICB9LFxuICAgIHJlbmRlckljb24gKHVybCwgcXVlcnkpIHtcbiAgICAgIGlmICghdXJsKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8bGluayByZWw9XCJpY29uXCIgaHJlZj17IEFwSGVhZC5fYWRkUXVlcnkodXJsLCBxdWVyeSkgfS8+XG4gICAgICApXG4gICAgfSxcbiAgICByZW5kZXJNZXRhVmFsdWVzICh2YWx1ZXMpIHtcbiAgICAgIGlmICghdmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICByZXR1cm4gW10uY29uY2F0KHZhbHVlcykubWFwKCh2YWx1ZXMsIGkpID0+XG4gICAgICAgIE9iamVjdC5rZXlzKHZhbHVlcykubWFwKChuYW1lLCBqKSA9PlxuICAgICAgICAgIDxtZXRhIG5hbWU9eyBuYW1lIH1cbiAgICAgICAgICAgICAgICBjb250ZW50PXsgdmFsdWVzW25hbWVdIH1cbiAgICAgICAgICAgICAgICBrZXk9eyBgbWV0YS0ke2l9LSR7an1gIH0vPlxuICAgICAgICApXG4gICAgICApLnJlZHVjZSgoYSwgYikgPT4gW10uY29uY2F0KGEsIGIpLCBbXSlcbiAgICB9LFxuICAgIHJlbmRlckl0ZW1Qcm9wcyAodmFsdWVzKSB7XG4gICAgICBpZiAoIXZhbHVlcykge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgICAgcmV0dXJuIFtdLmNvbmNhdCh2YWx1ZXMpLm1hcCgodmFsdWVzLCBpKSA9PlxuICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZXMpLm1hcCgobmFtZSwgaikgPT5cbiAgICAgICAgICA8bWV0YSBpdGVtUHJvcD17IG5hbWUgfVxuICAgICAgICAgICAgICAgIGNvbnRlbnQ9eyB2YWx1ZXNbbmFtZV0gfVxuICAgICAgICAgICAgICAgIGtleT17IGBpdGVtLXByb3Ake2l9LSR7an1gIH0vPlxuICAgICAgICApXG4gICAgICApLnJlZHVjZSgoYSwgYikgPT4gW10uY29uY2F0KGEsIGIpLCBbXSlcbiAgICB9LFxuICAgIHJlbmRlckNzcyAodXJscywgcXVlcnkpIHtcbiAgICAgIGlmICghdXJscykge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgICAgcmV0dXJuIFtdLmNvbmNhdCh1cmxzKS5tYXAoKHVybCwgaSkgPT5cbiAgICAgICAgPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0L2Nzc1wiXG4gICAgICAgICAgICAgIGtleT17IGBjc3MtJHtpfS0ke3VybH1gIH1cbiAgICAgICAgICAgICAgaHJlZj17IEFwSGVhZC5fYWRkUXVlcnkodXJsLCBxdWVyeSkgfS8+XG4gICAgICApXG4gICAgfSxcbiAgICByZW5kZXJKcyAodXJscywgcXVlcnkpIHtcbiAgICAgIGlmICghdXJscykge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgICAgcmV0dXJuIFtdLmNvbmNhdCh1cmxzKS5tYXAoKHVybCwgaSkgPT5cbiAgICAgICAgPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCJcbiAgICAgICAgICAgICAgICBrZXk9eyBganMtJHtpfS0ke3VybH1gIH1cbiAgICAgICAgICAgICAgICBzcmM9eyBBcEhlYWQuX2FkZFF1ZXJ5KHVybCxxdWVyeSl9Pjwvc2NyaXB0PlxuICAgICAgKVxuICAgIH0sXG4gICAgcmVuZGVyR2xvYmFscyAodmFsdWVzKSB7XG4gICAgICBsZXQgX3N0cmluZ2lmeSA9IChkYXRhKSA9PiBkYXRhID8gSlNPTi5zdHJpbmdpZnkoZGF0YSB8fCB7fSkgOiBcIm51bGxcIlxuXG4gICAgICByZXR1cm4gT2JqZWN0LmtleXModmFsdWVzIHx8IHt9KS5tYXAoKGtleSwgaSkgPT5cbiAgICAgICAgPHNjcmlwdCB0eXBlPVwidGV4dC9qYXZhc2NyaXB0XCJcbiAgICAgICAgICAgICAgICBrZXk9eyBgZ2xvYmFsLSR7aX0tJHtrZXl9YCB9XG4gICAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e1xuICAgICAgICAgICAgICAgICAgICB7X19odG1sOiBgd2luZG93LiR7a2V5fT0ke19zdHJpbmdpZnkodmFsdWVzW2tleV0pfWB9XG4gICAgICAgICAgICAgICAgICAgIH0+PC9zY3JpcHQ+XG4gICAgICApXG4gICAgfSxcbiAgICByZW5kZXJWaWV3UG9ydCAodmFsdWVzKSB7XG4gICAgICBsZXQgY29udGVudCA9IE9iamVjdC5rZXlzKHZhbHVlcyB8fCB7fSkubWFwKChrZXkpID0+XG4gICAgICAgIFsgc3RyaW5nY2FzZS5zcGluYWxjYXNlKGtleSksIHZhbHVlc1sga2V5IF0gXS5qb2luKCc9JylcbiAgICAgICkuam9pbignLCcpXG4gICAgICByZXR1cm4gPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD17IGNvbnRlbnQgfS8+XG4gICAgfSxcbiAgICBfYWRkUXVlcnkgKHVybCwgcXVlcnkpIHtcbiAgICAgIGxldCBqb2luZXIgPSAvXFw/Ly50ZXN0KHVybCkgPyAnJicgOiAnPydcbiAgICAgIHJldHVybiBbIHVybCwgcXVlcnkgXS5qb2luKGpvaW5lcilcbiAgICB9XG4gIH0sXG5cbiAgZ2V0SW5pdGlhbFN0YXRlICgpIHtcbiAgICByZXR1cm4ge31cbiAgfSxcblxuICBnZXREZWZhdWx0UHJvcHMgKCkge1xuICAgIHJldHVybiB7XG4gICAgICB2ZXJzaW9uOiAndW5rbm93bicsXG4gICAgICB2ZXJzaW9uS2V5OiAndicsXG4gICAgICB2aWV3cG9ydDoge1xuICAgICAgICB3aWR0aDogJ2RldmljZS13aWR0aCcsXG4gICAgICAgIGluaXRpYWxTY2FsZTogJzEuMCdcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCBzID0gdGhpc1xuICAgIGxldCB7IHByb3BzIH0gPSBzXG5cbiAgICBsZXQgcXVlcnkgPSBbIHByb3BzLnZlcnNpb25LZXksIHByb3BzLnZlcnNpb24gXS5qb2luKCc9JylcbiAgICByZXR1cm4gKFxuICAgICAgPGhlYWQgY2xhc3NOYW1lPVwiYXAtaGVhZFwiPlxuICAgICAgICB7IEFwSGVhZC5yZW5kZXJDaGFyc2V0KHByb3BzLmNoYXJzZXQpIH1cbiAgICAgICAgeyBBcEhlYWQucmVuZGVyVGl0bGUocHJvcHMudGl0bGUpIH1cbiAgICAgICAgeyBBcEhlYWQucmVuZGVyTWV0YVZhbHVlcyhwcm9wcy5tZXRhKSB9XG4gICAgICAgIHsgQXBIZWFkLnJlbmRlckl0ZW1Qcm9wcyhwcm9wcy5pdGVtUHJvcHMpIH1cbiAgICAgICAgeyBBcEhlYWQucmVuZGVySWNvbihwcm9wcy5pY29uLCBxdWVyeSkgfVxuICAgICAgICB7IEFwSGVhZC5yZW5kZXJKcyhwcm9wcy5qcywgcXVlcnkpIH1cbiAgICAgICAgeyBBcEhlYWQucmVuZGVyQ3NzKHByb3BzLmNzcywgcXVlcnkpIH1cbiAgICAgICAgeyBBcEhlYWQucmVuZGVyR2xvYmFscyhwcm9wcy5nbG9iYWxzKSB9XG4gICAgICAgIHsgQXBIZWFkLnJlbmRlclZpZXdQb3J0KHByb3BzLnZpZXdwb3J0KSB9XG4gICAgICAgIHsgcHJvcHMuY2hpbGRyZW4gfVxuICAgICAgPC9oZWFkPlxuICAgIClcbiAgfVxufSlcblxuZXhwb3J0IGRlZmF1bHQgQXBIZWFkXG4iXX0=