From 9a76e31f2fb77367d6632b6b03cdfeabfadf0caf Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Wed, 1 Jun 2016 18:34:12 -0700 Subject: [PATCH 1/8] add redux as dependency --- web/package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/web/package.json b/web/package.json index 2eaac445a..02af2666a 100644 --- a/web/package.json +++ b/web/package.json @@ -23,7 +23,9 @@ "lodash": "^4.11.2", "react": "^15.0.2", "react-dom": "^15.0.2", + "react-redux": "^4.4.5", "react-router": "^2.4.0", + "redux": "^3.5.2", "shallowequal": "^0.2.2" }, "devDependencies": { From 9e3591e3c225c51d5a5b80eb331719d20d14dc48 Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Thu, 2 Jun 2016 00:04:10 -0700 Subject: [PATCH 2/8] add basic redux architecture, convert eventlog to redux --- mitmproxy/web/static/app.js | 237 ++- mitmproxy/web/static/vendor.js | 2717 +++++++++++++++++++++-------- web/package.json | 1 + web/src/js/app.js | 16 +- web/src/js/components/eventlog.js | 54 +- web/src/js/components/proxyapp.js | 2 +- web/src/js/reducers/eventLog.js | 30 + web/src/js/reducers/index.js | 8 + web/src/js/reduxActions.js | 13 + 9 files changed, 2262 insertions(+), 816 deletions(-) create mode 100644 web/src/js/reducers/eventLog.js create mode 100644 web/src/js/reducers/index.js create mode 100644 web/src/js/reduxActions.js diff --git a/mitmproxy/web/static/app.js b/mitmproxy/web/static/app.js index e02df55ab..88881601d 100644 --- a/mitmproxy/web/static/app.js +++ b/mitmproxy/web/static/app.js @@ -365,13 +365,13 @@ var SettingsActions = exports.SettingsActions = { data: JSON.stringify(settings) }); - /* - //Facebook Flux: We do an optimistic update on the client already. - AppDispatcher.dispatchViewAction({ - type: ActionTypes.SETTINGS_STORE, - cmd: StoreCmds.UPDATE, - data: settings - }); + /* + //Facebook Flux: We do an optimistic update on the client already. + AppDispatcher.dispatchViewAction({ + type: ActionTypes.SETTINGS_STORE, + cmd: StoreCmds.UPDATE, + data: settings + }); */ } }; @@ -414,15 +414,15 @@ var FlowActions = exports.FlowActions = { _jquery2.default.post("/flows/" + flow.id + "/revert"); }, update: function update(flow, nextProps) { - /* - //Facebook Flux: We do an optimistic update on the client already. - var nextFlow = _.cloneDeep(flow); - _.merge(nextFlow, nextProps); - AppDispatcher.dispatchViewAction({ - type: ActionTypes.FLOW_STORE, - cmd: StoreCmds.UPDATE, - data: nextFlow - }); + /* + //Facebook Flux: We do an optimistic update on the client already. + var nextFlow = _.cloneDeep(flow); + _.merge(nextFlow, nextProps); + AppDispatcher.dispatchViewAction({ + type: ActionTypes.FLOW_STORE, + cmd: StoreCmds.UPDATE, + data: nextFlow + }); */ _jquery2.default.ajax({ type: "PUT", @@ -443,28 +443,38 @@ var Query = exports.Query = { }; },{"./dispatcher.js":22,"jquery":"jquery","lodash":"lodash"}],3:[function(require,module,exports){ -"use strict"; +'use strict'; -var _react = require("react"); +var _react = require('react'); var _react2 = _interopRequireDefault(_react); -var _reactDom = require("react-dom"); +var _reactDom = require('react-dom'); -var _jquery = require("jquery"); +var _redux = require('redux'); + +var _reactRedux = require('react-redux'); + +var _reducers = require('./reducers'); + +var _reducers2 = _interopRequireDefault(_reducers); + +var _jquery = require('jquery'); var _jquery2 = _interopRequireDefault(_jquery); -var _connection = require("./connection"); +var _connection = require('./connection'); var _connection2 = _interopRequireDefault(_connection); -var _proxyapp = require("./components/proxyapp.js"); +var _proxyapp = require('./components/proxyapp.js'); -var _actions = require("./actions.js"); +var _actions = require('./actions.js'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var store = (0, _redux.createStore)(_reducers2.default); + (0, _jquery2.default)(function () { window.ws = new _connection2.default("/updates"); @@ -472,10 +482,14 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de _actions.EventLogActions.add_event(msg); }; - (0, _reactDom.render)(_proxyapp.app, document.getElementById("mitmproxy")); + (0, _reactDom.render)(_react2.default.createElement( + _reactRedux.Provider, + { store: store }, + _proxyapp.App + ), document.getElementById("mitmproxy")); }); -},{"./actions.js":2,"./components/proxyapp.js":20,"./connection":21,"jquery":"jquery","react":"react","react-dom":"react-dom"}],4:[function(require,module,exports){ +},{"./actions.js":2,"./components/proxyapp.js":20,"./connection":21,"./reducers":26,"jquery":"jquery","react":"react","react-dom":"react-dom","react-redux":"react-redux","redux":"redux"}],4:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -699,7 +713,7 @@ ToggleInputButton.propTypes = { onToggleChanged: _react2.default.PropTypes.func.isRequired }; -},{"../utils.js":27,"lodash":"lodash","react":"react","react-dom":"react-dom"}],5:[function(require,module,exports){ +},{"../utils.js":30,"lodash":"lodash","react":"react","react-dom":"react-dom"}],5:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -957,7 +971,7 @@ var ValueEditor = exports.ValueEditor = _react2.default.createClass({ } }); -},{"../utils.js":27,"react":"react","react-dom":"react-dom"}],6:[function(require,module,exports){ +},{"../utils.js":30,"react":"react","react-dom":"react-dom"}],6:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -974,12 +988,16 @@ var _reactDom = require("react-dom"); var _reactDom2 = _interopRequireDefault(_reactDom); +var _reactRedux = require("react-redux"); + var _shallowequal = require("shallowequal"); var _shallowequal2 = _interopRequireDefault(_shallowequal); var _actions = require("../actions.js"); +var _reduxActions = require("../reduxActions"); + var _AutoScroll = require("./helpers/AutoScroll"); var _AutoScroll2 = _interopRequireDefault(_AutoScroll); @@ -988,10 +1006,6 @@ var _VirtualScroll = require("./helpers/VirtualScroll"); var _view = require("../store/view.js"); -var _lodash = require("lodash"); - -var _lodash2 = _interopRequireDefault(_lodash); - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -1148,7 +1162,7 @@ function ToggleFilter(_ref) { function onClick(event) { event.preventDefault(); - toggleLevel(name); + toggleLevel(); } return _react2.default.createElement( @@ -1161,29 +1175,35 @@ function ToggleFilter(_ref) { ); } +var mapStateToProps = function mapStateToProps(state, ownProps) { + return { + active: state.eventLog.visibilityFilter[ownProps.name] + }; +}; + +var mapDispatchToProps = function mapDispatchToProps(dispatch, ownProps) { + return { + toggleLevel: function toggleLevel() { + dispatch((0, _reduxActions.toggleEventLogFilter)(ownProps.name)); + } + }; +}; + +var ToggleEventLogFilter = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(ToggleFilter); + var AutoScrollEventLog = (0, _AutoScroll2.default)(EventLogContents); +var VisibleAutoScrollEventLog = (0, _reactRedux.connect)(function mapStateToProps(state, ownProps) { + return { filter: state.eventLog.visibilityFilter }; +})(AutoScrollEventLog); + var EventLog = _react2.default.createClass({ displayName: "EventLog", - getInitialState: function getInitialState() { - return { - filter: { - "debug": false, - "info": true, - "web": true - } - }; - }, close: function close() { var d = {}; d[_actions.Query.SHOW_EVENTLOG] = undefined; this.props.updateLocation(undefined, d); }, - toggleLevel: function toggleLevel(level) { - var filter = _lodash2.default.extend({}, this.state.filter); - filter[level] = !filter[level]; - this.setState({ filter: filter }); - }, render: function render() { return _react2.default.createElement( "div", @@ -1195,20 +1215,20 @@ var EventLog = _react2.default.createClass({ _react2.default.createElement( "div", { className: "pull-right" }, - _react2.default.createElement(ToggleFilter, { name: "debug", active: this.state.filter.debug, toggleLevel: this.toggleLevel }), - _react2.default.createElement(ToggleFilter, { name: "info", active: this.state.filter.info, toggleLevel: this.toggleLevel }), - _react2.default.createElement(ToggleFilter, { name: "web", active: this.state.filter.web, toggleLevel: this.toggleLevel }), + _react2.default.createElement(ToggleEventLogFilter, { name: "debug" }), + _react2.default.createElement(ToggleEventLogFilter, { name: "info" }), + _react2.default.createElement(ToggleEventLogFilter, { name: "web" }), _react2.default.createElement("i", { onClick: this.close, className: "fa fa-close" }) ) ), - _react2.default.createElement(AutoScrollEventLog, { filter: this.state.filter }) + _react2.default.createElement(VisibleAutoScrollEventLog, null) ); } }); exports.default = EventLog; -},{"../actions.js":2,"../store/view.js":26,"./helpers/AutoScroll":16,"./helpers/VirtualScroll":17,"lodash":"lodash","react":"react","react-dom":"react-dom","shallowequal":"shallowequal"}],7:[function(require,module,exports){ +},{"../actions.js":2,"../reduxActions":27,"../store/view.js":29,"./helpers/AutoScroll":16,"./helpers/VirtualScroll":17,"react":"react","react-dom":"react-dom","react-redux":"react-redux","shallowequal":"shallowequal"}],7:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -1477,7 +1497,7 @@ var all_columns = [TLSColumn, IconColumn, PathColumn, MethodColumn, StatusColumn exports.default = all_columns; -},{"../flow/utils.js":24,"../utils.js":27,"react":"react"}],8:[function(require,module,exports){ +},{"../flow/utils.js":24,"../utils.js":30,"react":"react"}],8:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -1769,7 +1789,7 @@ FlowTable.defaultProps = { }; exports.default = (0, _AutoScroll2.default)(FlowTable); -},{"../utils.js":27,"./flowtable-columns.js":7,"./helpers/AutoScroll":16,"./helpers/VirtualScroll":17,"classnames":"classnames","lodash":"lodash","react":"react","react-dom":"react-dom","shallowequal":"shallowequal"}],9:[function(require,module,exports){ +},{"../utils.js":30,"./flowtable-columns.js":7,"./helpers/AutoScroll":16,"./helpers/VirtualScroll":17,"classnames":"classnames","lodash":"lodash","react":"react","react-dom":"react-dom","shallowequal":"shallowequal"}],9:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -2123,7 +2143,7 @@ var ContentView = _react2.default.createClass({ exports.default = ContentView; -},{"../../flow/utils.js":24,"../../utils.js":27,"lodash":"lodash","react":"react"}],10:[function(require,module,exports){ +},{"../../flow/utils.js":24,"../../utils.js":30,"lodash":"lodash","react":"react"}],10:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -2391,7 +2411,7 @@ var Details = _react2.default.createClass({ exports.default = Details; -},{"../../utils.js":27,"lodash":"lodash","react":"react"}],11:[function(require,module,exports){ +},{"../../utils.js":30,"lodash":"lodash","react":"react"}],11:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -2885,7 +2905,7 @@ var Error = exports.Error = _react2.default.createClass({ } }); -},{"../../actions.js":2,"../../flow/utils.js":24,"../../utils.js":27,"../editor.js":5,"./contentview.js":9,"lodash":"lodash","react":"react","react-dom":"react-dom"}],13:[function(require,module,exports){ +},{"../../actions.js":2,"../../flow/utils.js":24,"../../utils.js":30,"../editor.js":5,"./contentview.js":9,"lodash":"lodash","react":"react","react-dom":"react-dom"}],13:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -3068,7 +3088,7 @@ function Footer(_ref) { ); } -},{"../utils.js":27,"./common.js":4,"react":"react"}],15:[function(require,module,exports){ +},{"../utils.js":30,"./common.js":4,"react":"react"}],15:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -3622,7 +3642,7 @@ var Header = exports.Header = _react2.default.createClass({ } }); -},{"../actions.js":2,"../filt/filt.js":23,"../utils.js":27,"./common.js":4,"jquery":"jquery","react":"react","react-dom":"react-dom"}],16:[function(require,module,exports){ +},{"../actions.js":2,"../filt/filt.js":23,"../utils.js":30,"./common.js":4,"jquery":"jquery","react":"react","react-dom":"react-dom"}],16:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -4038,7 +4058,7 @@ var MainView = _react2.default.createClass({ exports.default = MainView; -},{"../actions.js":2,"../filt/filt.js":23,"../store/view.js":26,"../utils.js":27,"./common.js":4,"./flowtable.js":8,"./flowview/index.js":11,"react":"react"}],19:[function(require,module,exports){ +},{"../actions.js":2,"../filt/filt.js":23,"../store/view.js":29,"../utils.js":30,"./common.js":4,"./flowtable.js":8,"./flowview/index.js":11,"react":"react"}],19:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -4174,13 +4194,13 @@ var Prompt = _react2.default.createClass({ exports.default = Prompt; -},{"../utils.js":27,"lodash":"lodash","react":"react","react-dom":"react-dom"}],20:[function(require,module,exports){ +},{"../utils.js":30,"lodash":"lodash","react":"react","react-dom":"react-dom"}],20:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.app = undefined; +exports.App = undefined; var _react = require("react"); @@ -4351,7 +4371,7 @@ var ProxyAppMain = _react2.default.createClass({ } }); -var app = exports.app = _react2.default.createElement( +var App = exports.App = _react2.default.createElement( _reactRouter.Router, { history: _reactRouter.hashHistory }, _react2.default.createElement(_reactRouter.Redirect, { from: "/", to: "/flows" }), @@ -4364,7 +4384,7 @@ var app = exports.app = _react2.default.createElement( ) ); -},{"../actions.js":2,"../store/store.js":25,"../utils.js":27,"./common.js":4,"./eventlog.js":6,"./footer.js":14,"./header.js":15,"./mainview.js":18,"lodash":"lodash","react":"react","react-dom":"react-dom","react-router":"react-router"}],21:[function(require,module,exports){ +},{"../actions.js":2,"../store/store.js":28,"../utils.js":30,"./common.js":4,"./eventlog.js":6,"./footer.js":14,"./header.js":15,"./mainview.js":18,"lodash":"lodash","react":"react","react-dom":"react-dom","react-router":"react-router"}],21:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -6471,6 +6491,93 @@ var parseHttpVersion = exports.parseHttpVersion = function parseHttpVersion(http },{"jquery":"jquery","lodash":"lodash"}],25:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _redux = require("redux"); + +var _reduxActions = require("../reduxActions"); + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var defaultVisibility = { + "debug": false, + "info": true, + "web": true +}; + +var visibilityFilter = function visibilityFilter() { + var state = arguments.length <= 0 || arguments[0] === undefined ? defaultVisibility : arguments[0]; + var action = arguments[1]; + + switch (action.type) { + case _reduxActions.TOGGLE_EVENTLOG_FILTER: + return Object.assign({}, state, _defineProperty({}, action.filter, !state[action.filter])); + default: + return state; + } +}; + +var entries = function entries() { + var state = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; + var action = arguments[1]; + + return state; +}; + +var eventLog = (0, _redux.combineReducers)({ + visibilityFilter: visibilityFilter, + entries: entries +}); + +exports.default = eventLog; + +},{"../reduxActions":27,"redux":"redux"}],26:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _redux = require('redux'); + +var _eventlog = require('./eventlog'); + +var _eventlog2 = _interopRequireDefault(_eventlog); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var mitmproxyApp = (0, _redux.combineReducers)({ + eventLog: _eventlog2.default +}); + +exports.default = mitmproxyApp; + +},{"./eventlog":25,"redux":"redux"}],27:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.toggleEventLogFilter = toggleEventLogFilter; +var TOGGLE_EVENTLOG_FILTER = exports.TOGGLE_EVENTLOG_FILTER = 'TOGGLE_EVENTLOG_FILTER'; +var HIDE_EVENTLOG = exports.HIDE_EVENTLOG = 'HIDE_EVENTLOG'; +var SHOW_EVENTLOG = exports.SHOW_EVENTLOG = 'SHOW_EVENTLOG'; + +var EventLogFilters = exports.EventLogFilters = { + DEBUG: 'debug', + INFO: 'info', + WEB: 'web' +}; + +function toggleEventLogFilter(filter) { + return { type: TOGGLE_EVENTLOG_FILTER, filter: filter }; +} + +},{}],28:[function(require,module,exports){ +"use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); @@ -6655,7 +6762,7 @@ _lodash2.default.extend(EventLogStore.prototype, LiveListStore.prototype, { } }); -},{"../actions.js":2,"../dispatcher.js":22,"events":1,"jquery":"jquery","lodash":"lodash"}],26:[function(require,module,exports){ +},{"../actions.js":2,"../dispatcher.js":22,"events":1,"jquery":"jquery","lodash":"lodash"}],29:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -6785,7 +6892,7 @@ _lodash2.default.extend(StoreView.prototype, _events.EventEmitter.prototype, { } }); -},{"../utils.js":27,"events":1,"lodash":"lodash"}],27:[function(require,module,exports){ +},{"../utils.js":30,"events":1,"lodash":"lodash"}],30:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { diff --git a/mitmproxy/web/static/vendor.js b/mitmproxy/web/static/vendor.js index 4b2ff6bf8..03ff5871d 100644 --- a/mitmproxy/web/static/vendor.js +++ b/mitmproxy/web/static/vendor.js @@ -180,7 +180,7 @@ var invariant = function (condition, format, a, b, c, d, e, f) { module.exports = invariant; }).call(this,require('_process')) -},{"_process":29}],5:[function(require,module,exports){ +},{"_process":33}],5:[function(require,module,exports){ (function (process){ /** * Copyright (c) 2014-2015, Facebook, Inc. @@ -415,7 +415,7 @@ var Dispatcher = (function () { module.exports = Dispatcher; }).call(this,require('_process')) -},{"_process":29,"fbjs/lib/invariant":4}],6:[function(require,module,exports){ +},{"_process":33,"fbjs/lib/invariant":4}],6:[function(require,module,exports){ /** * Indicates that navigation was caused by a call to history.push. */ @@ -583,7 +583,7 @@ function readState(key) { } }).call(this,require('_process')) -},{"_process":29,"warning":231}],9:[function(require,module,exports){ +},{"_process":33,"warning":249}],9:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -716,7 +716,7 @@ function parsePath(path) { } }).call(this,require('_process')) -},{"_process":29,"warning":231}],12:[function(require,module,exports){ +},{"_process":33,"warning":249}],12:[function(require,module,exports){ (function (process){ 'use strict'; @@ -896,7 +896,7 @@ exports['default'] = createBrowserHistory; module.exports = exports['default']; }).call(this,require('_process')) -},{"./Actions":6,"./DOMStateStorage":8,"./DOMUtils":9,"./ExecutionEnvironment":10,"./PathUtils":11,"./createDOMHistory":13,"_process":29,"invariant":23}],13:[function(require,module,exports){ +},{"./Actions":6,"./DOMStateStorage":8,"./DOMUtils":9,"./ExecutionEnvironment":10,"./PathUtils":11,"./createDOMHistory":13,"_process":33,"invariant":23}],13:[function(require,module,exports){ (function (process){ 'use strict'; @@ -940,7 +940,7 @@ exports['default'] = createDOMHistory; module.exports = exports['default']; }).call(this,require('_process')) -},{"./DOMUtils":9,"./ExecutionEnvironment":10,"./createHistory":15,"_process":29,"invariant":23}],14:[function(require,module,exports){ +},{"./DOMUtils":9,"./ExecutionEnvironment":10,"./createHistory":15,"_process":33,"invariant":23}],14:[function(require,module,exports){ (function (process){ 'use strict'; @@ -1190,7 +1190,7 @@ exports['default'] = createHashHistory; module.exports = exports['default']; }).call(this,require('_process')) -},{"./Actions":6,"./DOMStateStorage":8,"./DOMUtils":9,"./ExecutionEnvironment":10,"./PathUtils":11,"./createDOMHistory":13,"_process":29,"invariant":23,"warning":231}],15:[function(require,module,exports){ +},{"./Actions":6,"./DOMStateStorage":8,"./DOMUtils":9,"./ExecutionEnvironment":10,"./PathUtils":11,"./createDOMHistory":13,"_process":33,"invariant":23,"warning":249}],15:[function(require,module,exports){ (function (process){ 'use strict'; @@ -1482,7 +1482,7 @@ exports['default'] = createHistory; module.exports = exports['default']; }).call(this,require('_process')) -},{"./Actions":6,"./AsyncUtils":7,"./PathUtils":11,"./createLocation":16,"./deprecate":18,"./runTransitionHook":19,"_process":29,"deep-equal":1,"warning":231}],16:[function(require,module,exports){ +},{"./Actions":6,"./AsyncUtils":7,"./PathUtils":11,"./createLocation":16,"./deprecate":18,"./runTransitionHook":19,"_process":33,"deep-equal":1,"warning":249}],16:[function(require,module,exports){ (function (process){ 'use strict'; @@ -1537,7 +1537,7 @@ exports['default'] = createLocation; module.exports = exports['default']; }).call(this,require('_process')) -},{"./Actions":6,"./PathUtils":11,"_process":29,"warning":231}],17:[function(require,module,exports){ +},{"./Actions":6,"./PathUtils":11,"_process":33,"warning":249}],17:[function(require,module,exports){ (function (process){ 'use strict'; @@ -1695,7 +1695,7 @@ exports['default'] = createMemoryHistory; module.exports = exports['default']; }).call(this,require('_process')) -},{"./Actions":6,"./PathUtils":11,"./createHistory":15,"_process":29,"invariant":23,"warning":231}],18:[function(require,module,exports){ +},{"./Actions":6,"./PathUtils":11,"./createHistory":15,"_process":33,"invariant":23,"warning":249}],18:[function(require,module,exports){ (function (process){ 'use strict'; @@ -1718,7 +1718,7 @@ exports['default'] = deprecate; module.exports = exports['default']; }).call(this,require('_process')) -},{"_process":29,"warning":231}],19:[function(require,module,exports){ +},{"_process":33,"warning":249}],19:[function(require,module,exports){ (function (process){ 'use strict'; @@ -1746,7 +1746,7 @@ exports['default'] = runTransitionHook; module.exports = exports['default']; }).call(this,require('_process')) -},{"_process":29,"warning":231}],20:[function(require,module,exports){ +},{"_process":33,"warning":249}],20:[function(require,module,exports){ (function (process){ 'use strict'; @@ -1908,7 +1908,7 @@ exports['default'] = useBasename; module.exports = exports['default']; }).call(this,require('_process')) -},{"./ExecutionEnvironment":10,"./PathUtils":11,"./deprecate":18,"./runTransitionHook":19,"_process":29,"warning":231}],21:[function(require,module,exports){ +},{"./ExecutionEnvironment":10,"./PathUtils":11,"./deprecate":18,"./runTransitionHook":19,"_process":33,"warning":249}],21:[function(require,module,exports){ (function (process){ 'use strict'; @@ -2088,7 +2088,7 @@ exports['default'] = useQueries; module.exports = exports['default']; }).call(this,require('_process')) -},{"./PathUtils":11,"./deprecate":18,"./runTransitionHook":19,"_process":29,"query-string":30,"warning":231}],22:[function(require,module,exports){ +},{"./PathUtils":11,"./deprecate":18,"./runTransitionHook":19,"_process":33,"query-string":34,"warning":249}],22:[function(require,module,exports){ /** * Copyright 2015, Yahoo! Inc. * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. @@ -2116,15 +2116,13 @@ var KNOWN_STATICS = { }; module.exports = function hoistNonReactStatics(targetComponent, sourceComponent) { - if (typeof sourceComponent !== 'string') { // don't hoist over string (html) components - var keys = Object.getOwnPropertyNames(sourceComponent); - for (var i=0; i * Build: `lodash modern modularize exports="npm" -o ./` @@ -2993,6 +2991,148 @@ function keysIn(object) { module.exports = keys; },{"lodash._getnative":24,"lodash.isarguments":25,"lodash.isarray":26}],28:[function(require,module,exports){ +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeGetPrototype = Object.getPrototypeOf; + +/** + * Gets the `[[Prototype]]` of `value`. + * + * @private + * @param {*} value The value to query. + * @returns {null|Object} Returns the `[[Prototype]]`. + */ +function getPrototype(value) { + return nativeGetPrototype(Object(value)); +} + +module.exports = getPrototype; + +},{}],29:[function(require,module,exports){ +/** + * Checks if `value` is a host object in IE < 9. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a host object, else `false`. + */ +function isHostObject(value) { + // Many host objects are `Object` objects that can coerce to strings + // despite having improperly defined `toString` methods. + var result = false; + if (value != null && typeof value.toString != 'function') { + try { + result = !!(value + ''); + } catch (e) {} + } + return result; +} + +module.exports = isHostObject; + +},{}],30:[function(require,module,exports){ +/** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} + +module.exports = isObjectLike; + +},{}],31:[function(require,module,exports){ +var getPrototype = require('./_getPrototype'), + isHostObject = require('./_isHostObject'), + isObjectLike = require('./isObjectLike'); + +/** `Object#toString` result references. */ +var objectTag = '[object Object]'; + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to resolve the decompiled source of functions. */ +var funcToString = Function.prototype.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** Used to infer the `Object` constructor. */ +var objectCtorString = funcToString.call(Object); + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objectToString = objectProto.toString; + +/** + * Checks if `value` is a plain object, that is, an object created by the + * `Object` constructor or one with a `[[Prototype]]` of `null`. + * + * @static + * @memberOf _ + * @since 0.8.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a plain object, + * else `false`. + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * _.isPlainObject(new Foo); + * // => false + * + * _.isPlainObject([1, 2, 3]); + * // => false + * + * _.isPlainObject({ 'x': 0, 'y': 0 }); + * // => true + * + * _.isPlainObject(Object.create(null)); + * // => true + */ +function isPlainObject(value) { + if (!isObjectLike(value) || + objectToString.call(value) != objectTag || isHostObject(value)) { + return false; + } + var proto = getPrototype(value); + if (proto === null) { + return true; + } + var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; + return (typeof Ctor == 'function' && + Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString); +} + +module.exports = isPlainObject; + +},{"./_getPrototype":28,"./_isHostObject":29,"./isObjectLike":30}],32:[function(require,module,exports){ 'use strict'; /* eslint-disable no-unused-vars */ var hasOwnProperty = Object.prototype.hasOwnProperty; @@ -3077,7 +3217,7 @@ module.exports = shouldUseNative() ? Object.assign : function (target, source) { return to; }; -},{}],29:[function(require,module,exports){ +},{}],33:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; @@ -3087,9 +3227,6 @@ var currentQueue; var queueIndex = -1; function cleanUpNextTick() { - if (!draining || !currentQueue) { - return; - } draining = false; if (currentQueue.length) { queue = currentQueue.concat(queue); @@ -3173,7 +3310,7 @@ process.chdir = function (dir) { }; process.umask = function() { return 0; }; -},{}],30:[function(require,module,exports){ +},{}],34:[function(require,module,exports){ 'use strict'; var strictUriEncode = require('strict-uri-encode'); @@ -3241,7 +3378,563 @@ exports.stringify = function (obj) { }).join('&') : ''; }; -},{"strict-uri-encode":230}],31:[function(require,module,exports){ +},{"strict-uri-encode":246}],35:[function(require,module,exports){ +(function (process){ +'use strict'; + +exports.__esModule = true; +exports["default"] = undefined; + +var _react = require('react'); + +var _storeShape = require('../utils/storeShape'); + +var _storeShape2 = _interopRequireDefault(_storeShape); + +var _warning = require('../utils/warning'); + +var _warning2 = _interopRequireDefault(_warning); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +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; } + +var didWarnAboutReceivingStore = false; +function warnAboutReceivingStore() { + if (didWarnAboutReceivingStore) { + return; + } + didWarnAboutReceivingStore = true; + + (0, _warning2["default"])(' does not support changing `store` on the fly. ' + 'It is most likely that you see this error because you updated to ' + 'Redux 2.x and React Redux 2.x which no longer hot reload reducers ' + 'automatically. See https://github.com/reactjs/react-redux/releases/' + 'tag/v2.0.0 for the migration instructions.'); +} + +var Provider = function (_Component) { + _inherits(Provider, _Component); + + Provider.prototype.getChildContext = function getChildContext() { + return { store: this.store }; + }; + + function Provider(props, context) { + _classCallCheck(this, Provider); + + var _this = _possibleConstructorReturn(this, _Component.call(this, props, context)); + + _this.store = props.store; + return _this; + } + + Provider.prototype.render = function render() { + var children = this.props.children; + + return _react.Children.only(children); + }; + + return Provider; +}(_react.Component); + +exports["default"] = Provider; + +if (process.env.NODE_ENV !== 'production') { + Provider.prototype.componentWillReceiveProps = function (nextProps) { + var store = this.store; + var nextStore = nextProps.store; + + if (store !== nextStore) { + warnAboutReceivingStore(); + } + }; +} + +Provider.propTypes = { + store: _storeShape2["default"].isRequired, + children: _react.PropTypes.element.isRequired +}; +Provider.childContextTypes = { + store: _storeShape2["default"].isRequired +}; +}).call(this,require('_process')) + +},{"../utils/storeShape":38,"../utils/warning":39,"_process":33,"react":"react"}],36:[function(require,module,exports){ +(function (process){ +'use strict'; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +exports.__esModule = true; +exports["default"] = connect; + +var _react = require('react'); + +var _storeShape = require('../utils/storeShape'); + +var _storeShape2 = _interopRequireDefault(_storeShape); + +var _shallowEqual = require('../utils/shallowEqual'); + +var _shallowEqual2 = _interopRequireDefault(_shallowEqual); + +var _wrapActionCreators = require('../utils/wrapActionCreators'); + +var _wrapActionCreators2 = _interopRequireDefault(_wrapActionCreators); + +var _warning = require('../utils/warning'); + +var _warning2 = _interopRequireDefault(_warning); + +var _isPlainObject = require('lodash/isPlainObject'); + +var _isPlainObject2 = _interopRequireDefault(_isPlainObject); + +var _hoistNonReactStatics = require('hoist-non-react-statics'); + +var _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics); + +var _invariant = require('invariant'); + +var _invariant2 = _interopRequireDefault(_invariant); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +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; } + +var defaultMapStateToProps = function defaultMapStateToProps(state) { + return {}; +}; // eslint-disable-line no-unused-vars +var defaultMapDispatchToProps = function defaultMapDispatchToProps(dispatch) { + return { dispatch: dispatch }; +}; +var defaultMergeProps = function defaultMergeProps(stateProps, dispatchProps, parentProps) { + return _extends({}, parentProps, stateProps, dispatchProps); +}; + +function getDisplayName(WrappedComponent) { + return WrappedComponent.displayName || WrappedComponent.name || 'Component'; +} + +var errorObject = { value: null }; +function tryCatch(fn, ctx) { + try { + return fn.apply(ctx); + } catch (e) { + errorObject.value = e; + return errorObject; + } +} + +// Helps track hot reloading. +var nextVersion = 0; + +function connect(mapStateToProps, mapDispatchToProps, mergeProps) { + var options = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3]; + + var shouldSubscribe = Boolean(mapStateToProps); + var mapState = mapStateToProps || defaultMapStateToProps; + + var mapDispatch = undefined; + if (typeof mapDispatchToProps === 'function') { + mapDispatch = mapDispatchToProps; + } else if (!mapDispatchToProps) { + mapDispatch = defaultMapDispatchToProps; + } else { + mapDispatch = (0, _wrapActionCreators2["default"])(mapDispatchToProps); + } + + var finalMergeProps = mergeProps || defaultMergeProps; + var _options$pure = options.pure; + var pure = _options$pure === undefined ? true : _options$pure; + var _options$withRef = options.withRef; + var withRef = _options$withRef === undefined ? false : _options$withRef; + + var checkMergedEquals = pure && finalMergeProps !== defaultMergeProps; + + // Helps track hot reloading. + var version = nextVersion++; + + return function wrapWithConnect(WrappedComponent) { + var connectDisplayName = 'Connect(' + getDisplayName(WrappedComponent) + ')'; + + function checkStateShape(props, methodName) { + if (!(0, _isPlainObject2["default"])(props)) { + (0, _warning2["default"])(methodName + '() in ' + connectDisplayName + ' must return a plain object. ' + ('Instead received ' + props + '.')); + } + } + + function computeMergedProps(stateProps, dispatchProps, parentProps) { + var mergedProps = finalMergeProps(stateProps, dispatchProps, parentProps); + if (process.env.NODE_ENV !== 'production') { + checkStateShape(mergedProps, 'mergeProps'); + } + return mergedProps; + } + + var Connect = function (_Component) { + _inherits(Connect, _Component); + + Connect.prototype.shouldComponentUpdate = function shouldComponentUpdate() { + return !pure || this.haveOwnPropsChanged || this.hasStoreStateChanged; + }; + + function Connect(props, context) { + _classCallCheck(this, Connect); + + var _this = _possibleConstructorReturn(this, _Component.call(this, props, context)); + + _this.version = version; + _this.store = props.store || context.store; + + (0, _invariant2["default"])(_this.store, 'Could not find "store" in either the context or ' + ('props of "' + connectDisplayName + '". ') + 'Either wrap the root component in a , ' + ('or explicitly pass "store" as a prop to "' + connectDisplayName + '".')); + + var storeState = _this.store.getState(); + _this.state = { storeState: storeState }; + _this.clearCache(); + return _this; + } + + Connect.prototype.computeStateProps = function computeStateProps(store, props) { + if (!this.finalMapStateToProps) { + return this.configureFinalMapState(store, props); + } + + var state = store.getState(); + var stateProps = this.doStatePropsDependOnOwnProps ? this.finalMapStateToProps(state, props) : this.finalMapStateToProps(state); + + if (process.env.NODE_ENV !== 'production') { + checkStateShape(stateProps, 'mapStateToProps'); + } + return stateProps; + }; + + Connect.prototype.configureFinalMapState = function configureFinalMapState(store, props) { + var mappedState = mapState(store.getState(), props); + var isFactory = typeof mappedState === 'function'; + + this.finalMapStateToProps = isFactory ? mappedState : mapState; + this.doStatePropsDependOnOwnProps = this.finalMapStateToProps.length !== 1; + + if (isFactory) { + return this.computeStateProps(store, props); + } + + if (process.env.NODE_ENV !== 'production') { + checkStateShape(mappedState, 'mapStateToProps'); + } + return mappedState; + }; + + Connect.prototype.computeDispatchProps = function computeDispatchProps(store, props) { + if (!this.finalMapDispatchToProps) { + return this.configureFinalMapDispatch(store, props); + } + + var dispatch = store.dispatch; + + var dispatchProps = this.doDispatchPropsDependOnOwnProps ? this.finalMapDispatchToProps(dispatch, props) : this.finalMapDispatchToProps(dispatch); + + if (process.env.NODE_ENV !== 'production') { + checkStateShape(dispatchProps, 'mapDispatchToProps'); + } + return dispatchProps; + }; + + Connect.prototype.configureFinalMapDispatch = function configureFinalMapDispatch(store, props) { + var mappedDispatch = mapDispatch(store.dispatch, props); + var isFactory = typeof mappedDispatch === 'function'; + + this.finalMapDispatchToProps = isFactory ? mappedDispatch : mapDispatch; + this.doDispatchPropsDependOnOwnProps = this.finalMapDispatchToProps.length !== 1; + + if (isFactory) { + return this.computeDispatchProps(store, props); + } + + if (process.env.NODE_ENV !== 'production') { + checkStateShape(mappedDispatch, 'mapDispatchToProps'); + } + return mappedDispatch; + }; + + Connect.prototype.updateStatePropsIfNeeded = function updateStatePropsIfNeeded() { + var nextStateProps = this.computeStateProps(this.store, this.props); + if (this.stateProps && (0, _shallowEqual2["default"])(nextStateProps, this.stateProps)) { + return false; + } + + this.stateProps = nextStateProps; + return true; + }; + + Connect.prototype.updateDispatchPropsIfNeeded = function updateDispatchPropsIfNeeded() { + var nextDispatchProps = this.computeDispatchProps(this.store, this.props); + if (this.dispatchProps && (0, _shallowEqual2["default"])(nextDispatchProps, this.dispatchProps)) { + return false; + } + + this.dispatchProps = nextDispatchProps; + return true; + }; + + Connect.prototype.updateMergedPropsIfNeeded = function updateMergedPropsIfNeeded() { + var nextMergedProps = computeMergedProps(this.stateProps, this.dispatchProps, this.props); + if (this.mergedProps && checkMergedEquals && (0, _shallowEqual2["default"])(nextMergedProps, this.mergedProps)) { + return false; + } + + this.mergedProps = nextMergedProps; + return true; + }; + + Connect.prototype.isSubscribed = function isSubscribed() { + return typeof this.unsubscribe === 'function'; + }; + + Connect.prototype.trySubscribe = function trySubscribe() { + if (shouldSubscribe && !this.unsubscribe) { + this.unsubscribe = this.store.subscribe(this.handleChange.bind(this)); + this.handleChange(); + } + }; + + Connect.prototype.tryUnsubscribe = function tryUnsubscribe() { + if (this.unsubscribe) { + this.unsubscribe(); + this.unsubscribe = null; + } + }; + + Connect.prototype.componentDidMount = function componentDidMount() { + this.trySubscribe(); + }; + + Connect.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) { + if (!pure || !(0, _shallowEqual2["default"])(nextProps, this.props)) { + this.haveOwnPropsChanged = true; + } + }; + + Connect.prototype.componentWillUnmount = function componentWillUnmount() { + this.tryUnsubscribe(); + this.clearCache(); + }; + + Connect.prototype.clearCache = function clearCache() { + this.dispatchProps = null; + this.stateProps = null; + this.mergedProps = null; + this.haveOwnPropsChanged = true; + this.hasStoreStateChanged = true; + this.haveStatePropsBeenPrecalculated = false; + this.statePropsPrecalculationError = null; + this.renderedElement = null; + this.finalMapDispatchToProps = null; + this.finalMapStateToProps = null; + }; + + Connect.prototype.handleChange = function handleChange() { + if (!this.unsubscribe) { + return; + } + + var storeState = this.store.getState(); + var prevStoreState = this.state.storeState; + if (pure && prevStoreState === storeState) { + return; + } + + if (pure && !this.doStatePropsDependOnOwnProps) { + var haveStatePropsChanged = tryCatch(this.updateStatePropsIfNeeded, this); + if (!haveStatePropsChanged) { + return; + } + if (haveStatePropsChanged === errorObject) { + this.statePropsPrecalculationError = errorObject.value; + } + this.haveStatePropsBeenPrecalculated = true; + } + + this.hasStoreStateChanged = true; + this.setState({ storeState: storeState }); + }; + + Connect.prototype.getWrappedInstance = function getWrappedInstance() { + (0, _invariant2["default"])(withRef, 'To access the wrapped instance, you need to specify ' + '{ withRef: true } as the fourth argument of the connect() call.'); + + return this.refs.wrappedInstance; + }; + + Connect.prototype.render = function render() { + var haveOwnPropsChanged = this.haveOwnPropsChanged; + var hasStoreStateChanged = this.hasStoreStateChanged; + var haveStatePropsBeenPrecalculated = this.haveStatePropsBeenPrecalculated; + var statePropsPrecalculationError = this.statePropsPrecalculationError; + var renderedElement = this.renderedElement; + + this.haveOwnPropsChanged = false; + this.hasStoreStateChanged = false; + this.haveStatePropsBeenPrecalculated = false; + this.statePropsPrecalculationError = null; + + if (statePropsPrecalculationError) { + throw statePropsPrecalculationError; + } + + var shouldUpdateStateProps = true; + var shouldUpdateDispatchProps = true; + if (pure && renderedElement) { + shouldUpdateStateProps = hasStoreStateChanged || haveOwnPropsChanged && this.doStatePropsDependOnOwnProps; + shouldUpdateDispatchProps = haveOwnPropsChanged && this.doDispatchPropsDependOnOwnProps; + } + + var haveStatePropsChanged = false; + var haveDispatchPropsChanged = false; + if (haveStatePropsBeenPrecalculated) { + haveStatePropsChanged = true; + } else if (shouldUpdateStateProps) { + haveStatePropsChanged = this.updateStatePropsIfNeeded(); + } + if (shouldUpdateDispatchProps) { + haveDispatchPropsChanged = this.updateDispatchPropsIfNeeded(); + } + + var haveMergedPropsChanged = true; + if (haveStatePropsChanged || haveDispatchPropsChanged || haveOwnPropsChanged) { + haveMergedPropsChanged = this.updateMergedPropsIfNeeded(); + } else { + haveMergedPropsChanged = false; + } + + if (!haveMergedPropsChanged && renderedElement) { + return renderedElement; + } + + if (withRef) { + this.renderedElement = (0, _react.createElement)(WrappedComponent, _extends({}, this.mergedProps, { + ref: 'wrappedInstance' + })); + } else { + this.renderedElement = (0, _react.createElement)(WrappedComponent, this.mergedProps); + } + + return this.renderedElement; + }; + + return Connect; + }(_react.Component); + + Connect.displayName = connectDisplayName; + Connect.WrappedComponent = WrappedComponent; + Connect.contextTypes = { + store: _storeShape2["default"] + }; + Connect.propTypes = { + store: _storeShape2["default"] + }; + + if (process.env.NODE_ENV !== 'production') { + Connect.prototype.componentWillUpdate = function componentWillUpdate() { + if (this.version === version) { + return; + } + + // We are hot reloading! + this.version = version; + this.trySubscribe(); + this.clearCache(); + }; + } + + return (0, _hoistNonReactStatics2["default"])(Connect, WrappedComponent); + }; +} +}).call(this,require('_process')) + +},{"../utils/shallowEqual":37,"../utils/storeShape":38,"../utils/warning":39,"../utils/wrapActionCreators":40,"_process":33,"hoist-non-react-statics":22,"invariant":23,"lodash/isPlainObject":31,"react":"react"}],37:[function(require,module,exports){ +"use strict"; + +exports.__esModule = true; +exports["default"] = shallowEqual; +function shallowEqual(objA, objB) { + if (objA === objB) { + return true; + } + + var keysA = Object.keys(objA); + var keysB = Object.keys(objB); + + if (keysA.length !== keysB.length) { + return false; + } + + // Test for A's keys different from B. + var hasOwn = Object.prototype.hasOwnProperty; + for (var i = 0; i < keysA.length; i++) { + if (!hasOwn.call(objB, keysA[i]) || objA[keysA[i]] !== objB[keysA[i]]) { + return false; + } + } + + return true; +} +},{}],38:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _react = require('react'); + +exports["default"] = _react.PropTypes.shape({ + subscribe: _react.PropTypes.func.isRequired, + dispatch: _react.PropTypes.func.isRequired, + getState: _react.PropTypes.func.isRequired +}); +},{"react":"react"}],39:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +exports["default"] = warning; +/** + * Prints a warning in the console if it exists. + * + * @param {String} message The warning message. + * @returns {void} + */ +function warning(message) { + /* eslint-disable no-console */ + if (typeof console !== 'undefined' && typeof console.error === 'function') { + console.error(message); + } + /* eslint-enable no-console */ + try { + // This error was thrown as a convenience so that you can use this stack + // to find the callsite that caused this warning to fire. + throw new Error(message); + /* eslint-disable no-empty */ + } catch (e) {} + /* eslint-enable no-empty */ +} +},{}],40:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +exports["default"] = wrapActionCreators; + +var _redux = require('redux'); + +function wrapActionCreators(actionCreators) { + return function (dispatch) { + return (0, _redux.bindActionCreators)(actionCreators, dispatch); + }; +} +},{"redux":"redux"}],41:[function(require,module,exports){ "use strict"; exports.__esModule = true; @@ -3330,7 +4023,7 @@ function mapAsync(array, work, callback) { }); }); } -},{}],32:[function(require,module,exports){ +},{}],42:[function(require,module,exports){ (function (process){ 'use strict'; @@ -3363,7 +4056,7 @@ exports.default = History; module.exports = exports['default']; }).call(this,require('_process')) -},{"./InternalPropTypes":36,"./routerWarning":63,"_process":29}],33:[function(require,module,exports){ +},{"./InternalPropTypes":46,"./routerWarning":73,"_process":33}],43:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -3392,7 +4085,7 @@ var IndexLink = _react2.default.createClass({ exports.default = IndexLink; module.exports = exports['default']; -},{"./Link":38,"react":"react"}],34:[function(require,module,exports){ +},{"./Link":48,"react":"react"}],44:[function(require,module,exports){ (function (process){ 'use strict'; @@ -3459,7 +4152,7 @@ exports.default = IndexRedirect; module.exports = exports['default']; }).call(this,require('_process')) -},{"./InternalPropTypes":36,"./Redirect":41,"./routerWarning":63,"_process":29,"invariant":23,"react":"react"}],35:[function(require,module,exports){ +},{"./InternalPropTypes":46,"./Redirect":51,"./routerWarning":73,"_process":33,"invariant":23,"react":"react"}],45:[function(require,module,exports){ (function (process){ 'use strict'; @@ -3523,7 +4216,7 @@ exports.default = IndexRoute; module.exports = exports['default']; }).call(this,require('_process')) -},{"./InternalPropTypes":36,"./RouteUtils":44,"./routerWarning":63,"_process":29,"invariant":23,"react":"react"}],36:[function(require,module,exports){ +},{"./InternalPropTypes":46,"./RouteUtils":54,"./routerWarning":73,"_process":33,"invariant":23,"react":"react"}],46:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -3556,7 +4249,7 @@ var component = exports.component = oneOfType([func, string]); var components = exports.components = oneOfType([component, object]); var route = exports.route = oneOfType([object, element]); var routes = exports.routes = oneOfType([route, arrayOf(route)]); -},{"react":"react"}],37:[function(require,module,exports){ +},{"react":"react"}],47:[function(require,module,exports){ (function (process){ 'use strict'; @@ -3628,7 +4321,7 @@ exports.default = Lifecycle; module.exports = exports['default']; }).call(this,require('_process')) -},{"./routerWarning":63,"_process":29,"invariant":23,"react":"react"}],38:[function(require,module,exports){ +},{"./routerWarning":73,"_process":33,"invariant":23,"react":"react"}],48:[function(require,module,exports){ (function (process){ 'use strict'; @@ -3805,7 +4498,7 @@ exports.default = Link; module.exports = exports['default']; }).call(this,require('_process')) -},{"./PropTypes":40,"./routerWarning":63,"_process":29,"react":"react"}],39:[function(require,module,exports){ +},{"./PropTypes":50,"./routerWarning":73,"_process":33,"react":"react"}],49:[function(require,module,exports){ (function (process){ 'use strict'; @@ -3894,7 +4587,6 @@ function compilePattern(pattern) { * - ** Consumes (greedy) all characters up to the next character * in the pattern, or to the end of the URL if there is none * - * The function calls callback(error, matched) when finished. * The return value is an object with the following properties: * * - remainingPathname @@ -4021,7 +4713,7 @@ function formatPattern(pattern, params) { } }).call(this,require('_process')) -},{"_process":29,"invariant":23}],40:[function(require,module,exports){ +},{"_process":33,"invariant":23}],50:[function(require,module,exports){ (function (process){ 'use strict'; @@ -4126,7 +4818,7 @@ if (process.env.NODE_ENV !== 'production') { exports.default = defaultExport; }).call(this,require('_process')) -},{"./InternalPropTypes":36,"./deprecateObjectProperties":56,"./routerWarning":63,"_process":29,"react":"react"}],41:[function(require,module,exports){ +},{"./InternalPropTypes":46,"./deprecateObjectProperties":66,"./routerWarning":73,"_process":33,"react":"react"}],51:[function(require,module,exports){ (function (process){ 'use strict'; @@ -4232,7 +4924,7 @@ exports.default = Redirect; module.exports = exports['default']; }).call(this,require('_process')) -},{"./InternalPropTypes":36,"./PatternUtils":39,"./RouteUtils":44,"_process":29,"invariant":23,"react":"react"}],42:[function(require,module,exports){ +},{"./InternalPropTypes":46,"./PatternUtils":49,"./RouteUtils":54,"_process":33,"invariant":23,"react":"react"}],52:[function(require,module,exports){ (function (process){ 'use strict'; @@ -4293,7 +4985,7 @@ exports.default = Route; module.exports = exports['default']; }).call(this,require('_process')) -},{"./InternalPropTypes":36,"./RouteUtils":44,"_process":29,"invariant":23,"react":"react"}],43:[function(require,module,exports){ +},{"./InternalPropTypes":46,"./RouteUtils":54,"_process":33,"invariant":23,"react":"react"}],53:[function(require,module,exports){ (function (process){ 'use strict'; @@ -4342,7 +5034,7 @@ exports.default = RouteContext; module.exports = exports['default']; }).call(this,require('_process')) -},{"./routerWarning":63,"_process":29,"react":"react"}],44:[function(require,module,exports){ +},{"./routerWarning":73,"_process":33,"react":"react"}],54:[function(require,module,exports){ (function (process){ 'use strict'; @@ -4458,7 +5150,7 @@ function createRoutes(routes) { } }).call(this,require('_process')) -},{"./routerWarning":63,"_process":29,"react":"react"}],45:[function(require,module,exports){ +},{"./routerWarning":73,"_process":33,"react":"react"}],55:[function(require,module,exports){ (function (process){ 'use strict'; @@ -4670,7 +5362,7 @@ exports.default = Router; module.exports = exports['default']; }).call(this,require('_process')) -},{"./InternalPropTypes":36,"./RouteUtils":44,"./RouterContext":46,"./RouterUtils":47,"./createTransitionManager":55,"./routerWarning":63,"_process":29,"history/lib/createHashHistory":14,"history/lib/useQueries":21,"react":"react"}],46:[function(require,module,exports){ +},{"./InternalPropTypes":46,"./RouteUtils":54,"./RouterContext":56,"./RouterUtils":57,"./createTransitionManager":65,"./routerWarning":73,"_process":33,"history/lib/createHashHistory":14,"history/lib/useQueries":21,"react":"react"}],56:[function(require,module,exports){ (function (process){ 'use strict'; @@ -4830,7 +5522,7 @@ exports.default = RouterContext; module.exports = exports['default']; }).call(this,require('_process')) -},{"./RouteUtils":44,"./deprecateObjectProperties":56,"./getRouteParams":58,"./routerWarning":63,"_process":29,"invariant":23,"react":"react"}],47:[function(require,module,exports){ +},{"./RouteUtils":54,"./deprecateObjectProperties":66,"./getRouteParams":68,"./routerWarning":73,"_process":33,"invariant":23,"react":"react"}],57:[function(require,module,exports){ (function (process){ 'use strict'; @@ -4866,7 +5558,7 @@ function createRoutingHistory(history, transitionManager) { } }).call(this,require('_process')) -},{"./deprecateObjectProperties":56,"_process":29}],48:[function(require,module,exports){ +},{"./deprecateObjectProperties":66,"_process":33}],58:[function(require,module,exports){ (function (process){ 'use strict'; @@ -4900,7 +5592,7 @@ exports.default = RoutingContext; module.exports = exports['default']; }).call(this,require('_process')) -},{"./RouterContext":46,"./routerWarning":63,"_process":29,"react":"react"}],49:[function(require,module,exports){ +},{"./RouterContext":56,"./routerWarning":73,"_process":33,"react":"react"}],59:[function(require,module,exports){ (function (process){ 'use strict'; @@ -5026,7 +5718,7 @@ function runLeaveHooks(routes) { } }).call(this,require('_process')) -},{"./AsyncUtils":31,"./routerWarning":63,"_process":29}],50:[function(require,module,exports){ +},{"./AsyncUtils":41,"./routerWarning":73,"_process":33}],60:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -5077,7 +5769,7 @@ exports.default = function () { }; module.exports = exports['default']; -},{"./RouterContext":46,"react":"react"}],51:[function(require,module,exports){ +},{"./RouterContext":56,"react":"react"}],61:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -5094,7 +5786,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de exports.default = (0, _createRouterHistory2.default)(_createBrowserHistory2.default); module.exports = exports['default']; -},{"./createRouterHistory":54,"history/lib/createBrowserHistory":12}],52:[function(require,module,exports){ +},{"./createRouterHistory":64,"history/lib/createBrowserHistory":12}],62:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -5172,7 +5864,7 @@ function computeChangedRoutes(prevState, nextState) { exports.default = computeChangedRoutes; module.exports = exports['default']; -},{"./PatternUtils":39}],53:[function(require,module,exports){ +},{"./PatternUtils":49}],63:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -5205,7 +5897,7 @@ function createMemoryHistory(options) { return history; } module.exports = exports['default']; -},{"history/lib/createMemoryHistory":17,"history/lib/useBasename":20,"history/lib/useQueries":21}],54:[function(require,module,exports){ +},{"history/lib/createMemoryHistory":17,"history/lib/useBasename":20,"history/lib/useQueries":21}],64:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -5225,7 +5917,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de var canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement); module.exports = exports['default']; -},{"./useRouterHistory":64}],55:[function(require,module,exports){ +},{"./useRouterHistory":74}],65:[function(require,module,exports){ (function (process){ 'use strict'; @@ -5536,7 +6228,7 @@ function createTransitionManager(history, routes) { module.exports = exports['default']; }).call(this,require('_process')) -},{"./TransitionUtils":49,"./computeChangedRoutes":52,"./getComponents":57,"./isActive":60,"./matchRoutes":62,"./routerWarning":63,"_process":29,"history/lib/Actions":6}],56:[function(require,module,exports){ +},{"./TransitionUtils":59,"./computeChangedRoutes":62,"./getComponents":67,"./isActive":70,"./matchRoutes":72,"./routerWarning":73,"_process":33,"history/lib/Actions":6}],66:[function(require,module,exports){ (function (process){ 'use strict'; @@ -5615,7 +6307,7 @@ if (process.env.NODE_ENV !== 'production') { exports.default = deprecateObjectProperties; }).call(this,require('_process')) -},{"./routerWarning":63,"_process":29}],57:[function(require,module,exports){ +},{"./routerWarning":73,"_process":33}],67:[function(require,module,exports){ (function (process){ 'use strict'; @@ -5698,7 +6390,7 @@ exports.default = getComponents; module.exports = exports['default']; }).call(this,require('_process')) -},{"./AsyncUtils":31,"./deprecateObjectProperties":56,"./routerWarning":63,"_process":29}],58:[function(require,module,exports){ +},{"./AsyncUtils":41,"./deprecateObjectProperties":66,"./routerWarning":73,"_process":33}],68:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -5727,7 +6419,7 @@ function getRouteParams(route, params) { exports.default = getRouteParams; module.exports = exports['default']; -},{"./PatternUtils":39}],59:[function(require,module,exports){ +},{"./PatternUtils":49}],69:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -5744,7 +6436,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de exports.default = (0, _createRouterHistory2.default)(_createHashHistory2.default); module.exports = exports['default']; -},{"./createRouterHistory":54,"history/lib/createHashHistory":14}],60:[function(require,module,exports){ +},{"./createRouterHistory":64,"history/lib/createHashHistory":14}],70:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -5897,7 +6589,7 @@ function isActive(_ref, indexOnly, currentLocation, routes, params) { return queryIsActive(query, currentLocation.query); } module.exports = exports['default']; -},{"./PatternUtils":39}],61:[function(require,module,exports){ +},{"./PatternUtils":49}],71:[function(require,module,exports){ (function (process){ 'use strict'; @@ -5982,7 +6674,7 @@ exports.default = match; module.exports = exports['default']; }).call(this,require('_process')) -},{"./RouteUtils":44,"./RouterUtils":47,"./createMemoryHistory":53,"./createTransitionManager":55,"_process":29,"invariant":23}],62:[function(require,module,exports){ +},{"./RouteUtils":54,"./RouterUtils":57,"./createMemoryHistory":63,"./createTransitionManager":65,"_process":33,"invariant":23}],72:[function(require,module,exports){ (function (process){ 'use strict'; @@ -6094,17 +6786,13 @@ function matchRouteDeep(route, location, remainingPathname, paramNames, paramVal // Only try to match the path if the route actually has a pattern, and if // we're not just searching for potential nested absolute paths. if (remainingPathname !== null && pattern) { - try { - var matched = (0, _PatternUtils.matchPattern)(pattern, remainingPathname); - if (matched) { - remainingPathname = matched.remainingPathname; - paramNames = [].concat(paramNames, matched.paramNames); - paramValues = [].concat(paramValues, matched.paramValues); - } else { - remainingPathname = null; - } - } catch (error) { - callback(error); + var matched = (0, _PatternUtils.matchPattern)(pattern, remainingPathname); + if (matched) { + remainingPathname = matched.remainingPathname; + paramNames = [].concat(paramNames, matched.paramNames); + paramValues = [].concat(paramValues, matched.paramValues); + } else { + remainingPathname = null; } // By assumption, pattern is non-empty here, which is the prerequisite for @@ -6219,7 +6907,7 @@ function matchRoutes(routes, location, callback, remainingPathname) { module.exports = exports['default']; }).call(this,require('_process')) -},{"./AsyncUtils":31,"./PatternUtils":39,"./RouteUtils":44,"./routerWarning":63,"_process":29}],63:[function(require,module,exports){ +},{"./AsyncUtils":41,"./PatternUtils":49,"./RouteUtils":54,"./routerWarning":73,"_process":33}],73:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -6256,7 +6944,7 @@ function routerWarning(falseToWarn, message) { function _resetWarned() { warned = {}; } -},{"warning":231}],64:[function(require,module,exports){ +},{"warning":249}],74:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -6280,7 +6968,7 @@ function useRouterHistory(createHistory) { }; } module.exports = exports['default']; -},{"history/lib/useBasename":20,"history/lib/useQueries":21}],65:[function(require,module,exports){ +},{"history/lib/useBasename":20,"history/lib/useQueries":21}],75:[function(require,module,exports){ (function (process){ 'use strict'; @@ -6335,7 +7023,7 @@ exports.default = useRoutes; module.exports = exports['default']; }).call(this,require('_process')) -},{"./createTransitionManager":55,"./routerWarning":63,"_process":29,"history/lib/useQueries":21}],66:[function(require,module,exports){ +},{"./createTransitionManager":65,"./routerWarning":73,"_process":33,"history/lib/useQueries":21}],76:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -6376,7 +7064,7 @@ function withRouter(WrappedComponent) { return (0, _hoistNonReactStatics2.default)(WithRouter, WrappedComponent); } module.exports = exports['default']; -},{"./PropTypes":40,"hoist-non-react-statics":22,"react":"react"}],67:[function(require,module,exports){ +},{"./PropTypes":50,"hoist-non-react-statics":22,"react":"react"}],77:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -6401,7 +7089,7 @@ var AutoFocusUtils = { }; module.exports = AutoFocusUtils; -},{"./ReactDOMComponentTree":106,"fbjs/lib/focusNode":213}],68:[function(require,module,exports){ +},{"./ReactDOMComponentTree":116,"fbjs/lib/focusNode":223}],78:[function(require,module,exports){ /** * Copyright 2013-present Facebook, Inc. * All rights reserved. @@ -6790,7 +7478,7 @@ var BeforeInputEventPlugin = { }; module.exports = BeforeInputEventPlugin; -},{"./EventConstants":82,"./EventPropagators":86,"./FallbackCompositionState":87,"./SyntheticCompositionEvent":162,"./SyntheticInputEvent":166,"fbjs/lib/ExecutionEnvironment":205,"fbjs/lib/keyOf":223}],69:[function(require,module,exports){ +},{"./EventConstants":92,"./EventPropagators":96,"./FallbackCompositionState":97,"./SyntheticCompositionEvent":172,"./SyntheticInputEvent":176,"fbjs/lib/ExecutionEnvironment":215,"fbjs/lib/keyOf":233}],79:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -6939,7 +7627,7 @@ var CSSProperty = { }; module.exports = CSSProperty; -},{}],70:[function(require,module,exports){ +},{}],80:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -7148,7 +7836,7 @@ ReactPerf.measureMethods(CSSPropertyOperations, 'CSSPropertyOperations', { module.exports = CSSPropertyOperations; }).call(this,require('_process')) -},{"./CSSProperty":69,"./ReactPerf":147,"./dangerousStyleValue":179,"_process":29,"fbjs/lib/ExecutionEnvironment":205,"fbjs/lib/camelizeStyleName":207,"fbjs/lib/hyphenateStyleName":218,"fbjs/lib/memoizeStringOnly":225,"fbjs/lib/warning":229}],71:[function(require,module,exports){ +},{"./CSSProperty":79,"./ReactPerf":157,"./dangerousStyleValue":189,"_process":33,"fbjs/lib/ExecutionEnvironment":215,"fbjs/lib/camelizeStyleName":217,"fbjs/lib/hyphenateStyleName":228,"fbjs/lib/memoizeStringOnly":235,"fbjs/lib/warning":239}],81:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -7257,7 +7945,7 @@ PooledClass.addPoolingTo(CallbackQueue); module.exports = CallbackQueue; }).call(this,require('_process')) -},{"./PooledClass":91,"_process":29,"fbjs/lib/invariant":219,"object-assign":28}],72:[function(require,module,exports){ +},{"./PooledClass":101,"_process":33,"fbjs/lib/invariant":229,"object-assign":32}],82:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -7583,7 +8271,7 @@ var ChangeEventPlugin = { }; module.exports = ChangeEventPlugin; -},{"./EventConstants":82,"./EventPluginHub":83,"./EventPropagators":86,"./ReactDOMComponentTree":106,"./ReactUpdates":155,"./SyntheticEvent":164,"./getEventTarget":187,"./isEventSupported":194,"./isTextInputElement":195,"fbjs/lib/ExecutionEnvironment":205,"fbjs/lib/keyOf":223}],73:[function(require,module,exports){ +},{"./EventConstants":92,"./EventPluginHub":93,"./EventPropagators":96,"./ReactDOMComponentTree":116,"./ReactUpdates":165,"./SyntheticEvent":174,"./getEventTarget":197,"./isEventSupported":204,"./isTextInputElement":205,"fbjs/lib/ExecutionEnvironment":215,"fbjs/lib/keyOf":233}],83:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -7743,7 +8431,7 @@ ReactPerf.measureMethods(DOMChildrenOperations, 'DOMChildrenOperations', { }); module.exports = DOMChildrenOperations; -},{"./DOMLazyTree":74,"./Danger":78,"./ReactMultiChildUpdateTypes":142,"./ReactPerf":147,"./createMicrosoftUnsafeLocalFunction":178,"./setInnerHTML":199,"./setTextContent":200}],74:[function(require,module,exports){ +},{"./DOMLazyTree":84,"./Danger":88,"./ReactMultiChildUpdateTypes":152,"./ReactPerf":157,"./createMicrosoftUnsafeLocalFunction":188,"./setInnerHTML":209,"./setTextContent":210}],84:[function(require,module,exports){ /** * Copyright 2015-present, Facebook, Inc. * All rights reserved. @@ -7849,7 +8537,7 @@ DOMLazyTree.queueHTML = queueHTML; DOMLazyTree.queueText = queueText; module.exports = DOMLazyTree; -},{"./createMicrosoftUnsafeLocalFunction":178,"./setTextContent":200}],75:[function(require,module,exports){ +},{"./createMicrosoftUnsafeLocalFunction":188,"./setTextContent":210}],85:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -7870,7 +8558,7 @@ var DOMNamespaces = { }; module.exports = DOMNamespaces; -},{}],76:[function(require,module,exports){ +},{}],86:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -8087,7 +8775,7 @@ var DOMProperty = { module.exports = DOMProperty; }).call(this,require('_process')) -},{"_process":29,"fbjs/lib/invariant":219}],77:[function(require,module,exports){ +},{"_process":33,"fbjs/lib/invariant":229}],87:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -8304,7 +8992,7 @@ ReactPerf.measureMethods(DOMPropertyOperations, 'DOMPropertyOperations', { module.exports = DOMPropertyOperations; }).call(this,require('_process')) -},{"./DOMProperty":76,"./ReactDOMInstrumentation":114,"./ReactPerf":147,"./quoteAttributeValueForBrowser":197,"_process":29,"fbjs/lib/warning":229}],78:[function(require,module,exports){ +},{"./DOMProperty":86,"./ReactDOMInstrumentation":124,"./ReactPerf":157,"./quoteAttributeValueForBrowser":207,"_process":33,"fbjs/lib/warning":239}],88:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -8452,7 +9140,7 @@ var Danger = { module.exports = Danger; }).call(this,require('_process')) -},{"./DOMLazyTree":74,"_process":29,"fbjs/lib/ExecutionEnvironment":205,"fbjs/lib/createNodesFromMarkup":210,"fbjs/lib/emptyFunction":211,"fbjs/lib/getMarkupWrap":215,"fbjs/lib/invariant":219}],79:[function(require,module,exports){ +},{"./DOMLazyTree":84,"_process":33,"fbjs/lib/ExecutionEnvironment":215,"fbjs/lib/createNodesFromMarkup":220,"fbjs/lib/emptyFunction":221,"fbjs/lib/getMarkupWrap":225,"fbjs/lib/invariant":229}],89:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -8480,7 +9168,7 @@ var keyOf = require('fbjs/lib/keyOf'); var DefaultEventPluginOrder = [keyOf({ ResponderEventPlugin: null }), keyOf({ SimpleEventPlugin: null }), keyOf({ TapEventPlugin: null }), keyOf({ EnterLeaveEventPlugin: null }), keyOf({ ChangeEventPlugin: null }), keyOf({ SelectEventPlugin: null }), keyOf({ BeforeInputEventPlugin: null })]; module.exports = DefaultEventPluginOrder; -},{"fbjs/lib/keyOf":223}],80:[function(require,module,exports){ +},{"fbjs/lib/keyOf":233}],90:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -8531,7 +9219,7 @@ var DisabledInputUtils = { }; module.exports = DisabledInputUtils; -},{}],81:[function(require,module,exports){ +},{}],91:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -8637,7 +9325,7 @@ var EnterLeaveEventPlugin = { }; module.exports = EnterLeaveEventPlugin; -},{"./EventConstants":82,"./EventPropagators":86,"./ReactDOMComponentTree":106,"./SyntheticMouseEvent":168,"fbjs/lib/keyOf":223}],82:[function(require,module,exports){ +},{"./EventConstants":92,"./EventPropagators":96,"./ReactDOMComponentTree":116,"./SyntheticMouseEvent":178,"fbjs/lib/keyOf":233}],92:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -8735,7 +9423,7 @@ var EventConstants = { }; module.exports = EventConstants; -},{"fbjs/lib/keyMirror":222}],83:[function(require,module,exports){ +},{"fbjs/lib/keyMirror":232}],93:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -8974,7 +9662,7 @@ var EventPluginHub = { module.exports = EventPluginHub; }).call(this,require('_process')) -},{"./EventPluginRegistry":84,"./EventPluginUtils":85,"./ReactErrorUtils":130,"./accumulateInto":175,"./forEachAccumulated":183,"_process":29,"fbjs/lib/invariant":219}],84:[function(require,module,exports){ +},{"./EventPluginRegistry":94,"./EventPluginUtils":95,"./ReactErrorUtils":140,"./accumulateInto":185,"./forEachAccumulated":193,"_process":33,"fbjs/lib/invariant":229}],94:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -9219,7 +9907,7 @@ var EventPluginRegistry = { module.exports = EventPluginRegistry; }).call(this,require('_process')) -},{"_process":29,"fbjs/lib/invariant":219}],85:[function(require,module,exports){ +},{"_process":33,"fbjs/lib/invariant":229}],95:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -9450,7 +10138,7 @@ var EventPluginUtils = { module.exports = EventPluginUtils; }).call(this,require('_process')) -},{"./EventConstants":82,"./ReactErrorUtils":130,"_process":29,"fbjs/lib/invariant":219,"fbjs/lib/warning":229}],86:[function(require,module,exports){ +},{"./EventConstants":92,"./ReactErrorUtils":140,"_process":33,"fbjs/lib/invariant":229,"fbjs/lib/warning":239}],96:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -9591,7 +10279,7 @@ var EventPropagators = { module.exports = EventPropagators; }).call(this,require('_process')) -},{"./EventConstants":82,"./EventPluginHub":83,"./EventPluginUtils":85,"./accumulateInto":175,"./forEachAccumulated":183,"_process":29,"fbjs/lib/warning":229}],87:[function(require,module,exports){ +},{"./EventConstants":92,"./EventPluginHub":93,"./EventPluginUtils":95,"./accumulateInto":185,"./forEachAccumulated":193,"_process":33,"fbjs/lib/warning":239}],97:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -9687,7 +10375,7 @@ _assign(FallbackCompositionState.prototype, { PooledClass.addPoolingTo(FallbackCompositionState); module.exports = FallbackCompositionState; -},{"./PooledClass":91,"./getTextContentAccessor":191,"object-assign":28}],88:[function(require,module,exports){ +},{"./PooledClass":101,"./getTextContentAccessor":201,"object-assign":32}],98:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -9897,7 +10585,7 @@ var HTMLDOMPropertyConfig = { }; module.exports = HTMLDOMPropertyConfig; -},{"./DOMProperty":76}],89:[function(require,module,exports){ +},{"./DOMProperty":86}],99:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -9956,7 +10644,7 @@ var KeyEscapeUtils = { }; module.exports = KeyEscapeUtils; -},{}],90:[function(require,module,exports){ +},{}],100:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -10093,7 +10781,7 @@ var LinkedValueUtils = { module.exports = LinkedValueUtils; }).call(this,require('_process')) -},{"./ReactPropTypeLocations":149,"./ReactPropTypes":150,"_process":29,"fbjs/lib/invariant":219,"fbjs/lib/warning":229}],91:[function(require,module,exports){ +},{"./ReactPropTypeLocations":159,"./ReactPropTypes":160,"_process":33,"fbjs/lib/invariant":229,"fbjs/lib/warning":239}],101:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -10216,7 +10904,7 @@ var PooledClass = { module.exports = PooledClass; }).call(this,require('_process')) -},{"_process":29,"fbjs/lib/invariant":219}],92:[function(require,module,exports){ +},{"_process":33,"fbjs/lib/invariant":229}],102:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -10307,7 +10995,7 @@ var React = { module.exports = React; }).call(this,require('_process')) -},{"./ReactChildren":95,"./ReactClass":96,"./ReactComponent":97,"./ReactDOMFactories":110,"./ReactElement":127,"./ReactElementValidator":128,"./ReactPropTypes":150,"./ReactVersion":156,"./onlyChild":196,"_process":29,"fbjs/lib/warning":229,"object-assign":28}],93:[function(require,module,exports){ +},{"./ReactChildren":105,"./ReactClass":106,"./ReactComponent":107,"./ReactDOMFactories":120,"./ReactElement":137,"./ReactElementValidator":138,"./ReactPropTypes":160,"./ReactVersion":166,"./onlyChild":206,"_process":33,"fbjs/lib/warning":239,"object-assign":32}],103:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -10625,7 +11313,7 @@ var ReactBrowserEventEmitter = _assign({}, ReactEventEmitterMixin, { }); module.exports = ReactBrowserEventEmitter; -},{"./EventConstants":82,"./EventPluginRegistry":84,"./ReactEventEmitterMixin":131,"./ViewportMetrics":174,"./getVendorPrefixedEventName":192,"./isEventSupported":194,"object-assign":28}],94:[function(require,module,exports){ +},{"./EventConstants":92,"./EventPluginRegistry":94,"./ReactEventEmitterMixin":141,"./ViewportMetrics":184,"./getVendorPrefixedEventName":202,"./isEventSupported":204,"object-assign":32}],104:[function(require,module,exports){ (function (process){ /** * Copyright 2014-present, Facebook, Inc. @@ -10754,7 +11442,7 @@ var ReactChildReconciler = { module.exports = ReactChildReconciler; }).call(this,require('_process')) -},{"./KeyEscapeUtils":89,"./ReactReconciler":152,"./instantiateReactComponent":193,"./shouldUpdateReactComponent":201,"./traverseAllChildren":202,"_process":29,"fbjs/lib/warning":229}],95:[function(require,module,exports){ +},{"./KeyEscapeUtils":99,"./ReactReconciler":162,"./instantiateReactComponent":203,"./shouldUpdateReactComponent":211,"./traverseAllChildren":212,"_process":33,"fbjs/lib/warning":239}],105:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -10938,7 +11626,7 @@ var ReactChildren = { }; module.exports = ReactChildren; -},{"./PooledClass":91,"./ReactElement":127,"./traverseAllChildren":202,"fbjs/lib/emptyFunction":211}],96:[function(require,module,exports){ +},{"./PooledClass":101,"./ReactElement":137,"./traverseAllChildren":212,"fbjs/lib/emptyFunction":221}],106:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -11665,7 +12353,7 @@ var ReactClass = { module.exports = ReactClass; }).call(this,require('_process')) -},{"./ReactComponent":97,"./ReactElement":127,"./ReactNoopUpdateQueue":145,"./ReactPropTypeLocationNames":148,"./ReactPropTypeLocations":149,"_process":29,"fbjs/lib/emptyObject":212,"fbjs/lib/invariant":219,"fbjs/lib/keyMirror":222,"fbjs/lib/keyOf":223,"fbjs/lib/warning":229,"object-assign":28}],97:[function(require,module,exports){ +},{"./ReactComponent":107,"./ReactElement":137,"./ReactNoopUpdateQueue":155,"./ReactPropTypeLocationNames":158,"./ReactPropTypeLocations":159,"_process":33,"fbjs/lib/emptyObject":222,"fbjs/lib/invariant":229,"fbjs/lib/keyMirror":232,"fbjs/lib/keyOf":233,"fbjs/lib/warning":239,"object-assign":32}],107:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -11790,7 +12478,7 @@ if (process.env.NODE_ENV !== 'production') { module.exports = ReactComponent; }).call(this,require('_process')) -},{"./ReactInstrumentation":137,"./ReactNoopUpdateQueue":145,"./canDefineProperty":177,"_process":29,"fbjs/lib/emptyObject":212,"fbjs/lib/invariant":219,"fbjs/lib/warning":229}],98:[function(require,module,exports){ +},{"./ReactInstrumentation":147,"./ReactNoopUpdateQueue":155,"./canDefineProperty":187,"_process":33,"fbjs/lib/emptyObject":222,"fbjs/lib/invariant":229,"fbjs/lib/warning":239}],108:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -11835,7 +12523,7 @@ ReactPerf.measureMethods(ReactComponentBrowserEnvironment, 'ReactComponentBrowse }); module.exports = ReactComponentBrowserEnvironment; -},{"./DOMChildrenOperations":73,"./ReactDOMIDOperations":112,"./ReactPerf":147}],99:[function(require,module,exports){ +},{"./DOMChildrenOperations":83,"./ReactDOMIDOperations":122,"./ReactPerf":157}],109:[function(require,module,exports){ (function (process){ /** * Copyright 2014-present, Facebook, Inc. @@ -11890,7 +12578,7 @@ var ReactComponentEnvironment = { module.exports = ReactComponentEnvironment; }).call(this,require('_process')) -},{"_process":29,"fbjs/lib/invariant":219}],100:[function(require,module,exports){ +},{"_process":33,"fbjs/lib/invariant":229}],110:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -12688,7 +13376,7 @@ var ReactCompositeComponent = { module.exports = ReactCompositeComponent; }).call(this,require('_process')) -},{"./ReactComponentEnvironment":99,"./ReactCurrentOwner":101,"./ReactElement":127,"./ReactErrorUtils":130,"./ReactInstanceMap":136,"./ReactInstrumentation":137,"./ReactNodeTypes":144,"./ReactPerf":147,"./ReactPropTypeLocationNames":148,"./ReactPropTypeLocations":149,"./ReactReconciler":152,"./ReactUpdateQueue":154,"./shouldUpdateReactComponent":201,"_process":29,"fbjs/lib/emptyObject":212,"fbjs/lib/invariant":219,"fbjs/lib/warning":229,"object-assign":28}],101:[function(require,module,exports){ +},{"./ReactComponentEnvironment":109,"./ReactCurrentOwner":111,"./ReactElement":137,"./ReactErrorUtils":140,"./ReactInstanceMap":146,"./ReactInstrumentation":147,"./ReactNodeTypes":154,"./ReactPerf":157,"./ReactPropTypeLocationNames":158,"./ReactPropTypeLocations":159,"./ReactReconciler":162,"./ReactUpdateQueue":164,"./shouldUpdateReactComponent":211,"_process":33,"fbjs/lib/emptyObject":222,"fbjs/lib/invariant":229,"fbjs/lib/warning":239,"object-assign":32}],111:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -12720,7 +13408,7 @@ var ReactCurrentOwner = { }; module.exports = ReactCurrentOwner; -},{}],102:[function(require,module,exports){ +},{}],112:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -12828,7 +13516,7 @@ if (process.env.NODE_ENV !== 'production') { module.exports = React; }).call(this,require('_process')) -},{"./ReactDOMComponentTree":106,"./ReactDefaultInjection":124,"./ReactMount":140,"./ReactPerf":147,"./ReactReconciler":152,"./ReactUpdates":155,"./ReactVersion":156,"./findDOMNode":181,"./getNativeComponentFromComposite":189,"./renderSubtreeIntoContainer":198,"_process":29,"fbjs/lib/ExecutionEnvironment":205,"fbjs/lib/warning":229}],103:[function(require,module,exports){ +},{"./ReactDOMComponentTree":116,"./ReactDefaultInjection":134,"./ReactMount":150,"./ReactPerf":157,"./ReactReconciler":162,"./ReactUpdates":165,"./ReactVersion":166,"./findDOMNode":191,"./getNativeComponentFromComposite":199,"./renderSubtreeIntoContainer":208,"_process":33,"fbjs/lib/ExecutionEnvironment":215,"fbjs/lib/warning":239}],113:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -12853,7 +13541,7 @@ var ReactDOMButton = { }; module.exports = ReactDOMButton; -},{"./DisabledInputUtils":80}],104:[function(require,module,exports){ +},{"./DisabledInputUtils":90}],114:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -13766,7 +14454,7 @@ _assign(ReactDOMComponent.prototype, ReactDOMComponent.Mixin, ReactMultiChild.Mi module.exports = ReactDOMComponent; }).call(this,require('_process')) -},{"./AutoFocusUtils":67,"./CSSPropertyOperations":70,"./DOMLazyTree":74,"./DOMNamespaces":75,"./DOMProperty":76,"./DOMPropertyOperations":77,"./EventConstants":82,"./EventPluginHub":83,"./EventPluginRegistry":84,"./ReactBrowserEventEmitter":93,"./ReactComponentBrowserEnvironment":98,"./ReactDOMButton":103,"./ReactDOMComponentFlags":105,"./ReactDOMComponentTree":106,"./ReactDOMInput":113,"./ReactDOMOption":115,"./ReactDOMSelect":116,"./ReactDOMTextarea":119,"./ReactMultiChild":141,"./ReactPerf":147,"./escapeTextContentForBrowser":180,"./isEventSupported":194,"./validateDOMNesting":203,"_process":29,"fbjs/lib/invariant":219,"fbjs/lib/keyOf":223,"fbjs/lib/shallowEqual":228,"fbjs/lib/warning":229,"object-assign":28}],105:[function(require,module,exports){ +},{"./AutoFocusUtils":77,"./CSSPropertyOperations":80,"./DOMLazyTree":84,"./DOMNamespaces":85,"./DOMProperty":86,"./DOMPropertyOperations":87,"./EventConstants":92,"./EventPluginHub":93,"./EventPluginRegistry":94,"./ReactBrowserEventEmitter":103,"./ReactComponentBrowserEnvironment":108,"./ReactDOMButton":113,"./ReactDOMComponentFlags":115,"./ReactDOMComponentTree":116,"./ReactDOMInput":123,"./ReactDOMOption":125,"./ReactDOMSelect":126,"./ReactDOMTextarea":129,"./ReactMultiChild":151,"./ReactPerf":157,"./escapeTextContentForBrowser":190,"./isEventSupported":204,"./validateDOMNesting":213,"_process":33,"fbjs/lib/invariant":229,"fbjs/lib/keyOf":233,"fbjs/lib/shallowEqual":238,"fbjs/lib/warning":239,"object-assign":32}],115:[function(require,module,exports){ /** * Copyright 2015-present, Facebook, Inc. * All rights reserved. @@ -13785,7 +14473,7 @@ var ReactDOMComponentFlags = { }; module.exports = ReactDOMComponentFlags; -},{}],106:[function(require,module,exports){ +},{}],116:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -13975,7 +14663,7 @@ var ReactDOMComponentTree = { module.exports = ReactDOMComponentTree; }).call(this,require('_process')) -},{"./DOMProperty":76,"./ReactDOMComponentFlags":105,"_process":29,"fbjs/lib/invariant":219}],107:[function(require,module,exports){ +},{"./DOMProperty":86,"./ReactDOMComponentFlags":115,"_process":33,"fbjs/lib/invariant":229}],117:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -14012,7 +14700,7 @@ function ReactDOMContainerInfo(topLevelWrapper, node) { module.exports = ReactDOMContainerInfo; }).call(this,require('_process')) -},{"./validateDOMNesting":203,"_process":29}],108:[function(require,module,exports){ +},{"./validateDOMNesting":213,"_process":33}],118:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -14077,7 +14765,7 @@ ReactDOMDebugTool.addDevtool(ReactDOMUnknownPropertyDevtool); module.exports = ReactDOMDebugTool; }).call(this,require('_process')) -},{"./ReactDOMUnknownPropertyDevtool":121,"_process":29,"fbjs/lib/warning":229}],109:[function(require,module,exports){ +},{"./ReactDOMUnknownPropertyDevtool":131,"_process":33,"fbjs/lib/warning":239}],119:[function(require,module,exports){ /** * Copyright 2014-present, Facebook, Inc. * All rights reserved. @@ -14138,7 +14826,7 @@ _assign(ReactDOMEmptyComponent.prototype, { }); module.exports = ReactDOMEmptyComponent; -},{"./DOMLazyTree":74,"./ReactDOMComponentTree":106,"object-assign":28}],110:[function(require,module,exports){ +},{"./DOMLazyTree":84,"./ReactDOMComponentTree":116,"object-assign":32}],120:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -14318,7 +15006,7 @@ var ReactDOMFactories = mapObject({ module.exports = ReactDOMFactories; }).call(this,require('_process')) -},{"./ReactElement":127,"./ReactElementValidator":128,"_process":29,"fbjs/lib/mapObject":224}],111:[function(require,module,exports){ +},{"./ReactElement":137,"./ReactElementValidator":138,"_process":33,"fbjs/lib/mapObject":234}],121:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -14337,7 +15025,7 @@ var ReactDOMFeatureFlags = { }; module.exports = ReactDOMFeatureFlags; -},{}],112:[function(require,module,exports){ +},{}],122:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -14377,7 +15065,7 @@ ReactPerf.measureMethods(ReactDOMIDOperations, 'ReactDOMIDOperations', { }); module.exports = ReactDOMIDOperations; -},{"./DOMChildrenOperations":73,"./ReactDOMComponentTree":106,"./ReactPerf":147}],113:[function(require,module,exports){ +},{"./DOMChildrenOperations":83,"./ReactDOMComponentTree":116,"./ReactPerf":157}],123:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -14585,7 +15273,7 @@ function _handleChange(event) { module.exports = ReactDOMInput; }).call(this,require('_process')) -},{"./DOMPropertyOperations":77,"./DisabledInputUtils":80,"./LinkedValueUtils":90,"./ReactDOMComponentTree":106,"./ReactUpdates":155,"_process":29,"fbjs/lib/invariant":219,"fbjs/lib/warning":229,"object-assign":28}],114:[function(require,module,exports){ +},{"./DOMPropertyOperations":87,"./DisabledInputUtils":90,"./LinkedValueUtils":100,"./ReactDOMComponentTree":116,"./ReactUpdates":165,"_process":33,"fbjs/lib/invariant":229,"fbjs/lib/warning":239,"object-assign":32}],124:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -14602,7 +15290,7 @@ module.exports = ReactDOMInput; var ReactDOMDebugTool = require('./ReactDOMDebugTool'); module.exports = { debugTool: ReactDOMDebugTool }; -},{"./ReactDOMDebugTool":108}],115:[function(require,module,exports){ +},{"./ReactDOMDebugTool":118}],125:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -14715,7 +15403,7 @@ var ReactDOMOption = { module.exports = ReactDOMOption; }).call(this,require('_process')) -},{"./ReactChildren":95,"./ReactDOMComponentTree":106,"./ReactDOMSelect":116,"_process":29,"fbjs/lib/warning":229,"object-assign":28}],116:[function(require,module,exports){ +},{"./ReactChildren":105,"./ReactDOMComponentTree":116,"./ReactDOMSelect":126,"_process":33,"fbjs/lib/warning":239,"object-assign":32}],126:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -14932,7 +15620,7 @@ function _handleChange(event) { module.exports = ReactDOMSelect; }).call(this,require('_process')) -},{"./DisabledInputUtils":80,"./LinkedValueUtils":90,"./ReactDOMComponentTree":106,"./ReactUpdates":155,"_process":29,"fbjs/lib/warning":229,"object-assign":28}],117:[function(require,module,exports){ +},{"./DisabledInputUtils":90,"./LinkedValueUtils":100,"./ReactDOMComponentTree":116,"./ReactUpdates":165,"_process":33,"fbjs/lib/warning":239,"object-assign":32}],127:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -15145,7 +15833,7 @@ var ReactDOMSelection = { }; module.exports = ReactDOMSelection; -},{"./getNodeForCharacterOffset":190,"./getTextContentAccessor":191,"fbjs/lib/ExecutionEnvironment":205}],118:[function(require,module,exports){ +},{"./getNodeForCharacterOffset":200,"./getTextContentAccessor":201,"fbjs/lib/ExecutionEnvironment":215}],128:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -15318,7 +16006,7 @@ ReactPerf.measureMethods(ReactDOMTextComponent.prototype, 'ReactDOMTextComponent module.exports = ReactDOMTextComponent; }).call(this,require('_process')) -},{"./DOMChildrenOperations":73,"./DOMLazyTree":74,"./ReactDOMComponentTree":106,"./ReactPerf":147,"./escapeTextContentForBrowser":180,"./validateDOMNesting":203,"_process":29,"fbjs/lib/invariant":219,"object-assign":28}],119:[function(require,module,exports){ +},{"./DOMChildrenOperations":83,"./DOMLazyTree":84,"./ReactDOMComponentTree":116,"./ReactPerf":157,"./escapeTextContentForBrowser":190,"./validateDOMNesting":213,"_process":33,"fbjs/lib/invariant":229,"object-assign":32}],129:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -15464,7 +16152,7 @@ function _handleChange(event) { module.exports = ReactDOMTextarea; }).call(this,require('_process')) -},{"./DOMPropertyOperations":77,"./DisabledInputUtils":80,"./LinkedValueUtils":90,"./ReactDOMComponentTree":106,"./ReactUpdates":155,"_process":29,"fbjs/lib/invariant":219,"fbjs/lib/warning":229,"object-assign":28}],120:[function(require,module,exports){ +},{"./DOMPropertyOperations":87,"./DisabledInputUtils":90,"./LinkedValueUtils":100,"./ReactDOMComponentTree":116,"./ReactUpdates":165,"_process":33,"fbjs/lib/invariant":229,"fbjs/lib/warning":239,"object-assign":32}],130:[function(require,module,exports){ (function (process){ /** * Copyright 2015-present, Facebook, Inc. @@ -15602,7 +16290,7 @@ module.exports = { }; }).call(this,require('_process')) -},{"_process":29,"fbjs/lib/invariant":219}],121:[function(require,module,exports){ +},{"_process":33,"fbjs/lib/invariant":229}],131:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -15670,7 +16358,7 @@ var ReactDOMUnknownPropertyDevtool = { module.exports = ReactDOMUnknownPropertyDevtool; }).call(this,require('_process')) -},{"./DOMProperty":76,"./EventPluginRegistry":84,"_process":29,"fbjs/lib/warning":229}],122:[function(require,module,exports){ +},{"./DOMProperty":86,"./EventPluginRegistry":94,"_process":33,"fbjs/lib/warning":239}],132:[function(require,module,exports){ (function (process){ /** * Copyright 2016-present, Facebook, Inc. @@ -15746,7 +16434,7 @@ ReactDebugTool.addDevtool(ReactInvalidSetStateWarningDevTool); module.exports = ReactDebugTool; }).call(this,require('_process')) -},{"./ReactInvalidSetStateWarningDevTool":138,"_process":29,"fbjs/lib/warning":229}],123:[function(require,module,exports){ +},{"./ReactInvalidSetStateWarningDevTool":148,"_process":33,"fbjs/lib/warning":239}],133:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -15815,7 +16503,7 @@ var ReactDefaultBatchingStrategy = { }; module.exports = ReactDefaultBatchingStrategy; -},{"./ReactUpdates":155,"./Transaction":173,"fbjs/lib/emptyFunction":211,"object-assign":28}],124:[function(require,module,exports){ +},{"./ReactUpdates":165,"./Transaction":183,"fbjs/lib/emptyFunction":221,"object-assign":32}],134:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -15912,7 +16600,7 @@ module.exports = { }; }).call(this,require('_process')) -},{"./BeforeInputEventPlugin":68,"./ChangeEventPlugin":72,"./DefaultEventPluginOrder":79,"./EnterLeaveEventPlugin":81,"./HTMLDOMPropertyConfig":88,"./ReactComponentBrowserEnvironment":98,"./ReactDOMComponent":104,"./ReactDOMComponentTree":106,"./ReactDOMEmptyComponent":109,"./ReactDOMTextComponent":118,"./ReactDOMTreeTraversal":120,"./ReactDefaultBatchingStrategy":123,"./ReactDefaultPerf":125,"./ReactEventListener":132,"./ReactInjection":134,"./ReactReconcileTransaction":151,"./SVGDOMPropertyConfig":157,"./SelectEventPlugin":158,"./SimpleEventPlugin":159,"_process":29,"fbjs/lib/ExecutionEnvironment":205}],125:[function(require,module,exports){ +},{"./BeforeInputEventPlugin":78,"./ChangeEventPlugin":82,"./DefaultEventPluginOrder":89,"./EnterLeaveEventPlugin":91,"./HTMLDOMPropertyConfig":98,"./ReactComponentBrowserEnvironment":108,"./ReactDOMComponent":114,"./ReactDOMComponentTree":116,"./ReactDOMEmptyComponent":119,"./ReactDOMTextComponent":128,"./ReactDOMTreeTraversal":130,"./ReactDefaultBatchingStrategy":133,"./ReactDefaultPerf":135,"./ReactEventListener":142,"./ReactInjection":144,"./ReactReconcileTransaction":161,"./SVGDOMPropertyConfig":167,"./SelectEventPlugin":168,"./SimpleEventPlugin":169,"_process":33,"fbjs/lib/ExecutionEnvironment":215}],135:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -16232,7 +16920,7 @@ var ReactDefaultPerf = { module.exports = ReactDefaultPerf; }).call(this,require('_process')) -},{"./DOMProperty":76,"./ReactDOMComponentTree":106,"./ReactDefaultPerfAnalysis":126,"./ReactMount":140,"./ReactPerf":147,"_process":29,"fbjs/lib/performanceNow":227,"fbjs/lib/warning":229}],126:[function(require,module,exports){ +},{"./DOMProperty":86,"./ReactDOMComponentTree":116,"./ReactDefaultPerfAnalysis":136,"./ReactMount":150,"./ReactPerf":157,"_process":33,"fbjs/lib/performanceNow":237,"fbjs/lib/warning":239}],136:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -16443,7 +17131,7 @@ var ReactDefaultPerfAnalysis = { }; module.exports = ReactDefaultPerfAnalysis; -},{"object-assign":28}],127:[function(require,module,exports){ +},{"object-assign":32}],137:[function(require,module,exports){ (function (process){ /** * Copyright 2014-present, Facebook, Inc. @@ -16734,7 +17422,7 @@ ReactElement.isValidElement = function (object) { module.exports = ReactElement; }).call(this,require('_process')) -},{"./ReactCurrentOwner":101,"./canDefineProperty":177,"_process":29,"fbjs/lib/warning":229,"object-assign":28}],128:[function(require,module,exports){ +},{"./ReactCurrentOwner":111,"./canDefineProperty":187,"_process":33,"fbjs/lib/warning":239,"object-assign":32}],138:[function(require,module,exports){ (function (process){ /** * Copyright 2014-present, Facebook, Inc. @@ -17019,7 +17707,7 @@ var ReactElementValidator = { module.exports = ReactElementValidator; }).call(this,require('_process')) -},{"./ReactCurrentOwner":101,"./ReactElement":127,"./ReactPropTypeLocationNames":148,"./ReactPropTypeLocations":149,"./canDefineProperty":177,"./getIteratorFn":188,"_process":29,"fbjs/lib/invariant":219,"fbjs/lib/warning":229}],129:[function(require,module,exports){ +},{"./ReactCurrentOwner":111,"./ReactElement":137,"./ReactPropTypeLocationNames":158,"./ReactPropTypeLocations":159,"./canDefineProperty":187,"./getIteratorFn":198,"_process":33,"fbjs/lib/invariant":229,"fbjs/lib/warning":239}],139:[function(require,module,exports){ /** * Copyright 2014-present, Facebook, Inc. * All rights reserved. @@ -17050,7 +17738,7 @@ var ReactEmptyComponent = { ReactEmptyComponent.injection = ReactEmptyComponentInjection; module.exports = ReactEmptyComponent; -},{}],130:[function(require,module,exports){ +},{}],140:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -17130,7 +17818,7 @@ if (process.env.NODE_ENV !== 'production') { module.exports = ReactErrorUtils; }).call(this,require('_process')) -},{"_process":29}],131:[function(require,module,exports){ +},{"_process":33}],141:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -17164,7 +17852,7 @@ var ReactEventEmitterMixin = { }; module.exports = ReactEventEmitterMixin; -},{"./EventPluginHub":83}],132:[function(require,module,exports){ +},{"./EventPluginHub":93}],142:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -17322,7 +18010,7 @@ var ReactEventListener = { }; module.exports = ReactEventListener; -},{"./PooledClass":91,"./ReactDOMComponentTree":106,"./ReactUpdates":155,"./getEventTarget":187,"fbjs/lib/EventListener":204,"fbjs/lib/ExecutionEnvironment":205,"fbjs/lib/getUnboundedScrollPosition":216,"object-assign":28}],133:[function(require,module,exports){ +},{"./PooledClass":101,"./ReactDOMComponentTree":116,"./ReactUpdates":165,"./getEventTarget":197,"fbjs/lib/EventListener":214,"fbjs/lib/ExecutionEnvironment":215,"fbjs/lib/getUnboundedScrollPosition":226,"object-assign":32}],143:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -17344,7 +18032,7 @@ var ReactFeatureFlags = { }; module.exports = ReactFeatureFlags; -},{}],134:[function(require,module,exports){ +},{}],144:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -17383,7 +18071,7 @@ var ReactInjection = { }; module.exports = ReactInjection; -},{"./DOMProperty":76,"./EventPluginHub":83,"./EventPluginUtils":85,"./ReactBrowserEventEmitter":93,"./ReactClass":96,"./ReactComponentEnvironment":99,"./ReactEmptyComponent":129,"./ReactNativeComponent":143,"./ReactPerf":147,"./ReactUpdates":155}],135:[function(require,module,exports){ +},{"./DOMProperty":86,"./EventPluginHub":93,"./EventPluginUtils":95,"./ReactBrowserEventEmitter":103,"./ReactClass":106,"./ReactComponentEnvironment":109,"./ReactEmptyComponent":139,"./ReactNativeComponent":153,"./ReactPerf":157,"./ReactUpdates":165}],145:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -17508,7 +18196,7 @@ var ReactInputSelection = { }; module.exports = ReactInputSelection; -},{"./ReactDOMSelection":117,"fbjs/lib/containsNode":208,"fbjs/lib/focusNode":213,"fbjs/lib/getActiveElement":214}],136:[function(require,module,exports){ +},{"./ReactDOMSelection":127,"fbjs/lib/containsNode":218,"fbjs/lib/focusNode":223,"fbjs/lib/getActiveElement":224}],146:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -17557,7 +18245,7 @@ var ReactInstanceMap = { }; module.exports = ReactInstanceMap; -},{}],137:[function(require,module,exports){ +},{}],147:[function(require,module,exports){ /** * Copyright 2016-present, Facebook, Inc. * All rights reserved. @@ -17574,7 +18262,7 @@ module.exports = ReactInstanceMap; var ReactDebugTool = require('./ReactDebugTool'); module.exports = { debugTool: ReactDebugTool }; -},{"./ReactDebugTool":122}],138:[function(require,module,exports){ +},{"./ReactDebugTool":132}],148:[function(require,module,exports){ (function (process){ /** * Copyright 2016-present, Facebook, Inc. @@ -17614,7 +18302,7 @@ var ReactInvalidSetStateWarningDevTool = { module.exports = ReactInvalidSetStateWarningDevTool; }).call(this,require('_process')) -},{"_process":29,"fbjs/lib/warning":229}],139:[function(require,module,exports){ +},{"_process":33,"fbjs/lib/warning":239}],149:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -17665,7 +18353,7 @@ var ReactMarkupChecksum = { }; module.exports = ReactMarkupChecksum; -},{"./adler32":176}],140:[function(require,module,exports){ +},{"./adler32":186}],150:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -18147,7 +18835,7 @@ ReactPerf.measureMethods(ReactMount, 'ReactMount', { module.exports = ReactMount; }).call(this,require('_process')) -},{"./DOMLazyTree":74,"./DOMProperty":76,"./ReactBrowserEventEmitter":93,"./ReactCurrentOwner":101,"./ReactDOMComponentTree":106,"./ReactDOMContainerInfo":107,"./ReactDOMFeatureFlags":111,"./ReactElement":127,"./ReactFeatureFlags":133,"./ReactInstrumentation":137,"./ReactMarkupChecksum":139,"./ReactPerf":147,"./ReactReconciler":152,"./ReactUpdateQueue":154,"./ReactUpdates":155,"./instantiateReactComponent":193,"./setInnerHTML":199,"./shouldUpdateReactComponent":201,"_process":29,"fbjs/lib/emptyObject":212,"fbjs/lib/invariant":219,"fbjs/lib/warning":229}],141:[function(require,module,exports){ +},{"./DOMLazyTree":84,"./DOMProperty":86,"./ReactBrowserEventEmitter":103,"./ReactCurrentOwner":111,"./ReactDOMComponentTree":116,"./ReactDOMContainerInfo":117,"./ReactDOMFeatureFlags":121,"./ReactElement":137,"./ReactFeatureFlags":143,"./ReactInstrumentation":147,"./ReactMarkupChecksum":149,"./ReactPerf":157,"./ReactReconciler":162,"./ReactUpdateQueue":164,"./ReactUpdates":165,"./instantiateReactComponent":203,"./setInnerHTML":209,"./shouldUpdateReactComponent":211,"_process":33,"fbjs/lib/emptyObject":222,"fbjs/lib/invariant":229,"fbjs/lib/warning":239}],151:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -18553,7 +19241,7 @@ var ReactMultiChild = { module.exports = ReactMultiChild; }).call(this,require('_process')) -},{"./ReactChildReconciler":94,"./ReactComponentEnvironment":99,"./ReactCurrentOwner":101,"./ReactMultiChildUpdateTypes":142,"./ReactReconciler":152,"./flattenChildren":182,"_process":29,"fbjs/lib/invariant":219}],142:[function(require,module,exports){ +},{"./ReactChildReconciler":104,"./ReactComponentEnvironment":109,"./ReactCurrentOwner":111,"./ReactMultiChildUpdateTypes":152,"./ReactReconciler":162,"./flattenChildren":192,"_process":33,"fbjs/lib/invariant":229}],152:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -18586,7 +19274,7 @@ var ReactMultiChildUpdateTypes = keyMirror({ }); module.exports = ReactMultiChildUpdateTypes; -},{"fbjs/lib/keyMirror":222}],143:[function(require,module,exports){ +},{"fbjs/lib/keyMirror":232}],153:[function(require,module,exports){ (function (process){ /** * Copyright 2014-present, Facebook, Inc. @@ -18685,7 +19373,7 @@ var ReactNativeComponent = { module.exports = ReactNativeComponent; }).call(this,require('_process')) -},{"_process":29,"fbjs/lib/invariant":219,"object-assign":28}],144:[function(require,module,exports){ +},{"_process":33,"fbjs/lib/invariant":229,"object-assign":32}],154:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -18726,7 +19414,7 @@ var ReactNodeTypes = { module.exports = ReactNodeTypes; }).call(this,require('_process')) -},{"./ReactElement":127,"_process":29,"fbjs/lib/invariant":219}],145:[function(require,module,exports){ +},{"./ReactElement":137,"_process":33,"fbjs/lib/invariant":229}],155:[function(require,module,exports){ (function (process){ /** * Copyright 2015-present, Facebook, Inc. @@ -18825,7 +19513,7 @@ var ReactNoopUpdateQueue = { module.exports = ReactNoopUpdateQueue; }).call(this,require('_process')) -},{"_process":29,"fbjs/lib/warning":229}],146:[function(require,module,exports){ +},{"_process":33,"fbjs/lib/warning":239}],156:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -18921,7 +19609,7 @@ var ReactOwner = { module.exports = ReactOwner; }).call(this,require('_process')) -},{"_process":29,"fbjs/lib/invariant":219}],147:[function(require,module,exports){ +},{"_process":33,"fbjs/lib/invariant":229}],157:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -19021,7 +19709,7 @@ function _noMeasure(objName, fnName, func) { module.exports = ReactPerf; }).call(this,require('_process')) -},{"_process":29}],148:[function(require,module,exports){ +},{"_process":33}],158:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -19049,7 +19737,7 @@ if (process.env.NODE_ENV !== 'production') { module.exports = ReactPropTypeLocationNames; }).call(this,require('_process')) -},{"_process":29}],149:[function(require,module,exports){ +},{"_process":33}],159:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -19072,7 +19760,7 @@ var ReactPropTypeLocations = keyMirror({ }); module.exports = ReactPropTypeLocations; -},{"fbjs/lib/keyMirror":222}],150:[function(require,module,exports){ +},{"fbjs/lib/keyMirror":232}],160:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -19453,7 +20141,7 @@ function getClassName(propValue) { } module.exports = ReactPropTypes; -},{"./ReactElement":127,"./ReactPropTypeLocationNames":148,"./getIteratorFn":188,"fbjs/lib/emptyFunction":211}],151:[function(require,module,exports){ +},{"./ReactElement":137,"./ReactPropTypeLocationNames":158,"./getIteratorFn":198,"fbjs/lib/emptyFunction":221}],161:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -19616,7 +20304,7 @@ _assign(ReactReconcileTransaction.prototype, Transaction.Mixin, Mixin); PooledClass.addPoolingTo(ReactReconcileTransaction); module.exports = ReactReconcileTransaction; -},{"./CallbackQueue":71,"./PooledClass":91,"./ReactBrowserEventEmitter":93,"./ReactInputSelection":135,"./Transaction":173,"object-assign":28}],152:[function(require,module,exports){ +},{"./CallbackQueue":81,"./PooledClass":101,"./ReactBrowserEventEmitter":103,"./ReactInputSelection":145,"./Transaction":183,"object-assign":32}],162:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -19750,7 +20438,7 @@ var ReactReconciler = { module.exports = ReactReconciler; }).call(this,require('_process')) -},{"./ReactInstrumentation":137,"./ReactRef":153,"_process":29}],153:[function(require,module,exports){ +},{"./ReactInstrumentation":147,"./ReactRef":163,"_process":33}],163:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -19829,7 +20517,7 @@ ReactRef.detachRefs = function (instance, element) { }; module.exports = ReactRef; -},{"./ReactOwner":146}],154:[function(require,module,exports){ +},{"./ReactOwner":156}],164:[function(require,module,exports){ (function (process){ /** * Copyright 2015-present, Facebook, Inc. @@ -20048,7 +20736,7 @@ var ReactUpdateQueue = { module.exports = ReactUpdateQueue; }).call(this,require('_process')) -},{"./ReactCurrentOwner":101,"./ReactInstanceMap":136,"./ReactUpdates":155,"_process":29,"fbjs/lib/invariant":219,"fbjs/lib/warning":229}],155:[function(require,module,exports){ +},{"./ReactCurrentOwner":111,"./ReactInstanceMap":146,"./ReactUpdates":165,"_process":33,"fbjs/lib/invariant":229,"fbjs/lib/warning":239}],165:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -20293,7 +20981,7 @@ var ReactUpdates = { module.exports = ReactUpdates; }).call(this,require('_process')) -},{"./CallbackQueue":71,"./PooledClass":91,"./ReactFeatureFlags":133,"./ReactPerf":147,"./ReactReconciler":152,"./Transaction":173,"_process":29,"fbjs/lib/invariant":219,"object-assign":28}],156:[function(require,module,exports){ +},{"./CallbackQueue":81,"./PooledClass":101,"./ReactFeatureFlags":143,"./ReactPerf":157,"./ReactReconciler":162,"./Transaction":183,"_process":33,"fbjs/lib/invariant":229,"object-assign":32}],166:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -20308,7 +20996,7 @@ module.exports = ReactUpdates; 'use strict'; module.exports = '15.0.2'; -},{}],157:[function(require,module,exports){ +},{}],167:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -20609,7 +21297,7 @@ Object.keys(ATTRS).forEach(function (key) { }); module.exports = SVGDOMPropertyConfig; -},{}],158:[function(require,module,exports){ +},{}],168:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -20806,7 +21494,7 @@ var SelectEventPlugin = { }; module.exports = SelectEventPlugin; -},{"./EventConstants":82,"./EventPropagators":86,"./ReactDOMComponentTree":106,"./ReactInputSelection":135,"./SyntheticEvent":164,"./isTextInputElement":195,"fbjs/lib/ExecutionEnvironment":205,"fbjs/lib/getActiveElement":214,"fbjs/lib/keyOf":223,"fbjs/lib/shallowEqual":228}],159:[function(require,module,exports){ +},{"./EventConstants":92,"./EventPropagators":96,"./ReactDOMComponentTree":116,"./ReactInputSelection":145,"./SyntheticEvent":174,"./isTextInputElement":205,"fbjs/lib/ExecutionEnvironment":215,"fbjs/lib/getActiveElement":224,"fbjs/lib/keyOf":233,"fbjs/lib/shallowEqual":238}],169:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -21437,7 +22125,7 @@ var SimpleEventPlugin = { module.exports = SimpleEventPlugin; }).call(this,require('_process')) -},{"./EventConstants":82,"./EventPropagators":86,"./ReactDOMComponentTree":106,"./SyntheticAnimationEvent":160,"./SyntheticClipboardEvent":161,"./SyntheticDragEvent":163,"./SyntheticEvent":164,"./SyntheticFocusEvent":165,"./SyntheticKeyboardEvent":167,"./SyntheticMouseEvent":168,"./SyntheticTouchEvent":169,"./SyntheticTransitionEvent":170,"./SyntheticUIEvent":171,"./SyntheticWheelEvent":172,"./getEventCharCode":184,"_process":29,"fbjs/lib/EventListener":204,"fbjs/lib/emptyFunction":211,"fbjs/lib/invariant":219,"fbjs/lib/keyOf":223}],160:[function(require,module,exports){ +},{"./EventConstants":92,"./EventPropagators":96,"./ReactDOMComponentTree":116,"./SyntheticAnimationEvent":170,"./SyntheticClipboardEvent":171,"./SyntheticDragEvent":173,"./SyntheticEvent":174,"./SyntheticFocusEvent":175,"./SyntheticKeyboardEvent":177,"./SyntheticMouseEvent":178,"./SyntheticTouchEvent":179,"./SyntheticTransitionEvent":180,"./SyntheticUIEvent":181,"./SyntheticWheelEvent":182,"./getEventCharCode":194,"_process":33,"fbjs/lib/EventListener":214,"fbjs/lib/emptyFunction":221,"fbjs/lib/invariant":229,"fbjs/lib/keyOf":233}],170:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -21477,7 +22165,7 @@ function SyntheticAnimationEvent(dispatchConfig, dispatchMarker, nativeEvent, na SyntheticEvent.augmentClass(SyntheticAnimationEvent, AnimationEventInterface); module.exports = SyntheticAnimationEvent; -},{"./SyntheticEvent":164}],161:[function(require,module,exports){ +},{"./SyntheticEvent":174}],171:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -21516,7 +22204,7 @@ function SyntheticClipboardEvent(dispatchConfig, dispatchMarker, nativeEvent, na SyntheticEvent.augmentClass(SyntheticClipboardEvent, ClipboardEventInterface); module.exports = SyntheticClipboardEvent; -},{"./SyntheticEvent":164}],162:[function(require,module,exports){ +},{"./SyntheticEvent":174}],172:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -21553,7 +22241,7 @@ function SyntheticCompositionEvent(dispatchConfig, dispatchMarker, nativeEvent, SyntheticEvent.augmentClass(SyntheticCompositionEvent, CompositionEventInterface); module.exports = SyntheticCompositionEvent; -},{"./SyntheticEvent":164}],163:[function(require,module,exports){ +},{"./SyntheticEvent":174}],173:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -21590,7 +22278,7 @@ function SyntheticDragEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeE SyntheticMouseEvent.augmentClass(SyntheticDragEvent, DragEventInterface); module.exports = SyntheticDragEvent; -},{"./SyntheticMouseEvent":168}],164:[function(require,module,exports){ +},{"./SyntheticMouseEvent":178}],174:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -21855,7 +22543,7 @@ function getPooledWarningPropertyDefinition(propName, getVal) { } }).call(this,require('_process')) -},{"./PooledClass":91,"_process":29,"fbjs/lib/emptyFunction":211,"fbjs/lib/warning":229,"object-assign":28}],165:[function(require,module,exports){ +},{"./PooledClass":101,"_process":33,"fbjs/lib/emptyFunction":221,"fbjs/lib/warning":239,"object-assign":32}],175:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -21892,7 +22580,7 @@ function SyntheticFocusEvent(dispatchConfig, dispatchMarker, nativeEvent, native SyntheticUIEvent.augmentClass(SyntheticFocusEvent, FocusEventInterface); module.exports = SyntheticFocusEvent; -},{"./SyntheticUIEvent":171}],166:[function(require,module,exports){ +},{"./SyntheticUIEvent":181}],176:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -21930,7 +22618,7 @@ function SyntheticInputEvent(dispatchConfig, dispatchMarker, nativeEvent, native SyntheticEvent.augmentClass(SyntheticInputEvent, InputEventInterface); module.exports = SyntheticInputEvent; -},{"./SyntheticEvent":164}],167:[function(require,module,exports){ +},{"./SyntheticEvent":174}],177:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -22015,7 +22703,7 @@ function SyntheticKeyboardEvent(dispatchConfig, dispatchMarker, nativeEvent, nat SyntheticUIEvent.augmentClass(SyntheticKeyboardEvent, KeyboardEventInterface); module.exports = SyntheticKeyboardEvent; -},{"./SyntheticUIEvent":171,"./getEventCharCode":184,"./getEventKey":185,"./getEventModifierState":186}],168:[function(require,module,exports){ +},{"./SyntheticUIEvent":181,"./getEventCharCode":194,"./getEventKey":195,"./getEventModifierState":196}],178:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -22088,7 +22776,7 @@ function SyntheticMouseEvent(dispatchConfig, dispatchMarker, nativeEvent, native SyntheticUIEvent.augmentClass(SyntheticMouseEvent, MouseEventInterface); module.exports = SyntheticMouseEvent; -},{"./SyntheticUIEvent":171,"./ViewportMetrics":174,"./getEventModifierState":186}],169:[function(require,module,exports){ +},{"./SyntheticUIEvent":181,"./ViewportMetrics":184,"./getEventModifierState":196}],179:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -22134,7 +22822,7 @@ function SyntheticTouchEvent(dispatchConfig, dispatchMarker, nativeEvent, native SyntheticUIEvent.augmentClass(SyntheticTouchEvent, TouchEventInterface); module.exports = SyntheticTouchEvent; -},{"./SyntheticUIEvent":171,"./getEventModifierState":186}],170:[function(require,module,exports){ +},{"./SyntheticUIEvent":181,"./getEventModifierState":196}],180:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -22174,7 +22862,7 @@ function SyntheticTransitionEvent(dispatchConfig, dispatchMarker, nativeEvent, n SyntheticEvent.augmentClass(SyntheticTransitionEvent, TransitionEventInterface); module.exports = SyntheticTransitionEvent; -},{"./SyntheticEvent":164}],171:[function(require,module,exports){ +},{"./SyntheticEvent":174}],181:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -22234,7 +22922,7 @@ function SyntheticUIEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEve SyntheticEvent.augmentClass(SyntheticUIEvent, UIEventInterface); module.exports = SyntheticUIEvent; -},{"./SyntheticEvent":164,"./getEventTarget":187}],172:[function(require,module,exports){ +},{"./SyntheticEvent":174,"./getEventTarget":197}],182:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -22289,7 +22977,7 @@ function SyntheticWheelEvent(dispatchConfig, dispatchMarker, nativeEvent, native SyntheticMouseEvent.augmentClass(SyntheticWheelEvent, WheelEventInterface); module.exports = SyntheticWheelEvent; -},{"./SyntheticMouseEvent":168}],173:[function(require,module,exports){ +},{"./SyntheticMouseEvent":178}],183:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -22524,7 +23212,7 @@ var Transaction = { module.exports = Transaction; }).call(this,require('_process')) -},{"_process":29,"fbjs/lib/invariant":219}],174:[function(require,module,exports){ +},{"_process":33,"fbjs/lib/invariant":229}],184:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -22552,7 +23240,7 @@ var ViewportMetrics = { }; module.exports = ViewportMetrics; -},{}],175:[function(require,module,exports){ +},{}],185:[function(require,module,exports){ (function (process){ /** * Copyright 2014-present, Facebook, Inc. @@ -22615,7 +23303,7 @@ function accumulateInto(current, next) { module.exports = accumulateInto; }).call(this,require('_process')) -},{"_process":29,"fbjs/lib/invariant":219}],176:[function(require,module,exports){ +},{"_process":33,"fbjs/lib/invariant":229}],186:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -22659,7 +23347,7 @@ function adler32(data) { } module.exports = adler32; -},{}],177:[function(require,module,exports){ +},{}],187:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -22687,7 +23375,7 @@ if (process.env.NODE_ENV !== 'production') { module.exports = canDefineProperty; }).call(this,require('_process')) -},{"_process":29}],178:[function(require,module,exports){ +},{"_process":33}],188:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -22720,7 +23408,7 @@ var createMicrosoftUnsafeLocalFunction = function (func) { }; module.exports = createMicrosoftUnsafeLocalFunction; -},{}],179:[function(require,module,exports){ +},{}],189:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -22801,7 +23489,7 @@ function dangerousStyleValue(name, value, component) { module.exports = dangerousStyleValue; }).call(this,require('_process')) -},{"./CSSProperty":69,"_process":29,"fbjs/lib/warning":229}],180:[function(require,module,exports){ +},{"./CSSProperty":79,"_process":33,"fbjs/lib/warning":239}],190:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -22840,7 +23528,7 @@ function escapeTextContentForBrowser(text) { } module.exports = escapeTextContentForBrowser; -},{}],181:[function(require,module,exports){ +},{}],191:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -22900,7 +23588,7 @@ function findDOMNode(componentOrElement) { module.exports = findDOMNode; }).call(this,require('_process')) -},{"./ReactCurrentOwner":101,"./ReactDOMComponentTree":106,"./ReactInstanceMap":136,"./getNativeComponentFromComposite":189,"_process":29,"fbjs/lib/invariant":219,"fbjs/lib/warning":229}],182:[function(require,module,exports){ +},{"./ReactCurrentOwner":111,"./ReactDOMComponentTree":116,"./ReactInstanceMap":146,"./getNativeComponentFromComposite":199,"_process":33,"fbjs/lib/invariant":229,"fbjs/lib/warning":239}],192:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -22953,7 +23641,7 @@ function flattenChildren(children) { module.exports = flattenChildren; }).call(this,require('_process')) -},{"./KeyEscapeUtils":89,"./traverseAllChildren":202,"_process":29,"fbjs/lib/warning":229}],183:[function(require,module,exports){ +},{"./KeyEscapeUtils":99,"./traverseAllChildren":212,"_process":33,"fbjs/lib/warning":239}],193:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -22984,7 +23672,7 @@ var forEachAccumulated = function (arr, cb, scope) { }; module.exports = forEachAccumulated; -},{}],184:[function(require,module,exports){ +},{}],194:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -23035,7 +23723,7 @@ function getEventCharCode(nativeEvent) { } module.exports = getEventCharCode; -},{}],185:[function(require,module,exports){ +},{}],195:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -23138,7 +23826,7 @@ function getEventKey(nativeEvent) { } module.exports = getEventKey; -},{"./getEventCharCode":184}],186:[function(require,module,exports){ +},{"./getEventCharCode":194}],196:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -23182,7 +23870,7 @@ function getEventModifierState(nativeEvent) { } module.exports = getEventModifierState; -},{}],187:[function(require,module,exports){ +},{}],197:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -23218,7 +23906,7 @@ function getEventTarget(nativeEvent) { } module.exports = getEventTarget; -},{}],188:[function(require,module,exports){ +},{}],198:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -23259,7 +23947,7 @@ function getIteratorFn(maybeIterable) { } module.exports = getIteratorFn; -},{}],189:[function(require,module,exports){ +},{}],199:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -23290,7 +23978,7 @@ function getNativeComponentFromComposite(inst) { } module.exports = getNativeComponentFromComposite; -},{"./ReactNodeTypes":144}],190:[function(require,module,exports){ +},{"./ReactNodeTypes":154}],200:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -23365,7 +24053,7 @@ function getNodeForCharacterOffset(root, offset) { } module.exports = getNodeForCharacterOffset; -},{}],191:[function(require,module,exports){ +},{}],201:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -23399,7 +24087,7 @@ function getTextContentAccessor() { } module.exports = getTextContentAccessor; -},{"fbjs/lib/ExecutionEnvironment":205}],192:[function(require,module,exports){ +},{"fbjs/lib/ExecutionEnvironment":215}],202:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -23501,7 +24189,7 @@ function getVendorPrefixedEventName(eventName) { } module.exports = getVendorPrefixedEventName; -},{"fbjs/lib/ExecutionEnvironment":205}],193:[function(require,module,exports){ +},{"fbjs/lib/ExecutionEnvironment":215}],203:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -23616,7 +24304,7 @@ function instantiateReactComponent(node) { module.exports = instantiateReactComponent; }).call(this,require('_process')) -},{"./ReactCompositeComponent":100,"./ReactEmptyComponent":129,"./ReactNativeComponent":143,"_process":29,"fbjs/lib/invariant":219,"fbjs/lib/warning":229,"object-assign":28}],194:[function(require,module,exports){ +},{"./ReactCompositeComponent":110,"./ReactEmptyComponent":139,"./ReactNativeComponent":153,"_process":33,"fbjs/lib/invariant":229,"fbjs/lib/warning":239,"object-assign":32}],204:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -23677,7 +24365,7 @@ function isEventSupported(eventNameSuffix, capture) { } module.exports = isEventSupported; -},{"fbjs/lib/ExecutionEnvironment":205}],195:[function(require,module,exports){ +},{"fbjs/lib/ExecutionEnvironment":215}],205:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -23719,7 +24407,7 @@ function isTextInputElement(elem) { } module.exports = isTextInputElement; -},{}],196:[function(require,module,exports){ +},{}],206:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -23756,7 +24444,7 @@ function onlyChild(children) { module.exports = onlyChild; }).call(this,require('_process')) -},{"./ReactElement":127,"_process":29,"fbjs/lib/invariant":219}],197:[function(require,module,exports){ +},{"./ReactElement":137,"_process":33,"fbjs/lib/invariant":229}],207:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -23783,7 +24471,7 @@ function quoteAttributeValueForBrowser(value) { } module.exports = quoteAttributeValueForBrowser; -},{"./escapeTextContentForBrowser":180}],198:[function(require,module,exports){ +},{"./escapeTextContentForBrowser":190}],208:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -23800,7 +24488,7 @@ module.exports = quoteAttributeValueForBrowser; var ReactMount = require('./ReactMount'); module.exports = ReactMount.renderSubtreeIntoContainer; -},{"./ReactMount":140}],199:[function(require,module,exports){ +},{"./ReactMount":150}],209:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -23883,7 +24571,7 @@ if (ExecutionEnvironment.canUseDOM) { } module.exports = setInnerHTML; -},{"./createMicrosoftUnsafeLocalFunction":178,"fbjs/lib/ExecutionEnvironment":205}],200:[function(require,module,exports){ +},{"./createMicrosoftUnsafeLocalFunction":188,"fbjs/lib/ExecutionEnvironment":215}],210:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -23924,7 +24612,7 @@ if (ExecutionEnvironment.canUseDOM) { } module.exports = setTextContent; -},{"./escapeTextContentForBrowser":180,"./setInnerHTML":199,"fbjs/lib/ExecutionEnvironment":205}],201:[function(require,module,exports){ +},{"./escapeTextContentForBrowser":190,"./setInnerHTML":209,"fbjs/lib/ExecutionEnvironment":215}],211:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -23967,7 +24655,7 @@ function shouldUpdateReactComponent(prevElement, nextElement) { } module.exports = shouldUpdateReactComponent; -},{}],202:[function(require,module,exports){ +},{}],212:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -24129,7 +24817,7 @@ function traverseAllChildren(children, callback, traverseContext) { module.exports = traverseAllChildren; }).call(this,require('_process')) -},{"./KeyEscapeUtils":89,"./ReactCurrentOwner":101,"./ReactElement":127,"./getIteratorFn":188,"_process":29,"fbjs/lib/invariant":219,"fbjs/lib/warning":229}],203:[function(require,module,exports){ +},{"./KeyEscapeUtils":99,"./ReactCurrentOwner":111,"./ReactElement":137,"./getIteratorFn":198,"_process":33,"fbjs/lib/invariant":229,"fbjs/lib/warning":239}],213:[function(require,module,exports){ (function (process){ /** * Copyright 2015-present, Facebook, Inc. @@ -24502,7 +25190,7 @@ if (process.env.NODE_ENV !== 'production') { module.exports = validateDOMNesting; }).call(this,require('_process')) -},{"_process":29,"fbjs/lib/emptyFunction":211,"fbjs/lib/warning":229,"object-assign":28}],204:[function(require,module,exports){ +},{"_process":33,"fbjs/lib/emptyFunction":221,"fbjs/lib/warning":239,"object-assign":32}],214:[function(require,module,exports){ (function (process){ 'use strict'; @@ -24589,7 +25277,7 @@ var EventListener = { module.exports = EventListener; }).call(this,require('_process')) -},{"./emptyFunction":211,"_process":29}],205:[function(require,module,exports){ +},{"./emptyFunction":221,"_process":33}],215:[function(require,module,exports){ /** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. @@ -24625,7 +25313,7 @@ var ExecutionEnvironment = { }; module.exports = ExecutionEnvironment; -},{}],206:[function(require,module,exports){ +},{}],216:[function(require,module,exports){ "use strict"; /** @@ -24657,7 +25345,7 @@ function camelize(string) { } module.exports = camelize; -},{}],207:[function(require,module,exports){ +},{}],217:[function(require,module,exports){ /** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. @@ -24697,7 +25385,7 @@ function camelizeStyleName(string) { } module.exports = camelizeStyleName; -},{"./camelize":206}],208:[function(require,module,exports){ +},{"./camelize":216}],218:[function(require,module,exports){ 'use strict'; /** @@ -24741,7 +25429,7 @@ function containsNode(outerNode, innerNode) { } module.exports = containsNode; -},{"./isTextNode":221}],209:[function(require,module,exports){ +},{"./isTextNode":231}],219:[function(require,module,exports){ (function (process){ 'use strict'; @@ -24871,7 +25559,7 @@ function createArrayFromMixed(obj) { module.exports = createArrayFromMixed; }).call(this,require('_process')) -},{"./invariant":219,"_process":29}],210:[function(require,module,exports){ +},{"./invariant":229,"_process":33}],220:[function(require,module,exports){ (function (process){ 'use strict'; @@ -24958,7 +25646,7 @@ function createNodesFromMarkup(markup, handleScript) { module.exports = createNodesFromMarkup; }).call(this,require('_process')) -},{"./ExecutionEnvironment":205,"./createArrayFromMixed":209,"./getMarkupWrap":215,"./invariant":219,"_process":29}],211:[function(require,module,exports){ +},{"./ExecutionEnvironment":215,"./createArrayFromMixed":219,"./getMarkupWrap":225,"./invariant":229,"_process":33}],221:[function(require,module,exports){ "use strict"; /** @@ -24996,7 +25684,7 @@ emptyFunction.thatReturnsArgument = function (arg) { }; module.exports = emptyFunction; -},{}],212:[function(require,module,exports){ +},{}],222:[function(require,module,exports){ (function (process){ /** * Copyright (c) 2013-present, Facebook, Inc. @@ -25019,7 +25707,7 @@ if (process.env.NODE_ENV !== 'production') { module.exports = emptyObject; }).call(this,require('_process')) -},{"_process":29}],213:[function(require,module,exports){ +},{"_process":33}],223:[function(require,module,exports){ /** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. @@ -25046,7 +25734,7 @@ function focusNode(node) { } module.exports = focusNode; -},{}],214:[function(require,module,exports){ +},{}],224:[function(require,module,exports){ 'use strict'; /** @@ -25081,7 +25769,7 @@ function getActiveElement() /*?DOMElement*/{ } module.exports = getActiveElement; -},{}],215:[function(require,module,exports){ +},{}],225:[function(require,module,exports){ (function (process){ 'use strict'; @@ -25179,7 +25867,7 @@ function getMarkupWrap(nodeName) { module.exports = getMarkupWrap; }).call(this,require('_process')) -},{"./ExecutionEnvironment":205,"./invariant":219,"_process":29}],216:[function(require,module,exports){ +},{"./ExecutionEnvironment":215,"./invariant":229,"_process":33}],226:[function(require,module,exports){ /** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. @@ -25218,7 +25906,7 @@ function getUnboundedScrollPosition(scrollable) { } module.exports = getUnboundedScrollPosition; -},{}],217:[function(require,module,exports){ +},{}],227:[function(require,module,exports){ 'use strict'; /** @@ -25251,7 +25939,7 @@ function hyphenate(string) { } module.exports = hyphenate; -},{}],218:[function(require,module,exports){ +},{}],228:[function(require,module,exports){ /** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. @@ -25290,7 +25978,7 @@ function hyphenateStyleName(string) { } module.exports = hyphenateStyleName; -},{"./hyphenate":217}],219:[function(require,module,exports){ +},{"./hyphenate":227}],229:[function(require,module,exports){ (function (process){ /** * Copyright (c) 2013-present, Facebook, Inc. @@ -25343,7 +26031,7 @@ function invariant(condition, format, a, b, c, d, e, f) { module.exports = invariant; }).call(this,require('_process')) -},{"_process":29}],220:[function(require,module,exports){ +},{"_process":33}],230:[function(require,module,exports){ 'use strict'; /** @@ -25366,7 +26054,7 @@ function isNode(object) { } module.exports = isNode; -},{}],221:[function(require,module,exports){ +},{}],231:[function(require,module,exports){ 'use strict'; /** @@ -25391,7 +26079,7 @@ function isTextNode(object) { } module.exports = isTextNode; -},{"./isNode":220}],222:[function(require,module,exports){ +},{"./isNode":230}],232:[function(require,module,exports){ (function (process){ /** * Copyright (c) 2013-present, Facebook, Inc. @@ -25442,7 +26130,7 @@ var keyMirror = function (obj) { module.exports = keyMirror; }).call(this,require('_process')) -},{"./invariant":219,"_process":29}],223:[function(require,module,exports){ +},{"./invariant":229,"_process":33}],233:[function(require,module,exports){ "use strict"; /** @@ -25477,7 +26165,7 @@ var keyOf = function (oneKeyObj) { }; module.exports = keyOf; -},{}],224:[function(require,module,exports){ +},{}],234:[function(require,module,exports){ /** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. @@ -25528,7 +26216,7 @@ function mapObject(object, callback, context) { } module.exports = mapObject; -},{}],225:[function(require,module,exports){ +},{}],235:[function(require,module,exports){ /** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. @@ -25560,7 +26248,7 @@ function memoizeStringOnly(callback) { } module.exports = memoizeStringOnly; -},{}],226:[function(require,module,exports){ +},{}],236:[function(require,module,exports){ /** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. @@ -25583,7 +26271,7 @@ if (ExecutionEnvironment.canUseDOM) { } module.exports = performance || {}; -},{"./ExecutionEnvironment":205}],227:[function(require,module,exports){ +},{"./ExecutionEnvironment":215}],237:[function(require,module,exports){ 'use strict'; /** @@ -25617,7 +26305,7 @@ if (performance.now) { } module.exports = performanceNow; -},{"./performance":226}],228:[function(require,module,exports){ +},{"./performance":236}],238:[function(require,module,exports){ /** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. @@ -25684,7 +26372,7 @@ function shallowEqual(objA, objB) { } module.exports = shallowEqual; -},{}],229:[function(require,module,exports){ +},{}],239:[function(require,module,exports){ (function (process){ /** * Copyright 2014-2015, Facebook, Inc. @@ -25744,7 +26432,579 @@ if (process.env.NODE_ENV !== 'production') { module.exports = warning; }).call(this,require('_process')) -},{"./emptyFunction":211,"_process":29}],230:[function(require,module,exports){ +},{"./emptyFunction":221,"_process":33}],240:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +exports["default"] = applyMiddleware; + +var _compose = require('./compose'); + +var _compose2 = _interopRequireDefault(_compose); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +/** + * Creates a store enhancer that applies middleware to the dispatch method + * of the Redux store. This is handy for a variety of tasks, such as expressing + * asynchronous actions in a concise manner, or logging every action payload. + * + * See `redux-thunk` package as an example of the Redux middleware. + * + * Because middleware is potentially asynchronous, this should be the first + * store enhancer in the composition chain. + * + * Note that each middleware will be given the `dispatch` and `getState` functions + * as named arguments. + * + * @param {...Function} middlewares The middleware chain to be applied. + * @returns {Function} A store enhancer applying the middleware. + */ +function applyMiddleware() { + for (var _len = arguments.length, middlewares = Array(_len), _key = 0; _key < _len; _key++) { + middlewares[_key] = arguments[_key]; + } + + return function (createStore) { + return function (reducer, initialState, enhancer) { + var store = createStore(reducer, initialState, enhancer); + var _dispatch = store.dispatch; + var chain = []; + + var middlewareAPI = { + getState: store.getState, + dispatch: function dispatch(action) { + return _dispatch(action); + } + }; + chain = middlewares.map(function (middleware) { + return middleware(middlewareAPI); + }); + _dispatch = _compose2["default"].apply(undefined, chain)(store.dispatch); + + return _extends({}, store, { + dispatch: _dispatch + }); + }; + }; +} +},{"./compose":243}],241:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +exports["default"] = bindActionCreators; +function bindActionCreator(actionCreator, dispatch) { + return function () { + return dispatch(actionCreator.apply(undefined, arguments)); + }; +} + +/** + * Turns an object whose values are action creators, into an object with the + * same keys, but with every function wrapped into a `dispatch` call so they + * may be invoked directly. This is just a convenience method, as you can call + * `store.dispatch(MyActionCreators.doSomething())` yourself just fine. + * + * For convenience, you can also pass a single function as the first argument, + * and get a function in return. + * + * @param {Function|Object} actionCreators An object whose values are action + * creator functions. One handy way to obtain it is to use ES6 `import * as` + * syntax. You may also pass a single function. + * + * @param {Function} dispatch The `dispatch` function available on your Redux + * store. + * + * @returns {Function|Object} The object mimicking the original object, but with + * every action creator wrapped into the `dispatch` call. If you passed a + * function as `actionCreators`, the return value will also be a single + * function. + */ +function bindActionCreators(actionCreators, dispatch) { + if (typeof actionCreators === 'function') { + return bindActionCreator(actionCreators, dispatch); + } + + if (typeof actionCreators !== 'object' || actionCreators === null) { + throw new Error('bindActionCreators expected an object or a function, instead received ' + (actionCreators === null ? 'null' : typeof actionCreators) + '. ' + 'Did you write "import ActionCreators from" instead of "import * as ActionCreators from"?'); + } + + var keys = Object.keys(actionCreators); + var boundActionCreators = {}; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var actionCreator = actionCreators[key]; + if (typeof actionCreator === 'function') { + boundActionCreators[key] = bindActionCreator(actionCreator, dispatch); + } + } + return boundActionCreators; +} +},{}],242:[function(require,module,exports){ +(function (process){ +'use strict'; + +exports.__esModule = true; +exports["default"] = combineReducers; + +var _createStore = require('./createStore'); + +var _isPlainObject = require('lodash/isPlainObject'); + +var _isPlainObject2 = _interopRequireDefault(_isPlainObject); + +var _warning = require('./utils/warning'); + +var _warning2 = _interopRequireDefault(_warning); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +function getUndefinedStateErrorMessage(key, action) { + var actionType = action && action.type; + var actionName = actionType && '"' + actionType.toString() + '"' || 'an action'; + + return 'Given action ' + actionName + ', reducer "' + key + '" returned undefined. ' + 'To ignore an action, you must explicitly return the previous state.'; +} + +function getUnexpectedStateShapeWarningMessage(inputState, reducers, action) { + var reducerKeys = Object.keys(reducers); + var argumentName = action && action.type === _createStore.ActionTypes.INIT ? 'initialState argument passed to createStore' : 'previous state received by the reducer'; + + if (reducerKeys.length === 0) { + return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.'; + } + + if (!(0, _isPlainObject2["default"])(inputState)) { + return 'The ' + argumentName + ' has unexpected type of "' + {}.toString.call(inputState).match(/\s([a-z|A-Z]+)/)[1] + '". Expected argument to be an object with the following ' + ('keys: "' + reducerKeys.join('", "') + '"'); + } + + var unexpectedKeys = Object.keys(inputState).filter(function (key) { + return !reducers.hasOwnProperty(key); + }); + + if (unexpectedKeys.length > 0) { + return 'Unexpected ' + (unexpectedKeys.length > 1 ? 'keys' : 'key') + ' ' + ('"' + unexpectedKeys.join('", "') + '" found in ' + argumentName + '. ') + 'Expected to find one of the known reducer keys instead: ' + ('"' + reducerKeys.join('", "') + '". Unexpected keys will be ignored.'); + } +} + +function assertReducerSanity(reducers) { + Object.keys(reducers).forEach(function (key) { + var reducer = reducers[key]; + var initialState = reducer(undefined, { type: _createStore.ActionTypes.INIT }); + + if (typeof initialState === 'undefined') { + throw new Error('Reducer "' + key + '" returned undefined during initialization. ' + 'If the state passed to the reducer is undefined, you must ' + 'explicitly return the initial state. The initial state may ' + 'not be undefined.'); + } + + var type = '@@redux/PROBE_UNKNOWN_ACTION_' + Math.random().toString(36).substring(7).split('').join('.'); + if (typeof reducer(undefined, { type: type }) === 'undefined') { + throw new Error('Reducer "' + key + '" returned undefined when probed with a random type. ' + ('Don\'t try to handle ' + _createStore.ActionTypes.INIT + ' or other actions in "redux/*" ') + 'namespace. They are considered private. Instead, you must return the ' + 'current state for any unknown actions, unless it is undefined, ' + 'in which case you must return the initial state, regardless of the ' + 'action type. The initial state may not be undefined.'); + } + }); +} + +/** + * Turns an object whose values are different reducer functions, into a single + * reducer function. It will call every child reducer, and gather their results + * into a single state object, whose keys correspond to the keys of the passed + * reducer functions. + * + * @param {Object} reducers An object whose values correspond to different + * reducer functions that need to be combined into one. One handy way to obtain + * it is to use ES6 `import * as reducers` syntax. The reducers may never return + * undefined for any action. Instead, they should return their initial state + * if the state passed to them was undefined, and the current state for any + * unrecognized action. + * + * @returns {Function} A reducer function that invokes every reducer inside the + * passed object, and builds a state object with the same shape. + */ +function combineReducers(reducers) { + var reducerKeys = Object.keys(reducers); + var finalReducers = {}; + for (var i = 0; i < reducerKeys.length; i++) { + var key = reducerKeys[i]; + if (typeof reducers[key] === 'function') { + finalReducers[key] = reducers[key]; + } + } + var finalReducerKeys = Object.keys(finalReducers); + + var sanityError; + try { + assertReducerSanity(finalReducers); + } catch (e) { + sanityError = e; + } + + return function combination() { + var state = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + var action = arguments[1]; + + if (sanityError) { + throw sanityError; + } + + if (process.env.NODE_ENV !== 'production') { + var warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action); + if (warningMessage) { + (0, _warning2["default"])(warningMessage); + } + } + + var hasChanged = false; + var nextState = {}; + for (var i = 0; i < finalReducerKeys.length; i++) { + var key = finalReducerKeys[i]; + var reducer = finalReducers[key]; + var previousStateForKey = state[key]; + var nextStateForKey = reducer(previousStateForKey, action); + if (typeof nextStateForKey === 'undefined') { + var errorMessage = getUndefinedStateErrorMessage(key, action); + throw new Error(errorMessage); + } + nextState[key] = nextStateForKey; + hasChanged = hasChanged || nextStateForKey !== previousStateForKey; + } + return hasChanged ? nextState : state; + }; +} +}).call(this,require('_process')) + +},{"./createStore":244,"./utils/warning":245,"_process":33,"lodash/isPlainObject":31}],243:[function(require,module,exports){ +"use strict"; + +exports.__esModule = true; +exports["default"] = compose; +/** + * Composes single-argument functions from right to left. The rightmost + * function can take multiple arguments as it provides the signature for + * the resulting composite function. + * + * @param {...Function} funcs The functions to compose. + * @returns {Function} A function obtained by composing the argument functions + * from right to left. For example, compose(f, g, h) is identical to doing + * (...args) => f(g(h(...args))). + */ + +function compose() { + for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) { + funcs[_key] = arguments[_key]; + } + + if (funcs.length === 0) { + return function (arg) { + return arg; + }; + } else { + var _ret = function () { + var last = funcs[funcs.length - 1]; + var rest = funcs.slice(0, -1); + return { + v: function v() { + return rest.reduceRight(function (composed, f) { + return f(composed); + }, last.apply(undefined, arguments)); + } + }; + }(); + + if (typeof _ret === "object") return _ret.v; + } +} +},{}],244:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +exports.ActionTypes = undefined; +exports["default"] = createStore; + +var _isPlainObject = require('lodash/isPlainObject'); + +var _isPlainObject2 = _interopRequireDefault(_isPlainObject); + +var _symbolObservable = require('symbol-observable'); + +var _symbolObservable2 = _interopRequireDefault(_symbolObservable); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +/** + * These are private action types reserved by Redux. + * For any unknown actions, you must return the current state. + * If the current state is undefined, you must return the initial state. + * Do not reference these action types directly in your code. + */ +var ActionTypes = exports.ActionTypes = { + INIT: '@@redux/INIT' +}; + +/** + * Creates a Redux store that holds the state tree. + * The only way to change the data in the store is to call `dispatch()` on it. + * + * There should only be a single store in your app. To specify how different + * parts of the state tree respond to actions, you may combine several reducers + * into a single reducer function by using `combineReducers`. + * + * @param {Function} reducer A function that returns the next state tree, given + * the current state tree and the action to handle. + * + * @param {any} [initialState] The initial state. You may optionally specify it + * to hydrate the state from the server in universal apps, or to restore a + * previously serialized user session. + * If you use `combineReducers` to produce the root reducer function, this must be + * an object with the same shape as `combineReducers` keys. + * + * @param {Function} enhancer The store enhancer. You may optionally specify it + * to enhance the store with third-party capabilities such as middleware, + * time travel, persistence, etc. The only store enhancer that ships with Redux + * is `applyMiddleware()`. + * + * @returns {Store} A Redux store that lets you read the state, dispatch actions + * and subscribe to changes. + */ +function createStore(reducer, initialState, enhancer) { + var _ref2; + + if (typeof initialState === 'function' && typeof enhancer === 'undefined') { + enhancer = initialState; + initialState = undefined; + } + + if (typeof enhancer !== 'undefined') { + if (typeof enhancer !== 'function') { + throw new Error('Expected the enhancer to be a function.'); + } + + return enhancer(createStore)(reducer, initialState); + } + + if (typeof reducer !== 'function') { + throw new Error('Expected the reducer to be a function.'); + } + + var currentReducer = reducer; + var currentState = initialState; + var currentListeners = []; + var nextListeners = currentListeners; + var isDispatching = false; + + function ensureCanMutateNextListeners() { + if (nextListeners === currentListeners) { + nextListeners = currentListeners.slice(); + } + } + + /** + * Reads the state tree managed by the store. + * + * @returns {any} The current state tree of your application. + */ + function getState() { + return currentState; + } + + /** + * Adds a change listener. It will be called any time an action is dispatched, + * and some part of the state tree may potentially have changed. You may then + * call `getState()` to read the current state tree inside the callback. + * + * You may call `dispatch()` from a change listener, with the following + * caveats: + * + * 1. The subscriptions are snapshotted just before every `dispatch()` call. + * If you subscribe or unsubscribe while the listeners are being invoked, this + * will not have any effect on the `dispatch()` that is currently in progress. + * However, the next `dispatch()` call, whether nested or not, will use a more + * recent snapshot of the subscription list. + * + * 2. The listener should not expect to see all state changes, as the state + * might have been updated multiple times during a nested `dispatch()` before + * the listener is called. It is, however, guaranteed that all subscribers + * registered before the `dispatch()` started will be called with the latest + * state by the time it exits. + * + * @param {Function} listener A callback to be invoked on every dispatch. + * @returns {Function} A function to remove this change listener. + */ + function subscribe(listener) { + if (typeof listener !== 'function') { + throw new Error('Expected listener to be a function.'); + } + + var isSubscribed = true; + + ensureCanMutateNextListeners(); + nextListeners.push(listener); + + return function unsubscribe() { + if (!isSubscribed) { + return; + } + + isSubscribed = false; + + ensureCanMutateNextListeners(); + var index = nextListeners.indexOf(listener); + nextListeners.splice(index, 1); + }; + } + + /** + * Dispatches an action. It is the only way to trigger a state change. + * + * The `reducer` function, used to create the store, will be called with the + * current state tree and the given `action`. Its return value will + * be considered the **next** state of the tree, and the change listeners + * will be notified. + * + * The base implementation only supports plain object actions. If you want to + * dispatch a Promise, an Observable, a thunk, or something else, you need to + * wrap your store creating function into the corresponding middleware. For + * example, see the documentation for the `redux-thunk` package. Even the + * middleware will eventually dispatch plain object actions using this method. + * + * @param {Object} action A plain object representing “what changed”. It is + * a good idea to keep actions serializable so you can record and replay user + * sessions, or use the time travelling `redux-devtools`. An action must have + * a `type` property which may not be `undefined`. It is a good idea to use + * string constants for action types. + * + * @returns {Object} For convenience, the same action object you dispatched. + * + * Note that, if you use a custom middleware, it may wrap `dispatch()` to + * return something else (for example, a Promise you can await). + */ + function dispatch(action) { + if (!(0, _isPlainObject2["default"])(action)) { + throw new Error('Actions must be plain objects. ' + 'Use custom middleware for async actions.'); + } + + if (typeof action.type === 'undefined') { + throw new Error('Actions may not have an undefined "type" property. ' + 'Have you misspelled a constant?'); + } + + if (isDispatching) { + throw new Error('Reducers may not dispatch actions.'); + } + + try { + isDispatching = true; + currentState = currentReducer(currentState, action); + } finally { + isDispatching = false; + } + + var listeners = currentListeners = nextListeners; + for (var i = 0; i < listeners.length; i++) { + listeners[i](); + } + + return action; + } + + /** + * Replaces the reducer currently used by the store to calculate the state. + * + * You might need this if your app implements code splitting and you want to + * load some of the reducers dynamically. You might also need this if you + * implement a hot reloading mechanism for Redux. + * + * @param {Function} nextReducer The reducer for the store to use instead. + * @returns {void} + */ + function replaceReducer(nextReducer) { + if (typeof nextReducer !== 'function') { + throw new Error('Expected the nextReducer to be a function.'); + } + + currentReducer = nextReducer; + dispatch({ type: ActionTypes.INIT }); + } + + /** + * Interoperability point for observable/reactive libraries. + * @returns {observable} A minimal observable of state changes. + * For more information, see the observable proposal: + * https://github.com/zenparsing/es-observable + */ + function observable() { + var _ref; + + var outerSubscribe = subscribe; + return _ref = { + /** + * The minimal observable subscription method. + * @param {Object} observer Any object that can be used as an observer. + * The observer object should have a `next` method. + * @returns {subscription} An object with an `unsubscribe` method that can + * be used to unsubscribe the observable from the store, and prevent further + * emission of values from the observable. + */ + + subscribe: function subscribe(observer) { + if (typeof observer !== 'object') { + throw new TypeError('Expected the observer to be an object.'); + } + + function observeState() { + if (observer.next) { + observer.next(getState()); + } + } + + observeState(); + var unsubscribe = outerSubscribe(observeState); + return { unsubscribe: unsubscribe }; + } + }, _ref[_symbolObservable2["default"]] = function () { + return this; + }, _ref; + } + + // When a store is created, an "INIT" action is dispatched so that every + // reducer returns their initial state. This effectively populates + // the initial state tree. + dispatch({ type: ActionTypes.INIT }); + + return _ref2 = { + dispatch: dispatch, + subscribe: subscribe, + getState: getState, + replaceReducer: replaceReducer + }, _ref2[_symbolObservable2["default"]] = observable, _ref2; +} +},{"lodash/isPlainObject":31,"symbol-observable":247}],245:[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +exports["default"] = warning; +/** + * Prints a warning in the console if it exists. + * + * @param {String} message The warning message. + * @returns {void} + */ +function warning(message) { + /* eslint-disable no-console */ + if (typeof console !== 'undefined' && typeof console.error === 'function') { + console.error(message); + } + /* eslint-enable no-console */ + try { + // This error was thrown as a convenience so that if you enable + // "break on all exceptions" in your console, + // it would pause the execution at this line. + throw new Error(message); + /* eslint-disable no-empty */ + } catch (e) {} + /* eslint-enable no-empty */ +} +},{}],246:[function(require,module,exports){ 'use strict'; module.exports = function (str) { return encodeURIComponent(str).replace(/[!'()*]/g, function (c) { @@ -25752,7 +27012,37 @@ module.exports = function (str) { }); }; -},{}],231:[function(require,module,exports){ +},{}],247:[function(require,module,exports){ +(function (global){ +/* global window */ +'use strict'; + +module.exports = require('./ponyfill')(global || window || this); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./ponyfill":248}],248:[function(require,module,exports){ +'use strict'; + +module.exports = function symbolObservablePonyfill(root) { + var result; + var Symbol = root.Symbol; + + if (typeof Symbol === 'function') { + if (Symbol.observable) { + result = Symbol.observable; + } else { + result = Symbol('observable'); + Symbol.observable = result; + } + } else { + result = '@@observable'; + } + + return result; +}; + +},{}],249:[function(require,module,exports){ (function (process){ /** * Copyright 2014-2015, Facebook, Inc. @@ -25817,7 +27107,7 @@ module.exports = warning; }).call(this,require('_process')) -},{"_process":29}],"classnames":[function(require,module,exports){ +},{"_process":33}],"classnames":[function(require,module,exports){ /*! Copyright (c) 2016 Jed Watson. Licensed under the MIT License (MIT), see @@ -35727,7 +37017,8 @@ return jQuery; (function (global){ /** * @license - * lodash + * lodash 4.11.2 (Custom Build) + * Build: `lodash -d -o ./foo/lodash.js` * Copyright jQuery Foundation and other contributors * Released under MIT license * Based on Underscore.js 1.8.3 @@ -35739,7 +37030,7 @@ return jQuery; var undefined; /** Used as the semantic version number. */ - var VERSION = '4.12.0'; + var VERSION = '4.11.2'; /** Used as the size to enable large array optimizations. */ var LARGE_ARRAY_SIZE = 200; @@ -36183,6 +37474,30 @@ return jQuery; return accumulator; } + /** + * Creates a new array concatenating `array` with `other`. + * + * @private + * @param {Array} array The first array to concatenate. + * @param {Array} other The second array to concatenate. + * @returns {Array} Returns the new concatenated array. + */ + function arrayConcat(array, other) { + var index = -1, + length = array.length, + othIndex = -1, + othLength = other.length, + result = Array(length + othLength); + + while (++index < length) { + result[index] = array[index]; + } + while (++othIndex < othLength) { + result[index++] = other[othIndex]; + } + return result; + } + /** * A specialized version of `_.forEach` for arrays without support for * iteratee shorthands. @@ -36610,7 +37925,7 @@ return jQuery; * @private * @param {Object} object The object to query. * @param {Array} props The property names to get values for. - * @returns {Object} Returns the key-value pairs. + * @returns {Object} Returns the new array of key-value pairs. */ function baseToPairs(object, props) { return arrayMap(props, function(key) { @@ -36623,7 +37938,7 @@ return jQuery; * * @private * @param {Function} func The function to cap arguments for. - * @returns {Function} Returns the new capped function. + * @returns {Function} Returns the new function. */ function baseUnary(func) { return function(value) { @@ -36647,18 +37962,6 @@ return jQuery; }); } - /** - * Checks if a cache value for `key` exists. - * - * @private - * @param {Object} cache The cache to query. - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ - function cacheHas(cache, key) { - return cache.has(key); - } - /** * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol * that is not found in the character symbols. @@ -36815,11 +38118,11 @@ return jQuery; } /** - * Converts `map` to its key-value pairs. + * Converts `map` to an array. * * @private * @param {Object} map The map to convert. - * @returns {Array} Returns the key-value pairs. + * @returns {Array} Returns the converted array. */ function mapToArray(map) { var index = -1, @@ -36857,11 +38160,11 @@ return jQuery; } /** - * Converts `set` to an array of its values. + * Converts `set` to an array. * * @private * @param {Object} set The set to convert. - * @returns {Array} Returns the values. + * @returns {Array} Returns the converted array. */ function setToArray(set) { var index = -1, @@ -36873,23 +38176,6 @@ return jQuery; return result; } - /** - * Converts `set` to its value-value pairs. - * - * @private - * @param {Object} set The set to convert. - * @returns {Array} Returns the value-value pairs. - */ - function setToPairs(set) { - var index = -1, - result = Array(set.size); - - set.forEach(function(value) { - result[++index] = [value, value]; - }); - return result; - } - /** * Gets the number of symbols in `string`. * @@ -37143,10 +38429,10 @@ return jQuery; * `floor`, `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, * `forOwnRight`, `get`, `gt`, `gte`, `has`, `hasIn`, `head`, `identity`, * `includes`, `indexOf`, `inRange`, `invoke`, `isArguments`, `isArray`, - * `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, `isBoolean`, - * `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, `isEqualWith`, - * `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, `isMap`, - * `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, `isNumber`, + * `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, `isBoolean`, `isBuffer`, + * `isDate`, `isElement`, `isEmpty`, `isEqual`, `isEqualWith`, `isError`, + * `isFinite`, `isFunction`, `isInteger`, `isLength`, `isMap`, `isMatch`, + * `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, `isNumber`, * `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`, `isSafeInteger`, * `isSet`, `isString`, `isUndefined`, `isTypedArray`, `isWeakMap`, `isWeakSet`, * `join`, `kebabCase`, `last`, `lastIndexOf`, `lowerCase`, `lowerFirst`, @@ -37155,9 +38441,9 @@ return jQuery; * `pop`, `random`, `reduce`, `reduceRight`, `repeat`, `result`, `round`, * `runInContext`, `sample`, `shift`, `size`, `snakeCase`, `some`, `sortedIndex`, * `sortedIndexBy`, `sortedLastIndex`, `sortedLastIndexBy`, `startCase`, - * `startsWith`, `subtract`, `sum`, `sumBy`, `template`, `times`, `toFinite`, - * `toInteger`, `toJSON`, `toLength`, `toLower`, `toNumber`, `toSafeInteger`, - * `toString`, `toUpper`, `trim`, `trimEnd`, `trimStart`, `truncate`, `unescape`, + * `startsWith`, `subtract`, `sum`, `sumBy`, `template`, `times`, `toInteger`, + * `toJSON`, `toLength`, `toLower`, `toNumber`, `toSafeInteger`, `toString`, + * `toUpper`, `trim`, `trimEnd`, `trimStart`, `truncate`, `unescape`, * `uniqueId`, `upperCase`, `upperFirst`, `value`, and `words` * * @name _ @@ -37417,212 +38703,64 @@ return jQuery; * * @private * @constructor - * @param {Array} [entries] The key-value pairs to cache. + * @returns {Object} Returns the new hash object. */ - function Hash(entries) { - var index = -1, - length = entries ? entries.length : 0; - - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); - } - } - - /** - * Removes all key-value entries from the hash. - * - * @private - * @name clear - * @memberOf Hash - */ - function hashClear() { - this.__data__ = nativeCreate ? nativeCreate(null) : {}; - } + function Hash() {} /** * Removes `key` and its value from the hash. * * @private - * @name delete - * @memberOf Hash * @param {Object} hash The hash to modify. * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ - function hashDelete(key) { - return this.has(key) && delete this.__data__[key]; + function hashDelete(hash, key) { + return hashHas(hash, key) && delete hash[key]; } /** * Gets the hash value for `key`. * * @private - * @name get - * @memberOf Hash + * @param {Object} hash The hash to query. * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ - function hashGet(key) { - var data = this.__data__; + function hashGet(hash, key) { if (nativeCreate) { - var result = data[key]; + var result = hash[key]; return result === HASH_UNDEFINED ? undefined : result; } - return hasOwnProperty.call(data, key) ? data[key] : undefined; + return hasOwnProperty.call(hash, key) ? hash[key] : undefined; } /** * Checks if a hash value for `key` exists. * * @private - * @name has - * @memberOf Hash + * @param {Object} hash The hash to query. * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ - function hashHas(key) { - var data = this.__data__; - return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key); + function hashHas(hash, key) { + return nativeCreate ? hash[key] !== undefined : hasOwnProperty.call(hash, key); } /** * Sets the hash `key` to `value`. * * @private - * @name set - * @memberOf Hash + * @param {Object} hash The hash to modify. * @param {string} key The key of the value to set. * @param {*} value The value to set. - * @returns {Object} Returns the hash instance. */ - function hashSet(key, value) { - var data = this.__data__; - data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; - return this; + function hashSet(hash, key, value) { + hash[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; } - // Add methods to `Hash`. - Hash.prototype.clear = hashClear; - Hash.prototype['delete'] = hashDelete; - Hash.prototype.get = hashGet; - Hash.prototype.has = hashHas; - Hash.prototype.set = hashSet; - - /*------------------------------------------------------------------------*/ - - /** - * Creates an list cache object. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ - function ListCache(entries) { - var index = -1, - length = entries ? entries.length : 0; - - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); - } - } - - /** - * Removes all key-value entries from the list cache. - * - * @private - * @name clear - * @memberOf ListCache - */ - function listCacheClear() { - this.__data__ = []; - } - - /** - * Removes `key` and its value from the list cache. - * - * @private - * @name delete - * @memberOf ListCache - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ - function listCacheDelete(key) { - var data = this.__data__, - index = assocIndexOf(data, key); - - if (index < 0) { - return false; - } - var lastIndex = data.length - 1; - if (index == lastIndex) { - data.pop(); - } else { - splice.call(data, index, 1); - } - return true; - } - - /** - * Gets the list cache value for `key`. - * - * @private - * @name get - * @memberOf ListCache - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ - function listCacheGet(key) { - var data = this.__data__, - index = assocIndexOf(data, key); - - return index < 0 ? undefined : data[index][1]; - } - - /** - * Checks if a list cache value for `key` exists. - * - * @private - * @name has - * @memberOf ListCache - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ - function listCacheHas(key) { - return assocIndexOf(this.__data__, key) > -1; - } - - /** - * Sets the list cache `key` to `value`. - * - * @private - * @name set - * @memberOf ListCache - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the list cache instance. - */ - function listCacheSet(key, value) { - var data = this.__data__, - index = assocIndexOf(data, key); - - if (index < 0) { - data.push([key, value]); - } else { - data[index][1] = value; - } - return this; - } - - // Add methods to `ListCache`. - ListCache.prototype.clear = listCacheClear; - ListCache.prototype['delete'] = listCacheDelete; - ListCache.prototype.get = listCacheGet; - ListCache.prototype.has = listCacheHas; - ListCache.prototype.set = listCacheSet; + // Avoid inheriting from `Object.prototype` when possible. + Hash.prototype = nativeCreate ? nativeCreate(null) : objectProto; /*------------------------------------------------------------------------*/ @@ -37631,15 +38769,15 @@ return jQuery; * * @private * @constructor - * @param {Array} [entries] The key-value pairs to cache. + * @param {Array} [values] The values to cache. */ - function MapCache(entries) { + function MapCache(values) { var index = -1, - length = entries ? entries.length : 0; + length = values ? values.length : 0; this.clear(); while (++index < length) { - var entry = entries[index]; + var entry = values[index]; this.set(entry[0], entry[1]); } } @@ -37651,10 +38789,10 @@ return jQuery; * @name clear * @memberOf MapCache */ - function mapCacheClear() { + function mapClear() { this.__data__ = { 'hash': new Hash, - 'map': new (Map || ListCache), + 'map': Map ? new Map : [], 'string': new Hash }; } @@ -37668,8 +38806,12 @@ return jQuery; * @param {string} key The key of the value to remove. * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ - function mapCacheDelete(key) { - return getMapData(this, key)['delete'](key); + function mapDelete(key) { + var data = this.__data__; + if (isKeyable(key)) { + return hashDelete(typeof key == 'string' ? data.string : data.hash, key); + } + return Map ? data.map['delete'](key) : assocDelete(data.map, key); } /** @@ -37681,8 +38823,12 @@ return jQuery; * @param {string} key The key of the value to get. * @returns {*} Returns the entry value. */ - function mapCacheGet(key) { - return getMapData(this, key).get(key); + function mapGet(key) { + var data = this.__data__; + if (isKeyable(key)) { + return hashGet(typeof key == 'string' ? data.string : data.hash, key); + } + return Map ? data.map.get(key) : assocGet(data.map, key); } /** @@ -37694,8 +38840,12 @@ return jQuery; * @param {string} key The key of the entry to check. * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ - function mapCacheHas(key) { - return getMapData(this, key).has(key); + function mapHas(key) { + var data = this.__data__; + if (isKeyable(key)) { + return hashHas(typeof key == 'string' ? data.string : data.hash, key); + } + return Map ? data.map.has(key) : assocHas(data.map, key); } /** @@ -37708,23 +38858,30 @@ return jQuery; * @param {*} value The value to set. * @returns {Object} Returns the map cache instance. */ - function mapCacheSet(key, value) { - getMapData(this, key).set(key, value); + function mapSet(key, value) { + var data = this.__data__; + if (isKeyable(key)) { + hashSet(typeof key == 'string' ? data.string : data.hash, key, value); + } else if (Map) { + data.map.set(key, value); + } else { + assocSet(data.map, key, value); + } return this; } // Add methods to `MapCache`. - MapCache.prototype.clear = mapCacheClear; - MapCache.prototype['delete'] = mapCacheDelete; - MapCache.prototype.get = mapCacheGet; - MapCache.prototype.has = mapCacheHas; - MapCache.prototype.set = mapCacheSet; + MapCache.prototype.clear = mapClear; + MapCache.prototype['delete'] = mapDelete; + MapCache.prototype.get = mapGet; + MapCache.prototype.has = mapHas; + MapCache.prototype.set = mapSet; /*------------------------------------------------------------------------*/ /** * - * Creates an array cache object to store unique values. + * Creates a set cache object to store unique values. * * @private * @constructor @@ -37736,41 +38893,52 @@ return jQuery; this.__data__ = new MapCache; while (++index < length) { - this.add(values[index]); + this.push(values[index]); } } /** - * Adds `value` to the array cache. + * Checks if `value` is in `cache`. * * @private - * @name add - * @memberOf SetCache - * @alias push - * @param {*} value The value to cache. - * @returns {Object} Returns the cache instance. - */ - function setCacheAdd(value) { - this.__data__.set(value, HASH_UNDEFINED); - return this; - } - - /** - * Checks if `value` is in the array cache. - * - * @private - * @name has - * @memberOf SetCache + * @param {Object} cache The set cache to search. * @param {*} value The value to search for. * @returns {number} Returns `true` if `value` is found, else `false`. */ - function setCacheHas(value) { - return this.__data__.has(value); + function cacheHas(cache, value) { + var map = cache.__data__; + if (isKeyable(value)) { + var data = map.__data__, + hash = typeof value == 'string' ? data.string : data.hash; + + return hash[value] === HASH_UNDEFINED; + } + return map.has(value); + } + + /** + * Adds `value` to the set cache. + * + * @private + * @name push + * @memberOf SetCache + * @param {*} value The value to cache. + */ + function cachePush(value) { + var map = this.__data__; + if (isKeyable(value)) { + var data = map.__data__, + hash = typeof value == 'string' ? data.string : data.hash; + + hash[value] = HASH_UNDEFINED; + } + else { + map.set(value, HASH_UNDEFINED); + } } // Add methods to `SetCache`. - SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; - SetCache.prototype.has = setCacheHas; + SetCache.prototype.push = cachePush; /*------------------------------------------------------------------------*/ @@ -37779,10 +38947,17 @@ return jQuery; * * @private * @constructor - * @param {Array} [entries] The key-value pairs to cache. + * @param {Array} [values] The values to cache. */ - function Stack(entries) { - this.__data__ = new ListCache(entries); + function Stack(values) { + var index = -1, + length = values ? values.length : 0; + + this.clear(); + while (++index < length) { + var entry = values[index]; + this.set(entry[0], entry[1]); + } } /** @@ -37793,7 +38968,7 @@ return jQuery; * @memberOf Stack */ function stackClear() { - this.__data__ = new ListCache; + this.__data__ = { 'array': [], 'map': null }; } /** @@ -37806,7 +38981,10 @@ return jQuery; * @returns {boolean} Returns `true` if the entry was removed, else `false`. */ function stackDelete(key) { - return this.__data__['delete'](key); + var data = this.__data__, + array = data.array; + + return array ? assocDelete(array, key) : data.map['delete'](key); } /** @@ -37819,7 +38997,10 @@ return jQuery; * @returns {*} Returns the entry value. */ function stackGet(key) { - return this.__data__.get(key); + var data = this.__data__, + array = data.array; + + return array ? assocGet(array, key) : data.map.get(key); } /** @@ -37832,7 +39013,10 @@ return jQuery; * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. */ function stackHas(key) { - return this.__data__.has(key); + var data = this.__data__, + array = data.array; + + return array ? assocHas(array, key) : data.map.has(key); } /** @@ -37846,11 +39030,21 @@ return jQuery; * @returns {Object} Returns the stack cache instance. */ function stackSet(key, value) { - var cache = this.__data__; - if (cache instanceof ListCache && cache.__data__.length == LARGE_ARRAY_SIZE) { - cache = this.__data__ = new MapCache(cache.__data__); + var data = this.__data__, + array = data.array; + + if (array) { + if (array.length < (LARGE_ARRAY_SIZE - 1)) { + assocSet(array, key, value); + } else { + data.array = null; + data.map = new MapCache(array); + } + } + var map = data.map; + if (map) { + map.set(key, value); } - cache.set(key, value); return this; } @@ -37863,6 +39057,90 @@ return jQuery; /*------------------------------------------------------------------------*/ + /** + * Removes `key` and its value from the associative array. + * + * @private + * @param {Array} array The array to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function assocDelete(array, key) { + var index = assocIndexOf(array, key); + if (index < 0) { + return false; + } + var lastIndex = array.length - 1; + if (index == lastIndex) { + array.pop(); + } else { + splice.call(array, index, 1); + } + return true; + } + + /** + * Gets the associative array value for `key`. + * + * @private + * @param {Array} array The array to query. + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function assocGet(array, key) { + var index = assocIndexOf(array, key); + return index < 0 ? undefined : array[index][1]; + } + + /** + * Checks if an associative array value for `key` exists. + * + * @private + * @param {Array} array The array to query. + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function assocHas(array, key) { + return assocIndexOf(array, key) > -1; + } + + /** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to search. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } + } + return -1; + } + + /** + * Sets the associative array `key` to `value`. + * + * @private + * @param {Array} array The array to modify. + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + */ + function assocSet(array, key, value) { + var index = assocIndexOf(array, key); + if (index < 0) { + array.push([key, value]); + } else { + array[index][1] = value; + } + } + + /*------------------------------------------------------------------------*/ + /** * Used by `_.defaults` to customize its `_.assignIn` use. * @@ -37915,24 +39193,6 @@ return jQuery; } } - /** - * Gets the index at which the `key` is found in `array` of key-value pairs. - * - * @private - * @param {Array} array The array to search. - * @param {*} key The key to search for. - * @returns {number} Returns the index of the matched value, else `-1`. - */ - function assocIndexOf(array, key) { - var length = array.length; - while (length--) { - if (eq(array[length][0], key)) { - return length; - } - } - return -1; - } - /** * Aggregates elements of `collection` on `accumulator` with keys transformed * by `iteratee` and values set by `setter`. @@ -37970,7 +39230,7 @@ return jQuery; * @private * @param {Object} object The object to iterate over. * @param {string[]} paths The property paths of elements to pick. - * @returns {Array} Returns the picked elements. + * @returns {Array} Returns the new array of picked elements. */ function baseAt(object, paths) { var index = -1, @@ -38085,7 +39345,7 @@ return jQuery; * * @private * @param {Object} source The object of property predicates to conform to. - * @returns {Function} Returns the new spec function. + * @returns {Function} Returns the new function. */ function baseConforms(source) { var props = keys(source), @@ -38398,7 +39658,7 @@ return jQuery; * @private * @param {Object} object The object to inspect. * @param {Array} props The property names to filter. - * @returns {Array} Returns the function names. + * @returns {Array} Returns the new array of filtered property names. */ function baseFunctions(object, props) { return arrayFilter(props, function(key) { @@ -38439,7 +39699,9 @@ return jQuery; */ function baseGetAllKeys(object, keysFunc, symbolsFunc) { var result = keysFunc(object); - return isArray(object) ? result : arrayPush(result, symbolsFunc(object)); + return isArray(object) + ? result + : arrayPush(result, symbolsFunc(object)); } /** @@ -38831,7 +40093,7 @@ return jQuery; * * @private * @param {Object} source The object of property values to match. - * @returns {Function} Returns the new spec function. + * @returns {Function} Returns the new function. */ function baseMatches(source) { var matchData = getMatchData(source); @@ -38849,7 +40111,7 @@ return jQuery; * @private * @param {string} path The path of the property to get. * @param {*} srcValue The value to match. - * @returns {Function} Returns the new spec function. + * @returns {Function} Returns the new function. */ function baseMatchesProperty(path, srcValue) { if (isKey(path) && isStrictComparable(srcValue)) { @@ -39064,7 +40326,7 @@ return jQuery; * * @private * @param {string} key The key of the property to get. - * @returns {Function} Returns the new accessor function. + * @returns {Function} Returns the new function. */ function baseProperty(key) { return function(object) { @@ -39077,7 +40339,7 @@ return jQuery; * * @private * @param {Array|string} path The path of the property to get. - * @returns {Function} Returns the new accessor function. + * @returns {Function} Returns the new function. */ function basePropertyDeep(path) { return function(object) { @@ -39178,7 +40440,7 @@ return jQuery; * @param {number} end The end of the range. * @param {number} step The value to increment or decrement by. * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {Array} Returns the range of numbers. + * @returns {Array} Returns the new array of numbers. */ function baseRange(start, end, step, fromRight) { var index = -1, @@ -39892,7 +41154,7 @@ return jQuery; * placeholders, and provided arguments into a single array of arguments. * * @private - * @param {Array} args The provided arguments. + * @param {Array|Object} args The provided arguments. * @param {Array} partials The arguments to prepend to those provided. * @param {Array} holders The `partials` placeholder indexes. * @params {boolean} [isCurried] Specify composing for a curried function. @@ -39927,7 +41189,7 @@ return jQuery; * is tailored for `_.partialRight`. * * @private - * @param {Array} args The provided arguments. + * @param {Array|Object} args The provided arguments. * @param {Array} partials The arguments to append to those provided. * @param {Array} holders The `partials` placeholder indexes. * @params {boolean} [isCurried] Specify composing for a curried function. @@ -40049,7 +41311,7 @@ return jQuery; customizer = length > 1 ? sources[length - 1] : undefined, guard = length > 2 ? sources[2] : undefined; - customizer = (assigner.length > 3 && typeof customizer == 'function') + customizer = typeof customizer == 'function' ? (length--, customizer) : undefined; @@ -40148,7 +41410,7 @@ return jQuery; * * @private * @param {string} methodName The name of the `String` case method to use. - * @returns {Function} Returns the new case function. + * @returns {Function} Returns the new function. */ function createCaseFirst(methodName) { return function(string) { @@ -40233,7 +41495,7 @@ return jQuery; var length = arguments.length, args = Array(length), index = length, - placeholder = getHolder(wrapper); + placeholder = getPlaceholder(wrapper); while (index--) { args[index] = arguments[index]; @@ -40348,14 +41610,14 @@ return jQuery; function wrapper() { var length = arguments.length, - args = Array(length), - index = length; + index = length, + args = Array(length); while (index--) { args[index] = arguments[index]; } if (isCurried) { - var placeholder = getHolder(wrapper), + var placeholder = getPlaceholder(wrapper), holdersCount = countHolders(args, placeholder); } if (partials) { @@ -40444,7 +41706,7 @@ return jQuery; * * @private * @param {Function} arrayFunc The function to iterate over iteratees. - * @returns {Function} Returns the new over function. + * @returns {Function} Returns the new invoker function. */ function createOver(arrayFunc) { return rest(function(iteratees) { @@ -40642,26 +41904,6 @@ return jQuery; return new Set(values); }; - /** - * Creates a `_.toPairs` or `_.toPairsIn` function. - * - * @private - * @param {Function} keysFunc The function to get the keys of a given object. - * @returns {Function} Returns the new pairs function. - */ - function createToPairs(keysFunc) { - return function(object) { - var tag = getTag(object); - if (tag == mapTag) { - return mapToArray(object); - } - if (tag == setTag) { - return setToPairs(object); - } - return baseToPairs(object, keysFunc(object)); - }; - } - /** * Creates a function that either curries or invokes `func` with optional * `this` binding and partially applied arguments. @@ -40679,7 +41921,6 @@ return jQuery; * 64 - `_.partialRight` * 128 - `_.rearg` * 256 - `_.ary` - * 512 - `_.flip` * @param {*} [thisArg] The `this` binding of `func`. * @param {Array} [partials] The arguments to be partially applied. * @param {Array} [holders] The `partials` placeholder indexes. @@ -40758,7 +41999,9 @@ return jQuery; * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. */ function equalArrays(array, other, equalFunc, customizer, bitmask, stack) { - var isPartial = bitmask & PARTIAL_COMPARE_FLAG, + var index = -1, + isPartial = bitmask & PARTIAL_COMPARE_FLAG, + isUnordered = bitmask & UNORDERED_COMPARE_FLAG, arrLength = array.length, othLength = other.length; @@ -40770,10 +42013,7 @@ return jQuery; if (stacked) { return stacked == other; } - var index = -1, - result = true, - seen = (bitmask & UNORDERED_COMPARE_FLAG) ? new SetCache : undefined; - + var result = true; stack.set(array, other); // Ignore non-index properties. @@ -40794,12 +42034,10 @@ return jQuery; break; } // Recursively compare arrays (susceptible to call stack limits). - if (seen) { - if (!arraySome(other, function(othValue, othIndex) { - if (!seen.has(othIndex) && - (arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) { - return seen.add(othIndex); - } + if (isUnordered) { + if (!arraySome(other, function(othValue) { + return arrValue === othValue || + equalFunc(arrValue, othValue, customizer, bitmask, stack); })) { result = false; break; @@ -41033,18 +42271,6 @@ return jQuery; return result; } - /** - * Gets the argument placeholder value for `func`. - * - * @private - * @param {Function} func The function to inspect. - * @returns {*} Returns the placeholder value. - */ - function getHolder(func) { - var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func; - return object.placeholder; - } - /** * Gets the appropriate "iteratee" function. If `_.iteratee` is customized, * this function returns the custom method, otherwise it returns `baseIteratee`. @@ -41075,21 +42301,6 @@ return jQuery; */ var getLength = baseProperty('length'); - /** - * Gets the data for `map`. - * - * @private - * @param {Object} map The map to query. - * @param {string} key The reference key. - * @returns {*} Returns the map data. - */ - function getMapData(map, key) { - var data = map.__data__; - return isKeyable(key) - ? data[typeof key == 'string' ? 'string' : 'hash'] - : data.map; - } - /** * Gets the property names, values, and compare flags of `object`. * @@ -41120,6 +42331,18 @@ return jQuery; return isNative(value) ? value : undefined; } + /** + * Gets the argument placeholder value for `func`. + * + * @private + * @param {Function} func The function to inspect. + * @returns {*} Returns the placeholder value. + */ + function getPlaceholder(func) { + var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func; + return object.placeholder; + } + /** * Gets the `[[Prototype]]` of `value`. * @@ -41369,7 +42592,7 @@ return jQuery; * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. */ function isFlattenable(value) { - return isArray(value) || isArguments(value); + return isArrayLikeObject(value) && (isArray(value) || isArguments(value)); } /** @@ -41513,7 +42736,7 @@ return jQuery; * @private * @param {string} key The key of the property to get. * @param {*} srcValue The value to match. - * @returns {Function} Returns the new spec function. + * @returns {Function} Returns the new function. */ function matchesStrictComparable(key, srcValue) { return function(object) { @@ -41765,7 +42988,7 @@ return jQuery; * @param {Array} array The array to process. * @param {number} [size=1] The length of each chunk * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {Array} Returns the new array of chunks. + * @returns {Array} Returns the new array containing chunks. * @example * * _.chunk(['a', 'b', 'c', 'd'], 2); @@ -41848,16 +43071,16 @@ return jQuery; */ function concat() { var length = arguments.length, - args = Array(length ? length - 1 : 0), - array = arguments[0], - index = length; + array = castArray(arguments[0]); - while (index--) { - args[index - 1] = arguments[index]; + if (length < 2) { + return length ? copyArray(array) : []; } - return length - ? arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1)) - : []; + var args = Array(length - 1); + while (length--) { + args[length - 1] = arguments[length]; + } + return arrayConcat(array, baseFlatten(args, 1)); } /** @@ -42576,8 +43799,8 @@ return jQuery; } /** - * Gets the element at `n` index of `array`. If `n` is negative, the nth - * element from the end is returned. + * Gets the nth element of `array`. If `n` is negative, the nth element + * from the end is returned. * * @static * @memberOf _ @@ -43457,7 +44680,7 @@ return jQuery; * @memberOf _ * @since 0.1.0 * @category Array - * @param {Array} array The array to inspect. + * @param {Array} array The array to filter. * @param {...*} [values] The values to exclude. * @returns {Array} Returns the new array of filtered values. * @see _.difference, _.xor @@ -43483,7 +44706,7 @@ return jQuery; * @since 2.4.0 * @category Array * @param {...Array} [arrays] The arrays to inspect. - * @returns {Array} Returns the new array of filtered values. + * @returns {Array} Returns the new array of values. * @see _.difference, _.without * @example * @@ -43507,7 +44730,7 @@ return jQuery; * @param {...Array} [arrays] The arrays to inspect. * @param {Array|Function|Object|string} [iteratee=_.identity] * The iteratee invoked per element. - * @returns {Array} Returns the new array of filtered values. + * @returns {Array} Returns the new array of values. * @example * * _.xorBy([2.1, 1.2], [4.3, 2.4], Math.floor); @@ -43536,7 +44759,7 @@ return jQuery; * @category Array * @param {...Array} [arrays] The arrays to inspect. * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns the new array of filtered values. + * @returns {Array} Returns the new array of values. * @example * * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; @@ -44284,8 +45507,9 @@ return jQuery; * // => Logs 'a' then 'b' (iteration order is not guaranteed). */ function forEach(collection, iteratee) { - var func = isArray(collection) ? arrayEach : baseEach; - return func(collection, getIteratee(iteratee, 3)); + return (typeof iteratee == 'function' && isArray(collection)) + ? arrayEach(collection, iteratee) + : baseEach(collection, getIteratee(iteratee)); } /** @@ -44309,8 +45533,9 @@ return jQuery; * // => Logs `2` then `1`. */ function forEachRight(collection, iteratee) { - var func = isArray(collection) ? arrayEachRight : baseEachRight; - return func(collection, getIteratee(iteratee, 3)); + return (typeof iteratee == 'function' && isArray(collection)) + ? arrayEachRight(collection, iteratee) + : baseEachRight(collection, getIteratee(iteratee)); } /** @@ -44991,7 +46216,7 @@ return jQuery; * @param {Function} func The function to cap arguments for. * @param {number} [n=func.length] The arity cap. * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {Function} Returns the new capped function. + * @returns {Function} Returns the new function. * @example * * _.map(['6', '8', '10'], _.ary(parseInt, 1)); @@ -45075,7 +46300,7 @@ return jQuery; var bind = rest(function(func, thisArg, partials) { var bitmask = BIND_FLAG; if (partials.length) { - var holders = replaceHolders(partials, getHolder(bind)); + var holders = replaceHolders(partials, getPlaceholder(bind)); bitmask |= PARTIAL_FLAG; } return createWrapper(func, bitmask, thisArg, partials, holders); @@ -45129,7 +46354,7 @@ return jQuery; var bindKey = rest(function(object, key, partials) { var bitmask = BIND_FLAG | BIND_KEY_FLAG; if (partials.length) { - var holders = replaceHolders(partials, getHolder(bindKey)); + var holders = replaceHolders(partials, getPlaceholder(bindKey)); bitmask |= PARTIAL_FLAG; } return createWrapper(key, bitmask, object, partials, holders); @@ -45455,7 +46680,7 @@ return jQuery; * @since 4.0.0 * @category Function * @param {Function} func The function to flip arguments for. - * @returns {Function} Returns the new flipped function. + * @returns {Function} Returns the new function. * @example * * var flipped = _.flip(function() { @@ -45488,7 +46713,7 @@ return jQuery; * @category Function * @param {Function} func The function to have its output memoized. * @param {Function} [resolver] The function to resolve the cache key. - * @returns {Function} Returns the new memoized function. + * @returns {Function} Returns the new memoizing function. * @example * * var object = { 'a': 1, 'b': 2 }; @@ -45546,7 +46771,7 @@ return jQuery; * @since 3.0.0 * @category Function * @param {Function} predicate The predicate to negate. - * @returns {Function} Returns the new negated function. + * @returns {Function} Returns the new function. * @example * * function isEven(n) { @@ -45670,7 +46895,7 @@ return jQuery; * // => 'hi fred' */ var partial = rest(function(func, partials) { - var holders = replaceHolders(partials, getHolder(partial)); + var holders = replaceHolders(partials, getPlaceholder(partial)); return createWrapper(func, PARTIAL_FLAG, undefined, partials, holders); }); @@ -45707,7 +46932,7 @@ return jQuery; * // => 'hello fred' */ var partialRight = rest(function(func, partials) { - var holders = replaceHolders(partials, getHolder(partialRight)); + var holders = replaceHolders(partials, getPlaceholder(partialRight)); return createWrapper(func, PARTIAL_RIGHT_FLAG, undefined, partials, holders); }); @@ -45909,7 +47134,7 @@ return jQuery; * @since 4.0.0 * @category Function * @param {Function} func The function to cap arguments for. - * @returns {Function} Returns the new capped function. + * @returns {Function} Returns the new function. * @example * * _.map(['6', '8', '10'], _.unary(parseInt)); @@ -46585,14 +47810,14 @@ return jQuery; * _.isFinite(3); * // => true * - * _.isFinite(Number.MIN_VALUE); + * _.isFinite(Number.MAX_VALUE); + * // => true + * + * _.isFinite(3.14); * // => true * * _.isFinite(Infinity); * // => false - * - * _.isFinite('3'); - * // => false */ function isFinite(value) { return typeof value == 'number' && nativeIsFinite(value); @@ -47313,41 +48538,6 @@ return jQuery; return func(value); } - /** - * Converts `value` to a finite number. - * - * @static - * @memberOf _ - * @since 4.12.0 - * @category Lang - * @param {*} value The value to convert. - * @returns {number} Returns the converted number. - * @example - * - * _.toFinite(3.2); - * // => 3.2 - * - * _.toFinite(Number.MIN_VALUE); - * // => 5e-324 - * - * _.toFinite(Infinity); - * // => 1.7976931348623157e+308 - * - * _.toFinite('3.2'); - * // => 3.2 - */ - function toFinite(value) { - if (!value) { - return value === 0 ? value : 0; - } - value = toNumber(value); - if (value === INFINITY || value === -INFINITY) { - var sign = (value < 0 ? -1 : 1); - return sign * MAX_INTEGER; - } - return value === value ? value : 0; - } - /** * Converts `value` to an integer. * @@ -47362,7 +48552,7 @@ return jQuery; * @returns {number} Returns the converted integer. * @example * - * _.toInteger(3.2); + * _.toInteger(3); * // => 3 * * _.toInteger(Number.MIN_VALUE); @@ -47371,14 +48561,20 @@ return jQuery; * _.toInteger(Infinity); * // => 1.7976931348623157e+308 * - * _.toInteger('3.2'); + * _.toInteger('3'); * // => 3 */ function toInteger(value) { - var result = toFinite(value), - remainder = result % 1; - - return result === result ? (remainder ? result - remainder : result) : 0; + if (!value) { + return value === 0 ? value : 0; + } + value = toNumber(value); + if (value === INFINITY || value === -INFINITY) { + var sign = (value < 0 ? -1 : 1); + return sign * MAX_INTEGER; + } + var remainder = value % 1; + return value === value ? (remainder ? value - remainder : value) : 0; } /** @@ -47396,7 +48592,7 @@ return jQuery; * @returns {number} Returns the converted integer. * @example * - * _.toLength(3.2); + * _.toLength(3); * // => 3 * * _.toLength(Number.MIN_VALUE); @@ -47405,7 +48601,7 @@ return jQuery; * _.toLength(Infinity); * // => 4294967295 * - * _.toLength('3.2'); + * _.toLength('3'); * // => 3 */ function toLength(value) { @@ -47423,8 +48619,8 @@ return jQuery; * @returns {number} Returns the number. * @example * - * _.toNumber(3.2); - * // => 3.2 + * _.toNumber(3); + * // => 3 * * _.toNumber(Number.MIN_VALUE); * // => 5e-324 @@ -47432,8 +48628,8 @@ return jQuery; * _.toNumber(Infinity); * // => Infinity * - * _.toNumber('3.2'); - * // => 3.2 + * _.toNumber('3'); + * // => 3 */ function toNumber(value) { if (typeof value == 'number') { @@ -47496,7 +48692,7 @@ return jQuery; * @returns {number} Returns the converted integer. * @example * - * _.toSafeInteger(3.2); + * _.toSafeInteger(3); * // => 3 * * _.toSafeInteger(Number.MIN_VALUE); @@ -47505,7 +48701,7 @@ return jQuery; * _.toSafeInteger(Infinity); * // => 9007199254740991 * - * _.toSafeInteger('3.2'); + * _.toSafeInteger('3'); * // => 3 */ function toSafeInteger(value) { @@ -47698,7 +48894,7 @@ return jQuery; * @category Object * @param {Object} object The object to iterate over. * @param {...(string|string[])} [paths] The property paths of elements to pick. - * @returns {Array} Returns the picked values. + * @returns {Array} Returns the new array of picked elements. * @example * * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; @@ -47914,7 +49110,7 @@ return jQuery; function forIn(object, iteratee) { return object == null ? object - : baseFor(object, getIteratee(iteratee, 3), keysIn); + : baseFor(object, getIteratee(iteratee), keysIn); } /** @@ -47946,7 +49142,7 @@ return jQuery; function forInRight(object, iteratee) { return object == null ? object - : baseForRight(object, getIteratee(iteratee, 3), keysIn); + : baseForRight(object, getIteratee(iteratee), keysIn); } /** @@ -47978,7 +49174,7 @@ return jQuery; * // => Logs 'a' then 'b' (iteration order is not guaranteed). */ function forOwn(object, iteratee) { - return object && baseForOwn(object, getIteratee(iteratee, 3)); + return object && baseForOwn(object, getIteratee(iteratee)); } /** @@ -48008,7 +49204,7 @@ return jQuery; * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'. */ function forOwnRight(object, iteratee) { - return object && baseForOwnRight(object, getIteratee(iteratee, 3)); + return object && baseForOwnRight(object, getIteratee(iteratee)); } /** @@ -48020,7 +49216,7 @@ return jQuery; * @memberOf _ * @category Object * @param {Object} object The object to inspect. - * @returns {Array} Returns the function names. + * @returns {Array} Returns the new array of property names. * @see _.functionsIn * @example * @@ -48047,7 +49243,7 @@ return jQuery; * @since 4.0.0 * @category Object * @param {Object} object The object to inspect. - * @returns {Array} Returns the function names. + * @returns {Array} Returns the new array of property names. * @see _.functions * @example * @@ -48400,7 +49596,7 @@ return jQuery; * inherited enumerable string keyed properties of source objects into the * destination object. Source properties that resolve to `undefined` are * skipped if a destination value exists. Array and plain object properties - * are merged recursively. Other objects and value types are overridden by + * are merged recursively.Other objects and value types are overridden by * assignment. Source objects are applied from left to right. Subsequent * sources overwrite property assignments of previous sources. * @@ -48685,8 +49881,7 @@ return jQuery; /** * Creates an array of own enumerable string keyed-value pairs for `object` - * which can be consumed by `_.fromPairs`. If `object` is a map or set, its - * entries are returned. + * which can be consumed by `_.fromPairs`. * * @static * @memberOf _ @@ -48694,7 +49889,7 @@ return jQuery; * @alias entries * @category Object * @param {Object} object The object to query. - * @returns {Array} Returns the key-value pairs. + * @returns {Array} Returns the new array of key-value pairs. * @example * * function Foo() { @@ -48707,12 +49902,13 @@ return jQuery; * _.toPairs(new Foo); * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed) */ - var toPairs = createToPairs(keys); + function toPairs(object) { + return baseToPairs(object, keys(object)); + } /** * Creates an array of own and inherited enumerable string keyed-value pairs - * for `object` which can be consumed by `_.fromPairs`. If `object` is a map - * or set, its entries are returned. + * for `object` which can be consumed by `_.fromPairs`. * * @static * @memberOf _ @@ -48720,7 +49916,7 @@ return jQuery; * @alias entriesIn * @category Object * @param {Object} object The object to query. - * @returns {Array} Returns the key-value pairs. + * @returns {Array} Returns the new array of key-value pairs. * @example * * function Foo() { @@ -48731,9 +49927,11 @@ return jQuery; * Foo.prototype.c = 3; * * _.toPairsIn(new Foo); - * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed) + * // => [['a', 1], ['b', 2], ['c', 1]] (iteration order is not guaranteed) */ - var toPairsIn = createToPairs(keysIn); + function toPairsIn(object) { + return baseToPairs(object, keysIn(object)); + } /** * An alternative to `_.reduce`; this method transforms `object` to a new @@ -49563,7 +50761,7 @@ return jQuery; * @param {string} [string=''] The string to split. * @param {RegExp|string} separator The separator pattern to split by. * @param {number} [limit] The length to truncate results to. - * @returns {Array} Returns the string segments. + * @returns {Array} Returns the new array of string segments. * @example * * _.split('a-b-c', '-', 2); @@ -49708,6 +50906,12 @@ return jQuery; * compiled({ 'user': 'pebbles' }); * // => 'hello pebbles!' * + * // Use custom template delimiters. + * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g; + * var compiled = _.template('hello {{ user }}!'); + * compiled({ 'user': 'mustache' }); + * // => 'hello mustache!' + * * // Use backslashes to treat delimiters as plain text. * var compiled = _.template('<%= "\\<%- value %\\>" %>'); * compiled({ 'value': 'ignored' }); @@ -49733,15 +50937,9 @@ return jQuery; * // return __p; * // } * - * // Use custom template delimiters. - * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g; - * var compiled = _.template('hello {{ user }}!'); - * compiled({ 'user': 'mustache' }); - * // => 'hello mustache!' - * * // Use the `source` property to inline compiled templates for meaningful * // line numbers in error messages and stack traces. - * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\ + * fs.writeFileSync(path.join(cwd, 'jst.js'), '\ * var JST = {\ * "main": ' + _.template(mainText).source + '\ * };\ @@ -50277,7 +51475,7 @@ return jQuery; * @since 4.0.0 * @category Util * @param {Array} pairs The predicate-function pairs. - * @returns {Function} Returns the new composite function. + * @returns {Function} Returns the new function. * @example * * var func = _.cond([ @@ -50327,7 +51525,7 @@ return jQuery; * @since 4.0.0 * @category Util * @param {Object} source The object of property predicates to conform to. - * @returns {Function} Returns the new spec function. + * @returns {Function} Returns the new function. * @example * * var users = [ @@ -50350,7 +51548,7 @@ return jQuery; * @since 2.4.0 * @category Util * @param {*} value The value to return from the new function. - * @returns {Function} Returns the new constant function. + * @returns {Function} Returns the new function. * @example * * var object = { 'user': 'fred' }; @@ -50375,7 +51573,7 @@ return jQuery; * @since 3.0.0 * @category Util * @param {...(Function|Function[])} [funcs] Functions to invoke. - * @returns {Function} Returns the new composite function. + * @returns {Function} Returns the new function. * @see _.flowRight * @example * @@ -50398,7 +51596,7 @@ return jQuery; * @memberOf _ * @category Util * @param {...(Function|Function[])} [funcs] Functions to invoke. - * @returns {Function} Returns the new composite function. + * @returns {Function} Returns the new function. * @see _.flow * @example * @@ -50491,7 +51689,7 @@ return jQuery; * @since 3.0.0 * @category Util * @param {Object} source The object of property values to match. - * @returns {Function} Returns the new spec function. + * @returns {Function} Returns the new function. * @example * * var users = [ @@ -50519,7 +51717,7 @@ return jQuery; * @category Util * @param {Array|string} path The path of the property to get. * @param {*} srcValue The value to match. - * @returns {Function} Returns the new spec function. + * @returns {Function} Returns the new function. * @example * * var users = [ @@ -50544,7 +51742,7 @@ return jQuery; * @category Util * @param {Array|string} path The path of the method to invoke. * @param {...*} [args] The arguments to invoke the method with. - * @returns {Function} Returns the new invoker function. + * @returns {Function} Returns the new function. * @example * * var objects = [ @@ -50575,7 +51773,7 @@ return jQuery; * @category Util * @param {Object} object The object to query. * @param {...*} [args] The arguments to invoke the method with. - * @returns {Function} Returns the new invoker function. + * @returns {Function} Returns the new function. * @example * * var array = _.times(3, _.constant), @@ -50705,7 +51903,7 @@ return jQuery; } /** - * Creates a function that gets the argument at `n` index. If `n` is negative, + * Creates a function that returns its nth argument. If `n` is negative, * the nth argument from the end is returned. * * @static @@ -50713,7 +51911,7 @@ return jQuery; * @since 4.0.0 * @category Util * @param {number} [n=0] The index of the argument to return. - * @returns {Function} Returns the new pass-thru function. + * @returns {Function} Returns the new function. * @example * * var func = _.nthArg(1); @@ -50811,7 +52009,7 @@ return jQuery; * @since 2.4.0 * @category Util * @param {Array|string} path The path of the property to get. - * @returns {Function} Returns the new accessor function. + * @returns {Function} Returns the new function. * @example * * var objects = [ @@ -50838,7 +52036,7 @@ return jQuery; * @since 3.0.0 * @category Util * @param {Object} object The object to query. - * @returns {Function} Returns the new accessor function. + * @returns {Function} Returns the new function. * @example * * var array = [0, 1, 2], @@ -50872,7 +52070,7 @@ return jQuery; * @param {number} [start=0] The start of the range. * @param {number} end The end of the range. * @param {number} [step=1] The value to increment or decrement by. - * @returns {Array} Returns the range of numbers. + * @returns {Array} Returns the new array of numbers. * @see _.inRange, _.rangeRight * @example * @@ -50910,7 +52108,7 @@ return jQuery; * @param {number} [start=0] The start of the range. * @param {number} end The end of the range. * @param {number} [step=1] The value to increment or decrement by. - * @returns {Array} Returns the range of numbers. + * @returns {Array} Returns the new array of numbers. * @see _.inRange, _.range * @example * @@ -51671,7 +52869,6 @@ return jQuery; lodash.sumBy = sumBy; lodash.template = template; lodash.times = times; - lodash.toFinite = toFinite; lodash.toInteger = toInteger; lodash.toLength = toLength; lodash.toLower = toLower; @@ -51975,7 +53172,25 @@ return jQuery; module.exports = require('react/lib/ReactDOM'); -},{"react/lib/ReactDOM":102}],"react-router":[function(require,module,exports){ +},{"react/lib/ReactDOM":112}],"react-redux":[function(require,module,exports){ +'use strict'; + +exports.__esModule = true; +exports.connect = exports.Provider = undefined; + +var _Provider = require('./components/Provider'); + +var _Provider2 = _interopRequireDefault(_Provider); + +var _connect = require('./components/connect'); + +var _connect2 = _interopRequireDefault(_connect); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +exports.Provider = _Provider2["default"]; +exports.connect = _connect2["default"]; +},{"./components/Provider":35,"./components/connect":36}],"react-router":[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -52132,12 +53347,62 @@ exports.applyRouterMiddleware = _applyRouterMiddleware3.default; exports.browserHistory = _browserHistory3.default; exports.hashHistory = _hashHistory3.default; exports.createMemoryHistory = _createMemoryHistory3.default; -},{"./History":32,"./IndexLink":33,"./IndexRedirect":34,"./IndexRoute":35,"./Lifecycle":37,"./Link":38,"./PatternUtils":39,"./PropTypes":40,"./Redirect":41,"./Route":42,"./RouteContext":43,"./RouteUtils":44,"./Router":45,"./RouterContext":46,"./RoutingContext":48,"./applyRouterMiddleware":50,"./browserHistory":51,"./createMemoryHistory":53,"./hashHistory":59,"./match":61,"./useRouterHistory":64,"./useRoutes":65,"./withRouter":66}],"react":[function(require,module,exports){ +},{"./History":42,"./IndexLink":43,"./IndexRedirect":44,"./IndexRoute":45,"./Lifecycle":47,"./Link":48,"./PatternUtils":49,"./PropTypes":50,"./Redirect":51,"./Route":52,"./RouteContext":53,"./RouteUtils":54,"./Router":55,"./RouterContext":56,"./RoutingContext":58,"./applyRouterMiddleware":60,"./browserHistory":61,"./createMemoryHistory":63,"./hashHistory":69,"./match":71,"./useRouterHistory":74,"./useRoutes":75,"./withRouter":76}],"react":[function(require,module,exports){ 'use strict'; module.exports = require('./lib/React'); -},{"./lib/React":92}],"shallowequal":[function(require,module,exports){ +},{"./lib/React":102}],"redux":[function(require,module,exports){ +(function (process){ +'use strict'; + +exports.__esModule = true; +exports.compose = exports.applyMiddleware = exports.bindActionCreators = exports.combineReducers = exports.createStore = undefined; + +var _createStore = require('./createStore'); + +var _createStore2 = _interopRequireDefault(_createStore); + +var _combineReducers = require('./combineReducers'); + +var _combineReducers2 = _interopRequireDefault(_combineReducers); + +var _bindActionCreators = require('./bindActionCreators'); + +var _bindActionCreators2 = _interopRequireDefault(_bindActionCreators); + +var _applyMiddleware = require('./applyMiddleware'); + +var _applyMiddleware2 = _interopRequireDefault(_applyMiddleware); + +var _compose = require('./compose'); + +var _compose2 = _interopRequireDefault(_compose); + +var _warning = require('./utils/warning'); + +var _warning2 = _interopRequireDefault(_warning); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + +/* +* This is a dummy function to check if the function name has been altered by minification. +* If the function has been minified and NODE_ENV !== 'production', warn the user. +*/ +function isCrushed() {} + +if (process.env.NODE_ENV !== 'production' && typeof isCrushed.name === 'string' && isCrushed.name !== 'isCrushed') { + (0, _warning2["default"])('You are currently using minified code outside of NODE_ENV === \'production\'. ' + 'This means that you are running a slower development build of Redux. ' + 'You can use loose-envify (https://github.com/zertosh/loose-envify) for browserify ' + 'or DefinePlugin for webpack (http://stackoverflow.com/questions/30030031) ' + 'to ensure you have the correct code for your production build.'); +} + +exports.createStore = _createStore2["default"]; +exports.combineReducers = _combineReducers2["default"]; +exports.bindActionCreators = _bindActionCreators2["default"]; +exports.applyMiddleware = _applyMiddleware2["default"]; +exports.compose = _compose2["default"]; +}).call(this,require('_process')) + +},{"./applyMiddleware":240,"./bindActionCreators":241,"./combineReducers":242,"./compose":243,"./createStore":244,"./utils/warning":245,"_process":33}],"shallowequal":[function(require,module,exports){ 'use strict'; var fetchKeys = require('lodash.keys'); diff --git a/web/package.json b/web/package.json index 02af2666a..4b58422c7 100644 --- a/web/package.json +++ b/web/package.json @@ -30,6 +30,7 @@ }, "devDependencies": { "babel-core": "^6.7.7", + "babel-eslint": "^6.0.4", "babel-jest": "^12.0.2", "babel-plugin-transform-class-properties": "^6.6.0", "babel-preset-es2015": "^6.6.0", diff --git a/web/src/js/app.js b/web/src/js/app.js index e21fa499a..308976868 100644 --- a/web/src/js/app.js +++ b/web/src/js/app.js @@ -1,9 +1,15 @@ import React from "react" -import { render } from 'react-dom' +import {render} from 'react-dom' +import {createStore} from 'redux' +import {Provider} from 'react-redux' +import mitmproxyApp from './reducers' + import $ from "jquery" import Connection from "./connection" -import {app} from "./components/proxyapp.js" -import { EventLogActions } from "./actions.js" +import {App} from "./components/proxyapp.js" +import {EventLogActions} from "./actions.js" + +let store = createStore(mitmproxyApp); $(function () { window.ws = new Connection("/updates"); @@ -12,6 +18,8 @@ $(function () { EventLogActions.add_event(msg); }; - render(app, document.getElementById("mitmproxy")); + render( + {App}, + document.getElementById("mitmproxy")); }); diff --git a/web/src/js/components/eventlog.js b/web/src/js/components/eventlog.js index 6e4f90968..687c5265d 100644 --- a/web/src/js/components/eventlog.js +++ b/web/src/js/components/eventlog.js @@ -1,11 +1,12 @@ import React from "react" import ReactDOM from "react-dom" +import { connect } from 'react-redux' import shallowEqual from "shallowequal" import {Query} from "../actions.js" +import {toggleEventLogFilter} from "../reduxActions" import AutoScroll from "./helpers/AutoScroll"; import {calcVScroll} from "./helpers/VirtualScroll" import {StoreView} from "../store/view.js" -import _ from "lodash" class EventLogContents extends React.Component { @@ -127,7 +128,7 @@ function ToggleFilter ({ name, active, toggleLevel }) { function onClick(event) { event.preventDefault(); - toggleLevel(name); + toggleLevel(); } return ( @@ -140,42 +141,55 @@ function ToggleFilter ({ name, active, toggleLevel }) { ); } +const mapStateToProps = (state, ownProps) => { + return { + active: state.eventLog.visibilityFilter[ownProps.name] + } +}; + +const mapDispatchToProps = (dispatch, ownProps) => { + return { + toggleLevel: () => { + dispatch(toggleEventLogFilter(ownProps.name)) + } + } +}; + +const ToggleEventLogFilter = connect( + mapStateToProps, + mapDispatchToProps +)(ToggleFilter); + + const AutoScrollEventLog = AutoScroll(EventLogContents); + +const VisibleAutoScrollEventLog = connect( + function mapStateToProps(state, ownProps) { + return {filter: state.eventLog.visibilityFilter} + })(AutoScrollEventLog); + + var EventLog = React.createClass({ - getInitialState() { - return { - filter: { - "debug": false, - "info": true, - "web": true - } - }; - }, close() { var d = {}; d[Query.SHOW_EVENTLOG] = undefined; this.props.updateLocation(undefined, d); }, - toggleLevel(level) { - var filter = _.extend({}, this.state.filter); - filter[level] = !filter[level]; - this.setState({filter: filter}); - }, render() { return (
Eventlog
- - - + + +
- +
); } diff --git a/web/src/js/components/proxyapp.js b/web/src/js/components/proxyapp.js index f47c5bb46..4c790d3dc 100644 --- a/web/src/js/components/proxyapp.js +++ b/web/src/js/components/proxyapp.js @@ -145,7 +145,7 @@ var ProxyAppMain = React.createClass({ import { Route, Router as ReactRouter, hashHistory, Redirect} from "react-router"; -export var app = ( +export var App = ( diff --git a/web/src/js/reducers/eventLog.js b/web/src/js/reducers/eventLog.js new file mode 100644 index 000000000..169cd3069 --- /dev/null +++ b/web/src/js/reducers/eventLog.js @@ -0,0 +1,30 @@ +import {combineReducers} from 'redux' +import {TOGGLE_EVENTLOG_FILTER} from "../reduxActions" + +const defaultVisibility = { + "debug": false, + "info": true, + "web": true +}; + +const visibilityFilter = (state = defaultVisibility, action) => { + switch (action.type) { + case TOGGLE_EVENTLOG_FILTER: + return Object.assign({}, state, { + [action.filter]: !state[action.filter] + }); + default: + return state; + } +}; + +const entries = (state = [], action) => { + return state; +}; + +const eventLog = combineReducers({ + visibilityFilter, + entries +}); + +export default eventLog diff --git a/web/src/js/reducers/index.js b/web/src/js/reducers/index.js new file mode 100644 index 000000000..a8b2edbf7 --- /dev/null +++ b/web/src/js/reducers/index.js @@ -0,0 +1,8 @@ +import {combineReducers} from 'redux'; +import eventLog from './eventlog' + +const mitmproxyApp = combineReducers({ + eventLog +}); + +export default mitmproxyApp diff --git a/web/src/js/reduxActions.js b/web/src/js/reduxActions.js new file mode 100644 index 000000000..c5902f80d --- /dev/null +++ b/web/src/js/reduxActions.js @@ -0,0 +1,13 @@ +export const TOGGLE_EVENTLOG_FILTER = 'TOGGLE_EVENTLOG_FILTER'; +export const HIDE_EVENTLOG = 'HIDE_EVENTLOG'; +export const SHOW_EVENTLOG = 'SHOW_EVENTLOG'; + +export const EventLogFilters = { + DEBUG: 'debug', + INFO: 'info', + WEB: 'web' +}; + +export function toggleEventLogFilter(filter) { + return {type: TOGGLE_EVENTLOG_FILTER, filter} +} From 7a388560d7d3ef22be0bdef1811414ad18ff2484 Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Thu, 2 Jun 2016 09:51:39 -0700 Subject: [PATCH 3/8] use object spread operator While the spread operator is not part of ES6, React also uses it for JSX. It makes sense for us to keep it in other parts of the codebase as well. --- mitmproxy/web/static/app.js | 4 +++- web/.babelrc | 2 +- web/src/js/reducers/eventLog.js | 5 +++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/mitmproxy/web/static/app.js b/mitmproxy/web/static/app.js index 88881601d..e517f33ec 100644 --- a/mitmproxy/web/static/app.js +++ b/mitmproxy/web/static/app.js @@ -6495,6 +6495,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + var _redux = require("redux"); var _reduxActions = require("../reduxActions"); @@ -6513,7 +6515,7 @@ var visibilityFilter = function visibilityFilter() { switch (action.type) { case _reduxActions.TOGGLE_EVENTLOG_FILTER: - return Object.assign({}, state, _defineProperty({}, action.filter, !state[action.filter])); + return _extends({}, state, _defineProperty({}, action.filter, !state[action.filter])); default: return state; } diff --git a/web/.babelrc b/web/.babelrc index 5dd7708c9..e2d67e339 100644 --- a/web/.babelrc +++ b/web/.babelrc @@ -1,4 +1,4 @@ { "presets": ["es2015", "react"], - "plugins": ["transform-class-properties"] + "plugins": ["transform-class-properties", "transform-object-rest-spread"] } \ No newline at end of file diff --git a/web/src/js/reducers/eventLog.js b/web/src/js/reducers/eventLog.js index 169cd3069..9d078c140 100644 --- a/web/src/js/reducers/eventLog.js +++ b/web/src/js/reducers/eventLog.js @@ -10,9 +10,10 @@ const defaultVisibility = { const visibilityFilter = (state = defaultVisibility, action) => { switch (action.type) { case TOGGLE_EVENTLOG_FILTER: - return Object.assign({}, state, { + return { + ...state, [action.filter]: !state[action.filter] - }); + }; default: return state; } From 698d38b28e43ce0685ce8ce8c119926af2083cbc Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Thu, 2 Jun 2016 17:46:18 -0700 Subject: [PATCH 4/8] web: :hatching_chick: --- mitmproxy/web/static/app.css | 51 +--- mitmproxy/web/static/app.js | 440 ++++++++++++++---------------- web/src/css/eventlog.less | 8 + web/src/css/header.less | 17 -- web/src/js/app.js | 4 +- web/src/js/components/common.js | 17 +- web/src/js/components/eventlog.js | 136 ++++----- web/src/js/components/header.js | 19 +- web/src/js/components/proxyapp.js | 15 +- web/src/js/ducks/README.md | 1 + web/src/js/ducks/eventLog.js | 39 +++ web/src/js/ducks/index.js | 8 + web/src/js/reducers/eventLog.js | 31 --- web/src/js/reduxActions.js | 13 - 14 files changed, 339 insertions(+), 460 deletions(-) create mode 100644 web/src/js/ducks/README.md create mode 100644 web/src/js/ducks/eventLog.js create mode 100644 web/src/js/ducks/index.js delete mode 100644 web/src/js/reducers/eventLog.js delete mode 100644 web/src/js/reduxActions.js diff --git a/mitmproxy/web/static/app.css b/mitmproxy/web/static/app.css index ae2e963f5..bc3f1a6a3 100644 --- a/mitmproxy/web/static/app.css +++ b/mitmproxy/web/static/app.css @@ -164,49 +164,6 @@ header .menu { max-height: 500px; overflow-y: auto; } -.menu .toggle-btn { - float: left; - width: 33.33333333%; - position: relative; - min-height: 1px; - padding-left: 2.5px; - padding-right: 2.5px; - margin-bottom: 5px; -} -@media (min-width: 768px) { - .menu .toggle-btn { - float: left; - width: 25%; - } -} -@media (min-width: 1200px) { - .menu .toggle-btn { - float: left; - width: 16.66666667%; - } -} -.menu .toggle-btn .btn { - width: 100%; -} -.menu .toggle-input-btn { - position: relative; - min-height: 1px; - padding-left: 2.5px; - padding-right: 2.5px; - margin-bottom: 5px; -} -@media (min-width: 768px) { - .menu .toggle-input-btn { - float: left; - width: 50%; - } -} -@media (min-width: 1200px) { - .menu .toggle-input-btn { - float: left; - width: 33.33333333%; - } -} .flow-table { width: 100%; overflow-y: scroll; @@ -452,6 +409,14 @@ header .menu { .eventlog .fa-close:hover { color: black; } +.eventlog .btn-toggle { + margin-top: -2px; + margin-left: 3px; + padding: 2px 2px; + font-size: 10px; + line-height: 10px; + border-radius: 2px; +} .eventlog .label { cursor: pointer; vertical-align: middle; diff --git a/mitmproxy/web/static/app.js b/mitmproxy/web/static/app.js index e517f33ec..b7e0f24e6 100644 --- a/mitmproxy/web/static/app.js +++ b/mitmproxy/web/static/app.js @@ -365,13 +365,13 @@ var SettingsActions = exports.SettingsActions = { data: JSON.stringify(settings) }); - /* - //Facebook Flux: We do an optimistic update on the client already. - AppDispatcher.dispatchViewAction({ - type: ActionTypes.SETTINGS_STORE, - cmd: StoreCmds.UPDATE, - data: settings - }); + /* + //Facebook Flux: We do an optimistic update on the client already. + AppDispatcher.dispatchViewAction({ + type: ActionTypes.SETTINGS_STORE, + cmd: StoreCmds.UPDATE, + data: settings + }); */ } }; @@ -414,15 +414,15 @@ var FlowActions = exports.FlowActions = { _jquery2.default.post("/flows/" + flow.id + "/revert"); }, update: function update(flow, nextProps) { - /* - //Facebook Flux: We do an optimistic update on the client already. - var nextFlow = _.cloneDeep(flow); - _.merge(nextFlow, nextProps); - AppDispatcher.dispatchViewAction({ - type: ActionTypes.FLOW_STORE, - cmd: StoreCmds.UPDATE, - data: nextFlow - }); + /* + //Facebook Flux: We do an optimistic update on the client already. + var nextFlow = _.cloneDeep(flow); + _.merge(nextFlow, nextProps); + AppDispatcher.dispatchViewAction({ + type: ActionTypes.FLOW_STORE, + cmd: StoreCmds.UPDATE, + data: nextFlow + }); */ _jquery2.default.ajax({ type: "PUT", @@ -455,10 +455,6 @@ var _redux = require('redux'); var _reactRedux = require('react-redux'); -var _reducers = require('./reducers'); - -var _reducers2 = _interopRequireDefault(_reducers); - var _jquery = require('jquery'); var _jquery2 = _interopRequireDefault(_jquery); @@ -471,9 +467,13 @@ var _proxyapp = require('./components/proxyapp.js'); var _actions = require('./actions.js'); +var _index = require('./ducks/index'); + +var _index2 = _interopRequireDefault(_index); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -var store = (0, _redux.createStore)(_reducers2.default); +var store = (0, _redux.createStore)(_index2.default); (0, _jquery2.default)(function () { window.ws = new _connection2.default("/updates"); @@ -489,7 +489,7 @@ var store = (0, _redux.createStore)(_reducers2.default); ), document.getElementById("mitmproxy")); }); -},{"./actions.js":2,"./components/proxyapp.js":20,"./connection":21,"./reducers":26,"jquery":"jquery","react":"react","react-dom":"react-dom","react-redux":"react-redux","redux":"redux"}],4:[function(require,module,exports){ +},{"./actions.js":2,"./components/proxyapp.js":20,"./connection":21,"./ducks/index":24,"jquery":"jquery","react":"react","react-dom":"react-dom","react-redux":"react-redux","redux":"redux"}],4:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -629,28 +629,23 @@ var Splitter = exports.Splitter = _react2.default.createClass({ } }); -var ToggleButton = exports.ToggleButton = function ToggleButton(props) { +var ToggleButton = exports.ToggleButton = function ToggleButton(_ref) { + var checked = _ref.checked; + var onToggle = _ref.onToggle; + var text = _ref.text; return _react2.default.createElement( "div", - { className: "input-group toggle-btn" }, - _react2.default.createElement( - "div", - { - className: "btn " + (props.checked ? "btn-primary" : "btn-default"), - onClick: props.onToggleChanged }, - _react2.default.createElement( - "span", - { className: "fa " + (props.checked ? "fa-check-square-o" : "fa-square-o") }, - " ", - props.name - ) - ) + { className: "btn btn-toggle " + (checked ? "btn-primary" : "btn-default"), onClick: onToggle }, + _react2.default.createElement("i", { className: "fa fa-fw " + (checked ? "fa-check-square-o" : "fa-square-o") }), + " ", + text ); }; ToggleButton.propTypes = { - name: _react2.default.PropTypes.string.isRequired, - onToggleChanged: _react2.default.PropTypes.func.isRequired + checked: _react2.default.PropTypes.bool.isRequired, + onToggle: _react2.default.PropTypes.func.isRequired, + text: _react2.default.PropTypes.string.isRequired }; var ToggleInputButton = exports.ToggleInputButton = function (_React$Component) { @@ -713,7 +708,7 @@ ToggleInputButton.propTypes = { onToggleChanged: _react2.default.PropTypes.func.isRequired }; -},{"../utils.js":30,"lodash":"lodash","react":"react","react-dom":"react-dom"}],5:[function(require,module,exports){ +},{"../utils.js":29,"lodash":"lodash","react":"react","react-dom":"react-dom"}],5:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -971,12 +966,13 @@ var ValueEditor = exports.ValueEditor = _react2.default.createClass({ } }); -},{"../utils.js":30,"react":"react","react-dom":"react-dom"}],6:[function(require,module,exports){ +},{"../utils.js":29,"react":"react","react-dom":"react-dom"}],6:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +exports.ToggleEventLog = undefined; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); @@ -994,9 +990,7 @@ var _shallowequal = require("shallowequal"); var _shallowequal2 = _interopRequireDefault(_shallowequal); -var _actions = require("../actions.js"); - -var _reduxActions = require("../reduxActions"); +var _eventLog = require("../ducks/eventLog"); var _AutoScroll = require("./helpers/AutoScroll"); @@ -1006,6 +1000,8 @@ var _VirtualScroll = require("./helpers/VirtualScroll"); var _view = require("../store/view.js"); +var _common = require("./common"); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -1142,93 +1138,75 @@ EventLogContents.defaultProps = { }; -ToggleFilter.propTypes = { - name: _react2.default.PropTypes.string.isRequired, - toggleLevel: _react2.default.PropTypes.func.isRequired, - active: _react2.default.PropTypes.bool -}; +EventLogContents = (0, _AutoScroll2.default)(EventLogContents); -function ToggleFilter(_ref) { - var name = _ref.name; - var active = _ref.active; - var toggleLevel = _ref.toggleLevel; - - var className = "label "; - if (active) { - className += "label-primary"; - } else { - className += "label-default"; - } - - function onClick(event) { - event.preventDefault(); - toggleLevel(); - } - - return _react2.default.createElement( - "a", - { - href: "#", - className: className, - onClick: onClick }, - name - ); -} - -var mapStateToProps = function mapStateToProps(state, ownProps) { +var EventLogContentsContainer = (0, _reactRedux.connect)(function (state) { return { - active: state.eventLog.visibilityFilter[ownProps.name] + filter: state.eventLog.filter }; -}; +})(EventLogContents); -var mapDispatchToProps = function mapDispatchToProps(dispatch, ownProps) { +var ToggleEventLog = exports.ToggleEventLog = (0, _reactRedux.connect)(function (state) { return { - toggleLevel: function toggleLevel() { - dispatch((0, _reduxActions.toggleEventLogFilter)(ownProps.name)); + checked: state.eventLog.visible + }; +}, function (dispatch) { + return { + onToggle: function onToggle() { + return dispatch((0, _eventLog.toggleEventLogVisibility)()); } }; -}; +})(_common.ToggleButton); -var ToggleEventLogFilter = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(ToggleFilter); +var ToggleFilter = (0, _reactRedux.connect)(function (state, ownProps) { + return { + checked: state.eventLog.filter[ownProps.text] + }; +}, function (dispatch, ownProps) { + return { + onToggle: function onToggle() { + return dispatch((0, _eventLog.toggleEventLogFilter)(ownProps.text)); + } + }; +})(_common.ToggleButton); -var AutoScrollEventLog = (0, _AutoScroll2.default)(EventLogContents); - -var VisibleAutoScrollEventLog = (0, _reactRedux.connect)(function mapStateToProps(state, ownProps) { - return { filter: state.eventLog.visibilityFilter }; -})(AutoScrollEventLog); - -var EventLog = _react2.default.createClass({ - displayName: "EventLog", - close: function close() { - var d = {}; - d[_actions.Query.SHOW_EVENTLOG] = undefined; - this.props.updateLocation(undefined, d); - }, - render: function render() { - return _react2.default.createElement( +var EventLog = function EventLog(_ref) { + var close = _ref.close; + return _react2.default.createElement( + "div", + { className: "eventlog" }, + _react2.default.createElement( "div", - { className: "eventlog" }, + null, + "Eventlog", _react2.default.createElement( "div", - null, - "Eventlog", - _react2.default.createElement( - "div", - { className: "pull-right" }, - _react2.default.createElement(ToggleEventLogFilter, { name: "debug" }), - _react2.default.createElement(ToggleEventLogFilter, { name: "info" }), - _react2.default.createElement(ToggleEventLogFilter, { name: "web" }), - _react2.default.createElement("i", { onClick: this.close, className: "fa fa-close" }) - ) - ), - _react2.default.createElement(VisibleAutoScrollEventLog, null) - ); - } -}); + { className: "pull-right" }, + _react2.default.createElement(ToggleFilter, { text: "debug" }), + _react2.default.createElement(ToggleFilter, { text: "info" }), + _react2.default.createElement(ToggleFilter, { text: "web" }), + _react2.default.createElement("i", { onClick: close, className: "fa fa-close" }) + ) + ), + _react2.default.createElement(EventLogContentsContainer, null) + ); +}; -exports.default = EventLog; +EventLog.propTypes = { + close: _react2.default.PropTypes.func.isRequired +}; -},{"../actions.js":2,"../reduxActions":27,"../store/view.js":29,"./helpers/AutoScroll":16,"./helpers/VirtualScroll":17,"react":"react","react-dom":"react-dom","react-redux":"react-redux","shallowequal":"shallowequal"}],7:[function(require,module,exports){ +var EventLogContainer = (0, _reactRedux.connect)(undefined, function (dispatch) { + return { + close: function close() { + return dispatch((0, _eventLog.toggleEventLogVisibility)()); + } + }; +})(EventLog); + +exports.default = EventLogContainer; + +},{"../ducks/eventLog":23,"../store/view.js":28,"./common":4,"./helpers/AutoScroll":16,"./helpers/VirtualScroll":17,"react":"react","react-dom":"react-dom","react-redux":"react-redux","shallowequal":"shallowequal"}],7:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -1497,7 +1475,7 @@ var all_columns = [TLSColumn, IconColumn, PathColumn, MethodColumn, StatusColumn exports.default = all_columns; -},{"../flow/utils.js":24,"../utils.js":30,"react":"react"}],8:[function(require,module,exports){ +},{"../flow/utils.js":26,"../utils.js":29,"react":"react"}],8:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -1789,7 +1767,7 @@ FlowTable.defaultProps = { }; exports.default = (0, _AutoScroll2.default)(FlowTable); -},{"../utils.js":30,"./flowtable-columns.js":7,"./helpers/AutoScroll":16,"./helpers/VirtualScroll":17,"classnames":"classnames","lodash":"lodash","react":"react","react-dom":"react-dom","shallowequal":"shallowequal"}],9:[function(require,module,exports){ +},{"../utils.js":29,"./flowtable-columns.js":7,"./helpers/AutoScroll":16,"./helpers/VirtualScroll":17,"classnames":"classnames","lodash":"lodash","react":"react","react-dom":"react-dom","shallowequal":"shallowequal"}],9:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -2143,7 +2121,7 @@ var ContentView = _react2.default.createClass({ exports.default = ContentView; -},{"../../flow/utils.js":24,"../../utils.js":30,"lodash":"lodash","react":"react"}],10:[function(require,module,exports){ +},{"../../flow/utils.js":26,"../../utils.js":29,"lodash":"lodash","react":"react"}],10:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -2411,7 +2389,7 @@ var Details = _react2.default.createClass({ exports.default = Details; -},{"../../utils.js":30,"lodash":"lodash","react":"react"}],11:[function(require,module,exports){ +},{"../../utils.js":29,"lodash":"lodash","react":"react"}],11:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -2905,7 +2883,7 @@ var Error = exports.Error = _react2.default.createClass({ } }); -},{"../../actions.js":2,"../../flow/utils.js":24,"../../utils.js":30,"../editor.js":5,"./contentview.js":9,"lodash":"lodash","react":"react","react-dom":"react-dom"}],13:[function(require,module,exports){ +},{"../../actions.js":2,"../../flow/utils.js":26,"../../utils.js":29,"../editor.js":5,"./contentview.js":9,"lodash":"lodash","react":"react","react-dom":"react-dom"}],13:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -3088,7 +3066,7 @@ function Footer(_ref) { ); } -},{"../utils.js":30,"./common.js":4,"react":"react"}],15:[function(require,module,exports){ +},{"../utils.js":29,"./common.js":4,"react":"react"}],15:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -3108,6 +3086,8 @@ var _jquery = require("jquery"); var _jquery2 = _interopRequireDefault(_jquery); +var _reactRedux = require("react-redux"); + var _filt = require("../filt/filt.js"); var _filt2 = _interopRequireDefault(_filt); @@ -3118,6 +3098,8 @@ var _common = require("./common.js"); var _actions = require("../actions.js"); +var _eventlog = require("./eventlog"); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var FilterDocs = _react2.default.createClass({ @@ -3371,29 +3353,14 @@ var ViewMenu = _react2.default.createClass({ title: "View", route: "flows" }, - toggleEventLog: function toggleEventLog() { - var d = {}; - if (this.props.query[_actions.Query.SHOW_EVENTLOG]) { - d[_actions.Query.SHOW_EVENTLOG] = undefined; - } else { - d[_actions.Query.SHOW_EVENTLOG] = "t"; // any non-false value will do it, keep it short - } - - this.props.updateLocation(undefined, d); - console.log('toggleevent'); - }, render: function render() { - var showEventLog = this.props.query[_actions.Query.SHOW_EVENTLOG]; return _react2.default.createElement( "div", null, _react2.default.createElement( "div", { className: "menu-row" }, - _react2.default.createElement(_common.ToggleButton, { - checked: showEventLog, - name: "Show Eventlog", - onToggleChanged: this.toggleEventLog }) + _react2.default.createElement(_eventlog.ToggleEventLog, { text: "Show Event Log" }) ), _react2.default.createElement("div", { className: "clearfix" }) ); @@ -3642,7 +3609,7 @@ var Header = exports.Header = _react2.default.createClass({ } }); -},{"../actions.js":2,"../filt/filt.js":23,"../utils.js":30,"./common.js":4,"jquery":"jquery","react":"react","react-dom":"react-dom"}],16:[function(require,module,exports){ +},{"../actions.js":2,"../filt/filt.js":25,"../utils.js":29,"./common.js":4,"./eventlog":6,"jquery":"jquery","react":"react","react-dom":"react-dom","react-redux":"react-redux"}],16:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -4058,7 +4025,7 @@ var MainView = _react2.default.createClass({ exports.default = MainView; -},{"../actions.js":2,"../filt/filt.js":23,"../store/view.js":29,"../utils.js":30,"./common.js":4,"./flowtable.js":8,"./flowview/index.js":11,"react":"react"}],19:[function(require,module,exports){ +},{"../actions.js":2,"../filt/filt.js":25,"../store/view.js":28,"../utils.js":29,"./common.js":4,"./flowtable.js":8,"./flowview/index.js":11,"react":"react"}],19:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -4194,7 +4161,7 @@ var Prompt = _react2.default.createClass({ exports.default = Prompt; -},{"../utils.js":30,"lodash":"lodash","react":"react","react-dom":"react-dom"}],20:[function(require,module,exports){ +},{"../utils.js":29,"lodash":"lodash","react":"react","react-dom":"react-dom"}],20:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -4214,6 +4181,10 @@ var _lodash = require("lodash"); var _lodash2 = _interopRequireDefault(_lodash); +var _reactRedux = require("react-redux"); + +var _reactRouter = require("react-router"); + var _common = require("./common.js"); var _mainview = require("./mainview.js"); @@ -4232,12 +4203,8 @@ var _eventlog2 = _interopRequireDefault(_eventlog); var _store = require("../store/store.js"); -var _actions = require("../actions.js"); - var _utils = require("../utils.js"); -var _reactRouter = require("react-router"); - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } //TODO: Move out of here, just a stub. @@ -4355,8 +4322,8 @@ var ProxyAppMain = _react2.default.createClass({ render: function render() { var query = this.getQuery(); var eventlog; - if (this.props.location.query[_actions.Query.SHOW_EVENTLOG]) { - eventlog = [_react2.default.createElement(_common.Splitter, { key: "splitter", axis: "y" }), _react2.default.createElement(_eventlog2.default, { key: "eventlog", updateLocation: this.updateLocation })]; + if (this.props.showEventLog) { + eventlog = [_react2.default.createElement(_common.Splitter, { key: "splitter", axis: "y" }), _react2.default.createElement(_eventlog2.default, { key: "eventlog" })]; } else { eventlog = null; } @@ -4371,20 +4338,26 @@ var ProxyAppMain = _react2.default.createClass({ } }); +var AppContainer = (0, _reactRedux.connect)(function (state) { + return { + showEventLog: state.eventLog.visible + }; +})(ProxyAppMain); + var App = exports.App = _react2.default.createElement( _reactRouter.Router, { history: _reactRouter.hashHistory }, _react2.default.createElement(_reactRouter.Redirect, { from: "/", to: "/flows" }), _react2.default.createElement( _reactRouter.Route, - { path: "/", component: ProxyAppMain }, + { path: "/", component: AppContainer }, _react2.default.createElement(_reactRouter.Route, { path: "flows", component: _mainview2.default }), _react2.default.createElement(_reactRouter.Route, { path: "flows/:flowId/:detailTab", component: _mainview2.default }), _react2.default.createElement(_reactRouter.Route, { path: "reports", component: Reports }) ) ); -},{"../actions.js":2,"../store/store.js":28,"../utils.js":30,"./common.js":4,"./eventlog.js":6,"./footer.js":14,"./header.js":15,"./mainview.js":18,"lodash":"lodash","react":"react","react-dom":"react-dom","react-router":"react-router"}],21:[function(require,module,exports){ +},{"../store/store.js":27,"../utils.js":29,"./common.js":4,"./eventlog.js":6,"./footer.js":14,"./header.js":15,"./mainview.js":18,"lodash":"lodash","react":"react","react-dom":"react-dom","react-redux":"react-redux","react-router":"react-router"}],21:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -4451,6 +4424,78 @@ AppDispatcher.dispatchServerAction = function (action) { }; },{"flux":"flux"}],23:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +exports.default = reducer; +exports.toggleEventLogFilter = toggleEventLogFilter; +exports.toggleEventLogVisibility = toggleEventLogVisibility; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var TOGGLE_FILTER = 'TOGGLE_EVENTLOG_FILTER'; +var TOGGLE_VISIBILITY = 'TOGGLE_EVENTLOG_VISIBILITY'; + +var defaultState = { + visible: false, + filter: { + "debug": false, + "info": true, + "web": true + } +}; +function reducer() { + var state = arguments.length <= 0 || arguments[0] === undefined ? defaultState : arguments[0]; + var action = arguments[1]; + + switch (action.type) { + case TOGGLE_FILTER: + return _extends({}, state, { + filter: _extends({}, state.filter, _defineProperty({}, action.filter, !state.filter[action.filter])) + }); + case TOGGLE_VISIBILITY: + return _extends({}, state, { + visible: !state.visible + }); + default: + return state; + } +} + +function toggleEventLogFilter(filter) { + return { type: TOGGLE_FILTER, filter: filter }; +} +function toggleEventLogVisibility() { + return { type: TOGGLE_VISIBILITY }; +} + +},{}],24:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _redux = require('redux'); + +var _eventLog = require('./eventLog.js'); + +var _eventLog2 = _interopRequireDefault(_eventLog); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var rootReducer = (0, _redux.combineReducers)({ + eventLog: _eventLog2.default +}); + +exports.default = rootReducer; + +},{"./eventLog.js":23,"redux":"redux"}],25:[function(require,module,exports){ "use strict"; module.exports = function () { @@ -6354,7 +6399,7 @@ module.exports = function () { }; }(); -},{"../flow/utils.js":24}],24:[function(require,module,exports){ +},{"../flow/utils.js":26}],26:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -6488,96 +6533,7 @@ var parseHttpVersion = exports.parseHttpVersion = function parseHttpVersion(http }); }; -},{"jquery":"jquery","lodash":"lodash"}],25:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - -var _redux = require("redux"); - -var _reduxActions = require("../reduxActions"); - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -var defaultVisibility = { - "debug": false, - "info": true, - "web": true -}; - -var visibilityFilter = function visibilityFilter() { - var state = arguments.length <= 0 || arguments[0] === undefined ? defaultVisibility : arguments[0]; - var action = arguments[1]; - - switch (action.type) { - case _reduxActions.TOGGLE_EVENTLOG_FILTER: - return _extends({}, state, _defineProperty({}, action.filter, !state[action.filter])); - default: - return state; - } -}; - -var entries = function entries() { - var state = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; - var action = arguments[1]; - - return state; -}; - -var eventLog = (0, _redux.combineReducers)({ - visibilityFilter: visibilityFilter, - entries: entries -}); - -exports.default = eventLog; - -},{"../reduxActions":27,"redux":"redux"}],26:[function(require,module,exports){ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _redux = require('redux'); - -var _eventlog = require('./eventlog'); - -var _eventlog2 = _interopRequireDefault(_eventlog); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var mitmproxyApp = (0, _redux.combineReducers)({ - eventLog: _eventlog2.default -}); - -exports.default = mitmproxyApp; - -},{"./eventlog":25,"redux":"redux"}],27:[function(require,module,exports){ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.toggleEventLogFilter = toggleEventLogFilter; -var TOGGLE_EVENTLOG_FILTER = exports.TOGGLE_EVENTLOG_FILTER = 'TOGGLE_EVENTLOG_FILTER'; -var HIDE_EVENTLOG = exports.HIDE_EVENTLOG = 'HIDE_EVENTLOG'; -var SHOW_EVENTLOG = exports.SHOW_EVENTLOG = 'SHOW_EVENTLOG'; - -var EventLogFilters = exports.EventLogFilters = { - DEBUG: 'debug', - INFO: 'info', - WEB: 'web' -}; - -function toggleEventLogFilter(filter) { - return { type: TOGGLE_EVENTLOG_FILTER, filter: filter }; -} - -},{}],28:[function(require,module,exports){ +},{"jquery":"jquery","lodash":"lodash"}],27:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -6764,7 +6720,7 @@ _lodash2.default.extend(EventLogStore.prototype, LiveListStore.prototype, { } }); -},{"../actions.js":2,"../dispatcher.js":22,"events":1,"jquery":"jquery","lodash":"lodash"}],29:[function(require,module,exports){ +},{"../actions.js":2,"../dispatcher.js":22,"events":1,"jquery":"jquery","lodash":"lodash"}],28:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -6894,7 +6850,7 @@ _lodash2.default.extend(StoreView.prototype, _events.EventEmitter.prototype, { } }); -},{"../utils.js":30,"events":1,"lodash":"lodash"}],30:[function(require,module,exports){ +},{"../utils.js":29,"events":1,"lodash":"lodash"}],29:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { diff --git a/web/src/css/eventlog.less b/web/src/css/eventlog.less index 26dea3ccd..908312cd5 100644 --- a/web/src/css/eventlog.less +++ b/web/src/css/eventlog.less @@ -33,6 +33,14 @@ } } + .btn-toggle { + margin-top: -2px; + margin-left: 3px; + padding: 2px 2px; + font-size: 10px; + line-height: 10px; + border-radius: 2px; + } .label { cursor: pointer; vertical-align: middle; diff --git a/web/src/css/header.less b/web/src/css/header.less index b1bd9c041..4813b9333 100644 --- a/web/src/css/header.less +++ b/web/src/css/header.less @@ -32,20 +32,3 @@ header { overflow-y: auto; } } - -.menu .toggle-btn { - .make-xs-column(4, @menu-row-gutter-width); - .make-sm-column(3, @menu-row-gutter-width); - .make-lg-column(2, @menu-row-gutter-width); - margin-bottom:5px; -} - -.menu .toggle-btn .btn { - width: 100%; -} - -.menu .toggle-input-btn { - .make-sm-column(6, @menu-row-gutter-width); - .make-lg-column(4, @menu-row-gutter-width); - margin-bottom:5px; -} \ No newline at end of file diff --git a/web/src/js/app.js b/web/src/js/app.js index 308976868..5b5d1fc8a 100644 --- a/web/src/js/app.js +++ b/web/src/js/app.js @@ -2,14 +2,14 @@ import React from "react" import {render} from 'react-dom' import {createStore} from 'redux' import {Provider} from 'react-redux' -import mitmproxyApp from './reducers' import $ from "jquery" import Connection from "./connection" import {App} from "./components/proxyapp.js" import {EventLogActions} from "./actions.js" +import rootReducer from './ducks/index'; -let store = createStore(mitmproxyApp); +let store = createStore(rootReducer); $(function () { window.ws = new Connection("/updates"); diff --git a/web/src/js/components/common.js b/web/src/js/components/common.js index 87c34ffc1..3496f1de9 100644 --- a/web/src/js/components/common.js +++ b/web/src/js/components/common.js @@ -108,18 +108,17 @@ export var Splitter = React.createClass({ } }); -export const ToggleButton = (props) => -
-
-  {props.name} -
+export const ToggleButton = ({checked, onToggle, text}) => +
+ +   + {text}
; ToggleButton.propTypes = { - name: React.PropTypes.string.isRequired, - onToggleChanged: React.PropTypes.func.isRequired + checked: React.PropTypes.bool.isRequired, + onToggle: React.PropTypes.func.isRequired, + text: React.PropTypes.string.isRequired }; export class ToggleInputButton extends React.Component { diff --git a/web/src/js/components/eventlog.js b/web/src/js/components/eventlog.js index 687c5265d..a2e6a0c1d 100644 --- a/web/src/js/components/eventlog.js +++ b/web/src/js/components/eventlog.js @@ -1,12 +1,12 @@ import React from "react" import ReactDOM from "react-dom" -import { connect } from 'react-redux' +import {connect} from 'react-redux' import shallowEqual from "shallowequal" -import {Query} from "../actions.js" -import {toggleEventLogFilter} from "../reduxActions" +import {toggleEventLogFilter, toggleEventLogVisibility} from "../ducks/eventLog" import AutoScroll from "./helpers/AutoScroll"; import {calcVScroll} from "./helpers/VirtualScroll" import {StoreView} from "../store/view.js" +import {ToggleButton} from "./common"; class EventLogContents extends React.Component { @@ -27,7 +27,7 @@ class EventLogContents extends React.Component { ); this.heights = {}; - this.state = { entries: this.view.list, vScroll: calcVScroll() }; + this.state = {entries: this.view.list, vScroll: calcVScroll()}; this.onChange = this.onChange.bind(this); this.onViewportUpdate = this.onViewportUpdate.bind(this); @@ -71,12 +71,12 @@ class EventLogContents extends React.Component { }); if (!shallowEqual(this.state.vScroll, vScroll)) { - this.setState({ vScroll }); + this.setState({vScroll}); } } onChange() { - this.setState({ entries: this.view.list }); + this.setState({entries: this.view.list}); } setHeight(id, ref) { @@ -90,7 +90,7 @@ class EventLogContents extends React.Component { } getIcon(level) { - return { web: "html5", debug: "bug" }[level] || "info"; + return {web: "html5", debug: "bug"}[level] || "info"; } render() { @@ -112,87 +112,59 @@ class EventLogContents extends React.Component { } } -ToggleFilter.propTypes = { - name: React.PropTypes.string.isRequired, - toggleLevel: React.PropTypes.func.isRequired, - active: React.PropTypes.bool, -}; - -function ToggleFilter ({ name, active, toggleLevel }) { - let className = "label "; - if (active) { - className += "label-primary"; - } else { - className += "label-default"; - } - - function onClick(event) { - event.preventDefault(); - toggleLevel(); - } - - return ( - - {name} - - ); -} - -const mapStateToProps = (state, ownProps) => { - return { - active: state.eventLog.visibilityFilter[ownProps.name] - } -}; - -const mapDispatchToProps = (dispatch, ownProps) => { - return { - toggleLevel: () => { - dispatch(toggleEventLogFilter(ownProps.name)) - } - } -}; - -const ToggleEventLogFilter = connect( - mapStateToProps, - mapDispatchToProps -)(ToggleFilter); +EventLogContents = AutoScroll(EventLogContents); -const AutoScrollEventLog = AutoScroll(EventLogContents); +const EventLogContentsContainer = connect( + state => ({ + filter: state.eventLog.filter + }) +)(EventLogContents); -const VisibleAutoScrollEventLog = connect( - function mapStateToProps(state, ownProps) { - return {filter: state.eventLog.visibilityFilter} - })(AutoScrollEventLog); +export const ToggleEventLog = connect( + state => ({ + checked: state.eventLog.visible + }), + dispatch => ({ + onToggle: () => dispatch(toggleEventLogVisibility()) + }) +)(ToggleButton); -var EventLog = React.createClass({ - close() { - var d = {}; - d[Query.SHOW_EVENTLOG] = undefined; - this.props.updateLocation(undefined, d); - }, - render() { - return ( -
-
- Eventlog -
- - - - -
+const ToggleFilter = connect( + (state, ownProps) => ({ + checked: state.eventLog.filter[ownProps.text] + }), + (dispatch, ownProps) => ({ + onToggle: () => dispatch(toggleEventLogFilter(ownProps.text)) + }) +)(ToggleButton); -
- + +const EventLog = ({close}) => +
+
+ Eventlog +
+ + + +
- ); - } -}); +
+ +
; -export default EventLog; +EventLog.propTypes = { + close: React.PropTypes.func.isRequired +}; + +const EventLogContainer = connect( + undefined, + dispatch => ({ + close: () => dispatch(toggleEventLogVisibility()) + }) +)(EventLog); + +export default EventLogContainer; diff --git a/web/src/js/components/header.js b/web/src/js/components/header.js index 643659c37..76c4744a9 100644 --- a/web/src/js/components/header.js +++ b/web/src/js/components/header.js @@ -1,6 +1,7 @@ import React from "react"; import ReactDOM from 'react-dom'; import $ from "jquery"; +import {connect} from 'react-redux' import Filt from "../filt/filt.js"; import {Key} from "../utils.js"; @@ -8,6 +9,7 @@ import {ToggleInputButton, ToggleButton} from "./common.js"; import {SettingsActions, FlowActions} from "../actions.js"; import {Query} from "../actions.js"; import {SettingsState} from "./common.js"; +import {ToggleEventLog} from "./eventlog" var FilterDocs = React.createClass({ statics: { @@ -224,26 +226,11 @@ var ViewMenu = React.createClass({ title: "View", route: "flows" }, - toggleEventLog: function () { - var d = {}; - if (this.props.query[Query.SHOW_EVENTLOG]) { - d[Query.SHOW_EVENTLOG] = undefined; - } else { - d[Query.SHOW_EVENTLOG] = "t"; // any non-false value will do it, keep it short - } - - this.props.updateLocation(undefined, d); - console.log('toggleevent'); - }, render: function () { - var showEventLog = this.props.query[Query.SHOW_EVENTLOG]; return (
- +
diff --git a/web/src/js/components/proxyapp.js b/web/src/js/components/proxyapp.js index 4c790d3dc..99b64580b 100644 --- a/web/src/js/components/proxyapp.js +++ b/web/src/js/components/proxyapp.js @@ -1,6 +1,8 @@ import React from "react"; import ReactDOM from "react-dom"; import _ from "lodash"; +import {connect} from 'react-redux' +import { Route, Router as ReactRouter, hashHistory, Redirect} from "react-router" import {Splitter} from "./common.js" import MainView from "./mainview.js"; @@ -8,7 +10,6 @@ import Footer from "./footer.js"; import {Header, MainMenu} from "./header.js"; import EventLog from "./eventlog.js" import {EventLogStore, FlowStore, SettingsStore} from "../store/store.js"; -import {Query} from "../actions.js"; import {Key} from "../utils.js"; @@ -120,10 +121,10 @@ var ProxyAppMain = React.createClass({ render: function () { var query = this.getQuery(); var eventlog; - if (this.props.location.query[Query.SHOW_EVENTLOG]) { + if (this.props.showEventLog) { eventlog = [ , - + ]; } else { eventlog = null; @@ -142,13 +143,17 @@ var ProxyAppMain = React.createClass({ } }); +const AppContainer = connect( + state => ({ + showEventLog: state.eventLog.visible + }) +)(ProxyAppMain); -import { Route, Router as ReactRouter, hashHistory, Redirect} from "react-router"; export var App = ( - + diff --git a/web/src/js/ducks/README.md b/web/src/js/ducks/README.md new file mode 100644 index 000000000..9d005f35f --- /dev/null +++ b/web/src/js/ducks/README.md @@ -0,0 +1 @@ +https://github.com/erikras/ducks-modular-redux \ No newline at end of file diff --git a/web/src/js/ducks/eventLog.js b/web/src/js/ducks/eventLog.js new file mode 100644 index 000000000..5bae252a0 --- /dev/null +++ b/web/src/js/ducks/eventLog.js @@ -0,0 +1,39 @@ +const TOGGLE_FILTER = 'TOGGLE_EVENTLOG_FILTER' +const TOGGLE_VISIBILITY = 'TOGGLE_EVENTLOG_VISIBILITY' + + +const defaultState = { + visible: false, + filter: { + "debug": false, + "info": true, + "web": true + } +} +export default function reducer(state = defaultState, action) { + switch (action.type) { + case TOGGLE_FILTER: + return { + ...state, + filter: { + ...state.filter, + [action.filter]: !state.filter[action.filter] + } + } + case TOGGLE_VISIBILITY: + return { + ...state, + visible: !state.visible + } + default: + return state + } +} + + +export function toggleEventLogFilter(filter) { + return {type: TOGGLE_FILTER, filter} +} +export function toggleEventLogVisibility() { + return {type: TOGGLE_VISIBILITY} +} \ No newline at end of file diff --git a/web/src/js/ducks/index.js b/web/src/js/ducks/index.js new file mode 100644 index 000000000..c82d42bb1 --- /dev/null +++ b/web/src/js/ducks/index.js @@ -0,0 +1,8 @@ +import {combineReducers} from 'redux' +import eventLog from './eventLog.js'; + +const rootReducer = combineReducers({ + eventLog +}) + +export default rootReducer \ No newline at end of file diff --git a/web/src/js/reducers/eventLog.js b/web/src/js/reducers/eventLog.js deleted file mode 100644 index 9d078c140..000000000 --- a/web/src/js/reducers/eventLog.js +++ /dev/null @@ -1,31 +0,0 @@ -import {combineReducers} from 'redux' -import {TOGGLE_EVENTLOG_FILTER} from "../reduxActions" - -const defaultVisibility = { - "debug": false, - "info": true, - "web": true -}; - -const visibilityFilter = (state = defaultVisibility, action) => { - switch (action.type) { - case TOGGLE_EVENTLOG_FILTER: - return { - ...state, - [action.filter]: !state[action.filter] - }; - default: - return state; - } -}; - -const entries = (state = [], action) => { - return state; -}; - -const eventLog = combineReducers({ - visibilityFilter, - entries -}); - -export default eventLog diff --git a/web/src/js/reduxActions.js b/web/src/js/reduxActions.js deleted file mode 100644 index c5902f80d..000000000 --- a/web/src/js/reduxActions.js +++ /dev/null @@ -1,13 +0,0 @@ -export const TOGGLE_EVENTLOG_FILTER = 'TOGGLE_EVENTLOG_FILTER'; -export const HIDE_EVENTLOG = 'HIDE_EVENTLOG'; -export const SHOW_EVENTLOG = 'SHOW_EVENTLOG'; - -export const EventLogFilters = { - DEBUG: 'debug', - INFO: 'info', - WEB: 'web' -}; - -export function toggleEventLogFilter(filter) { - return {type: TOGGLE_EVENTLOG_FILTER, filter} -} From 6a91ab166f4479eb50846fed184aa197dd018bfe Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Thu, 2 Jun 2016 19:29:03 -0700 Subject: [PATCH 5/8] remove reducers directory --- web/src/js/reducers/index.js | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 web/src/js/reducers/index.js diff --git a/web/src/js/reducers/index.js b/web/src/js/reducers/index.js deleted file mode 100644 index a8b2edbf7..000000000 --- a/web/src/js/reducers/index.js +++ /dev/null @@ -1,8 +0,0 @@ -import {combineReducers} from 'redux'; -import eventLog from './eventlog' - -const mitmproxyApp = combineReducers({ - eventLog -}); - -export default mitmproxyApp From 7c63aa3708a09b997575cb85cb6dfaaa41082fab Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Thu, 2 Jun 2016 21:12:59 -0700 Subject: [PATCH 6/8] web: reduxify WebSocket --- mitmproxy/web/static/app.js | 176 ++++++++++++++++++++++++-------- web/src/js/app.js | 10 +- web/src/js/components/header.js | 24 ++--- web/src/js/connection.js | 16 +-- web/src/js/ducks/flows.js | 15 +++ web/src/js/ducks/index.js | 8 +- web/src/js/ducks/websocket.js | 34 ++++++ 7 files changed, 212 insertions(+), 71 deletions(-) create mode 100644 web/src/js/ducks/flows.js create mode 100644 web/src/js/ducks/websocket.js diff --git a/mitmproxy/web/static/app.js b/mitmproxy/web/static/app.js index b7e0f24e6..d97a567d4 100644 --- a/mitmproxy/web/static/app.js +++ b/mitmproxy/web/static/app.js @@ -455,10 +455,6 @@ var _redux = require('redux'); var _reactRedux = require('react-redux'); -var _jquery = require('jquery'); - -var _jquery2 = _interopRequireDefault(_jquery); - var _connection = require('./connection'); var _connection2 = _interopRequireDefault(_connection); @@ -475,8 +471,8 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de var store = (0, _redux.createStore)(_index2.default); -(0, _jquery2.default)(function () { - window.ws = new _connection2.default("/updates"); +document.addEventListener('DOMContentLoaded', function () { + window.ws = new _connection2.default("/updates", store.dispatch); window.onerror = function (msg) { _actions.EventLogActions.add_event(msg); @@ -489,7 +485,7 @@ var store = (0, _redux.createStore)(_index2.default); ), document.getElementById("mitmproxy")); }); -},{"./actions.js":2,"./components/proxyapp.js":20,"./connection":21,"./ducks/index":24,"jquery":"jquery","react":"react","react-dom":"react-dom","react-redux":"react-redux","redux":"redux"}],4:[function(require,module,exports){ +},{"./actions.js":2,"./components/proxyapp.js":20,"./connection":21,"./ducks/index":25,"react":"react","react-dom":"react-dom","react-redux":"react-redux","redux":"redux"}],4:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -708,7 +704,7 @@ ToggleInputButton.propTypes = { onToggleChanged: _react2.default.PropTypes.func.isRequired }; -},{"../utils.js":29,"lodash":"lodash","react":"react","react-dom":"react-dom"}],5:[function(require,module,exports){ +},{"../utils.js":31,"lodash":"lodash","react":"react","react-dom":"react-dom"}],5:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -966,7 +962,7 @@ var ValueEditor = exports.ValueEditor = _react2.default.createClass({ } }); -},{"../utils.js":29,"react":"react","react-dom":"react-dom"}],6:[function(require,module,exports){ +},{"../utils.js":31,"react":"react","react-dom":"react-dom"}],6:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -1206,7 +1202,7 @@ var EventLogContainer = (0, _reactRedux.connect)(undefined, function (dispatch) exports.default = EventLogContainer; -},{"../ducks/eventLog":23,"../store/view.js":28,"./common":4,"./helpers/AutoScroll":16,"./helpers/VirtualScroll":17,"react":"react","react-dom":"react-dom","react-redux":"react-redux","shallowequal":"shallowequal"}],7:[function(require,module,exports){ +},{"../ducks/eventLog":23,"../store/view.js":30,"./common":4,"./helpers/AutoScroll":16,"./helpers/VirtualScroll":17,"react":"react","react-dom":"react-dom","react-redux":"react-redux","shallowequal":"shallowequal"}],7:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -1475,7 +1471,7 @@ var all_columns = [TLSColumn, IconColumn, PathColumn, MethodColumn, StatusColumn exports.default = all_columns; -},{"../flow/utils.js":26,"../utils.js":29,"react":"react"}],8:[function(require,module,exports){ +},{"../flow/utils.js":28,"../utils.js":31,"react":"react"}],8:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -1767,7 +1763,7 @@ FlowTable.defaultProps = { }; exports.default = (0, _AutoScroll2.default)(FlowTable); -},{"../utils.js":29,"./flowtable-columns.js":7,"./helpers/AutoScroll":16,"./helpers/VirtualScroll":17,"classnames":"classnames","lodash":"lodash","react":"react","react-dom":"react-dom","shallowequal":"shallowequal"}],9:[function(require,module,exports){ +},{"../utils.js":31,"./flowtable-columns.js":7,"./helpers/AutoScroll":16,"./helpers/VirtualScroll":17,"classnames":"classnames","lodash":"lodash","react":"react","react-dom":"react-dom","shallowequal":"shallowequal"}],9:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -2121,7 +2117,7 @@ var ContentView = _react2.default.createClass({ exports.default = ContentView; -},{"../../flow/utils.js":26,"../../utils.js":29,"lodash":"lodash","react":"react"}],10:[function(require,module,exports){ +},{"../../flow/utils.js":28,"../../utils.js":31,"lodash":"lodash","react":"react"}],10:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -2389,7 +2385,7 @@ var Details = _react2.default.createClass({ exports.default = Details; -},{"../../utils.js":29,"lodash":"lodash","react":"react"}],11:[function(require,module,exports){ +},{"../../utils.js":31,"lodash":"lodash","react":"react"}],11:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -2883,7 +2879,7 @@ var Error = exports.Error = _react2.default.createClass({ } }); -},{"../../actions.js":2,"../../flow/utils.js":26,"../../utils.js":29,"../editor.js":5,"./contentview.js":9,"lodash":"lodash","react":"react","react-dom":"react-dom"}],13:[function(require,module,exports){ +},{"../../actions.js":2,"../../flow/utils.js":28,"../../utils.js":31,"../editor.js":5,"./contentview.js":9,"lodash":"lodash","react":"react","react-dom":"react-dom"}],13:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -3066,7 +3062,7 @@ function Footer(_ref) { ); } -},{"../utils.js":29,"./common.js":4,"react":"react"}],15:[function(require,module,exports){ +},{"../utils.js":31,"./common.js":4,"react":"react"}],15:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -3387,39 +3383,39 @@ var OptionMenu = exports.OptionMenu = function OptionMenu(props) { _react2.default.createElement( "div", { className: "menu-row" }, - _react2.default.createElement(_common.ToggleButton, { name: "showhost", + _react2.default.createElement(_common.ToggleButton, { text: "showhost", checked: showhost, - onToggleChanged: function onToggleChanged() { + onToggle: function onToggle() { return _actions.SettingsActions.update({ showhost: !showhost }); } }), - _react2.default.createElement(_common.ToggleButton, { name: "no_upstream_cert", + _react2.default.createElement(_common.ToggleButton, { text: "no_upstream_cert", checked: no_upstream_cert, - onToggleChanged: function onToggleChanged() { + onToggle: function onToggle() { return _actions.SettingsActions.update({ no_upstream_cert: !no_upstream_cert }); } }), - _react2.default.createElement(_common.ToggleButton, { name: "rawtcp", + _react2.default.createElement(_common.ToggleButton, { text: "rawtcp", checked: rawtcp, - onToggleChanged: function onToggleChanged() { + onToggle: function onToggle() { return _actions.SettingsActions.update({ rawtcp: !rawtcp }); } }), - _react2.default.createElement(_common.ToggleButton, { name: "http2", + _react2.default.createElement(_common.ToggleButton, { text: "http2", checked: http2, - onToggleChanged: function onToggleChanged() { + onToggle: function onToggle() { return _actions.SettingsActions.update({ http2: !http2 }); } }), - _react2.default.createElement(_common.ToggleButton, { name: "anticache", + _react2.default.createElement(_common.ToggleButton, { text: "anticache", checked: anticache, - onToggleChanged: function onToggleChanged() { + onToggle: function onToggle() { return _actions.SettingsActions.update({ anticache: !anticache }); } }), - _react2.default.createElement(_common.ToggleButton, { name: "anticomp", + _react2.default.createElement(_common.ToggleButton, { text: "anticomp", checked: anticomp, - onToggleChanged: function onToggleChanged() { + onToggle: function onToggle() { return _actions.SettingsActions.update({ anticomp: !anticomp }); } }), @@ -3609,7 +3605,7 @@ var Header = exports.Header = _react2.default.createClass({ } }); -},{"../actions.js":2,"../filt/filt.js":25,"../utils.js":29,"./common.js":4,"./eventlog":6,"jquery":"jquery","react":"react","react-dom":"react-dom","react-redux":"react-redux"}],16:[function(require,module,exports){ +},{"../actions.js":2,"../filt/filt.js":27,"../utils.js":31,"./common.js":4,"./eventlog":6,"jquery":"jquery","react":"react","react-dom":"react-dom","react-redux":"react-redux"}],16:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -4025,7 +4021,7 @@ var MainView = _react2.default.createClass({ exports.default = MainView; -},{"../actions.js":2,"../filt/filt.js":25,"../store/view.js":28,"../utils.js":29,"./common.js":4,"./flowtable.js":8,"./flowview/index.js":11,"react":"react"}],19:[function(require,module,exports){ +},{"../actions.js":2,"../filt/filt.js":27,"../store/view.js":30,"../utils.js":31,"./common.js":4,"./flowtable.js":8,"./flowview/index.js":11,"react":"react"}],19:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -4161,7 +4157,7 @@ var Prompt = _react2.default.createClass({ exports.default = Prompt; -},{"../utils.js":29,"lodash":"lodash","react":"react","react-dom":"react-dom"}],20:[function(require,module,exports){ +},{"../utils.js":31,"lodash":"lodash","react":"react","react-dom":"react-dom"}],20:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -4357,29 +4353,38 @@ var App = exports.App = _react2.default.createElement( ) ); -},{"../store/store.js":27,"../utils.js":29,"./common.js":4,"./eventlog.js":6,"./footer.js":14,"./header.js":15,"./mainview.js":18,"lodash":"lodash","react":"react","react-dom":"react-dom","react-redux":"react-redux","react-router":"react-router"}],21:[function(require,module,exports){ +},{"../store/store.js":29,"../utils.js":31,"./common.js":4,"./eventlog.js":6,"./footer.js":14,"./header.js":15,"./mainview.js":18,"lodash":"lodash","react":"react","react-dom":"react-dom","react-redux":"react-redux","react-router":"react-router"}],21:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = Connection; var _actions = require("./actions.js"); var _dispatcher = require("./dispatcher.js"); -function Connection(url) { +var _websocket = require("./ducks/websocket"); + +var websocketActions = _interopRequireWildcard(_websocket); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function Connection(url, dispatch) { if (url[0] === "/") { url = location.origin.replace("http", "ws") + url; } var ws = new WebSocket(url); ws.onopen = function () { + dispatch(websocketActions.connected()); _actions.ConnectionActions.open(); }; - ws.onmessage = function (message) { - var m = JSON.parse(message.data); - _dispatcher.AppDispatcher.dispatchServerAction(m); + ws.onmessage = function (m) { + var message = JSON.parse(m.data); + _dispatcher.AppDispatcher.dispatchServerAction(message); + dispatch(websocketActions.receiveMessage(message)); }; ws.onerror = function () { _actions.ConnectionActions.error(); @@ -4388,13 +4393,12 @@ function Connection(url) { ws.onclose = function () { _actions.ConnectionActions.close(); _actions.EventLogActions.add_event("WebSocket connection closed."); + dispatch(websocketActions.disconnected()); }; return ws; } -exports.default = Connection; - -},{"./actions.js":2,"./dispatcher.js":22}],22:[function(require,module,exports){ +},{"./actions.js":2,"./dispatcher.js":22,"./ducks/websocket":26}],22:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -4475,6 +4479,32 @@ function toggleEventLogVisibility() { } },{}],24:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = reducer; +var defaultState = { + list: [], + isFetching: false, + updateBeforeFetch: [], + byId: {}, + indexOf: {}, + views: {} +}; + +function reducer() { + var state = arguments.length <= 0 || arguments[0] === undefined ? defaultState : arguments[0]; + var action = arguments[1]; + + switch (action.type) { + default: + return state; + } +} + +},{}],25:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -4487,15 +4517,71 @@ var _eventLog = require('./eventLog.js'); var _eventLog2 = _interopRequireDefault(_eventLog); +var _websocket = require('./websocket.js'); + +var _websocket2 = _interopRequireDefault(_websocket); + +var _flows = require('./flows.js'); + +var _flows2 = _interopRequireDefault(_flows); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var rootReducer = (0, _redux.combineReducers)({ - eventLog: _eventLog2.default + eventLog: _eventLog2.default, + flows: _flows2.default, + websocket: _websocket2.default }); exports.default = rootReducer; -},{"./eventLog.js":23,"redux":"redux"}],25:[function(require,module,exports){ +},{"./eventLog.js":23,"./flows.js":24,"./websocket.js":26,"redux":"redux"}],26:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = reducer; +exports.connected = connected; +exports.disconnected = disconnected; +exports.receiveMessage = receiveMessage; +var CONNECTED = 'WEBSOCKET_CONNECTED'; +var DISCONNECTED = 'WEBSOCKET_DISCONNECTED'; +var RECEIVE_MESSAGE = 'RECEIVE_WEBSOCKET_MESSAGE'; + +var defaultState = { + connected: true +}; +/* we may want to have an error message attribute here at some point */ +function reducer() { + var state = arguments.length <= 0 || arguments[0] === undefined ? defaultState : arguments[0]; + var action = arguments[1]; + + switch (action.type) { + case CONNECTED: + return { + connected: true + }; + case DISCONNECTED: + return { + connected: false + }; + default: + return state; + } +} + +function connected() { + return { type: CONNECTED }; +} +function disconnected() { + return { type: DISCONNECTED }; +} +function receiveMessage(message) { + return { type: RECEIVE_MESSAGE, message: message }; +} + +},{}],27:[function(require,module,exports){ "use strict"; module.exports = function () { @@ -6399,7 +6485,7 @@ module.exports = function () { }; }(); -},{"../flow/utils.js":26}],26:[function(require,module,exports){ +},{"../flow/utils.js":28}],28:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -6533,7 +6619,7 @@ var parseHttpVersion = exports.parseHttpVersion = function parseHttpVersion(http }); }; -},{"jquery":"jquery","lodash":"lodash"}],27:[function(require,module,exports){ +},{"jquery":"jquery","lodash":"lodash"}],29:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -6720,7 +6806,7 @@ _lodash2.default.extend(EventLogStore.prototype, LiveListStore.prototype, { } }); -},{"../actions.js":2,"../dispatcher.js":22,"events":1,"jquery":"jquery","lodash":"lodash"}],28:[function(require,module,exports){ +},{"../actions.js":2,"../dispatcher.js":22,"events":1,"jquery":"jquery","lodash":"lodash"}],30:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -6850,7 +6936,7 @@ _lodash2.default.extend(StoreView.prototype, _events.EventEmitter.prototype, { } }); -},{"../utils.js":29,"events":1,"lodash":"lodash"}],29:[function(require,module,exports){ +},{"../utils.js":31,"events":1,"lodash":"lodash"}],31:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { diff --git a/web/src/js/app.js b/web/src/js/app.js index 5b5d1fc8a..f631b2c5d 100644 --- a/web/src/js/app.js +++ b/web/src/js/app.js @@ -3,7 +3,6 @@ import {render} from 'react-dom' import {createStore} from 'redux' import {Provider} from 'react-redux' -import $ from "jquery" import Connection from "./connection" import {App} from "./components/proxyapp.js" import {EventLogActions} from "./actions.js" @@ -11,8 +10,8 @@ import rootReducer from './ducks/index'; let store = createStore(rootReducer); -$(function () { - window.ws = new Connection("/updates"); +document.addEventListener('DOMContentLoaded', () => { + window.ws = new Connection("/updates", store.dispatch); window.onerror = function (msg) { EventLogActions.add_event(msg); @@ -20,6 +19,7 @@ $(function () { render( {App}, - document.getElementById("mitmproxy")); -}); + document.getElementById("mitmproxy") + ); +}); diff --git a/web/src/js/components/header.js b/web/src/js/components/header.js index 76c4744a9..e329b3f56 100644 --- a/web/src/js/components/header.js +++ b/web/src/js/components/header.js @@ -243,29 +243,29 @@ export const OptionMenu = (props) => { return (
- SettingsActions.update({showhost: !showhost})} + onToggle={() => SettingsActions.update({showhost: !showhost})} /> - SettingsActions.update({no_upstream_cert: !no_upstream_cert})} + onToggle={() => SettingsActions.update({no_upstream_cert: !no_upstream_cert})} /> - SettingsActions.update({rawtcp: !rawtcp})} + onToggle={() => SettingsActions.update({rawtcp: !rawtcp})} /> - SettingsActions.update({http2: !http2})} + onToggle={() => SettingsActions.update({http2: !http2})} /> - SettingsActions.update({anticache: !anticache})} + onToggle={() => SettingsActions.update({anticache: !anticache})} /> - SettingsActions.update({anticomp: !anticomp})} + onToggle={() => SettingsActions.update({anticomp: !anticomp})} /> Date: Thu, 2 Jun 2016 23:40:30 -0700 Subject: [PATCH 7/8] web: reduxify event log store --- mitmproxy/web/__init__.py | 2 +- mitmproxy/web/static/app.js | 500 ++++++++++++++++++++++-------- web/package.json | 1 + web/src/js/app.js | 17 +- web/src/js/components/eventlog.js | 69 ++--- web/src/js/connection.js | 4 +- web/src/js/ducks/eventLog.js | 32 +- web/src/js/ducks/flows.js | 15 - web/src/js/ducks/index.js | 2 - web/src/js/ducks/list.js | 21 ++ web/src/js/ducks/websocket.js | 4 - 11 files changed, 462 insertions(+), 205 deletions(-) delete mode 100644 web/src/js/ducks/flows.js create mode 100644 web/src/js/ducks/list.js diff --git a/mitmproxy/web/__init__.py b/mitmproxy/web/__init__.py index 80a658863..5449c1bcc 100644 --- a/mitmproxy/web/__init__.py +++ b/mitmproxy/web/__init__.py @@ -73,7 +73,7 @@ class WebState(flow.State): } self.events.append(entry) app.ClientConnection.broadcast( - type="events", + type="UPDATE_EVENTLOG", cmd="add", data=entry ) diff --git a/mitmproxy/web/static/app.js b/mitmproxy/web/static/app.js index d97a567d4..2a5cc44eb 100644 --- a/mitmproxy/web/static/app.js +++ b/mitmproxy/web/static/app.js @@ -301,6 +301,235 @@ function isUndefined(arg) { },{}],2:[function(require,module,exports){ "use strict"; +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +function _typeof(obj) { return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj; } + +var repeat = function repeat(str, times) { + return new Array(times + 1).join(str); +}; +var pad = function pad(num, maxLength) { + return repeat("0", maxLength - num.toString().length) + num; +}; +var formatTime = function formatTime(time) { + return "@ " + pad(time.getHours(), 2) + ":" + pad(time.getMinutes(), 2) + ":" + pad(time.getSeconds(), 2) + "." + pad(time.getMilliseconds(), 3); +}; + +// Use the new performance api to get better precision if available +var timer = typeof performance !== "undefined" && typeof performance.now === "function" ? performance : Date; + +/** + * parse the level option of createLogger + * + * @property {string | function | object} level - console[level] + * @property {object} action + * @property {array} payload + * @property {string} type + */ + +function getLogLevel(level, action, payload, type) { + switch (typeof level === "undefined" ? "undefined" : _typeof(level)) { + case "object": + return typeof level[type] === "function" ? level[type].apply(level, _toConsumableArray(payload)) : level[type]; + case "function": + return level(action); + default: + return level; + } +} + +/** + * Creates logger with followed options + * + * @namespace + * @property {object} options - options for logger + * @property {string | function | object} options.level - console[level] + * @property {boolean} options.duration - print duration of each action? + * @property {boolean} options.timestamp - print timestamp with each action? + * @property {object} options.colors - custom colors + * @property {object} options.logger - implementation of the `console` API + * @property {boolean} options.logErrors - should errors in action execution be caught, logged, and re-thrown? + * @property {boolean} options.collapsed - is group collapsed? + * @property {boolean} options.predicate - condition which resolves logger behavior + * @property {function} options.stateTransformer - transform state before print + * @property {function} options.actionTransformer - transform action before print + * @property {function} options.errorTransformer - transform error before print + */ + +function createLogger() { + var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + var _options$level = options.level; + var level = _options$level === undefined ? "log" : _options$level; + var _options$logger = options.logger; + var logger = _options$logger === undefined ? console : _options$logger; + var _options$logErrors = options.logErrors; + var logErrors = _options$logErrors === undefined ? true : _options$logErrors; + var collapsed = options.collapsed; + var predicate = options.predicate; + var _options$duration = options.duration; + var duration = _options$duration === undefined ? false : _options$duration; + var _options$timestamp = options.timestamp; + var timestamp = _options$timestamp === undefined ? true : _options$timestamp; + var transformer = options.transformer; + var _options$stateTransfo = options.stateTransformer; + var // deprecated + stateTransformer = _options$stateTransfo === undefined ? function (state) { + return state; + } : _options$stateTransfo; + var _options$actionTransf = options.actionTransformer; + var actionTransformer = _options$actionTransf === undefined ? function (actn) { + return actn; + } : _options$actionTransf; + var _options$errorTransfo = options.errorTransformer; + var errorTransformer = _options$errorTransfo === undefined ? function (error) { + return error; + } : _options$errorTransfo; + var _options$colors = options.colors; + var colors = _options$colors === undefined ? { + title: function title() { + return "#000000"; + }, + prevState: function prevState() { + return "#9E9E9E"; + }, + action: function action() { + return "#03A9F4"; + }, + nextState: function nextState() { + return "#4CAF50"; + }, + error: function error() { + return "#F20404"; + } + } : _options$colors; + + // exit if console undefined + + if (typeof logger === "undefined") { + return function () { + return function (next) { + return function (action) { + return next(action); + }; + }; + }; + } + + if (transformer) { + console.error("Option 'transformer' is deprecated, use stateTransformer instead"); + } + + var logBuffer = []; + function printBuffer() { + logBuffer.forEach(function (logEntry, key) { + var started = logEntry.started; + var startedTime = logEntry.startedTime; + var action = logEntry.action; + var prevState = logEntry.prevState; + var error = logEntry.error; + var took = logEntry.took; + var nextState = logEntry.nextState; + + var nextEntry = logBuffer[key + 1]; + if (nextEntry) { + nextState = nextEntry.prevState; + took = nextEntry.started - started; + } + // message + var formattedAction = actionTransformer(action); + var isCollapsed = typeof collapsed === "function" ? collapsed(function () { + return nextState; + }, action) : collapsed; + + var formattedTime = formatTime(startedTime); + var titleCSS = colors.title ? "color: " + colors.title(formattedAction) + ";" : null; + var title = "action " + (timestamp ? formattedTime : "") + " " + formattedAction.type + " " + (duration ? "(in " + took.toFixed(2) + " ms)" : ""); + + // render + try { + if (isCollapsed) { + if (colors.title) logger.groupCollapsed("%c " + title, titleCSS);else logger.groupCollapsed(title); + } else { + if (colors.title) logger.group("%c " + title, titleCSS);else logger.group(title); + } + } catch (e) { + logger.log(title); + } + + var prevStateLevel = getLogLevel(level, formattedAction, [prevState], "prevState"); + var actionLevel = getLogLevel(level, formattedAction, [formattedAction], "action"); + var errorLevel = getLogLevel(level, formattedAction, [error, prevState], "error"); + var nextStateLevel = getLogLevel(level, formattedAction, [nextState], "nextState"); + + if (prevStateLevel) { + if (colors.prevState) logger[prevStateLevel]("%c prev state", "color: " + colors.prevState(prevState) + "; font-weight: bold", prevState);else logger[prevStateLevel]("prev state", prevState); + } + + if (actionLevel) { + if (colors.action) logger[actionLevel]("%c action", "color: " + colors.action(formattedAction) + "; font-weight: bold", formattedAction);else logger[actionLevel]("action", formattedAction); + } + + if (error && errorLevel) { + if (colors.error) logger[errorLevel]("%c error", "color: " + colors.error(error, prevState) + "; font-weight: bold", error);else logger[errorLevel]("error", error); + } + + if (nextStateLevel) { + if (colors.nextState) logger[nextStateLevel]("%c next state", "color: " + colors.nextState(nextState) + "; font-weight: bold", nextState);else logger[nextStateLevel]("next state", nextState); + } + + try { + logger.groupEnd(); + } catch (e) { + logger.log("—— log end ——"); + } + }); + logBuffer.length = 0; + } + + return function (_ref) { + var getState = _ref.getState; + return function (next) { + return function (action) { + // exit early if predicate function returns false + if (typeof predicate === "function" && !predicate(getState, action)) { + return next(action); + } + + var logEntry = {}; + logBuffer.push(logEntry); + + logEntry.started = timer.now(); + logEntry.startedTime = new Date(); + logEntry.prevState = stateTransformer(getState()); + logEntry.action = action; + + var returnedValue = undefined; + if (logErrors) { + try { + returnedValue = next(action); + } catch (e) { + logEntry.error = errorTransformer(e); + } + } else { + returnedValue = next(action); + } + + logEntry.took = timer.now() - logEntry.started; + logEntry.nextState = stateTransformer(getState()); + + printBuffer(); + + if (logEntry.error) throw logEntry.error; + return returnedValue; + }; + }; + }; +} + +module.exports = createLogger; +},{}],3:[function(require,module,exports){ +"use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); @@ -442,7 +671,7 @@ var Query = exports.Query = { SHOW_EVENTLOG: "e" }; -},{"./dispatcher.js":22,"jquery":"jquery","lodash":"lodash"}],3:[function(require,module,exports){ +},{"./dispatcher.js":23,"jquery":"jquery","lodash":"lodash"}],4:[function(require,module,exports){ 'use strict'; var _react = require('react'); @@ -455,29 +684,35 @@ var _redux = require('redux'); var _reactRedux = require('react-redux'); +var _reduxLogger = require('redux-logger'); + +var _reduxLogger2 = _interopRequireDefault(_reduxLogger); + var _connection = require('./connection'); var _connection2 = _interopRequireDefault(_connection); var _proxyapp = require('./components/proxyapp.js'); -var _actions = require('./actions.js'); - var _index = require('./ducks/index'); var _index2 = _interopRequireDefault(_index); +var _eventLog = require('./ducks/eventLog'); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -var store = (0, _redux.createStore)(_index2.default); +// logger must be last +var logger = (0, _reduxLogger2.default)(); +var store = (0, _redux.createStore)(_index2.default, (0, _redux.applyMiddleware)(logger)); + +window.onerror = function (msg) { + store.dispatch((0, _eventLog.addLogEntry)(msg)); +}; document.addEventListener('DOMContentLoaded', function () { window.ws = new _connection2.default("/updates", store.dispatch); - window.onerror = function (msg) { - _actions.EventLogActions.add_event(msg); - }; - (0, _reactDom.render)(_react2.default.createElement( _reactRedux.Provider, { store: store }, @@ -485,7 +720,7 @@ document.addEventListener('DOMContentLoaded', function () { ), document.getElementById("mitmproxy")); }); -},{"./actions.js":2,"./components/proxyapp.js":20,"./connection":21,"./ducks/index":25,"react":"react","react-dom":"react-dom","react-redux":"react-redux","redux":"redux"}],4:[function(require,module,exports){ +},{"./components/proxyapp.js":21,"./connection":22,"./ducks/eventLog":24,"./ducks/index":25,"react":"react","react-dom":"react-dom","react-redux":"react-redux","redux":"redux","redux-logger":2}],5:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -704,7 +939,7 @@ ToggleInputButton.propTypes = { onToggleChanged: _react2.default.PropTypes.func.isRequired }; -},{"../utils.js":31,"lodash":"lodash","react":"react","react-dom":"react-dom"}],5:[function(require,module,exports){ +},{"../utils.js":32,"lodash":"lodash","react":"react","react-dom":"react-dom"}],6:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -962,7 +1197,7 @@ var ValueEditor = exports.ValueEditor = _react2.default.createClass({ } }); -},{"../utils.js":31,"react":"react","react-dom":"react-dom"}],6:[function(require,module,exports){ +},{"../utils.js":32,"react":"react","react-dom":"react-dom"}],7:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -994,8 +1229,6 @@ var _AutoScroll2 = _interopRequireDefault(_AutoScroll); var _VirtualScroll = require("./helpers/VirtualScroll"); -var _view = require("../store/view.js"); - var _common = require("./common"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -1006,22 +1239,35 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen 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 LogIcon(_ref) { + var entry = _ref.entry; + + var icon = { web: "html5", debug: "bug" }[entry.level] || "info"; + return _react2.default.createElement("i", { className: "fa fa-fw fa-" + icon }); +} + +function LogEntry(_ref2) { + var entry = _ref2.entry; + + return _react2.default.createElement( + "div", + null, + _react2.default.createElement(LogIcon, { entry: entry }), + entry.message + ); +} + var EventLogContents = function (_React$Component) { _inherits(EventLogContents, _React$Component); - function EventLogContents(props, context) { + function EventLogContents(props) { _classCallCheck(this, EventLogContents); - var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(EventLogContents).call(this, props, context)); - - _this.view = new _view.StoreView(_this.context.eventStore, function (entry) { - return _this.props.filter[entry.level]; - }); + var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(EventLogContents).call(this, props)); _this.heights = {}; - _this.state = { entries: _this.view.list, vScroll: (0, _VirtualScroll.calcVScroll)() }; + _this.state = { vScroll: (0, _VirtualScroll.calcVScroll)() }; - _this.onChange = _this.onChange.bind(_this); _this.onViewportUpdate = _this.onViewportUpdate.bind(_this); return _this; } @@ -1030,32 +1276,18 @@ var EventLogContents = function (_React$Component) { key: "componentDidMount", value: function componentDidMount() { window.addEventListener("resize", this.onViewportUpdate); - this.view.addListener("add", this.onChange); - this.view.addListener("recalculate", this.onChange); this.onViewportUpdate(); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { window.removeEventListener("resize", this.onViewportUpdate); - this.view.removeListener("add", this.onChange); - this.view.removeListener("recalculate", this.onChange); - this.view.close(); } }, { key: "componentDidUpdate", value: function componentDidUpdate() { this.onViewportUpdate(); } - }, { - key: "componentWillReceiveProps", - value: function componentWillReceiveProps(nextProps) { - if (nextProps.filter !== this.props.filter) { - this.view.recalculate(function (entry) { - return nextProps.filter[entry.level]; - }); - } - } }, { key: "onViewportUpdate", value: function onViewportUpdate() { @@ -1064,11 +1296,11 @@ var EventLogContents = function (_React$Component) { var viewport = _reactDom2.default.findDOMNode(this); var vScroll = (0, _VirtualScroll.calcVScroll)({ - itemCount: this.state.entries.length, + itemCount: this.props.events.length, rowHeight: this.props.rowHeight, viewportTop: viewport.scrollTop, viewportHeight: viewport.offsetHeight, - itemHeights: this.state.entries.map(function (entry) { + itemHeights: this.props.events.map(function (entry) { return _this2.heights[entry.id]; }) }); @@ -1077,11 +1309,6 @@ var EventLogContents = function (_React$Component) { this.setState({ vScroll: vScroll }); } } - }, { - key: "onChange", - value: function onChange() { - this.setState({ entries: this.view.list }); - } }, { key: "setHeight", value: function setHeight(id, ref) { @@ -1093,31 +1320,21 @@ var EventLogContents = function (_React$Component) { } } } - }, { - key: "getIcon", - value: function getIcon(level) { - return { web: "html5", debug: "bug" }[level] || "info"; - } }, { key: "render", value: function render() { var _this3 = this; var vScroll = this.state.vScroll; - var entries = this.state.entries.slice(vScroll.start, vScroll.end); + var events = this.props.events.slice(vScroll.start, vScroll.end).map(function (entry) { + return _react2.default.createElement(LogEntry, { entry: entry, key: entry.id, ref: _this3.setHeight.bind(_this3, entry.id) }); + }); return _react2.default.createElement( "pre", { onScroll: this.onViewportUpdate }, _react2.default.createElement("div", { style: { height: vScroll.paddingTop } }), - entries.map(function (entry, index) { - return _react2.default.createElement( - "div", - { key: entry.id, ref: _this3.setHeight.bind(_this3, entry.id) }, - _react2.default.createElement("i", { className: "fa fa-fw fa-" + _this3.getIcon(entry.level) }), - entry.message - ); - }), + events, _react2.default.createElement("div", { style: { height: vScroll.paddingBottom } }) ); } @@ -1126,9 +1343,6 @@ var EventLogContents = function (_React$Component) { return EventLogContents; }(_react2.default.Component); -EventLogContents.contextTypes = { - eventStore: _react2.default.PropTypes.object.isRequired -}; EventLogContents.defaultProps = { rowHeight: 18 }; @@ -1138,7 +1352,7 @@ EventLogContents = (0, _AutoScroll2.default)(EventLogContents); var EventLogContentsContainer = (0, _reactRedux.connect)(function (state) { return { - filter: state.eventLog.filter + events: state.eventLog.filteredEvents }; })(EventLogContents); @@ -1166,8 +1380,8 @@ var ToggleFilter = (0, _reactRedux.connect)(function (state, ownProps) { }; })(_common.ToggleButton); -var EventLog = function EventLog(_ref) { - var close = _ref.close; +var EventLog = function EventLog(_ref3) { + var close = _ref3.close; return _react2.default.createElement( "div", { className: "eventlog" }, @@ -1202,7 +1416,7 @@ var EventLogContainer = (0, _reactRedux.connect)(undefined, function (dispatch) exports.default = EventLogContainer; -},{"../ducks/eventLog":23,"../store/view.js":30,"./common":4,"./helpers/AutoScroll":16,"./helpers/VirtualScroll":17,"react":"react","react-dom":"react-dom","react-redux":"react-redux","shallowequal":"shallowequal"}],7:[function(require,module,exports){ +},{"../ducks/eventLog":24,"./common":5,"./helpers/AutoScroll":17,"./helpers/VirtualScroll":18,"react":"react","react-dom":"react-dom","react-redux":"react-redux","shallowequal":"shallowequal"}],8:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -1471,7 +1685,7 @@ var all_columns = [TLSColumn, IconColumn, PathColumn, MethodColumn, StatusColumn exports.default = all_columns; -},{"../flow/utils.js":28,"../utils.js":31,"react":"react"}],8:[function(require,module,exports){ +},{"../flow/utils.js":29,"../utils.js":32,"react":"react"}],9:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -1763,7 +1977,7 @@ FlowTable.defaultProps = { }; exports.default = (0, _AutoScroll2.default)(FlowTable); -},{"../utils.js":31,"./flowtable-columns.js":7,"./helpers/AutoScroll":16,"./helpers/VirtualScroll":17,"classnames":"classnames","lodash":"lodash","react":"react","react-dom":"react-dom","shallowequal":"shallowequal"}],9:[function(require,module,exports){ +},{"../utils.js":32,"./flowtable-columns.js":8,"./helpers/AutoScroll":17,"./helpers/VirtualScroll":18,"classnames":"classnames","lodash":"lodash","react":"react","react-dom":"react-dom","shallowequal":"shallowequal"}],10:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -2117,7 +2331,7 @@ var ContentView = _react2.default.createClass({ exports.default = ContentView; -},{"../../flow/utils.js":28,"../../utils.js":31,"lodash":"lodash","react":"react"}],10:[function(require,module,exports){ +},{"../../flow/utils.js":29,"../../utils.js":32,"lodash":"lodash","react":"react"}],11:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -2385,7 +2599,7 @@ var Details = _react2.default.createClass({ exports.default = Details; -},{"../../utils.js":31,"lodash":"lodash","react":"react"}],11:[function(require,module,exports){ +},{"../../utils.js":32,"lodash":"lodash","react":"react"}],12:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -2514,7 +2728,7 @@ var FlowView = _react2.default.createClass({ exports.default = FlowView; -},{"../prompt.js":19,"./details.js":10,"./messages.js":12,"./nav.js":13,"react":"react"}],12:[function(require,module,exports){ +},{"../prompt.js":20,"./details.js":11,"./messages.js":13,"./nav.js":14,"react":"react"}],13:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -2879,7 +3093,7 @@ var Error = exports.Error = _react2.default.createClass({ } }); -},{"../../actions.js":2,"../../flow/utils.js":28,"../../utils.js":31,"../editor.js":5,"./contentview.js":9,"lodash":"lodash","react":"react","react-dom":"react-dom"}],13:[function(require,module,exports){ +},{"../../actions.js":3,"../../flow/utils.js":29,"../../utils.js":32,"../editor.js":6,"./contentview.js":10,"lodash":"lodash","react":"react","react-dom":"react-dom"}],14:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -2960,7 +3174,7 @@ var Nav = _react2.default.createClass({ exports.default = Nav; -},{"../../actions.js":2,"react":"react"}],14:[function(require,module,exports){ +},{"../../actions.js":3,"react":"react"}],15:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -3062,7 +3276,7 @@ function Footer(_ref) { ); } -},{"../utils.js":31,"./common.js":4,"react":"react"}],15:[function(require,module,exports){ +},{"../utils.js":32,"./common.js":5,"react":"react"}],16:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -3605,7 +3819,7 @@ var Header = exports.Header = _react2.default.createClass({ } }); -},{"../actions.js":2,"../filt/filt.js":27,"../utils.js":31,"./common.js":4,"./eventlog":6,"jquery":"jquery","react":"react","react-dom":"react-dom","react-redux":"react-redux"}],16:[function(require,module,exports){ +},{"../actions.js":3,"../filt/filt.js":28,"../utils.js":32,"./common.js":5,"./eventlog":7,"jquery":"jquery","react":"react","react-dom":"react-dom","react-redux":"react-redux"}],17:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -3671,7 +3885,7 @@ exports.default = function (Component) { }(Component), _class.displayName = Component.name, _temp), Component); }; -},{"react":"react","react-dom":"react-dom"}],17:[function(require,module,exports){ +},{"react":"react","react-dom":"react-dom"}],18:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -3750,7 +3964,7 @@ function calcVScroll(opts) { return { start: start, end: end, paddingTop: paddingTop, paddingBottom: paddingBottom }; } -},{}],18:[function(require,module,exports){ +},{}],19:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -4021,7 +4235,7 @@ var MainView = _react2.default.createClass({ exports.default = MainView; -},{"../actions.js":2,"../filt/filt.js":27,"../store/view.js":30,"../utils.js":31,"./common.js":4,"./flowtable.js":8,"./flowview/index.js":11,"react":"react"}],19:[function(require,module,exports){ +},{"../actions.js":3,"../filt/filt.js":28,"../store/view.js":31,"../utils.js":32,"./common.js":5,"./flowtable.js":9,"./flowview/index.js":12,"react":"react"}],20:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -4157,7 +4371,7 @@ var Prompt = _react2.default.createClass({ exports.default = Prompt; -},{"../utils.js":31,"lodash":"lodash","react":"react","react-dom":"react-dom"}],20:[function(require,module,exports){ +},{"../utils.js":32,"lodash":"lodash","react":"react","react-dom":"react-dom"}],21:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -4353,7 +4567,7 @@ var App = exports.App = _react2.default.createElement( ) ); -},{"../store/store.js":29,"../utils.js":31,"./common.js":4,"./eventlog.js":6,"./footer.js":14,"./header.js":15,"./mainview.js":18,"lodash":"lodash","react":"react","react-dom":"react-dom","react-redux":"react-redux","react-router":"react-router"}],21:[function(require,module,exports){ +},{"../store/store.js":30,"../utils.js":32,"./common.js":5,"./eventlog.js":7,"./footer.js":15,"./header.js":16,"./mainview.js":19,"lodash":"lodash","react":"react","react-dom":"react-dom","react-redux":"react-redux","react-router":"react-router"}],22:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -4380,11 +4594,12 @@ function Connection(url, dispatch) { ws.onopen = function () { dispatch(websocketActions.connected()); _actions.ConnectionActions.open(); + //TODO: fetch stuff! }; ws.onmessage = function (m) { var message = JSON.parse(m.data); _dispatcher.AppDispatcher.dispatchServerAction(message); - dispatch(websocketActions.receiveMessage(message)); + dispatch(message); }; ws.onerror = function () { _actions.ConnectionActions.error(); @@ -4398,7 +4613,7 @@ function Connection(url, dispatch) { return ws; } -},{"./actions.js":2,"./dispatcher.js":22,"./ducks/websocket":26}],22:[function(require,module,exports){ +},{"./actions.js":3,"./dispatcher.js":23,"./ducks/websocket":27}],23:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -4427,7 +4642,7 @@ AppDispatcher.dispatchServerAction = function (action) { this.dispatch(action); }; -},{"flux":"flux"}],23:[function(require,module,exports){ +},{"flux":"flux"}],24:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -4439,11 +4654,19 @@ var _extends = Object.assign || function (target) { for (var i = 1; i < argument exports.default = reducer; exports.toggleEventLogFilter = toggleEventLogFilter; exports.toggleEventLogVisibility = toggleEventLogVisibility; +exports.addLogEntry = addLogEntry; + +var _list = require('./list'); + +var _list2 = _interopRequireDefault(_list); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var TOGGLE_FILTER = 'TOGGLE_EVENTLOG_FILTER'; var TOGGLE_VISIBILITY = 'TOGGLE_EVENTLOG_VISIBILITY'; +var UPDATE_LIST = "UPDATE_EVENTLOG"; var defaultState = { visible: false, @@ -4451,21 +4674,36 @@ var defaultState = { "debug": false, "info": true, "web": true - } + }, + events: (0, _list2.default)(), + filteredEvents: [] }; + function reducer() { var state = arguments.length <= 0 || arguments[0] === undefined ? defaultState : arguments[0]; var action = arguments[1]; switch (action.type) { case TOGGLE_FILTER: + var filter = _extends({}, state.filter, _defineProperty({}, action.filter, !state.filter[action.filter])); return _extends({}, state, { - filter: _extends({}, state.filter, _defineProperty({}, action.filter, !state.filter[action.filter])) + filter: filter, + filteredEvents: state.events.list.filter(function (x) { + return filter[x.level]; + }) }); case TOGGLE_VISIBILITY: return _extends({}, state, { visible: !state.visible }); + case UPDATE_LIST: + var events = (0, _list2.default)(state.events, action); + return _extends({}, state, { + events: events, + filteredEvents: events.list.filter(function (x) { + return state.filter[x.level]; + }) + }); default: return state; } @@ -4477,34 +4715,18 @@ function toggleEventLogFilter(filter) { function toggleEventLogVisibility() { return { type: TOGGLE_VISIBILITY }; } +var id = 0; +function addLogEntry(message) { + var level = arguments.length <= 1 || arguments[1] === undefined ? "web" : arguments[1]; -},{}],24:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = reducer; -var defaultState = { - list: [], - isFetching: false, - updateBeforeFetch: [], - byId: {}, - indexOf: {}, - views: {} -}; - -function reducer() { - var state = arguments.length <= 0 || arguments[0] === undefined ? defaultState : arguments[0]; - var action = arguments[1]; - - switch (action.type) { - default: - return state; - } + return { + type: UPDATE_LIST, + cmd: _list.ADD, + data: { message: message, level: level, id: 'log-' + id++ } + }; } -},{}],25:[function(require,module,exports){ +},{"./list":26}],25:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -4521,21 +4743,56 @@ var _websocket = require('./websocket.js'); var _websocket2 = _interopRequireDefault(_websocket); -var _flows = require('./flows.js'); - -var _flows2 = _interopRequireDefault(_flows); - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var rootReducer = (0, _redux.combineReducers)({ eventLog: _eventLog2.default, - flows: _flows2.default, websocket: _websocket2.default }); exports.default = rootReducer; -},{"./eventLog.js":23,"./flows.js":24,"./websocket.js":26,"redux":"redux"}],26:[function(require,module,exports){ +},{"./eventLog.js":24,"./websocket.js":27,"redux":"redux"}],26:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +exports.default = getList; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + +var ADD = exports.ADD = 'add'; + +var defaultState = { + list: [], + //isFetching: false, + //updateBeforeFetch: [], + indexOf: {} +}; + +//views: {} +function getList() { + var state = arguments.length <= 0 || arguments[0] === undefined ? defaultState : arguments[0]; + var action = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + switch (action.cmd) { + case ADD: + return { + list: [].concat(_toConsumableArray(state.list), [action.data]), + indexOf: _extends({}, state.indexOf, _defineProperty({}, action.data.id, state.list.length)) + }; + default: + return state; + } +} + +},{}],27:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -4544,10 +4801,8 @@ Object.defineProperty(exports, "__esModule", { exports.default = reducer; exports.connected = connected; exports.disconnected = disconnected; -exports.receiveMessage = receiveMessage; var CONNECTED = 'WEBSOCKET_CONNECTED'; var DISCONNECTED = 'WEBSOCKET_DISCONNECTED'; -var RECEIVE_MESSAGE = 'RECEIVE_WEBSOCKET_MESSAGE'; var defaultState = { connected: true @@ -4577,11 +4832,8 @@ function connected() { function disconnected() { return { type: DISCONNECTED }; } -function receiveMessage(message) { - return { type: RECEIVE_MESSAGE, message: message }; -} -},{}],27:[function(require,module,exports){ +},{}],28:[function(require,module,exports){ "use strict"; module.exports = function () { @@ -6485,7 +6737,7 @@ module.exports = function () { }; }(); -},{"../flow/utils.js":28}],28:[function(require,module,exports){ +},{"../flow/utils.js":29}],29:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -6619,7 +6871,7 @@ var parseHttpVersion = exports.parseHttpVersion = function parseHttpVersion(http }); }; -},{"jquery":"jquery","lodash":"lodash"}],29:[function(require,module,exports){ +},{"jquery":"jquery","lodash":"lodash"}],30:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -6806,7 +7058,7 @@ _lodash2.default.extend(EventLogStore.prototype, LiveListStore.prototype, { } }); -},{"../actions.js":2,"../dispatcher.js":22,"events":1,"jquery":"jquery","lodash":"lodash"}],30:[function(require,module,exports){ +},{"../actions.js":3,"../dispatcher.js":23,"events":1,"jquery":"jquery","lodash":"lodash"}],31:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -6936,7 +7188,7 @@ _lodash2.default.extend(StoreView.prototype, _events.EventEmitter.prototype, { } }); -},{"../utils.js":31,"events":1,"lodash":"lodash"}],31:[function(require,module,exports){ +},{"../utils.js":32,"events":1,"lodash":"lodash"}],32:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -7051,7 +7303,7 @@ _jquery2.default.ajaxPrefilter(function (options) { alert(message); }); -},{"./actions.js":2,"jquery":"jquery","lodash":"lodash","react":"react"}]},{},[3]) +},{"./actions.js":3,"jquery":"jquery","lodash":"lodash","react":"react"}]},{},[4]) //# sourceMappingURL=app.js.map diff --git a/web/package.json b/web/package.json index 4b58422c7..b7f6ab2a5 100644 --- a/web/package.json +++ b/web/package.json @@ -26,6 +26,7 @@ "react-redux": "^4.4.5", "react-router": "^2.4.0", "redux": "^3.5.2", + "redux-logger": "^2.6.1", "shallowequal": "^0.2.2" }, "devDependencies": { diff --git a/web/src/js/app.js b/web/src/js/app.js index f631b2c5d..fc99f1d2e 100644 --- a/web/src/js/app.js +++ b/web/src/js/app.js @@ -1,22 +1,25 @@ import React from "react" import {render} from 'react-dom' -import {createStore} from 'redux' +import {applyMiddleware, createStore} from 'redux' import {Provider} from 'react-redux' +import createLogger from 'redux-logger'; import Connection from "./connection" import {App} from "./components/proxyapp.js" -import {EventLogActions} from "./actions.js" import rootReducer from './ducks/index'; +import {addLogEntry} from "./ducks/eventLog"; -let store = createStore(rootReducer); +// logger must be last +const logger = createLogger(); +const store = createStore(rootReducer, applyMiddleware(logger)); + +window.onerror = function (msg) { + store.dispatch(addLogEntry(msg)); +}; document.addEventListener('DOMContentLoaded', () => { window.ws = new Connection("/updates", store.dispatch); - window.onerror = function (msg) { - EventLogActions.add_event(msg); - }; - render( {App}, document.getElementById("mitmproxy") diff --git a/web/src/js/components/eventlog.js b/web/src/js/components/eventlog.js index a2e6a0c1d..0857056c4 100644 --- a/web/src/js/components/eventlog.js +++ b/web/src/js/components/eventlog.js @@ -5,69 +5,57 @@ import shallowEqual from "shallowequal" import {toggleEventLogFilter, toggleEventLogVisibility} from "../ducks/eventLog" import AutoScroll from "./helpers/AutoScroll"; import {calcVScroll} from "./helpers/VirtualScroll" -import {StoreView} from "../store/view.js" import {ToggleButton} from "./common"; -class EventLogContents extends React.Component { +function LogIcon({entry}) { + let icon = {web: "html5", debug: "bug"}[entry.level] || "info"; + return +} - static contextTypes = { - eventStore: React.PropTypes.object.isRequired, - }; +function LogEntry({entry}) { + return
+ + {entry.message} +
; +} + +class EventLogContents extends React.Component { static defaultProps = { rowHeight: 18, }; - constructor(props, context) { - super(props, context); - - this.view = new StoreView( - this.context.eventStore, - entry => this.props.filter[entry.level] - ); + constructor(props) { + super(props); this.heights = {}; - this.state = {entries: this.view.list, vScroll: calcVScroll()}; + this.state = {vScroll: calcVScroll()}; - this.onChange = this.onChange.bind(this); this.onViewportUpdate = this.onViewportUpdate.bind(this); } componentDidMount() { window.addEventListener("resize", this.onViewportUpdate); - this.view.addListener("add", this.onChange); - this.view.addListener("recalculate", this.onChange); this.onViewportUpdate(); } componentWillUnmount() { window.removeEventListener("resize", this.onViewportUpdate); - this.view.removeListener("add", this.onChange); - this.view.removeListener("recalculate", this.onChange); - this.view.close(); } componentDidUpdate() { this.onViewportUpdate(); } - componentWillReceiveProps(nextProps) { - if (nextProps.filter !== this.props.filter) { - this.view.recalculate( - entry => nextProps.filter[entry.level] - ); - } - } - onViewportUpdate() { const viewport = ReactDOM.findDOMNode(this); const vScroll = calcVScroll({ - itemCount: this.state.entries.length, + itemCount: this.props.events.length, rowHeight: this.props.rowHeight, viewportTop: viewport.scrollTop, viewportHeight: viewport.offsetHeight, - itemHeights: this.state.entries.map(entry => this.heights[entry.id]), + itemHeights: this.props.events.map(entry => this.heights[entry.id]), }); if (!shallowEqual(this.state.vScroll, vScroll)) { @@ -75,10 +63,6 @@ class EventLogContents extends React.Component { } } - onChange() { - this.setState({entries: this.view.list}); - } - setHeight(id, ref) { if (ref && !this.heights[id]) { const height = ReactDOM.findDOMNode(ref).offsetHeight; @@ -89,23 +73,18 @@ class EventLogContents extends React.Component { } } - getIcon(level) { - return {web: "html5", debug: "bug"}[level] || "info"; - } - render() { const vScroll = this.state.vScroll; - const entries = this.state.entries.slice(vScroll.start, vScroll.end); + const events = this.props.events + .slice(vScroll.start, vScroll.end) + .map(entry => + + ); return (
                 
- {entries.map((entry, index) => ( -
- - {entry.message} -
- ))} + {events}
); @@ -117,7 +96,7 @@ EventLogContents = AutoScroll(EventLogContents); const EventLogContentsContainer = connect( state => ({ - filter: state.eventLog.filter + events: state.eventLog.filteredEvents }) )(EventLogContents); diff --git a/web/src/js/connection.js b/web/src/js/connection.js index 71d20f466..75c2cf258 100644 --- a/web/src/js/connection.js +++ b/web/src/js/connection.js @@ -1,4 +1,3 @@ - import {ConnectionActions, EventLogActions} from "./actions.js"; import {AppDispatcher} from "./dispatcher.js"; import * as websocketActions from "./ducks/websocket" @@ -12,11 +11,12 @@ export default function Connection(url, dispatch) { ws.onopen = function () { dispatch(websocketActions.connected()); ConnectionActions.open(); + //TODO: fetch stuff! }; ws.onmessage = function (m) { var message = JSON.parse(m.data); AppDispatcher.dispatchServerAction(message); - dispatch(websocketActions.receiveMessage(message)); + dispatch(message); }; ws.onerror = function () { ConnectionActions.error(); diff --git a/web/src/js/ducks/eventLog.js b/web/src/js/ducks/eventLog.js index 5bae252a0..2040711cd 100644 --- a/web/src/js/ducks/eventLog.js +++ b/web/src/js/ducks/eventLog.js @@ -1,5 +1,7 @@ +import getList, {ADD} from "./list" const TOGGLE_FILTER = 'TOGGLE_EVENTLOG_FILTER' const TOGGLE_VISIBILITY = 'TOGGLE_EVENTLOG_VISIBILITY' +const UPDATE_LIST = "UPDATE_EVENTLOG" const defaultState = { @@ -8,23 +10,35 @@ const defaultState = { "debug": false, "info": true, "web": true - } + }, + events: getList(), + filteredEvents: [], } + export default function reducer(state = defaultState, action) { switch (action.type) { case TOGGLE_FILTER: + const filter = { + ...state.filter, + [action.filter]: !state.filter[action.filter] + } return { ...state, - filter: { - ...state.filter, - [action.filter]: !state.filter[action.filter] - } + filter, + filteredEvents: state.events.list.filter(x => filter[x.level]) } case TOGGLE_VISIBILITY: return { ...state, visible: !state.visible } + case UPDATE_LIST: + const events = getList(state.events, action) + return { + ...state, + events, + filteredEvents: events.list.filter(x => state.filter[x.level]) + } default: return state } @@ -36,4 +50,12 @@ export function toggleEventLogFilter(filter) { } export function toggleEventLogVisibility() { return {type: TOGGLE_VISIBILITY} +} +let id = 0; +export function addLogEntry(message, level = "web") { + return { + type: UPDATE_LIST, + cmd: ADD, + data: {message, level, id: `log-${id++}`} + } } \ No newline at end of file diff --git a/web/src/js/ducks/flows.js b/web/src/js/ducks/flows.js deleted file mode 100644 index c4077f7a2..000000000 --- a/web/src/js/ducks/flows.js +++ /dev/null @@ -1,15 +0,0 @@ -const defaultState = { - list: [], - isFetching: false, - updateBeforeFetch: [], - byId: {}, - indexOf: {}, - views: {} -} - -export default function reducer(state = defaultState, action) { - switch (action.type) { - default: - return state - } -} diff --git a/web/src/js/ducks/index.js b/web/src/js/ducks/index.js index 0074bda47..3043344c8 100644 --- a/web/src/js/ducks/index.js +++ b/web/src/js/ducks/index.js @@ -1,11 +1,9 @@ import {combineReducers} from 'redux' import eventLog from './eventLog.js' import websocket from './websocket.js' -import flows from './flows.js' const rootReducer = combineReducers({ eventLog, - flows, websocket, }) diff --git a/web/src/js/ducks/list.js b/web/src/js/ducks/list.js new file mode 100644 index 000000000..0b3771e2c --- /dev/null +++ b/web/src/js/ducks/list.js @@ -0,0 +1,21 @@ +export const ADD = 'add' + +const defaultState = { + list: [], + //isFetching: false, + //updateBeforeFetch: [], + indexOf: {}, + //views: {} +}; + +export default function getList(state = defaultState, action = {}) { + switch (action.cmd) { + case ADD: + return { + list: [...state.list, action.data], + indexOf: {...state.indexOf, [action.data.id]: state.list.length}, + } + default: + return state + } +} \ No newline at end of file diff --git a/web/src/js/ducks/websocket.js b/web/src/js/ducks/websocket.js index 281d1f2cd..3999dbcf1 100644 --- a/web/src/js/ducks/websocket.js +++ b/web/src/js/ducks/websocket.js @@ -1,6 +1,5 @@ const CONNECTED = 'WEBSOCKET_CONNECTED' const DISCONNECTED = 'WEBSOCKET_DISCONNECTED' -const RECEIVE_MESSAGE = 'RECEIVE_WEBSOCKET_MESSAGE' const defaultState = { @@ -28,7 +27,4 @@ export function connected() { } export function disconnected() { return {type: DISCONNECTED} -} -export function receiveMessage(message) { - return {type: RECEIVE_MESSAGE, message} } \ No newline at end of file From 5321f15defcef641bf5b7ba39e5c9057d562c5f8 Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Thu, 2 Jun 2016 23:41:32 -0700 Subject: [PATCH 8/8] web: fix eventlog height registration --- mitmproxy/web/static/app.js | 30 +++++++++++++++++++----------- web/src/js/components/eventlog.js | 27 ++++++++++++++++----------- 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/mitmproxy/web/static/app.js b/mitmproxy/web/static/app.js index 2a5cc44eb..e1e4b22bd 100644 --- a/mitmproxy/web/static/app.js +++ b/mitmproxy/web/static/app.js @@ -1240,20 +1240,21 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen 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 LogIcon(_ref) { - var entry = _ref.entry; + var event = _ref.event; - var icon = { web: "html5", debug: "bug" }[entry.level] || "info"; + var icon = { web: "html5", debug: "bug" }[event.level] || "info"; return _react2.default.createElement("i", { className: "fa fa-fw fa-" + icon }); } function LogEntry(_ref2) { - var entry = _ref2.entry; + var event = _ref2.event; + var registerHeight = _ref2.registerHeight; return _react2.default.createElement( "div", - null, - _react2.default.createElement(LogIcon, { entry: entry }), - entry.message + { ref: registerHeight }, + _react2.default.createElement(LogIcon, { event: event }), + event.message ); } @@ -1311,9 +1312,10 @@ var EventLogContents = function (_React$Component) { } }, { key: "setHeight", - value: function setHeight(id, ref) { - if (ref && !this.heights[id]) { - var height = _reactDom2.default.findDOMNode(ref).offsetHeight; + value: function setHeight(id, node) { + console.log("setHeight", id, node); + if (node && !this.heights[id]) { + var height = node.offsetHeight; if (this.heights[id] !== height) { this.heights[id] = height; this.onViewportUpdate(); @@ -1326,8 +1328,14 @@ var EventLogContents = function (_React$Component) { var _this3 = this; var vScroll = this.state.vScroll; - var events = this.props.events.slice(vScroll.start, vScroll.end).map(function (entry) { - return _react2.default.createElement(LogEntry, { entry: entry, key: entry.id, ref: _this3.setHeight.bind(_this3, entry.id) }); + var events = this.props.events.slice(vScroll.start, vScroll.end).map(function (event) { + return _react2.default.createElement(LogEntry, { + event: event, + key: event.id, + registerHeight: function registerHeight(node) { + return _this3.setHeight(event.id, node); + } + }); }); return _react2.default.createElement( diff --git a/web/src/js/components/eventlog.js b/web/src/js/components/eventlog.js index 0857056c4..95889a66a 100644 --- a/web/src/js/components/eventlog.js +++ b/web/src/js/components/eventlog.js @@ -7,15 +7,15 @@ import AutoScroll from "./helpers/AutoScroll"; import {calcVScroll} from "./helpers/VirtualScroll" import {ToggleButton} from "./common"; -function LogIcon({entry}) { - let icon = {web: "html5", debug: "bug"}[entry.level] || "info"; +function LogIcon({event}) { + let icon = {web: "html5", debug: "bug"}[event.level] || "info"; return } -function LogEntry({entry}) { - return
- - {entry.message} +function LogEntry({event, registerHeight}) { + return
+ + {event.message}
; } @@ -63,9 +63,10 @@ class EventLogContents extends React.Component { } } - setHeight(id, ref) { - if (ref && !this.heights[id]) { - const height = ReactDOM.findDOMNode(ref).offsetHeight; + setHeight(id, node) { + console.log("setHeight", id, node); + if (node && !this.heights[id]) { + const height = node.offsetHeight; if (this.heights[id] !== height) { this.heights[id] = height; this.onViewportUpdate(); @@ -77,8 +78,12 @@ class EventLogContents extends React.Component { const vScroll = this.state.vScroll; const events = this.props.events .slice(vScroll.start, vScroll.end) - .map(entry => - + .map(event => + this.setHeight(event.id, node)} + /> ); return (