UNPKG

gambit

Version:

A hyper-thin library to help building API driven redux apps

90 lines (68 loc) 2.95 kB
'use strict'; var _assign = require('babel-runtime/core-js/object/assign'); var _assign2 = _interopRequireDefault(_assign); var _map = require('babel-runtime/core-js/map'); var _map2 = _interopRequireDefault(_map); var _react = require('react'); var _react2 = _interopRequireDefault(_react); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var errorPlaceholder = _react2.default.createElement('noscript', null); // https://gist.github.com/Psykar/d01f6e6e9575926768123ff7af82fd11 function logError(Component, error) { var errorMsg = 'Error while rendering component. Check render() method of component \'' + (Component.displayName || Component.name || '[unidentified]') + '\'.'; console.error(errorMsg, 'Error details:', error); // eslint-disable-line } function monkeypatchRender(prototype) { if (prototype && prototype.render && !prototype.render.__handlingErrors) { (function () { var originalRender = prototype.render; prototype.render = function monkeypatchedRender() { try { return originalRender.call(this); } catch (error) { logError(prototype.constructor, error); return errorPlaceholder; } }; prototype.render.__handlingErrors = true; // flag render method so it's not wrapped multiple times })(); } } var originalCreateElement = _react2.default.createElement; var statelessMap = new _map2.default(); _react2.default.createElement = function (Component) { for (var _len = arguments.length, rest = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { rest[_key - 1] = arguments[_key]; } if (typeof Component === 'function') { if (typeof Component.prototype.render === 'function') { monkeypatchRender(Component.prototype); } // stateless functional component if (!Component.prototype.render) { (function () { var originalStatelessComponent = Component; if (statelessMap.has(originalStatelessComponent)) { Component = statelessMap.get(originalStatelessComponent); } else { Component = function Component() { try { return originalStatelessComponent.apply(undefined, arguments); } catch (error) { logError(originalStatelessComponent, error); return errorPlaceholder; } }; (0, _assign2.default)(Component, originalStatelessComponent); statelessMap.set(originalStatelessComponent, Component); } })(); } } return originalCreateElement.call.apply(originalCreateElement, [_react2.default, Component].concat(rest)); }; // allowing hot reload var originalForceUpdate = _react2.default.Component.prototype.forceUpdate; _react2.default.Component.prototype.forceUpdate = function monkeypatchedForceUpdate() { monkeypatchRender(this); originalForceUpdate.call(this); };