UNPKG

@lyra/base

Version:

Lyra plugin containing the base components and roles for a Lyra configuration

189 lines (150 loc) 5.32 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _omit2 = require('lodash/omit'); var _omit3 = _interopRequireDefault(_omit2); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _semverCompare = require('semver-compare'); var _semverCompare2 = _interopRequireDefault(_semverCompare); var _lyraVersions = require('lyra:versions'); var _lyraVersions2 = _interopRequireDefault(_lyraVersions); var _fullscreen = require('part:@lyra/components/dialogs/fullscreen?'); var _fullscreen2 = _interopRequireDefault(_fullscreen); var _client = require('part:@lyra/base/client'); var _client2 = _interopRequireDefault(_client); var _FullscreenError = require('./FullscreenError'); var _FullscreenError2 = _interopRequireDefault(_FullscreenError); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const fakeOutdatedModule = false; const fakeOutdatedModuleSeverity = 'high'; let applySeverity = inp => inp; if (fakeOutdatedModule) { _lyraVersions2.default['@lyra/base'] = '0.118.0'; applySeverity = inp => { const mod = inp && inp.outdated.find(item => item.name === '@lyra/base') || {}; mod.severity = fakeOutdatedModuleSeverity; return inp; }; } const onIdle = typeof window.requestIdleCallback === 'function' ? window.requestIdleCallback : cb => setTimeout(cb, 0); // eslint-disable-next-line id-length const buildQueryString = () => ({ m: Object.keys(_lyraVersions2.default).map(pkg => `${pkg}@${_lyraVersions2.default[pkg]}`) }); const hashQuery = items => items.join(',').replace(/@?lyra[/-]/g, ''); const storage = typeof sessionStorage === 'undefined' ? {} : sessionStorage; const onVersionCheckError = err => { // eslint-disable-next-line no-console console.warn('Module versions check failed. Dependencies *might* be out of date.', err); }; const breakify = lines => { const nodes = []; for (let i = 0; i < lines.length; i++) { nodes.push(lines[i]); if (i !== lines.length - 1) { nodes.push(_react2.default.createElement('br', { key: i })); } } return nodes; }; const paragraphify = text => { return text.split('\n\n').map((para, i) => { const lines = para.split('\n'); // eslint-disable-next-line react/no-array-index-key return _react2.default.createElement( 'p', { key: i }, breakify(lines) ); }); }; const getLatestInstalled = () => { const versionNums = Object.keys(_lyraVersions2.default).map(pkg => _lyraVersions2.default[pkg]); const sorted = versionNums.sort(_semverCompare2.default); return sorted[sorted.length - 1]; }; const checkVersions = (options = {}) => { const getOutdated = options.getOutdated; const query = buildQueryString(); const hash = hashQuery(query.m); const local = storage.versionCheck && storage.versionCheck.indexOf(hash) === 0 && storage.versionCheck.slice(hash.length + 1); if (!getOutdated && local) { return Promise.resolve({ result: JSON.parse(local) }); } return _client2.default.request({ uri: '/versions', query: buildQueryString(), json: true }).then(result => ({ hash, result: applySeverity(result) })); }; class VersionChecker extends _react.PureComponent { constructor(...args) { super(...args); this.state = {}; this.onResponse = this.onResponse.bind(this); this.handleClose = this.handleClose.bind(this); } onResponse(res) { // Don't include outdated modules in the stored result const result = (0, _omit3.default)(res.result, ['outdated']); if (result.hash && storage) { storage.versionCheck = [res.hash, JSON.stringify(result)].join('|'); } // If we have unsupported modules, we want to show a dialog if (!result.isSupported) { this.setState({ result }); } if (__DEV__ && res.result && res.result.outdated) { const modules = res.result.outdated.map(mod => mod.name).join('\n - '); const instructions = 'Run `lyra upgrade` to update them'; // eslint-disable-next-line no-console console.warn(`The following modules are outdated:\n - ${modules}\n\n${instructions}`); } } handleClose() { this.setState({ result: null }); } componentDidMount() { onIdle(() => { checkVersions().then(this.onResponse).catch(onVersionCheckError); }); } render() { const result = this.state.result; if (!result || result.isSupported || result.isSupported === undefined) { return null; } const Dialog = _fullscreen2.default || _FullscreenError2.default; const title = 'Unsupported module versions'; return _react2.default.createElement( Dialog, { centered: true, isOpen: true, color: 'danger', title: title, onClose: this.handleClose }, paragraphify(result.message || ''), result.helpUrl && _react2.default.createElement( 'p', null, 'For more information, please read', ' ', _react2.default.createElement( 'a', { href: result.helpUrl }, result.helpUrl ) ) ); } } VersionChecker.checkVersions = checkVersions; VersionChecker.getLatestInstalled = getLatestInstalled; exports.default = VersionChecker;