gambit
Version:
A hyper-thin library to help building API driven redux apps
90 lines (68 loc) • 2.95 kB
JavaScript
;
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);
};