UNPKG

infrastructure-components

Version:

Infrastructure-Components configure the infrastructure of your React-App as part of your React-Components.

212 lines (153 loc) • 6.39 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('react')) : typeof define === 'function' && define.amd ? define(['react'], factory) : (global.withSideEffect = factory(global.React)); }(this, (function (React) { 'use strict'; var React__default = 'default' in React ? React['default'] : React; function createCommonjsModule(fn, module) { return module = { exports: {} }, fn(module, module.exports), module.exports; } var exenv = createCommonjsModule(function (module) { /*! Copyright (c) 2015 Jed Watson. Based on code that is Copyright 2013-2015, Facebook, Inc. All rights reserved. */ /* global define */ (function () { var canUseDOM = !!( typeof window !== 'undefined' && window.document && window.document.createElement ); var ExecutionEnvironment = { canUseDOM: canUseDOM, canUseWorkers: typeof Worker !== 'undefined', canUseEventListeners: canUseDOM && !!(window.addEventListener || window.attachEvent), canUseViewport: canUseDOM && !!window.screen }; if (typeof undefined === 'function' && typeof undefined.amd === 'object' && undefined.amd) { undefined(function () { return ExecutionEnvironment; }); } else if ('object' !== 'undefined' && module.exports) { module.exports = ExecutionEnvironment; } else { window.ExecutionEnvironment = ExecutionEnvironment; } }()); }); var shallowequal = function shallowEqual(objA, objB, compare, compareContext) { var ret = compare ? compare.call(compareContext, objA, objB) : void 0; if(ret !== void 0) { return !!ret; } if(objA === objB) { return true; } if(typeof objA !== 'object' || !objA || typeof objB !== 'object' || !objB) { return false; } var keysA = Object.keys(objA); var keysB = Object.keys(objB); if(keysA.length !== keysB.length) { return false; } var bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB); // Test for A's keys different from B. for(var idx = 0; idx < keysA.length; idx++) { var key = keysA[idx]; if(!bHasOwnProperty(key)) { return false; } var valueA = objA[key]; var valueB = objB[key]; ret = compare ? compare.call(compareContext, valueA, valueB, key) : void 0; if(ret === false || ret === void 0 && valueA !== valueB) { return false; } } return true; }; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } function withSideEffect(reducePropsToState, handleStateChangeOnClient, mapStateOnServer) { if (typeof reducePropsToState !== 'function') { throw new Error('Expected reducePropsToState to be a function.'); } if (typeof handleStateChangeOnClient !== 'function') { throw new Error('Expected handleStateChangeOnClient to be a function.'); } if (typeof mapStateOnServer !== 'undefined' && typeof mapStateOnServer !== 'function') { throw new Error('Expected mapStateOnServer to either be undefined or a function.'); } function getDisplayName(WrappedComponent) { return WrappedComponent.displayName || WrappedComponent.name || 'Component'; } return function wrap(WrappedComponent) { if (typeof WrappedComponent !== 'function') { throw new Error('Expected WrappedComponent to be a React component.'); } var mountedInstances = []; var state = void 0; function emitChange() { state = reducePropsToState(mountedInstances.map(function (instance) { return instance.props; })); if (SideEffect.canUseDOM) { handleStateChangeOnClient(state); } else if (mapStateOnServer) { state = mapStateOnServer(state); } } var SideEffect = function (_Component) { _inherits(SideEffect, _Component); function SideEffect() { _classCallCheck(this, SideEffect); return _possibleConstructorReturn(this, _Component.apply(this, arguments)); } // Try to use displayName of wrapped component SideEffect.peek = function peek() { return state; }; // Expose canUseDOM so tests can monkeypatch it SideEffect.rewind = function rewind() { if (SideEffect.canUseDOM) { throw new Error('You may only call rewind() on the server. Call peek() to read the current state.'); } var recordedState = state; state = undefined; mountedInstances = []; return recordedState; }; SideEffect.prototype.shouldComponentUpdate = function shouldComponentUpdate(nextProps) { return !shallowequal(nextProps, this.props); }; SideEffect.prototype.componentWillMount = function componentWillMount() { mountedInstances.push(this); emitChange(); }; SideEffect.prototype.componentDidUpdate = function componentDidUpdate() { emitChange(); }; SideEffect.prototype.componentWillUnmount = function componentWillUnmount() { var index = mountedInstances.indexOf(this); mountedInstances.splice(index, 1); emitChange(); }; SideEffect.prototype.render = function render() { return React__default.createElement(WrappedComponent, this.props); }; return SideEffect; }(React.Component); SideEffect.displayName = 'SideEffect(' + getDisplayName(WrappedComponent) + ')'; SideEffect.canUseDOM = exenv.canUseDOM; return SideEffect; }; } return withSideEffect; })));