@lyra/base
Version:
Lyra plugin containing the base components and roles for a Lyra configuration
113 lines (90 loc) • 3.38 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _generateScriptLoader = require('../util/generateScriptLoader');
var _generateScriptLoader2 = _interopRequireDefault(_generateScriptLoader);
var _AppLoadingScreen = require('./AppLoadingScreen');
var _AppLoadingScreen2 = _interopRequireDefault(_AppLoadingScreen);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function assetUrl(staticPath, item) {
const isAbsolute = item.path.match(/^https?:\/\//);
if (isAbsolute) {
return item.path;
}
const base = `${staticPath}/${item.path}`;
if (!item.hash) {
return base;
}
const hasQuery = base.indexOf('?') !== -1;
const separator = hasQuery ? '&' : '?';
return `${base}${separator}${item.hash}`;
}
function Document(props) {
const basePath = props.basePath.replace(/\/+$/, '');
const staticPath = `${basePath}${props.staticPath}`;
const stylesheets = props.stylesheets.map(item => _react2.default.createElement('link', { key: item.path, rel: 'stylesheet', href: assetUrl(staticPath, item) }));
const subresources = props.scripts.map(item => _react2.default.createElement('link', { key: item.path, rel: 'subresource', href: assetUrl(staticPath, item) }));
const scripts = props.scripts.map(item => assetUrl(staticPath, item));
const scriptLoader = (0, _generateScriptLoader2.default)(scripts);
const favicons = props.favicons.map((item, index) => _react2.default.createElement('link', { key: item.path, rel: 'icon', href: assetUrl(staticPath, item) }));
return _react2.default.createElement(
'html',
null,
_react2.default.createElement(
'head',
null,
_react2.default.createElement('meta', { charSet: props.charset }),
_react2.default.createElement(
'title',
null,
props.title
),
_react2.default.createElement('meta', { name: 'viewport', content: props.viewport }),
stylesheets,
subresources,
favicons
),
_react2.default.createElement(
'body',
null,
_react2.default.createElement(
'div',
{ id: 'lyra' },
_react2.default.createElement(_AppLoadingScreen2.default, { text: props.loading })
),
_react2.default.createElement('script', { dangerouslySetInnerHTML: { __html: scriptLoader } })
)
);
}
const asset = _propTypes2.default.shape({
path: _propTypes2.default.string.isRequired,
hash: _propTypes2.default.string
});
Document.defaultProps = {
basePath: '',
charset: 'utf-8',
title: 'Lyra',
viewport: 'width=device-width, initial-scale=1',
loading: 'Please wait…',
staticPath: '/static',
favicons: [{ path: 'favicon.ico' }],
stylesheets: [],
scripts: []
};
Document.propTypes = {
basePath: _propTypes2.default.string,
charset: _propTypes2.default.string,
title: _propTypes2.default.string,
viewport: _propTypes2.default.string,
loading: _propTypes2.default.node,
staticPath: _propTypes2.default.string,
favicons: _propTypes2.default.arrayOf(asset),
stylesheets: _propTypes2.default.arrayOf(asset),
scripts: _propTypes2.default.arrayOf(asset)
};
exports.default = Document;