From f306cfa8b6445dd04c5f7188d1a5022bcb747a62 Mon Sep 17 00:00:00 2001 From: Jason Date: Thu, 9 Jun 2016 17:46:14 +0800 Subject: [web] separate flowtable to multiple files --- mitmproxy/web/static/app.js | 80 +++++---- web/conf.js | 4 +- web/gulpfile.js | 1 + web/src/js/app.js | 41 ----- web/src/js/app.jsx | 41 +++++ web/src/js/components/FlowTable.jsx | 120 +++++++++++++ web/src/js/components/FlowTable/FlowColumns.jsx | 137 +++++++++++++++ web/src/js/components/FlowTable/FlowRow.jsx | 28 +++ web/src/js/components/FlowTable/FlowTableHead.jsx | 43 +++++ web/src/js/components/MainView.js | 191 -------------------- web/src/js/components/MainView.jsx | 200 +++++++++++++++++++++ web/src/js/components/ProxyApp.js | 169 ------------------ web/src/js/components/ProxyApp.jsx | 170 ++++++++++++++++++ web/src/js/components/flowtable-columns.js | 131 -------------- web/src/js/components/flowtable.js | 201 ---------------------- web/src/js/ducks/flows.js | 6 +- 16 files changed, 788 insertions(+), 775 deletions(-) delete mode 100644 web/src/js/app.js create mode 100644 web/src/js/app.jsx create mode 100644 web/src/js/components/FlowTable.jsx create mode 100644 web/src/js/components/FlowTable/FlowColumns.jsx create mode 100644 web/src/js/components/FlowTable/FlowRow.jsx create mode 100644 web/src/js/components/FlowTable/FlowTableHead.jsx delete mode 100644 web/src/js/components/MainView.js create mode 100644 web/src/js/components/MainView.jsx delete mode 100644 web/src/js/components/ProxyApp.js create mode 100644 web/src/js/components/ProxyApp.jsx delete mode 100644 web/src/js/components/flowtable-columns.js delete mode 100644 web/src/js/components/flowtable.js diff --git a/mitmproxy/web/static/app.js b/mitmproxy/web/static/app.js index f546e5f8..9473a0b6 100644 --- a/mitmproxy/web/static/app.js +++ b/mitmproxy/web/static/app.js @@ -4,94 +4,100 @@ function EventEmitter(){this._events=this._events||{},this._maxListeners=this._m },{}],2:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.Query=exports.FlowActions=exports.SettingsActions=exports.ConnectionActions=exports.StoreCmds=exports.ActionTypes=void 0;var _jquery=require("jquery"),_jquery2=_interopRequireDefault(_jquery),_dispatcher=require("./dispatcher.js"),_utils=require("./utils.js"),ActionTypes=exports.ActionTypes={CONNECTION_OPEN:"connection_open",CONNECTION_CLOSE:"connection_close",CONNECTION_ERROR:"connection_error",SETTINGS_STORE:"settings",EVENT_STORE:"events",FLOW_STORE:"flows"},StoreCmds=exports.StoreCmds={ADD:"add",UPDATE:"update",REMOVE:"remove",RESET:"reset"},ConnectionActions=exports.ConnectionActions={open:function(){_dispatcher.AppDispatcher.dispatchViewAction({type:ActionTypes.CONNECTION_OPEN})},close:function(){_dispatcher.AppDispatcher.dispatchViewAction({type:ActionTypes.CONNECTION_CLOSE})},error:function(){_dispatcher.AppDispatcher.dispatchViewAction({type:ActionTypes.CONNECTION_ERROR})}},SettingsActions=exports.SettingsActions={update:function(e){_jquery2["default"].ajax({type:"PUT",url:"/settings",contentType:"application/json",data:JSON.stringify(e)})}},FlowActions=exports.FlowActions={accept:function(e){_jquery2["default"].post("/flows/"+e.id+"/accept")},accept_all:function(){_jquery2["default"].post("/flows/accept")},"delete":function(e){_jquery2["default"].ajax({type:"DELETE",url:"/flows/"+e.id})},duplicate:function(e){_jquery2["default"].post("/flows/"+e.id+"/duplicate")},replay:function(e){_jquery2["default"].post("/flows/"+e.id+"/replay")},revert:function(e){_jquery2["default"].post("/flows/"+e.id+"/revert")},update:function(e,t){_jquery2["default"].ajax({type:"PUT",url:"/flows/"+e.id,contentType:"application/json",data:JSON.stringify(t)})},clear:function(){_jquery2["default"].post("/clear")},download:function(){return window.location="/flows/dump"},upload:function(e){var t=new FormData;t.append("file",e),(0,_utils.fetchApi)("/flows/dump",{method:"post",body:t})}},Query=exports.Query={SEARCH:"s",HIGHLIGHT:"h",SHOW_EVENTLOG:"e"}; -},{"./dispatcher.js":22,"./utils.js":32,"jquery":"jquery"}],3:[function(require,module,exports){ +},{"./dispatcher.js":24,"./utils.js":34,"jquery":"jquery"}],3:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}var _react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_redux=require("redux"),_reactRedux=require("react-redux"),_reduxLogger=require("redux-logger"),_reduxLogger2=_interopRequireDefault(_reduxLogger),_reduxThunk=require("redux-thunk"),_reduxThunk2=_interopRequireDefault(_reduxThunk),_reactRouter=require("react-router"),_connection=require("./connection"),_connection2=_interopRequireDefault(_connection),_ProxyApp=require("./components/ProxyApp"),_ProxyApp2=_interopRequireDefault(_ProxyApp),_MainView=require("./components/MainView"),_MainView2=_interopRequireDefault(_MainView),_index=require("./ducks/index"),_index2=_interopRequireDefault(_index),_eventLog=require("./ducks/eventLog"),store=(0,_redux.createStore)(_index2["default"],(0,_redux.applyMiddleware)(_reduxThunk2["default"],(0,_reduxLogger2["default"])()));window.addEventListener("error",function(e){store.dispatch((0,_eventLog.addLogEntry)(e))}),document.addEventListener("DOMContentLoaded",function(){window.ws=new _connection2["default"]("/updates",store.dispatch),(0,_reactDom.render)(_react2["default"].createElement(_reactRedux.Provider,{store:store},_react2["default"].createElement(_reactRouter.Router,{history:_reactRouter.hashHistory},_react2["default"].createElement(_reactRouter.Redirect,{from:"/",to:"/flows"}),_react2["default"].createElement(_reactRouter.Route,{path:"/",component:_ProxyApp2["default"]},_react2["default"].createElement(_reactRouter.Route,{path:"flows",component:_MainView2["default"]}),_react2["default"].createElement(_reactRouter.Route,{path:"flows/:flowId/:detailTab",component:_MainView2["default"]})))),document.getElementById("mitmproxy"))}); -},{"./components/MainView":4,"./components/ProxyApp":5,"./connection":21,"./ducks/eventLog":23,"./ducks/index":25,"react":"react","react-dom":"react-dom","react-redux":"react-redux","react-router":"react-router","redux":"redux","redux-logger":"redux-logger","redux-thunk":"redux-thunk"}],4:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var s=0;se&&(o=s.length-1),this.selectFlow(s[o])}},{key:"onMainKeyDown",value:function(e){var t=this.props.selectedFlow;if(!e.ctrlKey){switch(e.keyCode){case _utils.Key.K:case _utils.Key.UP:this.selectFlowRelative(-1);break;case _utils.Key.J:case _utils.Key.DOWN:this.selectFlowRelative(1);break;case _utils.Key.SPACE:case _utils.Key.PAGE_DOWN:this.selectFlowRelative(10);break;case _utils.Key.PAGE_UP:this.selectFlowRelative(-10);break;case _utils.Key.END:this.selectFlowRelative(1e10);break;case _utils.Key.HOME:this.selectFlowRelative(-1e10);break;case _utils.Key.ESC:this.selectFlow(null);break;case _utils.Key.H:case _utils.Key.LEFT:this.refs.flowDetails&&this.refs.flowDetails.nextTab(-1);break;case _utils.Key.L:case _utils.Key.TAB:case _utils.Key.RIGHT:this.refs.flowDetails&&this.refs.flowDetails.nextTab(1);break;case _utils.Key.C:e.shiftKey&&_actions.FlowActions.clear();break;case _utils.Key.D:t&&(e.shiftKey?_actions.FlowActions.duplicate(t):_actions.FlowActions["delete"](t));break;case _utils.Key.A:e.shiftKey?_actions.FlowActions.accept_all():t&&t.intercepted&&_actions.FlowActions.accept(t);break;case _utils.Key.R:!e.shiftKey&&t&&_actions.FlowActions.replay(t);break;case _utils.Key.V:e.shiftKey&&t&&t.modified&&_actions.FlowActions.revert(t);break;case _utils.Key.E:this.refs.flowDetails&&this.refs.flowDetails.promptEdit();break;case _utils.Key.SHIFT:break;default:return void console.debug("keydown",e.keyCode)}e.preventDefault()}}},{key:"render",value:function(){var e=this,t=this.props.selectedFlow;return _react2["default"].createElement("div",{className:"main-view"},_react2["default"].createElement(_flowtable2["default"],{ref:"flowTable",selectFlow:function(t){return e.selectFlow(t)},selected:t}),t&&[_react2["default"].createElement(_common.Splitter,{key:"splitter"}),_react2["default"].createElement(_index2["default"],{key:"flowDetails",ref:"flowDetails",tab:this.props.routeParams.detailTab,query:this.props.query,updateLocation:this.props.updateLocation,flow:t})])}}]),t}(_react.Component);exports["default"]=(0,_reactRedux.connect)(function(e){return{flows:e.flows.view,filter:e.flows.filter,highlight:e.flows.highlight,selectedFlow:e.flows.all.byId[e.flows.selected[0]]}},function(e){return{selectFlow:function(t){return e((0,_flows.selectFlow)(t))},setFilter:function(t){return e((0,_flows.setFilter)(t))},setHighlight:function(t){return e((0,_flows.setHighlight)(t))}}},void 0,{withRef:!0})(MainView); +},{"./components/MainView":8,"./components/ProxyApp":9,"./connection":23,"./ducks/eventLog":25,"./ducks/index":27,"react":"react","react-dom":"react-dom","react-redux":"react-redux","react-router":"react-router","redux":"redux","redux-logger":"redux-logger","redux-thunk":"redux-thunk"}],4:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var o=0;on-i?l.scrollTop=n-i:u>c+s&&(l.scrollTop=u-s)}}},{key:"componentWillReceiveProps",value:function(e){e.selected&&e.selected!==this.props.selected&&(this.shouldScrollIntoView=!0)}},{key:"onViewportUpdate",value:function(){var e=_reactDom2["default"].findDOMNode(this),t=e.scrollTop,o=(0,_VirtualScroll.calcVScroll)({viewportTop:t,viewportHeight:e.offsetHeight,itemCount:this.props.flows.length,rowHeight:this.props.rowHeight});this.state.viewportTop===t&&(0,_shallowequal2["default"])(this.state.vScroll,o)||this.setState({vScroll:o,viewportTop:t})}},{key:"render",value:function(){var e=this,t=this.state,o=t.vScroll,r=t.viewportTop,l=this.props,a=l.flows,i=l.selected,n=l.highlight,u=n?_filt2["default"].parse(n):function(){return!1};return _react2["default"].createElement("div",{className:"flow-table",onScroll:this.onViewportUpdate},_react2["default"].createElement("table",null,_react2["default"].createElement("thead",{ref:"head",style:{transform:"translateY("+r+"px)"}},_react2["default"].createElement(_FlowTableHead2["default"],null)),_react2["default"].createElement("tbody",null,_react2["default"].createElement("tr",{style:{height:o.paddingTop}}),a.slice(o.start,o.end).map(function(t){return _react2["default"].createElement(_FlowRow2["default"],{key:t.id,flow:t,selected:t===i,highlighted:u(t),onSelect:e.props.onSelect})}),_react2["default"].createElement("tr",{style:{height:o.paddingBottom}}))))}}]),t}(_react2["default"].Component);FlowTable.propTypes={onSelect:_react.PropTypes.func.isRequired,flows:_react.PropTypes.array.isRequired,rowHeight:_react.PropTypes.number,highlight:_react.PropTypes.string,selected:_react.PropTypes.object},FlowTable.defaultProps={rowHeight:32},exports["default"]=(0,_AutoScroll2["default"])(FlowTable); -},{"../actions.js":2,"../ducks/flows":24,"../utils.js":32,"./common.js":6,"./flowtable.js":10,"./flowview/index.js":13,"react":"react","react-redux":"react-redux"}],5:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var r=0;r=0?"resource-icon-image":t.indexOf("javascript")>=0?"resource-icon-js":t.indexOf("css")>=0?"resource-icon-css":t.indexOf("html")>=0?"resource-icon-document":"resource-icon-plain"},PathColumn.sortKeyFun=function(e){return _utils.RequestUtils.pretty_url(e.request)},PathColumn.headerClass="col-path",PathColumn.headerName="Path",MethodColumn.sortKeyFun=function(e){return e.request.method},MethodColumn.headerClass="col-method",MethodColumn.headerName="Method",StatusColumn.sortKeyFun=function(e){return e.response&&e.response.status_code},StatusColumn.headerClass="col-status",StatusColumn.headerName="Status",SizeColumn.sortKeyFun=function(e){var t=e.request.contentLength;return e.response&&(t+=e.response.contentLength||0),t},SizeColumn.getTotalSize=SizeColumn.sortKeyFun,SizeColumn.headerClass="col-size",SizeColumn.headerName="Size",TimeColumn.sortKeyFun=function(e){return e.response&&e.response.timestamp_end-e.request.timestamp_start},TimeColumn.headerClass="col-time",TimeColumn.headerName="Time",exports["default"]=[TLSColumn,IconColumn,PathColumn,MethodColumn,StatusColumn,SizeColumn,TimeColumn]; -},{"../store/store.js":31,"../utils.js":32,"./common.js":6,"./eventlog.js":8,"./footer.js":16,"./header.js":17,"lodash":"lodash","react":"react","react-dom":"react-dom","react-redux":"react-redux"}],6:[function(require,module,exports){ +},{"../../flow/utils.js":32,"../../utils.js":34,"classnames":"classnames","react":"react"}],6:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function FlowRow(e){var t=e.flow,r=e.selected,l=e.highlighted,o=e.onSelect,s=(0,_classnames2["default"])({selected:r,highlighted:l,intercepted:t.intercepted,"has-request":t.request,"has-response":t.response});return _react2["default"].createElement("tr",{className:s,onClick:function(){return o(t)}},_FlowColumns2["default"].map(function(e){return _react2["default"].createElement(e,{key:e.name,flow:t})}))}Object.defineProperty(exports,"__esModule",{value:!0}),exports["default"]=FlowRow;var _react=require("react"),_react2=_interopRequireDefault(_react),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_FlowColumns=require("./FlowColumns"),_FlowColumns2=_interopRequireDefault(_FlowColumns);FlowRow.propTypes={onSelect:_react.PropTypes.func.isRequired,flow:_react.PropTypes.object.isRequired,highlighted:_react.PropTypes.bool,selected:_react.PropTypes.bool}; + +},{"./FlowColumns":5,"classnames":"classnames","react":"react"}],7:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function FlowTableHead(e){function r(e){s({sortColumn:e.name,sortDesc:e.name!==t?!1:!o})}var t=e.sortColumn,o=e.sortDesc,s=e.onSort,u=o?"sort-desc":"sort-asc";return _react2["default"].createElement("tr",null,_FlowColumns2["default"].map(function(e){return _react2["default"].createElement("th",{className:(0,_classnames2["default"])(e.headerClass,t===e.name&&u),key:e.name,onClick:function(){return r(e)}},e.headerName)}))}Object.defineProperty(exports,"__esModule",{value:!0});var _react=require("react"),_react2=_interopRequireDefault(_react),_redux=require("redux"),_reactRedux=require("react-redux"),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_FlowColumns=require("./FlowColumns"),_FlowColumns2=_interopRequireDefault(_FlowColumns),_flows=require("../../ducks/flows");FlowTableHead.propTypes={onSort:_react.PropTypes.func.isRequired,sortDesc:_react2["default"].PropTypes.bool.isRequired,sortColumn:_react2["default"].PropTypes.string},exports["default"]=(0,_reactRedux.connect)(function(e){return{sortDesc:e.flows.sort.sortDesc,sortColumn:e.flows.sort.sortColumn}},function(e){return(0,_redux.bindActionCreators)({onSort:_flows.setSort},e)})(FlowTableHead); + +},{"../../ducks/flows":26,"./FlowColumns":5,"classnames":"classnames","react":"react","react-redux":"react-redux","redux":"redux"}],8:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var s=0;se&&(o=s.length-1),this.selectFlow(s[o])}},{key:"onMainKeyDown",value:function(e){var t=this.props.selectedFlow;if(!e.ctrlKey){switch(e.keyCode){case _utils.Key.K:case _utils.Key.UP:this.selectFlowRelative(-1);break;case _utils.Key.J:case _utils.Key.DOWN:this.selectFlowRelative(1);break;case _utils.Key.SPACE:case _utils.Key.PAGE_DOWN:this.selectFlowRelative(10);break;case _utils.Key.PAGE_UP:this.selectFlowRelative(-10);break;case _utils.Key.END:this.selectFlowRelative(1e10);break;case _utils.Key.HOME:this.selectFlowRelative(-1e10);break;case _utils.Key.ESC:this.selectFlow(null);break;case _utils.Key.H:case _utils.Key.LEFT:this.refs.flowDetails&&this.refs.flowDetails.nextTab(-1);break;case _utils.Key.L:case _utils.Key.TAB:case _utils.Key.RIGHT:this.refs.flowDetails&&this.refs.flowDetails.nextTab(1);break;case _utils.Key.C:e.shiftKey&&_actions.FlowActions.clear();break;case _utils.Key.D:t&&(e.shiftKey?_actions.FlowActions.duplicate(t):_actions.FlowActions["delete"](t));break;case _utils.Key.A:e.shiftKey?_actions.FlowActions.accept_all():t&&t.intercepted&&_actions.FlowActions.accept(t);break;case _utils.Key.R:!e.shiftKey&&t&&_actions.FlowActions.replay(t);break;case _utils.Key.V:e.shiftKey&&t&&t.modified&&_actions.FlowActions.revert(t);break;case _utils.Key.E:this.refs.flowDetails&&this.refs.flowDetails.promptEdit();break;case _utils.Key.SHIFT:break;default:return void console.debug("keydown",e.keyCode)}e.preventDefault()}}},{key:"render",value:function(){var e=this,t=this.props,s=t.flows,i=t.selectedFlow,l=t.highlight;t.sort;return _react2["default"].createElement("div",{className:"main-view"},_react2["default"].createElement(_FlowTable2["default"],{ref:"flowTable",flows:s,selected:i,highlight:l,onSelect:function(t){return e.selectFlow(t)}}),i&&[_react2["default"].createElement(_common.Splitter,{key:"splitter"}),_react2["default"].createElement(_index2["default"],{key:"flowDetails",ref:"flowDetails",tab:this.props.routeParams.detailTab,query:this.props.query,updateLocation:this.props.updateLocation,flow:i})])}}]),t}(_react.Component);MainView.propTypes={highlight:_react.PropTypes.string,sort:_react.PropTypes.object},exports["default"]=(0,_reactRedux.connect)(function(e){return{flows:e.flows.view,filter:e.flows.filter,sort:e.flows.sort,highlight:e.flows.highlight,selectedFlow:e.flows.all.byId[e.flows.selected[0]]}},function(e){return(0,_redux.bindActionCreators)({selectFlow:_flows.selectFlow,setFilter:_flows.setFilter,setHighlight:_flows.setHighlight},e)},void 0,{withRef:!0})(MainView); + +},{"../actions.js":2,"../ducks/flows":26,"../utils.js":34,"./FlowTable":4,"./common.js":10,"./flowview/index.js":15,"react":"react","react-redux":"react-redux","redux":"redux"}],9:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var r=0;r0)e=o.getRangeAt(0);else if(document.caretPositionFromPoint&&t.clientX&&t.clientY){var n=document.caretPositionFromPoint(t.clientX,t.clientY);e=document.createRange(),e.setStart(n.offsetNode,n.offset)}else document.caretRangeFromPoint&&t.clientX&&t.clientY?e=document.caretRangeFromPoint(t.clientX,t.clientY):(e=document.createRange(),e.selectNodeContents(_reactDom2["default"].findDOMNode(this)));this._ignore_events=!0,this.setState({editable:!0},function(){var t=_reactDom2["default"].findDOMNode(this);t.blur(),t.focus(),this._ignore_events=!1})}},stop:function(){_reactDom2["default"].findDOMNode(this).blur(),this.props.onStop&&this.props.onStop()},_stop:function(t){if(!this._ignore_events){console.log("_stop",_.extend({},t)),window.getSelection().removeAllRanges();var e=_reactDom2["default"].findDOMNode(this),o=this.props.nodeToContent(e);this.setState({editable:!1}),this.props.onDone(o),this.props.onBlur&&this.props.onBlur(t)}},reset:function(){_reactDom2["default"].findDOMNode(this).innerHTML=this.props.contentToHtml(this.props.content)},onKeyDown:function(t){switch(t.stopPropagation(),t.keyCode){case _utils.Key.ESC:t.preventDefault(),this.reset(),this.stop();break;case _utils.Key.ENTER:this.props.submitOnEnter&&!t.shiftKey&&(t.preventDefault(),this.stop())}},onInput:function(){var t=_reactDom2["default"].findDOMNode(this),e=this.props.nodeToContent(t);this.props.onInput&&this.props.onInput(e)}}),ValidateEditor=_react2["default"].createClass({displayName:"ValidateEditor",propTypes:{content:_react2["default"].PropTypes.string.isRequired,onDone:_react2["default"].PropTypes.func.isRequired,onInput:_react2["default"].PropTypes.func,isValid:_react2["default"].PropTypes.func,className:_react2["default"].PropTypes.string},getInitialState:function(){return{currentContent:this.props.content}},componentWillReceiveProps:function(){this.setState({currentContent:this.props.content})},onInput:function(t){this.setState({currentContent:t}),this.props.onInput&&this.props.onInput(t)},render:function(){var t=this.props.className||"";return this.props.isValid&&(t+=this.props.isValid(this.state.currentContent)?" has-success":" has-warning"),_react2["default"].createElement(EditorBase,_extends({},this.props,{ref:"editor",className:t,onDone:this.onDone,onInput:this.onInput}))},onDone:function(t){this.props.isValid&&!this.props.isValid(t)&&(this.refs.editor.reset(),t=this.props.content),this.props.onDone(t)}}),ValueEditor=exports.ValueEditor=_react2["default"].createClass({displayName:"ValueEditor",contextTypes:{returnFocus:_react2["default"].PropTypes.func},propTypes:{content:_react2["default"].PropTypes.string.isRequired,onDone:_react2["default"].PropTypes.func.isRequired,inline:_react2["default"].PropTypes.bool},render:function(){var t=this.props.inline?"span":"div";return _react2["default"].createElement(ValidateEditor,_extends({},this.props,{onStop:this.onStop,tag:t}))},focus:function(){_reactDom2["default"].findDOMNode(this).focus()},onStop:function(){this.context.returnFocus()}}); -},{"../utils.js":32,"react":"react","react-dom":"react-dom"}],8:[function(require,module,exports){ +},{"../utils.js":34,"react":"react","react-dom":"react-dom"}],12:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function LogIcon(e){var t=e.event,n={web:"html5",debug:"bug"}[t.level]||"info";return _react2["default"].createElement("i",{className:"fa fa-fw fa-"+n})}function LogEntry(e){var t=e.event,n=e.registerHeight;return _react2["default"].createElement("div",{ref:n},_react2["default"].createElement(LogIcon,{event:t}),t.message)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.ToggleEventLog=void 0;var _createClass=function(){function e(e,t){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(e,r)&&(o[r]=e[r]);return o}function TLSColumn(e){var t=e.flow,o="https"===t.request.scheme,r=void 0;return r=o?"col-tls col-tls-https":"col-tls col-tls-http",_react2["default"].createElement("td",{className:r})}function IconColumn(e){var t=e.flow,o=void 0;if(t.response){var r=_utils.ResponseUtils.getContentType(t.response);304===t.response.status_code?o="resource-icon-not-modified":300<=t.response.status_code&&t.response.status_code<400?o="resource-icon-redirect":r&&r.indexOf("image")>=0?o="resource-icon-image":r&&r.indexOf("javascript")>=0?o="resource-icon-js":r&&r.indexOf("css")>=0?o="resource-icon-css":r&&r.indexOf("html")>=0&&(o="resource-icon-document")}return o||(o="resource-icon-plain"),o+=" resource-icon",_react2["default"].createElement("td",{className:"col-icon"},_react2["default"].createElement("div",{className:o}))}function PathColumn(e){var t=e.flow;return _react2["default"].createElement("td",{className:"col-path"},t.request.is_replay?_react2["default"].createElement("i",{className:"fa fa-fw fa-repeat pull-right"}):null,t.intercepted?_react2["default"].createElement("i",{className:"fa fa-fw fa-pause pull-right"}):null,_utils.RequestUtils.pretty_url(t.request))}function MethodColumn(e){var t=e.flow;return _react2["default"].createElement("td",{className:"col-method"},t.request.method)}function StatusColumn(e){var t=e.flow,o=void 0;return o=t.response?t.response.status_code:null,_react2["default"].createElement("td",{className:"col-status"},o)}function SizeColumn(e){var t=e.flow,o=t.request.contentLength;t.response&&(o+=t.response.contentLength||0);var r=(0,_utils2.formatSize)(o);return _react2["default"].createElement("td",{className:"col-size"},r)}function TimeColumn(e){var t=e.flow,o=void 0;return o=t.response?(0,_utils2.formatTimeDelta)(1e3*(t.response.timestamp_end-t.request.timestamp_start)):"...",_react2["default"].createElement("td",{className:"col-time"},o)}Object.defineProperty(exports,"__esModule",{value:!0});var _extends=Object.assign||function(e){for(var t=1;t=0}})(FlowRow);FlowTableHead.propTypes={setSort:_react2["default"].PropTypes.func.isRequired,sort:_react2["default"].PropTypes.object.isRequired,columns:_react2["default"].PropTypes.array.isRequired};var FlowTableHeadContainer=(0,_reactRedux.connect)(function(e){return{sort:e.flows.sort}},function(e){return{setSort:function(t){return e((0,_flows.setSort)(t))}}})(FlowTableHead),FlowTable=function(e){function t(e,r){_classCallCheck(this,t);var o=_possibleConstructorReturn(this,Object.getPrototypeOf(t).call(this,e,r));return o.state={vScroll:(0,_VirtualScroll.calcVScroll)()},o.onViewportUpdate=o.onViewportUpdate.bind(o),o}return _inherits(t,e),_createClass(t,[{key:"componentWillMount",value:function(){window.addEventListener("resize",this.onViewportUpdate)}},{key:"componentWillUnmount",value:function(){window.removeEventListener("resize",this.onViewportUpdate)}},{key:"componentWillReceiveProps",value:function(e){var t=this;e.selected&&e.selected!==this.props.selected&&window.setTimeout(function(){return t.scrollIntoView(e.selected)},1)}},{key:"componentDidUpdate",value:function(){this.onViewportUpdate()}},{key:"onViewportUpdate",value:function(){var e=_reactDom2["default"].findDOMNode(this),t=e.scrollTop,r=(0,_VirtualScroll.calcVScroll)({viewportTop:t,viewportHeight:e.offsetHeight,itemCount:this.props.flows.length,rowHeight:this.props.rowHeight});(0,_shallowequal2["default"])(this.state.vScroll,r)&&this.state.viewportTop===t||this.setState({vScroll:r,viewportTop:t})}},{key:"scrollIntoView",value:function(e){var t=_reactDom2["default"].findDOMNode(this),r=this.props.flows.indexOf(e),o=this.props.rowHeight,l=_reactDom2["default"].findDOMNode(this.refs.head),a=l?l.offsetHeight:0,n=r*o+a,s=n+o,i=t.scrollTop,u=t.offsetHeight;i>n-a?t.scrollTop=n-a:s>i+u&&(t.scrollTop=s-u)}},{key:"render",value:function(){var e=this,t=this.state.vScroll,r=this.props.flows.slice(t.start,t.end),o="translate(0,"+this.state.viewportTop+"px)";return _react2["default"].createElement("div",{className:"flow-table",onScroll:this.onViewportUpdate},_react2["default"].createElement("table",null,_react2["default"].createElement("thead",{ref:"head",style:{transform:o}},_react2["default"].createElement(FlowTableHeadContainer,{columns:_flowtableColumns2["default"],setSortKeyFun:this.props.setSortKeyFun,setSort:this.props.setSort})),_react2["default"].createElement("tbody",null,_react2["default"].createElement("tr",{style:{height:t.paddingTop}}),r.map(function(t){return _react2["default"].createElement(FlowRowContainer,{key:t.id,flowId:t.id,columns:_flowtableColumns2["default"],selectFlow:e.props.selectFlow})}),_react2["default"].createElement("tr",{style:{height:t.paddingBottom}}))))}}]),t}(_react2["default"].Component);FlowTable.propTypes={rowHeight:_react2["default"].PropTypes.number},FlowTable.defaultProps={rowHeight:32},FlowTable=(0,_AutoScroll2["default"])(FlowTable);var parseFilter=_lodash2["default"].memoize(_filt2["default"].parse),FlowTableContainer=(0,_reactRedux.connect)(function(e){return{flows:e.flows.view}})(FlowTable);exports["default"]=FlowTableContainer; - -},{"../ducks/flows":24,"../filt/filt":29,"./flowtable-columns.js":9,"./helpers/AutoScroll":18,"./helpers/VirtualScroll":19,"classnames":"classnames","lodash":"lodash","react":"react","react-dom":"react-dom","react-redux":"react-redux","shallowequal":"shallowequal"}],11:[function(require,module,exports){ +},{"../ducks/eventLog":25,"./common":10,"./helpers/AutoScroll":20,"./helpers/VirtualScroll":21,"react":"react","react-dom":"react-dom","react-redux":"react-redux","shallowequal":"shallowequal"}],13:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0});var _extends=Object.assign||function(e){for(var t=1;t1048576*t}},render:function(){var e=(0,_utils2.formatSize)(this.props.message.contentLength);return _react2["default"].createElement("div",{className:"alert alert-warning"},_react2["default"].createElement("button",{onClick:this.props.onClick,className:"btn btn-xs btn-warning pull-right"},"Display anyway"),e," content size.")}}),ViewSelector=_react2["default"].createClass({displayName:"ViewSelector",render:function(){for(var e=[],t=0;t0&&(r.preventDefault(),this.refs[e-1+"-value"].focus())},render:function(){var e=this.props.message.headers.map(function(e,t){var r=_react2["default"].createElement(HeaderEditor,{ref:t+"-key",content:e[0],onDone:this.onChange.bind(null,t,0),onRemove:this.onRemove.bind(null,t,0),onTab:this.onTab.bind(null,t,0)}),s=_react2["default"].createElement(HeaderEditor,{ref:t+"-value",content:e[1],onDone:this.onChange.bind(null,t,1),onRemove:this.onRemove.bind(null,t,1),onTab:this.onTab.bind(null,t,1)});return _react2["default"].createElement("tr",{key:t},_react2["default"].createElement("td",{className:"header-name"},r,":"),_react2["default"].createElement("td",{className:"header-value"},s))}.bind(this));return _react2["default"].createElement("table",{className:"header-table"},_react2["default"].createElement("tbody",null,e))}}),HeaderEditor=_react2["default"].createClass({displayName:"HeaderEditor",render:function(){return _react2["default"].createElement(_editor.ValueEditor,_extends({ref:"input"},this.props,{onKeyDown:this.onKeyDown,inline:!0}))},focus:function(){_reactDom2["default"].findDOMNode(this).focus()},onKeyDown:function(e){switch(e.keyCode){case _utils2.Key.BACKSPACE:var t=window.getSelection().getRangeAt(0);0===t.startOffset&&0===t.endOffset&&this.props.onRemove(e);break;case _utils2.Key.TAB:e.shiftKey||this.props.onTab(e)}}}),RequestLine=_react2["default"].createClass({displayName:"RequestLine",render:function(){var e=this.props.flow,t=_utils.RequestUtils.pretty_url(e.request),r=e.request.http_version;return _react2["default"].createElement("div",{className:"first-line request-line"},_react2["default"].createElement(_editor.ValueEditor,{ref:"method",content:e.request.method,onDone:this.onMethodChange,inline:!0})," ",_react2["default"].createElement(_editor.ValueEditor,{ref:"url",content:t,onDone:this.onUrlChange,isValid:this.isValidUrl,inline:!0})," ",_react2["default"].createElement(_editor.ValueEditor,{ref:"httpVersion",content:r,onDone:this.onHttpVersionChange,isValid:_utils.isValidHttpVersion,inline:!0}))},isValidUrl:function(e){var t=(0,_utils.parseUrl)(e);return!!t.host},onMethodChange:function(e){_actions.FlowActions.update(this.props.flow,{request:{method:e}})},onUrlChange:function(e){var t=(0,_utils.parseUrl)(e);t.path=t.path||"",_actions.FlowActions.update(this.props.flow,{request:t})},onHttpVersionChange:function(e){var t=(0,_utils.parseHttpVersion)(e);_actions.FlowActions.update(this.props.flow,{request:{http_version:t}})}}),ResponseLine=_react2["default"].createClass({displayName:"ResponseLine",render:function(){var e=this.props.flow,t=e.response.http_version;return _react2["default"].createElement("div",{className:"first-line response-line"},_react2["default"].createElement(_editor.ValueEditor,{ref:"httpVersion",content:t,onDone:this.onHttpVersionChange,isValid:_utils.isValidHttpVersion,inline:!0})," ",_react2["default"].createElement(_editor.ValueEditor,{ref:"code",content:e.response.status_code+"",onDone:this.onCodeChange,isValid:this.isValidCode,inline:!0})," ",_react2["default"].createElement(_editor.ValueEditor,{ref:"msg",content:e.response.reason,onDone:this.onMsgChange,inline:!0}))},isValidCode:function(e){return/^\d+$/.test(e)},onHttpVersionChange:function(e){var t=(0,_utils.parseHttpVersion)(e);_actions.FlowActions.update(this.props.flow,{response:{http_version:t}})},onMsgChange:function(e){_actions.FlowActions.update(this.props.flow,{response:{msg:e}})},onCodeChange:function(e){e=parseInt(e),_actions.FlowActions.update(this.props.flow,{response:{code:e}})}}),Request=exports.Request=_react2["default"].createClass({displayName:"Request",render:function(){var e=this.props.flow;return _react2["default"].createElement("section",{className:"request"},_react2["default"].createElement(RequestLine,{ref:"requestLine",flow:e}),_react2["default"].createElement(Headers,{ref:"headers",message:e.request,onChange:this.onHeaderChange}),_react2["default"].createElement("hr",null),_react2["default"].createElement(_contentview2["default"],{flow:e,message:e.request}))},edit:function(e){switch(e){case"m":this.refs.requestLine.refs.method.focus();break;case"u":this.refs.requestLine.refs.url.focus();break;case"v":this.refs.requestLine.refs.httpVersion.focus();break;case"h":this.refs.headers.edit();break;default:throw"Unimplemented: "+e}},onHeaderChange:function(e){_actions.FlowActions.update(this.props.flow,{request:{headers:e}})}}),Response=exports.Response=_react2["default"].createClass({displayName:"Response",render:function(){var e=this.props.flow;return _react2["default"].createElement("section",{className:"response"},_react2["default"].createElement(ResponseLine,{ref:"responseLine",flow:e}),_react2["default"].createElement(Headers,{ref:"headers",message:e.response,onChange:this.onHeaderChange}),_react2["default"].createElement("hr",null),_react2["default"].createElement(_contentview2["default"],{flow:e,message:e.response}))},edit:function(e){switch(e){case"c":this.refs.responseLine.refs.status_code.focus();break;case"m":this.refs.responseLine.refs.msg.focus();break;case"v":this.refs.responseLine.refs.httpVersion.focus();break;case"h":this.refs.headers.edit();break;default:throw"Unimplemented: "+e}},onHeaderChange:function(e){_actions.FlowActions.update(this.props.flow,{response:{headers:e}})}}),Error=exports.Error=_react2["default"].createClass({displayName:"Error",render:function(){var e=this.props.flow;return _react2["default"].createElement("section",null,_react2["default"].createElement("div",{className:"alert alert-warning"},e.error.msg,_react2["default"].createElement("div",null,_react2["default"].createElement("small",null,(0,_utils2.formatTimeStamp)(e.error.timestamp)))))}}); -},{"../../actions.js":2,"../../flow/utils.js":30,"../../utils.js":32,"../editor.js":7,"./contentview.js":11,"lodash":"lodash","react":"react","react-dom":"react-dom"}],15:[function(require,module,exports){ +},{"../../actions.js":2,"../../flow/utils.js":32,"../../utils.js":34,"../editor.js":11,"./contentview.js":13,"lodash":"lodash","react":"react","react-dom":"react-dom"}],17:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0});var _react=require("react"),_react2=_interopRequireDefault(_react),_actions=require("../../actions.js"),NavAction=_react2["default"].createClass({displayName:"NavAction",onClick:function(e){e.preventDefault(),this.props.onClick()},render:function(){return _react2["default"].createElement("a",{title:this.props.title,href:"#",className:"nav-action",onClick:this.onClick},_react2["default"].createElement("i",{className:"fa fa-fw "+this.props.icon}))}}),Nav=_react2["default"].createClass({displayName:"Nav",render:function(){var e=this.props.flow,t=this.props.tabs.map(function(e){var t=e.charAt(0).toUpperCase()+e.slice(1),a=this.props.active===e?"active":"",c=function(t){this.props.selectTab(e),t.preventDefault()}.bind(this);return _react2["default"].createElement("a",{key:e,href:"#",className:a,onClick:c},t)}.bind(this)),a=null;e.intercepted&&(a=_react2["default"].createElement(NavAction,{title:"[a]ccept intercepted flow",icon:"fa-play",onClick:_actions.FlowActions.accept.bind(null,e)}));var c=null;return e.modified&&(c=_react2["default"].createElement(NavAction,{title:"revert changes to flow [V]",icon:"fa-history",onClick:_actions.FlowActions.revert.bind(null,e)})),_react2["default"].createElement("nav",{ref:"head",className:"nav-tabs nav-tabs-sm"},t,_react2["default"].createElement(NavAction,{title:"[d]elete flow",icon:"fa-trash",onClick:_actions.FlowActions["delete"].bind(null,e)}),_react2["default"].createElement(NavAction,{title:"[D]uplicate flow",icon:"fa-copy",onClick:_actions.FlowActions.duplicate.bind(null,e)}),_react2["default"].createElement(NavAction,{disabled:!0,title:"[r]eplay flow",icon:"fa-repeat",onClick:_actions.FlowActions.replay.bind(null,e)}),a,c)}});exports["default"]=Nav; -},{"../../actions.js":2,"react":"react"}],16:[function(require,module,exports){ +},{"../../actions.js":2,"react":"react"}],18:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function Footer(e){var a=e.settings,t=a.mode,s=a.intercept,l=a.showhost,c=a.no_upstream_cert,r=a.rawtcp,u=a.http2,n=a.anticache,o=a.anticomp,m=a.stickyauth,p=a.stickycookie,i=a.stream;return _react2["default"].createElement("footer",null,t&&"regular"!=t&&_react2["default"].createElement("span",{className:"label label-success"},t," mode"),s&&_react2["default"].createElement("span",{className:"label label-success"},"Intercept: ",s),l&&_react2["default"].createElement("span",{className:"label label-success"},"showhost"),c&&_react2["default"].createElement("span",{className:"label label-success"},"no-upstream-cert"),r&&_react2["default"].createElement("span",{className:"label label-success"},"raw-tcp"),!u&&_react2["default"].createElement("span",{className:"label label-success"},"no-http2"),n&&_react2["default"].createElement("span",{className:"label label-success"},"anticache"),o&&_react2["default"].createElement("span",{className:"label label-success"},"anticomp"),m&&_react2["default"].createElement("span",{className:"label label-success"},"stickyauth: ",m),p&&_react2["default"].createElement("span",{className:"label label-success"},"stickycookie: ",p),i&&_react2["default"].createElement("span",{className:"label label-success"},"stream: ",(0,_utils.formatSize)(i)))}Object.defineProperty(exports,"__esModule",{value:!0}),exports["default"]=Footer;var _react=require("react"),_react2=_interopRequireDefault(_react),_utils=require("../utils.js"),_common=require("./common.js");Footer.propTypes={settings:_react2["default"].PropTypes.object.isRequired}; -},{"../utils.js":32,"./common.js":6,"react":"react"}],17:[function(require,module,exports){ +},{"../utils.js":34,"./common.js":10,"react":"react"}],19:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.Header=exports.OptionMenu=exports.MainMenu=void 0;var _react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_jquery=require("jquery"),_jquery2=_interopRequireDefault(_jquery),_reactRedux=require("react-redux"),_filt=require("../filt/filt.js"),_filt2=_interopRequireDefault(_filt),_utils=require("../utils.js"),_common=require("./common.js"),_actions=require("../actions.js"),_eventlog=require("./eventlog"),FilterDocs=_react2["default"].createClass({displayName:"FilterDocs",statics:{xhr:!1,doc:!1},componentWillMount:function(){FilterDocs.doc||(FilterDocs.xhr=_jquery2["default"].getJSON("/filter-help").done(function(e){FilterDocs.doc=e,FilterDocs.xhr=!1})),FilterDocs.xhr&&FilterDocs.xhr.done(function(){this.forceUpdate()}.bind(this))},render:function(){if(FilterDocs.doc){var e=FilterDocs.doc.commands.map(function(e){return _react2["default"].createElement("tr",{key:e[1]},_react2["default"].createElement("td",null,e[0].replace(" "," ")),_react2["default"].createElement("td",null,e[1]))});return e.push(_react2["default"].createElement("tr",{key:"docs-link"},_react2["default"].createElement("td",{colSpan:"2"},_react2["default"].createElement("a",{href:"http://docs.mitmproxy.org/en/stable/features/filters.html",target:"_blank"},_react2["default"].createElement("i",{className:"fa fa-external-link"}),"  mitmproxy docs")))),_react2["default"].createElement("table",{className:"table table-condensed"},_react2["default"].createElement("tbody",null,e))}return _react2["default"].createElement("i",{className:"fa fa-spinner fa-spin"})}}),FilterInput=_react2["default"].createClass({displayName:"FilterInput",contextTypes:{returnFocus:_react2["default"].PropTypes.func},getInitialState:function(){return{value:this.props.value,focus:!1,mousefocus:!1}},componentWillReceiveProps:function(e){this.setState({value:e.value})},onChange:function(e){var t=e.target.value;this.setState({value:t}),this.isValid(t)&&this.props.onChange(t)},isValid:function(e){try{var t=e||this.state.value;return t&&_filt2["default"].parse(e||this.state.value),!0}catch(a){return!1}},getDesc:function(){if(this.state.value)try{return _filt2["default"].parse(this.state.value).desc}catch(e){return""+e}return _react2["default"].createElement(FilterDocs,null)},onFocus:function(){this.setState({focus:!0})},onBlur:function(){this.setState({focus:!1})},onMouseEnter:function(){this.setState({mousefocus:!0})},onMouseLeave:function(){this.setState({mousefocus:!1})},onKeyDown:function(e){e.keyCode!==_utils.Key.ESC&&e.keyCode!==_utils.Key.ENTER||(this.blur(),this.setState({mousefocus:!1})),e.stopPropagation()},blur:function(){_reactDom2["default"].findDOMNode(this.refs.input).blur(),this.context.returnFocus()},select:function(){_reactDom2["default"].findDOMNode(this.refs.input).select()},render:function(){var e,t=this.isValid(),a="fa fa-fw fa-"+this.props.type,n="filter-input input-group"+(t?"":" has-error");return(this.state.focus||this.state.mousefocus)&&(e=_react2["default"].createElement("div",{className:"popover bottom",onMouseEnter:this.onMouseEnter,onMouseLeave:this.onMouseLeave},_react2["default"].createElement("div",{className:"arrow"}),_react2["default"].createElement("div",{className:"popover-content"},this.getDesc()))),_react2["default"].createElement("div",{className:n},_react2["default"].createElement("span",{className:"input-group-addon"},_react2["default"].createElement("i",{className:a,style:{color:this.props.color}})),_react2["default"].createElement("input",{type:"text",placeholder:this.props.placeholder,className:"form-control",ref:"input",onChange:this.onChange,onFocus:this.onFocus,onBlur:this.onBlur,onKeyDown:this.onKeyDown,value:this.state.value}),e)}}),MainMenu=exports.MainMenu=_react2["default"].createClass({displayName:"MainMenu",propTypes:{settings:_react2["default"].PropTypes.object.isRequired},statics:{title:"Start",route:"flows"},onSearchChange:function(e){var t={};t[_actions.Query.SEARCH]=e,this.props.updateLocation(void 0,t)},onHighlightChange:function(e){var t={};t[_actions.Query.HIGHLIGHT]=e,this.props.updateLocation(void 0,t)},onInterceptChange:function(e){_actions.SettingsActions.update({intercept:e})},render:function(){var e=this.props.query[_actions.Query.SEARCH]||"",t=this.props.query[_actions.Query.HIGHLIGHT]||"",a=this.props.settings.intercept||"";return _react2["default"].createElement("div",null,_react2["default"].createElement("div",{className:"menu-row"},_react2["default"].createElement(FilterInput,{ref:"search",placeholder:"Search",type:"search",color:"black",value:e,onChange:this.onSearchChange}),_react2["default"].createElement(FilterInput,{ref:"highlight",placeholder:"Highlight",type:"tag",color:"hsl(48, 100%, 50%)",value:t,onChange:this.onHighlightChange}),_react2["default"].createElement(FilterInput,{ref:"intercept",placeholder:"Intercept",type:"pause",color:"hsl(208, 56%, 53%)",value:a,onChange:this.onInterceptChange})),_react2["default"].createElement("div",{className:"clearfix"}))}}),ViewMenu=_react2["default"].createClass({displayName:"ViewMenu",statics:{title:"View",route:"flows"},render:function(){return _react2["default"].createElement("div",null,_react2["default"].createElement("div",{className:"menu-row"},_react2["default"].createElement(_eventlog.ToggleEventLog,{text:"Show Event Log"})),_react2["default"].createElement("div",{className:"clearfix"}))}}),OptionMenu=exports.OptionMenu=function(e){var t=e.settings,a=(t.mode,t.intercept,t.showhost),n=t.no_upstream_cert,r=t.rawtcp,l=t.http2,c=t.anticache,i=t.anticomp,o=t.stickycookie,s=t.stickyauth,u=t.stream;return _react2["default"].createElement("div",null,_react2["default"].createElement("div",{className:"menu-row"},_react2["default"].createElement(_common.ToggleButton,{text:"showhost",checked:a,onToggle:function(){return _actions.SettingsActions.update({showhost:!a})}}),_react2["default"].createElement(_common.ToggleButton,{text:"no_upstream_cert",checked:n,onToggle:function(){return _actions.SettingsActions.update({no_upstream_cert:!n})}}),_react2["default"].createElement(_common.ToggleButton,{text:"rawtcp",checked:r,onToggle:function(){return _actions.SettingsActions.update({rawtcp:!r})}}),_react2["default"].createElement(_common.ToggleButton,{text:"http2",checked:l,onToggle:function(){return _actions.SettingsActions.update({http2:!l})}}),_react2["default"].createElement(_common.ToggleButton,{text:"anticache",checked:c,onToggle:function(){return _actions.SettingsActions.update({anticache:!c})}}),_react2["default"].createElement(_common.ToggleButton,{text:"anticomp",checked:i,onToggle:function(){return _actions.SettingsActions.update({anticomp:!i})}}),_react2["default"].createElement(_common.ToggleInputButton,{name:"stickyauth",placeholder:"Sticky auth filter",checked:Boolean(s),txt:s||"",onToggleChanged:function(e){return _actions.SettingsActions.update({stickyauth:s?null:e})}}),_react2["default"].createElement(_common.ToggleInputButton,{name:"stickycookie",placeholder:"Sticky cookie filter",checked:Boolean(o),txt:o||"",onToggleChanged:function(e){return _actions.SettingsActions.update({stickycookie:o?null:e})}}),_react2["default"].createElement(_common.ToggleInputButton,{name:"stream",placeholder:"stream...",checked:Boolean(u),txt:u||"",inputType:"number",onToggleChanged:function(e){return _actions.SettingsActions.update({stream:u?null:e})}})),_react2["default"].createElement("div",{className:"clearfix"}))};OptionMenu.title="Options",OptionMenu.propTypes={settings:_react2["default"].PropTypes.object.isRequired};var ReportsMenu=_react2["default"].createClass({displayName:"ReportsMenu",statics:{title:"Visualization",route:"reports"},render:function(){return _react2["default"].createElement("div",null,"Reports Menu")}}),FileMenu=_react2["default"].createClass({displayName:"FileMenu",getInitialState:function(){return{showFileMenu:!1}},handleFileClick:function(e){if(e.preventDefault(),!this.state.showFileMenu){var t=function(){this.setState({showFileMenu:!1}),document.removeEventListener("click",t)}.bind(this);document.addEventListener("click",t),this.setState({showFileMenu:!0})}},handleNewClick:function(e){e.preventDefault(),confirm("Delete all flows?")&&_actions.FlowActions.clear()},handleOpenClick:function(e){this.fileInput.click(),e.preventDefault()},handleOpenFile:function(e){e.target.files.length>0&&(_actions.FlowActions.upload(e.target.files[0]),this.fileInput.value=""),e.preventDefault()},handleSaveClick:function(e){e.preventDefault(),_actions.FlowActions.download()},handleShutdownClick:function(e){e.preventDefault(),console.error("unimplemented: handleShutdownClick")},render:function(){var e=this,t="dropdown pull-left"+(this.state.showFileMenu?" open":"");return _react2["default"].createElement("div",{className:t},_react2["default"].createElement("a",{href:"#",className:"special",onClick:this.handleFileClick}," mitmproxy "),_react2["default"].createElement("ul",{className:"dropdown-menu",role:"menu"},_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"#",onClick:this.handleNewClick},_react2["default"].createElement("i",{className:"fa fa-fw fa-file"}),"New")),_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"#",onClick:this.handleOpenClick},_react2["default"].createElement("i",{className:"fa fa-fw fa-folder-open"}),"Open..."),_react2["default"].createElement("input",{ref:function(t){return e.fileInput=t},className:"hidden",type:"file",onChange:this.handleOpenFile})),_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"#",onClick:this.handleSaveClick},_react2["default"].createElement("i",{className:"fa fa-fw fa-floppy-o"}),"Save...")),_react2["default"].createElement("li",{role:"presentation",className:"divider"}),_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"http://mitm.it/",target:"_blank"},_react2["default"].createElement("i",{className:"fa fa-fw fa-external-link"}),"Install Certificates..."))))}}),header_entries=[MainMenu,ViewMenu,OptionMenu],Header=exports.Header=_react2["default"].createClass({displayName:"Header",propTypes:{settings:_react2["default"].PropTypes.object.isRequired},getInitialState:function(){return{active:header_entries[0]}},handleClick:function(e,t){t.preventDefault(),this.props.updateLocation(e.route),this.setState({active:e})},render:function(){var e=header_entries.map(function(e,t){var a;return a=e===this.state.active?"active":"",_react2["default"].createElement("a",{key:t,href:"#",className:a,onClick:this.handleClick.bind(this,e)},e.title)}.bind(this));return _react2["default"].createElement("header",null,_react2["default"].createElement("nav",{className:"nav-tabs nav-tabs-lg"},_react2["default"].createElement(FileMenu,null),e),_react2["default"].createElement("div",{className:"menu"},_react2["default"].createElement(this.state.active,{settings:this.props.settings,updateLocation:this.props.updateLocation,query:this.props.query})))}}); -},{"../actions.js":2,"../filt/filt.js":29,"../utils.js":32,"./common.js":6,"./eventlog":8,"jquery":"jquery","react":"react","react-dom":"react-dom","react-redux":"react-redux"}],18:[function(require,module,exports){ +},{"../actions.js":2,"../filt/filt.js":31,"../utils.js":34,"./common.js":10,"./eventlog":12,"jquery":"jquery","react":"react","react-dom":"react-dom","react-redux":"react-redux"}],20:[function(require,module,exports){ "use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function t(t,e){for(var o=0;oh;h++){var m=i[h]||o;r>=s&&h%2===0&&(d=s,n=h),l>=s?c=h+1:p+=m,s+=m}else n=-2&Math.max(0,Math.floor(r/o)-1),c=Math.min(e,n+Math.ceil(a/o)+2),d=Math.min(n,e)*o,p=Math.max(0,e-c)*o;return{start:n,end:c,paddingTop:d,paddingBottom:p}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.calcVScroll=calcVScroll; -},{}],20:[function(require,module,exports){ +},{}],22:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0});var _react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_lodash=require("lodash"),_lodash2=_interopRequireDefault(_lodash),_utils=require("../utils.js"),Prompt=_react2["default"].createClass({displayName:"Prompt",contextTypes:{returnFocus:_react2["default"].PropTypes.func},propTypes:{options:_react2["default"].PropTypes.array.isRequired,done:_react2["default"].PropTypes.func.isRequired,prompt:_react2["default"].PropTypes.string},componentDidMount:function(){_reactDom2["default"].findDOMNode(this).focus()},onKeyDown:function(e){e.stopPropagation(),e.preventDefault();for(var t=this.getOptions(),r=0;r0&&t(n[0]);)n=n.substr(1);o={text:o,key:n[0]}}if(!o.text||!o.key||t(o.key))throw"invalid options";e.push(o)}return e},render:function(){var e=this.getOptions();return e=_lodash2["default"].map(e,function(e){var t,r,o=e.text.indexOf(e.key);-1!==o?(t=e.text.substring(0,o),r=e.text.substring(o+1)):(t=e.text+" (",r=")");var n=function(t){this.done(e.key),t.stopPropagation()}.bind(this);return _react2["default"].createElement("span",{key:e.key,className:"option",onClick:n},t,_react2["default"].createElement("strong",{className:"text-primary"},e.key),r)}.bind(this)),_react2["default"].createElement("div",{tabIndex:"0",onKeyDown:this.onKeyDown,onClick:this.onClick,className:"prompt-dialog"},_react2["default"].createElement("div",{className:"prompt-content"},this.props.prompt||_react2["default"].createElement("strong",null,"Select: "),e))}});exports["default"]=Prompt; -},{"../utils.js":32,"lodash":"lodash","react":"react","react-dom":"react-dom"}],21:[function(require,module,exports){ +},{"../utils.js":34,"lodash":"lodash","react":"react","react-dom":"react-dom"}],23:[function(require,module,exports){ "use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var o={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(o[n]=e[n]);return o["default"]=e,o}function Connection(e,o){"/"===e[0]&&(e=location.origin.replace("http","ws")+e);var n=new WebSocket(e);return n.onopen=function(){o(webSocketActions.connected()),o(flowActions.fetchFlows()).then(function(){console.log("flows are loaded now"),_actions.ConnectionActions.open()}),o(eventLogActions.fetchLogEntries())},n.onmessage=function(e){var n=JSON.parse(e.data);switch(_dispatcher.AppDispatcher.dispatchServerAction(n),n.type){case eventLogActions.UPDATE_LOG:return o(eventLogActions.updateLogEntries(n));case flowActions.UPDATE_FLOWS:return o(flowActions.updateFlows(n));default:console.warn("unknown message",n)}},n.onerror=function(){_actions.ConnectionActions.error(),o(eventLogActions.addLogEntry("WebSocket connection error."))},n.onclose=function(){_actions.ConnectionActions.close(),o(eventLogActions.addLogEntry("WebSocket connection closed.")),o(webSocketActions.disconnected())},n}Object.defineProperty(exports,"__esModule",{value:!0}),exports["default"]=Connection;var _actions=require("./actions.js"),_dispatcher=require("./dispatcher.js"),_websocket=require("./ducks/websocket"),webSocketActions=_interopRequireWildcard(_websocket),_eventLog=require("./ducks/eventLog"),eventLogActions=_interopRequireWildcard(_eventLog),_flows=require("./ducks/flows"),flowActions=_interopRequireWildcard(_flows); -},{"./actions.js":2,"./dispatcher.js":22,"./ducks/eventLog":23,"./ducks/flows":24,"./ducks/websocket":28}],22:[function(require,module,exports){ +},{"./actions.js":2,"./dispatcher.js":24,"./ducks/eventLog":25,"./ducks/flows":26,"./ducks/websocket":30}],24:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.AppDispatcher=void 0;var _flux=require("flux"),_flux2=_interopRequireDefault(_flux),PayloadSources={VIEW:"view",SERVER:"server"},AppDispatcher=exports.AppDispatcher=new _flux2["default"].Dispatcher;AppDispatcher.dispatchViewAction=function(e){e.source=PayloadSources.VIEW,this.dispatch(e)},AppDispatcher.dispatchServerAction=function(e){e.source=PayloadSources.SERVER,this.dispatch(e)}; -},{"flux":"flux"}],23:[function(require,module,exports){ +},{"flux":"flux"}],25:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _defineProperty(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function reducer(){var e=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],t=arguments[1];switch(t.type){case TOGGLE_FILTER:var i=_extends({},e.filter,_defineProperty({},t.filter,!e.filter[t.filter]));return _extends({},e,{filter:i,filteredEvents:(0,_view.updateViewFilter)(e.events,function(e){return i[e.level]})});case TOGGLE_VISIBILITY:return _extends({},e,{visible:!e.visible});case UPDATE_LOG:var r=reduceList(e.events,t);return _extends({},e,{events:r,filteredEvents:(0,_view.updateViewList)(e.filteredEvents,e.events,r,t,function(t){return e.filter[t.level]})});default:return e}}function toggleEventLogFilter(e){return{type:TOGGLE_FILTER,filter:e}}function toggleEventLogVisibility(){return{type:TOGGLE_VISIBILITY}}function addLogEntry(e){var t=arguments.length<=1||void 0===arguments[1]?"web":arguments[1];return addItem({message:e,level:t,id:"log-"+id++})}Object.defineProperty(exports,"__esModule",{value:!0}),exports.fetchLogEntries=exports.updateLogEntries=exports.UPDATE_LOG=void 0;var _extends=Object.assign||function(e){for(var t=1;tn;)u=n+o>>>1,r(e[u])n?-1:n>o?1:0};return t},sortedInsert=function(e,t,r){var n=[].concat(_toConsumableArray(e),[r]);n.indexOf=function(e){return sortedIndexOf(n,e,t)};var o=makeCompareFn(t);return t&&o(e[e.length-1],r)>0&&(console.debug("sorting view..."),n.sort(o)),n},sortedRemove=function(e,t,r){var n=r.id,o=e.filter(function(e){return e.id!==n});return o.indexOf=function(e){return sortedIndexOf(o,e,t)},o}; -},{"./list":26}],28:[function(require,module,exports){ +},{"./list":28}],30:[function(require,module,exports){ "use strict";function reducer(){var e=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],t=arguments[1];switch(t.type){case CONNECTED:return{connected:!0};case DISCONNECTED:return{connected:!1};default:return e}}function connected(){return{type:CONNECTED}}function disconnected(){return{type:DISCONNECTED}}Object.defineProperty(exports,"__esModule",{value:!0}),exports["default"]=reducer,exports.connected=connected,exports.disconnected=disconnected;var CONNECTED="WEBSOCKET_CONNECTED",DISCONNECTED="WEBSOCKET_DISCONNECTED",defaultState={connected:!1}; -},{}],29:[function(require,module,exports){ +},{}],31:[function(require,module,exports){ "use strict";module.exports=function(){function e(e,t){function r(){this.constructor=e}r.prototype=t.prototype,e.prototype=new r}function t(e,r,n,i){this.message=e,this.expected=r,this.found=n,this.location=i,this.name="SyntaxError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,t)}function r(e){function r(t){var r,n,i=Ot[t];if(i)return i;for(r=t-1;!Ot[r];)r--;for(i=Ot[r],i={line:i.line,column:i.column,seenCR:i.seenCR};t>r;)n=e.charAt(r),"\n"===n?(i.seenCR||i.line++,i.column=1,i.seenCR=!1):"\r"===n||"\u2028"===n||"\u2029"===n?(i.line++,i.column=1,i.seenCR=!0):(i.column++,i.seenCR=!1),r++;return Ot[t]=i,i}function n(e,t){var n=r(e),i=r(t);return{start:{offset:e,line:n.line,column:n.column},end:{offset:t,line:i.line,column:i.column}}}function i(e){Pt>Mt||(Mt>Pt&&(Pt=Mt,Qt=[]),Qt.push(e))}function s(e,r,n,i){function s(e){var t=1;for(e.sort(function(e,t){return e.descriptiont.description?1:0});t1?u.slice(0,-1).join(", ")+" or "+u[e.length-1]:u[0],i=t?'"'+r(t)+'"':"end of input","Expected "+n+" but "+i+" found."}return null!==r&&s(r),new t(null!==e?e:u(r,n),r,n,i)}function u(){var e,t,r,n;return Vt++,e=Mt,t=a(),t!==P?(r=l(),r!==P?(n=a(),n!==P?(Nt=e,t=X(r),e=t):(Mt=e,e=P)):(Mt=e,e=P)):(Mt=e,e=P),Vt--,e===P&&(t=P,0===Vt&&i(W)),e}function c(){var t,r;return Vt++,Z.test(e.charAt(Mt))?(t=e.charAt(Mt),Mt++):(t=P,0===Vt&&i($)),Vt--,t===P&&(r=P,0===Vt&&i(Y)),t}function o(){var t,r;return Vt++,te.test(e.charAt(Mt))?(t=e.charAt(Mt),Mt++):(t=P,0===Vt&&i(re)),Vt--,t===P&&(r=P,0===Vt&&i(ee)),t}function a(){var e,t;for(Vt++,e=[],t=c();t!==P;)e.push(t),t=c();return Vt--,e===P&&(t=P,0===Vt&&i(ne)),e}function l(){var t,r,n,s,u,c;return t=Mt,r=p(),r!==P?(n=a(),n!==P?(124===e.charCodeAt(Mt)?(s=ie,Mt++):(s=P,0===Vt&&i(se)),s!==P?(u=a(),u!==P?(c=l(),c!==P?(Nt=t,r=ue(r,c),t=r):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P),t===P&&(t=p()),t}function p(){var t,r,n,s,u,o;if(t=Mt,r=f(),r!==P?(n=a(),n!==P?(38===e.charCodeAt(Mt)?(s=ce,Mt++):(s=P,0===Vt&&i(oe)),s!==P?(u=a(),u!==P?(o=p(),o!==P?(Nt=t,r=ae(r,o),t=r):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P),t===P){if(t=Mt,r=f(),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=p(),s!==P?(Nt=t,r=ae(r,s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;t===P&&(t=f())}return t}function f(){var t,r,n,s;return t=Mt,33===e.charCodeAt(Mt)?(r=le,Mt++):(r=P,0===Vt&&i(pe)),r!==P?(n=a(),n!==P?(s=f(),s!==P?(Nt=t,r=fe(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P),t===P&&(t=h()),t}function h(){var t,r,n,s,u,c;return t=Mt,40===e.charCodeAt(Mt)?(r=he,Mt++):(r=P,0===Vt&&i(de)),r!==P?(n=a(),n!==P?(s=l(),s!==P?(u=a(),u!==P?(41===e.charCodeAt(Mt)?(c=ve,Mt++):(c=P,0===Vt&&i(ye)),c!==P?(Nt=t,r=ge(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P),t===P&&(t=d()),t}function d(){var e;return e=v(),e===P&&(e=g()),e}function v(){var t,r;return t=y(),t===P&&(t=Mt,e.substr(Mt,2)===Ae?(r=Ae,Mt+=2):(r=P,0===Vt&&i(xe)),r!==P&&(Nt=t,r=Re()),t=r,t===P&&(t=Mt,e.substr(Mt,2)===me?(r=me,Mt+=2):(r=P,0===Vt&&i(qe)),r!==P&&(Nt=t,r=Ce()),t=r,t===P&&(t=Mt,e.substr(Mt,2)===we?(r=we,Mt+=2):(r=P,0===Vt&&i(Ee)),r!==P&&(Nt=t,r=be()),t=r,t===P&&(t=Mt,e.substr(Mt,2)===Fe?(r=Fe,Mt+=2):(r=P,0===Vt&&i(Ue)),r!==P&&(Nt=t,r=je()),t=r)))),t}function y(){var t,r;return t=Mt,e.substr(Mt,4)===Te?(r=Te,Mt+=4):(r=P,0===Vt&&i(_e)),r!==P&&(Nt=t,r=Se()),t=r,t===P&&(t=Mt,e.substr(Mt,5)===ke?(r=ke,Mt+=5):(r=P,0===Vt&&i(Be)),r!==P&&(Nt=t,r=Ie()),t=r),t}function g(){var t,r,n,s;if(t=Mt,e.substr(Mt,2)===ze?(r=ze,Mt+=2):(r=P,0===Vt&&i(De)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=A(),s!==P?(Nt=t,r=Ge(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,2)===He?(r=He,Mt+=2):(r=P,0===Vt&&i(Je)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=Ke(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,2)===Le?(r=Le,Mt+=2):(r=P,0===Vt&&i(Me)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=Ne(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,3)===Oe?(r=Oe,Mt+=3):(r=P,0===Vt&&i(Pe)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=Qe(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,3)===Ve?(r=Ve,Mt+=3):(r=P,0===Vt&&i(We)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=Xe(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,2)===Ye?(r=Ye,Mt+=2):(r=P,0===Vt&&i(Ze)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=$e(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,2)===et?(r=et,Mt+=2):(r=P,0===Vt&&i(tt)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=rt(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,3)===nt?(r=nt,Mt+=3):(r=P,0===Vt&&i(it)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=st(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,3)===ut?(r=ut,Mt+=3):(r=P,0===Vt&&i(ct)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=ot(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,2)===at?(r=at,Mt+=2):(r=P,0===Vt&&i(lt)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=pt(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;t===P&&(t=Mt,r=x(),r!==P&&(Nt=t,r=pt(r)),t=r)}}}}}}}}}return t}function A(){var t,r,n,s;if(Vt++,t=Mt,ht.test(e.charAt(Mt))?(r=e.charAt(Mt),Mt++):(r=P,0===Vt&&i(dt)),r===P&&(r=null),r!==P){if(n=[],vt.test(e.charAt(Mt))?(s=e.charAt(Mt),Mt++):(s=P,0===Vt&&i(yt)),s!==P)for(;s!==P;)n.push(s),vt.test(e.charAt(Mt))?(s=e.charAt(Mt),Mt++):(s=P,0===Vt&&i(yt));else n=P;n!==P?(ht.test(e.charAt(Mt))?(s=e.charAt(Mt),Mt++):(s=P,0===Vt&&i(dt)),s===P&&(s=null),s!==P?(Nt=t,r=gt(n),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;return Vt--,t===P&&(r=P,0===Vt&&i(ft)),t}function x(){var t,r,n,s;if(Vt++,t=Mt,34===e.charCodeAt(Mt)?(r=xt,Mt++):(r=P,0===Vt&&i(Rt)),r!==P){for(n=[],s=R();s!==P;)n.push(s),s=R();n!==P?(34===e.charCodeAt(Mt)?(s=xt,Mt++):(s=P,0===Vt&&i(Rt)),s!==P?(Nt=t,r=mt(n),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,39===e.charCodeAt(Mt)?(r=qt,Mt++):(r=P,0===Vt&&i(Ct)),r!==P){for(n=[],s=m();s!==P;)n.push(s),s=m();n!==P?(39===e.charCodeAt(Mt)?(s=qt,Mt++):(s=P,0===Vt&&i(Ct)),s!==P?(Nt=t,r=mt(n),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P)if(t=Mt,r=Mt,Vt++,n=o(),Vt--,n===P?r=void 0:(Mt=r,r=P),r!==P){if(n=[],s=q(),s!==P)for(;s!==P;)n.push(s),s=q();else n=P;n!==P?(Nt=t,r=mt(n),t=r):(Mt=t,t=P)}else Mt=t,t=P}return Vt--,t===P&&(r=P,0===Vt&&i(At)),t}function R(){var t,r,n;return t=Mt,r=Mt,Vt++,wt.test(e.charAt(Mt))?(n=e.charAt(Mt),Mt++):(n=P,0===Vt&&i(Et)),Vt--,n===P?r=void 0:(Mt=r,r=P),r!==P?(e.length>Mt?(n=e.charAt(Mt),Mt++):(n=P,0===Vt&&i(bt)),n!==P?(Nt=t,r=Ft(n),t=r):(Mt=t,t=P)):(Mt=t,t=P),t===P&&(t=Mt,92===e.charCodeAt(Mt)?(r=Ut,Mt++):(r=P,0===Vt&&i(jt)),r!==P?(n=C(),n!==P?(Nt=t,r=Ft(n),t=r):(Mt=t,t=P)):(Mt=t,t=P)),t}function m(){var t,r,n;return t=Mt,r=Mt,Vt++,Tt.test(e.charAt(Mt))?(n=e.charAt(Mt),Mt++):(n=P,0===Vt&&i(_t)),Vt--,n===P?r=void 0:(Mt=r,r=P),r!==P?(e.length>Mt?(n=e.charAt(Mt),Mt++):(n=P,0===Vt&&i(bt)),n!==P?(Nt=t,r=Ft(n),t=r):(Mt=t,t=P)):(Mt=t,t=P),t===P&&(t=Mt,92===e.charCodeAt(Mt)?(r=Ut,Mt++):(r=P,0===Vt&&i(jt)),r!==P?(n=C(),n!==P?(Nt=t,r=Ft(n),t=r):(Mt=t,t=P)):(Mt=t,t=P)),t}function q(){var t,r,n;return t=Mt,r=Mt,Vt++,n=c(),Vt--,n===P?r=void 0:(Mt=r,r=P),r!==P?(e.length>Mt?(n=e.charAt(Mt),Mt++):(n=P,0===Vt&&i(bt)),n!==P?(Nt=t,r=Ft(n),t=r):(Mt=t,t=P)):(Mt=t,t=P),t}function C(){var t,r;return St.test(e.charAt(Mt))?(t=e.charAt(Mt),Mt++):(t=P,0===Vt&&i(kt)),t===P&&(t=Mt,110===e.charCodeAt(Mt)?(r=Bt,Mt++):(r=P,0===Vt&&i(It)),r!==P&&(Nt=t,r=zt()),t=r,t===P&&(t=Mt,114===e.charCodeAt(Mt)?(r=Dt,Mt++):(r=P,0===Vt&&i(Gt)),r!==P&&(Nt=t,r=Ht()),t=r,t===P&&(t=Mt,116===e.charCodeAt(Mt)?(r=Jt,Mt++):(r=P,0===Vt&&i(Kt)),r!==P&&(Nt=t,r=Lt()),t=r))),t}function w(e,t){function r(){return e.apply(this,arguments)||t.apply(this,arguments)}return r.desc=e.desc+" or "+t.desc,r}function E(e,t){function r(){return e.apply(this,arguments)&&t.apply(this,arguments)}return r.desc=e.desc+" and "+t.desc,r}function b(e){function t(){return!e.apply(this,arguments)}return t.desc="not "+e.desc,t}function F(e){function t(){return e.apply(this,arguments)}return t.desc="("+e.desc+")",t}function U(e){return!0}function j(e){return!1}function T(e){if(e.response)for(var t=Wt.ResponseUtils.getContentType(e.response),r=Xt.length;r--;)if(Xt[r].test(t))return!0;return!1}function _(e){function t(t){return t.response&&t.response.status_code===e}return t.desc="resp. code is "+e,t}function S(e){function t(t){return t.request&&e.test(t.request.host)}return e=new RegExp(e,"i"),t.desc="domain matches "+e,t}function k(e){return!!e.error}function B(e){function t(t){return t.request&&Wt.RequestUtils.match_header(t.request,e)||t.response&&Wt.ResponseUtils.match_header(t.response,e)}return e=new RegExp(e,"i"),t.desc="header matches "+e,t}function I(e){function t(t){return t.request&&Wt.RequestUtils.match_header(t.request,e)}return e=new RegExp(e,"i"),t.desc="req. header matches "+e,t}function z(e){function t(t){return t.response&&Wt.ResponseUtils.match_header(t.response,e)}return e=new RegExp(e,"i"),t.desc="resp. header matches "+e,t}function D(e){function t(t){return t.request&&e.test(t.request.method)}return e=new RegExp(e,"i"),t.desc="method matches "+e,t}function G(e){return e.request&&!e.response}function H(e){return!!e.response}function J(e){function t(t){return t.request&&e.test(Wt.RequestUtils.getContentType(t.request))||t.response&&e.test(Wt.ResponseUtils.getContentType(t.response))}return e=new RegExp(e,"i"),t.desc="content type matches "+e,t}function K(e){function t(t){return t.request&&e.test(Wt.RequestUtils.getContentType(t.request))}return e=new RegExp(e,"i"),t.desc="req. content type matches "+e,t}function L(e){function t(t){return t.response&&e.test(Wt.ResponseUtils.getContentType(t.response))}return e=new RegExp(e,"i"),t.desc="resp. content type matches "+e,t}function M(e){function t(t){return t.request&&e.test(Wt.RequestUtils.pretty_url(t.request))}return e=new RegExp(e,"i"),t.desc="url matches "+e,t}var N,O=arguments.length>1?arguments[1]:{},P={},Q={start:u},V=u,W={type:"other",description:"filter expression"},X=function(e){return e},Y={type:"other",description:"whitespace"},Z=/^[ \t\n\r]/,$={type:"class",value:"[ \\t\\n\\r]",description:"[ \\t\\n\\r]"},ee={type:"other",description:"control character"},te=/^[|&!()~"]/,re={type:"class",value:'[|&!()~"]',description:'[|&!()~"]'},ne={type:"other",description:"optional whitespace"},ie="|",se={type:"literal",value:"|",description:'"|"'},ue=function(e,t){return w(e,t)},ce="&",oe={type:"literal",value:"&",description:'"&"'},ae=function(e,t){return E(e,t)},le="!",pe={type:"literal",value:"!",description:'"!"'},fe=function(e){return b(e)},he="(",de={type:"literal",value:"(",description:'"("'},ve=")",ye={type:"literal",value:")",description:'")"'},ge=function(e){return F(e)},Ae="~a",xe={type:"literal",value:"~a",description:'"~a"'},Re=function(){return T},me="~e",qe={type:"literal",value:"~e",description:'"~e"'},Ce=function(){return k},we="~q",Ee={type:"literal",value:"~q",description:'"~q"'},be=function(){return G},Fe="~s",Ue={type:"literal",value:"~s",description:'"~s"'},je=function(){return H},Te="true",_e={type:"literal",value:"true",description:'"true"'},Se=function(){return U},ke="false",Be={type:"literal",value:"false",description:'"false"'},Ie=function(){return j},ze="~c",De={type:"literal",value:"~c",description:'"~c"'},Ge=function(e){return _(e)},He="~d",Je={type:"literal",value:"~d",description:'"~d"'},Ke=function(e){return S(e)},Le="~h",Me={type:"literal",value:"~h",description:'"~h"'},Ne=function(e){return B(e)},Oe="~hq",Pe={type:"literal",value:"~hq",description:'"~hq"'},Qe=function(e){return I(e)},Ve="~hs",We={type:"literal",value:"~hs",description:'"~hs"'},Xe=function(e){return z(e)},Ye="~m",Ze={type:"literal",value:"~m",description:'"~m"'},$e=function(e){return D(e)},et="~t",tt={type:"literal",value:"~t",description:'"~t"'},rt=function(e){return J(e)},nt="~tq",it={type:"literal",value:"~tq",description:'"~tq"'},st=function(e){return K(e)},ut="~ts",ct={type:"literal",value:"~ts",description:'"~ts"'},ot=function(e){return L(e)},at="~u",lt={type:"literal",value:"~u",description:'"~u"'},pt=function(e){return M(e)},ft={type:"other",description:"integer"},ht=/^['"]/,dt={type:"class",value:"['\"]",description:"['\"]"},vt=/^[0-9]/,yt={type:"class",value:"[0-9]",description:"[0-9]"},gt=function(e){return parseInt(e.join(""),10)},At={type:"other",description:"string"},xt='"',Rt={type:"literal",value:'"',description:'"\\""'},mt=function(e){return e.join("")},qt="'",Ct={type:"literal",value:"'",description:'"\'"'},wt=/^["\\]/,Et={type:"class",value:'["\\\\]',description:'["\\\\]'},bt={type:"any",description:"any character"},Ft=function(e){return e},Ut="\\",jt={type:"literal",value:"\\",description:'"\\\\"'},Tt=/^['\\]/,_t={type:"class",value:"['\\\\]",description:"['\\\\]"},St=/^['"\\]/,kt={type:"class",value:"['\"\\\\]",description:"['\"\\\\]"},Bt="n",It={type:"literal",value:"n",description:'"n"'},zt=function(){return"\n"},Dt="r",Gt={type:"literal",value:"r",description:'"r"'},Ht=function(){return"\r"},Jt="t",Kt={type:"literal",value:"t",description:'"t"'},Lt=function(){return" "},Mt=0,Nt=0,Ot=[{line:1,column:1,seenCR:!1}],Pt=0,Qt=[],Vt=0;if("startRule"in O){if(!(O.startRule in Q))throw new Error("Can't start parsing from rule \""+O.startRule+'".');V=Q[O.startRule]}var Wt=require("../flow/utils.js");U.desc="true",j.desc="false";var Xt=[new RegExp("text/javascript"),new RegExp("application/x-javascript"),new RegExp("application/javascript"),new RegExp("text/css"),new RegExp("image/.*"),new RegExp("application/x-shockwave-flash")];if(T.desc="is asset",k.desc="has error",G.desc="has no response",H.desc="has response",N=V(),N!==P&&Mt===e.length)return N;throw N!==P&&Mt=i;i++)Key[String.fromCharCode(i)]=i;var formatSize=exports.formatSize=function(e){if(0===e)return"0";for(var r=["b","kb","mb","gb","tb"],t=0;te);t++);var o;return o=e%Math.pow(1024,t)===0?0:1,(e/Math.pow(1024,t)).toFixed(o)+r[t]},formatTimeDelta=exports.formatTimeDelta=function(e){for(var r=e,t=["ms","s","min","h"],o=[1e3,60,60],a=0;Math.abs(r)>=o[a]&&a=0&&"/"===e.url[0]&&(-1===e.url.indexOf("?")?e.url+="?"+xsrf:e.url+="&"+xsrf)}),(0,_jquery2["default"])(document).ajaxError(function(e,r,t,o){if("abort"!==o){var a=r.responseText;console.error(o,a,arguments),alert(a)}}); },{"./actions.js":2,"jquery":"jquery","lodash":"lodash","react":"react"}]},{},[3]) diff --git a/web/conf.js b/web/conf.js index 7fe75da4..cc616a63 100644 --- a/web/conf.js +++ b/web/conf.js @@ -11,7 +11,7 @@ var conf = { // Package these as well as the dependencies vendor_includes: [ ], - app: 'src/js/app.js', + app: 'src/js/app', eslint: ["src/js/**/*.js", "!src/js/filt/filt.js"] }, css: { @@ -27,4 +27,4 @@ var conf = { peg: ["src/js/filt/filt.peg"] }; -module.exports = conf; \ No newline at end of file +module.exports = conf; diff --git a/web/gulpfile.js b/web/gulpfile.js index ffa5387a..4a8c765f 100644 --- a/web/gulpfile.js +++ b/web/gulpfile.js @@ -142,6 +142,7 @@ function app_stream(dev) { var bundler = browserify({ entries: [conf.js.app], debug: true, + extensions: ['.jsx'], cache: {}, // required for watchify packageCache: {} // required for watchify }); diff --git a/web/src/js/app.js b/web/src/js/app.js deleted file mode 100644 index 8fa52a00..00000000 --- a/web/src/js/app.js +++ /dev/null @@ -1,41 +0,0 @@ -import React from "react" -import { render } from 'react-dom' -import { applyMiddleware, createStore } from 'redux' -import { Provider } from 'react-redux' -import createLogger from 'redux-logger' -import thunkMiddleware from 'redux-thunk' -import { Route, Router as ReactRouter, hashHistory, Redirect } from "react-router" - -import Connection from "./connection" -import ProxyApp from "./components/ProxyApp" -import MainView from './components/MainView' -import rootReducer from './ducks/index' -import { addLogEntry } from "./ducks/eventLog" - -// logger must be last -const store = createStore( - rootReducer, - applyMiddleware(thunkMiddleware, createLogger()) -) - -window.addEventListener('error', msg => { - store.dispatch(addLogEntry(msg)) -}) - -// @todo remove this -document.addEventListener('DOMContentLoaded', () => { - window.ws = new Connection("/updates", store.dispatch) - - render( - - - - - - - - - , - document.getElementById("mitmproxy") - ) -}) diff --git a/web/src/js/app.jsx b/web/src/js/app.jsx new file mode 100644 index 00000000..8fa52a00 --- /dev/null +++ b/web/src/js/app.jsx @@ -0,0 +1,41 @@ +import React from "react" +import { render } from 'react-dom' +import { applyMiddleware, createStore } from 'redux' +import { Provider } from 'react-redux' +import createLogger from 'redux-logger' +import thunkMiddleware from 'redux-thunk' +import { Route, Router as ReactRouter, hashHistory, Redirect } from "react-router" + +import Connection from "./connection" +import ProxyApp from "./components/ProxyApp" +import MainView from './components/MainView' +import rootReducer from './ducks/index' +import { addLogEntry } from "./ducks/eventLog" + +// logger must be last +const store = createStore( + rootReducer, + applyMiddleware(thunkMiddleware, createLogger()) +) + +window.addEventListener('error', msg => { + store.dispatch(addLogEntry(msg)) +}) + +// @todo remove this +document.addEventListener('DOMContentLoaded', () => { + window.ws = new Connection("/updates", store.dispatch) + + render( + + + + + + + + + , + document.getElementById("mitmproxy") + ) +}) diff --git a/web/src/js/components/FlowTable.jsx b/web/src/js/components/FlowTable.jsx new file mode 100644 index 00000000..eddeed62 --- /dev/null +++ b/web/src/js/components/FlowTable.jsx @@ -0,0 +1,120 @@ +import React, { PropTypes } from 'react' +import ReactDOM from 'react-dom' +import shallowEqual from 'shallowequal' +import AutoScroll from './helpers/AutoScroll' +import { calcVScroll } from './helpers/VirtualScroll' +import FlowTableHead from './FlowTable/FlowTableHead' +import FlowRow from './FlowTable/FlowRow' +import Filt from "../filt/filt" + +class FlowTable extends React.Component { + + static propTypes = { + onSelect: PropTypes.func.isRequired, + flows: PropTypes.array.isRequired, + rowHeight: PropTypes.number, + highlight: PropTypes.string, + selected: PropTypes.object, + } + + static defaultProps = { + rowHeight: 32, + } + + constructor(props, context) { + super(props, context) + + this.state = { vScroll: calcVScroll() } + this.onViewportUpdate = this.onViewportUpdate.bind(this) + } + + componentWillMount() { + window.addEventListener('resize', this.onViewportUpdate) + } + + componentWillUnmount() { + window.removeEventListener('resize', this.onViewportUpdate) + } + + componentDidUpdate() { + this.onViewportUpdate() + + if (!this.shouldScrollIntoView) { + return + } + + this.shouldScrollIntoView = false + + const { rowHeight, flows, selected } = this.props + const viewport = ReactDOM.findDOMNode(this) + const head = ReactDOM.findDOMNode(this.refs.head) + + const headHeight = head ? head.offsetHeight : 0 + + const rowTop = (flows.indexOf(selected) * rowHeight) + headHeight + const rowBottom = rowTop + rowHeight + + const viewportTop = viewport.scrollTop + const viewportHeight = viewport.offsetHeight + + // Account for pinned thead + if (rowTop - headHeight < viewportTop) { + viewport.scrollTop = rowTop - headHeight + } else if (rowBottom > viewportTop + viewportHeight) { + viewport.scrollTop = rowBottom - viewportHeight + } + } + + componentWillReceiveProps(nextProps) { + if (nextProps.selected && nextProps.selected !== this.props.selected) { + this.shouldScrollIntoView = true + } + } + + onViewportUpdate() { + const viewport = ReactDOM.findDOMNode(this) + const viewportTop = viewport.scrollTop + + const vScroll = calcVScroll({ + viewportTop, + viewportHeight: viewport.offsetHeight, + itemCount: this.props.flows.length, + rowHeight: this.props.rowHeight, + }) + + if (this.state.viewportTop !== viewportTop || !shallowEqual(this.state.vScroll, vScroll)) { + this.setState({ vScroll, viewportTop }) + } + } + + render() { + const { vScroll, viewportTop } = this.state + const { flows, selected, highlight } = this.props + const isHighlighted = highlight ? Filt.parse(highlight) : () => false + + return ( +
+ + + + + + + {flows.slice(vScroll.start, vScroll.end).map(flow => ( + + ))} + + +
+
+ ) + } +} + +export default AutoScroll(FlowTable) diff --git a/web/src/js/components/FlowTable/FlowColumns.jsx b/web/src/js/components/FlowTable/FlowColumns.jsx new file mode 100644 index 00000000..11c0796c --- /dev/null +++ b/web/src/js/components/FlowTable/FlowColumns.jsx @@ -0,0 +1,137 @@ +import React, { Component } from 'react' +import classnames from 'classnames' +import { RequestUtils, ResponseUtils } from '../../flow/utils.js' +import { formatSize, formatTimeDelta } from '../../utils.js' + +export function TLSColumn({ flow }) { + return ( + + ) +} + +TLSColumn.sortKeyFun = flow => flow.request.scheme +TLSColumn.headerClass = 'col-tls' +TLSColumn.headerName = '' + +export function IconColumn({ flow }) { + return ( + +
+ + ) +} + +IconColumn.headerClass = 'col-icon' +IconColumn.headerName = '' + +IconColumn.getIcon = flow => { + if (!flow.response) { + return 'resource-icon-plain' + } + + var contentType = ResponseUtils.getContentType(flow.response) || '' + + // @todo We should assign a type to the flow somewhere else. + if (flow.response.status_code === 304) { + return 'resource-icon-not-modified' + } + if (300 <= flow.response.status_code && flow.response.status_code < 400) { + return 'resource-icon-redirect' + } + if (contentType.indexOf('image') >= 0) { + return 'resource-icon-image' + } + if (contentType.indexOf('javascript') >= 0) { + return 'resource-icon-js' + } + if (contentType.indexOf('css') >= 0) { + return 'resource-icon-css' + } + if (contentType.indexOf('html') >= 0) { + return 'resource-icon-document' + } + + return 'resource-icon-plain' +} + +export function PathColumn({ flow }) { + return ( + + {flow.request.is_replay && ( + + )} + {flow.intercepted && ( + + )} + {RequestUtils.pretty_url(flow.request)} + + ) +} + +PathColumn.sortKeyFun = flow => RequestUtils.pretty_url(flow.request) +PathColumn.headerClass = 'col-path' +PathColumn.headerName = 'Path' + +export function MethodColumn({ flow }) { + return ( + {flow.request.method} + ) +} + +MethodColumn.sortKeyFun = flow => flow.request.method +MethodColumn.headerClass = 'col-method' +MethodColumn.headerName = 'Method' + +export function StatusColumn({ flow }) { + return ( + {flow.response && flow.response.status_code} + ) +} + +StatusColumn.sortKeyFun = flow => flow.response && flow.response.status_code +StatusColumn.headerClass = 'col-status' +StatusColumn.headerName = 'Status' + +export function SizeColumn({ flow }) { + return ( + {formatSize(SizeColumn.getTotalSize(flow))} + ) +} + +SizeColumn.sortKeyFun = flow => { + let total = flow.request.contentLength + if (flow.response) { + total += flow.response.contentLength || 0 + } + return total +} + +SizeColumn.getTotalSize = SizeColumn.sortKeyFun +SizeColumn.headerClass = 'col-size' +SizeColumn.headerName = 'Size' + +export function TimeColumn({ flow }) { + return ( + + {flow.response ? ( + formatTimeDelta(1000 * (flow.response.timestamp_end - flow.request.timestamp_start)) + ) : ( + '...' + )} + + ) +} + +TimeColumn.sortKeyFun = flow => flow.response && flow.response.timestamp_end - flow.request.timestamp_start +TimeColumn.headerClass = 'col-time' +TimeColumn.headerName = 'Time' + +export default [ + TLSColumn, + IconColumn, + PathColumn, + MethodColumn, + StatusColumn, + SizeColumn, + TimeColumn, +] diff --git a/web/src/js/components/FlowTable/FlowRow.jsx b/web/src/js/components/FlowTable/FlowRow.jsx new file mode 100644 index 00000000..749bc0ce --- /dev/null +++ b/web/src/js/components/FlowTable/FlowRow.jsx @@ -0,0 +1,28 @@ +import React, { PropTypes } from 'react' +import classnames from 'classnames' +import columns from './FlowColumns' + +FlowRow.propTypes = { + onSelect: PropTypes.func.isRequired, + flow: PropTypes.object.isRequired, + highlighted: PropTypes.bool, + selected: PropTypes.bool, +} + +export default function FlowRow({ flow, selected, highlighted, onSelect }) { + const className = classnames({ + 'selected': selected, + 'highlighted': highlighted, + 'intercepted': flow.intercepted, + 'has-request': flow.request, + 'has-response': flow.response, + }) + + return ( + onSelect(flow)}> + {columns.map(Column => ( + + ))} + + ) +} diff --git a/web/src/js/components/FlowTable/FlowTableHead.jsx b/web/src/js/components/FlowTable/FlowTableHead.jsx new file mode 100644 index 00000000..a46219d1 --- /dev/null +++ b/web/src/js/components/FlowTable/FlowTableHead.jsx @@ -0,0 +1,43 @@ +import React, { PropTypes } from 'react' +import { bindActionCreators } from 'redux' +import { connect } from 'react-redux' +import classnames from 'classnames' +import columns from './FlowColumns' + +import { setSort } from "../../ducks/flows" + +FlowTableHead.propTypes = { + onSort: PropTypes.func.isRequired, + sortDesc: React.PropTypes.bool.isRequired, + sortColumn: React.PropTypes.string, +} + +function FlowTableHead({ sortColumn, sortDesc, onSort }) { + const sortType = sortDesc ? 'sort-desc' : 'sort-asc' + + return ( + + {columns.map(Column => ( + onClick(Column)}> + {Column.headerName} + + ))} + + ) + + function onClick(Column) { + onSort({ sortColumn: Column.name, sortDesc: Column.name !== sortColumn ? false : !sortDesc }) + } +} + +export default connect( + state => ({ + sortDesc: state.flows.sort.sortDesc, + sortColumn: state.flows.sort.sortColumn, + }), + dispatch => bindActionCreators({ + onSort: setSort, + }, dispatch) +)(FlowTableHead) diff --git a/web/src/js/components/MainView.js b/web/src/js/components/MainView.js deleted file mode 100644 index 6172ce77..00000000 --- a/web/src/js/components/MainView.js +++ /dev/null @@ -1,191 +0,0 @@ -import React, { Component } from "react" - -import { FlowActions } from "../actions.js" -import { Query } from "../actions.js" -import { Key } from "../utils.js" -import { Splitter } from "./common.js" -import FlowTable from "./flowtable.js" -import FlowView from "./flowview/index.js" -import { connect } from 'react-redux' -import { selectFlow, setFilter, setHighlight } from "../ducks/flows" - -class MainView extends Component { - - /** - * @todo move to actions - * @todo replace with mapStateToProps - */ - componentWillReceiveProps(nextProps) { - // Update redux store with route changes - if (nextProps.routeParams.flowId !== (nextProps.selectedFlow || {}).id) { - this.props.selectFlow(nextProps.routeParams.flowId) - } - if (nextProps.location.query[Query.SEARCH] !== nextProps.filter) { - this.props.setFilter(nextProps.location.query[Query.SEARCH], false) - } - if (nextProps.location.query[Query.HIGHLIGHT] !== nextProps.highlight) { - this.props.setHighlight(nextProps.location.query[Query.HIGHLIGHT], false) - } - } - - /** - * @todo move to actions - */ - selectFlow(flow) { - if (flow) { - this.props.updateLocation(`/flows/${flow.id}/${this.props.routeParams.detailTab || "request"}`) - } else { - this.props.updateLocation("/flows") - } - } - - /** - * @todo move to actions - */ - selectFlowRelative(shift) { - const { flows, routeParams, selectedFlow } = this.props - let index = 0 - if (!routeParams.flowId) { - if (shift < 0) { - index = flows.length - 1 - } - } else { - index = Math.min( - Math.max(0, flows.indexOf(selectedFlow) + shift), - flows.length - 1 - ) - } - this.selectFlow(flows[index]) - } - - /** - * @todo move to actions - */ - onMainKeyDown(e) { - var flow = this.props.selectedFlow - if (e.ctrlKey) { - return - } - switch (e.keyCode) { - case Key.K: - case Key.UP: - this.selectFlowRelative(-1) - break - case Key.J: - case Key.DOWN: - this.selectFlowRelative(+1) - break - case Key.SPACE: - case Key.PAGE_DOWN: - this.selectFlowRelative(+10) - break - case Key.PAGE_UP: - this.selectFlowRelative(-10) - break - case Key.END: - this.selectFlowRelative(+1e10) - break - case Key.HOME: - this.selectFlowRelative(-1e10) - break - case Key.ESC: - this.selectFlow(null) - break - case Key.H: - case Key.LEFT: - if (this.refs.flowDetails) { - this.refs.flowDetails.nextTab(-1) - } - break - case Key.L: - case Key.TAB: - case Key.RIGHT: - if (this.refs.flowDetails) { - this.refs.flowDetails.nextTab(+1) - } - break - case Key.C: - if (e.shiftKey) { - FlowActions.clear() - } - break - case Key.D: - if (flow) { - if (e.shiftKey) { - FlowActions.duplicate(flow) - } else { - FlowActions.delete(flow) - } - } - break - case Key.A: - if (e.shiftKey) { - FlowActions.accept_all() - } else if (flow && flow.intercepted) { - FlowActions.accept(flow) - } - break - case Key.R: - if (!e.shiftKey && flow) { - FlowActions.replay(flow) - } - break - case Key.V: - if (e.shiftKey && flow && flow.modified) { - FlowActions.revert(flow) - } - break - case Key.E: - if (this.refs.flowDetails) { - this.refs.flowDetails.promptEdit() - } - break - case Key.SHIFT: - break - default: - console.debug("keydown", e.keyCode) - return - } - e.preventDefault() - } - - render() { - const { selectedFlow } = this.props - return ( -
- this.selectFlow(flow)} - selected={selectedFlow} - /> - {selectedFlow && [ - , - - ]} -
- ) - } -} - -export default connect( - state => ({ - flows: state.flows.view, - filter: state.flows.filter, - highlight: state.flows.highlight, - selectedFlow: state.flows.all.byId[state.flows.selected[0]] - }), - dispatch => ({ - selectFlow: flowId => dispatch(selectFlow(flowId)), - setFilter: filter => dispatch(setFilter(filter)), - setHighlight: highlight => dispatch(setHighlight(highlight)) - }), - undefined, - { withRef: true } -)(MainView) diff --git a/web/src/js/components/MainView.jsx b/web/src/js/components/MainView.jsx new file mode 100644 index 00000000..dbea76e5 --- /dev/null +++ b/web/src/js/components/MainView.jsx @@ -0,0 +1,200 @@ +import React, { Component, PropTypes } from 'react' +import { connect } from 'react-redux' +import { bindActionCreators } from 'redux' + +import { FlowActions } from '../actions.js' +import { Query } from '../actions.js' +import { Key } from '../utils.js' +import { Splitter } from './common.js' +import FlowTable from './FlowTable' +import FlowView from './flowview/index.js' +import { selectFlow, setFilter, setHighlight } from '../ducks/flows' + +class MainView extends Component { + + static propTypes = { + highlight: PropTypes.string, + sort: PropTypes.object, + } + + /** + * @todo move to actions + * @todo replace with mapStateToProps + */ + componentWillReceiveProps(nextProps) { + // Update redux store with route changes + if (nextProps.routeParams.flowId !== (nextProps.selectedFlow || {}).id) { + this.props.selectFlow(nextProps.routeParams.flowId) + } + if (nextProps.location.query[Query.SEARCH] !== nextProps.filter) { + this.props.setFilter(nextProps.location.query[Query.SEARCH], false) + } + if (nextProps.location.query[Query.HIGHLIGHT] !== nextProps.highlight) { + this.props.setHighlight(nextProps.location.query[Query.HIGHLIGHT], false) + } + } + + /** + * @todo move to actions + */ + selectFlow(flow) { + if (flow) { + this.props.updateLocation(`/flows/${flow.id}/${this.props.routeParams.detailTab || 'request'}`) + } else { + this.props.updateLocation('/flows') + } + } + + /** + * @todo move to actions + */ + selectFlowRelative(shift) { + const { flows, routeParams, selectedFlow } = this.props + let index = 0 + if (!routeParams.flowId) { + if (shift < 0) { + index = flows.length - 1 + } + } else { + index = Math.min( + Math.max(0, flows.indexOf(selectedFlow) + shift), + flows.length - 1 + ) + } + this.selectFlow(flows[index]) + } + + /** + * @todo move to actions + */ + onMainKeyDown(e) { + var flow = this.props.selectedFlow + if (e.ctrlKey) { + return + } + switch (e.keyCode) { + case Key.K: + case Key.UP: + this.selectFlowRelative(-1) + break + case Key.J: + case Key.DOWN: + this.selectFlowRelative(+1) + break + case Key.SPACE: + case Key.PAGE_DOWN: + this.selectFlowRelative(+10) + break + case Key.PAGE_UP: + this.selectFlowRelative(-10) + break + case Key.END: + this.selectFlowRelative(+1e10) + break + case Key.HOME: + this.selectFlowRelative(-1e10) + break + case Key.ESC: + this.selectFlow(null) + break + case Key.H: + case Key.LEFT: + if (this.refs.flowDetails) { + this.refs.flowDetails.nextTab(-1) + } + break + case Key.L: + case Key.TAB: + case Key.RIGHT: + if (this.refs.flowDetails) { + this.refs.flowDetails.nextTab(+1) + } + break + case Key.C: + if (e.shiftKey) { + FlowActions.clear() + } + break + case Key.D: + if (flow) { + if (e.shiftKey) { + FlowActions.duplicate(flow) + } else { + FlowActions.delete(flow) + } + } + break + case Key.A: + if (e.shiftKey) { + FlowActions.accept_all() + } else if (flow && flow.intercepted) { + FlowActions.accept(flow) + } + break + case Key.R: + if (!e.shiftKey && flow) { + FlowActions.replay(flow) + } + break + case Key.V: + if (e.shiftKey && flow && flow.modified) { + FlowActions.revert(flow) + } + break + case Key.E: + if (this.refs.flowDetails) { + this.refs.flowDetails.promptEdit() + } + break + case Key.SHIFT: + break + default: + console.debug('keydown', e.keyCode) + return + } + e.preventDefault() + } + + render() { + const { flows, selectedFlow, highlight, sort } = this.props + return ( +
+ this.selectFlow(flow)} + /> + {selectedFlow && [ + , + + ]} +
+ ) + } +} + +export default connect( + state => ({ + flows: state.flows.view, + filter: state.flows.filter, + sort: state.flows.sort, + highlight: state.flows.highlight, + selectedFlow: state.flows.all.byId[state.flows.selected[0]] + }), + dispatch => bindActionCreators({ + selectFlow, + setFilter, + setHighlight, + }, dispatch), + undefined, + { withRef: true } +)(MainView) diff --git a/web/src/js/components/ProxyApp.js b/web/src/js/components/ProxyApp.js deleted file mode 100644 index 71a7bf9b..00000000 --- a/web/src/js/components/ProxyApp.js +++ /dev/null @@ -1,169 +0,0 @@ -import React, { Component, PropTypes } from "react" -import ReactDOM from "react-dom" -import _ from "lodash" -import { connect } from 'react-redux' - -import { Splitter } from "./common.js" -import { Header, MainMenu } from "./header.js" -import EventLog from "./eventlog.js" -import Footer from "./footer.js" -import { SettingsStore } from "../store/store.js" -import { Key } from "../utils.js" - -class ProxyAppMain extends Component { - - static childContextTypes = { - returnFocus: PropTypes.func.isRequired, - location: PropTypes.object.isRequired, - } - - static contextTypes = { - router: PropTypes.object.isRequired, - } - - constructor(props, context) { - super(props, context) - - this.settingsStore = new SettingsStore() - - // Default Settings before fetch - _.extend(this.settingsStore.dict, {}) - - this.state = { settings: this.settingsStore.dict } - - this.onKeyDown = this.onKeyDown.bind(this) - this.updateLocation = this.updateLocation.bind(this) - this.onSettingsChange = this.onSettingsChange.bind(this) - } - - /** - * @todo move to actions - */ - updateLocation(pathname, queryUpdate) { - if (pathname === undefined) { - pathname = this.props.location.pathname - } - const query = this.props.location.query - for (const key of Object.keys(queryUpdate || {})) { - query[i] = queryUpdate[i] || undefined - } - this.context.router.replace({ pathname, query }) - } - - /** - * @todo pass in with props - */ - getQuery() { - // For whatever reason, react-router always returns the same object, which makes comparing - // the current props with nextProps impossible. As a workaround, we just clone the query object. - return _.clone(this.props.location.query) - } - - /** - * @todo remove settings store - * @todo connect websocket here - * @todo listen to window's key events - */ - componentDidMount() { - this.focus() - this.settingsStore.addListener("recalculate", this.onSettingsChange) - } - - /** - * @todo remove settings store - * @todo disconnect websocket here - * @todo stop listening to window's key events - */ - componentWillUnmount() { - this.settingsStore.removeListener("recalculate", this.onSettingsChange) - } - - /** - * @todo move to actions - */ - onSettingsChange() { - this.setState({ settings: this.settingsStore.dict }) - } - - /** - * @todo use props - */ - getChildContext() { - return { - returnFocus: this.focus, - location: this.props.location - } - } - - /** - * @todo remove it - */ - focus() { - document.activeElement.blur() - window.getSelection().removeAllRanges() - ReactDOM.findDOMNode(this).focus() - } - - /** - * @todo move to actions - */ - onKeyDown(e) { - let name = null - - switch (e.keyCode) { - case Key.I: - name = "intercept" - break - case Key.L: - name = "search" - break - case Key.H: - name = "highlight" - break - default: - let main = this.refs.view - if (this.refs.view.getWrappedInstance) { - main = this.refs.view.getWrappedInstance() - } - if (main.onMainKeyDown) { - main.onMainKeyDown(e) - } - return // don't prevent default then - } - - if (name) { - const headerComponent = this.refs.header - headerComponent.setState({active: MainMenu}, function () { - headerComponent.refs.active.refs[name].select() - }) - } - - e.preventDefault() - } - - render() { - const { showEventLog, location, children } = this.props - const { settings } = this.state - const query = this.getQuery() - return ( -
-
- {React.cloneElement( - children, - { ref: "view", location, query, updateLocation: this.updateLocation } - )} - {showEventLog && [ - , - - ]} -
-
- ) - } -} - -export default connect( - state => ({ - showEventLog: state.eventLog.visible - }) -)(ProxyAppMain) diff --git a/web/src/js/components/ProxyApp.jsx b/web/src/js/components/ProxyApp.jsx new file mode 100644 index 00000000..9f497a7d --- /dev/null +++ b/web/src/js/components/ProxyApp.jsx @@ -0,0 +1,170 @@ +import React, { Component, PropTypes } from "react" +import ReactDOM from "react-dom" +import _ from "lodash" +import { connect } from 'react-redux' + +import { Splitter } from "./common.js" +import { Header, MainMenu } from "./header.js" +import EventLog from "./eventlog.js" +import Footer from "./footer.js" +import { SettingsStore } from "../store/store.js" +import { Key } from "../utils.js" + +class ProxyAppMain extends Component { + + static childContextTypes = { + returnFocus: PropTypes.func.isRequired, + location: PropTypes.object.isRequired, + } + + static contextTypes = { + router: PropTypes.object.isRequired, + } + + constructor(props, context) { + super(props, context) + + this.settingsStore = new SettingsStore() + + // Default Settings before fetch + _.extend(this.settingsStore.dict, {}) + + this.state = { settings: this.settingsStore.dict } + + this.focus = this.focus.bind(this) + this.onKeyDown = this.onKeyDown.bind(this) + this.updateLocation = this.updateLocation.bind(this) + this.onSettingsChange = this.onSettingsChange.bind(this) + } + + /** + * @todo move to actions + */ + updateLocation(pathname, queryUpdate) { + if (pathname === undefined) { + pathname = this.props.location.pathname + } + const query = this.props.location.query + for (const key of Object.keys(queryUpdate || {})) { + query[key] = queryUpdate[key] || undefined + } + this.context.router.replace({ pathname, query }) + } + + /** + * @todo pass in with props + */ + getQuery() { + // For whatever reason, react-router always returns the same object, which makes comparing + // the current props with nextProps impossible. As a workaround, we just clone the query object. + return _.clone(this.props.location.query) + } + + /** + * @todo remove settings store + * @todo connect websocket here + * @todo listen to window's key events + */ + componentDidMount() { + this.focus() + this.settingsStore.addListener("recalculate", this.onSettingsChange) + } + + /** + * @todo remove settings store + * @todo disconnect websocket here + * @todo stop listening to window's key events + */ + componentWillUnmount() { + this.settingsStore.removeListener("recalculate", this.onSettingsChange) + } + + /** + * @todo move to actions + */ + onSettingsChange() { + this.setState({ settings: this.settingsStore.dict }) + } + + /** + * @todo use props + */ + getChildContext() { + return { + returnFocus: this.focus, + location: this.props.location + } + } + + /** + * @todo remove it + */ + focus() { + document.activeElement.blur() + window.getSelection().removeAllRanges() + ReactDOM.findDOMNode(this).focus() + } + + /** + * @todo move to actions + */ + onKeyDown(e) { + let name = null + + switch (e.keyCode) { + case Key.I: + name = "intercept" + break + case Key.L: + name = "search" + break + case Key.H: + name = "highlight" + break + default: + let main = this.refs.view + if (this.refs.view.getWrappedInstance) { + main = this.refs.view.getWrappedInstance() + } + if (main.onMainKeyDown) { + main.onMainKeyDown(e) + } + return // don't prevent default then + } + + if (name) { + const headerComponent = this.refs.header + headerComponent.setState({active: MainMenu}, function () { + headerComponent.refs.active.refs[name].select() + }) + } + + e.preventDefault() + } + + render() { + const { showEventLog, location, children } = this.props + const { settings } = this.state + const query = this.getQuery() + return ( +
+
+ {React.cloneElement( + children, + { ref: "view", location, query, updateLocation: this.updateLocation } + )} + {showEventLog && [ + , + + ]} +
+
+ ) + } +} + +export default connect( + state => ({ + showEventLog: state.eventLog.visible + }) +)(ProxyAppMain) diff --git a/web/src/js/components/flowtable-columns.js b/web/src/js/components/flowtable-columns.js deleted file mode 100644 index 799b3f9f..00000000 --- a/web/src/js/components/flowtable-columns.js +++ /dev/null @@ -1,131 +0,0 @@ -import React from "react" -import {RequestUtils, ResponseUtils} from "../flow/utils.js" -import {formatSize, formatTimeDelta} from "../utils.js" - - -export function TLSColumn({flow}) { - let ssl = (flow.request.scheme === "https") - let classes - if (ssl) { - classes = "col-tls col-tls-https" - } else { - classes = "col-tls col-tls-http" - } - return -} -TLSColumn.Title = ({className = "", ...props}) => -TLSColumn.sortKeyFun = flow => flow.request.scheme - - -export function IconColumn({flow}) { - let icon - if (flow.response) { - var contentType = ResponseUtils.getContentType(flow.response) - - //TODO: We should assign a type to the flow somewhere else. - if (flow.response.status_code === 304) { - icon = "resource-icon-not-modified" - } else if (300 <= flow.response.status_code && flow.response.status_code < 400) { - icon = "resource-icon-redirect" - } else if (contentType && contentType.indexOf("image") >= 0) { - icon = "resource-icon-image" - } else if (contentType && contentType.indexOf("javascript") >= 0) { - icon = "resource-icon-js" - } else if (contentType && contentType.indexOf("css") >= 0) { - icon = "resource-icon-css" - } else if (contentType && contentType.indexOf("html") >= 0) { - icon = "resource-icon-document" - } - } - if (!icon) { - icon = "resource-icon-plain" - } - - icon += " resource-icon" - return -
- -} -IconColumn.Title = ({className = "", ...props}) => - - -export function PathColumn({flow}) { - return - {flow.request.is_replay ? : null} - {flow.intercepted ? : null} - { RequestUtils.pretty_url(flow.request) } - -} -PathColumn.Title = ({className = "", ...props}) => - Path -PathColumn.sortKeyFun = flow => RequestUtils.pretty_url(flow.request) - - -export function MethodColumn({flow}) { - return {flow.request.method} -} -MethodColumn.Title = ({className = "", ...props}) => - Method -MethodColumn.sortKeyFun = flow => flow.request.method - - -export function StatusColumn({flow}) { - let status - if (flow.response) { - status = flow.response.status_code - } else { - status = null - } - return {status} - -} -StatusColumn.Title = ({className = "", ...props}) => - Status -StatusColumn.sortKeyFun = flow => flow.response ? flow.response.status_code : undefined - - -export function SizeColumn({flow}) { - let total = flow.request.contentLength - if (flow.response) { - total += flow.response.contentLength || 0 - } - let size = formatSize(total) - return {size} - -} -SizeColumn.Title = ({className = "", ...props}) => - Size -SizeColumn.sortKeyFun = flow => { - let total = flow.request.contentLength - if (flow.response) { - total += flow.response.contentLength || 0 - } - return total -} - - -export function TimeColumn({flow}) { - let time - if (flow.response) { - time = formatTimeDelta(1000 * (flow.response.timestamp_end - flow.request.timestamp_start)) - } else { - time = "..." - } - return {time} -} -TimeColumn.Title = ({className = "", ...props}) => - Time -TimeColumn.sortKeyFun = flow => flow.response.timestamp_end - flow.request.timestamp_start - - -var all_columns = [ - TLSColumn, - IconColumn, - PathColumn, - MethodColumn, - StatusColumn, - SizeColumn, - TimeColumn -] - -export default all_columns diff --git a/web/src/js/components/flowtable.js b/web/src/js/components/flowtable.js deleted file mode 100644 index 5a0793ba..00000000 --- a/web/src/js/components/flowtable.js +++ /dev/null @@ -1,201 +0,0 @@ -import React from "react"; -import ReactDOM from "react-dom"; -import {connect} from 'react-redux' -import classNames from "classnames"; -import _ from "lodash"; -import shallowEqual from "shallowequal"; -import AutoScroll from "./helpers/AutoScroll"; -import {calcVScroll} from "./helpers/VirtualScroll"; -import flowtable_columns from "./flowtable-columns.js"; -import Filt from "../filt/filt"; -import {setSort} from "../ducks/flows"; - - -FlowRow.propTypes = { - selectFlow: React.PropTypes.func.isRequired, - columns: React.PropTypes.array.isRequired, - flow: React.PropTypes.object.isRequired, - highlight: React.PropTypes.string, - selected: React.PropTypes.bool, -}; - -function FlowRow({flow, selected, highlight, columns, selectFlow}) { - - const className = classNames({ - "selected": selected, - "highlighted": highlight && parseFilter(highlight)(flow), - "intercepted": flow.intercepted, - "has-request": flow.request, - "has-response": flow.response, - }); - - return ( - selectFlow(flow)}> - {columns.map(Column => ( - - ))} - - ); -} - -const FlowRowContainer = connect( - (state, ownProps) => ({ - flow: state.flows.all.byId[ownProps.flowId], - highlight: state.flows.highlight, - selected: state.flows.selected.indexOf(ownProps.flowId) >= 0 - }) -)(FlowRow) - -function FlowTableHead({setSort, columns, sort}) { - const sortColumn = sort.sortColumn; - const sortType = sort.sortDesc ? "sort-desc" : "sort-asc"; - - return ( - - {columns.map(Column => ( - setSort({sortColumn: Column.name, sortDesc: Column.name != sort.sortColumn ? false : !sort.sortDesc})} - className={sortColumn === Column.name ? sortType : undefined} - /> - ))} - - ); -} - -FlowTableHead.propTypes = { - setSort: React.PropTypes.func.isRequired, - sort: React.PropTypes.object.isRequired, - columns: React.PropTypes.array.isRequired -}; - -const FlowTableHeadContainer = connect( - state => ({ - sort: state.flows.sort - }), - dispatch => ({ - setSort: (sort) => dispatch(setSort(sort)), - }) -)(FlowTableHead) - -class FlowTable extends React.Component { - - static propTypes = { - rowHeight: React.PropTypes.number, - }; - - static defaultProps = { - rowHeight: 32, - }; - - constructor(props, context) { - super(props, context); - - this.state = {vScroll: calcVScroll()}; - - this.onViewportUpdate = this.onViewportUpdate.bind(this); - } - - componentWillMount() { - window.addEventListener("resize", this.onViewportUpdate); - } - - componentWillUnmount() { - window.removeEventListener("resize", this.onViewportUpdate); - } - - componentWillReceiveProps(nextProps) { - if (nextProps.selected && nextProps.selected !== this.props.selected) { - window.setTimeout(() => this.scrollIntoView(nextProps.selected), 1) - } - } - - componentDidUpdate() { - this.onViewportUpdate(); - } - - onViewportUpdate() { - const viewport = ReactDOM.findDOMNode(this); - const viewportTop = viewport.scrollTop; - - const vScroll = calcVScroll({ - viewportTop, - viewportHeight: viewport.offsetHeight, - itemCount: this.props.flows.length, - rowHeight: this.props.rowHeight, - }); - - if (!shallowEqual(this.state.vScroll, vScroll) || - this.state.viewportTop !== viewportTop) { - this.setState({vScroll, viewportTop}); - } - } - - scrollIntoView(flow) { - const viewport = ReactDOM.findDOMNode(this); - const index = this.props.flows.indexOf(flow); - const rowHeight = this.props.rowHeight; - const head = ReactDOM.findDOMNode(this.refs.head); - - const headHeight = head ? head.offsetHeight : 0; - - const rowTop = (index * rowHeight) + headHeight; - const rowBottom = rowTop + rowHeight; - - const viewportTop = viewport.scrollTop; - const viewportHeight = viewport.offsetHeight; - - // Account for pinned thead - if (rowTop - headHeight < viewportTop) { - viewport.scrollTop = rowTop - headHeight; - } else if (rowBottom > viewportTop + viewportHeight) { - viewport.scrollTop = rowBottom - viewportHeight; - } - } - - render() { - const vScroll = this.state.vScroll; - const flows = this.props.flows.slice(vScroll.start, vScroll.end); - - const transform = `translate(0,${this.state.viewportTop}px)`; - - return ( -
- - - - - - - {flows.map(flow => ( - - ))} - - -
-
- ); - } -} - -FlowTable = AutoScroll(FlowTable) - - -const parseFilter = _.memoize(Filt.parse) - -const FlowTableContainer = connect( - state => ({ - flows: state.flows.view - }) -)(FlowTable) - -export default FlowTableContainer; diff --git a/web/src/js/ducks/flows.js b/web/src/js/ducks/flows.js index 6adde71c..f7a5538a 100644 --- a/web/src/js/ducks/flows.js +++ b/web/src/js/ducks/flows.js @@ -2,7 +2,7 @@ import makeList from "./utils/list" import Filt from "../filt/filt" import {updateViewFilter, updateViewList, updateViewSort} from "./utils/view" import {reverseString} from "../utils.js"; -import * as flow_table_columns from "../components/flowtable-columns.js"; +import * as columns from "../components/FlowTable/FlowColumns"; export const UPDATE_FLOWS = "UPDATE_FLOWS" export const SET_FILTER = "SET_FLOW_FILTER" @@ -32,7 +32,7 @@ function makeFilterFn(filter) { function makeSortFn(sort){ - let column = flow_table_columns[sort.sortColumn]; + let column = columns[sort.sortColumn]; if (!column) return; let sortKeyFun = column.sortKeyFun; @@ -108,4 +108,4 @@ export function selectFlow(flowId) { } -export {updateList as updateFlows, fetchList as fetchFlows} \ No newline at end of file +export {updateList as updateFlows, fetchList as fetchFlows} -- cgit v1.2.3 From e24bf8d73f744319eeed99e7cae0b7f2c3947b8f Mon Sep 17 00:00:00 2001 From: Jason Date: Thu, 9 Jun 2016 18:03:40 +0800 Subject: [web] fix shortcut for header fields --- mitmproxy/web/static/app.js | 2 +- web/src/js/components/ProxyApp.jsx | 2 +- web/src/js/components/header.js | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/mitmproxy/web/static/app.js b/mitmproxy/web/static/app.js index 9473a0b6..931c6c1f 100644 --- a/mitmproxy/web/static/app.js +++ b/mitmproxy/web/static/app.js @@ -53,7 +53,7 @@ function EventEmitter(){this._events=this._events||{},this._maxListeners=this._m "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function Footer(e){var a=e.settings,t=a.mode,s=a.intercept,l=a.showhost,c=a.no_upstream_cert,r=a.rawtcp,u=a.http2,n=a.anticache,o=a.anticomp,m=a.stickyauth,p=a.stickycookie,i=a.stream;return _react2["default"].createElement("footer",null,t&&"regular"!=t&&_react2["default"].createElement("span",{className:"label label-success"},t," mode"),s&&_react2["default"].createElement("span",{className:"label label-success"},"Intercept: ",s),l&&_react2["default"].createElement("span",{className:"label label-success"},"showhost"),c&&_react2["default"].createElement("span",{className:"label label-success"},"no-upstream-cert"),r&&_react2["default"].createElement("span",{className:"label label-success"},"raw-tcp"),!u&&_react2["default"].createElement("span",{className:"label label-success"},"no-http2"),n&&_react2["default"].createElement("span",{className:"label label-success"},"anticache"),o&&_react2["default"].createElement("span",{className:"label label-success"},"anticomp"),m&&_react2["default"].createElement("span",{className:"label label-success"},"stickyauth: ",m),p&&_react2["default"].createElement("span",{className:"label label-success"},"stickycookie: ",p),i&&_react2["default"].createElement("span",{className:"label label-success"},"stream: ",(0,_utils.formatSize)(i)))}Object.defineProperty(exports,"__esModule",{value:!0}),exports["default"]=Footer;var _react=require("react"),_react2=_interopRequireDefault(_react),_utils=require("../utils.js"),_common=require("./common.js");Footer.propTypes={settings:_react2["default"].PropTypes.object.isRequired}; },{"../utils.js":34,"./common.js":10,"react":"react"}],19:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.Header=exports.OptionMenu=exports.MainMenu=void 0;var _react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_jquery=require("jquery"),_jquery2=_interopRequireDefault(_jquery),_reactRedux=require("react-redux"),_filt=require("../filt/filt.js"),_filt2=_interopRequireDefault(_filt),_utils=require("../utils.js"),_common=require("./common.js"),_actions=require("../actions.js"),_eventlog=require("./eventlog"),FilterDocs=_react2["default"].createClass({displayName:"FilterDocs",statics:{xhr:!1,doc:!1},componentWillMount:function(){FilterDocs.doc||(FilterDocs.xhr=_jquery2["default"].getJSON("/filter-help").done(function(e){FilterDocs.doc=e,FilterDocs.xhr=!1})),FilterDocs.xhr&&FilterDocs.xhr.done(function(){this.forceUpdate()}.bind(this))},render:function(){if(FilterDocs.doc){var e=FilterDocs.doc.commands.map(function(e){return _react2["default"].createElement("tr",{key:e[1]},_react2["default"].createElement("td",null,e[0].replace(" "," ")),_react2["default"].createElement("td",null,e[1]))});return e.push(_react2["default"].createElement("tr",{key:"docs-link"},_react2["default"].createElement("td",{colSpan:"2"},_react2["default"].createElement("a",{href:"http://docs.mitmproxy.org/en/stable/features/filters.html",target:"_blank"},_react2["default"].createElement("i",{className:"fa fa-external-link"}),"  mitmproxy docs")))),_react2["default"].createElement("table",{className:"table table-condensed"},_react2["default"].createElement("tbody",null,e))}return _react2["default"].createElement("i",{className:"fa fa-spinner fa-spin"})}}),FilterInput=_react2["default"].createClass({displayName:"FilterInput",contextTypes:{returnFocus:_react2["default"].PropTypes.func},getInitialState:function(){return{value:this.props.value,focus:!1,mousefocus:!1}},componentWillReceiveProps:function(e){this.setState({value:e.value})},onChange:function(e){var t=e.target.value;this.setState({value:t}),this.isValid(t)&&this.props.onChange(t)},isValid:function(e){try{var t=e||this.state.value;return t&&_filt2["default"].parse(e||this.state.value),!0}catch(a){return!1}},getDesc:function(){if(this.state.value)try{return _filt2["default"].parse(this.state.value).desc}catch(e){return""+e}return _react2["default"].createElement(FilterDocs,null)},onFocus:function(){this.setState({focus:!0})},onBlur:function(){this.setState({focus:!1})},onMouseEnter:function(){this.setState({mousefocus:!0})},onMouseLeave:function(){this.setState({mousefocus:!1})},onKeyDown:function(e){e.keyCode!==_utils.Key.ESC&&e.keyCode!==_utils.Key.ENTER||(this.blur(),this.setState({mousefocus:!1})),e.stopPropagation()},blur:function(){_reactDom2["default"].findDOMNode(this.refs.input).blur(),this.context.returnFocus()},select:function(){_reactDom2["default"].findDOMNode(this.refs.input).select()},render:function(){var e,t=this.isValid(),a="fa fa-fw fa-"+this.props.type,n="filter-input input-group"+(t?"":" has-error");return(this.state.focus||this.state.mousefocus)&&(e=_react2["default"].createElement("div",{className:"popover bottom",onMouseEnter:this.onMouseEnter,onMouseLeave:this.onMouseLeave},_react2["default"].createElement("div",{className:"arrow"}),_react2["default"].createElement("div",{className:"popover-content"},this.getDesc()))),_react2["default"].createElement("div",{className:n},_react2["default"].createElement("span",{className:"input-group-addon"},_react2["default"].createElement("i",{className:a,style:{color:this.props.color}})),_react2["default"].createElement("input",{type:"text",placeholder:this.props.placeholder,className:"form-control",ref:"input",onChange:this.onChange,onFocus:this.onFocus,onBlur:this.onBlur,onKeyDown:this.onKeyDown,value:this.state.value}),e)}}),MainMenu=exports.MainMenu=_react2["default"].createClass({displayName:"MainMenu",propTypes:{settings:_react2["default"].PropTypes.object.isRequired},statics:{title:"Start",route:"flows"},onSearchChange:function(e){var t={};t[_actions.Query.SEARCH]=e,this.props.updateLocation(void 0,t)},onHighlightChange:function(e){var t={};t[_actions.Query.HIGHLIGHT]=e,this.props.updateLocation(void 0,t)},onInterceptChange:function(e){_actions.SettingsActions.update({intercept:e})},render:function(){var e=this.props.query[_actions.Query.SEARCH]||"",t=this.props.query[_actions.Query.HIGHLIGHT]||"",a=this.props.settings.intercept||"";return _react2["default"].createElement("div",null,_react2["default"].createElement("div",{className:"menu-row"},_react2["default"].createElement(FilterInput,{ref:"search",placeholder:"Search",type:"search",color:"black",value:e,onChange:this.onSearchChange}),_react2["default"].createElement(FilterInput,{ref:"highlight",placeholder:"Highlight",type:"tag",color:"hsl(48, 100%, 50%)",value:t,onChange:this.onHighlightChange}),_react2["default"].createElement(FilterInput,{ref:"intercept",placeholder:"Intercept",type:"pause",color:"hsl(208, 56%, 53%)",value:a,onChange:this.onInterceptChange})),_react2["default"].createElement("div",{className:"clearfix"}))}}),ViewMenu=_react2["default"].createClass({displayName:"ViewMenu",statics:{title:"View",route:"flows"},render:function(){return _react2["default"].createElement("div",null,_react2["default"].createElement("div",{className:"menu-row"},_react2["default"].createElement(_eventlog.ToggleEventLog,{text:"Show Event Log"})),_react2["default"].createElement("div",{className:"clearfix"}))}}),OptionMenu=exports.OptionMenu=function(e){var t=e.settings,a=(t.mode,t.intercept,t.showhost),n=t.no_upstream_cert,r=t.rawtcp,l=t.http2,c=t.anticache,i=t.anticomp,o=t.stickycookie,s=t.stickyauth,u=t.stream;return _react2["default"].createElement("div",null,_react2["default"].createElement("div",{className:"menu-row"},_react2["default"].createElement(_common.ToggleButton,{text:"showhost",checked:a,onToggle:function(){return _actions.SettingsActions.update({showhost:!a})}}),_react2["default"].createElement(_common.ToggleButton,{text:"no_upstream_cert",checked:n,onToggle:function(){return _actions.SettingsActions.update({no_upstream_cert:!n})}}),_react2["default"].createElement(_common.ToggleButton,{text:"rawtcp",checked:r,onToggle:function(){return _actions.SettingsActions.update({rawtcp:!r})}}),_react2["default"].createElement(_common.ToggleButton,{text:"http2",checked:l,onToggle:function(){return _actions.SettingsActions.update({http2:!l})}}),_react2["default"].createElement(_common.ToggleButton,{text:"anticache",checked:c,onToggle:function(){return _actions.SettingsActions.update({anticache:!c})}}),_react2["default"].createElement(_common.ToggleButton,{text:"anticomp",checked:i,onToggle:function(){return _actions.SettingsActions.update({anticomp:!i})}}),_react2["default"].createElement(_common.ToggleInputButton,{name:"stickyauth",placeholder:"Sticky auth filter",checked:Boolean(s),txt:s||"",onToggleChanged:function(e){return _actions.SettingsActions.update({stickyauth:s?null:e})}}),_react2["default"].createElement(_common.ToggleInputButton,{name:"stickycookie",placeholder:"Sticky cookie filter",checked:Boolean(o),txt:o||"",onToggleChanged:function(e){return _actions.SettingsActions.update({stickycookie:o?null:e})}}),_react2["default"].createElement(_common.ToggleInputButton,{name:"stream",placeholder:"stream...",checked:Boolean(u),txt:u||"",inputType:"number",onToggleChanged:function(e){return _actions.SettingsActions.update({stream:u?null:e})}})),_react2["default"].createElement("div",{className:"clearfix"}))};OptionMenu.title="Options",OptionMenu.propTypes={settings:_react2["default"].PropTypes.object.isRequired};var ReportsMenu=_react2["default"].createClass({displayName:"ReportsMenu",statics:{title:"Visualization",route:"reports"},render:function(){return _react2["default"].createElement("div",null,"Reports Menu")}}),FileMenu=_react2["default"].createClass({displayName:"FileMenu",getInitialState:function(){return{showFileMenu:!1}},handleFileClick:function(e){if(e.preventDefault(),!this.state.showFileMenu){var t=function(){this.setState({showFileMenu:!1}),document.removeEventListener("click",t)}.bind(this);document.addEventListener("click",t),this.setState({showFileMenu:!0})}},handleNewClick:function(e){e.preventDefault(),confirm("Delete all flows?")&&_actions.FlowActions.clear()},handleOpenClick:function(e){this.fileInput.click(),e.preventDefault()},handleOpenFile:function(e){e.target.files.length>0&&(_actions.FlowActions.upload(e.target.files[0]),this.fileInput.value=""),e.preventDefault()},handleSaveClick:function(e){e.preventDefault(),_actions.FlowActions.download()},handleShutdownClick:function(e){e.preventDefault(),console.error("unimplemented: handleShutdownClick")},render:function(){var e=this,t="dropdown pull-left"+(this.state.showFileMenu?" open":"");return _react2["default"].createElement("div",{className:t},_react2["default"].createElement("a",{href:"#",className:"special",onClick:this.handleFileClick}," mitmproxy "),_react2["default"].createElement("ul",{className:"dropdown-menu",role:"menu"},_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"#",onClick:this.handleNewClick},_react2["default"].createElement("i",{className:"fa fa-fw fa-file"}),"New")),_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"#",onClick:this.handleOpenClick},_react2["default"].createElement("i",{className:"fa fa-fw fa-folder-open"}),"Open..."),_react2["default"].createElement("input",{ref:function(t){return e.fileInput=t},className:"hidden",type:"file",onChange:this.handleOpenFile})),_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"#",onClick:this.handleSaveClick},_react2["default"].createElement("i",{className:"fa fa-fw fa-floppy-o"}),"Save...")),_react2["default"].createElement("li",{role:"presentation",className:"divider"}),_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"http://mitm.it/",target:"_blank"},_react2["default"].createElement("i",{className:"fa fa-fw fa-external-link"}),"Install Certificates..."))))}}),header_entries=[MainMenu,ViewMenu,OptionMenu],Header=exports.Header=_react2["default"].createClass({displayName:"Header",propTypes:{settings:_react2["default"].PropTypes.object.isRequired},getInitialState:function(){return{active:header_entries[0]}},handleClick:function(e,t){t.preventDefault(),this.props.updateLocation(e.route),this.setState({active:e})},render:function(){var e=header_entries.map(function(e,t){var a;return a=e===this.state.active?"active":"",_react2["default"].createElement("a",{key:t,href:"#",className:a,onClick:this.handleClick.bind(this,e)},e.title)}.bind(this));return _react2["default"].createElement("header",null,_react2["default"].createElement("nav",{className:"nav-tabs nav-tabs-lg"},_react2["default"].createElement(FileMenu,null),e),_react2["default"].createElement("div",{className:"menu"},_react2["default"].createElement(this.state.active,{settings:this.props.settings,updateLocation:this.props.updateLocation,query:this.props.query})))}}); +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.Header=exports.OptionMenu=exports.MainMenu=void 0;var _react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_jquery=require("jquery"),_jquery2=_interopRequireDefault(_jquery),_reactRedux=require("react-redux"),_filt=require("../filt/filt.js"),_filt2=_interopRequireDefault(_filt),_utils=require("../utils.js"),_common=require("./common.js"),_actions=require("../actions.js"),_eventlog=require("./eventlog"),FilterDocs=_react2["default"].createClass({displayName:"FilterDocs",statics:{xhr:!1,doc:!1},componentWillMount:function(){FilterDocs.doc||(FilterDocs.xhr=_jquery2["default"].getJSON("/filter-help").done(function(e){FilterDocs.doc=e,FilterDocs.xhr=!1})),FilterDocs.xhr&&FilterDocs.xhr.done(function(){this.forceUpdate()}.bind(this))},render:function(){if(FilterDocs.doc){var e=FilterDocs.doc.commands.map(function(e){return _react2["default"].createElement("tr",{key:e[1]},_react2["default"].createElement("td",null,e[0].replace(" "," ")),_react2["default"].createElement("td",null,e[1]))});return e.push(_react2["default"].createElement("tr",{key:"docs-link"},_react2["default"].createElement("td",{colSpan:"2"},_react2["default"].createElement("a",{href:"http://docs.mitmproxy.org/en/stable/features/filters.html",target:"_blank"},_react2["default"].createElement("i",{className:"fa fa-external-link"}),"  mitmproxy docs")))),_react2["default"].createElement("table",{className:"table table-condensed"},_react2["default"].createElement("tbody",null,e))}return _react2["default"].createElement("i",{className:"fa fa-spinner fa-spin"})}}),FilterInput=_react2["default"].createClass({displayName:"FilterInput",contextTypes:{returnFocus:_react2["default"].PropTypes.func},getInitialState:function(){return{value:this.props.value,focus:!1,mousefocus:!1}},componentWillReceiveProps:function(e){this.setState({value:e.value})},onChange:function(e){var t=e.target.value;this.setState({value:t}),this.isValid(t)&&this.props.onChange(t)},isValid:function(e){try{var t=e||this.state.value;return t&&_filt2["default"].parse(e||this.state.value),!0}catch(a){return!1}},getDesc:function(){if(this.state.value)try{return _filt2["default"].parse(this.state.value).desc}catch(e){return""+e}return _react2["default"].createElement(FilterDocs,null)},onFocus:function(){this.setState({focus:!0})},onBlur:function(){this.setState({focus:!1})},onMouseEnter:function(){this.setState({mousefocus:!0})},onMouseLeave:function(){this.setState({mousefocus:!1})},onKeyDown:function(e){e.keyCode!==_utils.Key.ESC&&e.keyCode!==_utils.Key.ENTER||(this.blur(),this.setState({mousefocus:!1})),e.stopPropagation()},blur:function(){_reactDom2["default"].findDOMNode(this.refs.input).blur(),this.context.returnFocus()},select:function(){_reactDom2["default"].findDOMNode(this.refs.input).select()},render:function(){var e,t=this.isValid(),a="fa fa-fw fa-"+this.props.type,n="filter-input input-group"+(t?"":" has-error");return(this.state.focus||this.state.mousefocus)&&(e=_react2["default"].createElement("div",{className:"popover bottom",onMouseEnter:this.onMouseEnter,onMouseLeave:this.onMouseLeave},_react2["default"].createElement("div",{className:"arrow"}),_react2["default"].createElement("div",{className:"popover-content"},this.getDesc()))),_react2["default"].createElement("div",{className:n},_react2["default"].createElement("span",{className:"input-group-addon"},_react2["default"].createElement("i",{className:a,style:{color:this.props.color}})),_react2["default"].createElement("input",{type:"text",placeholder:this.props.placeholder,className:"form-control",ref:"input",onChange:this.onChange,onFocus:this.onFocus,onBlur:this.onBlur,onKeyDown:this.onKeyDown,value:this.state.value}),e)}}),MainMenu=exports.MainMenu=_react2["default"].createClass({displayName:"MainMenu",propTypes:{settings:_react2["default"].PropTypes.object.isRequired},statics:{title:"Start",route:"flows"},onSearchChange:function(e){var t={};t[_actions.Query.SEARCH]=e,this.props.updateLocation(void 0,t)},onHighlightChange:function(e){var t={};t[_actions.Query.HIGHLIGHT]=e,this.props.updateLocation(void 0,t)},onInterceptChange:function(e){_actions.SettingsActions.update({intercept:e})},render:function(){var e=this.props.query[_actions.Query.SEARCH]||"",t=this.props.query[_actions.Query.HIGHLIGHT]||"",a=this.props.settings.intercept||"";return _react2["default"].createElement("div",null,_react2["default"].createElement("div",{className:"menu-row"},_react2["default"].createElement(FilterInput,{ref:"search",placeholder:"Search",type:"search",color:"black",value:e,onChange:this.onSearchChange}),_react2["default"].createElement(FilterInput,{ref:"highlight",placeholder:"Highlight",type:"tag",color:"hsl(48, 100%, 50%)",value:t,onChange:this.onHighlightChange}),_react2["default"].createElement(FilterInput,{ref:"intercept",placeholder:"Intercept",type:"pause",color:"hsl(208, 56%, 53%)",value:a,onChange:this.onInterceptChange})),_react2["default"].createElement("div",{className:"clearfix"}))}}),ViewMenu=_react2["default"].createClass({displayName:"ViewMenu",statics:{title:"View",route:"flows"},render:function(){return _react2["default"].createElement("div",null,_react2["default"].createElement("div",{className:"menu-row"},_react2["default"].createElement(_eventlog.ToggleEventLog,{text:"Show Event Log"})),_react2["default"].createElement("div",{className:"clearfix"}))}}),OptionMenu=exports.OptionMenu=function(e){var t=e.settings,a=(t.mode,t.intercept,t.showhost),n=t.no_upstream_cert,r=t.rawtcp,l=t.http2,c=t.anticache,i=t.anticomp,o=t.stickycookie,s=t.stickyauth,u=t.stream;return _react2["default"].createElement("div",null,_react2["default"].createElement("div",{className:"menu-row"},_react2["default"].createElement(_common.ToggleButton,{text:"showhost",checked:a,onToggle:function(){return _actions.SettingsActions.update({showhost:!a})}}),_react2["default"].createElement(_common.ToggleButton,{text:"no_upstream_cert",checked:n,onToggle:function(){return _actions.SettingsActions.update({no_upstream_cert:!n})}}),_react2["default"].createElement(_common.ToggleButton,{text:"rawtcp",checked:r,onToggle:function(){return _actions.SettingsActions.update({rawtcp:!r})}}),_react2["default"].createElement(_common.ToggleButton,{text:"http2",checked:l,onToggle:function(){return _actions.SettingsActions.update({http2:!l})}}),_react2["default"].createElement(_common.ToggleButton,{text:"anticache",checked:c,onToggle:function(){return _actions.SettingsActions.update({anticache:!c})}}),_react2["default"].createElement(_common.ToggleButton,{text:"anticomp",checked:i,onToggle:function(){return _actions.SettingsActions.update({anticomp:!i})}}),_react2["default"].createElement(_common.ToggleInputButton,{name:"stickyauth",placeholder:"Sticky auth filter",checked:Boolean(s),txt:s||"",onToggleChanged:function(e){return _actions.SettingsActions.update({stickyauth:s?null:e})}}),_react2["default"].createElement(_common.ToggleInputButton,{name:"stickycookie",placeholder:"Sticky cookie filter",checked:Boolean(o),txt:o||"",onToggleChanged:function(e){return _actions.SettingsActions.update({stickycookie:o?null:e})}}),_react2["default"].createElement(_common.ToggleInputButton,{name:"stream",placeholder:"stream...",checked:Boolean(u),txt:u||"",inputType:"number",onToggleChanged:function(e){return _actions.SettingsActions.update({stream:u?null:e})}})),_react2["default"].createElement("div",{className:"clearfix"}))};OptionMenu.title="Options",OptionMenu.propTypes={settings:_react2["default"].PropTypes.object.isRequired};var ReportsMenu=_react2["default"].createClass({displayName:"ReportsMenu",statics:{title:"Visualization",route:"reports"},render:function(){return _react2["default"].createElement("div",null,"Reports Menu")}}),FileMenu=_react2["default"].createClass({displayName:"FileMenu",getInitialState:function(){return{showFileMenu:!1}},handleFileClick:function(e){if(e.preventDefault(),!this.state.showFileMenu){var t=function(){this.setState({showFileMenu:!1}),document.removeEventListener("click",t)}.bind(this);document.addEventListener("click",t),this.setState({showFileMenu:!0})}},handleNewClick:function(e){e.preventDefault(),confirm("Delete all flows?")&&_actions.FlowActions.clear()},handleOpenClick:function(e){this.fileInput.click(),e.preventDefault()},handleOpenFile:function(e){e.target.files.length>0&&(_actions.FlowActions.upload(e.target.files[0]),this.fileInput.value=""),e.preventDefault()},handleSaveClick:function(e){e.preventDefault(),_actions.FlowActions.download()},handleShutdownClick:function(e){e.preventDefault(),console.error("unimplemented: handleShutdownClick")},render:function(){var e=this,t="dropdown pull-left"+(this.state.showFileMenu?" open":"");return _react2["default"].createElement("div",{className:t},_react2["default"].createElement("a",{href:"#",className:"special",onClick:this.handleFileClick}," mitmproxy "),_react2["default"].createElement("ul",{className:"dropdown-menu",role:"menu"},_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"#",onClick:this.handleNewClick},_react2["default"].createElement("i",{className:"fa fa-fw fa-file"}),"New")),_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"#",onClick:this.handleOpenClick},_react2["default"].createElement("i",{className:"fa fa-fw fa-folder-open"}),"Open..."),_react2["default"].createElement("input",{ref:function(t){return e.fileInput=t},className:"hidden",type:"file",onChange:this.handleOpenFile})),_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"#",onClick:this.handleSaveClick},_react2["default"].createElement("i",{className:"fa fa-fw fa-floppy-o"}),"Save...")),_react2["default"].createElement("li",{role:"presentation",className:"divider"}),_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"http://mitm.it/",target:"_blank"},_react2["default"].createElement("i",{className:"fa fa-fw fa-external-link"}),"Install Certificates..."))))}}),header_entries=[MainMenu,ViewMenu,OptionMenu],Header=exports.Header=_react2["default"].createClass({displayName:"Header",propTypes:{settings:_react2["default"].PropTypes.object.isRequired},getInitialState:function(){return{active:header_entries[0]}},handleClick:function(e,t){t.preventDefault(),this.props.updateLocation(e.route),this.setState({active:e})},render:function(){var e=header_entries.map(function(e,t){var a;return a=e===this.state.active?"active":"",_react2["default"].createElement("a",{key:t,href:"#",className:a,onClick:this.handleClick.bind(this,e)},e.title)}.bind(this));return _react2["default"].createElement("header",null,_react2["default"].createElement("nav",{className:"nav-tabs nav-tabs-lg"},_react2["default"].createElement(FileMenu,null),e),_react2["default"].createElement("div",{className:"menu"},_react2["default"].createElement(this.state.active,{ref:"active",settings:this.props.settings,updateLocation:this.props.updateLocation,query:this.props.query})))}}); },{"../actions.js":2,"../filt/filt.js":31,"../utils.js":34,"./common.js":10,"./eventlog":12,"jquery":"jquery","react":"react","react-dom":"react-dom","react-redux":"react-redux"}],20:[function(require,module,exports){ "use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function t(t,e){for(var o=0;o { headerComponent.refs.active.refs[name].select() }) } diff --git a/web/src/js/components/header.js b/web/src/js/components/header.js index 4152e95c..afd295cf 100644 --- a/web/src/js/components/header.js +++ b/web/src/js/components/header.js @@ -442,6 +442,7 @@ export var Header = React.createClass({
Date: Thu, 9 Jun 2016 18:13:18 +0800 Subject: [web] footer.js -> Footer.jsx --- mitmproxy/web/static/app.js | 32 ++++++++++++------------ web/src/js/components/Footer.jsx | 47 +++++++++++++++++++++++++++++++++++ web/src/js/components/ProxyApp.jsx | 2 +- web/src/js/components/footer.js | 50 -------------------------------------- 4 files changed, 64 insertions(+), 67 deletions(-) create mode 100644 web/src/js/components/Footer.jsx delete mode 100644 web/src/js/components/footer.js diff --git a/mitmproxy/web/static/app.js b/mitmproxy/web/static/app.js index 931c6c1f..f372340a 100644 --- a/mitmproxy/web/static/app.js +++ b/mitmproxy/web/static/app.js @@ -7,7 +7,7 @@ function EventEmitter(){this._events=this._events||{},this._maxListeners=this._m },{"./dispatcher.js":24,"./utils.js":34,"jquery":"jquery"}],3:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}var _react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_redux=require("redux"),_reactRedux=require("react-redux"),_reduxLogger=require("redux-logger"),_reduxLogger2=_interopRequireDefault(_reduxLogger),_reduxThunk=require("redux-thunk"),_reduxThunk2=_interopRequireDefault(_reduxThunk),_reactRouter=require("react-router"),_connection=require("./connection"),_connection2=_interopRequireDefault(_connection),_ProxyApp=require("./components/ProxyApp"),_ProxyApp2=_interopRequireDefault(_ProxyApp),_MainView=require("./components/MainView"),_MainView2=_interopRequireDefault(_MainView),_index=require("./ducks/index"),_index2=_interopRequireDefault(_index),_eventLog=require("./ducks/eventLog"),store=(0,_redux.createStore)(_index2["default"],(0,_redux.applyMiddleware)(_reduxThunk2["default"],(0,_reduxLogger2["default"])()));window.addEventListener("error",function(e){store.dispatch((0,_eventLog.addLogEntry)(e))}),document.addEventListener("DOMContentLoaded",function(){window.ws=new _connection2["default"]("/updates",store.dispatch),(0,_reactDom.render)(_react2["default"].createElement(_reactRedux.Provider,{store:store},_react2["default"].createElement(_reactRouter.Router,{history:_reactRouter.hashHistory},_react2["default"].createElement(_reactRouter.Redirect,{from:"/",to:"/flows"}),_react2["default"].createElement(_reactRouter.Route,{path:"/",component:_ProxyApp2["default"]},_react2["default"].createElement(_reactRouter.Route,{path:"flows",component:_MainView2["default"]}),_react2["default"].createElement(_reactRouter.Route,{path:"flows/:flowId/:detailTab",component:_MainView2["default"]})))),document.getElementById("mitmproxy"))}); -},{"./components/MainView":8,"./components/ProxyApp":9,"./connection":23,"./ducks/eventLog":25,"./ducks/index":27,"react":"react","react-dom":"react-dom","react-redux":"react-redux","react-router":"react-router","redux":"redux","redux-logger":"redux-logger","redux-thunk":"redux-thunk"}],4:[function(require,module,exports){ +},{"./components/MainView":9,"./components/ProxyApp":10,"./connection":23,"./ducks/eventLog":25,"./ducks/index":27,"react":"react","react-dom":"react-dom","react-redux":"react-redux","react-router":"react-router","redux":"redux","redux-logger":"redux-logger","redux-thunk":"redux-thunk"}],4:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var o=0;on-i?l.scrollTop=n-i:u>c+s&&(l.scrollTop=u-s)}}},{key:"componentWillReceiveProps",value:function(e){e.selected&&e.selected!==this.props.selected&&(this.shouldScrollIntoView=!0)}},{key:"onViewportUpdate",value:function(){var e=_reactDom2["default"].findDOMNode(this),t=e.scrollTop,o=(0,_VirtualScroll.calcVScroll)({viewportTop:t,viewportHeight:e.offsetHeight,itemCount:this.props.flows.length,rowHeight:this.props.rowHeight});this.state.viewportTop===t&&(0,_shallowequal2["default"])(this.state.vScroll,o)||this.setState({vScroll:o,viewportTop:t})}},{key:"render",value:function(){var e=this,t=this.state,o=t.vScroll,r=t.viewportTop,l=this.props,a=l.flows,i=l.selected,n=l.highlight,u=n?_filt2["default"].parse(n):function(){return!1};return _react2["default"].createElement("div",{className:"flow-table",onScroll:this.onViewportUpdate},_react2["default"].createElement("table",null,_react2["default"].createElement("thead",{ref:"head",style:{transform:"translateY("+r+"px)"}},_react2["default"].createElement(_FlowTableHead2["default"],null)),_react2["default"].createElement("tbody",null,_react2["default"].createElement("tr",{style:{height:o.paddingTop}}),a.slice(o.start,o.end).map(function(t){return _react2["default"].createElement(_FlowRow2["default"],{key:t.id,flow:t,selected:t===i,highlighted:u(t),onSelect:e.props.onSelect})}),_react2["default"].createElement("tr",{style:{height:o.paddingBottom}}))))}}]),t}(_react2["default"].Component);FlowTable.propTypes={onSelect:_react.PropTypes.func.isRequired,flows:_react.PropTypes.array.isRequired,rowHeight:_react.PropTypes.number,highlight:_react.PropTypes.string,selected:_react.PropTypes.object},FlowTable.defaultProps={rowHeight:32},exports["default"]=(0,_AutoScroll2["default"])(FlowTable); },{"../filt/filt":31,"./FlowTable/FlowRow":6,"./FlowTable/FlowTableHead":7,"./helpers/AutoScroll":20,"./helpers/VirtualScroll":21,"react":"react","react-dom":"react-dom","shallowequal":"shallowequal"}],5:[function(require,module,exports){ @@ -20,42 +20,42 @@ function EventEmitter(){this._events=this._events||{},this._maxListeners=this._m "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function FlowTableHead(e){function r(e){s({sortColumn:e.name,sortDesc:e.name!==t?!1:!o})}var t=e.sortColumn,o=e.sortDesc,s=e.onSort,u=o?"sort-desc":"sort-asc";return _react2["default"].createElement("tr",null,_FlowColumns2["default"].map(function(e){return _react2["default"].createElement("th",{className:(0,_classnames2["default"])(e.headerClass,t===e.name&&u),key:e.name,onClick:function(){return r(e)}},e.headerName)}))}Object.defineProperty(exports,"__esModule",{value:!0});var _react=require("react"),_react2=_interopRequireDefault(_react),_redux=require("redux"),_reactRedux=require("react-redux"),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_FlowColumns=require("./FlowColumns"),_FlowColumns2=_interopRequireDefault(_FlowColumns),_flows=require("../../ducks/flows");FlowTableHead.propTypes={onSort:_react.PropTypes.func.isRequired,sortDesc:_react2["default"].PropTypes.bool.isRequired,sortColumn:_react2["default"].PropTypes.string},exports["default"]=(0,_reactRedux.connect)(function(e){return{sortDesc:e.flows.sort.sortDesc,sortColumn:e.flows.sort.sortColumn}},function(e){return(0,_redux.bindActionCreators)({onSort:_flows.setSort},e)})(FlowTableHead); },{"../../ducks/flows":26,"./FlowColumns":5,"classnames":"classnames","react":"react","react-redux":"react-redux","redux":"redux"}],8:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function Footer(e){var a=e.settings;return _react2["default"].createElement("footer",null,a.mode&&"regular"!=a.mode&&_react2["default"].createElement("span",{className:"label label-success"},a.mode," mode"),a.intercept&&_react2["default"].createElement("span",{className:"label label-success"},"Intercept: ",a.intercept),a.showhost&&_react2["default"].createElement("span",{className:"label label-success"},"showhost"),a.no_upstream_cert&&_react2["default"].createElement("span",{className:"label label-success"},"no-upstream-cert"),a.rawtcp&&_react2["default"].createElement("span",{className:"label label-success"},"raw-tcp"),!a.http2&&_react2["default"].createElement("span",{className:"label label-success"},"no-http2"),a.anticache&&_react2["default"].createElement("span",{className:"label label-success"},"anticache"),a.anticomp&&_react2["default"].createElement("span",{className:"label label-success"},"anticomp"),a.stickyauth&&_react2["default"].createElement("span",{className:"label label-success"},"stickyauth: ",a.stickyauth),a.stickycookie&&_react2["default"].createElement("span",{className:"label label-success"},"stickycookie: ",a.stickycookie),a.stream&&_react2["default"].createElement("span",{className:"label label-success"},"stream: ",(0,_utils.formatSize)(a.stream)))}Object.defineProperty(exports,"__esModule",{value:!0}),exports["default"]=Footer;var _react=require("react"),_react2=_interopRequireDefault(_react),_utils=require("../utils.js"),_common=require("./common.js");Footer.propTypes={settings:_react2["default"].PropTypes.object.isRequired}; + +},{"../utils.js":34,"./common.js":11,"react":"react"}],9:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var s=0;se&&(o=s.length-1),this.selectFlow(s[o])}},{key:"onMainKeyDown",value:function(e){var t=this.props.selectedFlow;if(!e.ctrlKey){switch(e.keyCode){case _utils.Key.K:case _utils.Key.UP:this.selectFlowRelative(-1);break;case _utils.Key.J:case _utils.Key.DOWN:this.selectFlowRelative(1);break;case _utils.Key.SPACE:case _utils.Key.PAGE_DOWN:this.selectFlowRelative(10);break;case _utils.Key.PAGE_UP:this.selectFlowRelative(-10);break;case _utils.Key.END:this.selectFlowRelative(1e10);break;case _utils.Key.HOME:this.selectFlowRelative(-1e10);break;case _utils.Key.ESC:this.selectFlow(null);break;case _utils.Key.H:case _utils.Key.LEFT:this.refs.flowDetails&&this.refs.flowDetails.nextTab(-1);break;case _utils.Key.L:case _utils.Key.TAB:case _utils.Key.RIGHT:this.refs.flowDetails&&this.refs.flowDetails.nextTab(1);break;case _utils.Key.C:e.shiftKey&&_actions.FlowActions.clear();break;case _utils.Key.D:t&&(e.shiftKey?_actions.FlowActions.duplicate(t):_actions.FlowActions["delete"](t));break;case _utils.Key.A:e.shiftKey?_actions.FlowActions.accept_all():t&&t.intercepted&&_actions.FlowActions.accept(t);break;case _utils.Key.R:!e.shiftKey&&t&&_actions.FlowActions.replay(t);break;case _utils.Key.V:e.shiftKey&&t&&t.modified&&_actions.FlowActions.revert(t);break;case _utils.Key.E:this.refs.flowDetails&&this.refs.flowDetails.promptEdit();break;case _utils.Key.SHIFT:break;default:return void console.debug("keydown",e.keyCode)}e.preventDefault()}}},{key:"render",value:function(){var e=this,t=this.props,s=t.flows,i=t.selectedFlow,l=t.highlight;t.sort;return _react2["default"].createElement("div",{className:"main-view"},_react2["default"].createElement(_FlowTable2["default"],{ref:"flowTable",flows:s,selected:i,highlight:l,onSelect:function(t){return e.selectFlow(t)}}),i&&[_react2["default"].createElement(_common.Splitter,{key:"splitter"}),_react2["default"].createElement(_index2["default"],{key:"flowDetails",ref:"flowDetails",tab:this.props.routeParams.detailTab,query:this.props.query,updateLocation:this.props.updateLocation,flow:i})])}}]),t}(_react.Component);MainView.propTypes={highlight:_react.PropTypes.string,sort:_react.PropTypes.object},exports["default"]=(0,_reactRedux.connect)(function(e){return{flows:e.flows.view,filter:e.flows.filter,sort:e.flows.sort,highlight:e.flows.highlight,selectedFlow:e.flows.all.byId[e.flows.selected[0]]}},function(e){return(0,_redux.bindActionCreators)({selectFlow:_flows.selectFlow,setFilter:_flows.setFilter,setHighlight:_flows.setHighlight},e)},void 0,{withRef:!0})(MainView); -},{"../actions.js":2,"../ducks/flows":26,"../utils.js":34,"./FlowTable":4,"./common.js":10,"./flowview/index.js":15,"react":"react","react-redux":"react-redux","redux":"redux"}],9:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var r=0;r0)e=o.getRangeAt(0);else if(document.caretPositionFromPoint&&t.clientX&&t.clientY){var n=document.caretPositionFromPoint(t.clientX,t.clientY);e=document.createRange(),e.setStart(n.offsetNode,n.offset)}else document.caretRangeFromPoint&&t.clientX&&t.clientY?e=document.caretRangeFromPoint(t.clientX,t.clientY):(e=document.createRange(),e.selectNodeContents(_reactDom2["default"].findDOMNode(this)));this._ignore_events=!0,this.setState({editable:!0},function(){var t=_reactDom2["default"].findDOMNode(this);t.blur(),t.focus(),this._ignore_events=!1})}},stop:function(){_reactDom2["default"].findDOMNode(this).blur(),this.props.onStop&&this.props.onStop()},_stop:function(t){if(!this._ignore_events){console.log("_stop",_.extend({},t)),window.getSelection().removeAllRanges();var e=_reactDom2["default"].findDOMNode(this),o=this.props.nodeToContent(e);this.setState({editable:!1}),this.props.onDone(o),this.props.onBlur&&this.props.onBlur(t)}},reset:function(){_reactDom2["default"].findDOMNode(this).innerHTML=this.props.contentToHtml(this.props.content)},onKeyDown:function(t){switch(t.stopPropagation(),t.keyCode){case _utils.Key.ESC:t.preventDefault(),this.reset(),this.stop();break;case _utils.Key.ENTER:this.props.submitOnEnter&&!t.shiftKey&&(t.preventDefault(),this.stop())}},onInput:function(){var t=_reactDom2["default"].findDOMNode(this),e=this.props.nodeToContent(t);this.props.onInput&&this.props.onInput(e)}}),ValidateEditor=_react2["default"].createClass({displayName:"ValidateEditor",propTypes:{content:_react2["default"].PropTypes.string.isRequired,onDone:_react2["default"].PropTypes.func.isRequired,onInput:_react2["default"].PropTypes.func,isValid:_react2["default"].PropTypes.func,className:_react2["default"].PropTypes.string},getInitialState:function(){return{currentContent:this.props.content}},componentWillReceiveProps:function(){this.setState({currentContent:this.props.content})},onInput:function(t){this.setState({currentContent:t}),this.props.onInput&&this.props.onInput(t)},render:function(){var t=this.props.className||"";return this.props.isValid&&(t+=this.props.isValid(this.state.currentContent)?" has-success":" has-warning"),_react2["default"].createElement(EditorBase,_extends({},this.props,{ref:"editor",className:t,onDone:this.onDone,onInput:this.onInput}))},onDone:function(t){this.props.isValid&&!this.props.isValid(t)&&(this.refs.editor.reset(),t=this.props.content),this.props.onDone(t)}}),ValueEditor=exports.ValueEditor=_react2["default"].createClass({displayName:"ValueEditor",contextTypes:{returnFocus:_react2["default"].PropTypes.func},propTypes:{content:_react2["default"].PropTypes.string.isRequired,onDone:_react2["default"].PropTypes.func.isRequired,inline:_react2["default"].PropTypes.bool},render:function(){var t=this.props.inline?"span":"div";return _react2["default"].createElement(ValidateEditor,_extends({},this.props,{onStop:this.onStop,tag:t}))},focus:function(){_reactDom2["default"].findDOMNode(this).focus()},onStop:function(){this.context.returnFocus()}}); -},{"../utils.js":34,"react":"react","react-dom":"react-dom"}],12:[function(require,module,exports){ +},{"../utils.js":34,"react":"react","react-dom":"react-dom"}],13:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function LogIcon(e){var t=e.event,n={web:"html5",debug:"bug"}[t.level]||"info";return _react2["default"].createElement("i",{className:"fa fa-fw fa-"+n})}function LogEntry(e){var t=e.event,n=e.registerHeight;return _react2["default"].createElement("div",{ref:n},_react2["default"].createElement(LogIcon,{event:t}),t.message)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.ToggleEventLog=void 0;var _createClass=function(){function e(e,t){for(var n=0;n1048576*t}},render:function(){var e=(0,_utils2.formatSize)(this.props.message.contentLength);return _react2["default"].createElement("div",{className:"alert alert-warning"},_react2["default"].createElement("button",{onClick:this.props.onClick,className:"btn btn-xs btn-warning pull-right"},"Display anyway"),e," content size.")}}),ViewSelector=_react2["default"].createClass({displayName:"ViewSelector",render:function(){for(var e=[],t=0;t0&&(r.preventDefault(),this.refs[e-1+"-value"].focus())},render:function(){var e=this.props.message.headers.map(function(e,t){var r=_react2["default"].createElement(HeaderEditor,{ref:t+"-key",content:e[0],onDone:this.onChange.bind(null,t,0),onRemove:this.onRemove.bind(null,t,0),onTab:this.onTab.bind(null,t,0)}),s=_react2["default"].createElement(HeaderEditor,{ref:t+"-value",content:e[1],onDone:this.onChange.bind(null,t,1),onRemove:this.onRemove.bind(null,t,1),onTab:this.onTab.bind(null,t,1)});return _react2["default"].createElement("tr",{key:t},_react2["default"].createElement("td",{className:"header-name"},r,":"),_react2["default"].createElement("td",{className:"header-value"},s))}.bind(this));return _react2["default"].createElement("table",{className:"header-table"},_react2["default"].createElement("tbody",null,e))}}),HeaderEditor=_react2["default"].createClass({displayName:"HeaderEditor",render:function(){return _react2["default"].createElement(_editor.ValueEditor,_extends({ref:"input"},this.props,{onKeyDown:this.onKeyDown,inline:!0}))},focus:function(){_reactDom2["default"].findDOMNode(this).focus()},onKeyDown:function(e){switch(e.keyCode){case _utils2.Key.BACKSPACE:var t=window.getSelection().getRangeAt(0);0===t.startOffset&&0===t.endOffset&&this.props.onRemove(e);break;case _utils2.Key.TAB:e.shiftKey||this.props.onTab(e)}}}),RequestLine=_react2["default"].createClass({displayName:"RequestLine",render:function(){var e=this.props.flow,t=_utils.RequestUtils.pretty_url(e.request),r=e.request.http_version;return _react2["default"].createElement("div",{className:"first-line request-line"},_react2["default"].createElement(_editor.ValueEditor,{ref:"method",content:e.request.method,onDone:this.onMethodChange,inline:!0})," ",_react2["default"].createElement(_editor.ValueEditor,{ref:"url",content:t,onDone:this.onUrlChange,isValid:this.isValidUrl,inline:!0})," ",_react2["default"].createElement(_editor.ValueEditor,{ref:"httpVersion",content:r,onDone:this.onHttpVersionChange,isValid:_utils.isValidHttpVersion,inline:!0}))},isValidUrl:function(e){var t=(0,_utils.parseUrl)(e);return!!t.host},onMethodChange:function(e){_actions.FlowActions.update(this.props.flow,{request:{method:e}})},onUrlChange:function(e){var t=(0,_utils.parseUrl)(e);t.path=t.path||"",_actions.FlowActions.update(this.props.flow,{request:t})},onHttpVersionChange:function(e){var t=(0,_utils.parseHttpVersion)(e);_actions.FlowActions.update(this.props.flow,{request:{http_version:t}})}}),ResponseLine=_react2["default"].createClass({displayName:"ResponseLine",render:function(){var e=this.props.flow,t=e.response.http_version;return _react2["default"].createElement("div",{className:"first-line response-line"},_react2["default"].createElement(_editor.ValueEditor,{ref:"httpVersion",content:t,onDone:this.onHttpVersionChange,isValid:_utils.isValidHttpVersion,inline:!0})," ",_react2["default"].createElement(_editor.ValueEditor,{ref:"code",content:e.response.status_code+"",onDone:this.onCodeChange,isValid:this.isValidCode,inline:!0})," ",_react2["default"].createElement(_editor.ValueEditor,{ref:"msg",content:e.response.reason,onDone:this.onMsgChange,inline:!0}))},isValidCode:function(e){return/^\d+$/.test(e)},onHttpVersionChange:function(e){var t=(0,_utils.parseHttpVersion)(e);_actions.FlowActions.update(this.props.flow,{response:{http_version:t}})},onMsgChange:function(e){_actions.FlowActions.update(this.props.flow,{response:{msg:e}})},onCodeChange:function(e){e=parseInt(e),_actions.FlowActions.update(this.props.flow,{response:{code:e}})}}),Request=exports.Request=_react2["default"].createClass({displayName:"Request",render:function(){var e=this.props.flow;return _react2["default"].createElement("section",{className:"request"},_react2["default"].createElement(RequestLine,{ref:"requestLine",flow:e}),_react2["default"].createElement(Headers,{ref:"headers",message:e.request,onChange:this.onHeaderChange}),_react2["default"].createElement("hr",null),_react2["default"].createElement(_contentview2["default"],{flow:e,message:e.request}))},edit:function(e){switch(e){case"m":this.refs.requestLine.refs.method.focus();break;case"u":this.refs.requestLine.refs.url.focus();break;case"v":this.refs.requestLine.refs.httpVersion.focus();break;case"h":this.refs.headers.edit();break;default:throw"Unimplemented: "+e}},onHeaderChange:function(e){_actions.FlowActions.update(this.props.flow,{request:{headers:e}})}}),Response=exports.Response=_react2["default"].createClass({displayName:"Response",render:function(){var e=this.props.flow;return _react2["default"].createElement("section",{className:"response"},_react2["default"].createElement(ResponseLine,{ref:"responseLine",flow:e}),_react2["default"].createElement(Headers,{ref:"headers",message:e.response,onChange:this.onHeaderChange}),_react2["default"].createElement("hr",null),_react2["default"].createElement(_contentview2["default"],{flow:e,message:e.response}))},edit:function(e){switch(e){case"c":this.refs.responseLine.refs.status_code.focus();break;case"m":this.refs.responseLine.refs.msg.focus();break;case"v":this.refs.responseLine.refs.httpVersion.focus();break;case"h":this.refs.headers.edit();break;default:throw"Unimplemented: "+e}},onHeaderChange:function(e){_actions.FlowActions.update(this.props.flow,{response:{headers:e}})}}),Error=exports.Error=_react2["default"].createClass({displayName:"Error",render:function(){var e=this.props.flow;return _react2["default"].createElement("section",null,_react2["default"].createElement("div",{className:"alert alert-warning"},e.error.msg,_react2["default"].createElement("div",null,_react2["default"].createElement("small",null,(0,_utils2.formatTimeStamp)(e.error.timestamp)))))}}); -},{"../../actions.js":2,"../../flow/utils.js":32,"../../utils.js":34,"../editor.js":11,"./contentview.js":13,"lodash":"lodash","react":"react","react-dom":"react-dom"}],17:[function(require,module,exports){ +},{"../../actions.js":2,"../../flow/utils.js":32,"../../utils.js":34,"../editor.js":12,"./contentview.js":14,"lodash":"lodash","react":"react","react-dom":"react-dom"}],18:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0});var _react=require("react"),_react2=_interopRequireDefault(_react),_actions=require("../../actions.js"),NavAction=_react2["default"].createClass({displayName:"NavAction",onClick:function(e){e.preventDefault(),this.props.onClick()},render:function(){return _react2["default"].createElement("a",{title:this.props.title,href:"#",className:"nav-action",onClick:this.onClick},_react2["default"].createElement("i",{className:"fa fa-fw "+this.props.icon}))}}),Nav=_react2["default"].createClass({displayName:"Nav",render:function(){var e=this.props.flow,t=this.props.tabs.map(function(e){var t=e.charAt(0).toUpperCase()+e.slice(1),a=this.props.active===e?"active":"",c=function(t){this.props.selectTab(e),t.preventDefault()}.bind(this);return _react2["default"].createElement("a",{key:e,href:"#",className:a,onClick:c},t)}.bind(this)),a=null;e.intercepted&&(a=_react2["default"].createElement(NavAction,{title:"[a]ccept intercepted flow",icon:"fa-play",onClick:_actions.FlowActions.accept.bind(null,e)}));var c=null;return e.modified&&(c=_react2["default"].createElement(NavAction,{title:"revert changes to flow [V]",icon:"fa-history",onClick:_actions.FlowActions.revert.bind(null,e)})),_react2["default"].createElement("nav",{ref:"head",className:"nav-tabs nav-tabs-sm"},t,_react2["default"].createElement(NavAction,{title:"[d]elete flow",icon:"fa-trash",onClick:_actions.FlowActions["delete"].bind(null,e)}),_react2["default"].createElement(NavAction,{title:"[D]uplicate flow",icon:"fa-copy",onClick:_actions.FlowActions.duplicate.bind(null,e)}),_react2["default"].createElement(NavAction,{disabled:!0,title:"[r]eplay flow",icon:"fa-repeat",onClick:_actions.FlowActions.replay.bind(null,e)}),a,c)}});exports["default"]=Nav; -},{"../../actions.js":2,"react":"react"}],18:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function Footer(e){var a=e.settings,t=a.mode,s=a.intercept,l=a.showhost,c=a.no_upstream_cert,r=a.rawtcp,u=a.http2,n=a.anticache,o=a.anticomp,m=a.stickyauth,p=a.stickycookie,i=a.stream;return _react2["default"].createElement("footer",null,t&&"regular"!=t&&_react2["default"].createElement("span",{className:"label label-success"},t," mode"),s&&_react2["default"].createElement("span",{className:"label label-success"},"Intercept: ",s),l&&_react2["default"].createElement("span",{className:"label label-success"},"showhost"),c&&_react2["default"].createElement("span",{className:"label label-success"},"no-upstream-cert"),r&&_react2["default"].createElement("span",{className:"label label-success"},"raw-tcp"),!u&&_react2["default"].createElement("span",{className:"label label-success"},"no-http2"),n&&_react2["default"].createElement("span",{className:"label label-success"},"anticache"),o&&_react2["default"].createElement("span",{className:"label label-success"},"anticomp"),m&&_react2["default"].createElement("span",{className:"label label-success"},"stickyauth: ",m),p&&_react2["default"].createElement("span",{className:"label label-success"},"stickycookie: ",p),i&&_react2["default"].createElement("span",{className:"label label-success"},"stream: ",(0,_utils.formatSize)(i)))}Object.defineProperty(exports,"__esModule",{value:!0}),exports["default"]=Footer;var _react=require("react"),_react2=_interopRequireDefault(_react),_utils=require("../utils.js"),_common=require("./common.js");Footer.propTypes={settings:_react2["default"].PropTypes.object.isRequired}; - -},{"../utils.js":34,"./common.js":10,"react":"react"}],19:[function(require,module,exports){ +},{"../../actions.js":2,"react":"react"}],19:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.Header=exports.OptionMenu=exports.MainMenu=void 0;var _react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_jquery=require("jquery"),_jquery2=_interopRequireDefault(_jquery),_reactRedux=require("react-redux"),_filt=require("../filt/filt.js"),_filt2=_interopRequireDefault(_filt),_utils=require("../utils.js"),_common=require("./common.js"),_actions=require("../actions.js"),_eventlog=require("./eventlog"),FilterDocs=_react2["default"].createClass({displayName:"FilterDocs",statics:{xhr:!1,doc:!1},componentWillMount:function(){FilterDocs.doc||(FilterDocs.xhr=_jquery2["default"].getJSON("/filter-help").done(function(e){FilterDocs.doc=e,FilterDocs.xhr=!1})),FilterDocs.xhr&&FilterDocs.xhr.done(function(){this.forceUpdate()}.bind(this))},render:function(){if(FilterDocs.doc){var e=FilterDocs.doc.commands.map(function(e){return _react2["default"].createElement("tr",{key:e[1]},_react2["default"].createElement("td",null,e[0].replace(" "," ")),_react2["default"].createElement("td",null,e[1]))});return e.push(_react2["default"].createElement("tr",{key:"docs-link"},_react2["default"].createElement("td",{colSpan:"2"},_react2["default"].createElement("a",{href:"http://docs.mitmproxy.org/en/stable/features/filters.html",target:"_blank"},_react2["default"].createElement("i",{className:"fa fa-external-link"}),"  mitmproxy docs")))),_react2["default"].createElement("table",{className:"table table-condensed"},_react2["default"].createElement("tbody",null,e))}return _react2["default"].createElement("i",{className:"fa fa-spinner fa-spin"})}}),FilterInput=_react2["default"].createClass({displayName:"FilterInput",contextTypes:{returnFocus:_react2["default"].PropTypes.func},getInitialState:function(){return{value:this.props.value,focus:!1,mousefocus:!1}},componentWillReceiveProps:function(e){this.setState({value:e.value})},onChange:function(e){var t=e.target.value;this.setState({value:t}),this.isValid(t)&&this.props.onChange(t)},isValid:function(e){try{var t=e||this.state.value;return t&&_filt2["default"].parse(e||this.state.value),!0}catch(a){return!1}},getDesc:function(){if(this.state.value)try{return _filt2["default"].parse(this.state.value).desc}catch(e){return""+e}return _react2["default"].createElement(FilterDocs,null)},onFocus:function(){this.setState({focus:!0})},onBlur:function(){this.setState({focus:!1})},onMouseEnter:function(){this.setState({mousefocus:!0})},onMouseLeave:function(){this.setState({mousefocus:!1})},onKeyDown:function(e){e.keyCode!==_utils.Key.ESC&&e.keyCode!==_utils.Key.ENTER||(this.blur(),this.setState({mousefocus:!1})),e.stopPropagation()},blur:function(){_reactDom2["default"].findDOMNode(this.refs.input).blur(),this.context.returnFocus()},select:function(){_reactDom2["default"].findDOMNode(this.refs.input).select()},render:function(){var e,t=this.isValid(),a="fa fa-fw fa-"+this.props.type,n="filter-input input-group"+(t?"":" has-error");return(this.state.focus||this.state.mousefocus)&&(e=_react2["default"].createElement("div",{className:"popover bottom",onMouseEnter:this.onMouseEnter,onMouseLeave:this.onMouseLeave},_react2["default"].createElement("div",{className:"arrow"}),_react2["default"].createElement("div",{className:"popover-content"},this.getDesc()))),_react2["default"].createElement("div",{className:n},_react2["default"].createElement("span",{className:"input-group-addon"},_react2["default"].createElement("i",{className:a,style:{color:this.props.color}})),_react2["default"].createElement("input",{type:"text",placeholder:this.props.placeholder,className:"form-control",ref:"input",onChange:this.onChange,onFocus:this.onFocus,onBlur:this.onBlur,onKeyDown:this.onKeyDown,value:this.state.value}),e)}}),MainMenu=exports.MainMenu=_react2["default"].createClass({displayName:"MainMenu",propTypes:{settings:_react2["default"].PropTypes.object.isRequired},statics:{title:"Start",route:"flows"},onSearchChange:function(e){var t={};t[_actions.Query.SEARCH]=e,this.props.updateLocation(void 0,t)},onHighlightChange:function(e){var t={};t[_actions.Query.HIGHLIGHT]=e,this.props.updateLocation(void 0,t)},onInterceptChange:function(e){_actions.SettingsActions.update({intercept:e})},render:function(){var e=this.props.query[_actions.Query.SEARCH]||"",t=this.props.query[_actions.Query.HIGHLIGHT]||"",a=this.props.settings.intercept||"";return _react2["default"].createElement("div",null,_react2["default"].createElement("div",{className:"menu-row"},_react2["default"].createElement(FilterInput,{ref:"search",placeholder:"Search",type:"search",color:"black",value:e,onChange:this.onSearchChange}),_react2["default"].createElement(FilterInput,{ref:"highlight",placeholder:"Highlight",type:"tag",color:"hsl(48, 100%, 50%)",value:t,onChange:this.onHighlightChange}),_react2["default"].createElement(FilterInput,{ref:"intercept",placeholder:"Intercept",type:"pause",color:"hsl(208, 56%, 53%)",value:a,onChange:this.onInterceptChange})),_react2["default"].createElement("div",{className:"clearfix"}))}}),ViewMenu=_react2["default"].createClass({displayName:"ViewMenu",statics:{title:"View",route:"flows"},render:function(){return _react2["default"].createElement("div",null,_react2["default"].createElement("div",{className:"menu-row"},_react2["default"].createElement(_eventlog.ToggleEventLog,{text:"Show Event Log"})),_react2["default"].createElement("div",{className:"clearfix"}))}}),OptionMenu=exports.OptionMenu=function(e){var t=e.settings,a=(t.mode,t.intercept,t.showhost),n=t.no_upstream_cert,r=t.rawtcp,l=t.http2,c=t.anticache,i=t.anticomp,o=t.stickycookie,s=t.stickyauth,u=t.stream;return _react2["default"].createElement("div",null,_react2["default"].createElement("div",{className:"menu-row"},_react2["default"].createElement(_common.ToggleButton,{text:"showhost",checked:a,onToggle:function(){return _actions.SettingsActions.update({showhost:!a})}}),_react2["default"].createElement(_common.ToggleButton,{text:"no_upstream_cert",checked:n,onToggle:function(){return _actions.SettingsActions.update({no_upstream_cert:!n})}}),_react2["default"].createElement(_common.ToggleButton,{text:"rawtcp",checked:r,onToggle:function(){return _actions.SettingsActions.update({rawtcp:!r})}}),_react2["default"].createElement(_common.ToggleButton,{text:"http2",checked:l,onToggle:function(){return _actions.SettingsActions.update({http2:!l})}}),_react2["default"].createElement(_common.ToggleButton,{text:"anticache",checked:c,onToggle:function(){return _actions.SettingsActions.update({anticache:!c})}}),_react2["default"].createElement(_common.ToggleButton,{text:"anticomp",checked:i,onToggle:function(){return _actions.SettingsActions.update({anticomp:!i})}}),_react2["default"].createElement(_common.ToggleInputButton,{name:"stickyauth",placeholder:"Sticky auth filter",checked:Boolean(s),txt:s||"",onToggleChanged:function(e){return _actions.SettingsActions.update({stickyauth:s?null:e})}}),_react2["default"].createElement(_common.ToggleInputButton,{name:"stickycookie",placeholder:"Sticky cookie filter",checked:Boolean(o),txt:o||"",onToggleChanged:function(e){return _actions.SettingsActions.update({stickycookie:o?null:e})}}),_react2["default"].createElement(_common.ToggleInputButton,{name:"stream",placeholder:"stream...",checked:Boolean(u),txt:u||"",inputType:"number",onToggleChanged:function(e){return _actions.SettingsActions.update({stream:u?null:e})}})),_react2["default"].createElement("div",{className:"clearfix"}))};OptionMenu.title="Options",OptionMenu.propTypes={settings:_react2["default"].PropTypes.object.isRequired};var ReportsMenu=_react2["default"].createClass({displayName:"ReportsMenu",statics:{title:"Visualization",route:"reports"},render:function(){return _react2["default"].createElement("div",null,"Reports Menu")}}),FileMenu=_react2["default"].createClass({displayName:"FileMenu",getInitialState:function(){return{showFileMenu:!1}},handleFileClick:function(e){if(e.preventDefault(),!this.state.showFileMenu){var t=function(){this.setState({showFileMenu:!1}),document.removeEventListener("click",t)}.bind(this);document.addEventListener("click",t),this.setState({showFileMenu:!0})}},handleNewClick:function(e){e.preventDefault(),confirm("Delete all flows?")&&_actions.FlowActions.clear()},handleOpenClick:function(e){this.fileInput.click(),e.preventDefault()},handleOpenFile:function(e){e.target.files.length>0&&(_actions.FlowActions.upload(e.target.files[0]),this.fileInput.value=""),e.preventDefault()},handleSaveClick:function(e){e.preventDefault(),_actions.FlowActions.download()},handleShutdownClick:function(e){e.preventDefault(),console.error("unimplemented: handleShutdownClick")},render:function(){var e=this,t="dropdown pull-left"+(this.state.showFileMenu?" open":"");return _react2["default"].createElement("div",{className:t},_react2["default"].createElement("a",{href:"#",className:"special",onClick:this.handleFileClick}," mitmproxy "),_react2["default"].createElement("ul",{className:"dropdown-menu",role:"menu"},_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"#",onClick:this.handleNewClick},_react2["default"].createElement("i",{className:"fa fa-fw fa-file"}),"New")),_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"#",onClick:this.handleOpenClick},_react2["default"].createElement("i",{className:"fa fa-fw fa-folder-open"}),"Open..."),_react2["default"].createElement("input",{ref:function(t){return e.fileInput=t},className:"hidden",type:"file",onChange:this.handleOpenFile})),_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"#",onClick:this.handleSaveClick},_react2["default"].createElement("i",{className:"fa fa-fw fa-floppy-o"}),"Save...")),_react2["default"].createElement("li",{role:"presentation",className:"divider"}),_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"http://mitm.it/",target:"_blank"},_react2["default"].createElement("i",{className:"fa fa-fw fa-external-link"}),"Install Certificates..."))))}}),header_entries=[MainMenu,ViewMenu,OptionMenu],Header=exports.Header=_react2["default"].createClass({displayName:"Header",propTypes:{settings:_react2["default"].PropTypes.object.isRequired},getInitialState:function(){return{active:header_entries[0]}},handleClick:function(e,t){t.preventDefault(),this.props.updateLocation(e.route),this.setState({active:e})},render:function(){var e=header_entries.map(function(e,t){var a;return a=e===this.state.active?"active":"",_react2["default"].createElement("a",{key:t,href:"#",className:a,onClick:this.handleClick.bind(this,e)},e.title)}.bind(this));return _react2["default"].createElement("header",null,_react2["default"].createElement("nav",{className:"nav-tabs nav-tabs-lg"},_react2["default"].createElement(FileMenu,null),e),_react2["default"].createElement("div",{className:"menu"},_react2["default"].createElement(this.state.active,{ref:"active",settings:this.props.settings,updateLocation:this.props.updateLocation,query:this.props.query})))}}); -},{"../actions.js":2,"../filt/filt.js":31,"../utils.js":34,"./common.js":10,"./eventlog":12,"jquery":"jquery","react":"react","react-dom":"react-dom","react-redux":"react-redux"}],20:[function(require,module,exports){ +},{"../actions.js":2,"../filt/filt.js":31,"../utils.js":34,"./common.js":11,"./eventlog":13,"jquery":"jquery","react":"react","react-dom":"react-dom","react-redux":"react-redux"}],20:[function(require,module,exports){ "use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function t(t,e){for(var o=0;o + {settings.mode && settings.mode != "regular" && ( + {settings.mode} mode + )} + {settings.intercept && ( + Intercept: {settings.intercept} + )} + {settings.showhost && ( + showhost + )} + {settings.no_upstream_cert && ( + no-upstream-cert + )} + {settings.rawtcp && ( + raw-tcp + )} + {!settings.http2 && ( + no-http2 + )} + {settings.anticache && ( + anticache + )} + {settings.anticomp && ( + anticomp + )} + {settings.stickyauth && ( + stickyauth: {settings.stickyauth} + )} + {settings.stickycookie && ( + stickycookie: {settings.stickycookie} + )} + {settings.stream && ( + stream: {formatSize(settings.stream)} + )} + + ) +} diff --git a/web/src/js/components/ProxyApp.jsx b/web/src/js/components/ProxyApp.jsx index 465cf272..e273fc92 100644 --- a/web/src/js/components/ProxyApp.jsx +++ b/web/src/js/components/ProxyApp.jsx @@ -6,7 +6,7 @@ import { connect } from 'react-redux' import { Splitter } from "./common.js" import { Header, MainMenu } from "./header.js" import EventLog from "./eventlog.js" -import Footer from "./footer.js" +import Footer from "./Footer" import { SettingsStore } from "../store/store.js" import { Key } from "../utils.js" diff --git a/web/src/js/components/footer.js b/web/src/js/components/footer.js deleted file mode 100644 index 8fe1081b..00000000 --- a/web/src/js/components/footer.js +++ /dev/null @@ -1,50 +0,0 @@ -import React from "react"; -import {formatSize} from "../utils.js" -import {SettingsState} from "./common.js"; - -Footer.propTypes = { - settings: React.PropTypes.object.isRequired, -}; - -export default function Footer({ settings }) { - const {mode, intercept, showhost, no_upstream_cert, rawtcp, http2, anticache, anticomp, stickyauth, stickycookie, stream} = settings; - return ( -
- {mode && mode != "regular" && ( - {mode} mode - )} - {intercept && ( - Intercept: {intercept} - )} - {showhost && ( - showhost - )} - {no_upstream_cert && ( - no-upstream-cert - )} - {rawtcp && ( - raw-tcp - )} - {!http2 && ( - no-http2 - )} - {anticache && ( - anticache - )} - {anticomp && ( - anticomp - )} - {stickyauth && ( - stickyauth: {stickyauth} - )} - {stickycookie && ( - stickycookie: {stickycookie} - )} - {stream && ( - stream: {formatSize(stream)} - )} - - -
- ); -} -- cgit v1.2.3 From 6c95635cb809d9261acc317f223ef80ba9c25f20 Mon Sep 17 00:00:00 2001 From: Jason Date: Thu, 9 Jun 2016 18:40:59 +0800 Subject: [web] eventlog.js -> EventLog.jsx --- mitmproxy/web/static/app.js | 75 ++++++------- web/src/js/components/EventLog.jsx | 41 +++++++ web/src/js/components/EventLog/EventList.jsx | 90 ++++++++++++++++ web/src/js/components/ProxyApp.jsx | 2 +- web/src/js/components/eventlog.js | 153 --------------------------- web/src/js/components/header.js | 12 ++- 6 files changed, 182 insertions(+), 191 deletions(-) create mode 100644 web/src/js/components/EventLog.jsx create mode 100644 web/src/js/components/EventLog/EventList.jsx delete mode 100644 web/src/js/components/eventlog.js diff --git a/mitmproxy/web/static/app.js b/mitmproxy/web/static/app.js index f372340a..7ac7aab0 100644 --- a/mitmproxy/web/static/app.js +++ b/mitmproxy/web/static/app.js @@ -4,100 +4,103 @@ function EventEmitter(){this._events=this._events||{},this._maxListeners=this._m },{}],2:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.Query=exports.FlowActions=exports.SettingsActions=exports.ConnectionActions=exports.StoreCmds=exports.ActionTypes=void 0;var _jquery=require("jquery"),_jquery2=_interopRequireDefault(_jquery),_dispatcher=require("./dispatcher.js"),_utils=require("./utils.js"),ActionTypes=exports.ActionTypes={CONNECTION_OPEN:"connection_open",CONNECTION_CLOSE:"connection_close",CONNECTION_ERROR:"connection_error",SETTINGS_STORE:"settings",EVENT_STORE:"events",FLOW_STORE:"flows"},StoreCmds=exports.StoreCmds={ADD:"add",UPDATE:"update",REMOVE:"remove",RESET:"reset"},ConnectionActions=exports.ConnectionActions={open:function(){_dispatcher.AppDispatcher.dispatchViewAction({type:ActionTypes.CONNECTION_OPEN})},close:function(){_dispatcher.AppDispatcher.dispatchViewAction({type:ActionTypes.CONNECTION_CLOSE})},error:function(){_dispatcher.AppDispatcher.dispatchViewAction({type:ActionTypes.CONNECTION_ERROR})}},SettingsActions=exports.SettingsActions={update:function(e){_jquery2["default"].ajax({type:"PUT",url:"/settings",contentType:"application/json",data:JSON.stringify(e)})}},FlowActions=exports.FlowActions={accept:function(e){_jquery2["default"].post("/flows/"+e.id+"/accept")},accept_all:function(){_jquery2["default"].post("/flows/accept")},"delete":function(e){_jquery2["default"].ajax({type:"DELETE",url:"/flows/"+e.id})},duplicate:function(e){_jquery2["default"].post("/flows/"+e.id+"/duplicate")},replay:function(e){_jquery2["default"].post("/flows/"+e.id+"/replay")},revert:function(e){_jquery2["default"].post("/flows/"+e.id+"/revert")},update:function(e,t){_jquery2["default"].ajax({type:"PUT",url:"/flows/"+e.id,contentType:"application/json",data:JSON.stringify(t)})},clear:function(){_jquery2["default"].post("/clear")},download:function(){return window.location="/flows/dump"},upload:function(e){var t=new FormData;t.append("file",e),(0,_utils.fetchApi)("/flows/dump",{method:"post",body:t})}},Query=exports.Query={SEARCH:"s",HIGHLIGHT:"h",SHOW_EVENTLOG:"e"}; -},{"./dispatcher.js":24,"./utils.js":34,"jquery":"jquery"}],3:[function(require,module,exports){ +},{"./dispatcher.js":25,"./utils.js":35,"jquery":"jquery"}],3:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}var _react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_redux=require("redux"),_reactRedux=require("react-redux"),_reduxLogger=require("redux-logger"),_reduxLogger2=_interopRequireDefault(_reduxLogger),_reduxThunk=require("redux-thunk"),_reduxThunk2=_interopRequireDefault(_reduxThunk),_reactRouter=require("react-router"),_connection=require("./connection"),_connection2=_interopRequireDefault(_connection),_ProxyApp=require("./components/ProxyApp"),_ProxyApp2=_interopRequireDefault(_ProxyApp),_MainView=require("./components/MainView"),_MainView2=_interopRequireDefault(_MainView),_index=require("./ducks/index"),_index2=_interopRequireDefault(_index),_eventLog=require("./ducks/eventLog"),store=(0,_redux.createStore)(_index2["default"],(0,_redux.applyMiddleware)(_reduxThunk2["default"],(0,_reduxLogger2["default"])()));window.addEventListener("error",function(e){store.dispatch((0,_eventLog.addLogEntry)(e))}),document.addEventListener("DOMContentLoaded",function(){window.ws=new _connection2["default"]("/updates",store.dispatch),(0,_reactDom.render)(_react2["default"].createElement(_reactRedux.Provider,{store:store},_react2["default"].createElement(_reactRouter.Router,{history:_reactRouter.hashHistory},_react2["default"].createElement(_reactRouter.Redirect,{from:"/",to:"/flows"}),_react2["default"].createElement(_reactRouter.Route,{path:"/",component:_ProxyApp2["default"]},_react2["default"].createElement(_reactRouter.Route,{path:"flows",component:_MainView2["default"]}),_react2["default"].createElement(_reactRouter.Route,{path:"flows/:flowId/:detailTab",component:_MainView2["default"]})))),document.getElementById("mitmproxy"))}); -},{"./components/MainView":9,"./components/ProxyApp":10,"./connection":23,"./ducks/eventLog":25,"./ducks/index":27,"react":"react","react-dom":"react-dom","react-redux":"react-redux","react-router":"react-router","redux":"redux","redux-logger":"redux-logger","redux-thunk":"redux-thunk"}],4:[function(require,module,exports){ +},{"./components/MainView":11,"./components/ProxyApp":12,"./connection":24,"./ducks/eventLog":26,"./ducks/index":28,"react":"react","react-dom":"react-dom","react-redux":"react-redux","react-router":"react-router","redux":"redux","redux-logger":"redux-logger","redux-thunk":"redux-thunk"}],4:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function EventLog(e){var t=e.filters,r=e.events,n=e.onToggleFilter,o=e.onClose;return _react2["default"].createElement("div",{className:"eventlog"},_react2["default"].createElement("div",null,"Eventlog",_react2["default"].createElement("div",{className:"pull-right"},["debug","info","web"].map(function(e){return _react2["default"].createElement(_common.ToggleButton,{text:e,checked:t[e],onToggle:function(){return n(e)}})}),_react2["default"].createElement("i",{onClick:o,className:"fa fa-close"}))),_react2["default"].createElement(_EventList2["default"],{events:r}))}Object.defineProperty(exports,"__esModule",{value:!0});var _react=require("react"),_react2=_interopRequireDefault(_react),_redux=require("redux"),_reactRedux=require("react-redux"),_eventLog=require("../ducks/eventLog"),_common=require("./common"),_EventList=require("./EventLog/EventList"),_EventList2=_interopRequireDefault(_EventList);EventLog.propTypes={filters:_react.PropTypes.object.isRequired,events:_react.PropTypes.array.isRequired,onToggleFilter:_react.PropTypes.func.isRequired,onClose:_react.PropTypes.func.isRequired},exports["default"]=(0,_reactRedux.connect)(function(e){return{filters:e.eventLog.filter,events:e.eventLog.filteredEvents}},function(e){return(0,_redux.bindActionCreators)({onClose:_eventLog.toggleEventLogVisibility,onToggleFilter:_eventLog.toggleEventLogFilter},e)})(EventLog); + +},{"../ducks/eventLog":26,"./EventLog/EventList":5,"./common":13,"react":"react","react-redux":"react-redux","redux":"redux"}],5:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function LogIcon(e){var t=e.event,r={web:"html5",debug:"bug"}[t.level]||"info";return _react2["default"].createElement("i",{className:"fa fa-fw fa-"+r})}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var r=0;rn-i?l.scrollTop=n-i:u>c+s&&(l.scrollTop=u-s)}}},{key:"componentWillReceiveProps",value:function(e){e.selected&&e.selected!==this.props.selected&&(this.shouldScrollIntoView=!0)}},{key:"onViewportUpdate",value:function(){var e=_reactDom2["default"].findDOMNode(this),t=e.scrollTop,o=(0,_VirtualScroll.calcVScroll)({viewportTop:t,viewportHeight:e.offsetHeight,itemCount:this.props.flows.length,rowHeight:this.props.rowHeight});this.state.viewportTop===t&&(0,_shallowequal2["default"])(this.state.vScroll,o)||this.setState({vScroll:o,viewportTop:t})}},{key:"render",value:function(){var e=this,t=this.state,o=t.vScroll,r=t.viewportTop,l=this.props,a=l.flows,i=l.selected,n=l.highlight,u=n?_filt2["default"].parse(n):function(){return!1};return _react2["default"].createElement("div",{className:"flow-table",onScroll:this.onViewportUpdate},_react2["default"].createElement("table",null,_react2["default"].createElement("thead",{ref:"head",style:{transform:"translateY("+r+"px)"}},_react2["default"].createElement(_FlowTableHead2["default"],null)),_react2["default"].createElement("tbody",null,_react2["default"].createElement("tr",{style:{height:o.paddingTop}}),a.slice(o.start,o.end).map(function(t){return _react2["default"].createElement(_FlowRow2["default"],{key:t.id,flow:t,selected:t===i,highlighted:u(t),onSelect:e.props.onSelect})}),_react2["default"].createElement("tr",{style:{height:o.paddingBottom}}))))}}]),t}(_react2["default"].Component);FlowTable.propTypes={onSelect:_react.PropTypes.func.isRequired,flows:_react.PropTypes.array.isRequired,rowHeight:_react.PropTypes.number,highlight:_react.PropTypes.string,selected:_react.PropTypes.object},FlowTable.defaultProps={rowHeight:32},exports["default"]=(0,_AutoScroll2["default"])(FlowTable); -},{"../filt/filt":31,"./FlowTable/FlowRow":6,"./FlowTable/FlowTableHead":7,"./helpers/AutoScroll":20,"./helpers/VirtualScroll":21,"react":"react","react-dom":"react-dom","shallowequal":"shallowequal"}],5:[function(require,module,exports){ +},{"../filt/filt":32,"./FlowTable/FlowRow":8,"./FlowTable/FlowTableHead":9,"./helpers/AutoScroll":21,"./helpers/VirtualScroll":22,"react":"react","react-dom":"react-dom","shallowequal":"shallowequal"}],7:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function TLSColumn(e){var t=e.flow;return _react2["default"].createElement("td",{className:(0,_classnames2["default"])("col-tls","https"===t.request.scheme?"col-tls-https":"col-tls-http")})}function IconColumn(e){var t=e.flow;return _react2["default"].createElement("td",{className:"col-icon"},_react2["default"].createElement("div",{className:(0,_classnames2["default"])("resource-icon",IconColumn.getIcon(t))}))}function PathColumn(e){var t=e.flow;return _react2["default"].createElement("td",{className:"col-path"},t.request.is_replay&&_react2["default"].createElement("i",{className:"fa fa-fw fa-repeat pull-right"}),t.intercepted&&_react2["default"].createElement("i",{className:"fa fa-fw fa-pause pull-right"}),_utils.RequestUtils.pretty_url(t.request))}function MethodColumn(e){var t=e.flow;return _react2["default"].createElement("td",{className:"col-method"},t.request.method)}function StatusColumn(e){var t=e.flow;return _react2["default"].createElement("td",{className:"col-status"},t.response&&t.response.status_code)}function SizeColumn(e){var t=e.flow;return _react2["default"].createElement("td",{className:"col-size"},(0,_utils2.formatSize)(SizeColumn.getTotalSize(t)))}function TimeColumn(e){var t=e.flow;return _react2["default"].createElement("td",{className:"col-time"},t.response?(0,_utils2.formatTimeDelta)(1e3*(t.response.timestamp_end-t.request.timestamp_start)):"...")}Object.defineProperty(exports,"__esModule",{value:!0}),exports.TLSColumn=TLSColumn,exports.IconColumn=IconColumn,exports.PathColumn=PathColumn,exports.MethodColumn=MethodColumn,exports.StatusColumn=StatusColumn,exports.SizeColumn=SizeColumn,exports.TimeColumn=TimeColumn;var _react=require("react"),_react2=_interopRequireDefault(_react),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_utils=require("../../flow/utils.js"),_utils2=require("../../utils.js");TLSColumn.sortKeyFun=function(e){return e.request.scheme},TLSColumn.headerClass="col-tls",TLSColumn.headerName="",IconColumn.headerClass="col-icon",IconColumn.headerName="",IconColumn.getIcon=function(e){if(!e.response)return"resource-icon-plain";var t=_utils.ResponseUtils.getContentType(e.response)||"";return 304===e.response.status_code?"resource-icon-not-modified":300<=e.response.status_code&&e.response.status_code<400?"resource-icon-redirect":t.indexOf("image")>=0?"resource-icon-image":t.indexOf("javascript")>=0?"resource-icon-js":t.indexOf("css")>=0?"resource-icon-css":t.indexOf("html")>=0?"resource-icon-document":"resource-icon-plain"},PathColumn.sortKeyFun=function(e){return _utils.RequestUtils.pretty_url(e.request)},PathColumn.headerClass="col-path",PathColumn.headerName="Path",MethodColumn.sortKeyFun=function(e){return e.request.method},MethodColumn.headerClass="col-method",MethodColumn.headerName="Method",StatusColumn.sortKeyFun=function(e){return e.response&&e.response.status_code},StatusColumn.headerClass="col-status",StatusColumn.headerName="Status",SizeColumn.sortKeyFun=function(e){var t=e.request.contentLength;return e.response&&(t+=e.response.contentLength||0),t},SizeColumn.getTotalSize=SizeColumn.sortKeyFun,SizeColumn.headerClass="col-size",SizeColumn.headerName="Size",TimeColumn.sortKeyFun=function(e){return e.response&&e.response.timestamp_end-e.request.timestamp_start},TimeColumn.headerClass="col-time",TimeColumn.headerName="Time",exports["default"]=[TLSColumn,IconColumn,PathColumn,MethodColumn,StatusColumn,SizeColumn,TimeColumn]; -},{"../../flow/utils.js":32,"../../utils.js":34,"classnames":"classnames","react":"react"}],6:[function(require,module,exports){ +},{"../../flow/utils.js":33,"../../utils.js":35,"classnames":"classnames","react":"react"}],8:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function FlowRow(e){var t=e.flow,r=e.selected,l=e.highlighted,o=e.onSelect,s=(0,_classnames2["default"])({selected:r,highlighted:l,intercepted:t.intercepted,"has-request":t.request,"has-response":t.response});return _react2["default"].createElement("tr",{className:s,onClick:function(){return o(t)}},_FlowColumns2["default"].map(function(e){return _react2["default"].createElement(e,{key:e.name,flow:t})}))}Object.defineProperty(exports,"__esModule",{value:!0}),exports["default"]=FlowRow;var _react=require("react"),_react2=_interopRequireDefault(_react),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_FlowColumns=require("./FlowColumns"),_FlowColumns2=_interopRequireDefault(_FlowColumns);FlowRow.propTypes={onSelect:_react.PropTypes.func.isRequired,flow:_react.PropTypes.object.isRequired,highlighted:_react.PropTypes.bool,selected:_react.PropTypes.bool}; -},{"./FlowColumns":5,"classnames":"classnames","react":"react"}],7:[function(require,module,exports){ +},{"./FlowColumns":7,"classnames":"classnames","react":"react"}],9:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function FlowTableHead(e){function r(e){s({sortColumn:e.name,sortDesc:e.name!==t?!1:!o})}var t=e.sortColumn,o=e.sortDesc,s=e.onSort,u=o?"sort-desc":"sort-asc";return _react2["default"].createElement("tr",null,_FlowColumns2["default"].map(function(e){return _react2["default"].createElement("th",{className:(0,_classnames2["default"])(e.headerClass,t===e.name&&u),key:e.name,onClick:function(){return r(e)}},e.headerName)}))}Object.defineProperty(exports,"__esModule",{value:!0});var _react=require("react"),_react2=_interopRequireDefault(_react),_redux=require("redux"),_reactRedux=require("react-redux"),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_FlowColumns=require("./FlowColumns"),_FlowColumns2=_interopRequireDefault(_FlowColumns),_flows=require("../../ducks/flows");FlowTableHead.propTypes={onSort:_react.PropTypes.func.isRequired,sortDesc:_react2["default"].PropTypes.bool.isRequired,sortColumn:_react2["default"].PropTypes.string},exports["default"]=(0,_reactRedux.connect)(function(e){return{sortDesc:e.flows.sort.sortDesc,sortColumn:e.flows.sort.sortColumn}},function(e){return(0,_redux.bindActionCreators)({onSort:_flows.setSort},e)})(FlowTableHead); -},{"../../ducks/flows":26,"./FlowColumns":5,"classnames":"classnames","react":"react","react-redux":"react-redux","redux":"redux"}],8:[function(require,module,exports){ +},{"../../ducks/flows":27,"./FlowColumns":7,"classnames":"classnames","react":"react","react-redux":"react-redux","redux":"redux"}],10:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function Footer(e){var a=e.settings;return _react2["default"].createElement("footer",null,a.mode&&"regular"!=a.mode&&_react2["default"].createElement("span",{className:"label label-success"},a.mode," mode"),a.intercept&&_react2["default"].createElement("span",{className:"label label-success"},"Intercept: ",a.intercept),a.showhost&&_react2["default"].createElement("span",{className:"label label-success"},"showhost"),a.no_upstream_cert&&_react2["default"].createElement("span",{className:"label label-success"},"no-upstream-cert"),a.rawtcp&&_react2["default"].createElement("span",{className:"label label-success"},"raw-tcp"),!a.http2&&_react2["default"].createElement("span",{className:"label label-success"},"no-http2"),a.anticache&&_react2["default"].createElement("span",{className:"label label-success"},"anticache"),a.anticomp&&_react2["default"].createElement("span",{className:"label label-success"},"anticomp"),a.stickyauth&&_react2["default"].createElement("span",{className:"label label-success"},"stickyauth: ",a.stickyauth),a.stickycookie&&_react2["default"].createElement("span",{className:"label label-success"},"stickycookie: ",a.stickycookie),a.stream&&_react2["default"].createElement("span",{className:"label label-success"},"stream: ",(0,_utils.formatSize)(a.stream)))}Object.defineProperty(exports,"__esModule",{value:!0}),exports["default"]=Footer;var _react=require("react"),_react2=_interopRequireDefault(_react),_utils=require("../utils.js"),_common=require("./common.js");Footer.propTypes={settings:_react2["default"].PropTypes.object.isRequired}; -},{"../utils.js":34,"./common.js":11,"react":"react"}],9:[function(require,module,exports){ +},{"../utils.js":35,"./common.js":13,"react":"react"}],11:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var s=0;se&&(o=s.length-1),this.selectFlow(s[o])}},{key:"onMainKeyDown",value:function(e){var t=this.props.selectedFlow;if(!e.ctrlKey){switch(e.keyCode){case _utils.Key.K:case _utils.Key.UP:this.selectFlowRelative(-1);break;case _utils.Key.J:case _utils.Key.DOWN:this.selectFlowRelative(1);break;case _utils.Key.SPACE:case _utils.Key.PAGE_DOWN:this.selectFlowRelative(10);break;case _utils.Key.PAGE_UP:this.selectFlowRelative(-10);break;case _utils.Key.END:this.selectFlowRelative(1e10);break;case _utils.Key.HOME:this.selectFlowRelative(-1e10);break;case _utils.Key.ESC:this.selectFlow(null);break;case _utils.Key.H:case _utils.Key.LEFT:this.refs.flowDetails&&this.refs.flowDetails.nextTab(-1);break;case _utils.Key.L:case _utils.Key.TAB:case _utils.Key.RIGHT:this.refs.flowDetails&&this.refs.flowDetails.nextTab(1);break;case _utils.Key.C:e.shiftKey&&_actions.FlowActions.clear();break;case _utils.Key.D:t&&(e.shiftKey?_actions.FlowActions.duplicate(t):_actions.FlowActions["delete"](t));break;case _utils.Key.A:e.shiftKey?_actions.FlowActions.accept_all():t&&t.intercepted&&_actions.FlowActions.accept(t);break;case _utils.Key.R:!e.shiftKey&&t&&_actions.FlowActions.replay(t);break;case _utils.Key.V:e.shiftKey&&t&&t.modified&&_actions.FlowActions.revert(t);break;case _utils.Key.E:this.refs.flowDetails&&this.refs.flowDetails.promptEdit();break;case _utils.Key.SHIFT:break;default:return void console.debug("keydown",e.keyCode)}e.preventDefault()}}},{key:"render",value:function(){var e=this,t=this.props,s=t.flows,i=t.selectedFlow,l=t.highlight;t.sort;return _react2["default"].createElement("div",{className:"main-view"},_react2["default"].createElement(_FlowTable2["default"],{ref:"flowTable",flows:s,selected:i,highlight:l,onSelect:function(t){return e.selectFlow(t)}}),i&&[_react2["default"].createElement(_common.Splitter,{key:"splitter"}),_react2["default"].createElement(_index2["default"],{key:"flowDetails",ref:"flowDetails",tab:this.props.routeParams.detailTab,query:this.props.query,updateLocation:this.props.updateLocation,flow:i})])}}]),t}(_react.Component);MainView.propTypes={highlight:_react.PropTypes.string,sort:_react.PropTypes.object},exports["default"]=(0,_reactRedux.connect)(function(e){return{flows:e.flows.view,filter:e.flows.filter,sort:e.flows.sort,highlight:e.flows.highlight,selectedFlow:e.flows.all.byId[e.flows.selected[0]]}},function(e){return(0,_redux.bindActionCreators)({selectFlow:_flows.selectFlow,setFilter:_flows.setFilter,setHighlight:_flows.setHighlight},e)},void 0,{withRef:!0})(MainView); -},{"../actions.js":2,"../ducks/flows":26,"../utils.js":34,"./FlowTable":4,"./common.js":11,"./flowview/index.js":16,"react":"react","react-redux":"react-redux","redux":"redux"}],10:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var r=0;r0)e=o.getRangeAt(0);else if(document.caretPositionFromPoint&&t.clientX&&t.clientY){var n=document.caretPositionFromPoint(t.clientX,t.clientY);e=document.createRange(),e.setStart(n.offsetNode,n.offset)}else document.caretRangeFromPoint&&t.clientX&&t.clientY?e=document.caretRangeFromPoint(t.clientX,t.clientY):(e=document.createRange(),e.selectNodeContents(_reactDom2["default"].findDOMNode(this)));this._ignore_events=!0,this.setState({editable:!0},function(){var t=_reactDom2["default"].findDOMNode(this);t.blur(),t.focus(),this._ignore_events=!1})}},stop:function(){_reactDom2["default"].findDOMNode(this).blur(),this.props.onStop&&this.props.onStop()},_stop:function(t){if(!this._ignore_events){console.log("_stop",_.extend({},t)),window.getSelection().removeAllRanges();var e=_reactDom2["default"].findDOMNode(this),o=this.props.nodeToContent(e);this.setState({editable:!1}),this.props.onDone(o),this.props.onBlur&&this.props.onBlur(t)}},reset:function(){_reactDom2["default"].findDOMNode(this).innerHTML=this.props.contentToHtml(this.props.content)},onKeyDown:function(t){switch(t.stopPropagation(),t.keyCode){case _utils.Key.ESC:t.preventDefault(),this.reset(),this.stop();break;case _utils.Key.ENTER:this.props.submitOnEnter&&!t.shiftKey&&(t.preventDefault(),this.stop())}},onInput:function(){var t=_reactDom2["default"].findDOMNode(this),e=this.props.nodeToContent(t);this.props.onInput&&this.props.onInput(e)}}),ValidateEditor=_react2["default"].createClass({displayName:"ValidateEditor",propTypes:{content:_react2["default"].PropTypes.string.isRequired,onDone:_react2["default"].PropTypes.func.isRequired,onInput:_react2["default"].PropTypes.func,isValid:_react2["default"].PropTypes.func,className:_react2["default"].PropTypes.string},getInitialState:function(){return{currentContent:this.props.content}},componentWillReceiveProps:function(){this.setState({currentContent:this.props.content})},onInput:function(t){this.setState({currentContent:t}),this.props.onInput&&this.props.onInput(t)},render:function(){var t=this.props.className||"";return this.props.isValid&&(t+=this.props.isValid(this.state.currentContent)?" has-success":" has-warning"),_react2["default"].createElement(EditorBase,_extends({},this.props,{ref:"editor",className:t,onDone:this.onDone,onInput:this.onInput}))},onDone:function(t){this.props.isValid&&!this.props.isValid(t)&&(this.refs.editor.reset(),t=this.props.content),this.props.onDone(t)}}),ValueEditor=exports.ValueEditor=_react2["default"].createClass({displayName:"ValueEditor",contextTypes:{returnFocus:_react2["default"].PropTypes.func},propTypes:{content:_react2["default"].PropTypes.string.isRequired,onDone:_react2["default"].PropTypes.func.isRequired,inline:_react2["default"].PropTypes.bool},render:function(){var t=this.props.inline?"span":"div";return _react2["default"].createElement(ValidateEditor,_extends({},this.props,{onStop:this.onStop,tag:t}))},focus:function(){_reactDom2["default"].findDOMNode(this).focus()},onStop:function(){this.context.returnFocus()}}); -},{"../utils.js":34,"react":"react","react-dom":"react-dom"}],13:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function LogIcon(e){var t=e.event,n={web:"html5",debug:"bug"}[t.level]||"info";return _react2["default"].createElement("i",{className:"fa fa-fw fa-"+n})}function LogEntry(e){var t=e.event,n=e.registerHeight;return _react2["default"].createElement("div",{ref:n},_react2["default"].createElement(LogIcon,{event:t}),t.message)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.ToggleEventLog=void 0;var _createClass=function(){function e(e,t){for(var n=0;n1048576*t}},render:function(){var e=(0,_utils2.formatSize)(this.props.message.contentLength);return _react2["default"].createElement("div",{className:"alert alert-warning"},_react2["default"].createElement("button",{onClick:this.props.onClick,className:"btn btn-xs btn-warning pull-right"},"Display anyway"),e," content size.")}}),ViewSelector=_react2["default"].createClass({displayName:"ViewSelector",render:function(){for(var e=[],t=0;t0&&(r.preventDefault(),this.refs[e-1+"-value"].focus())},render:function(){var e=this.props.message.headers.map(function(e,t){var r=_react2["default"].createElement(HeaderEditor,{ref:t+"-key",content:e[0],onDone:this.onChange.bind(null,t,0),onRemove:this.onRemove.bind(null,t,0),onTab:this.onTab.bind(null,t,0)}),s=_react2["default"].createElement(HeaderEditor,{ref:t+"-value",content:e[1],onDone:this.onChange.bind(null,t,1),onRemove:this.onRemove.bind(null,t,1),onTab:this.onTab.bind(null,t,1)});return _react2["default"].createElement("tr",{key:t},_react2["default"].createElement("td",{className:"header-name"},r,":"),_react2["default"].createElement("td",{className:"header-value"},s))}.bind(this));return _react2["default"].createElement("table",{className:"header-table"},_react2["default"].createElement("tbody",null,e))}}),HeaderEditor=_react2["default"].createClass({displayName:"HeaderEditor",render:function(){return _react2["default"].createElement(_editor.ValueEditor,_extends({ref:"input"},this.props,{onKeyDown:this.onKeyDown,inline:!0}))},focus:function(){_reactDom2["default"].findDOMNode(this).focus()},onKeyDown:function(e){switch(e.keyCode){case _utils2.Key.BACKSPACE:var t=window.getSelection().getRangeAt(0);0===t.startOffset&&0===t.endOffset&&this.props.onRemove(e);break;case _utils2.Key.TAB:e.shiftKey||this.props.onTab(e)}}}),RequestLine=_react2["default"].createClass({displayName:"RequestLine",render:function(){var e=this.props.flow,t=_utils.RequestUtils.pretty_url(e.request),r=e.request.http_version;return _react2["default"].createElement("div",{className:"first-line request-line"},_react2["default"].createElement(_editor.ValueEditor,{ref:"method",content:e.request.method,onDone:this.onMethodChange,inline:!0})," ",_react2["default"].createElement(_editor.ValueEditor,{ref:"url",content:t,onDone:this.onUrlChange,isValid:this.isValidUrl,inline:!0})," ",_react2["default"].createElement(_editor.ValueEditor,{ref:"httpVersion",content:r,onDone:this.onHttpVersionChange,isValid:_utils.isValidHttpVersion,inline:!0}))},isValidUrl:function(e){var t=(0,_utils.parseUrl)(e);return!!t.host},onMethodChange:function(e){_actions.FlowActions.update(this.props.flow,{request:{method:e}})},onUrlChange:function(e){var t=(0,_utils.parseUrl)(e);t.path=t.path||"",_actions.FlowActions.update(this.props.flow,{request:t})},onHttpVersionChange:function(e){var t=(0,_utils.parseHttpVersion)(e);_actions.FlowActions.update(this.props.flow,{request:{http_version:t}})}}),ResponseLine=_react2["default"].createClass({displayName:"ResponseLine",render:function(){var e=this.props.flow,t=e.response.http_version;return _react2["default"].createElement("div",{className:"first-line response-line"},_react2["default"].createElement(_editor.ValueEditor,{ref:"httpVersion",content:t,onDone:this.onHttpVersionChange,isValid:_utils.isValidHttpVersion,inline:!0})," ",_react2["default"].createElement(_editor.ValueEditor,{ref:"code",content:e.response.status_code+"",onDone:this.onCodeChange,isValid:this.isValidCode,inline:!0})," ",_react2["default"].createElement(_editor.ValueEditor,{ref:"msg",content:e.response.reason,onDone:this.onMsgChange,inline:!0}))},isValidCode:function(e){return/^\d+$/.test(e)},onHttpVersionChange:function(e){var t=(0,_utils.parseHttpVersion)(e);_actions.FlowActions.update(this.props.flow,{response:{http_version:t}})},onMsgChange:function(e){_actions.FlowActions.update(this.props.flow,{response:{msg:e}})},onCodeChange:function(e){e=parseInt(e),_actions.FlowActions.update(this.props.flow,{response:{code:e}})}}),Request=exports.Request=_react2["default"].createClass({displayName:"Request",render:function(){var e=this.props.flow;return _react2["default"].createElement("section",{className:"request"},_react2["default"].createElement(RequestLine,{ref:"requestLine",flow:e}),_react2["default"].createElement(Headers,{ref:"headers",message:e.request,onChange:this.onHeaderChange}),_react2["default"].createElement("hr",null),_react2["default"].createElement(_contentview2["default"],{flow:e,message:e.request}))},edit:function(e){switch(e){case"m":this.refs.requestLine.refs.method.focus();break;case"u":this.refs.requestLine.refs.url.focus();break;case"v":this.refs.requestLine.refs.httpVersion.focus();break;case"h":this.refs.headers.edit();break;default:throw"Unimplemented: "+e}},onHeaderChange:function(e){_actions.FlowActions.update(this.props.flow,{request:{headers:e}})}}),Response=exports.Response=_react2["default"].createClass({displayName:"Response",render:function(){var e=this.props.flow;return _react2["default"].createElement("section",{className:"response"},_react2["default"].createElement(ResponseLine,{ref:"responseLine",flow:e}),_react2["default"].createElement(Headers,{ref:"headers",message:e.response,onChange:this.onHeaderChange}),_react2["default"].createElement("hr",null),_react2["default"].createElement(_contentview2["default"],{flow:e,message:e.response}))},edit:function(e){switch(e){case"c":this.refs.responseLine.refs.status_code.focus();break;case"m":this.refs.responseLine.refs.msg.focus();break;case"v":this.refs.responseLine.refs.httpVersion.focus();break;case"h":this.refs.headers.edit();break;default:throw"Unimplemented: "+e}},onHeaderChange:function(e){_actions.FlowActions.update(this.props.flow,{response:{headers:e}})}}),Error=exports.Error=_react2["default"].createClass({displayName:"Error",render:function(){var e=this.props.flow;return _react2["default"].createElement("section",null,_react2["default"].createElement("div",{className:"alert alert-warning"},e.error.msg,_react2["default"].createElement("div",null,_react2["default"].createElement("small",null,(0,_utils2.formatTimeStamp)(e.error.timestamp)))))}}); -},{"../../actions.js":2,"../../flow/utils.js":32,"../../utils.js":34,"../editor.js":12,"./contentview.js":14,"lodash":"lodash","react":"react","react-dom":"react-dom"}],18:[function(require,module,exports){ +},{"../../actions.js":2,"../../flow/utils.js":33,"../../utils.js":35,"../editor.js":14,"./contentview.js":15,"lodash":"lodash","react":"react","react-dom":"react-dom"}],19:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0});var _react=require("react"),_react2=_interopRequireDefault(_react),_actions=require("../../actions.js"),NavAction=_react2["default"].createClass({displayName:"NavAction",onClick:function(e){e.preventDefault(),this.props.onClick()},render:function(){return _react2["default"].createElement("a",{title:this.props.title,href:"#",className:"nav-action",onClick:this.onClick},_react2["default"].createElement("i",{className:"fa fa-fw "+this.props.icon}))}}),Nav=_react2["default"].createClass({displayName:"Nav",render:function(){var e=this.props.flow,t=this.props.tabs.map(function(e){var t=e.charAt(0).toUpperCase()+e.slice(1),a=this.props.active===e?"active":"",c=function(t){this.props.selectTab(e),t.preventDefault()}.bind(this);return _react2["default"].createElement("a",{key:e,href:"#",className:a,onClick:c},t)}.bind(this)),a=null;e.intercepted&&(a=_react2["default"].createElement(NavAction,{title:"[a]ccept intercepted flow",icon:"fa-play",onClick:_actions.FlowActions.accept.bind(null,e)}));var c=null;return e.modified&&(c=_react2["default"].createElement(NavAction,{title:"revert changes to flow [V]",icon:"fa-history",onClick:_actions.FlowActions.revert.bind(null,e)})),_react2["default"].createElement("nav",{ref:"head",className:"nav-tabs nav-tabs-sm"},t,_react2["default"].createElement(NavAction,{title:"[d]elete flow",icon:"fa-trash",onClick:_actions.FlowActions["delete"].bind(null,e)}),_react2["default"].createElement(NavAction,{title:"[D]uplicate flow",icon:"fa-copy",onClick:_actions.FlowActions.duplicate.bind(null,e)}),_react2["default"].createElement(NavAction,{disabled:!0,title:"[r]eplay flow",icon:"fa-repeat",onClick:_actions.FlowActions.replay.bind(null,e)}),a,c)}});exports["default"]=Nav; -},{"../../actions.js":2,"react":"react"}],19:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.Header=exports.OptionMenu=exports.MainMenu=void 0;var _react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_jquery=require("jquery"),_jquery2=_interopRequireDefault(_jquery),_reactRedux=require("react-redux"),_filt=require("../filt/filt.js"),_filt2=_interopRequireDefault(_filt),_utils=require("../utils.js"),_common=require("./common.js"),_actions=require("../actions.js"),_eventlog=require("./eventlog"),FilterDocs=_react2["default"].createClass({displayName:"FilterDocs",statics:{xhr:!1,doc:!1},componentWillMount:function(){FilterDocs.doc||(FilterDocs.xhr=_jquery2["default"].getJSON("/filter-help").done(function(e){FilterDocs.doc=e,FilterDocs.xhr=!1})),FilterDocs.xhr&&FilterDocs.xhr.done(function(){this.forceUpdate()}.bind(this))},render:function(){if(FilterDocs.doc){var e=FilterDocs.doc.commands.map(function(e){return _react2["default"].createElement("tr",{key:e[1]},_react2["default"].createElement("td",null,e[0].replace(" "," ")),_react2["default"].createElement("td",null,e[1]))});return e.push(_react2["default"].createElement("tr",{key:"docs-link"},_react2["default"].createElement("td",{colSpan:"2"},_react2["default"].createElement("a",{href:"http://docs.mitmproxy.org/en/stable/features/filters.html",target:"_blank"},_react2["default"].createElement("i",{className:"fa fa-external-link"}),"  mitmproxy docs")))),_react2["default"].createElement("table",{className:"table table-condensed"},_react2["default"].createElement("tbody",null,e))}return _react2["default"].createElement("i",{className:"fa fa-spinner fa-spin"})}}),FilterInput=_react2["default"].createClass({displayName:"FilterInput",contextTypes:{returnFocus:_react2["default"].PropTypes.func},getInitialState:function(){return{value:this.props.value,focus:!1,mousefocus:!1}},componentWillReceiveProps:function(e){this.setState({value:e.value})},onChange:function(e){var t=e.target.value;this.setState({value:t}),this.isValid(t)&&this.props.onChange(t)},isValid:function(e){try{var t=e||this.state.value;return t&&_filt2["default"].parse(e||this.state.value),!0}catch(a){return!1}},getDesc:function(){if(this.state.value)try{return _filt2["default"].parse(this.state.value).desc}catch(e){return""+e}return _react2["default"].createElement(FilterDocs,null)},onFocus:function(){this.setState({focus:!0})},onBlur:function(){this.setState({focus:!1})},onMouseEnter:function(){this.setState({mousefocus:!0})},onMouseLeave:function(){this.setState({mousefocus:!1})},onKeyDown:function(e){e.keyCode!==_utils.Key.ESC&&e.keyCode!==_utils.Key.ENTER||(this.blur(),this.setState({mousefocus:!1})),e.stopPropagation()},blur:function(){_reactDom2["default"].findDOMNode(this.refs.input).blur(),this.context.returnFocus()},select:function(){_reactDom2["default"].findDOMNode(this.refs.input).select()},render:function(){var e,t=this.isValid(),a="fa fa-fw fa-"+this.props.type,n="filter-input input-group"+(t?"":" has-error");return(this.state.focus||this.state.mousefocus)&&(e=_react2["default"].createElement("div",{className:"popover bottom",onMouseEnter:this.onMouseEnter,onMouseLeave:this.onMouseLeave},_react2["default"].createElement("div",{className:"arrow"}),_react2["default"].createElement("div",{className:"popover-content"},this.getDesc()))),_react2["default"].createElement("div",{className:n},_react2["default"].createElement("span",{className:"input-group-addon"},_react2["default"].createElement("i",{className:a,style:{color:this.props.color}})),_react2["default"].createElement("input",{type:"text",placeholder:this.props.placeholder,className:"form-control",ref:"input",onChange:this.onChange,onFocus:this.onFocus,onBlur:this.onBlur,onKeyDown:this.onKeyDown,value:this.state.value}),e)}}),MainMenu=exports.MainMenu=_react2["default"].createClass({displayName:"MainMenu",propTypes:{settings:_react2["default"].PropTypes.object.isRequired},statics:{title:"Start",route:"flows"},onSearchChange:function(e){var t={};t[_actions.Query.SEARCH]=e,this.props.updateLocation(void 0,t)},onHighlightChange:function(e){var t={};t[_actions.Query.HIGHLIGHT]=e,this.props.updateLocation(void 0,t)},onInterceptChange:function(e){_actions.SettingsActions.update({intercept:e})},render:function(){var e=this.props.query[_actions.Query.SEARCH]||"",t=this.props.query[_actions.Query.HIGHLIGHT]||"",a=this.props.settings.intercept||"";return _react2["default"].createElement("div",null,_react2["default"].createElement("div",{className:"menu-row"},_react2["default"].createElement(FilterInput,{ref:"search",placeholder:"Search",type:"search",color:"black",value:e,onChange:this.onSearchChange}),_react2["default"].createElement(FilterInput,{ref:"highlight",placeholder:"Highlight",type:"tag",color:"hsl(48, 100%, 50%)",value:t,onChange:this.onHighlightChange}),_react2["default"].createElement(FilterInput,{ref:"intercept",placeholder:"Intercept",type:"pause",color:"hsl(208, 56%, 53%)",value:a,onChange:this.onInterceptChange})),_react2["default"].createElement("div",{className:"clearfix"}))}}),ViewMenu=_react2["default"].createClass({displayName:"ViewMenu",statics:{title:"View",route:"flows"},render:function(){return _react2["default"].createElement("div",null,_react2["default"].createElement("div",{className:"menu-row"},_react2["default"].createElement(_eventlog.ToggleEventLog,{text:"Show Event Log"})),_react2["default"].createElement("div",{className:"clearfix"}))}}),OptionMenu=exports.OptionMenu=function(e){var t=e.settings,a=(t.mode,t.intercept,t.showhost),n=t.no_upstream_cert,r=t.rawtcp,l=t.http2,c=t.anticache,i=t.anticomp,o=t.stickycookie,s=t.stickyauth,u=t.stream;return _react2["default"].createElement("div",null,_react2["default"].createElement("div",{className:"menu-row"},_react2["default"].createElement(_common.ToggleButton,{text:"showhost",checked:a,onToggle:function(){return _actions.SettingsActions.update({showhost:!a})}}),_react2["default"].createElement(_common.ToggleButton,{text:"no_upstream_cert",checked:n,onToggle:function(){return _actions.SettingsActions.update({no_upstream_cert:!n})}}),_react2["default"].createElement(_common.ToggleButton,{text:"rawtcp",checked:r,onToggle:function(){return _actions.SettingsActions.update({rawtcp:!r})}}),_react2["default"].createElement(_common.ToggleButton,{text:"http2",checked:l,onToggle:function(){return _actions.SettingsActions.update({http2:!l})}}),_react2["default"].createElement(_common.ToggleButton,{text:"anticache",checked:c,onToggle:function(){return _actions.SettingsActions.update({anticache:!c})}}),_react2["default"].createElement(_common.ToggleButton,{text:"anticomp",checked:i,onToggle:function(){return _actions.SettingsActions.update({anticomp:!i})}}),_react2["default"].createElement(_common.ToggleInputButton,{name:"stickyauth",placeholder:"Sticky auth filter",checked:Boolean(s),txt:s||"",onToggleChanged:function(e){return _actions.SettingsActions.update({stickyauth:s?null:e})}}),_react2["default"].createElement(_common.ToggleInputButton,{name:"stickycookie",placeholder:"Sticky cookie filter",checked:Boolean(o),txt:o||"",onToggleChanged:function(e){return _actions.SettingsActions.update({stickycookie:o?null:e})}}),_react2["default"].createElement(_common.ToggleInputButton,{name:"stream",placeholder:"stream...",checked:Boolean(u),txt:u||"",inputType:"number",onToggleChanged:function(e){return _actions.SettingsActions.update({stream:u?null:e})}})),_react2["default"].createElement("div",{className:"clearfix"}))};OptionMenu.title="Options",OptionMenu.propTypes={settings:_react2["default"].PropTypes.object.isRequired};var ReportsMenu=_react2["default"].createClass({displayName:"ReportsMenu",statics:{title:"Visualization",route:"reports"},render:function(){return _react2["default"].createElement("div",null,"Reports Menu")}}),FileMenu=_react2["default"].createClass({displayName:"FileMenu",getInitialState:function(){return{showFileMenu:!1}},handleFileClick:function(e){if(e.preventDefault(),!this.state.showFileMenu){var t=function(){this.setState({showFileMenu:!1}),document.removeEventListener("click",t)}.bind(this);document.addEventListener("click",t),this.setState({showFileMenu:!0})}},handleNewClick:function(e){e.preventDefault(),confirm("Delete all flows?")&&_actions.FlowActions.clear()},handleOpenClick:function(e){this.fileInput.click(),e.preventDefault()},handleOpenFile:function(e){e.target.files.length>0&&(_actions.FlowActions.upload(e.target.files[0]),this.fileInput.value=""),e.preventDefault()},handleSaveClick:function(e){e.preventDefault(),_actions.FlowActions.download()},handleShutdownClick:function(e){e.preventDefault(),console.error("unimplemented: handleShutdownClick")},render:function(){var e=this,t="dropdown pull-left"+(this.state.showFileMenu?" open":"");return _react2["default"].createElement("div",{className:t},_react2["default"].createElement("a",{href:"#",className:"special",onClick:this.handleFileClick}," mitmproxy "),_react2["default"].createElement("ul",{className:"dropdown-menu",role:"menu"},_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"#",onClick:this.handleNewClick},_react2["default"].createElement("i",{className:"fa fa-fw fa-file"}),"New")),_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"#",onClick:this.handleOpenClick},_react2["default"].createElement("i",{className:"fa fa-fw fa-folder-open"}),"Open..."),_react2["default"].createElement("input",{ref:function(t){return e.fileInput=t},className:"hidden",type:"file",onChange:this.handleOpenFile})),_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"#",onClick:this.handleSaveClick},_react2["default"].createElement("i",{className:"fa fa-fw fa-floppy-o"}),"Save...")),_react2["default"].createElement("li",{role:"presentation",className:"divider"}),_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"http://mitm.it/",target:"_blank"},_react2["default"].createElement("i",{className:"fa fa-fw fa-external-link"}),"Install Certificates..."))))}}),header_entries=[MainMenu,ViewMenu,OptionMenu],Header=exports.Header=_react2["default"].createClass({displayName:"Header",propTypes:{settings:_react2["default"].PropTypes.object.isRequired},getInitialState:function(){return{active:header_entries[0]}},handleClick:function(e,t){t.preventDefault(),this.props.updateLocation(e.route),this.setState({active:e})},render:function(){var e=header_entries.map(function(e,t){var a;return a=e===this.state.active?"active":"",_react2["default"].createElement("a",{key:t,href:"#",className:a,onClick:this.handleClick.bind(this,e)},e.title)}.bind(this));return _react2["default"].createElement("header",null,_react2["default"].createElement("nav",{className:"nav-tabs nav-tabs-lg"},_react2["default"].createElement(FileMenu,null),e),_react2["default"].createElement("div",{className:"menu"},_react2["default"].createElement(this.state.active,{ref:"active",settings:this.props.settings,updateLocation:this.props.updateLocation,query:this.props.query})))}}); +},{"../../actions.js":2,"react":"react"}],20:[function(require,module,exports){ +"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.Header=exports.OptionMenu=exports.MainMenu=void 0;var _react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_redux=require("redux"),_jquery=require("jquery"),_jquery2=_interopRequireDefault(_jquery),_reactRedux=require("react-redux"),_filt=require("../filt/filt.js"),_filt2=_interopRequireDefault(_filt),_utils=require("../utils.js"),_common=require("./common.js"),_actions=require("../actions.js"),_eventLog=require("../ducks/eventLog"),ToggleEventLog=(0,_reactRedux.connect)(function(e){return{checked:e.eventLog.visible}},function(e){return(0,_redux.bindActionCreators)({onToggle:_eventLog.toggleEventLogVisibility},e)})(_common.ToggleButton),FilterDocs=_react2["default"].createClass({displayName:"FilterDocs",statics:{xhr:!1,doc:!1},componentWillMount:function(){FilterDocs.doc||(FilterDocs.xhr=_jquery2["default"].getJSON("/filter-help").done(function(e){FilterDocs.doc=e,FilterDocs.xhr=!1})),FilterDocs.xhr&&FilterDocs.xhr.done(function(){this.forceUpdate()}.bind(this))},render:function(){if(FilterDocs.doc){var e=FilterDocs.doc.commands.map(function(e){return _react2["default"].createElement("tr",{key:e[1]},_react2["default"].createElement("td",null,e[0].replace(" "," ")),_react2["default"].createElement("td",null,e[1]))});return e.push(_react2["default"].createElement("tr",{key:"docs-link"},_react2["default"].createElement("td",{colSpan:"2"},_react2["default"].createElement("a",{href:"http://docs.mitmproxy.org/en/stable/features/filters.html",target:"_blank"},_react2["default"].createElement("i",{className:"fa fa-external-link"}),"  mitmproxy docs")))),_react2["default"].createElement("table",{className:"table table-condensed"},_react2["default"].createElement("tbody",null,e))}return _react2["default"].createElement("i",{className:"fa fa-spinner fa-spin"})}}),FilterInput=_react2["default"].createClass({displayName:"FilterInput",contextTypes:{returnFocus:_react2["default"].PropTypes.func},getInitialState:function(){return{value:this.props.value,focus:!1,mousefocus:!1}},componentWillReceiveProps:function(e){this.setState({value:e.value})},onChange:function(e){var t=e.target.value;this.setState({value:t}),this.isValid(t)&&this.props.onChange(t)},isValid:function(e){try{var t=e||this.state.value;return t&&_filt2["default"].parse(e||this.state.value),!0}catch(a){return!1}},getDesc:function(){if(this.state.value)try{return _filt2["default"].parse(this.state.value).desc}catch(e){return""+e}return _react2["default"].createElement(FilterDocs,null)},onFocus:function(){this.setState({focus:!0})},onBlur:function(){this.setState({focus:!1})},onMouseEnter:function(){this.setState({mousefocus:!0})},onMouseLeave:function(){this.setState({mousefocus:!1})},onKeyDown:function(e){e.keyCode!==_utils.Key.ESC&&e.keyCode!==_utils.Key.ENTER||(this.blur(),this.setState({mousefocus:!1})),e.stopPropagation()},blur:function(){_reactDom2["default"].findDOMNode(this.refs.input).blur(),this.context.returnFocus()},select:function(){_reactDom2["default"].findDOMNode(this.refs.input).select()},render:function(){var e,t=this.isValid(),a="fa fa-fw fa-"+this.props.type,n="filter-input input-group"+(t?"":" has-error");return(this.state.focus||this.state.mousefocus)&&(e=_react2["default"].createElement("div",{className:"popover bottom",onMouseEnter:this.onMouseEnter,onMouseLeave:this.onMouseLeave},_react2["default"].createElement("div",{className:"arrow"}),_react2["default"].createElement("div",{className:"popover-content"},this.getDesc()))),_react2["default"].createElement("div",{className:n},_react2["default"].createElement("span",{className:"input-group-addon"},_react2["default"].createElement("i",{className:a,style:{color:this.props.color}})),_react2["default"].createElement("input",{type:"text",placeholder:this.props.placeholder,className:"form-control",ref:"input",onChange:this.onChange,onFocus:this.onFocus,onBlur:this.onBlur,onKeyDown:this.onKeyDown,value:this.state.value}),e)}}),MainMenu=exports.MainMenu=_react2["default"].createClass({displayName:"MainMenu",propTypes:{settings:_react2["default"].PropTypes.object.isRequired},statics:{title:"Start",route:"flows"},onSearchChange:function(e){var t={};t[_actions.Query.SEARCH]=e,this.props.updateLocation(void 0,t)},onHighlightChange:function(e){var t={};t[_actions.Query.HIGHLIGHT]=e,this.props.updateLocation(void 0,t)},onInterceptChange:function(e){_actions.SettingsActions.update({intercept:e})},render:function(){var e=this.props.query[_actions.Query.SEARCH]||"",t=this.props.query[_actions.Query.HIGHLIGHT]||"",a=this.props.settings.intercept||"";return _react2["default"].createElement("div",null,_react2["default"].createElement("div",{className:"menu-row"},_react2["default"].createElement(FilterInput,{ref:"search",placeholder:"Search",type:"search",color:"black",value:e,onChange:this.onSearchChange}),_react2["default"].createElement(FilterInput,{ref:"highlight",placeholder:"Highlight",type:"tag",color:"hsl(48, 100%, 50%)",value:t,onChange:this.onHighlightChange}),_react2["default"].createElement(FilterInput,{ref:"intercept",placeholder:"Intercept",type:"pause",color:"hsl(208, 56%, 53%)",value:a,onChange:this.onInterceptChange})),_react2["default"].createElement("div",{className:"clearfix"}))}}),ViewMenu=_react2["default"].createClass({displayName:"ViewMenu",statics:{title:"View",route:"flows"},render:function(){return _react2["default"].createElement("div",null,_react2["default"].createElement("div",{className:"menu-row"},_react2["default"].createElement(ToggleEventLog,{text:"Show Event Log"})),_react2["default"].createElement("div",{className:"clearfix"}))}}),OptionMenu=exports.OptionMenu=function(e){var t=e.settings,a=(t.mode,t.intercept,t.showhost),n=t.no_upstream_cert,r=t.rawtcp,l=t.http2,c=t.anticache,o=t.anticomp,i=t.stickycookie,u=t.stickyauth,s=t.stream;return _react2["default"].createElement("div",null,_react2["default"].createElement("div",{className:"menu-row"},_react2["default"].createElement(_common.ToggleButton,{text:"showhost",checked:a,onToggle:function(){return _actions.SettingsActions.update({showhost:!a})}}),_react2["default"].createElement(_common.ToggleButton,{text:"no_upstream_cert",checked:n,onToggle:function(){return _actions.SettingsActions.update({no_upstream_cert:!n})}}),_react2["default"].createElement(_common.ToggleButton,{text:"rawtcp",checked:r,onToggle:function(){return _actions.SettingsActions.update({rawtcp:!r})}}),_react2["default"].createElement(_common.ToggleButton,{text:"http2",checked:l,onToggle:function(){return _actions.SettingsActions.update({http2:!l})}}),_react2["default"].createElement(_common.ToggleButton,{text:"anticache",checked:c,onToggle:function(){return _actions.SettingsActions.update({anticache:!c})}}),_react2["default"].createElement(_common.ToggleButton,{text:"anticomp",checked:o,onToggle:function(){return _actions.SettingsActions.update({anticomp:!o})}}),_react2["default"].createElement(_common.ToggleInputButton,{name:"stickyauth",placeholder:"Sticky auth filter",checked:Boolean(u),txt:u||"",onToggleChanged:function(e){return _actions.SettingsActions.update({stickyauth:u?null:e})}}),_react2["default"].createElement(_common.ToggleInputButton,{name:"stickycookie",placeholder:"Sticky cookie filter",checked:Boolean(i),txt:i||"",onToggleChanged:function(e){return _actions.SettingsActions.update({stickycookie:i?null:e})}}),_react2["default"].createElement(_common.ToggleInputButton,{name:"stream",placeholder:"stream...",checked:Boolean(s),txt:s||"",inputType:"number",onToggleChanged:function(e){return _actions.SettingsActions.update({stream:s?null:e})}})),_react2["default"].createElement("div",{className:"clearfix"}))};OptionMenu.title="Options",OptionMenu.propTypes={settings:_react2["default"].PropTypes.object.isRequired};var ReportsMenu=_react2["default"].createClass({displayName:"ReportsMenu",statics:{title:"Visualization",route:"reports"},render:function(){return _react2["default"].createElement("div",null,"Reports Menu")}}),FileMenu=_react2["default"].createClass({displayName:"FileMenu",getInitialState:function(){return{showFileMenu:!1}},handleFileClick:function(e){if(e.preventDefault(),!this.state.showFileMenu){var t=function(){this.setState({showFileMenu:!1}),document.removeEventListener("click",t)}.bind(this);document.addEventListener("click",t),this.setState({showFileMenu:!0})}},handleNewClick:function(e){e.preventDefault(),confirm("Delete all flows?")&&_actions.FlowActions.clear()},handleOpenClick:function(e){this.fileInput.click(),e.preventDefault()},handleOpenFile:function(e){e.target.files.length>0&&(_actions.FlowActions.upload(e.target.files[0]),this.fileInput.value=""),e.preventDefault()},handleSaveClick:function(e){e.preventDefault(),_actions.FlowActions.download()},handleShutdownClick:function(e){e.preventDefault(),console.error("unimplemented: handleShutdownClick")},render:function(){var e=this,t="dropdown pull-left"+(this.state.showFileMenu?" open":"");return _react2["default"].createElement("div",{className:t},_react2["default"].createElement("a",{href:"#",className:"special",onClick:this.handleFileClick}," mitmproxy "),_react2["default"].createElement("ul",{className:"dropdown-menu",role:"menu"},_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"#",onClick:this.handleNewClick},_react2["default"].createElement("i",{className:"fa fa-fw fa-file"}),"New")),_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"#",onClick:this.handleOpenClick},_react2["default"].createElement("i",{className:"fa fa-fw fa-folder-open"}),"Open..."),_react2["default"].createElement("input",{ref:function(t){return e.fileInput=t},className:"hidden",type:"file",onChange:this.handleOpenFile})),_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"#",onClick:this.handleSaveClick},_react2["default"].createElement("i",{className:"fa fa-fw fa-floppy-o"}),"Save...")),_react2["default"].createElement("li",{role:"presentation",className:"divider"}),_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"http://mitm.it/",target:"_blank"},_react2["default"].createElement("i",{className:"fa fa-fw fa-external-link"}),"Install Certificates..."))))}}),header_entries=[MainMenu,ViewMenu,OptionMenu],Header=exports.Header=_react2["default"].createClass({displayName:"Header",propTypes:{settings:_react2["default"].PropTypes.object.isRequired},getInitialState:function(){return{active:header_entries[0]}},handleClick:function(e,t){t.preventDefault(),this.props.updateLocation(e.route),this.setState({active:e})},render:function(){var e=header_entries.map(function(e,t){var a;return a=e===this.state.active?"active":"",_react2["default"].createElement("a",{key:t,href:"#",className:a,onClick:this.handleClick.bind(this,e)},e.title)}.bind(this));return _react2["default"].createElement("header",null,_react2["default"].createElement("nav",{className:"nav-tabs nav-tabs-lg"},_react2["default"].createElement(FileMenu,null),e),_react2["default"].createElement("div",{className:"menu"},_react2["default"].createElement(this.state.active,{ref:"active",settings:this.props.settings,updateLocation:this.props.updateLocation,query:this.props.query})))}}); -},{"../actions.js":2,"../filt/filt.js":31,"../utils.js":34,"./common.js":11,"./eventlog":13,"jquery":"jquery","react":"react","react-dom":"react-dom","react-redux":"react-redux"}],20:[function(require,module,exports){ +},{"../actions.js":2,"../ducks/eventLog":26,"../filt/filt.js":32,"../utils.js":35,"./common.js":13,"jquery":"jquery","react":"react","react-dom":"react-dom","react-redux":"react-redux","redux":"redux"}],21:[function(require,module,exports){ "use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function t(t,e){for(var o=0;oh;h++){var m=i[h]||o;r>=s&&h%2===0&&(d=s,n=h),l>=s?c=h+1:p+=m,s+=m}else n=-2&Math.max(0,Math.floor(r/o)-1),c=Math.min(e,n+Math.ceil(a/o)+2),d=Math.min(n,e)*o,p=Math.max(0,e-c)*o;return{start:n,end:c,paddingTop:d,paddingBottom:p}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.calcVScroll=calcVScroll; -},{}],22:[function(require,module,exports){ +},{}],23:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0});var _react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_lodash=require("lodash"),_lodash2=_interopRequireDefault(_lodash),_utils=require("../utils.js"),Prompt=_react2["default"].createClass({displayName:"Prompt",contextTypes:{returnFocus:_react2["default"].PropTypes.func},propTypes:{options:_react2["default"].PropTypes.array.isRequired,done:_react2["default"].PropTypes.func.isRequired,prompt:_react2["default"].PropTypes.string},componentDidMount:function(){_reactDom2["default"].findDOMNode(this).focus()},onKeyDown:function(e){e.stopPropagation(),e.preventDefault();for(var t=this.getOptions(),r=0;r0&&t(n[0]);)n=n.substr(1);o={text:o,key:n[0]}}if(!o.text||!o.key||t(o.key))throw"invalid options";e.push(o)}return e},render:function(){var e=this.getOptions();return e=_lodash2["default"].map(e,function(e){var t,r,o=e.text.indexOf(e.key);-1!==o?(t=e.text.substring(0,o),r=e.text.substring(o+1)):(t=e.text+" (",r=")");var n=function(t){this.done(e.key),t.stopPropagation()}.bind(this);return _react2["default"].createElement("span",{key:e.key,className:"option",onClick:n},t,_react2["default"].createElement("strong",{className:"text-primary"},e.key),r)}.bind(this)),_react2["default"].createElement("div",{tabIndex:"0",onKeyDown:this.onKeyDown,onClick:this.onClick,className:"prompt-dialog"},_react2["default"].createElement("div",{className:"prompt-content"},this.props.prompt||_react2["default"].createElement("strong",null,"Select: "),e))}});exports["default"]=Prompt; -},{"../utils.js":34,"lodash":"lodash","react":"react","react-dom":"react-dom"}],23:[function(require,module,exports){ +},{"../utils.js":35,"lodash":"lodash","react":"react","react-dom":"react-dom"}],24:[function(require,module,exports){ "use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var o={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(o[n]=e[n]);return o["default"]=e,o}function Connection(e,o){"/"===e[0]&&(e=location.origin.replace("http","ws")+e);var n=new WebSocket(e);return n.onopen=function(){o(webSocketActions.connected()),o(flowActions.fetchFlows()).then(function(){console.log("flows are loaded now"),_actions.ConnectionActions.open()}),o(eventLogActions.fetchLogEntries())},n.onmessage=function(e){var n=JSON.parse(e.data);switch(_dispatcher.AppDispatcher.dispatchServerAction(n),n.type){case eventLogActions.UPDATE_LOG:return o(eventLogActions.updateLogEntries(n));case flowActions.UPDATE_FLOWS:return o(flowActions.updateFlows(n));default:console.warn("unknown message",n)}},n.onerror=function(){_actions.ConnectionActions.error(),o(eventLogActions.addLogEntry("WebSocket connection error."))},n.onclose=function(){_actions.ConnectionActions.close(),o(eventLogActions.addLogEntry("WebSocket connection closed.")),o(webSocketActions.disconnected())},n}Object.defineProperty(exports,"__esModule",{value:!0}),exports["default"]=Connection;var _actions=require("./actions.js"),_dispatcher=require("./dispatcher.js"),_websocket=require("./ducks/websocket"),webSocketActions=_interopRequireWildcard(_websocket),_eventLog=require("./ducks/eventLog"),eventLogActions=_interopRequireWildcard(_eventLog),_flows=require("./ducks/flows"),flowActions=_interopRequireWildcard(_flows); -},{"./actions.js":2,"./dispatcher.js":24,"./ducks/eventLog":25,"./ducks/flows":26,"./ducks/websocket":30}],24:[function(require,module,exports){ +},{"./actions.js":2,"./dispatcher.js":25,"./ducks/eventLog":26,"./ducks/flows":27,"./ducks/websocket":31}],25:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.AppDispatcher=void 0;var _flux=require("flux"),_flux2=_interopRequireDefault(_flux),PayloadSources={VIEW:"view",SERVER:"server"},AppDispatcher=exports.AppDispatcher=new _flux2["default"].Dispatcher;AppDispatcher.dispatchViewAction=function(e){e.source=PayloadSources.VIEW,this.dispatch(e)},AppDispatcher.dispatchServerAction=function(e){e.source=PayloadSources.SERVER,this.dispatch(e)}; -},{"flux":"flux"}],25:[function(require,module,exports){ +},{"flux":"flux"}],26:[function(require,module,exports){ "use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _defineProperty(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function reducer(){var e=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],t=arguments[1];switch(t.type){case TOGGLE_FILTER:var i=_extends({},e.filter,_defineProperty({},t.filter,!e.filter[t.filter]));return _extends({},e,{filter:i,filteredEvents:(0,_view.updateViewFilter)(e.events,function(e){return i[e.level]})});case TOGGLE_VISIBILITY:return _extends({},e,{visible:!e.visible});case UPDATE_LOG:var r=reduceList(e.events,t);return _extends({},e,{events:r,filteredEvents:(0,_view.updateViewList)(e.filteredEvents,e.events,r,t,function(t){return e.filter[t.level]})});default:return e}}function toggleEventLogFilter(e){return{type:TOGGLE_FILTER,filter:e}}function toggleEventLogVisibility(){return{type:TOGGLE_VISIBILITY}}function addLogEntry(e){var t=arguments.length<=1||void 0===arguments[1]?"web":arguments[1];return addItem({message:e,level:t,id:"log-"+id++})}Object.defineProperty(exports,"__esModule",{value:!0}),exports.fetchLogEntries=exports.updateLogEntries=exports.UPDATE_LOG=void 0;var _extends=Object.assign||function(e){for(var t=1;tn;)u=n+o>>>1,r(e[u])n?-1:n>o?1:0};return t},sortedInsert=function(e,t,r){var n=[].concat(_toConsumableArray(e),[r]);n.indexOf=function(e){return sortedIndexOf(n,e,t)};var o=makeCompareFn(t);return t&&o(e[e.length-1],r)>0&&(console.debug("sorting view..."),n.sort(o)),n},sortedRemove=function(e,t,r){var n=r.id,o=e.filter(function(e){return e.id!==n});return o.indexOf=function(e){return sortedIndexOf(o,e,t)},o}; -},{"./list":28}],30:[function(require,module,exports){ +},{"./list":29}],31:[function(require,module,exports){ "use strict";function reducer(){var e=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],t=arguments[1];switch(t.type){case CONNECTED:return{connected:!0};case DISCONNECTED:return{connected:!1};default:return e}}function connected(){return{type:CONNECTED}}function disconnected(){return{type:DISCONNECTED}}Object.defineProperty(exports,"__esModule",{value:!0}),exports["default"]=reducer,exports.connected=connected,exports.disconnected=disconnected;var CONNECTED="WEBSOCKET_CONNECTED",DISCONNECTED="WEBSOCKET_DISCONNECTED",defaultState={connected:!1}; -},{}],31:[function(require,module,exports){ +},{}],32:[function(require,module,exports){ "use strict";module.exports=function(){function e(e,t){function r(){this.constructor=e}r.prototype=t.prototype,e.prototype=new r}function t(e,r,n,i){this.message=e,this.expected=r,this.found=n,this.location=i,this.name="SyntaxError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,t)}function r(e){function r(t){var r,n,i=Ot[t];if(i)return i;for(r=t-1;!Ot[r];)r--;for(i=Ot[r],i={line:i.line,column:i.column,seenCR:i.seenCR};t>r;)n=e.charAt(r),"\n"===n?(i.seenCR||i.line++,i.column=1,i.seenCR=!1):"\r"===n||"\u2028"===n||"\u2029"===n?(i.line++,i.column=1,i.seenCR=!0):(i.column++,i.seenCR=!1),r++;return Ot[t]=i,i}function n(e,t){var n=r(e),i=r(t);return{start:{offset:e,line:n.line,column:n.column},end:{offset:t,line:i.line,column:i.column}}}function i(e){Pt>Mt||(Mt>Pt&&(Pt=Mt,Qt=[]),Qt.push(e))}function s(e,r,n,i){function s(e){var t=1;for(e.sort(function(e,t){return e.descriptiont.description?1:0});t1?u.slice(0,-1).join(", ")+" or "+u[e.length-1]:u[0],i=t?'"'+r(t)+'"':"end of input","Expected "+n+" but "+i+" found."}return null!==r&&s(r),new t(null!==e?e:u(r,n),r,n,i)}function u(){var e,t,r,n;return Vt++,e=Mt,t=a(),t!==P?(r=l(),r!==P?(n=a(),n!==P?(Nt=e,t=X(r),e=t):(Mt=e,e=P)):(Mt=e,e=P)):(Mt=e,e=P),Vt--,e===P&&(t=P,0===Vt&&i(W)),e}function c(){var t,r;return Vt++,Z.test(e.charAt(Mt))?(t=e.charAt(Mt),Mt++):(t=P,0===Vt&&i($)),Vt--,t===P&&(r=P,0===Vt&&i(Y)),t}function o(){var t,r;return Vt++,te.test(e.charAt(Mt))?(t=e.charAt(Mt),Mt++):(t=P,0===Vt&&i(re)),Vt--,t===P&&(r=P,0===Vt&&i(ee)),t}function a(){var e,t;for(Vt++,e=[],t=c();t!==P;)e.push(t),t=c();return Vt--,e===P&&(t=P,0===Vt&&i(ne)),e}function l(){var t,r,n,s,u,c;return t=Mt,r=p(),r!==P?(n=a(),n!==P?(124===e.charCodeAt(Mt)?(s=ie,Mt++):(s=P,0===Vt&&i(se)),s!==P?(u=a(),u!==P?(c=l(),c!==P?(Nt=t,r=ue(r,c),t=r):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P),t===P&&(t=p()),t}function p(){var t,r,n,s,u,o;if(t=Mt,r=f(),r!==P?(n=a(),n!==P?(38===e.charCodeAt(Mt)?(s=ce,Mt++):(s=P,0===Vt&&i(oe)),s!==P?(u=a(),u!==P?(o=p(),o!==P?(Nt=t,r=ae(r,o),t=r):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P),t===P){if(t=Mt,r=f(),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=p(),s!==P?(Nt=t,r=ae(r,s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;t===P&&(t=f())}return t}function f(){var t,r,n,s;return t=Mt,33===e.charCodeAt(Mt)?(r=le,Mt++):(r=P,0===Vt&&i(pe)),r!==P?(n=a(),n!==P?(s=f(),s!==P?(Nt=t,r=fe(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P),t===P&&(t=h()),t}function h(){var t,r,n,s,u,c;return t=Mt,40===e.charCodeAt(Mt)?(r=he,Mt++):(r=P,0===Vt&&i(de)),r!==P?(n=a(),n!==P?(s=l(),s!==P?(u=a(),u!==P?(41===e.charCodeAt(Mt)?(c=ve,Mt++):(c=P,0===Vt&&i(ye)),c!==P?(Nt=t,r=ge(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P),t===P&&(t=d()),t}function d(){var e;return e=v(),e===P&&(e=g()),e}function v(){var t,r;return t=y(),t===P&&(t=Mt,e.substr(Mt,2)===Ae?(r=Ae,Mt+=2):(r=P,0===Vt&&i(xe)),r!==P&&(Nt=t,r=Re()),t=r,t===P&&(t=Mt,e.substr(Mt,2)===me?(r=me,Mt+=2):(r=P,0===Vt&&i(qe)),r!==P&&(Nt=t,r=Ce()),t=r,t===P&&(t=Mt,e.substr(Mt,2)===we?(r=we,Mt+=2):(r=P,0===Vt&&i(Ee)),r!==P&&(Nt=t,r=be()),t=r,t===P&&(t=Mt,e.substr(Mt,2)===Fe?(r=Fe,Mt+=2):(r=P,0===Vt&&i(Ue)),r!==P&&(Nt=t,r=je()),t=r)))),t}function y(){var t,r;return t=Mt,e.substr(Mt,4)===Te?(r=Te,Mt+=4):(r=P,0===Vt&&i(_e)),r!==P&&(Nt=t,r=Se()),t=r,t===P&&(t=Mt,e.substr(Mt,5)===ke?(r=ke,Mt+=5):(r=P,0===Vt&&i(Be)),r!==P&&(Nt=t,r=Ie()),t=r),t}function g(){var t,r,n,s;if(t=Mt,e.substr(Mt,2)===ze?(r=ze,Mt+=2):(r=P,0===Vt&&i(De)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=A(),s!==P?(Nt=t,r=Ge(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,2)===He?(r=He,Mt+=2):(r=P,0===Vt&&i(Je)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=Ke(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,2)===Le?(r=Le,Mt+=2):(r=P,0===Vt&&i(Me)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=Ne(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,3)===Oe?(r=Oe,Mt+=3):(r=P,0===Vt&&i(Pe)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=Qe(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,3)===Ve?(r=Ve,Mt+=3):(r=P,0===Vt&&i(We)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=Xe(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,2)===Ye?(r=Ye,Mt+=2):(r=P,0===Vt&&i(Ze)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=$e(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,2)===et?(r=et,Mt+=2):(r=P,0===Vt&&i(tt)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=rt(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,3)===nt?(r=nt,Mt+=3):(r=P,0===Vt&&i(it)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=st(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,3)===ut?(r=ut,Mt+=3):(r=P,0===Vt&&i(ct)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=ot(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,2)===at?(r=at,Mt+=2):(r=P,0===Vt&&i(lt)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=pt(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;t===P&&(t=Mt,r=x(),r!==P&&(Nt=t,r=pt(r)),t=r)}}}}}}}}}return t}function A(){var t,r,n,s;if(Vt++,t=Mt,ht.test(e.charAt(Mt))?(r=e.charAt(Mt),Mt++):(r=P,0===Vt&&i(dt)),r===P&&(r=null),r!==P){if(n=[],vt.test(e.charAt(Mt))?(s=e.charAt(Mt),Mt++):(s=P,0===Vt&&i(yt)),s!==P)for(;s!==P;)n.push(s),vt.test(e.charAt(Mt))?(s=e.charAt(Mt),Mt++):(s=P,0===Vt&&i(yt));else n=P;n!==P?(ht.test(e.charAt(Mt))?(s=e.charAt(Mt),Mt++):(s=P,0===Vt&&i(dt)),s===P&&(s=null),s!==P?(Nt=t,r=gt(n),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;return Vt--,t===P&&(r=P,0===Vt&&i(ft)),t}function x(){var t,r,n,s;if(Vt++,t=Mt,34===e.charCodeAt(Mt)?(r=xt,Mt++):(r=P,0===Vt&&i(Rt)),r!==P){for(n=[],s=R();s!==P;)n.push(s),s=R();n!==P?(34===e.charCodeAt(Mt)?(s=xt,Mt++):(s=P,0===Vt&&i(Rt)),s!==P?(Nt=t,r=mt(n),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,39===e.charCodeAt(Mt)?(r=qt,Mt++):(r=P,0===Vt&&i(Ct)),r!==P){for(n=[],s=m();s!==P;)n.push(s),s=m();n!==P?(39===e.charCodeAt(Mt)?(s=qt,Mt++):(s=P,0===Vt&&i(Ct)),s!==P?(Nt=t,r=mt(n),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P)if(t=Mt,r=Mt,Vt++,n=o(),Vt--,n===P?r=void 0:(Mt=r,r=P),r!==P){if(n=[],s=q(),s!==P)for(;s!==P;)n.push(s),s=q();else n=P;n!==P?(Nt=t,r=mt(n),t=r):(Mt=t,t=P)}else Mt=t,t=P}return Vt--,t===P&&(r=P,0===Vt&&i(At)),t}function R(){var t,r,n;return t=Mt,r=Mt,Vt++,wt.test(e.charAt(Mt))?(n=e.charAt(Mt),Mt++):(n=P,0===Vt&&i(Et)),Vt--,n===P?r=void 0:(Mt=r,r=P),r!==P?(e.length>Mt?(n=e.charAt(Mt),Mt++):(n=P,0===Vt&&i(bt)),n!==P?(Nt=t,r=Ft(n),t=r):(Mt=t,t=P)):(Mt=t,t=P),t===P&&(t=Mt,92===e.charCodeAt(Mt)?(r=Ut,Mt++):(r=P,0===Vt&&i(jt)),r!==P?(n=C(),n!==P?(Nt=t,r=Ft(n),t=r):(Mt=t,t=P)):(Mt=t,t=P)),t}function m(){var t,r,n;return t=Mt,r=Mt,Vt++,Tt.test(e.charAt(Mt))?(n=e.charAt(Mt),Mt++):(n=P,0===Vt&&i(_t)),Vt--,n===P?r=void 0:(Mt=r,r=P),r!==P?(e.length>Mt?(n=e.charAt(Mt),Mt++):(n=P,0===Vt&&i(bt)),n!==P?(Nt=t,r=Ft(n),t=r):(Mt=t,t=P)):(Mt=t,t=P),t===P&&(t=Mt,92===e.charCodeAt(Mt)?(r=Ut,Mt++):(r=P,0===Vt&&i(jt)),r!==P?(n=C(),n!==P?(Nt=t,r=Ft(n),t=r):(Mt=t,t=P)):(Mt=t,t=P)),t}function q(){var t,r,n;return t=Mt,r=Mt,Vt++,n=c(),Vt--,n===P?r=void 0:(Mt=r,r=P),r!==P?(e.length>Mt?(n=e.charAt(Mt),Mt++):(n=P,0===Vt&&i(bt)),n!==P?(Nt=t,r=Ft(n),t=r):(Mt=t,t=P)):(Mt=t,t=P),t}function C(){var t,r;return St.test(e.charAt(Mt))?(t=e.charAt(Mt),Mt++):(t=P,0===Vt&&i(kt)),t===P&&(t=Mt,110===e.charCodeAt(Mt)?(r=Bt,Mt++):(r=P,0===Vt&&i(It)),r!==P&&(Nt=t,r=zt()),t=r,t===P&&(t=Mt,114===e.charCodeAt(Mt)?(r=Dt,Mt++):(r=P,0===Vt&&i(Gt)),r!==P&&(Nt=t,r=Ht()),t=r,t===P&&(t=Mt,116===e.charCodeAt(Mt)?(r=Jt,Mt++):(r=P,0===Vt&&i(Kt)),r!==P&&(Nt=t,r=Lt()),t=r))),t}function w(e,t){function r(){return e.apply(this,arguments)||t.apply(this,arguments)}return r.desc=e.desc+" or "+t.desc,r}function E(e,t){function r(){return e.apply(this,arguments)&&t.apply(this,arguments)}return r.desc=e.desc+" and "+t.desc,r}function b(e){function t(){return!e.apply(this,arguments)}return t.desc="not "+e.desc,t}function F(e){function t(){return e.apply(this,arguments)}return t.desc="("+e.desc+")",t}function U(e){return!0}function j(e){return!1}function T(e){if(e.response)for(var t=Wt.ResponseUtils.getContentType(e.response),r=Xt.length;r--;)if(Xt[r].test(t))return!0;return!1}function _(e){function t(t){return t.response&&t.response.status_code===e}return t.desc="resp. code is "+e,t}function S(e){function t(t){return t.request&&e.test(t.request.host)}return e=new RegExp(e,"i"),t.desc="domain matches "+e,t}function k(e){return!!e.error}function B(e){function t(t){return t.request&&Wt.RequestUtils.match_header(t.request,e)||t.response&&Wt.ResponseUtils.match_header(t.response,e)}return e=new RegExp(e,"i"),t.desc="header matches "+e,t}function I(e){function t(t){return t.request&&Wt.RequestUtils.match_header(t.request,e)}return e=new RegExp(e,"i"),t.desc="req. header matches "+e,t}function z(e){function t(t){return t.response&&Wt.ResponseUtils.match_header(t.response,e)}return e=new RegExp(e,"i"),t.desc="resp. header matches "+e,t}function D(e){function t(t){return t.request&&e.test(t.request.method)}return e=new RegExp(e,"i"),t.desc="method matches "+e,t}function G(e){return e.request&&!e.response}function H(e){return!!e.response}function J(e){function t(t){return t.request&&e.test(Wt.RequestUtils.getContentType(t.request))||t.response&&e.test(Wt.ResponseUtils.getContentType(t.response))}return e=new RegExp(e,"i"),t.desc="content type matches "+e,t}function K(e){function t(t){return t.request&&e.test(Wt.RequestUtils.getContentType(t.request))}return e=new RegExp(e,"i"),t.desc="req. content type matches "+e,t}function L(e){function t(t){return t.response&&e.test(Wt.ResponseUtils.getContentType(t.response))}return e=new RegExp(e,"i"),t.desc="resp. content type matches "+e,t}function M(e){function t(t){return t.request&&e.test(Wt.RequestUtils.pretty_url(t.request))}return e=new RegExp(e,"i"),t.desc="url matches "+e,t}var N,O=arguments.length>1?arguments[1]:{},P={},Q={start:u},V=u,W={type:"other",description:"filter expression"},X=function(e){return e},Y={type:"other",description:"whitespace"},Z=/^[ \t\n\r]/,$={type:"class",value:"[ \\t\\n\\r]",description:"[ \\t\\n\\r]"},ee={type:"other",description:"control character"},te=/^[|&!()~"]/,re={type:"class",value:'[|&!()~"]',description:'[|&!()~"]'},ne={type:"other",description:"optional whitespace"},ie="|",se={type:"literal",value:"|",description:'"|"'},ue=function(e,t){return w(e,t)},ce="&",oe={type:"literal",value:"&",description:'"&"'},ae=function(e,t){return E(e,t)},le="!",pe={type:"literal",value:"!",description:'"!"'},fe=function(e){return b(e)},he="(",de={type:"literal",value:"(",description:'"("'},ve=")",ye={type:"literal",value:")",description:'")"'},ge=function(e){return F(e)},Ae="~a",xe={type:"literal",value:"~a",description:'"~a"'},Re=function(){return T},me="~e",qe={type:"literal",value:"~e",description:'"~e"'},Ce=function(){return k},we="~q",Ee={type:"literal",value:"~q",description:'"~q"'},be=function(){return G},Fe="~s",Ue={type:"literal",value:"~s",description:'"~s"'},je=function(){return H},Te="true",_e={type:"literal",value:"true",description:'"true"'},Se=function(){return U},ke="false",Be={type:"literal",value:"false",description:'"false"'},Ie=function(){return j},ze="~c",De={type:"literal",value:"~c",description:'"~c"'},Ge=function(e){return _(e)},He="~d",Je={type:"literal",value:"~d",description:'"~d"'},Ke=function(e){return S(e)},Le="~h",Me={type:"literal",value:"~h",description:'"~h"'},Ne=function(e){return B(e)},Oe="~hq",Pe={type:"literal",value:"~hq",description:'"~hq"'},Qe=function(e){return I(e)},Ve="~hs",We={type:"literal",value:"~hs",description:'"~hs"'},Xe=function(e){return z(e)},Ye="~m",Ze={type:"literal",value:"~m",description:'"~m"'},$e=function(e){return D(e)},et="~t",tt={type:"literal",value:"~t",description:'"~t"'},rt=function(e){return J(e)},nt="~tq",it={type:"literal",value:"~tq",description:'"~tq"'},st=function(e){return K(e)},ut="~ts",ct={type:"literal",value:"~ts",description:'"~ts"'},ot=function(e){return L(e)},at="~u",lt={type:"literal",value:"~u",description:'"~u"'},pt=function(e){return M(e)},ft={type:"other",description:"integer"},ht=/^['"]/,dt={type:"class",value:"['\"]",description:"['\"]"},vt=/^[0-9]/,yt={type:"class",value:"[0-9]",description:"[0-9]"},gt=function(e){return parseInt(e.join(""),10)},At={type:"other",description:"string"},xt='"',Rt={type:"literal",value:'"',description:'"\\""'},mt=function(e){return e.join("")},qt="'",Ct={type:"literal",value:"'",description:'"\'"'},wt=/^["\\]/,Et={type:"class",value:'["\\\\]',description:'["\\\\]'},bt={type:"any",description:"any character"},Ft=function(e){return e},Ut="\\",jt={type:"literal",value:"\\",description:'"\\\\"'},Tt=/^['\\]/,_t={type:"class",value:"['\\\\]",description:"['\\\\]"},St=/^['"\\]/,kt={type:"class",value:"['\"\\\\]",description:"['\"\\\\]"},Bt="n",It={type:"literal",value:"n",description:'"n"'},zt=function(){return"\n"},Dt="r",Gt={type:"literal",value:"r",description:'"r"'},Ht=function(){return"\r"},Jt="t",Kt={type:"literal",value:"t",description:'"t"'},Lt=function(){return" "},Mt=0,Nt=0,Ot=[{line:1,column:1,seenCR:!1}],Pt=0,Qt=[],Vt=0;if("startRule"in O){if(!(O.startRule in Q))throw new Error("Can't start parsing from rule \""+O.startRule+'".');V=Q[O.startRule]}var Wt=require("../flow/utils.js");U.desc="true",j.desc="false";var Xt=[new RegExp("text/javascript"),new RegExp("application/x-javascript"),new RegExp("application/javascript"),new RegExp("text/css"),new RegExp("image/.*"),new RegExp("application/x-shockwave-flash")];if(T.desc="is asset",k.desc="has error",G.desc="has no response",H.desc="has response",N=V(),N!==P&&Mt===e.length)return N;throw N!==P&&Mt=i;i++)Key[String.fromCharCode(i)]=i;var formatSize=exports.formatSize=function(e){if(0===e)return"0";for(var r=["b","kb","mb","gb","tb"],t=0;te);t++);var o;return o=e%Math.pow(1024,t)===0?0:1,(e/Math.pow(1024,t)).toFixed(o)+r[t]},formatTimeDelta=exports.formatTimeDelta=function(e){for(var r=e,t=["ms","s","min","h"],o=[1e3,60,60],a=0;Math.abs(r)>=o[a]&&a=0&&"/"===e.url[0]&&(-1===e.url.indexOf("?")?e.url+="?"+xsrf:e.url+="&"+xsrf)}),(0,_jquery2["default"])(document).ajaxError(function(e,r,t,o){if("abort"!==o){var a=r.responseText;console.error(o,a,arguments),alert(a)}}); },{"./actions.js":2,"jquery":"jquery","lodash":"lodash","react":"react"}]},{},[3]) diff --git a/web/src/js/components/EventLog.jsx b/web/src/js/components/EventLog.jsx new file mode 100644 index 00000000..3de38954 --- /dev/null +++ b/web/src/js/components/EventLog.jsx @@ -0,0 +1,41 @@ +import React, { PropTypes } from 'react' +import { bindActionCreators } from 'redux' +import { connect } from 'react-redux' +import { toggleEventLogFilter, toggleEventLogVisibility } from '../ducks/eventLog' +import { ToggleButton } from './common' +import EventList from './EventLog/EventList' + +EventLog.propTypes = { + filters: PropTypes.object.isRequired, + events: PropTypes.array.isRequired, + onToggleFilter: PropTypes.func.isRequired, + onClose: PropTypes.func.isRequired +} + +function EventLog({ filters, events, onToggleFilter, onClose }) { + return ( +
+
+ Eventlog +
+ {['debug', 'info', 'web'].map(type => ( + onToggleFilter(type)}/> + ))} + +
+
+ +
+ ) +} + +export default connect( + state => ({ + filters: state.eventLog.filter, + events: state.eventLog.filteredEvents, + }), + dispatch => bindActionCreators({ + onClose: toggleEventLogVisibility, + onToggleFilter: toggleEventLogFilter, + }, dispatch) +)(EventLog) diff --git a/web/src/js/components/EventLog/EventList.jsx b/web/src/js/components/EventLog/EventList.jsx new file mode 100644 index 00000000..d0b036e7 --- /dev/null +++ b/web/src/js/components/EventLog/EventList.jsx @@ -0,0 +1,90 @@ +import React, { Component, PropTypes } from 'react' +import ReactDOM from 'react-dom' +import shallowEqual from 'shallowequal' +import AutoScroll from '../helpers/AutoScroll' +import { calcVScroll } from '../helpers/VirtualScroll' + +class EventLogList extends Component { + + static propTypes = { + events: PropTypes.array.isRequired, + rowHeight: PropTypes.number, + } + + static defaultProps = { + rowHeight: 18, + } + + constructor(props) { + super(props) + + this.heights = {} + this.state = { vScroll: calcVScroll() } + + this.onViewportUpdate = this.onViewportUpdate.bind(this) + } + + componentDidMount() { + window.addEventListener('resize', this.onViewportUpdate) + this.onViewportUpdate() + } + + componentWillUnmount() { + window.removeEventListener('resize', this.onViewportUpdate) + } + + componentDidUpdate() { + this.onViewportUpdate() + } + + onViewportUpdate() { + const viewport = ReactDOM.findDOMNode(this) + + const vScroll = calcVScroll({ + itemCount: this.props.events.length, + rowHeight: this.props.rowHeight, + viewportTop: viewport.scrollTop, + viewportHeight: viewport.offsetHeight, + itemHeights: this.props.events.map(entry => this.heights[entry.id]), + }) + + if (!shallowEqual(this.state.vScroll, vScroll)) { + this.setState({vScroll}) + } + } + + setHeight(id, node) { + if (node && !this.heights[id]) { + const height = node.offsetHeight + if (this.heights[id] !== height) { + this.heights[id] = height + this.onViewportUpdate() + } + } + } + + render() { + const { vScroll } = this.state + const { events } = this.props + + return ( +
+                
+ {events.slice(vScroll.start, vScroll.end).map(event => ( +
this.setHeight(event.id, node)}> + + {event.message} +
+ ))} +
+
+ ) + } +} + +function LogIcon({ event }) { + const icon = { web: 'html5', debug: 'bug' }[event.level] || 'info' + return +} + +export default AutoScroll(EventLogList) diff --git a/web/src/js/components/ProxyApp.jsx b/web/src/js/components/ProxyApp.jsx index e273fc92..bab8183d 100644 --- a/web/src/js/components/ProxyApp.jsx +++ b/web/src/js/components/ProxyApp.jsx @@ -5,7 +5,7 @@ import { connect } from 'react-redux' import { Splitter } from "./common.js" import { Header, MainMenu } from "./header.js" -import EventLog from "./eventlog.js" +import EventLog from "./EventLog" import Footer from "./Footer" import { SettingsStore } from "../store/store.js" import { Key } from "../utils.js" diff --git a/web/src/js/components/eventlog.js b/web/src/js/components/eventlog.js deleted file mode 100644 index 6ada58ff..00000000 --- a/web/src/js/components/eventlog.js +++ /dev/null @@ -1,153 +0,0 @@ -import React from "react" -import ReactDOM from "react-dom" -import {connect} from 'react-redux' -import shallowEqual from "shallowequal" -import {toggleEventLogFilter, toggleEventLogVisibility} from "../ducks/eventLog" -import AutoScroll from "./helpers/AutoScroll"; -import {calcVScroll} from "./helpers/VirtualScroll" -import {ToggleButton} from "./common"; - -function LogIcon({event}) { - let icon = {web: "html5", debug: "bug"}[event.level] || "info"; - return -} - -function LogEntry({event, registerHeight}) { - return
- - {event.message} -
; -} - -class EventLogContents extends React.Component { - - static defaultProps = { - rowHeight: 18, - }; - - constructor(props) { - super(props); - - this.heights = {}; - this.state = {vScroll: calcVScroll()}; - - this.onViewportUpdate = this.onViewportUpdate.bind(this); - } - - componentDidMount() { - window.addEventListener("resize", this.onViewportUpdate); - this.onViewportUpdate(); - } - - componentWillUnmount() { - window.removeEventListener("resize", this.onViewportUpdate); - } - - componentDidUpdate() { - this.onViewportUpdate(); - } - - onViewportUpdate() { - const viewport = ReactDOM.findDOMNode(this); - - const vScroll = calcVScroll({ - itemCount: this.props.events.length, - rowHeight: this.props.rowHeight, - viewportTop: viewport.scrollTop, - viewportHeight: viewport.offsetHeight, - itemHeights: this.props.events.map(entry => this.heights[entry.id]), - }); - - if (!shallowEqual(this.state.vScroll, vScroll)) { - this.setState({vScroll}); - } - } - - setHeight(id, node) { - if (node && !this.heights[id]) { - const height = node.offsetHeight; - if (this.heights[id] !== height) { - this.heights[id] = height; - this.onViewportUpdate(); - } - } - } - - render() { - const vScroll = this.state.vScroll; - const events = this.props.events - .slice(vScroll.start, vScroll.end) - .map(event => - this.setHeight(event.id, node)} - /> - ); - - return ( -
-                
- {events} -
-
- ); - } -} - -EventLogContents = AutoScroll(EventLogContents); - - -const EventLogContentsContainer = connect( - state => ({ - events: state.eventLog.filteredEvents - }) -)(EventLogContents); - - -export const ToggleEventLog = connect( - state => ({ - checked: state.eventLog.visible - }), - dispatch => ({ - onToggle: () => dispatch(toggleEventLogVisibility()) - }) -)(ToggleButton); - - -const ToggleFilter = connect( - (state, ownProps) => ({ - checked: state.eventLog.filter[ownProps.text] - }), - (dispatch, ownProps) => ({ - onToggle: () => dispatch(toggleEventLogFilter(ownProps.text)) - }) -)(ToggleButton); - - -const EventLog = ({close}) => -
-
- 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 afd295cf..ebd77f91 100644 --- a/web/src/js/components/header.js +++ b/web/src/js/components/header.js @@ -1,5 +1,6 @@ import React from "react"; import ReactDOM from 'react-dom'; +import { bindActionCreators } from 'redux' import $ from "jquery"; import {connect} from 'react-redux' @@ -9,7 +10,16 @@ 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" +import { toggleEventLogVisibility } from '../ducks/eventLog' + +const ToggleEventLog = connect( + state => ({ + checked: state.eventLog.visible + }), + dispatch => bindActionCreators({ + onToggle: toggleEventLogVisibility, + }, dispatch) +)(ToggleButton) var FilterDocs = React.createClass({ statics: { -- cgit v1.2.3 From 81a0c45c89df2dc94f7d97c4367f0e549495e4d0 Mon Sep 17 00:00:00 2001 From: Jason Date: Thu, 9 Jun 2016 20:34:57 +0800 Subject: [web] header.js -> Header.js --- mitmproxy/web/static/app.css | 435 +- mitmproxy/web/static/app.js | 7739 +++- mitmproxy/web/static/vendor.js | 54483 ++++++++++++++++++++++++- web/src/js/components/EventLog.jsx | 2 +- web/src/js/components/Header.js | 56 + web/src/js/components/Header/FileMenu.jsx | 100 + web/src/js/components/Header/FilterDocs.jsx | 56 + web/src/js/components/Header/FilterInput.jsx | 133 + web/src/js/components/Header/MainMenu.jsx | 73 + web/src/js/components/Header/OptionMenu.jsx | 60 + web/src/js/components/Header/ViewMenu.jsx | 33 + web/src/js/components/ProxyApp.jsx | 4 +- web/src/js/components/header.js | 464 - web/src/js/components/prompt.js | 4 +- 14 files changed, 62388 insertions(+), 1254 deletions(-) create mode 100644 web/src/js/components/Header.js create mode 100644 web/src/js/components/Header/FileMenu.jsx create mode 100644 web/src/js/components/Header/FilterDocs.jsx create mode 100644 web/src/js/components/Header/FilterInput.jsx create mode 100644 web/src/js/components/Header/MainMenu.jsx create mode 100644 web/src/js/components/Header/OptionMenu.jsx create mode 100644 web/src/js/components/Header/ViewMenu.jsx delete mode 100644 web/src/js/components/header.js diff --git a/mitmproxy/web/static/app.css b/mitmproxy/web/static/app.css index bd4b57be..bc3f1a6a 100644 --- a/mitmproxy/web/static/app.css +++ b/mitmproxy/web/static/app.css @@ -1,2 +1,435 @@ -html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}.resource-icon{width:32px;height:32px}.resource-icon-css{background-image:url(images/chrome-devtools/resourceCSSIcon.png)}.resource-icon-document{background-image:url(images/chrome-devtools/resourceDocumentIcon.png)}.resource-icon-js{background-image:url(images/chrome-devtools/resourceJSIcon.png)}.resource-icon-plain{background-image:url(images/chrome-devtools/resourcePlainIcon.png)}.resource-icon-executable{background-image:url(images/resourceExecutableIcon.png)}.resource-icon-flash{background-image:url(images/resourceFlashIcon.png)}.resource-icon-image{background-image:url(images/resourceImageIcon.png)}.resource-icon-java{background-image:url(images/resourceJavaIcon.png)}.resource-icon-not-modified{background-image:url(images/resourceNotModifiedIcon.png)}.resource-icon-redirect{background-image:url(images/resourceRedirectIcon.png)}#container,#mitmproxy,body,html{height:100%;margin:0;overflow:hidden}#container{display:flex;flex-direction:column;outline:0}#container>.eventlog,#container>footer,#container>header,.eventlog{flex:0 0 auto}.main-view{flex:1 1 auto;height:0;display:flex;flex-direction:row}.main-view.vertical{flex-direction:column}.main-view .flow-detail,.main-view .flow-table{flex:1 1 auto}.splitter{flex:0 0 1px;background-color:#aaa;position:relative}.splitter>div{position:absolute}.splitter.splitter-x{cursor:col-resize}.splitter.splitter-x>div{margin-left:-1px;width:4px;height:100%}.splitter.splitter-y{cursor:row-resize}.eventlog .label,.flow-table tr,.prompt-content .option{cursor:pointer}.splitter.splitter-y>div{margin-top:-1px;height:4px;width:100%}.nav-tabs{border-bottom:solid #a6a6a6 1px}.nav-tabs a{display:inline-block;border:1px solid transparent;text-decoration:none}.nav-tabs a.active{background-color:#fff;border-color:#a6a6a6 #a6a6a6 #fff}.nav-tabs a.special{color:#fff;background-color:#396cad;border-bottom-color:#396cad}.nav-tabs a.special:hover{background-color:#5386c6}.nav-tabs-lg a{padding:3px 14px;margin:0 2px -1px}.nav-tabs-sm a{padding:0 7px;margin:2px 2px -1px}.nav-tabs-sm a.nav-action{float:right;padding:0;margin:1px 0 0}header{padding-top:.5em;background-color:#fff}header .menu{padding:10px;border-bottom:solid #a6a6a6 1px}.menu-row{margin-left:-2px;margin-right:-3px}.filter-input{position:relative;min-height:1px;padding-left:2.5px;padding-right:2.5px;margin-bottom:5px}@media (min-width:768px){.filter-input{float:left;width:25%}}.filter-input .popover{top:27px;display:block;max-width:none;opacity:.9}.filter-input .popover .popover-content{max-height:500px;overflow-y:auto}.flow-table{width:100%;overflow-y:scroll;overflow-x:hidden}.flow-table table{width:100%;table-layout:fixed}.flow-table thead{background-color:#F2F2F2;line-height:23px}.flow-table th{font-weight:400;box-shadow:0 1px 0 #a6a6a6;position:relative!important;padding-left:1px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.prompt-content,footer{box-shadow:0 -1px 3px #d3d3d3}.flow-table th.sort-asc,.flow-table th.sort-desc{background-color:#fafafa}.flow-table th.sort-asc:after,.flow-table th.sort-desc:after{font:normal normal normal 14px/1 FontAwesome;position:absolute;right:3px;top:3px;padding:2px;background-color:rgba(250,250,250,.8)}.flow-detail .first-line,.flow-detail table{font-family:Menlo,Monaco,Consolas,"Courier New",monospace;word-break:break-all}.prompt-content,.prompt-dialog{position:fixed;bottom:0;left:0;right:0}.flow-table th.sort-asc:after{content:"\f0de"}.flow-table th.sort-desc:after{content:"\f0dd"}.flow-table tr:nth-child(even){background-color:rgba(0,0,0,.05)}.flow-table tr.selected{background-color:rgba(193,215,235,.5)!important}.flow-table tr.highlighted{background-color:rgba(255,204,0,.4)}.flow-table tr.highlighted:nth-child(even){background-color:rgba(255,204,0,.5)}.flow-table td{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.flow-table tr.intercepted.has-response .col-size,.flow-table tr.intercepted.has-response .col-status,.flow-table tr.intercepted.has-response .col-time,.flow-table tr.intercepted:not(.has-response) .col-method,.flow-table tr.intercepted:not(.has-response) .col-path{color:#ff8000}.flow-table .fa{line-height:inherit}.flow-table .fa.pull-right{margin-left:0}.flow-table .col-tls{width:10px}.flow-table .col-tls-https{background-color:rgba(0,185,0,.5)}.flow-table .col-icon{width:32px}.flow-table .col-path .fa-repeat{color:green}.flow-table .col-path .fa-pause{color:#ff8000}.flow-table .col-method{width:60px}.flow-table .col-status{width:50px}.flow-table .col-size{width:70px}.flow-table .col-time{width:50px}.flow-table td.col-size,.flow-table td.col-time{text-align:right}.flow-detail{width:100%;overflow-x:auto;overflow-y:scroll}.flow-detail nav{background-color:#F2F2F2}.flow-detail section{padding:5px 12px}.flow-detail .first-line{background-color:#428bca;color:#fff;margin:0 -8px;padding:4px 8px;border-radius:5px;max-height:100px;overflow-y:auto}.flow-detail .request-line{margin-bottom:2px}.flow-detail hr{margin:0 0 5px}.inline-input{margin:0 -5px;padding:0 5px}.inline-input[contenteditable]{background-color:rgba(255,255,255,.2)}.inline-input[contenteditable].has-warning{color:#ffb8b8}.view-options{margin-top:10px}.flow-detail table{width:100%;table-layout:fixed}.flow-detail table tr:not(:first-child){border-top:1px solid #f7f7f7}.flow-detail table td{vertical-align:top}.connection-table td:first-child{width:50%;padding-right:1em}.header-table td{line-height:1.3em}.header-table .header-name{width:33%;padding-right:1em}.connection-table td,.timing-table td{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.flowview-image{text-align:center}.flowview-image img{max-width:100%;max-height:100%}.prompt-dialog{top:0;z-index:100;background-color:rgba(0,0,0,.1)}.prompt-content{height:25px;padding:2px 5px;background-color:#fff}.prompt-content .option:not(:last-child)::after{content:", "}.eventlog{height:200px;display:flex;flex-direction:column}.eventlog>div{background-color:#F2F2F2;padding:0 5px;flex:0 0 auto}.eventlog>pre{flex:1 1 auto;margin:0;border-radius:0;overflow-x:auto;overflow-y:scroll;background-color:#fcfcfc}.eventlog .fa-close{cursor:pointer;float:right;color:grey;padding:3px 0 3px 10px}.eventlog .fa-close:hover{color:#000}.eventlog .btn-toggle{margin-top:-2px;margin-left:3px;padding:2px;font-size:10px;line-height:10px;border-radius:2px}.eventlog .label{vertical-align:middle;display:inline-block;margin-top:-2px;margin-left:3px}footer{padding:0 10px 3px}footer .label{margin-right:3px} +html { + box-sizing: border-box; +} +*, +*:before, +*:after { + box-sizing: inherit; +} +.resource-icon { + width: 32px; + height: 32px; +} +.resource-icon-css { + background-image: url(images/chrome-devtools/resourceCSSIcon.png); +} +.resource-icon-document { + background-image: url(images/chrome-devtools/resourceDocumentIcon.png); +} +.resource-icon-js { + background-image: url(images/chrome-devtools/resourceJSIcon.png); +} +.resource-icon-plain { + background-image: url(images/chrome-devtools/resourcePlainIcon.png); +} +.resource-icon-executable { + background-image: url(images/resourceExecutableIcon.png); +} +.resource-icon-flash { + background-image: url(images/resourceFlashIcon.png); +} +.resource-icon-image { + background-image: url(images/resourceImageIcon.png); +} +.resource-icon-java { + background-image: url(images/resourceJavaIcon.png); +} +.resource-icon-not-modified { + background-image: url(images/resourceNotModifiedIcon.png); +} +.resource-icon-redirect { + background-image: url(images/resourceRedirectIcon.png); +} +html, +body, +#container, +#mitmproxy { + height: 100%; + margin: 0; + overflow: hidden; +} +#container { + display: flex; + flex-direction: column; + outline: none; +} +#container > header, +#container > footer, +#container > .eventlog { + flex: 0 0 auto; +} +.main-view { + flex: 1 1 auto; + height: 0; + display: flex; + flex-direction: row; +} +.main-view.vertical { + flex-direction: column; +} +.main-view .flow-detail, +.main-view .flow-table { + flex: 1 1 auto; +} +.splitter { + flex: 0 0 1px; + background-color: #aaa; + position: relative; +} +.splitter > div { + position: absolute; +} +.splitter.splitter-x { + cursor: col-resize; +} +.splitter.splitter-x > div { + margin-left: -1px; + width: 4px; + height: 100%; +} +.splitter.splitter-y { + cursor: row-resize; +} +.splitter.splitter-y > div { + margin-top: -1px; + height: 4px; + width: 100%; +} +.nav-tabs { + border-bottom: solid #a6a6a6 1px; +} +.nav-tabs a { + display: inline-block; + border: solid transparent 1px; + text-decoration: none; +} +.nav-tabs a.active { + background-color: white; + border-color: #a6a6a6; + border-bottom-color: white; +} +.nav-tabs a.special { + color: white; + background-color: #396cad; + border-bottom-color: #396cad; +} +.nav-tabs a.special:hover { + background-color: #5386c6; +} +.nav-tabs-lg a { + padding: 3px 14px; + margin: 0 2px -1px; +} +.nav-tabs-sm a { + padding: 0px 7px; + margin: 2px 2px -1px; +} +.nav-tabs-sm a.nav-action { + float: right; + padding: 0; + margin: 1px 0 0px; +} +header { + padding-top: 0.5em; + background-color: white; +} +header .menu { + padding: 10px; + border-bottom: solid #a6a6a6 1px; +} +.menu-row { + margin-left: -2px; + margin-right: -3px; +} +.filter-input { + position: relative; + min-height: 1px; + padding-left: 2.5px; + padding-right: 2.5px; + margin-bottom: 5px; +} +@media (min-width: 768px) { + .filter-input { + float: left; + width: 25%; + } +} +.filter-input .popover { + top: 27px; + display: block; + max-width: none; + opacity: 0.9; +} +.filter-input .popover .popover-content { + max-height: 500px; + overflow-y: auto; +} +.flow-table { + width: 100%; + overflow-y: scroll; + overflow-x: hidden; +} +.flow-table table { + width: 100%; + table-layout: fixed; +} +.flow-table thead { + background-color: #F2F2F2; + line-height: 23px; +} +.flow-table th { + font-weight: normal; + box-shadow: 0 1px 0 #a6a6a6; + position: relative !important; + padding-left: 1px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.flow-table th.sort-asc, +.flow-table th.sort-desc { + background-color: #fafafa; +} +.flow-table th.sort-asc:after, +.flow-table th.sort-desc:after { + font: normal normal normal 14px/1 FontAwesome; + position: absolute; + right: 3px; + top: 3px; + padding: 2px; + background-color: rgba(250, 250, 250, 0.8); +} +.flow-table th.sort-asc:after { + content: "\f0de"; +} +.flow-table th.sort-desc:after { + content: "\f0dd"; +} +.flow-table tr { + cursor: pointer; +} +.flow-table tr:nth-child(even) { + background-color: rgba(0, 0, 0, 0.05); +} +.flow-table tr.selected { + background-color: rgba(193, 215, 235, 0.5) !important; +} +.flow-table tr.highlighted { + background-color: rgba(255, 204, 0, 0.4); +} +.flow-table tr.highlighted:nth-child(even) { + background-color: rgba(255, 204, 0, 0.5); +} +.flow-table td { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.flow-table tr.intercepted:not(.has-response) .col-path, +.flow-table tr.intercepted:not(.has-response) .col-method { + color: #ff8000; +} +.flow-table tr.intercepted.has-response .col-status, +.flow-table tr.intercepted.has-response .col-size, +.flow-table tr.intercepted.has-response .col-time { + color: #ff8000; +} +.flow-table .fa { + line-height: inherit; +} +.flow-table .fa.pull-right { + margin-left: 0; +} +.flow-table .col-tls { + width: 10px; +} +.flow-table .col-tls-https { + background-color: rgba(0, 185, 0, 0.5); +} +.flow-table .col-icon { + width: 32px; +} +.flow-table .col-path .fa-repeat { + color: green; +} +.flow-table .col-path .fa-pause { + color: #ff8000; +} +.flow-table .col-method { + width: 60px; +} +.flow-table .col-status { + width: 50px; +} +.flow-table .col-size { + width: 70px; +} +.flow-table .col-time { + width: 50px; +} +.flow-table td.col-time, +.flow-table td.col-size { + text-align: right; +} +.flow-detail { + width: 100%; + overflow-x: auto; + overflow-y: scroll; + /*.request .response-line, + .response .request-line { + opacity: 0.7; + }*/ +} +.flow-detail nav { + background-color: #F2F2F2; +} +.flow-detail section { + padding: 5px 12px; +} +.flow-detail .first-line { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + background-color: #428bca; + color: white; + margin: 0 -8px; + padding: 4px 8px; + border-radius: 5px; + word-break: break-all; + max-height: 100px; + overflow-y: auto; +} +.flow-detail .request-line { + margin-bottom: 2px; +} +.flow-detail hr { + margin: 0 0 5px; +} +.inline-input { + margin: 0 -5px; + padding: 0 5px; +} +.inline-input[contenteditable] { + background-color: rgba(255, 255, 255, 0.2); +} +.inline-input[contenteditable].has-warning { + color: #ffb8b8; +} +.view-options { + margin-top: 10px; +} +.flow-detail table { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + width: 100%; + table-layout: fixed; + word-break: break-all; +} +.flow-detail table tr:not(:first-child) { + border-top: 1px solid #f7f7f7; +} +.flow-detail table td { + vertical-align: top; +} +.connection-table td:first-child { + width: 50%; + padding-right: 1em; +} +.header-table td { + line-height: 1.3em; +} +.header-table .header-name { + width: 33%; + padding-right: 1em; +} +.connection-table td, +.timing-table td { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.flowview-image { + text-align: center; +} +.flowview-image img { + max-width: 100%; + max-height: 100%; +} +.prompt-dialog { + top: 0; + bottom: 0; + left: 0; + right: 0; + position: fixed; + z-index: 100; + background-color: rgba(0, 0, 0, 0.1); +} +.prompt-content { + position: fixed; + bottom: 0; + left: 0; + right: 0; + height: 25px; + padding: 2px 5px; + background-color: white; + box-shadow: 0 -1px 3px lightgray; +} +.prompt-content .option { + cursor: pointer; +} +.prompt-content .option:not(:last-child)::after { + content: ", "; +} +.eventlog { + height: 200px; + flex: 0 0 auto; + display: flex; + flex-direction: column; +} +.eventlog > div { + background-color: #F2F2F2; + padding: 0 5px; + flex: 0 0 auto; +} +.eventlog > pre { + flex: 1 1 auto; + margin: 0; + border-radius: 0; + overflow-x: auto; + overflow-y: scroll; + background-color: #fcfcfc; +} +.eventlog .fa-close { + cursor: pointer; + float: right; + color: grey; + padding: 3px 0; + padding-left: 10px; +} +.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; + display: inline-block; + margin-top: -2px; + margin-left: 3px; +} +footer { + box-shadow: 0 -1px 3px lightgray; + padding: 0px 10px 3px; +} +footer .label { + margin-right: 3px; +} + /*# sourceMappingURL=app.css.map */ diff --git a/mitmproxy/web/static/app.js b/mitmproxy/web/static/app.js index 7ac7aab0..191d2052 100644 --- a/mitmproxy/web/static/app.js +++ b/mitmproxy/web/static/app.js @@ -1,107 +1,7712 @@ (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;oe||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},EventEmitter.prototype.emit=function(e){var t,i,n,s,r,o;if(this._events||(this._events={}),"error"===e&&(!this._events.error||isObject(this._events.error)&&!this._events.error.length)){if(t=arguments[1],t instanceof Error)throw t;throw TypeError('Uncaught, unspecified "error" event.')}if(i=this._events[e],isUndefined(i))return!1;if(isFunction(i))switch(arguments.length){case 1:i.call(this);break;case 2:i.call(this,arguments[1]);break;case 3:i.call(this,arguments[1],arguments[2]);break;default:s=Array.prototype.slice.call(arguments,1),i.apply(this,s)}else if(isObject(i))for(s=Array.prototype.slice.call(arguments,1),o=i.slice(),n=o.length,r=0;n>r;r++)o[r].apply(this,s);return!0},EventEmitter.prototype.addListener=function(e,t){var i;if(!isFunction(t))throw TypeError("listener must be a function");return this._events||(this._events={}),this._events.newListener&&this.emit("newListener",e,isFunction(t.listener)?t.listener:t),this._events[e]?isObject(this._events[e])?this._events[e].push(t):this._events[e]=[this._events[e],t]:this._events[e]=t,isObject(this._events[e])&&!this._events[e].warned&&(i=isUndefined(this._maxListeners)?EventEmitter.defaultMaxListeners:this._maxListeners,i&&i>0&&this._events[e].length>i&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace())),this},EventEmitter.prototype.on=EventEmitter.prototype.addListener,EventEmitter.prototype.once=function(e,t){function i(){this.removeListener(e,i),n||(n=!0,t.apply(this,arguments))}if(!isFunction(t))throw TypeError("listener must be a function");var n=!1;return i.listener=t,this.on(e,i),this},EventEmitter.prototype.removeListener=function(e,t){var i,n,s,r;if(!isFunction(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(i=this._events[e],s=i.length,n=-1,i===t||isFunction(i.listener)&&i.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(isObject(i)){for(r=s;r-- >0;)if(i[r]===t||i[r].listener&&i[r].listener===t){n=r;break}if(0>n)return this;1===i.length?(i.length=0,delete this._events[e]):i.splice(n,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},EventEmitter.prototype.removeAllListeners=function(e){var t,i;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(i=this._events[e],isFunction(i))this.removeListener(e,i);else if(i)for(;i.length;)this.removeListener(e,i[i.length-1]);return delete this._events[e],this},EventEmitter.prototype.listeners=function(e){var t;return t=this._events&&this._events[e]?isFunction(this._events[e])?[this._events[e]]:this._events[e].slice():[]},EventEmitter.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(isFunction(t))return 1;if(t)return t.length}return 0},EventEmitter.listenerCount=function(e,t){return e.listenerCount(t)}; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +function EventEmitter() { + this._events = this._events || {}; + this._maxListeners = this._maxListeners || undefined; +} +module.exports = EventEmitter; + +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; + +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._maxListeners = undefined; + +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +EventEmitter.defaultMaxListeners = 10; + +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function(n) { + if (!isNumber(n) || n < 0 || isNaN(n)) + throw TypeError('n must be a positive number'); + this._maxListeners = n; + return this; +}; + +EventEmitter.prototype.emit = function(type) { + var er, handler, len, args, i, listeners; + + if (!this._events) + this._events = {}; + + // If there is no 'error' event listener then throw. + if (type === 'error') { + if (!this._events.error || + (isObject(this._events.error) && !this._events.error.length)) { + er = arguments[1]; + if (er instanceof Error) { + throw er; // Unhandled 'error' event + } + throw TypeError('Uncaught, unspecified "error" event.'); + } + } + + handler = this._events[type]; + + if (isUndefined(handler)) + return false; + + if (isFunction(handler)) { + switch (arguments.length) { + // fast cases + case 1: + handler.call(this); + break; + case 2: + handler.call(this, arguments[1]); + break; + case 3: + handler.call(this, arguments[1], arguments[2]); + break; + // slower + default: + args = Array.prototype.slice.call(arguments, 1); + handler.apply(this, args); + } + } else if (isObject(handler)) { + args = Array.prototype.slice.call(arguments, 1); + listeners = handler.slice(); + len = listeners.length; + for (i = 0; i < len; i++) + listeners[i].apply(this, args); + } + + return true; +}; + +EventEmitter.prototype.addListener = function(type, listener) { + var m; + + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + if (!this._events) + this._events = {}; + + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (this._events.newListener) + this.emit('newListener', type, + isFunction(listener.listener) ? + listener.listener : listener); + + if (!this._events[type]) + // Optimize the case of one listener. Don't need the extra array object. + this._events[type] = listener; + else if (isObject(this._events[type])) + // If we've already got an array, just append. + this._events[type].push(listener); + else + // Adding the second element, need to change to array. + this._events[type] = [this._events[type], listener]; + + // Check for listener leak + if (isObject(this._events[type]) && !this._events[type].warned) { + if (!isUndefined(this._maxListeners)) { + m = this._maxListeners; + } else { + m = EventEmitter.defaultMaxListeners; + } + + if (m && m > 0 && this._events[type].length > m) { + this._events[type].warned = true; + console.error('(node) warning: possible EventEmitter memory ' + + 'leak detected. %d listeners added. ' + + 'Use emitter.setMaxListeners() to increase limit.', + this._events[type].length); + if (typeof console.trace === 'function') { + // not supported in IE 10 + console.trace(); + } + } + } + + return this; +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.once = function(type, listener) { + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + var fired = false; + + function g() { + this.removeListener(type, g); + + if (!fired) { + fired = true; + listener.apply(this, arguments); + } + } + + g.listener = listener; + this.on(type, g); + + return this; +}; + +// emits a 'removeListener' event iff the listener was removed +EventEmitter.prototype.removeListener = function(type, listener) { + var list, position, length, i; + + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + if (!this._events || !this._events[type]) + return this; + + list = this._events[type]; + length = list.length; + position = -1; + + if (list === listener || + (isFunction(list.listener) && list.listener === listener)) { + delete this._events[type]; + if (this._events.removeListener) + this.emit('removeListener', type, listener); + + } else if (isObject(list)) { + for (i = length; i-- > 0;) { + if (list[i] === listener || + (list[i].listener && list[i].listener === listener)) { + position = i; + break; + } + } + + if (position < 0) + return this; + + if (list.length === 1) { + list.length = 0; + delete this._events[type]; + } else { + list.splice(position, 1); + } + + if (this._events.removeListener) + this.emit('removeListener', type, listener); + } + + return this; +}; + +EventEmitter.prototype.removeAllListeners = function(type) { + var key, listeners; + + if (!this._events) + return this; + + // not listening for removeListener, no need to emit + if (!this._events.removeListener) { + if (arguments.length === 0) + this._events = {}; + else if (this._events[type]) + delete this._events[type]; + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + for (key in this._events) { + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = {}; + return this; + } + + listeners = this._events[type]; + + if (isFunction(listeners)) { + this.removeListener(type, listeners); + } else if (listeners) { + // LIFO order + while (listeners.length) + this.removeListener(type, listeners[listeners.length - 1]); + } + delete this._events[type]; + + return this; +}; + +EventEmitter.prototype.listeners = function(type) { + var ret; + if (!this._events || !this._events[type]) + ret = []; + else if (isFunction(this._events[type])) + ret = [this._events[type]]; + else + ret = this._events[type].slice(); + return ret; +}; + +EventEmitter.prototype.listenerCount = function(type) { + if (this._events) { + var evlistener = this._events[type]; + + if (isFunction(evlistener)) + return 1; + else if (evlistener) + return evlistener.length; + } + return 0; +}; + +EventEmitter.listenerCount = function(emitter, type) { + return emitter.listenerCount(type); +}; + +function isFunction(arg) { + return typeof arg === 'function'; +} + +function isNumber(arg) { + return typeof arg === 'number'; +} + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} + +function isUndefined(arg) { + return arg === void 0; +} },{}],2:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.Query=exports.FlowActions=exports.SettingsActions=exports.ConnectionActions=exports.StoreCmds=exports.ActionTypes=void 0;var _jquery=require("jquery"),_jquery2=_interopRequireDefault(_jquery),_dispatcher=require("./dispatcher.js"),_utils=require("./utils.js"),ActionTypes=exports.ActionTypes={CONNECTION_OPEN:"connection_open",CONNECTION_CLOSE:"connection_close",CONNECTION_ERROR:"connection_error",SETTINGS_STORE:"settings",EVENT_STORE:"events",FLOW_STORE:"flows"},StoreCmds=exports.StoreCmds={ADD:"add",UPDATE:"update",REMOVE:"remove",RESET:"reset"},ConnectionActions=exports.ConnectionActions={open:function(){_dispatcher.AppDispatcher.dispatchViewAction({type:ActionTypes.CONNECTION_OPEN})},close:function(){_dispatcher.AppDispatcher.dispatchViewAction({type:ActionTypes.CONNECTION_CLOSE})},error:function(){_dispatcher.AppDispatcher.dispatchViewAction({type:ActionTypes.CONNECTION_ERROR})}},SettingsActions=exports.SettingsActions={update:function(e){_jquery2["default"].ajax({type:"PUT",url:"/settings",contentType:"application/json",data:JSON.stringify(e)})}},FlowActions=exports.FlowActions={accept:function(e){_jquery2["default"].post("/flows/"+e.id+"/accept")},accept_all:function(){_jquery2["default"].post("/flows/accept")},"delete":function(e){_jquery2["default"].ajax({type:"DELETE",url:"/flows/"+e.id})},duplicate:function(e){_jquery2["default"].post("/flows/"+e.id+"/duplicate")},replay:function(e){_jquery2["default"].post("/flows/"+e.id+"/replay")},revert:function(e){_jquery2["default"].post("/flows/"+e.id+"/revert")},update:function(e,t){_jquery2["default"].ajax({type:"PUT",url:"/flows/"+e.id,contentType:"application/json",data:JSON.stringify(t)})},clear:function(){_jquery2["default"].post("/clear")},download:function(){return window.location="/flows/dump"},upload:function(e){var t=new FormData;t.append("file",e),(0,_utils.fetchApi)("/flows/dump",{method:"post",body:t})}},Query=exports.Query={SEARCH:"s",HIGHLIGHT:"h",SHOW_EVENTLOG:"e"}; +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.Query = exports.FlowActions = exports.SettingsActions = exports.ConnectionActions = exports.StoreCmds = exports.ActionTypes = undefined; + +var _jquery = require("jquery"); + +var _jquery2 = _interopRequireDefault(_jquery); + +var _dispatcher = require("./dispatcher.js"); + +var _utils = require("./utils.js"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var ActionTypes = exports.ActionTypes = { + // Connection + CONNECTION_OPEN: "connection_open", + CONNECTION_CLOSE: "connection_close", + CONNECTION_ERROR: "connection_error", + + // Stores + SETTINGS_STORE: "settings", + EVENT_STORE: "events", + FLOW_STORE: "flows" +}; + +var StoreCmds = exports.StoreCmds = { + ADD: "add", + UPDATE: "update", + REMOVE: "remove", + RESET: "reset" +}; + +var ConnectionActions = exports.ConnectionActions = { + open: function open() { + _dispatcher.AppDispatcher.dispatchViewAction({ + type: ActionTypes.CONNECTION_OPEN + }); + }, + close: function close() { + _dispatcher.AppDispatcher.dispatchViewAction({ + type: ActionTypes.CONNECTION_CLOSE + }); + }, + error: function error() { + _dispatcher.AppDispatcher.dispatchViewAction({ + type: ActionTypes.CONNECTION_ERROR + }); + } +}; + +var SettingsActions = exports.SettingsActions = { + update: function update(settings) { + + _jquery2.default.ajax({ + type: "PUT", + url: "/settings", + contentType: 'application/json', + 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 + }); + */ + } +}; + +var FlowActions = exports.FlowActions = { + accept: function accept(flow) { + _jquery2.default.post("/flows/" + flow.id + "/accept"); + }, + accept_all: function accept_all() { + _jquery2.default.post("/flows/accept"); + }, + "delete": function _delete(flow) { + _jquery2.default.ajax({ + type: "DELETE", + url: "/flows/" + flow.id + }); + }, + duplicate: function duplicate(flow) { + _jquery2.default.post("/flows/" + flow.id + "/duplicate"); + }, + replay: function replay(flow) { + _jquery2.default.post("/flows/" + flow.id + "/replay"); + }, + revert: function revert(flow) { + _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 + }); + */ + _jquery2.default.ajax({ + type: "PUT", + url: "/flows/" + flow.id, + contentType: 'application/json', + data: JSON.stringify(nextProps) + }); + }, + clear: function clear() { + _jquery2.default.post("/clear"); + }, + download: function download() { + return window.location = "/flows/dump"; + }, + + upload: function upload(file) { + var data = new FormData(); + data.append('file', file); + (0, _utils.fetchApi)("/flows/dump", { + method: 'post', + body: data + }); + } +}; + +var Query = exports.Query = { + SEARCH: "s", + HIGHLIGHT: "h", + SHOW_EVENTLOG: "e" +}; + +},{"./dispatcher.js":31,"./utils.js":41,"jquery":"jquery"}],3:[function(require,module,exports){ +'use strict'; + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _reactDom = require('react-dom'); + +var _redux = require('redux'); + +var _reactRedux = require('react-redux'); + +var _reduxLogger = require('redux-logger'); + +var _reduxLogger2 = _interopRequireDefault(_reduxLogger); + +var _reduxThunk = require('redux-thunk'); + +var _reduxThunk2 = _interopRequireDefault(_reduxThunk); + +var _reactRouter = require('react-router'); + +var _connection = require('./connection'); + +var _connection2 = _interopRequireDefault(_connection); + +var _ProxyApp = require('./components/ProxyApp'); + +var _ProxyApp2 = _interopRequireDefault(_ProxyApp); + +var _MainView = require('./components/MainView'); + +var _MainView2 = _interopRequireDefault(_MainView); + +var _index = require('./ducks/index'); + +var _index2 = _interopRequireDefault(_index); + +var _eventLog = require('./ducks/eventLog'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// logger must be last +var store = (0, _redux.createStore)(_index2.default, (0, _redux.applyMiddleware)(_reduxThunk2.default, (0, _reduxLogger2.default)())); + +window.addEventListener('error', function (msg) { + store.dispatch((0, _eventLog.addLogEntry)(msg)); +}); + +// @todo remove this +document.addEventListener('DOMContentLoaded', function () { + window.ws = new _connection2.default("/updates", store.dispatch); + + (0, _reactDom.render)(_react2.default.createElement( + _reactRedux.Provider, + { store: store }, + _react2.default.createElement( + _reactRouter.Router, + { history: _reactRouter.hashHistory }, + _react2.default.createElement(_reactRouter.Redirect, { from: '/', to: '/flows' }), + _react2.default.createElement( + _reactRouter.Route, + { path: '/', component: _ProxyApp2.default }, + _react2.default.createElement(_reactRouter.Route, { path: 'flows', component: _MainView2.default }), + _react2.default.createElement(_reactRouter.Route, { path: 'flows/:flowId/:detailTab', component: _MainView2.default }) + ) + ) + ), document.getElementById("mitmproxy")); +}); + +},{"./components/MainView":18,"./components/ProxyApp":19,"./connection":30,"./ducks/eventLog":32,"./ducks/index":34,"react":"react","react-dom":"react-dom","react-redux":"react-redux","react-router":"react-router","redux":"redux","redux-logger":"redux-logger","redux-thunk":"redux-thunk"}],4:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _redux = require('redux'); + +var _reactRedux = require('react-redux'); + +var _eventLog = require('../ducks/eventLog'); + +var _common = require('./common'); + +var _EventList = require('./EventLog/EventList'); + +var _EventList2 = _interopRequireDefault(_EventList); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +EventLog.propTypes = { + filters: _react.PropTypes.object.isRequired, + events: _react.PropTypes.array.isRequired, + onToggleFilter: _react.PropTypes.func.isRequired, + onClose: _react.PropTypes.func.isRequired +}; + +function EventLog(_ref) { + var filters = _ref.filters; + var events = _ref.events; + var onToggleFilter = _ref.onToggleFilter; + var onClose = _ref.onClose; + + return _react2.default.createElement( + 'div', + { className: 'eventlog' }, + _react2.default.createElement( + 'div', + null, + 'Eventlog', + _react2.default.createElement( + 'div', + { className: 'pull-right' }, + ['debug', 'info', 'web'].map(function (type) { + return _react2.default.createElement(_common.ToggleButton, { key: type, text: type, checked: filters[type], onToggle: function onToggle() { + return onToggleFilter(type); + } }); + }), + _react2.default.createElement('i', { onClick: onClose, className: 'fa fa-close' }) + ) + ), + _react2.default.createElement(_EventList2.default, { events: events }) + ); +} + +exports.default = (0, _reactRedux.connect)(function (state) { + return { + filters: state.eventLog.filter, + events: state.eventLog.filteredEvents + }; +}, function (dispatch) { + return (0, _redux.bindActionCreators)({ + onClose: _eventLog.toggleEventLogVisibility, + onToggleFilter: _eventLog.toggleEventLogFilter + }, dispatch); +})(EventLog); + +},{"../ducks/eventLog":32,"./EventLog/EventList":5,"./common":20,"react":"react","react-redux":"react-redux","redux":"redux"}],5:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +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; }; }(); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _reactDom = require('react-dom'); + +var _reactDom2 = _interopRequireDefault(_reactDom); + +var _shallowequal = require('shallowequal'); + +var _shallowequal2 = _interopRequireDefault(_shallowequal); + +var _AutoScroll = require('../helpers/AutoScroll'); + +var _AutoScroll2 = _interopRequireDefault(_AutoScroll); + +var _VirtualScroll = require('../helpers/VirtualScroll'); + +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 EventLogList = function (_Component) { + _inherits(EventLogList, _Component); + + function EventLogList(props) { + _classCallCheck(this, EventLogList); + + var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(EventLogList).call(this, props)); + + _this.heights = {}; + _this.state = { vScroll: (0, _VirtualScroll.calcVScroll)() }; -},{"./dispatcher.js":25,"./utils.js":35,"jquery":"jquery"}],3:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}var _react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_redux=require("redux"),_reactRedux=require("react-redux"),_reduxLogger=require("redux-logger"),_reduxLogger2=_interopRequireDefault(_reduxLogger),_reduxThunk=require("redux-thunk"),_reduxThunk2=_interopRequireDefault(_reduxThunk),_reactRouter=require("react-router"),_connection=require("./connection"),_connection2=_interopRequireDefault(_connection),_ProxyApp=require("./components/ProxyApp"),_ProxyApp2=_interopRequireDefault(_ProxyApp),_MainView=require("./components/MainView"),_MainView2=_interopRequireDefault(_MainView),_index=require("./ducks/index"),_index2=_interopRequireDefault(_index),_eventLog=require("./ducks/eventLog"),store=(0,_redux.createStore)(_index2["default"],(0,_redux.applyMiddleware)(_reduxThunk2["default"],(0,_reduxLogger2["default"])()));window.addEventListener("error",function(e){store.dispatch((0,_eventLog.addLogEntry)(e))}),document.addEventListener("DOMContentLoaded",function(){window.ws=new _connection2["default"]("/updates",store.dispatch),(0,_reactDom.render)(_react2["default"].createElement(_reactRedux.Provider,{store:store},_react2["default"].createElement(_reactRouter.Router,{history:_reactRouter.hashHistory},_react2["default"].createElement(_reactRouter.Redirect,{from:"/",to:"/flows"}),_react2["default"].createElement(_reactRouter.Route,{path:"/",component:_ProxyApp2["default"]},_react2["default"].createElement(_reactRouter.Route,{path:"flows",component:_MainView2["default"]}),_react2["default"].createElement(_reactRouter.Route,{path:"flows/:flowId/:detailTab",component:_MainView2["default"]})))),document.getElementById("mitmproxy"))}); + _this.onViewportUpdate = _this.onViewportUpdate.bind(_this); + return _this; + } -},{"./components/MainView":11,"./components/ProxyApp":12,"./connection":24,"./ducks/eventLog":26,"./ducks/index":28,"react":"react","react-dom":"react-dom","react-redux":"react-redux","react-router":"react-router","redux":"redux","redux-logger":"redux-logger","redux-thunk":"redux-thunk"}],4:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function EventLog(e){var t=e.filters,r=e.events,n=e.onToggleFilter,o=e.onClose;return _react2["default"].createElement("div",{className:"eventlog"},_react2["default"].createElement("div",null,"Eventlog",_react2["default"].createElement("div",{className:"pull-right"},["debug","info","web"].map(function(e){return _react2["default"].createElement(_common.ToggleButton,{text:e,checked:t[e],onToggle:function(){return n(e)}})}),_react2["default"].createElement("i",{onClick:o,className:"fa fa-close"}))),_react2["default"].createElement(_EventList2["default"],{events:r}))}Object.defineProperty(exports,"__esModule",{value:!0});var _react=require("react"),_react2=_interopRequireDefault(_react),_redux=require("redux"),_reactRedux=require("react-redux"),_eventLog=require("../ducks/eventLog"),_common=require("./common"),_EventList=require("./EventLog/EventList"),_EventList2=_interopRequireDefault(_EventList);EventLog.propTypes={filters:_react.PropTypes.object.isRequired,events:_react.PropTypes.array.isRequired,onToggleFilter:_react.PropTypes.func.isRequired,onClose:_react.PropTypes.func.isRequired},exports["default"]=(0,_reactRedux.connect)(function(e){return{filters:e.eventLog.filter,events:e.eventLog.filteredEvents}},function(e){return(0,_redux.bindActionCreators)({onClose:_eventLog.toggleEventLogVisibility,onToggleFilter:_eventLog.toggleEventLogFilter},e)})(EventLog); + _createClass(EventLogList, [{ + key: 'componentDidMount', + value: function componentDidMount() { + window.addEventListener('resize', this.onViewportUpdate); + this.onViewportUpdate(); + } + }, { + key: 'componentWillUnmount', + value: function componentWillUnmount() { + window.removeEventListener('resize', this.onViewportUpdate); + } + }, { + key: 'componentDidUpdate', + value: function componentDidUpdate() { + this.onViewportUpdate(); + } + }, { + key: 'onViewportUpdate', + value: function onViewportUpdate() { + var _this2 = this; -},{"../ducks/eventLog":26,"./EventLog/EventList":5,"./common":13,"react":"react","react-redux":"react-redux","redux":"redux"}],5:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function LogIcon(e){var t=e.event,r={web:"html5",debug:"bug"}[t.level]||"info";return _react2["default"].createElement("i",{className:"fa fa-fw fa-"+r})}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var r=0;rn-i?l.scrollTop=n-i:u>c+s&&(l.scrollTop=u-s)}}},{key:"componentWillReceiveProps",value:function(e){e.selected&&e.selected!==this.props.selected&&(this.shouldScrollIntoView=!0)}},{key:"onViewportUpdate",value:function(){var e=_reactDom2["default"].findDOMNode(this),t=e.scrollTop,o=(0,_VirtualScroll.calcVScroll)({viewportTop:t,viewportHeight:e.offsetHeight,itemCount:this.props.flows.length,rowHeight:this.props.rowHeight});this.state.viewportTop===t&&(0,_shallowequal2["default"])(this.state.vScroll,o)||this.setState({vScroll:o,viewportTop:t})}},{key:"render",value:function(){var e=this,t=this.state,o=t.vScroll,r=t.viewportTop,l=this.props,a=l.flows,i=l.selected,n=l.highlight,u=n?_filt2["default"].parse(n):function(){return!1};return _react2["default"].createElement("div",{className:"flow-table",onScroll:this.onViewportUpdate},_react2["default"].createElement("table",null,_react2["default"].createElement("thead",{ref:"head",style:{transform:"translateY("+r+"px)"}},_react2["default"].createElement(_FlowTableHead2["default"],null)),_react2["default"].createElement("tbody",null,_react2["default"].createElement("tr",{style:{height:o.paddingTop}}),a.slice(o.start,o.end).map(function(t){return _react2["default"].createElement(_FlowRow2["default"],{key:t.id,flow:t,selected:t===i,highlighted:u(t),onSelect:e.props.onSelect})}),_react2["default"].createElement("tr",{style:{height:o.paddingBottom}}))))}}]),t}(_react2["default"].Component);FlowTable.propTypes={onSelect:_react.PropTypes.func.isRequired,flows:_react.PropTypes.array.isRequired,rowHeight:_react.PropTypes.number,highlight:_react.PropTypes.string,selected:_react.PropTypes.object},FlowTable.defaultProps={rowHeight:32},exports["default"]=(0,_AutoScroll2["default"])(FlowTable); + var vScroll = (0, _VirtualScroll.calcVScroll)({ + itemCount: this.props.events.length, + rowHeight: this.props.rowHeight, + viewportTop: viewport.scrollTop, + viewportHeight: viewport.offsetHeight, + itemHeights: this.props.events.map(function (entry) { + return _this2.heights[entry.id]; + }) + }); -},{"../filt/filt":32,"./FlowTable/FlowRow":8,"./FlowTable/FlowTableHead":9,"./helpers/AutoScroll":21,"./helpers/VirtualScroll":22,"react":"react","react-dom":"react-dom","shallowequal":"shallowequal"}],7:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function TLSColumn(e){var t=e.flow;return _react2["default"].createElement("td",{className:(0,_classnames2["default"])("col-tls","https"===t.request.scheme?"col-tls-https":"col-tls-http")})}function IconColumn(e){var t=e.flow;return _react2["default"].createElement("td",{className:"col-icon"},_react2["default"].createElement("div",{className:(0,_classnames2["default"])("resource-icon",IconColumn.getIcon(t))}))}function PathColumn(e){var t=e.flow;return _react2["default"].createElement("td",{className:"col-path"},t.request.is_replay&&_react2["default"].createElement("i",{className:"fa fa-fw fa-repeat pull-right"}),t.intercepted&&_react2["default"].createElement("i",{className:"fa fa-fw fa-pause pull-right"}),_utils.RequestUtils.pretty_url(t.request))}function MethodColumn(e){var t=e.flow;return _react2["default"].createElement("td",{className:"col-method"},t.request.method)}function StatusColumn(e){var t=e.flow;return _react2["default"].createElement("td",{className:"col-status"},t.response&&t.response.status_code)}function SizeColumn(e){var t=e.flow;return _react2["default"].createElement("td",{className:"col-size"},(0,_utils2.formatSize)(SizeColumn.getTotalSize(t)))}function TimeColumn(e){var t=e.flow;return _react2["default"].createElement("td",{className:"col-time"},t.response?(0,_utils2.formatTimeDelta)(1e3*(t.response.timestamp_end-t.request.timestamp_start)):"...")}Object.defineProperty(exports,"__esModule",{value:!0}),exports.TLSColumn=TLSColumn,exports.IconColumn=IconColumn,exports.PathColumn=PathColumn,exports.MethodColumn=MethodColumn,exports.StatusColumn=StatusColumn,exports.SizeColumn=SizeColumn,exports.TimeColumn=TimeColumn;var _react=require("react"),_react2=_interopRequireDefault(_react),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_utils=require("../../flow/utils.js"),_utils2=require("../../utils.js");TLSColumn.sortKeyFun=function(e){return e.request.scheme},TLSColumn.headerClass="col-tls",TLSColumn.headerName="",IconColumn.headerClass="col-icon",IconColumn.headerName="",IconColumn.getIcon=function(e){if(!e.response)return"resource-icon-plain";var t=_utils.ResponseUtils.getContentType(e.response)||"";return 304===e.response.status_code?"resource-icon-not-modified":300<=e.response.status_code&&e.response.status_code<400?"resource-icon-redirect":t.indexOf("image")>=0?"resource-icon-image":t.indexOf("javascript")>=0?"resource-icon-js":t.indexOf("css")>=0?"resource-icon-css":t.indexOf("html")>=0?"resource-icon-document":"resource-icon-plain"},PathColumn.sortKeyFun=function(e){return _utils.RequestUtils.pretty_url(e.request)},PathColumn.headerClass="col-path",PathColumn.headerName="Path",MethodColumn.sortKeyFun=function(e){return e.request.method},MethodColumn.headerClass="col-method",MethodColumn.headerName="Method",StatusColumn.sortKeyFun=function(e){return e.response&&e.response.status_code},StatusColumn.headerClass="col-status",StatusColumn.headerName="Status",SizeColumn.sortKeyFun=function(e){var t=e.request.contentLength;return e.response&&(t+=e.response.contentLength||0),t},SizeColumn.getTotalSize=SizeColumn.sortKeyFun,SizeColumn.headerClass="col-size",SizeColumn.headerName="Size",TimeColumn.sortKeyFun=function(e){return e.response&&e.response.timestamp_end-e.request.timestamp_start},TimeColumn.headerClass="col-time",TimeColumn.headerName="Time",exports["default"]=[TLSColumn,IconColumn,PathColumn,MethodColumn,StatusColumn,SizeColumn,TimeColumn]; + if (!(0, _shallowequal2.default)(this.state.vScroll, vScroll)) { + this.setState({ vScroll: vScroll }); + } + } + }, { + key: 'setHeight', + value: function setHeight(id, node) { + if (node && !this.heights[id]) { + var height = node.offsetHeight; + if (this.heights[id] !== height) { + this.heights[id] = height; + this.onViewportUpdate(); + } + } + } + }, { + key: 'render', + value: function render() { + var _this3 = this; -},{"../../flow/utils.js":33,"../../utils.js":35,"classnames":"classnames","react":"react"}],8:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function FlowRow(e){var t=e.flow,r=e.selected,l=e.highlighted,o=e.onSelect,s=(0,_classnames2["default"])({selected:r,highlighted:l,intercepted:t.intercepted,"has-request":t.request,"has-response":t.response});return _react2["default"].createElement("tr",{className:s,onClick:function(){return o(t)}},_FlowColumns2["default"].map(function(e){return _react2["default"].createElement(e,{key:e.name,flow:t})}))}Object.defineProperty(exports,"__esModule",{value:!0}),exports["default"]=FlowRow;var _react=require("react"),_react2=_interopRequireDefault(_react),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_FlowColumns=require("./FlowColumns"),_FlowColumns2=_interopRequireDefault(_FlowColumns);FlowRow.propTypes={onSelect:_react.PropTypes.func.isRequired,flow:_react.PropTypes.object.isRequired,highlighted:_react.PropTypes.bool,selected:_react.PropTypes.bool}; + var vScroll = this.state.vScroll; + var events = this.props.events; + + + return _react2.default.createElement( + 'pre', + { onScroll: this.onViewportUpdate }, + _react2.default.createElement('div', { style: { height: vScroll.paddingTop } }), + events.slice(vScroll.start, vScroll.end).map(function (event) { + return _react2.default.createElement( + 'div', + { key: event.id, ref: function ref(node) { + return _this3.setHeight(event.id, node); + } }, + _react2.default.createElement(LogIcon, { event: event }), + event.message + ); + }), + _react2.default.createElement('div', { style: { height: vScroll.paddingBottom } }) + ); + } + }]); + + return EventLogList; +}(_react.Component); + +EventLogList.propTypes = { + events: _react.PropTypes.array.isRequired, + rowHeight: _react.PropTypes.number +}; +EventLogList.defaultProps = { + rowHeight: 18 +}; + + +function LogIcon(_ref) { + var event = _ref.event; + + var icon = { web: 'html5', debug: 'bug' }[event.level] || 'info'; + return _react2.default.createElement('i', { className: 'fa fa-fw fa-' + icon }); +} + +exports.default = (0, _AutoScroll2.default)(EventLogList); + +},{"../helpers/AutoScroll":27,"../helpers/VirtualScroll":28,"react":"react","react-dom":"react-dom","shallowequal":"shallowequal"}],6:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +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; }; }(); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _reactDom = require('react-dom'); + +var _reactDom2 = _interopRequireDefault(_reactDom); + +var _shallowequal = require('shallowequal'); + +var _shallowequal2 = _interopRequireDefault(_shallowequal); + +var _AutoScroll = require('./helpers/AutoScroll'); + +var _AutoScroll2 = _interopRequireDefault(_AutoScroll); + +var _VirtualScroll = require('./helpers/VirtualScroll'); + +var _FlowTableHead = require('./FlowTable/FlowTableHead'); + +var _FlowTableHead2 = _interopRequireDefault(_FlowTableHead); + +var _FlowRow = require('./FlowTable/FlowRow'); + +var _FlowRow2 = _interopRequireDefault(_FlowRow); + +var _filt = require('../filt/filt'); + +var _filt2 = _interopRequireDefault(_filt); + +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 FlowTable = function (_React$Component) { + _inherits(FlowTable, _React$Component); + + function FlowTable(props, context) { + _classCallCheck(this, FlowTable); + + var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(FlowTable).call(this, props, context)); + + _this.state = { vScroll: (0, _VirtualScroll.calcVScroll)() }; + _this.onViewportUpdate = _this.onViewportUpdate.bind(_this); + return _this; + } + + _createClass(FlowTable, [{ + key: 'componentWillMount', + value: function componentWillMount() { + window.addEventListener('resize', this.onViewportUpdate); + } + }, { + key: 'componentWillUnmount', + value: function componentWillUnmount() { + window.removeEventListener('resize', this.onViewportUpdate); + } + }, { + key: 'componentDidUpdate', + value: function componentDidUpdate() { + this.onViewportUpdate(); + + if (!this.shouldScrollIntoView) { + return; + } + + this.shouldScrollIntoView = false; + + var _props = this.props; + var rowHeight = _props.rowHeight; + var flows = _props.flows; + var selected = _props.selected; + + var viewport = _reactDom2.default.findDOMNode(this); + var head = _reactDom2.default.findDOMNode(this.refs.head); + + var headHeight = head ? head.offsetHeight : 0; + + var rowTop = flows.indexOf(selected) * rowHeight + headHeight; + var rowBottom = rowTop + rowHeight; + + var viewportTop = viewport.scrollTop; + var viewportHeight = viewport.offsetHeight; + + // Account for pinned thead + if (rowTop - headHeight < viewportTop) { + viewport.scrollTop = rowTop - headHeight; + } else if (rowBottom > viewportTop + viewportHeight) { + viewport.scrollTop = rowBottom - viewportHeight; + } + } + }, { + key: 'componentWillReceiveProps', + value: function componentWillReceiveProps(nextProps) { + if (nextProps.selected && nextProps.selected !== this.props.selected) { + this.shouldScrollIntoView = true; + } + } + }, { + key: 'onViewportUpdate', + value: function onViewportUpdate() { + var viewport = _reactDom2.default.findDOMNode(this); + var viewportTop = viewport.scrollTop; + + var vScroll = (0, _VirtualScroll.calcVScroll)({ + viewportTop: viewportTop, + viewportHeight: viewport.offsetHeight, + itemCount: this.props.flows.length, + rowHeight: this.props.rowHeight + }); + + if (this.state.viewportTop !== viewportTop || !(0, _shallowequal2.default)(this.state.vScroll, vScroll)) { + this.setState({ vScroll: vScroll, viewportTop: viewportTop }); + } + } + }, { + key: 'render', + value: function render() { + var _this2 = this; + + var _state = this.state; + var vScroll = _state.vScroll; + var viewportTop = _state.viewportTop; + var _props2 = this.props; + var flows = _props2.flows; + var selected = _props2.selected; + var highlight = _props2.highlight; + + var isHighlighted = highlight ? _filt2.default.parse(highlight) : function () { + return false; + }; + + return _react2.default.createElement( + 'div', + { className: 'flow-table', onScroll: this.onViewportUpdate }, + _react2.default.createElement( + 'table', + null, + _react2.default.createElement( + 'thead', + { ref: 'head', style: { transform: 'translateY(' + viewportTop + 'px)' } }, + _react2.default.createElement(_FlowTableHead2.default, null) + ), + _react2.default.createElement( + 'tbody', + null, + _react2.default.createElement('tr', { style: { height: vScroll.paddingTop } }), + flows.slice(vScroll.start, vScroll.end).map(function (flow) { + return _react2.default.createElement(_FlowRow2.default, { + key: flow.id, + flow: flow, + selected: flow === selected, + highlighted: isHighlighted(flow), + onSelect: _this2.props.onSelect + }); + }), + _react2.default.createElement('tr', { style: { height: vScroll.paddingBottom } }) + ) + ) + ); + } + }]); + + return FlowTable; +}(_react2.default.Component); + +FlowTable.propTypes = { + onSelect: _react.PropTypes.func.isRequired, + flows: _react.PropTypes.array.isRequired, + rowHeight: _react.PropTypes.number, + highlight: _react.PropTypes.string, + selected: _react.PropTypes.object +}; +FlowTable.defaultProps = { + rowHeight: 32 +}; +exports.default = (0, _AutoScroll2.default)(FlowTable); + +},{"../filt/filt":38,"./FlowTable/FlowRow":8,"./FlowTable/FlowTableHead":9,"./helpers/AutoScroll":27,"./helpers/VirtualScroll":28,"react":"react","react-dom":"react-dom","shallowequal":"shallowequal"}],7:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.TLSColumn = TLSColumn; +exports.IconColumn = IconColumn; +exports.PathColumn = PathColumn; +exports.MethodColumn = MethodColumn; +exports.StatusColumn = StatusColumn; +exports.SizeColumn = SizeColumn; +exports.TimeColumn = TimeColumn; + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _classnames = require('classnames'); + +var _classnames2 = _interopRequireDefault(_classnames); + +var _utils = require('../../flow/utils.js'); + +var _utils2 = require('../../utils.js'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function TLSColumn(_ref) { + var flow = _ref.flow; + + return _react2.default.createElement('td', { className: (0, _classnames2.default)('col-tls', flow.request.scheme === 'https' ? 'col-tls-https' : 'col-tls-http') }); +} + +TLSColumn.sortKeyFun = function (flow) { + return flow.request.scheme; +}; +TLSColumn.headerClass = 'col-tls'; +TLSColumn.headerName = ''; + +function IconColumn(_ref2) { + var flow = _ref2.flow; + + return _react2.default.createElement( + 'td', + { className: 'col-icon' }, + _react2.default.createElement('div', { className: (0, _classnames2.default)('resource-icon', IconColumn.getIcon(flow)) }) + ); +} + +IconColumn.headerClass = 'col-icon'; +IconColumn.headerName = ''; + +IconColumn.getIcon = function (flow) { + if (!flow.response) { + return 'resource-icon-plain'; + } + + var contentType = _utils.ResponseUtils.getContentType(flow.response) || ''; + + // @todo We should assign a type to the flow somewhere else. + if (flow.response.status_code === 304) { + return 'resource-icon-not-modified'; + } + if (300 <= flow.response.status_code && flow.response.status_code < 400) { + return 'resource-icon-redirect'; + } + if (contentType.indexOf('image') >= 0) { + return 'resource-icon-image'; + } + if (contentType.indexOf('javascript') >= 0) { + return 'resource-icon-js'; + } + if (contentType.indexOf('css') >= 0) { + return 'resource-icon-css'; + } + if (contentType.indexOf('html') >= 0) { + return 'resource-icon-document'; + } + + return 'resource-icon-plain'; +}; + +function PathColumn(_ref3) { + var flow = _ref3.flow; + + return _react2.default.createElement( + 'td', + { className: 'col-path' }, + flow.request.is_replay && _react2.default.createElement('i', { className: 'fa fa-fw fa-repeat pull-right' }), + flow.intercepted && _react2.default.createElement('i', { className: 'fa fa-fw fa-pause pull-right' }), + _utils.RequestUtils.pretty_url(flow.request) + ); +} + +PathColumn.sortKeyFun = function (flow) { + return _utils.RequestUtils.pretty_url(flow.request); +}; +PathColumn.headerClass = 'col-path'; +PathColumn.headerName = 'Path'; + +function MethodColumn(_ref4) { + var flow = _ref4.flow; + + return _react2.default.createElement( + 'td', + { className: 'col-method' }, + flow.request.method + ); +} + +MethodColumn.sortKeyFun = function (flow) { + return flow.request.method; +}; +MethodColumn.headerClass = 'col-method'; +MethodColumn.headerName = 'Method'; + +function StatusColumn(_ref5) { + var flow = _ref5.flow; + + return _react2.default.createElement( + 'td', + { className: 'col-status' }, + flow.response && flow.response.status_code + ); +} + +StatusColumn.sortKeyFun = function (flow) { + return flow.response && flow.response.status_code; +}; +StatusColumn.headerClass = 'col-status'; +StatusColumn.headerName = 'Status'; + +function SizeColumn(_ref6) { + var flow = _ref6.flow; + + return _react2.default.createElement( + 'td', + { className: 'col-size' }, + (0, _utils2.formatSize)(SizeColumn.getTotalSize(flow)) + ); +} + +SizeColumn.sortKeyFun = function (flow) { + var total = flow.request.contentLength; + if (flow.response) { + total += flow.response.contentLength || 0; + } + return total; +}; + +SizeColumn.getTotalSize = SizeColumn.sortKeyFun; +SizeColumn.headerClass = 'col-size'; +SizeColumn.headerName = 'Size'; + +function TimeColumn(_ref7) { + var flow = _ref7.flow; + + return _react2.default.createElement( + 'td', + { className: 'col-time' }, + flow.response ? (0, _utils2.formatTimeDelta)(1000 * (flow.response.timestamp_end - flow.request.timestamp_start)) : '...' + ); +} + +TimeColumn.sortKeyFun = function (flow) { + return flow.response && flow.response.timestamp_end - flow.request.timestamp_start; +}; +TimeColumn.headerClass = 'col-time'; +TimeColumn.headerName = 'Time'; + +exports.default = [TLSColumn, IconColumn, PathColumn, MethodColumn, StatusColumn, SizeColumn, TimeColumn]; + +},{"../../flow/utils.js":39,"../../utils.js":41,"classnames":"classnames","react":"react"}],8:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = FlowRow; + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _classnames = require('classnames'); + +var _classnames2 = _interopRequireDefault(_classnames); + +var _FlowColumns = require('./FlowColumns'); + +var _FlowColumns2 = _interopRequireDefault(_FlowColumns); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +FlowRow.propTypes = { + onSelect: _react.PropTypes.func.isRequired, + flow: _react.PropTypes.object.isRequired, + highlighted: _react.PropTypes.bool, + selected: _react.PropTypes.bool +}; + +function FlowRow(_ref) { + var flow = _ref.flow; + var selected = _ref.selected; + var highlighted = _ref.highlighted; + var onSelect = _ref.onSelect; + + var className = (0, _classnames2.default)({ + 'selected': selected, + 'highlighted': highlighted, + 'intercepted': flow.intercepted, + 'has-request': flow.request, + 'has-response': flow.response + }); + + return _react2.default.createElement( + 'tr', + { className: className, onClick: function onClick() { + return onSelect(flow); + } }, + _FlowColumns2.default.map(function (Column) { + return _react2.default.createElement(Column, { key: Column.name, flow: flow }); + }) + ); +} },{"./FlowColumns":7,"classnames":"classnames","react":"react"}],9:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function FlowTableHead(e){function r(e){s({sortColumn:e.name,sortDesc:e.name!==t?!1:!o})}var t=e.sortColumn,o=e.sortDesc,s=e.onSort,u=o?"sort-desc":"sort-asc";return _react2["default"].createElement("tr",null,_FlowColumns2["default"].map(function(e){return _react2["default"].createElement("th",{className:(0,_classnames2["default"])(e.headerClass,t===e.name&&u),key:e.name,onClick:function(){return r(e)}},e.headerName)}))}Object.defineProperty(exports,"__esModule",{value:!0});var _react=require("react"),_react2=_interopRequireDefault(_react),_redux=require("redux"),_reactRedux=require("react-redux"),_classnames=require("classnames"),_classnames2=_interopRequireDefault(_classnames),_FlowColumns=require("./FlowColumns"),_FlowColumns2=_interopRequireDefault(_FlowColumns),_flows=require("../../ducks/flows");FlowTableHead.propTypes={onSort:_react.PropTypes.func.isRequired,sortDesc:_react2["default"].PropTypes.bool.isRequired,sortColumn:_react2["default"].PropTypes.string},exports["default"]=(0,_reactRedux.connect)(function(e){return{sortDesc:e.flows.sort.sortDesc,sortColumn:e.flows.sort.sortColumn}},function(e){return(0,_redux.bindActionCreators)({onSort:_flows.setSort},e)})(FlowTableHead); +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _redux = require('redux'); + +var _reactRedux = require('react-redux'); + +var _classnames = require('classnames'); + +var _classnames2 = _interopRequireDefault(_classnames); + +var _FlowColumns = require('./FlowColumns'); + +var _FlowColumns2 = _interopRequireDefault(_FlowColumns); + +var _flows = require('../../ducks/flows'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +FlowTableHead.propTypes = { + onSort: _react.PropTypes.func.isRequired, + sortDesc: _react2.default.PropTypes.bool.isRequired, + sortColumn: _react2.default.PropTypes.string +}; + +function FlowTableHead(_ref) { + var sortColumn = _ref.sortColumn; + var sortDesc = _ref.sortDesc; + var onSort = _ref.onSort; + + var sortType = sortDesc ? 'sort-desc' : 'sort-asc'; + + return _react2.default.createElement( + 'tr', + null, + _FlowColumns2.default.map(function (Column) { + return _react2.default.createElement( + 'th', + { className: (0, _classnames2.default)(Column.headerClass, sortColumn === Column.name && sortType), + key: Column.name, + onClick: function onClick() { + return _onClick(Column); + } }, + Column.headerName + ); + }) + ); + + function _onClick(Column) { + onSort({ sortColumn: Column.name, sortDesc: Column.name !== sortColumn ? false : !sortDesc }); + } +} + +exports.default = (0, _reactRedux.connect)(function (state) { + return { + sortDesc: state.flows.sort.sortDesc, + sortColumn: state.flows.sort.sortColumn + }; +}, function (dispatch) { + return (0, _redux.bindActionCreators)({ + onSort: _flows.setSort + }, dispatch); +})(FlowTableHead); + +},{"../../ducks/flows":33,"./FlowColumns":7,"classnames":"classnames","react":"react","react-redux":"react-redux","redux":"redux"}],10:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = Footer; + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _utils = require('../utils.js'); + +var _common = require('./common.js'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +Footer.propTypes = { + settings: _react2.default.PropTypes.object.isRequired +}; + +function Footer(_ref) { + var settings = _ref.settings; + + return _react2.default.createElement( + 'footer', + null, + settings.mode && settings.mode != "regular" && _react2.default.createElement( + 'span', + { className: 'label label-success' }, + settings.mode, + ' mode' + ), + settings.intercept && _react2.default.createElement( + 'span', + { className: 'label label-success' }, + 'Intercept: ', + settings.intercept + ), + settings.showhost && _react2.default.createElement( + 'span', + { className: 'label label-success' }, + 'showhost' + ), + settings.no_upstream_cert && _react2.default.createElement( + 'span', + { className: 'label label-success' }, + 'no-upstream-cert' + ), + settings.rawtcp && _react2.default.createElement( + 'span', + { className: 'label label-success' }, + 'raw-tcp' + ), + !settings.http2 && _react2.default.createElement( + 'span', + { className: 'label label-success' }, + 'no-http2' + ), + settings.anticache && _react2.default.createElement( + 'span', + { className: 'label label-success' }, + 'anticache' + ), + settings.anticomp && _react2.default.createElement( + 'span', + { className: 'label label-success' }, + 'anticomp' + ), + settings.stickyauth && _react2.default.createElement( + 'span', + { className: 'label label-success' }, + 'stickyauth: ', + settings.stickyauth + ), + settings.stickycookie && _react2.default.createElement( + 'span', + { className: 'label label-success' }, + 'stickycookie: ', + settings.stickycookie + ), + settings.stream && _react2.default.createElement( + 'span', + { className: 'label label-success' }, + 'stream: ', + (0, _utils.formatSize)(settings.stream) + ) + ); +} + +},{"../utils.js":41,"./common.js":20,"react":"react"}],11:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +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; }; }(); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _classnames = require('classnames'); + +var _classnames2 = _interopRequireDefault(_classnames); + +var _eventLog = require('../ducks/eventLog'); + +var _MainMenu = require('./Header/MainMenu'); + +var _MainMenu2 = _interopRequireDefault(_MainMenu); + +var _ViewMenu = require('./Header/ViewMenu'); + +var _ViewMenu2 = _interopRequireDefault(_ViewMenu); + +var _OptionMenu = require('./Header/OptionMenu'); + +var _OptionMenu2 = _interopRequireDefault(_OptionMenu); + +var _FileMenu = require('./Header/FileMenu'); + +var _FileMenu2 = _interopRequireDefault(_FileMenu); + +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 Header = function (_Component) { + _inherits(Header, _Component); + + function Header(props, context) { + _classCallCheck(this, Header); + + var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(Header).call(this, props, context)); + + _this.state = { active: Header.entries[0] }; + return _this; + } + + _createClass(Header, [{ + key: 'handleClick', + value: function handleClick(active, e) { + e.preventDefault(); + this.props.updateLocation(active.route); + this.setState({ active: active }); + } + }, { + key: 'render', + value: function render() { + var _this2 = this; + + var Active = this.state.active; + var _props = this.props; + var settings = _props.settings; + var updateLocation = _props.updateLocation; + var query = _props.query; + + + return _react2.default.createElement( + 'header', + null, + _react2.default.createElement( + 'nav', + { className: 'nav-tabs nav-tabs-lg' }, + _react2.default.createElement(_FileMenu2.default, null), + Header.entries.map(function (Entry) { + return _react2.default.createElement( + 'a', + { key: Entry.title, + href: '#', + className: (0, _classnames2.default)({ active: Entry === Active }), + onClick: function onClick(e) { + return _this2.handleClick(Entry, e); + } }, + Entry.title + ); + }) + ), + _react2.default.createElement( + 'div', + { className: 'menu' }, + _react2.default.createElement(Active, { + ref: 'active', + settings: settings, + updateLocation: updateLocation, + query: query + }) + ) + ); + } + }]); + + return Header; +}(_react.Component); + +Header.entries = [_MainMenu2.default, _ViewMenu2.default, _OptionMenu2.default]; +Header.propTypes = { + settings: _react.PropTypes.object.isRequired +}; +exports.default = Header; + +},{"../ducks/eventLog":32,"./Header/FileMenu":12,"./Header/MainMenu":15,"./Header/OptionMenu":16,"./Header/ViewMenu":17,"classnames":"classnames","react":"react"}],12:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +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; }; }(); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _classnames = require('classnames'); + +var _classnames2 = _interopRequireDefault(_classnames); + +var _actions = require('../../actions.js'); + +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 FileMenu = function (_Component) { + _inherits(FileMenu, _Component); + + function FileMenu(props, context) { + _classCallCheck(this, FileMenu); + + var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(FileMenu).call(this, props, context)); + + _this.state = { show: false }; + + _this.close = _this.close.bind(_this); + _this.onFileClick = _this.onFileClick.bind(_this); + _this.onNewClick = _this.onNewClick.bind(_this); + _this.onOpenClick = _this.onOpenClick.bind(_this); + _this.onOpenFile = _this.onOpenFile.bind(_this); + _this.onSaveClick = _this.onSaveClick.bind(_this); + return _this; + } + + _createClass(FileMenu, [{ + key: 'close', + value: function close() { + this.setState({ show: false }); + document.removeEventListener('click', this.close); + } + }, { + key: 'onFileClick', + value: function onFileClick(e) { + e.preventDefault(); + + if (this.state.show) { + return; + } + + document.addEventListener('click', this.close); + this.setState({ show: true }); + } + }, { + key: 'onNewClick', + value: function onNewClick(e) { + e.preventDefault(); + if (confirm('Delete all flows?')) { + _actions.FlowActions.clear(); + } + } + }, { + key: 'onOpenClick', + value: function onOpenClick(e) { + e.preventDefault(); + this.fileInput.click(); + } + }, { + key: 'onOpenFile', + value: function onOpenFile(e) { + e.preventDefault(); + if (e.target.files.length > 0) { + _actions.FlowActions.upload(e.target.files[0]); + this.fileInput.value = ''; + } + } + }, { + key: 'onSaveClick', + value: function onSaveClick(e) { + e.preventDefault(); + _actions.FlowActions.download(); + } + }, { + key: 'render', + value: function render() { + var _this2 = this; + + return _react2.default.createElement( + 'div', + { className: (0, _classnames2.default)('dropdown pull-left', { open: this.state.show }) }, + _react2.default.createElement( + 'a', + { href: '#', className: 'special', onClick: this.onFileClick }, + 'mitmproxy' + ), + _react2.default.createElement( + 'ul', + { className: 'dropdown-menu', role: 'menu' }, + _react2.default.createElement( + 'li', + null, + _react2.default.createElement( + 'a', + { href: '#', onClick: this.onNewClick }, + _react2.default.createElement('i', { className: 'fa fa-fw fa-file' }), + 'New' + ) + ), + _react2.default.createElement( + 'li', + null, + _react2.default.createElement( + 'a', + { href: '#', onClick: this.onOpenClick }, + _react2.default.createElement('i', { className: 'fa fa-fw fa-folder-open' }), + 'Open...' + ), + _react2.default.createElement('input', { + ref: function ref(_ref) { + return _this2.fileInput = _ref; + }, + className: 'hidden', + type: 'file', + onChange: this.onOpenFile + }) + ), + _react2.default.createElement( + 'li', + null, + _react2.default.createElement( + 'a', + { href: '#', onClick: this.onSaveClick }, + _react2.default.createElement('i', { className: 'fa fa-fw fa-floppy-o' }), + 'Save...' + ) + ), + _react2.default.createElement('li', { role: 'presentation', className: 'divider' }), + _react2.default.createElement( + 'li', + null, + _react2.default.createElement( + 'a', + { href: 'http://mitm.it/', target: '_blank' }, + _react2.default.createElement('i', { className: 'fa fa-fw fa-external-link' }), + 'Install Certificates...' + ) + ) + ) + ); + } + }]); + + return FileMenu; +}(_react.Component); + +exports.default = FileMenu; + +},{"../../actions.js":2,"classnames":"classnames","react":"react"}],13:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +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; }; }(); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _jquery = require('jquery'); + +var _jquery2 = _interopRequireDefault(_jquery); + +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 FilterDocs = function (_Component) { + _inherits(FilterDocs, _Component); + + // @todo move to redux + + function FilterDocs(props, context) { + _classCallCheck(this, FilterDocs); + + var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(FilterDocs).call(this, props, context)); + + _this.state = { doc: FilterDocs.doc }; + return _this; + } + + _createClass(FilterDocs, [{ + key: 'componentWillMount', + value: function componentWillMount() { + var _this2 = this; + + if (!FilterDocs.xhr) { + FilterDocs.xhr = _jquery2.default.getJSON('/filter-help'); + FilterDocs.xhr.fail(function () { + FilterDocs.xhr = null; + }); + } + if (!this.state.doc) { + FilterDocs.xhr.done(function (doc) { + FilterDocs.doc = doc; + _this2.setState({ doc: doc }); + }); + } + } + }, { + key: 'render', + value: function render() { + var doc = this.state.doc; + + return !doc ? _react2.default.createElement('i', { className: 'fa fa-spinner fa-spin' }) : _react2.default.createElement( + 'table', + { className: 'table table-condensed' }, + _react2.default.createElement( + 'tbody', + null, + doc.commands.map(function (cmd) { + return _react2.default.createElement( + 'tr', + { key: cmd[1] }, + _react2.default.createElement( + 'td', + null, + cmd[0].replace(' ', ' ') + ), + _react2.default.createElement( + 'td', + null, + cmd[1] + ) + ); + }), + _react2.default.createElement( + 'tr', + { key: 'docs-link' }, + _react2.default.createElement( + 'td', + { colSpan: '2' }, + _react2.default.createElement( + 'a', + { href: 'http://docs.mitmproxy.org/en/stable/features/filters.html', + target: '_blank' }, + _react2.default.createElement('i', { className: 'fa fa-external-link' }), + '  mitmproxy docs' + ) + ) + ) + ) + ); + } + }]); + + return FilterDocs; +}(_react.Component); + +FilterDocs.xhr = null; +FilterDocs.doc = null; +exports.default = FilterDocs; + +},{"jquery":"jquery","react":"react"}],14:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +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; }; }(); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _reactDom = require('react-dom'); + +var _reactDom2 = _interopRequireDefault(_reactDom); + +var _classnames = require('classnames'); + +var _classnames2 = _interopRequireDefault(_classnames); + +var _utils = require('../../utils.js'); + +var _filt = require('../../filt/filt'); + +var _filt2 = _interopRequireDefault(_filt); + +var _FilterDocs = require('./FilterDocs'); + +var _FilterDocs2 = _interopRequireDefault(_FilterDocs); + +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 FilterInput = function (_Component) { + _inherits(FilterInput, _Component); + + function FilterInput(props, context) { + _classCallCheck(this, FilterInput); + + // Consider both focus and mouseover for showing/hiding the tooltip, + // because onBlur of the input is triggered before the click on the tooltip + // finalized, hiding the tooltip just as the user clicks on it. + + var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(FilterInput).call(this, props, context)); + + _this.state = { value: _this.props.value, focus: false, mousefocus: false }; + + _this.onChange = _this.onChange.bind(_this); + _this.onFocus = _this.onFocus.bind(_this); + _this.onBlur = _this.onBlur.bind(_this); + _this.onKeyDown = _this.onKeyDown.bind(_this); + _this.onMouseEnter = _this.onMouseEnter.bind(_this); + _this.onMouseLeave = _this.onMouseLeave.bind(_this); + return _this; + } + + _createClass(FilterInput, [{ + key: 'componentWillReceiveProps', + value: function componentWillReceiveProps(nextProps) { + this.setState({ value: nextProps.value }); + } + }, { + key: 'isValid', + value: function isValid(filt) { + try { + var str = filt == null ? this.state.value : filt; + if (str) { + _filt2.default.parse(str); + } + return true; + } catch (e) { + return false; + } + } + }, { + key: 'getDesc', + value: function getDesc() { + if (!this.state.value) { + return _react2.default.createElement(_FilterDocs2.default, null); + } + try { + return _filt2.default.parse(this.state.value).desc; + } catch (e) { + return '' + e; + } + } + }, { + key: 'onChange', + value: function onChange(e) { + var value = e.target.value; + this.setState({ value: value }); + + // Only propagate valid filters upwards. + if (this.isValid(value)) { + this.props.onChange(value); + } + } + }, { + key: 'onFocus', + value: function onFocus() { + this.setState({ focus: true }); + } + }, { + key: 'onBlur', + value: function onBlur() { + this.setState({ focus: false }); + } + }, { + key: 'onMouseEnter', + value: function onMouseEnter() { + this.setState({ mousefocus: true }); + } + }, { + key: 'onMouseLeave', + value: function onMouseLeave() { + this.setState({ mousefocus: false }); + } + }, { + key: 'onKeyDown', + value: function onKeyDown(e) { + if (e.keyCode === _utils.Key.ESC || e.keyCode === _utils.Key.ENTER) { + this.blur(); + // If closed using ESC/ENTER, hide the tooltip. + this.setState({ mousefocus: false }); + } + e.stopPropagation(); + } + }, { + key: 'blur', + value: function blur() { + _reactDom2.default.findDOMNode(this.refs.input).blur(); + this.context.returnFocus(); + } + }, { + key: 'select', + value: function select() { + _reactDom2.default.findDOMNode(this.refs.input).select(); + } + }, { + key: 'render', + value: function render() { + var _props = this.props; + var type = _props.type; + var color = _props.color; + var placeholder = _props.placeholder; + var _state = this.state; + var value = _state.value; + var focus = _state.focus; + var mousefocus = _state.mousefocus; + + return _react2.default.createElement( + 'div', + { className: (0, _classnames2.default)('filter-input input-group', { 'has-error': !this.isValid() }) }, + _react2.default.createElement( + 'span', + { className: 'input-group-addon' }, + _react2.default.createElement('i', { className: 'fa fa-fw fa-' + type, style: { color: color } }) + ), + _react2.default.createElement('input', { + type: 'text', + ref: 'input', + placeholder: placeholder, + className: 'form-control', + value: value, + onChange: this.onChange, + onFocus: this.onFocus, + onBlur: this.onBlur, + onKeyDown: this.onKeyDown + }), + (focus || mousefocus) && _react2.default.createElement( + 'div', + { className: 'popover bottom', + onMouseEnter: this.onMouseEnter, + onMouseLeave: this.onMouseLeave }, + _react2.default.createElement('div', { className: 'arrow' }), + _react2.default.createElement( + 'div', + { className: 'popover-content' }, + this.getDesc() + ) + ) + ); + } + }]); + + return FilterInput; +}(_react.Component); + +FilterInput.contextTypes = { + returnFocus: _react2.default.PropTypes.func +}; +exports.default = FilterInput; + +},{"../../filt/filt":38,"../../utils.js":41,"./FilterDocs":13,"classnames":"classnames","react":"react","react-dom":"react-dom"}],15:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +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; }; }(); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _actions = require('../../actions.js'); + +var _FilterInput = require('./FilterInput'); + +var _FilterInput2 = _interopRequireDefault(_FilterInput); + +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; } + +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 MainMenu = function (_Component) { + _inherits(MainMenu, _Component); + + function MainMenu(props, context) { + _classCallCheck(this, MainMenu); + + var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(MainMenu).call(this, props, context)); + + _this.onSearchChange = _this.onSearchChange.bind(_this); + _this.onHighlightChange = _this.onHighlightChange.bind(_this); + _this.onInterceptChange = _this.onInterceptChange.bind(_this); + return _this; + } + + _createClass(MainMenu, [{ + key: 'onSearchChange', + value: function onSearchChange(val) { + this.props.updateLocation(undefined, _defineProperty({}, _actions.Query.SEARCH, val)); + } + }, { + key: 'onHighlightChange', + value: function onHighlightChange(val) { + this.props.updateLocation(undefined, _defineProperty({}, _actions.Query.HIGHLIGHT, val)); + } + }, { + key: 'onInterceptChange', + value: function onInterceptChange(val) { + _actions.SettingsActions.update({ intercept: val }); + } + }, { + key: 'render', + value: function render() { + var _props = this.props; + var query = _props.query; + var settings = _props.settings; + + + var search = query[_actions.Query.SEARCH] || ''; + var highlight = query[_actions.Query.HIGHLIGHT] || ''; + var intercept = settings.intercept || ''; + + return _react2.default.createElement( + 'div', + null, + _react2.default.createElement( + 'div', + { className: 'menu-row' }, + _react2.default.createElement(_FilterInput2.default, { + ref: 'search', + placeholder: 'Search', + type: 'search', + color: 'black', + value: search, + onChange: this.onSearchChange + }), + _react2.default.createElement(_FilterInput2.default, { + ref: 'highlight', + placeholder: 'Highlight', + type: 'tag', + color: 'hsl(48, 100%, 50%)', + value: highlight, + onChange: this.onHighlightChange + }), + _react2.default.createElement(_FilterInput2.default, { + ref: 'intercept', + placeholder: 'Intercept', + type: 'pause', + color: 'hsl(208, 56%, 53%)', + value: intercept, + onChange: this.onInterceptChange + }) + ), + _react2.default.createElement('div', { className: 'clearfix' }) + ); + } + }]); + + return MainMenu; +}(_react.Component); + +MainMenu.title = 'Start'; +MainMenu.route = 'flows'; +MainMenu.propTypes = { + settings: _react2.default.PropTypes.object.isRequired +}; +exports.default = MainMenu; + +},{"../../actions.js":2,"./FilterInput":14,"react":"react"}],16:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = OptionMenu; + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _common = require('../common.js'); + +var _actions = require('../../actions.js'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +OptionMenu.title = "Options"; + +OptionMenu.propTypes = { + settings: _react.PropTypes.object.isRequired +}; + +function OptionMenu(_ref) { + var settings = _ref.settings; + + // @todo use settings.map + return _react2.default.createElement( + 'div', + null, + _react2.default.createElement( + 'div', + { className: 'menu-row' }, + _react2.default.createElement(_common.ToggleButton, { text: 'showhost', + checked: settings.showhost, + onToggle: function onToggle() { + return _actions.SettingsActions.update({ showhost: !settings.showhost }); + } + }), + _react2.default.createElement(_common.ToggleButton, { text: 'no_upstream_cert', + checked: settings.no_upstream_cert, + onToggle: function onToggle() { + return _actions.SettingsActions.update({ no_upstream_cert: !settings.no_upstream_cert }); + } + }), + _react2.default.createElement(_common.ToggleButton, { text: 'rawtcp', + checked: settings.rawtcp, + onToggle: function onToggle() { + return _actions.SettingsActions.update({ rawtcp: !settings.rawtcp }); + } + }), + _react2.default.createElement(_common.ToggleButton, { text: 'http2', + checked: settings.http2, + onToggle: function onToggle() { + return _actions.SettingsActions.update({ http2: !settings.http2 }); + } + }), + _react2.default.createElement(_common.ToggleButton, { text: 'anticache', + checked: settings.anticache, + onToggle: function onToggle() { + return _actions.SettingsActions.update({ anticache: !settings.anticache }); + } + }), + _react2.default.createElement(_common.ToggleButton, { text: 'anticomp', + checked: settings.anticomp, + onToggle: function onToggle() { + return _actions.SettingsActions.update({ anticomp: !settings.anticomp }); + } + }), + _react2.default.createElement(_common.ToggleInputButton, { name: 'stickyauth', placeholder: 'Sticky auth filter', + checked: !!settings.stickyauth, + txt: settings.stickyauth || '', + onToggleChanged: function onToggleChanged(txt) { + return _actions.SettingsActions.update({ stickyauth: !settings.stickyauth ? txt : null }); + } + }), + _react2.default.createElement(_common.ToggleInputButton, { name: 'stickycookie', placeholder: 'Sticky cookie filter', + checked: !!settings.stickycookie, + txt: settings.stickycookie || '', + onToggleChanged: function onToggleChanged(txt) { + return _actions.SettingsActions.update({ stickycookie: !settings.stickycookie ? txt : null }); + } + }), + _react2.default.createElement(_common.ToggleInputButton, { name: 'stream', placeholder: 'stream...', + checked: !!settings.stream, + txt: settings.stream || '', + inputType: 'number', + onToggleChanged: function onToggleChanged(txt) { + return _actions.SettingsActions.update({ stream: !settings.stream ? txt : null }); + } + }) + ), + _react2.default.createElement('div', { className: 'clearfix' }) + ); +} + +},{"../../actions.js":2,"../common.js":20,"react":"react"}],17:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _redux = require('redux'); + +var _reactRedux = require('react-redux'); + +var _common = require('../common.js'); + +var _eventLog = require('../../ducks/eventLog'); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +ViewMenu.title = 'View'; +ViewMenu.route = 'flows'; + +ViewMenu.propTypes = { + visible: _react.PropTypes.bool.isRequired, + onToggle: _react.PropTypes.func.isRequired +}; + +function ViewMenu(_ref) { + var visible = _ref.visible; + var onToggle = _ref.onToggle; + + return _react2.default.createElement( + 'div', + null, + _react2.default.createElement( + 'div', + { className: 'menu-row' }, + _react2.default.createElement(_common.ToggleButton, { text: 'Show Event Log', checked: visible, onToggle: onToggle }) + ), + _react2.default.createElement('div', { className: 'clearfix' }) + ); +} + +exports.default = (0, _reactRedux.connect)(function (state) { + return { + visible: state.eventLog.visible + }; +}, function (dispatch) { + return (0, _redux.bindActionCreators)({ + onToggle: _eventLog.toggleEventLogVisibility + }, dispatch); +})(ViewMenu); + +},{"../../ducks/eventLog":32,"../common.js":20,"react":"react","react-redux":"react-redux","redux":"redux"}],18:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +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; }; }(); + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _reactRedux = require('react-redux'); + +var _redux = require('redux'); + +var _actions = require('../actions.js'); + +var _utils = require('../utils.js'); + +var _common = require('./common.js'); + +var _FlowTable = require('./FlowTable'); + +var _FlowTable2 = _interopRequireDefault(_FlowTable); + +var _index = require('./flowview/index.js'); + +var _index2 = _interopRequireDefault(_index); + +var _flows = require('../ducks/flows'); + +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 MainView = function (_Component) { + _inherits(MainView, _Component); + + function MainView() { + _classCallCheck(this, MainView); + + return _possibleConstructorReturn(this, Object.getPrototypeOf(MainView).apply(this, arguments)); + } + + _createClass(MainView, [{ + key: 'componentWillReceiveProps', + + + /** + * @todo move to actions + * @todo replace with mapStateToProps + */ + value: function componentWillReceiveProps(nextProps) { + // Update redux store with route changes + if (nextProps.routeParams.flowId !== (nextProps.selectedFlow || {}).id) { + this.props.selectFlow(nextProps.routeParams.flowId); + } + if (nextProps.location.query[_actions.Query.SEARCH] !== nextProps.filter) { + this.props.setFilter(nextProps.location.query[_actions.Query.SEARCH], false); + } + if (nextProps.location.query[_actions.Query.HIGHLIGHT] !== nextProps.highlight) { + this.props.setHighlight(nextProps.location.query[_actions.Query.HIGHLIGHT], false); + } + } + + /** + * @todo move to actions + */ + + }, { + key: 'selectFlow', + value: function selectFlow(flow) { + if (flow) { + this.props.updateLocation('/flows/' + flow.id + '/' + (this.props.routeParams.detailTab || 'request')); + } else { + this.props.updateLocation('/flows'); + } + } + + /** + * @todo move to actions + */ + + }, { + key: 'selectFlowRelative', + value: function selectFlowRelative(shift) { + var _props = this.props; + var flows = _props.flows; + var routeParams = _props.routeParams; + var selectedFlow = _props.selectedFlow; + + var index = 0; + if (!routeParams.flowId) { + if (shift < 0) { + index = flows.length - 1; + } + } else { + index = Math.min(Math.max(0, flows.indexOf(selectedFlow) + shift), flows.length - 1); + } + this.selectFlow(flows[index]); + } + + /** + * @todo move to actions + */ + + }, { + key: 'onMainKeyDown', + value: function onMainKeyDown(e) { + var flow = this.props.selectedFlow; + if (e.ctrlKey) { + return; + } + switch (e.keyCode) { + case _utils.Key.K: + case _utils.Key.UP: + this.selectFlowRelative(-1); + break; + case _utils.Key.J: + case _utils.Key.DOWN: + this.selectFlowRelative(+1); + break; + case _utils.Key.SPACE: + case _utils.Key.PAGE_DOWN: + this.selectFlowRelative(+10); + break; + case _utils.Key.PAGE_UP: + this.selectFlowRelative(-10); + break; + case _utils.Key.END: + this.selectFlowRelative(+1e10); + break; + case _utils.Key.HOME: + this.selectFlowRelative(-1e10); + break; + case _utils.Key.ESC: + this.selectFlow(null); + break; + case _utils.Key.H: + case _utils.Key.LEFT: + if (this.refs.flowDetails) { + this.refs.flowDetails.nextTab(-1); + } + break; + case _utils.Key.L: + case _utils.Key.TAB: + case _utils.Key.RIGHT: + if (this.refs.flowDetails) { + this.refs.flowDetails.nextTab(+1); + } + break; + case _utils.Key.C: + if (e.shiftKey) { + _actions.FlowActions.clear(); + } + break; + case _utils.Key.D: + if (flow) { + if (e.shiftKey) { + _actions.FlowActions.duplicate(flow); + } else { + _actions.FlowActions.delete(flow); + } + } + break; + case _utils.Key.A: + if (e.shiftKey) { + _actions.FlowActions.accept_all(); + } else if (flow && flow.intercepted) { + _actions.FlowActions.accept(flow); + } + break; + case _utils.Key.R: + if (!e.shiftKey && flow) { + _actions.FlowActions.replay(flow); + } + break; + case _utils.Key.V: + if (e.shiftKey && flow && flow.modified) { + _actions.FlowActions.revert(flow); + } + break; + case _utils.Key.E: + if (this.refs.flowDetails) { + this.refs.flowDetails.promptEdit(); + } + break; + case _utils.Key.SHIFT: + break; + default: + console.debug('keydown', e.keyCode); + return; + } + e.preventDefault(); + } + }, { + key: 'render', + value: function render() { + var _this2 = this; + + var _props2 = this.props; + var flows = _props2.flows; + var selectedFlow = _props2.selectedFlow; + var highlight = _props2.highlight; + var sort = _props2.sort; + + return _react2.default.createElement( + 'div', + { className: 'main-view' }, + _react2.default.createElement(_FlowTable2.default, { + ref: 'flowTable', + flows: flows, + selected: selectedFlow, + highlight: highlight, + onSelect: function onSelect(flow) { + return _this2.selectFlow(flow); + } + }), + selectedFlow && [_react2.default.createElement(_common.Splitter, { key: 'splitter' }), _react2.default.createElement(_index2.default, { + key: 'flowDetails', + ref: 'flowDetails', + tab: this.props.routeParams.detailTab, + query: this.props.query, + updateLocation: this.props.updateLocation, + flow: selectedFlow + })] + ); + } + }]); + + return MainView; +}(_react.Component); + +MainView.propTypes = { + highlight: _react.PropTypes.string, + sort: _react.PropTypes.object +}; +exports.default = (0, _reactRedux.connect)(function (state) { + return { + flows: state.flows.view, + filter: state.flows.filter, + sort: state.flows.sort, + highlight: state.flows.highlight, + selectedFlow: state.flows.all.byId[state.flows.selected[0]] + }; +}, function (dispatch) { + return (0, _redux.bindActionCreators)({ + selectFlow: _flows.selectFlow, + setFilter: _flows.setFilter, + setHighlight: _flows.setHighlight + }, dispatch); +}, undefined, { withRef: true })(MainView); + +},{"../actions.js":2,"../ducks/flows":33,"../utils.js":41,"./FlowTable":6,"./common.js":20,"./flowview/index.js":24,"react":"react","react-redux":"react-redux","redux":"redux"}],19:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +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; }; }(); + +var _react = require("react"); + +var _react2 = _interopRequireDefault(_react); + +var _reactDom = require("react-dom"); + +var _reactDom2 = _interopRequireDefault(_reactDom); + +var _lodash = require("lodash"); + +var _lodash2 = _interopRequireDefault(_lodash); + +var _reactRedux = require("react-redux"); + +var _common = require("./common.js"); + +var _Header = require("./Header"); + +var _Header2 = _interopRequireDefault(_Header); + +var _EventLog = require("./EventLog"); + +var _EventLog2 = _interopRequireDefault(_EventLog); + +var _Footer = require("./Footer"); + +var _Footer2 = _interopRequireDefault(_Footer); + +var _store = require("../store/store.js"); + +var _utils = require("../utils.js"); + +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 ProxyAppMain = function (_Component) { + _inherits(ProxyAppMain, _Component); + + function ProxyAppMain(props, context) { + _classCallCheck(this, ProxyAppMain); + + var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(ProxyAppMain).call(this, props, context)); + + _this.settingsStore = new _store.SettingsStore(); + + // Default Settings before fetch + _lodash2.default.extend(_this.settingsStore.dict, {}); + + _this.state = { settings: _this.settingsStore.dict }; + + _this.focus = _this.focus.bind(_this); + _this.onKeyDown = _this.onKeyDown.bind(_this); + _this.updateLocation = _this.updateLocation.bind(_this); + _this.onSettingsChange = _this.onSettingsChange.bind(_this); + return _this; + } + + /** + * @todo move to actions + */ + + + _createClass(ProxyAppMain, [{ + key: "updateLocation", + value: function updateLocation(pathname, queryUpdate) { + if (pathname === undefined) { + pathname = this.props.location.pathname; + } + var query = this.props.location.query; + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = Object.keys(queryUpdate || {})[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var key = _step.value; + + query[key] = queryUpdate[key] || undefined; + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + this.context.router.replace({ pathname: pathname, query: query }); + } + + /** + * @todo pass in with props + */ + + }, { + key: "getQuery", + value: function getQuery() { + // For whatever reason, react-router always returns the same object, which makes comparing + // the current props with nextProps impossible. As a workaround, we just clone the query object. + return _lodash2.default.clone(this.props.location.query); + } + + /** + * @todo remove settings store + * @todo connect websocket here + * @todo listen to window's key events + */ + + }, { + key: "componentDidMount", + value: function componentDidMount() { + this.focus(); + this.settingsStore.addListener("recalculate", this.onSettingsChange); + } + + /** + * @todo remove settings store + * @todo disconnect websocket here + * @todo stop listening to window's key events + */ + + }, { + key: "componentWillUnmount", + value: function componentWillUnmount() { + this.settingsStore.removeListener("recalculate", this.onSettingsChange); + } + + /** + * @todo move to actions + */ + + }, { + key: "onSettingsChange", + value: function onSettingsChange() { + this.setState({ settings: this.settingsStore.dict }); + } + + /** + * @todo use props + */ + + }, { + key: "getChildContext", + value: function getChildContext() { + return { + returnFocus: this.focus, + location: this.props.location + }; + } + + /** + * @todo remove it + */ + + }, { + key: "focus", + value: function focus() { + document.activeElement.blur(); + window.getSelection().removeAllRanges(); + _reactDom2.default.findDOMNode(this).focus(); + } + + /** + * @todo move to actions + */ + + }, { + key: "onKeyDown", + value: function onKeyDown(e) { + var _this2 = this; + + var name = null; + + switch (e.keyCode) { + case _utils.Key.I: + name = "intercept"; + break; + case _utils.Key.L: + name = "search"; + break; + case _utils.Key.H: + name = "highlight"; + break; + default: + var main = this.refs.view; + if (this.refs.view.getWrappedInstance) { + main = this.refs.view.getWrappedInstance(); + } + if (main.onMainKeyDown) { + main.onMainKeyDown(e); + } + return; // don't prevent default then + } + + if (name) { + (function () { + var headerComponent = _this2.refs.header; + headerComponent.setState({ active: _Header2.default.entries.MainMenu }, function () { + headerComponent.refs.active.refs[name].select(); + }); + })(); + } + + e.preventDefault(); + } + }, { + key: "render", + value: function render() { + var _props = this.props; + var showEventLog = _props.showEventLog; + var location = _props.location; + var children = _props.children; + var settings = this.state.settings; + + var query = this.getQuery(); + return _react2.default.createElement( + "div", + { id: "container", tabIndex: "0", onKeyDown: this.onKeyDown }, + _react2.default.createElement(_Header2.default, { ref: "header", settings: settings, updateLocation: this.updateLocation, query: query }), + _react2.default.cloneElement(children, { ref: "view", location: location, query: query, updateLocation: this.updateLocation }), + showEventLog && [_react2.default.createElement(_common.Splitter, { key: "splitter", axis: "y" }), _react2.default.createElement(_EventLog2.default, { key: "eventlog" })], + _react2.default.createElement(_Footer2.default, { settings: settings }) + ); + } + }]); + + return ProxyAppMain; +}(_react.Component); + +ProxyAppMain.childContextTypes = { + returnFocus: _react.PropTypes.func.isRequired, + location: _react.PropTypes.object.isRequired +}; +ProxyAppMain.contextTypes = { + router: _react.PropTypes.object.isRequired +}; +exports.default = (0, _reactRedux.connect)(function (state) { + return { + showEventLog: state.eventLog.visible + }; +})(ProxyAppMain); + +},{"../store/store.js":40,"../utils.js":41,"./EventLog":4,"./Footer":10,"./Header":11,"./common.js":20,"lodash":"lodash","react":"react","react-dom":"react-dom","react-redux":"react-redux"}],20:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.ToggleInputButton = exports.ToggleButton = exports.Splitter = 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; }; }(); + +var _react = require("react"); + +var _react2 = _interopRequireDefault(_react); + +var _reactDom = require("react-dom"); + +var _reactDom2 = _interopRequireDefault(_reactDom); + +var _utils = require("../utils.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"); } } + +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 Splitter = exports.Splitter = _react2.default.createClass({ + displayName: "Splitter", + + getDefaultProps: function getDefaultProps() { + return { + axis: "x" + }; + }, + getInitialState: function getInitialState() { + return { + applied: false, + startX: false, + startY: false + }; + }, + onMouseDown: function onMouseDown(e) { + this.setState({ + startX: e.pageX, + startY: e.pageY + }); + window.addEventListener("mousemove", this.onMouseMove); + window.addEventListener("mouseup", this.onMouseUp); + // Occasionally, only a dragEnd event is triggered, but no mouseUp. + window.addEventListener("dragend", this.onDragEnd); + }, + onDragEnd: function onDragEnd() { + _reactDom2.default.findDOMNode(this).style.transform = ""; + window.removeEventListener("dragend", this.onDragEnd); + window.removeEventListener("mouseup", this.onMouseUp); + window.removeEventListener("mousemove", this.onMouseMove); + }, + onMouseUp: function onMouseUp(e) { + this.onDragEnd(); + + var node = _reactDom2.default.findDOMNode(this); + var prev = node.previousElementSibling; + var next = node.nextElementSibling; + + var dX = e.pageX - this.state.startX; + var dY = e.pageY - this.state.startY; + var flexBasis; + if (this.props.axis === "x") { + flexBasis = prev.offsetWidth + dX; + } else { + flexBasis = prev.offsetHeight + dY; + } + + prev.style.flex = "0 0 " + Math.max(0, flexBasis) + "px"; + next.style.flex = "1 1 auto"; + + this.setState({ + applied: true + }); + this.onResize(); + }, + onMouseMove: function onMouseMove(e) { + var dX = 0, + dY = 0; + if (this.props.axis === "x") { + dX = e.pageX - this.state.startX; + } else { + dY = e.pageY - this.state.startY; + } + _reactDom2.default.findDOMNode(this).style.transform = "translate(" + dX + "px," + dY + "px)"; + }, + onResize: function onResize() { + // Trigger a global resize event. This notifies components that employ virtual scrolling + // that their viewport may have changed. + window.setTimeout(function () { + window.dispatchEvent(new CustomEvent("resize")); + }, 1); + }, + reset: function reset(willUnmount) { + if (!this.state.applied) { + return; + } + var node = _reactDom2.default.findDOMNode(this); + var prev = node.previousElementSibling; + var next = node.nextElementSibling; + + prev.style.flex = ""; + next.style.flex = ""; + + if (!willUnmount) { + this.setState({ + applied: false + }); + } + this.onResize(); + }, + componentWillUnmount: function componentWillUnmount() { + this.reset(true); + }, + render: function render() { + var className = "splitter"; + if (this.props.axis === "x") { + className += " splitter-x"; + } else { + className += " splitter-y"; + } + return _react2.default.createElement( + "div", + { className: className }, + _react2.default.createElement("div", { onMouseDown: this.onMouseDown, draggable: "true" }) + ); + } +}); + +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: "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 = { + 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) { + _inherits(ToggleInputButton, _React$Component); + + function ToggleInputButton(props) { + _classCallCheck(this, ToggleInputButton); + + var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(ToggleInputButton).call(this, props)); + + _this.state = { txt: props.txt }; + return _this; + } + + _createClass(ToggleInputButton, [{ + key: "render", + value: function render() { + var _this2 = this; + + return _react2.default.createElement( + "div", + { className: "input-group toggle-input-btn" }, + _react2.default.createElement( + "span", + { + className: "input-group-btn", + onClick: function onClick() { + return _this2.props.onToggleChanged(_this2.state.txt); + } }, + _react2.default.createElement( + "div", + { className: "btn " + (this.props.checked ? "btn-primary" : "btn-default") }, + _react2.default.createElement("span", { className: "fa " + (this.props.checked ? "fa-check-square-o" : "fa-square-o") }), + " ", + this.props.name + ) + ), + _react2.default.createElement("input", { + className: "form-control", + placeholder: this.props.placeholder, + disabled: this.props.checked, + value: this.state.txt, + type: this.props.inputType, + onChange: function onChange(e) { + return _this2.setState({ txt: e.target.value }); + }, + onKeyDown: function onKeyDown(e) { + if (e.keyCode === _utils.Key.ENTER) _this2.props.onToggleChanged(_this2.state.txt);e.stopPropagation(); + } }) + ); + } + }]); + + return ToggleInputButton; +}(_react2.default.Component); + +ToggleInputButton.propTypes = { + name: _react2.default.PropTypes.string.isRequired, + txt: _react2.default.PropTypes.string.isRequired, + onToggleChanged: _react2.default.PropTypes.func.isRequired +}; + +},{"../utils.js":41,"lodash":"lodash","react":"react","react-dom":"react-dom"}],21:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.ValueEditor = undefined; + +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 _react = require("react"); + +var _react2 = _interopRequireDefault(_react); + +var _reactDom = require("react-dom"); + +var _reactDom2 = _interopRequireDefault(_reactDom); + +var _utils = require("../utils.js"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var contentToHtml = function contentToHtml(content) { + return _.escape(content); +}; +var nodeToContent = function nodeToContent(node) { + return node.textContent; +}; + +/* + Basic Editor Functionality + */ +var EditorBase = _react2.default.createClass({ + displayName: "EditorBase", + + propTypes: { + content: _react2.default.PropTypes.string.isRequired, + onDone: _react2.default.PropTypes.func.isRequired, + contentToHtml: _react2.default.PropTypes.func, + nodeToContent: _react2.default.PropTypes.func, // content === nodeToContent( Node ) + onStop: _react2.default.PropTypes.func, + submitOnEnter: _react2.default.PropTypes.bool, + className: _react2.default.PropTypes.string, + tag: _react2.default.PropTypes.string + }, + getDefaultProps: function getDefaultProps() { + return { + contentToHtml: contentToHtml, + nodeToContent: nodeToContent, + submitOnEnter: true, + className: "", + tag: "div" + }; + }, + getInitialState: function getInitialState() { + return { + editable: false + }; + }, + render: function render() { + var className = "inline-input " + this.props.className; + var html = { __html: this.props.contentToHtml(this.props.content) }; + var Tag = this.props.tag; + return _react2.default.createElement(Tag, _extends({}, this.props, { + tabIndex: "0", + className: className, + contentEditable: this.state.editable || undefined // workaround: use undef instead of false to remove attr + , onFocus: this.onFocus, + onMouseDown: this.onMouseDown, + onClick: this.onClick, + onBlur: this._stop, + onKeyDown: this.onKeyDown, + onInput: this.onInput, + onPaste: this.onPaste, + dangerouslySetInnerHTML: html + })); + }, + onPaste: function onPaste(e) { + e.preventDefault(); + var content = e.clipboardData.getData("text/plain"); + document.execCommand("insertHTML", false, content); + }, + onMouseDown: function onMouseDown(e) { + this._mouseDown = true; + window.addEventListener("mouseup", this.onMouseUp); + this.props.onMouseDown && this.props.onMouseDown(e); + }, + onMouseUp: function onMouseUp() { + if (this._mouseDown) { + this._mouseDown = false; + window.removeEventListener("mouseup", this.onMouseUp); + } + }, + onClick: function onClick(e) { + this.onMouseUp(); + this.onFocus(e); + }, + onFocus: function onFocus(e) { + console.log("onFocus", this._mouseDown, this._ignore_events, this.state.editable); + if (this._mouseDown || this._ignore_events || this.state.editable) { + return; + } + + //contenteditable in FireFox is more or less broken. + // - we need to blur() and then focus(), otherwise the caret is not shown. + // - blur() + focus() == we need to save the caret position before + // Firefox sometimes just doesn't set a caret position => use caretPositionFromPoint + var sel = window.getSelection(); + var range; + if (sel.rangeCount > 0) { + range = sel.getRangeAt(0); + } else if (document.caretPositionFromPoint && e.clientX && e.clientY) { + var pos = document.caretPositionFromPoint(e.clientX, e.clientY); + range = document.createRange(); + range.setStart(pos.offsetNode, pos.offset); + } else if (document.caretRangeFromPoint && e.clientX && e.clientY) { + range = document.caretRangeFromPoint(e.clientX, e.clientY); + } else { + range = document.createRange(); + range.selectNodeContents(_reactDom2.default.findDOMNode(this)); + } + + this._ignore_events = true; + this.setState({ editable: true }, function () { + var node = _reactDom2.default.findDOMNode(this); + node.blur(); + node.focus(); + this._ignore_events = false; + //sel.removeAllRanges(); + //sel.addRange(range); + }); + }, + stop: function stop() { + // a stop would cause a blur as a side-effect. + // but a blur event must trigger a stop as well. + // to fix this, make stop = blur and do the actual stop in the onBlur handler. + _reactDom2.default.findDOMNode(this).blur(); + this.props.onStop && this.props.onStop(); + }, + _stop: function _stop(e) { + if (this._ignore_events) { + return; + } + console.log("_stop", _.extend({}, e)); + window.getSelection().removeAllRanges(); //make sure that selection is cleared on blur + var node = _reactDom2.default.findDOMNode(this); + var content = this.props.nodeToContent(node); + this.setState({ editable: false }); + this.props.onDone(content); + this.props.onBlur && this.props.onBlur(e); + }, + reset: function reset() { + _reactDom2.default.findDOMNode(this).innerHTML = this.props.contentToHtml(this.props.content); + }, + onKeyDown: function onKeyDown(e) { + e.stopPropagation(); + switch (e.keyCode) { + case _utils.Key.ESC: + e.preventDefault(); + this.reset(); + this.stop(); + break; + case _utils.Key.ENTER: + if (this.props.submitOnEnter && !e.shiftKey) { + e.preventDefault(); + this.stop(); + } + break; + default: + break; + } + }, + onInput: function onInput() { + var node = _reactDom2.default.findDOMNode(this); + var content = this.props.nodeToContent(node); + this.props.onInput && this.props.onInput(content); + } +}); + +/* + Add Validation to EditorBase + */ +var ValidateEditor = _react2.default.createClass({ + displayName: "ValidateEditor", + + propTypes: { + content: _react2.default.PropTypes.string.isRequired, + onDone: _react2.default.PropTypes.func.isRequired, + onInput: _react2.default.PropTypes.func, + isValid: _react2.default.PropTypes.func, + className: _react2.default.PropTypes.string + }, + getInitialState: function getInitialState() { + return { + currentContent: this.props.content + }; + }, + componentWillReceiveProps: function componentWillReceiveProps() { + this.setState({ currentContent: this.props.content }); + }, + onInput: function onInput(content) { + this.setState({ currentContent: content }); + this.props.onInput && this.props.onInput(content); + }, + render: function render() { + var className = this.props.className || ""; + if (this.props.isValid) { + if (this.props.isValid(this.state.currentContent)) { + className += " has-success"; + } else { + className += " has-warning"; + } + } + return _react2.default.createElement(EditorBase, _extends({}, this.props, { + ref: "editor", + className: className, + onDone: this.onDone, + onInput: this.onInput + })); + }, + onDone: function onDone(content) { + if (this.props.isValid && !this.props.isValid(content)) { + this.refs.editor.reset(); + content = this.props.content; + } + this.props.onDone(content); + } +}); + +/* + Text Editor with mitmweb-specific convenience features + */ +var ValueEditor = exports.ValueEditor = _react2.default.createClass({ + displayName: "ValueEditor", + + contextTypes: { + returnFocus: _react2.default.PropTypes.func + }, + propTypes: { + content: _react2.default.PropTypes.string.isRequired, + onDone: _react2.default.PropTypes.func.isRequired, + inline: _react2.default.PropTypes.bool + }, + render: function render() { + var tag = this.props.inline ? "span" : "div"; + return _react2.default.createElement(ValidateEditor, _extends({}, this.props, { + onStop: this.onStop, + tag: tag + })); + }, + focus: function focus() { + _reactDom2.default.findDOMNode(this).focus(); + }, + onStop: function onStop() { + this.context.returnFocus(); + } +}); + +},{"../utils.js":41,"react":"react","react-dom":"react-dom"}],22:[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 _react = require("react"); + +var _react2 = _interopRequireDefault(_react); + +var _lodash = require("lodash"); + +var _lodash2 = _interopRequireDefault(_lodash); + +var _utils = require("../../flow/utils.js"); + +var _utils2 = require("../../utils.js"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var ViewImage = _react2.default.createClass({ + displayName: "ViewImage", + + propTypes: { + flow: _react2.default.PropTypes.object.isRequired, + message: _react2.default.PropTypes.object.isRequired + }, + statics: { + regex: /^image\/(png|jpe?g|gif|vnc.microsoft.icon|x-icon)$/i, + matches: function matches(message) { + return ViewImage.regex.test(_utils.MessageUtils.getContentType(message)); + } + }, + render: function render() { + var url = _utils.MessageUtils.getContentURL(this.props.flow, this.props.message); + return _react2.default.createElement( + "div", + { className: "flowview-image" }, + _react2.default.createElement("img", { src: url, alt: "preview", className: "img-thumbnail" }) + ); + } +}); + +var ContentLoader = _react2.default.createClass({ + displayName: "ContentLoader", + + propTypes: { + flow: _react2.default.PropTypes.object.isRequired, + message: _react2.default.PropTypes.object.isRequired + }, + getInitialState: function getInitialState() { + return { + content: undefined, + request: undefined + }; + }, + requestContent: function requestContent(nextProps) { + if (this.state.request) { + this.state.request.abort(); + } + var request = _utils.MessageUtils.getContent(nextProps.flow, nextProps.message); + this.setState({ + content: undefined, + request: request + }); + request.done(function (data) { + this.setState({ content: data }); + }.bind(this)).fail(function (jqXHR, textStatus, errorThrown) { + if (textStatus === "abort") { + return; + } + this.setState({ content: "AJAX Error: " + textStatus + "\r\n" + errorThrown }); + }.bind(this)).always(function () { + this.setState({ request: undefined }); + }.bind(this)); + }, + componentWillMount: function componentWillMount() { + this.requestContent(this.props); + }, + componentWillReceiveProps: function componentWillReceiveProps(nextProps) { + if (nextProps.message !== this.props.message) { + this.requestContent(nextProps); + } + }, + componentWillUnmount: function componentWillUnmount() { + if (this.state.request) { + this.state.request.abort(); + } + }, + render: function render() { + if (!this.state.content) { + return _react2.default.createElement( + "div", + { className: "text-center" }, + _react2.default.createElement("i", { className: "fa fa-spinner fa-spin" }) + ); + } + return _react2.default.cloneElement(this.props.children, { + content: this.state.content + }); + } +}); + +var ViewRaw = _react2.default.createClass({ + displayName: "ViewRaw", + + propTypes: { + content: _react2.default.PropTypes.string.isRequired + }, + statics: { + textView: true, + matches: function matches(message) { + return true; + } + }, + render: function render() { + return _react2.default.createElement( + "pre", + null, + this.props.content + ); + } +}); + +var ViewJSON = _react2.default.createClass({ + displayName: "ViewJSON", + + propTypes: { + content: _react2.default.PropTypes.string.isRequired + }, + statics: { + textView: true, + regex: /^application\/json$/i, + matches: function matches(message) { + return ViewJSON.regex.test(_utils.MessageUtils.getContentType(message)); + } + }, + render: function render() { + var json = this.props.content; + try { + json = JSON.stringify(JSON.parse(json), null, 2); + } catch (e) { + // @noop + } + return _react2.default.createElement( + "pre", + null, + json + ); + } +}); + +var ViewAuto = _react2.default.createClass({ + displayName: "ViewAuto", + + propTypes: { + message: _react2.default.PropTypes.object.isRequired, + flow: _react2.default.PropTypes.object.isRequired + }, + statics: { + matches: function matches() { + return false; // don't match itself + }, + findView: function findView(message) { + for (var i = 0; i < all.length; i++) { + if (all[i].matches(message)) { + return all[i]; + } + } + return all[all.length - 1]; + } + }, + render: function render() { + var _props = this.props; + var message = _props.message; + var flow = _props.flow; + + var View = ViewAuto.findView(this.props.message); + if (View.textView) { + return _react2.default.createElement( + ContentLoader, + { message: message, flow: flow }, + _react2.default.createElement(View, { content: "" }) + ); + } else { + return _react2.default.createElement(View, { message: message, flow: flow }); + } + } +}); + +var all = [ViewAuto, ViewImage, ViewJSON, ViewRaw]; + +var ContentEmpty = _react2.default.createClass({ + displayName: "ContentEmpty", + + render: function render() { + var message_name = this.props.flow.request === this.props.message ? "request" : "response"; + return _react2.default.createElement( + "div", + { className: "alert alert-info" }, + "No ", + message_name, + " content." + ); + } +}); + +var ContentMissing = _react2.default.createClass({ + displayName: "ContentMissing", + + render: function render() { + var message_name = this.props.flow.request === this.props.message ? "Request" : "Response"; + return _react2.default.createElement( + "div", + { className: "alert alert-info" }, + message_name, + " content missing." + ); + } +}); + +var TooLarge = _react2.default.createClass({ + displayName: "TooLarge", + + statics: { + isTooLarge: function isTooLarge(message) { + var max_mb = ViewImage.matches(message) ? 10 : 0.2; + return message.contentLength > 1024 * 1024 * max_mb; + } + }, + render: function render() { + var size = (0, _utils2.formatSize)(this.props.message.contentLength); + return _react2.default.createElement( + "div", + { className: "alert alert-warning" }, + _react2.default.createElement( + "button", + { onClick: this.props.onClick, className: "btn btn-xs btn-warning pull-right" }, + "Display anyway" + ), + size, + " content size." + ); + } +}); + +var ViewSelector = _react2.default.createClass({ + displayName: "ViewSelector", + + render: function render() { + var views = []; + for (var i = 0; i < all.length; i++) { + var view = all[i]; + var className = "btn btn-default"; + if (view === this.props.active) { + className += " active"; + } + var text; + if (view === ViewAuto) { + text = "auto: " + ViewAuto.findView(this.props.message).displayName.toLowerCase().replace("view", ""); + } else { + text = view.displayName.toLowerCase().replace("view", ""); + } + views.push(_react2.default.createElement( + "button", + { + key: view.displayName, + onClick: this.props.selectView.bind(null, view), + className: className }, + text + )); + } + + return _react2.default.createElement( + "div", + { className: "view-selector btn-group btn-group-xs" }, + views + ); + } +}); + +var ContentView = _react2.default.createClass({ + displayName: "ContentView", + + getInitialState: function getInitialState() { + return { + displayLarge: false, + View: ViewAuto + }; + }, + propTypes: { + // It may seem a bit weird at the first glance: + // Every view takes the flow and the message as props, e.g. + // + flow: _react2.default.PropTypes.object.isRequired, + message: _react2.default.PropTypes.object.isRequired + }, + selectView: function selectView(view) { + this.setState({ + View: view + }); + }, + displayLarge: function displayLarge() { + this.setState({ displayLarge: true }); + }, + componentWillReceiveProps: function componentWillReceiveProps(nextProps) { + if (nextProps.message !== this.props.message) { + this.setState(this.getInitialState()); + } + }, + render: function render() { + var _props2 = this.props; + var flow = _props2.flow; + var message = _props2.message; + + var message = this.props.message; + if (message.contentLength === 0) { + return _react2.default.createElement(ContentEmpty, this.props); + } else if (message.contentLength === null) { + return _react2.default.createElement(ContentMissing, this.props); + } else if (!this.state.displayLarge && TooLarge.isTooLarge(message)) { + return _react2.default.createElement(TooLarge, _extends({}, this.props, { onClick: this.displayLarge })); + } + + var downloadUrl = _utils.MessageUtils.getContentURL(this.props.flow, message); + + return _react2.default.createElement( + "div", + null, + this.state.View.textView ? _react2.default.createElement( + ContentLoader, + { flow: flow, message: message }, + _react2.default.createElement(this.state.View, { content: "" }) + ) : _react2.default.createElement(this.state.View, { flow: flow, message: message }), + _react2.default.createElement( + "div", + { className: "view-options text-center" }, + _react2.default.createElement(ViewSelector, { selectView: this.selectView, active: this.state.View, message: message }), + " ", + _react2.default.createElement( + "a", + { className: "btn btn-default btn-xs", href: downloadUrl }, + _react2.default.createElement("i", { className: "fa fa-download" }) + ) + ) + ); + } +}); + +exports.default = ContentView; + +},{"../../flow/utils.js":39,"../../utils.js":41,"lodash":"lodash","react":"react"}],23:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _react = require("react"); + +var _react2 = _interopRequireDefault(_react); + +var _lodash = require("lodash"); + +var _lodash2 = _interopRequireDefault(_lodash); + +var _utils = require("../../utils.js"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var TimeStamp = _react2.default.createClass({ + displayName: "TimeStamp", + + render: function render() { + + if (!this.props.t) { + //should be return null, but that triggers a React bug. + return _react2.default.createElement("tr", null); + } + + var ts = (0, _utils.formatTimeStamp)(this.props.t); + + var delta; + if (this.props.deltaTo) { + delta = (0, _utils.formatTimeDelta)(1000 * (this.props.t - this.props.deltaTo)); + delta = _react2.default.createElement( + "span", + { className: "text-muted" }, + "(" + delta + ")" + ); + } else { + delta = null; + } + + return _react2.default.createElement( + "tr", + null, + _react2.default.createElement( + "td", + null, + this.props.title + ":" + ), + _react2.default.createElement( + "td", + null, + ts, + " ", + delta + ) + ); + } +}); + +var ConnectionInfo = _react2.default.createClass({ + displayName: "ConnectionInfo", + + + render: function render() { + var conn = this.props.conn; + var address = conn.address.address.join(":"); + + var sni = _react2.default.createElement("tr", { key: "sni" }); //should be null, but that triggers a React bug. + if (conn.sni) { + sni = _react2.default.createElement( + "tr", + { key: "sni" }, + _react2.default.createElement( + "td", + null, + _react2.default.createElement( + "abbr", + { title: "TLS Server Name Indication" }, + "TLS SNI:" + ) + ), + _react2.default.createElement( + "td", + null, + conn.sni + ) + ); + } + return _react2.default.createElement( + "table", + { className: "connection-table" }, + _react2.default.createElement( + "tbody", + null, + _react2.default.createElement( + "tr", + { key: "address" }, + _react2.default.createElement( + "td", + null, + "Address:" + ), + _react2.default.createElement( + "td", + null, + address + ) + ), + sni + ) + ); + } +}); + +var CertificateInfo = _react2.default.createClass({ + displayName: "CertificateInfo", + + render: function render() { + //TODO: We should fetch human-readable certificate representation + // from the server + var flow = this.props.flow; + var client_conn = flow.client_conn; + var server_conn = flow.server_conn; + + var preStyle = { maxHeight: 100 }; + return _react2.default.createElement( + "div", + null, + client_conn.cert ? _react2.default.createElement( + "h4", + null, + "Client Certificate" + ) : null, + client_conn.cert ? _react2.default.createElement( + "pre", + { style: preStyle }, + client_conn.cert + ) : null, + server_conn.cert ? _react2.default.createElement( + "h4", + null, + "Server Certificate" + ) : null, + server_conn.cert ? _react2.default.createElement( + "pre", + { style: preStyle }, + server_conn.cert + ) : null + ); + } +}); + +var Timing = _react2.default.createClass({ + displayName: "Timing", + + render: function render() { + var flow = this.props.flow; + var sc = flow.server_conn; + var cc = flow.client_conn; + var req = flow.request; + var resp = flow.response; + + var timestamps = [{ + title: "Server conn. initiated", + t: sc.timestamp_start, + deltaTo: req.timestamp_start + }, { + title: "Server conn. TCP handshake", + t: sc.timestamp_tcp_setup, + deltaTo: req.timestamp_start + }, { + title: "Server conn. SSL handshake", + t: sc.timestamp_ssl_setup, + deltaTo: req.timestamp_start + }, { + title: "Client conn. established", + t: cc.timestamp_start, + deltaTo: req.timestamp_start + }, { + title: "Client conn. SSL handshake", + t: cc.timestamp_ssl_setup, + deltaTo: req.timestamp_start + }, { + title: "First request byte", + t: req.timestamp_start + }, { + title: "Request complete", + t: req.timestamp_end, + deltaTo: req.timestamp_start + }]; + + if (flow.response) { + timestamps.push({ + title: "First response byte", + t: resp.timestamp_start, + deltaTo: req.timestamp_start + }, { + title: "Response complete", + t: resp.timestamp_end, + deltaTo: req.timestamp_start + }); + } + + //Add unique key for each row. + timestamps.forEach(function (e) { + e.key = e.title; + }); + + timestamps = _lodash2.default.sortBy(timestamps, 't'); + + var rows = timestamps.map(function (e) { + return _react2.default.createElement(TimeStamp, e); + }); + + return _react2.default.createElement( + "div", + null, + _react2.default.createElement( + "h4", + null, + "Timing" + ), + _react2.default.createElement( + "table", + { className: "timing-table" }, + _react2.default.createElement( + "tbody", + null, + rows + ) + ) + ); + } +}); + +var Details = _react2.default.createClass({ + displayName: "Details", + + render: function render() { + var flow = this.props.flow; + var client_conn = flow.client_conn; + var server_conn = flow.server_conn; + return _react2.default.createElement( + "section", + null, + _react2.default.createElement( + "h4", + null, + "Client Connection" + ), + _react2.default.createElement(ConnectionInfo, { conn: client_conn }), + _react2.default.createElement( + "h4", + null, + "Server Connection" + ), + _react2.default.createElement(ConnectionInfo, { conn: server_conn }), + _react2.default.createElement(CertificateInfo, { flow: flow }), + _react2.default.createElement(Timing, { flow: flow }) + ); + } +}); + +exports.default = Details; + +},{"../../utils.js":41,"lodash":"lodash","react":"react"}],24:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _react = require("react"); + +var _react2 = _interopRequireDefault(_react); + +var _nav = require("./nav.js"); + +var _nav2 = _interopRequireDefault(_nav); + +var _messages = require("./messages.js"); + +var _details = require("./details.js"); + +var _details2 = _interopRequireDefault(_details); + +var _prompt = require("../prompt.js"); + +var _prompt2 = _interopRequireDefault(_prompt); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var allTabs = { + request: _messages.Request, + response: _messages.Response, + error: _messages.Error, + details: _details2.default +}; + +var FlowView = _react2.default.createClass({ + displayName: "FlowView", + + getInitialState: function getInitialState() { + return { + prompt: false + }; + }, + getTabs: function getTabs(flow) { + var tabs = []; + ["request", "response", "error"].forEach(function (e) { + if (flow[e]) { + tabs.push(e); + } + }); + tabs.push("details"); + return tabs; + }, + nextTab: function nextTab(i) { + var tabs = this.getTabs(this.props.flow); + var currentIndex = tabs.indexOf(this.props.tab); + // JS modulo operator doesn't correct negative numbers, make sure that we are positive. + var nextIndex = (currentIndex + i + tabs.length) % tabs.length; + this.selectTab(tabs[nextIndex]); + }, + selectTab: function selectTab(panel) { + this.props.updateLocation("/flows/" + this.props.flow.id + "/" + panel); + }, + promptEdit: function promptEdit() { + var options; + switch (this.props.tab) { + case "request": + options = ["method", "url", { text: "http version", key: "v" }, "header" + /*, "content"*/]; + break; + case "response": + options = [{ text: "http version", key: "v" }, "code", "message", "header" + /*, "content"*/]; + break; + case "details": + return; + default: + throw "Unknown tab for edit: " + this.props.tab; + } + + this.setState({ + prompt: { + done: function (k) { + this.setState({ prompt: false }); + if (k) { + this.refs.tab.edit(k); + } + }.bind(this), + options: options + } + }); + }, + render: function render() { + var flow = this.props.flow; + var tabs = this.getTabs(flow); + var active = this.props.tab; + + if (tabs.indexOf(active) < 0) { + if (active === "response" && flow.error) { + active = "error"; + } else if (active === "error" && flow.response) { + active = "response"; + } else { + active = tabs[0]; + } + } + + var prompt = null; + if (this.state.prompt) { + prompt = _react2.default.createElement(_prompt2.default, this.state.prompt); + } + + var Tab = allTabs[active]; + return _react2.default.createElement( + "div", + { className: "flow-detail", onScroll: this.adjustHead }, + _react2.default.createElement(_nav2.default, { ref: "head", + flow: flow, + tabs: tabs, + active: active, + selectTab: this.selectTab }), + _react2.default.createElement(Tab, { ref: "tab", flow: flow }), + prompt + ); + } +}); + +exports.default = FlowView; + +},{"../prompt.js":29,"./details.js":23,"./messages.js":25,"./nav.js":26,"react":"react"}],25:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.Error = exports.Response = exports.Request = undefined; + +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 _react = require("react"); + +var _react2 = _interopRequireDefault(_react); + +var _reactDom = require("react-dom"); + +var _reactDom2 = _interopRequireDefault(_reactDom); + +var _lodash = require("lodash"); + +var _lodash2 = _interopRequireDefault(_lodash); + +var _actions = require("../../actions.js"); + +var _utils = require("../../flow/utils.js"); + +var _utils2 = require("../../utils.js"); + +var _contentview = require("./contentview.js"); + +var _contentview2 = _interopRequireDefault(_contentview); + +var _editor = require("../editor.js"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var Headers = _react2.default.createClass({ + displayName: "Headers", + + propTypes: { + onChange: _react2.default.PropTypes.func.isRequired, + message: _react2.default.PropTypes.object.isRequired + }, + onChange: function onChange(row, col, val) { + var nextHeaders = _lodash2.default.cloneDeep(this.props.message.headers); + nextHeaders[row][col] = val; + if (!nextHeaders[row][0] && !nextHeaders[row][1]) { + // do not delete last row + if (nextHeaders.length === 1) { + nextHeaders[0][0] = "Name"; + nextHeaders[0][1] = "Value"; + } else { + nextHeaders.splice(row, 1); + // manually move selection target if this has been the last row. + if (row === nextHeaders.length) { + this._nextSel = row - 1 + "-value"; + } + } + } + this.props.onChange(nextHeaders); + }, + edit: function edit() { + this.refs["0-key"].focus(); + }, + onTab: function onTab(row, col, e) { + var headers = this.props.message.headers; + if (row === headers.length - 1 && col === 1) { + e.preventDefault(); + + var nextHeaders = _lodash2.default.cloneDeep(this.props.message.headers); + nextHeaders.push(["Name", "Value"]); + this.props.onChange(nextHeaders); + this._nextSel = row + 1 + "-key"; + } + }, + componentDidUpdate: function componentDidUpdate() { + if (this._nextSel && this.refs[this._nextSel]) { + this.refs[this._nextSel].focus(); + this._nextSel = undefined; + } + }, + onRemove: function onRemove(row, col, e) { + if (col === 1) { + e.preventDefault(); + this.refs[row + "-key"].focus(); + } else if (row > 0) { + e.preventDefault(); + this.refs[row - 1 + "-value"].focus(); + } + }, + render: function render() { + + var rows = this.props.message.headers.map(function (header, i) { + + var kEdit = _react2.default.createElement(HeaderEditor, { + ref: i + "-key", + content: header[0], + onDone: this.onChange.bind(null, i, 0), + onRemove: this.onRemove.bind(null, i, 0), + onTab: this.onTab.bind(null, i, 0) }); + var vEdit = _react2.default.createElement(HeaderEditor, { + ref: i + "-value", + content: header[1], + onDone: this.onChange.bind(null, i, 1), + onRemove: this.onRemove.bind(null, i, 1), + onTab: this.onTab.bind(null, i, 1) }); + return _react2.default.createElement( + "tr", + { key: i }, + _react2.default.createElement( + "td", + { className: "header-name" }, + kEdit, + ":" + ), + _react2.default.createElement( + "td", + { className: "header-value" }, + vEdit + ) + ); + }.bind(this)); + return _react2.default.createElement( + "table", + { className: "header-table" }, + _react2.default.createElement( + "tbody", + null, + rows + ) + ); + } +}); + +var HeaderEditor = _react2.default.createClass({ + displayName: "HeaderEditor", + + render: function render() { + return _react2.default.createElement(_editor.ValueEditor, _extends({ ref: "input" }, this.props, { onKeyDown: this.onKeyDown, inline: true })); + }, + focus: function focus() { + _reactDom2.default.findDOMNode(this).focus(); + }, + onKeyDown: function onKeyDown(e) { + switch (e.keyCode) { + case _utils2.Key.BACKSPACE: + var s = window.getSelection().getRangeAt(0); + if (s.startOffset === 0 && s.endOffset === 0) { + this.props.onRemove(e); + } + break; + case _utils2.Key.TAB: + if (!e.shiftKey) { + this.props.onTab(e); + } + break; + } + } +}); + +var RequestLine = _react2.default.createClass({ + displayName: "RequestLine", + + render: function render() { + var flow = this.props.flow; + var url = _utils.RequestUtils.pretty_url(flow.request); + var httpver = flow.request.http_version; + + return _react2.default.createElement( + "div", + { className: "first-line request-line" }, + _react2.default.createElement(_editor.ValueEditor, { + ref: "method", + content: flow.request.method, + onDone: this.onMethodChange, + inline: true }), + " ", + _react2.default.createElement(_editor.ValueEditor, { + ref: "url", + content: url, + onDone: this.onUrlChange, + isValid: this.isValidUrl, + inline: true }), + " ", + _react2.default.createElement(_editor.ValueEditor, { + ref: "httpVersion", + content: httpver, + onDone: this.onHttpVersionChange, + isValid: _utils.isValidHttpVersion, + inline: true }) + ); + }, + isValidUrl: function isValidUrl(url) { + var u = (0, _utils.parseUrl)(url); + return !!u.host; + }, + onMethodChange: function onMethodChange(nextMethod) { + _actions.FlowActions.update(this.props.flow, { request: { method: nextMethod } }); + }, + onUrlChange: function onUrlChange(nextUrl) { + var props = (0, _utils.parseUrl)(nextUrl); + props.path = props.path || ""; + _actions.FlowActions.update(this.props.flow, { request: props }); + }, + onHttpVersionChange: function onHttpVersionChange(nextVer) { + var ver = (0, _utils.parseHttpVersion)(nextVer); + _actions.FlowActions.update(this.props.flow, { request: { http_version: ver } }); + } +}); + +var ResponseLine = _react2.default.createClass({ + displayName: "ResponseLine", + + render: function render() { + var flow = this.props.flow; + var httpver = flow.response.http_version; + return _react2.default.createElement( + "div", + { className: "first-line response-line" }, + _react2.default.createElement(_editor.ValueEditor, { + ref: "httpVersion", + content: httpver, + onDone: this.onHttpVersionChange, + isValid: _utils.isValidHttpVersion, + inline: true }), + " ", + _react2.default.createElement(_editor.ValueEditor, { + ref: "code", + content: flow.response.status_code + "", + onDone: this.onCodeChange, + isValid: this.isValidCode, + inline: true }), + " ", + _react2.default.createElement(_editor.ValueEditor, { + ref: "msg", + content: flow.response.reason, + onDone: this.onMsgChange, + inline: true }) + ); + }, + isValidCode: function isValidCode(code) { + return (/^\d+$/.test(code) + ); + }, + onHttpVersionChange: function onHttpVersionChange(nextVer) { + var ver = (0, _utils.parseHttpVersion)(nextVer); + _actions.FlowActions.update(this.props.flow, { response: { http_version: ver } }); + }, + onMsgChange: function onMsgChange(nextMsg) { + _actions.FlowActions.update(this.props.flow, { response: { msg: nextMsg } }); + }, + onCodeChange: function onCodeChange(nextCode) { + nextCode = parseInt(nextCode); + _actions.FlowActions.update(this.props.flow, { response: { code: nextCode } }); + } +}); + +var Request = exports.Request = _react2.default.createClass({ + displayName: "Request", + + render: function render() { + var flow = this.props.flow; + return _react2.default.createElement( + "section", + { className: "request" }, + _react2.default.createElement(RequestLine, { ref: "requestLine", flow: flow }), + _react2.default.createElement(Headers, { ref: "headers", message: flow.request, onChange: this.onHeaderChange }), + _react2.default.createElement("hr", null), + _react2.default.createElement(_contentview2.default, { flow: flow, message: flow.request }) + ); + }, + edit: function edit(k) { + switch (k) { + case "m": + this.refs.requestLine.refs.method.focus(); + break; + case "u": + this.refs.requestLine.refs.url.focus(); + break; + case "v": + this.refs.requestLine.refs.httpVersion.focus(); + break; + case "h": + this.refs.headers.edit(); + break; + default: + throw "Unimplemented: " + k; + } + }, + onHeaderChange: function onHeaderChange(nextHeaders) { + _actions.FlowActions.update(this.props.flow, { + request: { + headers: nextHeaders + } + }); + } +}); + +var Response = exports.Response = _react2.default.createClass({ + displayName: "Response", + + render: function render() { + var flow = this.props.flow; + return _react2.default.createElement( + "section", + { className: "response" }, + _react2.default.createElement(ResponseLine, { ref: "responseLine", flow: flow }), + _react2.default.createElement(Headers, { ref: "headers", message: flow.response, onChange: this.onHeaderChange }), + _react2.default.createElement("hr", null), + _react2.default.createElement(_contentview2.default, { flow: flow, message: flow.response }) + ); + }, + edit: function edit(k) { + switch (k) { + case "c": + this.refs.responseLine.refs.status_code.focus(); + break; + case "m": + this.refs.responseLine.refs.msg.focus(); + break; + case "v": + this.refs.responseLine.refs.httpVersion.focus(); + break; + case "h": + this.refs.headers.edit(); + break; + default: + throw "Unimplemented: " + k; + } + }, + onHeaderChange: function onHeaderChange(nextHeaders) { + _actions.FlowActions.update(this.props.flow, { + response: { + headers: nextHeaders + } + }); + } +}); + +var Error = exports.Error = _react2.default.createClass({ + displayName: "Error", + + render: function render() { + var flow = this.props.flow; + return _react2.default.createElement( + "section", + null, + _react2.default.createElement( + "div", + { className: "alert alert-warning" }, + flow.error.msg, + _react2.default.createElement( + "div", + null, + _react2.default.createElement( + "small", + null, + (0, _utils2.formatTimeStamp)(flow.error.timestamp) + ) + ) + ) + ); + } +}); + +},{"../../actions.js":2,"../../flow/utils.js":39,"../../utils.js":41,"../editor.js":21,"./contentview.js":22,"lodash":"lodash","react":"react","react-dom":"react-dom"}],26:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _react = require("react"); + +var _react2 = _interopRequireDefault(_react); + +var _actions = require("../../actions.js"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var NavAction = _react2.default.createClass({ + displayName: "NavAction", + + onClick: function onClick(e) { + e.preventDefault(); + this.props.onClick(); + }, + render: function render() { + return _react2.default.createElement( + "a", + { title: this.props.title, + href: "#", + className: "nav-action", + onClick: this.onClick }, + _react2.default.createElement("i", { className: "fa fa-fw " + this.props.icon }) + ); + } +}); + +var Nav = _react2.default.createClass({ + displayName: "Nav", + + render: function render() { + var flow = this.props.flow; + + var tabs = this.props.tabs.map(function (e) { + var str = e.charAt(0).toUpperCase() + e.slice(1); + var className = this.props.active === e ? "active" : ""; + var onClick = function (event) { + this.props.selectTab(e); + event.preventDefault(); + }.bind(this); + return _react2.default.createElement( + "a", + { key: e, + href: "#", + className: className, + onClick: onClick }, + str + ); + }.bind(this)); + + var acceptButton = null; + if (flow.intercepted) { + acceptButton = _react2.default.createElement(NavAction, { title: "[a]ccept intercepted flow", icon: "fa-play", onClick: _actions.FlowActions.accept.bind(null, flow) }); + } + var revertButton = null; + if (flow.modified) { + revertButton = _react2.default.createElement(NavAction, { title: "revert changes to flow [V]", icon: "fa-history", onClick: _actions.FlowActions.revert.bind(null, flow) }); + } + + return _react2.default.createElement( + "nav", + { ref: "head", className: "nav-tabs nav-tabs-sm" }, + tabs, + _react2.default.createElement(NavAction, { title: "[d]elete flow", icon: "fa-trash", onClick: _actions.FlowActions.delete.bind(null, flow) }), + _react2.default.createElement(NavAction, { title: "[D]uplicate flow", icon: "fa-copy", onClick: _actions.FlowActions.duplicate.bind(null, flow) }), + _react2.default.createElement(NavAction, { disabled: true, title: "[r]eplay flow", icon: "fa-repeat", onClick: _actions.FlowActions.replay.bind(null, flow) }), + acceptButton, + revertButton + ); + } +}); + +exports.default = Nav; + +},{"../../actions.js":2,"react":"react"}],27:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +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; }; }(); + +var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; + +var _react = require("react"); + +var _react2 = _interopRequireDefault(_react); + +var _reactDom = require("react-dom"); + +var _reactDom2 = _interopRequireDefault(_reactDom); + +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 symShouldStick = Symbol("shouldStick"); +var isAtBottom = function isAtBottom(v) { + return v.scrollTop + v.clientHeight === v.scrollHeight; +}; + +exports.default = function (Component) { + var _class, _temp; + + return Object.assign((_temp = _class = function (_Component) { + _inherits(AutoScrollWrapper, _Component); + + function AutoScrollWrapper() { + _classCallCheck(this, AutoScrollWrapper); + + return _possibleConstructorReturn(this, Object.getPrototypeOf(AutoScrollWrapper).apply(this, arguments)); + } + + _createClass(AutoScrollWrapper, [{ + key: "componentWillUpdate", + value: function componentWillUpdate() { + var viewport = _reactDom2.default.findDOMNode(this); + this[symShouldStick] = viewport.scrollTop && isAtBottom(viewport); + _get(Object.getPrototypeOf(AutoScrollWrapper.prototype), "componentWillUpdate", this) && _get(Object.getPrototypeOf(AutoScrollWrapper.prototype), "componentWillUpdate", this).call(this); + } + }, { + key: "componentDidUpdate", + value: function componentDidUpdate() { + var viewport = _reactDom2.default.findDOMNode(this); + if (this[symShouldStick] && !isAtBottom(viewport)) { + viewport.scrollTop = viewport.scrollHeight; + } + _get(Object.getPrototypeOf(AutoScrollWrapper.prototype), "componentDidUpdate", this) && _get(Object.getPrototypeOf(AutoScrollWrapper.prototype), "componentDidUpdate", this).call(this); + } + }]); + + return AutoScrollWrapper; + }(Component), _class.displayName = Component.name, _temp), Component); +}; + +},{"react":"react","react-dom":"react-dom"}],28:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.calcVScroll = calcVScroll; +/** + * Calculate virtual scroll stuffs + * + * @param {?Object} opts Options for calculation + * + * @returns {Object} result + * + * __opts__ should have following properties: + * - {number} itemCount + * - {number} rowHeight + * - {number} viewportTop + * - {number} viewportHeight + * - {Array} [itemHeights] + * + * __result__ have following properties: + * - {number} start + * - {number} end + * - {number} paddingTop + * - {number} paddingBottom + */ +function calcVScroll(opts) { + if (!opts) { + return { start: 0, end: 0, paddingTop: 0, paddingBottom: 0 }; + } + + var itemCount = opts.itemCount; + var rowHeight = opts.rowHeight; + var viewportTop = opts.viewportTop; + var viewportHeight = opts.viewportHeight; + var itemHeights = opts.itemHeights; + + var viewportBottom = viewportTop + viewportHeight; + + var start = 0; + var end = 0; + + var paddingTop = 0; + var paddingBottom = 0; + + if (itemHeights) { + + for (var i = 0, pos = 0; i < itemCount; i++) { + var height = itemHeights[i] || rowHeight; + + if (pos <= viewportTop && i % 2 === 0) { + paddingTop = pos; + start = i; + } + + if (pos <= viewportBottom) { + end = i + 1; + } else { + paddingBottom += height; + } + + pos += height; + } + } else { + + // Make sure that we start at an even row so that CSS `:nth-child(even)` is preserved + start = Math.max(0, Math.floor(viewportTop / rowHeight) - 1) & ~1; + end = Math.min(itemCount, start + Math.ceil(viewportHeight / rowHeight) + 2); + + // When a large trunk of elements is removed from the button, start may be far off the viewport. + // To make this issue less severe, limit the top placeholder to the total number of rows. + paddingTop = Math.min(start, itemCount) * rowHeight; + paddingBottom = Math.max(0, itemCount - end) * rowHeight; + } + + return { start: start, end: end, paddingTop: paddingTop, paddingBottom: paddingBottom }; +} + +},{}],29:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _react = require("react"); + +var _react2 = _interopRequireDefault(_react); + +var _reactDom = require("react-dom"); + +var _reactDom2 = _interopRequireDefault(_reactDom); + +var _lodash = require("lodash"); + +var _lodash2 = _interopRequireDefault(_lodash); + +var _utils = require("../utils.js"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var Prompt = _react2.default.createClass({ + displayName: "Prompt", + + contextTypes: { + returnFocus: _react2.default.PropTypes.func + }, + propTypes: { + options: _react2.default.PropTypes.array.isRequired, + done: _react2.default.PropTypes.func.isRequired, + prompt: _react2.default.PropTypes.string + }, + componentDidMount: function componentDidMount() { + _reactDom2.default.findDOMNode(this).focus(); + }, + onKeyDown: function onKeyDown(e) { + e.stopPropagation(); + e.preventDefault(); + var opts = this.getOptions(); + for (var i = 0; i < opts.length; i++) { + var k = opts[i].key; + if (_utils.Key[k.toUpperCase()] === e.keyCode) { + this.done(k); + return; + } + } + if (e.keyCode === _utils.Key.ESC || e.keyCode === _utils.Key.ENTER) { + this.done(false); + } + }, + onClick: function onClick(e) { + this.done(false); + }, + done: function done(ret) { + this.props.done(ret); + this.context.returnFocus(); + }, + getOptions: function getOptions() { + var opts = []; + + var keyTaken = function keyTaken(k) { + return _lodash2.default.includes(_lodash2.default.map(opts, "key"), k); + }; + + for (var i = 0; i < this.props.options.length; i++) { + var opt = this.props.options[i]; + if (_lodash2.default.isString(opt)) { + var str = opt; + while (str.length > 0 && keyTaken(str[0])) { + str = str.substr(1); + } + opt = { + text: opt, + key: str[0] + }; + } + if (!opt.text || !opt.key || keyTaken(opt.key)) { + throw "invalid options"; + } else { + opts.push(opt); + } + } + return opts; + }, + render: function render() { + var opts = this.getOptions(); + opts = _lodash2.default.map(opts, function (o) { + var prefix, suffix; + var idx = o.text.indexOf(o.key); + if (idx !== -1) { + prefix = o.text.substring(0, idx); + suffix = o.text.substring(idx + 1); + } else { + prefix = o.text + " ("; + suffix = ")"; + } + var onClick = function (e) { + this.done(o.key); + e.stopPropagation(); + }.bind(this); + return _react2.default.createElement( + "span", + { + key: o.key, + className: "option", + onClick: onClick }, + prefix, + _react2.default.createElement( + "strong", + { className: "text-primary" }, + o.key + ), + suffix + ); + }.bind(this)); + return _react2.default.createElement( + "div", + { tabIndex: "0", onKeyDown: this.onKeyDown, onClick: this.onClick, className: "prompt-dialog" }, + _react2.default.createElement( + "div", + { className: "prompt-content" }, + this.props.prompt || _react2.default.createElement( + "strong", + null, + "Select: " + ), + opts + ) + ); + } +}); + +exports.default = Prompt; + +},{"../utils.js":41,"lodash":"lodash","react":"react","react-dom":"react-dom"}],30:[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"); + +var _websocket = require("./ducks/websocket"); + +var webSocketActions = _interopRequireWildcard(_websocket); + +var _eventLog = require("./ducks/eventLog"); + +var eventLogActions = _interopRequireWildcard(_eventLog); + +var _flows = require("./ducks/flows"); + +var flowActions = _interopRequireWildcard(_flows); + +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()); + dispatch(flowActions.fetchFlows()) + // workaround to make sure that our state is already available. + .then(function () { + console.log("flows are loaded now"); + _actions.ConnectionActions.open(); + }); + dispatch(eventLogActions.fetchLogEntries()); + }; + ws.onmessage = function (m) { + var message = JSON.parse(m.data); + _dispatcher.AppDispatcher.dispatchServerAction(message); + switch (message.type) { + case eventLogActions.UPDATE_LOG: + return dispatch(eventLogActions.updateLogEntries(message)); + case flowActions.UPDATE_FLOWS: + return dispatch(flowActions.updateFlows(message)); + default: + console.warn("unknown message", message); + } + }; + ws.onerror = function () { + _actions.ConnectionActions.error(); + dispatch(eventLogActions.addLogEntry("WebSocket connection error.")); + }; + ws.onclose = function () { + _actions.ConnectionActions.close(); + dispatch(eventLogActions.addLogEntry("WebSocket connection closed.")); + dispatch(webSocketActions.disconnected()); + }; + return ws; +} + +},{"./actions.js":2,"./dispatcher.js":31,"./ducks/eventLog":32,"./ducks/flows":33,"./ducks/websocket":37}],31:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.AppDispatcher = undefined; + +var _flux = require("flux"); + +var _flux2 = _interopRequireDefault(_flux); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var PayloadSources = { + VIEW: "view", + SERVER: "server" +}; + +var AppDispatcher = exports.AppDispatcher = new _flux2.default.Dispatcher(); +AppDispatcher.dispatchViewAction = function (action) { + action.source = PayloadSources.VIEW; + this.dispatch(action); +}; +AppDispatcher.dispatchServerAction = function (action) { + action.source = PayloadSources.SERVER; + this.dispatch(action); +}; + +},{"flux":"flux"}],32:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.fetchLogEntries = exports.updateLogEntries = exports.UPDATE_LOG = undefined; + +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; +exports.addLogEntry = addLogEntry; + +var _list = require("./utils/list"); + +var _list2 = _interopRequireDefault(_list); + +var _view = require("./utils/view"); + +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_LOG = exports.UPDATE_LOG = "UPDATE_EVENTLOG"; + +var _makeList = (0, _list2.default)(UPDATE_LOG, "/events"); + +var reduceList = _makeList.reduceList; +var updateList = _makeList.updateList; +var fetchList = _makeList.fetchList; +var addItem = _makeList.addItem; + + +var defaultState = { + visible: false, + filter: { + "debug": false, + "info": true, + "web": true + }, + events: reduceList(), + 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: filter, + filteredEvents: (0, _view.updateViewFilter)(state.events, function (x) { + return filter[x.level]; + }) + }); + case TOGGLE_VISIBILITY: + return _extends({}, state, { + visible: !state.visible + }); + case UPDATE_LOG: + var events = reduceList(state.events, action); + return _extends({}, state, { + events: events, + filteredEvents: (0, _view.updateViewList)(state.filteredEvents, state.events, events, action, function (x) { + return state.filter[x.level]; + }) + }); + default: + return state; + } +} + +function toggleEventLogFilter(filter) { + return { type: TOGGLE_FILTER, filter: filter }; +} +function toggleEventLogVisibility() { + return { type: TOGGLE_VISIBILITY }; +} +var id = 0; +function addLogEntry(message) { + var level = arguments.length <= 1 || arguments[1] === undefined ? "web" : arguments[1]; + + return addItem({ + message: message, + level: level, + id: "log-" + id++ + }); +} +exports.updateLogEntries = updateList; +exports.fetchLogEntries = fetchList; + +},{"./utils/list":35,"./utils/view":36}],33:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.fetchFlows = exports.updateFlows = exports.SELECT_FLOW = exports.SET_SORT = exports.SET_HIGHLIGHT = exports.SET_FILTER = exports.UPDATE_FLOWS = undefined; + +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.setFilter = setFilter; +exports.setHighlight = setHighlight; +exports.setSort = setSort; +exports.selectFlow = selectFlow; + +var _list = require("./utils/list"); + +var _list2 = _interopRequireDefault(_list); + +var _filt = require("../filt/filt"); + +var _filt2 = _interopRequireDefault(_filt); + +var _view = require("./utils/view"); + +var _utils = require("../utils.js"); + +var _FlowColumns = require("../components/FlowTable/FlowColumns"); + +var columns = _interopRequireWildcard(_FlowColumns); + +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 _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var UPDATE_FLOWS = exports.UPDATE_FLOWS = "UPDATE_FLOWS"; +var SET_FILTER = exports.SET_FILTER = "SET_FLOW_FILTER"; +var SET_HIGHLIGHT = exports.SET_HIGHLIGHT = "SET_FLOW_HIGHLIGHT"; +var SET_SORT = exports.SET_SORT = "SET_FLOW_SORT"; +var SELECT_FLOW = exports.SELECT_FLOW = "SELECT_FLOW"; + +var _makeList = (0, _list2.default)(UPDATE_FLOWS, "/flows"); + +var reduceList = _makeList.reduceList; +var updateList = _makeList.updateList; +var fetchList = _makeList.fetchList; + + +var defaultState = { + all: reduceList(), + selected: [], + view: [], + filter: undefined, + highlight: undefined, + sort: { sortColumn: undefined, sortDesc: false } +}; + +function makeFilterFn(filter) { + return filter ? _filt2.default.parse(filter) : function () { + return true; + }; +} + +function makeSortFn(sort) { + var column = columns[sort.sortColumn]; + if (!column) return; + + var sortKeyFun = column.sortKeyFun; + if (sort.sortDesc) { + sortKeyFun = sortKeyFun && function (flow) { + var k = column.sortKeyFun(flow); + return _.isString(k) ? (0, _utils.reverseString)("" + k) : -k; + }; + } + return sortKeyFun; +} + +function reducer() { + var state = arguments.length <= 0 || arguments[0] === undefined ? defaultState : arguments[0]; + var action = arguments[1]; + + switch (action.type) { + case UPDATE_FLOWS: + var all = reduceList(state.all, action); + return _extends({}, state, { + all: all, + view: (0, _view.updateViewList)(state.view, state.all, all, action, makeFilterFn(action.filter), makeSortFn(state.sort)) + }); + case SET_FILTER: + return _extends({}, state, { + filter: action.filter, + view: (0, _view.updateViewFilter)(state.all, makeFilterFn(action.filter), makeSortFn(state.sort)) + }); + case SET_HIGHLIGHT: + return _extends({}, state, { + highlight: action.highlight + }); + case SET_SORT: + return _extends({}, state, { + sort: action.sort, + view: (0, _view.updateViewSort)(state.view, makeSortFn(action.sort)) + }); + case SELECT_FLOW: + return _extends({}, state, { + selected: [action.flowId] + }); + default: + return state; + } +} + +function setFilter(filter) { + return { + type: SET_FILTER, + filter: filter + }; +} +function setHighlight(highlight) { + return { + type: SET_HIGHLIGHT, + highlight: highlight + }; +} +function setSort(sort) { + return { + type: SET_SORT, + sort: sort + }; +} +function selectFlow(flowId) { + return { + type: SELECT_FLOW, + flowId: flowId + }; +} + +exports.updateFlows = updateList; +exports.fetchFlows = fetchList; + +},{"../components/FlowTable/FlowColumns":7,"../filt/filt":38,"../utils.js":41,"./utils/list":35,"./utils/view":36}],34:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _redux = require('redux'); + +var _eventLog = require('./eventLog'); + +var _eventLog2 = _interopRequireDefault(_eventLog); + +var _websocket = require('./websocket'); + +var _websocket2 = _interopRequireDefault(_websocket); + +var _flows = require('./flows'); + +var _flows2 = _interopRequireDefault(_flows); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var rootReducer = (0, _redux.combineReducers)({ + eventLog: _eventLog2.default, + websocket: _websocket2.default, + flows: _flows2.default +}); + +exports.default = rootReducer; + +},{"./eventLog":32,"./flows":33,"./websocket":37,"redux":"redux"}],35:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.RECEIVE_LIST = exports.REQUEST_LIST = exports.REMOVE = exports.UPDATE = exports.ADD = undefined; + +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 = makeList; + +var _utils = require("../../utils"); + +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 UPDATE = exports.UPDATE = "UPDATE"; +var REMOVE = exports.REMOVE = "REMOVE"; +var REQUEST_LIST = exports.REQUEST_LIST = "REQUEST_LIST"; +var RECEIVE_LIST = exports.RECEIVE_LIST = "RECEIVE_LIST"; + +var defaultState = { + list: [], + isFetching: false, + actionsDuringFetch: [], + byId: {}, + indexOf: {} +}; + +function makeList(actionType, fetchURL) { + function reduceList() { + var state = arguments.length <= 0 || arguments[0] === undefined ? defaultState : arguments[0]; + var action = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + + if (action.type !== actionType) { + return state; + } + + // Handle cases where we finished fetching or are still fetching. + if (action.cmd === RECEIVE_LIST) { + var s = { + isFetching: false, + actionsDuringFetch: [], + list: action.list, + byId: {}, + indexOf: {} + }; + for (var i = 0; i < action.list.length; i++) { + var item = action.list[i]; + s.byId[item.id] = item; + s.indexOf[item.id] = i; + } + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = state.actionsDuringFetch[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + action = _step.value; + + s = reduceList(s, action); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + return s; + } else if (state.isFetching) { + return _extends({}, state, { + actionsDuringFetch: [].concat(_toConsumableArray(state.actionsDuringFetch), [action]) + }); + } + + var list = void 0, + itemIndex = void 0; + switch (action.cmd) { + case ADD: + return { + list: [].concat(_toConsumableArray(state.list), [action.item]), + byId: _extends({}, state.byId, _defineProperty({}, action.item.id, action.item)), + indexOf: _extends({}, state.indexOf, _defineProperty({}, action.item.id, state.list.length)) + }; + + case UPDATE: + + list = [].concat(_toConsumableArray(state.list)); + itemIndex = state.indexOf[action.item.id]; + list[itemIndex] = action.item; + return _extends({}, state, { + list: list, + byId: _extends({}, state.byId, _defineProperty({}, action.item.id, action.item)) + }); + + case REMOVE: + list = [].concat(_toConsumableArray(state.list)); + itemIndex = state.indexOf[action.item.id]; + list.splice(itemIndex, 1); + return _extends({}, state, { + list: list, + byId: _extends({}, state.byId, _defineProperty({}, action.item.id, undefined)), + indexOf: _extends({}, state.indexOf, _defineProperty({}, action.item.id, undefined)) + }); + + case REQUEST_LIST: + return _extends({}, state, { + isFetching: true + }); + + default: + console.debug("unknown action", action); + return state; + } + } + + function addItem(item) { + return { + type: actionType, + cmd: ADD, + item: item + }; + } + + function updateItem(item) { + return { + type: actionType, + cmd: UPDATE, + item: item + }; + } + + function removeItem(item) { + return { + type: actionType, + cmd: REMOVE, + item: item + }; + } + + function updateList(event) { + /* This action creater takes all WebSocket events */ + return function (dispatch) { + switch (event.cmd) { + case "add": + return dispatch(addItem(event.data)); + case "update": + return dispatch(updateItem(event.data)); + case "remove": + return dispatch(removeItem(event.data)); + case "reset": + return dispatch(fetchList()); + default: + console.error("unknown list update", event); + } + }; + } + + function requestList() { + return { + type: actionType, + cmd: REQUEST_LIST + }; + } + + function receiveList(list) { + return { + type: actionType, + cmd: RECEIVE_LIST, + list: list + }; + } + + function fetchList() { + return function (dispatch) { + + dispatch(requestList()); + + return (0, _utils.fetchApi)(fetchURL).then(function (response) { + return response.json().then(function (json) { + dispatch(receiveList(json.data)); + }); + }); + }; + } + + return { reduceList: reduceList, updateList: updateList, fetchList: fetchList, addItem: addItem, updateItem: updateItem, removeItem: removeItem }; +} + +},{"../../utils":41}],36:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; + +exports.sortedIndexOf = sortedIndexOf; +exports.updateViewList = updateViewList; +exports.updateViewFilter = updateViewFilter; +exports.updateViewSort = updateViewSort; + +var _list = require("./list"); + +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 defaultFilterFn = function defaultFilterFn(x) { + return true; +}; +var defaultSortFn = false; + +var makeCompareFn = function makeCompareFn(sortFn) { + var compareFn = function compareFn(a, b) { + var akey = sortFn(a), + bkey = sortFn(b); + if (akey < bkey) { + return -1; + } else if (akey > bkey) { + return 1; + } else { + return 0; + } + }; + // need to adjust sortedIndexOf as well + // if (sortFn.reverse) + // return (a, b) => compareFn(b, a) + return compareFn; +}; + +var sortedInsert = function sortedInsert(list, sortFn, item) { + var l = [].concat(_toConsumableArray(list), [item]); + l.indexOf = function (x) { + return sortedIndexOf(l, x, sortFn); + }; + var compareFn = makeCompareFn(sortFn); + + // only sort if sorting order is not correct yet + if (sortFn && compareFn(list[list.length - 1], item) > 0) { + // TODO: This is untested + console.debug("sorting view..."); + l.sort(compareFn); + } + return l; +}; + +var sortedRemove = function sortedRemove(list, sortFn, item) { + var itemId = item.id; + var l = list.filter(function (x) { + return x.id !== itemId; + }); + l.indexOf = function (x) { + return sortedIndexOf(l, x, sortFn); + }; + return l; +}; + +function sortedIndexOf(list, value, sortFn) { + if (!sortFn) { + sortFn = function sortFn(x) { + return 0; + }; // This triggers the linear search for flows that have the same sort value. + } + + var low = 0, + high = list.length, + val = sortFn(value), + mid = void 0; + while (low < high) { + mid = low + high >>> 1; + if (sortFn(list[mid]) < val) { + low = mid + 1; + } else { + high = mid; + } + } + + // Two flows may have the same sort value. + // we previously determined the leftmost flow with the same sort value, + // so no we need to scan linearly + while (list[low].id !== value.id && sortFn(list[low + 1]) === val) { + low++; + } + return low; +} + +// for when the list changes +function updateViewList(currentView, currentList, nextList, action) { + var filterFn = arguments.length <= 4 || arguments[4] === undefined ? defaultFilterFn : arguments[4]; + var sortFn = arguments.length <= 5 || arguments[5] === undefined ? defaultSortFn : arguments[5]; + + switch (action.cmd) { + case _list.REQUEST_LIST: + return currentView; + case _list.RECEIVE_LIST: + return updateViewFilter(nextList, filterFn, sortFn); + case _list.ADD: + if (filterFn(action.item)) { + return sortedInsert(currentView, sortFn, action.item); + } + return currentView; + case _list.UPDATE: + // let's determine if it's in the view currently and if it should be in the view. + var currentItemState = currentList.byId[action.item.id], + nextItemState = action.item, + isInView = filterFn(currentItemState), + shouldBeInView = filterFn(nextItemState); + + if (!isInView && shouldBeInView) return sortedInsert(currentView, sortFn, action.item); + if (isInView && !shouldBeInView) return sortedRemove(currentView, sortFn, action.item); + if (isInView && shouldBeInView) { + var _ret = function () { + var s = [].concat(_toConsumableArray(currentView)); + s.indexOf = function (x) { + return sortedIndexOf(s, x, sortFn); + }; + s[s.indexOf(currentItemState)] = nextItemState; + if (sortFn && sortFn(currentItemState) !== sortFn(nextItemState)) s.sort(makeCompareFn(sortFn)); + return { + v: s + }; + }(); + + if ((typeof _ret === "undefined" ? "undefined" : _typeof(_ret)) === "object") return _ret.v; + } + return currentView; + case _list.REMOVE: + var isInView_ = filterFn(currentList.byId[action.item.id]); + if (isInView_) { + return sortedRemove(currentView, sortFn, action.item); + } + return currentView; + default: + console.error("Unknown list action: ", action); + return currentView; + } +} + +function updateViewFilter(list) { + var filterFn = arguments.length <= 1 || arguments[1] === undefined ? defaultFilterFn : arguments[1]; + var sortFn = arguments.length <= 2 || arguments[2] === undefined ? defaultSortFn : arguments[2]; + + var filtered = list.list.filter(filterFn); + if (sortFn) { + filtered.sort(makeCompareFn(sortFn)); + } + filtered.indexOf = function (x) { + return sortedIndexOf(filtered, x, sortFn); + }; + + return filtered; +} + +function updateViewSort(list) { + var sortFn = arguments.length <= 1 || arguments[1] === undefined ? defaultSortFn : arguments[1]; + + var sorted = list.slice(0); + if (sortFn) { + sorted.sort(makeCompareFn(sortFn)); + } + sorted.indexOf = function (x) { + return sortedIndexOf(sorted, x, sortFn); + }; + + return sorted; +} + +},{"./list":35}],37:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = reducer; +exports.connected = connected; +exports.disconnected = disconnected; +var CONNECTED = 'WEBSOCKET_CONNECTED'; +var DISCONNECTED = 'WEBSOCKET_DISCONNECTED'; + +var defaultState = { + connected: false +}; +/* 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 }; +} + +},{}],38:[function(require,module,exports){ +"use strict"; + +module.exports = function () { + "use strict"; + + /* + * Generated by PEG.js 0.9.0. + * + * http://pegjs.org/ + */ + + function peg$subclass(child, parent) { + function ctor() { + this.constructor = child; + } + ctor.prototype = parent.prototype; + child.prototype = new ctor(); + } + + function peg$SyntaxError(message, expected, found, location) { + this.message = message; + this.expected = expected; + this.found = found; + this.location = location; + this.name = "SyntaxError"; + + if (typeof Error.captureStackTrace === "function") { + Error.captureStackTrace(this, peg$SyntaxError); + } + } + + peg$subclass(peg$SyntaxError, Error); + + function peg$parse(input) { + var options = arguments.length > 1 ? arguments[1] : {}, + parser = this, + peg$FAILED = {}, + peg$startRuleFunctions = { start: peg$parsestart }, + peg$startRuleFunction = peg$parsestart, + peg$c0 = { type: "other", description: "filter expression" }, + peg$c1 = function peg$c1(orExpr) { + return orExpr; + }, + peg$c2 = { type: "other", description: "whitespace" }, + peg$c3 = /^[ \t\n\r]/, + peg$c4 = { type: "class", value: "[ \\t\\n\\r]", description: "[ \\t\\n\\r]" }, + peg$c5 = { type: "other", description: "control character" }, + peg$c6 = /^[|&!()~"]/, + peg$c7 = { type: "class", value: "[|&!()~\"]", description: "[|&!()~\"]" }, + peg$c8 = { type: "other", description: "optional whitespace" }, + peg$c9 = "|", + peg$c10 = { type: "literal", value: "|", description: "\"|\"" }, + peg$c11 = function peg$c11(first, second) { + return or(first, second); + }, + peg$c12 = "&", + peg$c13 = { type: "literal", value: "&", description: "\"&\"" }, + peg$c14 = function peg$c14(first, second) { + return and(first, second); + }, + peg$c15 = "!", + peg$c16 = { type: "literal", value: "!", description: "\"!\"" }, + peg$c17 = function peg$c17(expr) { + return not(expr); + }, + peg$c18 = "(", + peg$c19 = { type: "literal", value: "(", description: "\"(\"" }, + peg$c20 = ")", + peg$c21 = { type: "literal", value: ")", description: "\")\"" }, + peg$c22 = function peg$c22(expr) { + return binding(expr); + }, + peg$c23 = "~a", + peg$c24 = { type: "literal", value: "~a", description: "\"~a\"" }, + peg$c25 = function peg$c25() { + return assetFilter; + }, + peg$c26 = "~e", + peg$c27 = { type: "literal", value: "~e", description: "\"~e\"" }, + peg$c28 = function peg$c28() { + return errorFilter; + }, + peg$c29 = "~q", + peg$c30 = { type: "literal", value: "~q", description: "\"~q\"" }, + peg$c31 = function peg$c31() { + return noResponseFilter; + }, + peg$c32 = "~s", + peg$c33 = { type: "literal", value: "~s", description: "\"~s\"" }, + peg$c34 = function peg$c34() { + return responseFilter; + }, + peg$c35 = "true", + peg$c36 = { type: "literal", value: "true", description: "\"true\"" }, + peg$c37 = function peg$c37() { + return trueFilter; + }, + peg$c38 = "false", + peg$c39 = { type: "literal", value: "false", description: "\"false\"" }, + peg$c40 = function peg$c40() { + return falseFilter; + }, + peg$c41 = "~c", + peg$c42 = { type: "literal", value: "~c", description: "\"~c\"" }, + peg$c43 = function peg$c43(s) { + return responseCode(s); + }, + peg$c44 = "~d", + peg$c45 = { type: "literal", value: "~d", description: "\"~d\"" }, + peg$c46 = function peg$c46(s) { + return domain(s); + }, + peg$c47 = "~h", + peg$c48 = { type: "literal", value: "~h", description: "\"~h\"" }, + peg$c49 = function peg$c49(s) { + return header(s); + }, + peg$c50 = "~hq", + peg$c51 = { type: "literal", value: "~hq", description: "\"~hq\"" }, + peg$c52 = function peg$c52(s) { + return requestHeader(s); + }, + peg$c53 = "~hs", + peg$c54 = { type: "literal", value: "~hs", description: "\"~hs\"" }, + peg$c55 = function peg$c55(s) { + return responseHeader(s); + }, + peg$c56 = "~m", + peg$c57 = { type: "literal", value: "~m", description: "\"~m\"" }, + peg$c58 = function peg$c58(s) { + return method(s); + }, + peg$c59 = "~t", + peg$c60 = { type: "literal", value: "~t", description: "\"~t\"" }, + peg$c61 = function peg$c61(s) { + return contentType(s); + }, + peg$c62 = "~tq", + peg$c63 = { type: "literal", value: "~tq", description: "\"~tq\"" }, + peg$c64 = function peg$c64(s) { + return requestContentType(s); + }, + peg$c65 = "~ts", + peg$c66 = { type: "literal", value: "~ts", description: "\"~ts\"" }, + peg$c67 = function peg$c67(s) { + return responseContentType(s); + }, + peg$c68 = "~u", + peg$c69 = { type: "literal", value: "~u", description: "\"~u\"" }, + peg$c70 = function peg$c70(s) { + return url(s); + }, + peg$c71 = { type: "other", description: "integer" }, + peg$c72 = /^['"]/, + peg$c73 = { type: "class", value: "['\"]", description: "['\"]" }, + peg$c74 = /^[0-9]/, + peg$c75 = { type: "class", value: "[0-9]", description: "[0-9]" }, + peg$c76 = function peg$c76(digits) { + return parseInt(digits.join(""), 10); + }, + peg$c77 = { type: "other", description: "string" }, + peg$c78 = "\"", + peg$c79 = { type: "literal", value: "\"", description: "\"\\\"\"" }, + peg$c80 = function peg$c80(chars) { + return chars.join(""); + }, + peg$c81 = "'", + peg$c82 = { type: "literal", value: "'", description: "\"'\"" }, + peg$c83 = /^["\\]/, + peg$c84 = { type: "class", value: "[\"\\\\]", description: "[\"\\\\]" }, + peg$c85 = { type: "any", description: "any character" }, + peg$c86 = function peg$c86(char) { + return char; + }, + peg$c87 = "\\", + peg$c88 = { type: "literal", value: "\\", description: "\"\\\\\"" }, + peg$c89 = /^['\\]/, + peg$c90 = { type: "class", value: "['\\\\]", description: "['\\\\]" }, + peg$c91 = /^['"\\]/, + peg$c92 = { type: "class", value: "['\"\\\\]", description: "['\"\\\\]" }, + peg$c93 = "n", + peg$c94 = { type: "literal", value: "n", description: "\"n\"" }, + peg$c95 = function peg$c95() { + return "\n"; + }, + peg$c96 = "r", + peg$c97 = { type: "literal", value: "r", description: "\"r\"" }, + peg$c98 = function peg$c98() { + return "\r"; + }, + peg$c99 = "t", + peg$c100 = { type: "literal", value: "t", description: "\"t\"" }, + peg$c101 = function peg$c101() { + return "\t"; + }, + peg$currPos = 0, + peg$savedPos = 0, + peg$posDetailsCache = [{ line: 1, column: 1, seenCR: false }], + peg$maxFailPos = 0, + peg$maxFailExpected = [], + peg$silentFails = 0, + peg$result; + + if ("startRule" in options) { + if (!(options.startRule in peg$startRuleFunctions)) { + throw new Error("Can't start parsing from rule \"" + options.startRule + "\"."); + } + + peg$startRuleFunction = peg$startRuleFunctions[options.startRule]; + } + + function text() { + return input.substring(peg$savedPos, peg$currPos); + } + + function location() { + return peg$computeLocation(peg$savedPos, peg$currPos); + } + + function expected(description) { + throw peg$buildException(null, [{ type: "other", description: description }], input.substring(peg$savedPos, peg$currPos), peg$computeLocation(peg$savedPos, peg$currPos)); + } + + function error(message) { + throw peg$buildException(message, null, input.substring(peg$savedPos, peg$currPos), peg$computeLocation(peg$savedPos, peg$currPos)); + } + + function peg$computePosDetails(pos) { + var details = peg$posDetailsCache[pos], + p, + ch; + + if (details) { + return details; + } else { + p = pos - 1; + while (!peg$posDetailsCache[p]) { + p--; + } + + details = peg$posDetailsCache[p]; + details = { + line: details.line, + column: details.column, + seenCR: details.seenCR + }; + + while (p < pos) { + ch = input.charAt(p); + if (ch === "\n") { + if (!details.seenCR) { + details.line++; + } + details.column = 1; + details.seenCR = false; + } else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") { + details.line++; + details.column = 1; + details.seenCR = true; + } else { + details.column++; + details.seenCR = false; + } + + p++; + } + + peg$posDetailsCache[pos] = details; + return details; + } + } + + function peg$computeLocation(startPos, endPos) { + var startPosDetails = peg$computePosDetails(startPos), + endPosDetails = peg$computePosDetails(endPos); + + return { + start: { + offset: startPos, + line: startPosDetails.line, + column: startPosDetails.column + }, + end: { + offset: endPos, + line: endPosDetails.line, + column: endPosDetails.column + } + }; + } + + function peg$fail(expected) { + if (peg$currPos < peg$maxFailPos) { + return; + } + + if (peg$currPos > peg$maxFailPos) { + peg$maxFailPos = peg$currPos; + peg$maxFailExpected = []; + } + + peg$maxFailExpected.push(expected); + } + + function peg$buildException(message, expected, found, location) { + function cleanupExpected(expected) { + var i = 1; + + expected.sort(function (a, b) { + if (a.description < b.description) { + return -1; + } else if (a.description > b.description) { + return 1; + } else { + return 0; + } + }); + + while (i < expected.length) { + if (expected[i - 1] === expected[i]) { + expected.splice(i, 1); + } else { + i++; + } + } + } + + function buildMessage(expected, found) { + function stringEscape(s) { + function hex(ch) { + return ch.charCodeAt(0).toString(16).toUpperCase(); + } + + return s.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\x08/g, '\\b').replace(/\t/g, '\\t').replace(/\n/g, '\\n').replace(/\f/g, '\\f').replace(/\r/g, '\\r').replace(/[\x00-\x07\x0B\x0E\x0F]/g, function (ch) { + return '\\x0' + hex(ch); + }).replace(/[\x10-\x1F\x80-\xFF]/g, function (ch) { + return '\\x' + hex(ch); + }).replace(/[\u0100-\u0FFF]/g, function (ch) { + return "\\u0" + hex(ch); + }).replace(/[\u1000-\uFFFF]/g, function (ch) { + return "\\u" + hex(ch); + }); + } + + var expectedDescs = new Array(expected.length), + expectedDesc, + foundDesc, + i; + + for (i = 0; i < expected.length; i++) { + expectedDescs[i] = expected[i].description; + } + + expectedDesc = expected.length > 1 ? expectedDescs.slice(0, -1).join(", ") + " or " + expectedDescs[expected.length - 1] : expectedDescs[0]; + + foundDesc = found ? "\"" + stringEscape(found) + "\"" : "end of input"; + + return "Expected " + expectedDesc + " but " + foundDesc + " found."; + } + + if (expected !== null) { + cleanupExpected(expected); + } + + return new peg$SyntaxError(message !== null ? message : buildMessage(expected, found), expected, found, location); + } + + function peg$parsestart() { + var s0, s1, s2, s3; + + peg$silentFails++; + s0 = peg$currPos; + s1 = peg$parse__(); + if (s1 !== peg$FAILED) { + s2 = peg$parseOrExpr(); + if (s2 !== peg$FAILED) { + s3 = peg$parse__(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c1(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c0); + } + } + + return s0; + } + + function peg$parsews() { + var s0, s1; + + peg$silentFails++; + if (peg$c3.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c4); + } + } + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c2); + } + } + + return s0; + } + + function peg$parsecc() { + var s0, s1; + + peg$silentFails++; + if (peg$c6.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c7); + } + } + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c5); + } + } + + return s0; + } + + function peg$parse__() { + var s0, s1; + + peg$silentFails++; + s0 = []; + s1 = peg$parsews(); + while (s1 !== peg$FAILED) { + s0.push(s1); + s1 = peg$parsews(); + } + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c8); + } + } + + return s0; + } + + function peg$parseOrExpr() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + s1 = peg$parseAndExpr(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 124) { + s3 = peg$c9; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c10); + } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseOrExpr(); + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c11(s1, s5); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$parseAndExpr(); + } + + return s0; + } + + function peg$parseAndExpr() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + s1 = peg$parseNotExpr(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 38) { + s3 = peg$c12; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c13); + } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseAndExpr(); + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c14(s1, s5); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseNotExpr(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parsews(); + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parsews(); + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s3 = peg$parseAndExpr(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c14(s1, s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$parseNotExpr(); + } + } + + return s0; + } + + function peg$parseNotExpr() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 33) { + s1 = peg$c15; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c16); + } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$parseNotExpr(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c17(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$parseBindingExpr(); + } + + return s0; + } + + function peg$parseBindingExpr() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 40) { + s1 = peg$c18; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c19); + } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$parseOrExpr(); + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 41) { + s5 = peg$c20; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c21); + } + } + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c22(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$parseExpr(); + } + + return s0; + } + + function peg$parseExpr() { + var s0; + + s0 = peg$parseNullaryExpr(); + if (s0 === peg$FAILED) { + s0 = peg$parseUnaryExpr(); + } + + return s0; + } + + function peg$parseNullaryExpr() { + var s0, s1; + + s0 = peg$parseBooleanLiteral(); + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 2) === peg$c23) { + s1 = peg$c23; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c24); + } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c25(); + } + s0 = s1; + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 2) === peg$c26) { + s1 = peg$c26; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c27); + } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c28(); + } + s0 = s1; + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 2) === peg$c29) { + s1 = peg$c29; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c30); + } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c31(); + } + s0 = s1; + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 2) === peg$c32) { + s1 = peg$c32; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c33); + } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c34(); + } + s0 = s1; + } + } + } + } + + return s0; + } + + function peg$parseBooleanLiteral() { + var s0, s1; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c35) { + s1 = peg$c35; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c36); + } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c37(); + } + s0 = s1; + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 5) === peg$c38) { + s1 = peg$c38; + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c39); + } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c40(); + } + s0 = s1; + } + + return s0; + } + + function peg$parseUnaryExpr() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 2) === peg$c41) { + s1 = peg$c41; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c42); + } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parsews(); + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parsews(); + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s3 = peg$parseIntegerLiteral(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c43(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 2) === peg$c44) { + s1 = peg$c44; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c45); + } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parsews(); + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parsews(); + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s3 = peg$parseStringLiteral(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c46(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 2) === peg$c47) { + s1 = peg$c47; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c48); + } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parsews(); + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parsews(); + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s3 = peg$parseStringLiteral(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c49(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 3) === peg$c50) { + s1 = peg$c50; + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c51); + } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parsews(); + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parsews(); + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s3 = peg$parseStringLiteral(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c52(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 3) === peg$c53) { + s1 = peg$c53; + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c54); + } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parsews(); + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parsews(); + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s3 = peg$parseStringLiteral(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c55(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 2) === peg$c56) { + s1 = peg$c56; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c57); + } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parsews(); + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parsews(); + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s3 = peg$parseStringLiteral(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c58(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 2) === peg$c59) { + s1 = peg$c59; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c60); + } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parsews(); + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parsews(); + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s3 = peg$parseStringLiteral(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c61(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 3) === peg$c62) { + s1 = peg$c62; + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c63); + } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parsews(); + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parsews(); + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s3 = peg$parseStringLiteral(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c64(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 3) === peg$c65) { + s1 = peg$c65; + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c66); + } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parsews(); + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parsews(); + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s3 = peg$parseStringLiteral(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c67(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 2) === peg$c68) { + s1 = peg$c68; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c69); + } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parsews(); + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parsews(); + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s3 = peg$parseStringLiteral(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c70(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseStringLiteral(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c70(s1); + } + s0 = s1; + } + } + } + } + } + } + } + } + } + } + + return s0; + } + + function peg$parseIntegerLiteral() { + var s0, s1, s2, s3; + + peg$silentFails++; + s0 = peg$currPos; + if (peg$c72.test(input.charAt(peg$currPos))) { + s1 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c73); + } + } + if (s1 === peg$FAILED) { + s1 = null; + } + if (s1 !== peg$FAILED) { + s2 = []; + if (peg$c74.test(input.charAt(peg$currPos))) { + s3 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c75); + } + } + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + if (peg$c74.test(input.charAt(peg$currPos))) { + s3 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c75); + } + } + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + if (peg$c72.test(input.charAt(peg$currPos))) { + s3 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c73); + } + } + if (s3 === peg$FAILED) { + s3 = null; + } + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c76(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c71); + } + } + + return s0; + } + + function peg$parseStringLiteral() { + var s0, s1, s2, s3; + + peg$silentFails++; + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 34) { + s1 = peg$c78; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c79); + } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parseDoubleStringChar(); + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parseDoubleStringChar(); + } + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 34) { + s3 = peg$c78; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c79); + } + } + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c80(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 39) { + s1 = peg$c81; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c82); + } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parseSingleStringChar(); + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parseSingleStringChar(); + } + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 39) { + s3 = peg$c81; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c82); + } + } + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c80(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$currPos; + peg$silentFails++; + s2 = peg$parsecc(); + peg$silentFails--; + if (s2 === peg$FAILED) { + s1 = void 0; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parseUnquotedStringChar(); + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parseUnquotedStringChar(); + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c80(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + } + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c77); + } + } + + return s0; + } + + function peg$parseDoubleStringChar() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$currPos; + peg$silentFails++; + if (peg$c83.test(input.charAt(peg$currPos))) { + s2 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c84); + } + } + peg$silentFails--; + if (s2 === peg$FAILED) { + s1 = void 0; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + if (input.length > peg$currPos) { + s2 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c85); + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c86(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 92) { + s1 = peg$c87; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c88); + } + } + if (s1 !== peg$FAILED) { + s2 = peg$parseEscapeSequence(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c86(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + return s0; + } + + function peg$parseSingleStringChar() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$currPos; + peg$silentFails++; + if (peg$c89.test(input.charAt(peg$currPos))) { + s2 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c90); + } + } + peg$silentFails--; + if (s2 === peg$FAILED) { + s1 = void 0; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + if (input.length > peg$currPos) { + s2 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c85); + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c86(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 92) { + s1 = peg$c87; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c88); + } + } + if (s1 !== peg$FAILED) { + s2 = peg$parseEscapeSequence(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c86(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + return s0; + } + + function peg$parseUnquotedStringChar() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$currPos; + peg$silentFails++; + s2 = peg$parsews(); + peg$silentFails--; + if (s2 === peg$FAILED) { + s1 = void 0; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + if (input.length > peg$currPos) { + s2 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c85); + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c86(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseEscapeSequence() { + var s0, s1; + + if (peg$c91.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c92); + } + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 110) { + s1 = peg$c93; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c94); + } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c95(); + } + s0 = s1; + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 114) { + s1 = peg$c96; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c97); + } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c98(); + } + s0 = s1; + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 116) { + s1 = peg$c99; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { + peg$fail(peg$c100); + } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c101(); + } + s0 = s1; + } + } + } + + return s0; + } + + var flowutils = require("../flow/utils.js"); + + function or(first, second) { + // Add explicit function names to ease debugging. + function orFilter() { + return first.apply(this, arguments) || second.apply(this, arguments); + } + orFilter.desc = first.desc + " or " + second.desc; + return orFilter; + } + function and(first, second) { + function andFilter() { + return first.apply(this, arguments) && second.apply(this, arguments); + } + andFilter.desc = first.desc + " and " + second.desc; + return andFilter; + } + function not(expr) { + function notFilter() { + return !expr.apply(this, arguments); + } + notFilter.desc = "not " + expr.desc; + return notFilter; + } + function binding(expr) { + function bindingFilter() { + return expr.apply(this, arguments); + } + bindingFilter.desc = "(" + expr.desc + ")"; + return bindingFilter; + } + function trueFilter(flow) { + return true; + } + trueFilter.desc = "true"; + function falseFilter(flow) { + return false; + } + falseFilter.desc = "false"; + + var ASSET_TYPES = [new RegExp("text/javascript"), new RegExp("application/x-javascript"), new RegExp("application/javascript"), new RegExp("text/css"), new RegExp("image/.*"), new RegExp("application/x-shockwave-flash")]; + function assetFilter(flow) { + if (flow.response) { + var ct = flowutils.ResponseUtils.getContentType(flow.response); + var i = ASSET_TYPES.length; + while (i--) { + if (ASSET_TYPES[i].test(ct)) { + return true; + } + } + } + return false; + } + assetFilter.desc = "is asset"; + function responseCode(code) { + function responseCodeFilter(flow) { + return flow.response && flow.response.status_code === code; + } + responseCodeFilter.desc = "resp. code is " + code; + return responseCodeFilter; + } + function domain(regex) { + regex = new RegExp(regex, "i"); + function domainFilter(flow) { + return flow.request && regex.test(flow.request.host); + } + domainFilter.desc = "domain matches " + regex; + return domainFilter; + } + function errorFilter(flow) { + return !!flow.error; + } + errorFilter.desc = "has error"; + function header(regex) { + regex = new RegExp(regex, "i"); + function headerFilter(flow) { + return flow.request && flowutils.RequestUtils.match_header(flow.request, regex) || flow.response && flowutils.ResponseUtils.match_header(flow.response, regex); + } + headerFilter.desc = "header matches " + regex; + return headerFilter; + } + function requestHeader(regex) { + regex = new RegExp(regex, "i"); + function requestHeaderFilter(flow) { + return flow.request && flowutils.RequestUtils.match_header(flow.request, regex); + } + requestHeaderFilter.desc = "req. header matches " + regex; + return requestHeaderFilter; + } + function responseHeader(regex) { + regex = new RegExp(regex, "i"); + function responseHeaderFilter(flow) { + return flow.response && flowutils.ResponseUtils.match_header(flow.response, regex); + } + responseHeaderFilter.desc = "resp. header matches " + regex; + return responseHeaderFilter; + } + function method(regex) { + regex = new RegExp(regex, "i"); + function methodFilter(flow) { + return flow.request && regex.test(flow.request.method); + } + methodFilter.desc = "method matches " + regex; + return methodFilter; + } + function noResponseFilter(flow) { + return flow.request && !flow.response; + } + noResponseFilter.desc = "has no response"; + function responseFilter(flow) { + return !!flow.response; + } + responseFilter.desc = "has response"; + + function contentType(regex) { + regex = new RegExp(regex, "i"); + function contentTypeFilter(flow) { + return flow.request && regex.test(flowutils.RequestUtils.getContentType(flow.request)) || flow.response && regex.test(flowutils.ResponseUtils.getContentType(flow.response)); + } + contentTypeFilter.desc = "content type matches " + regex; + return contentTypeFilter; + } + function requestContentType(regex) { + regex = new RegExp(regex, "i"); + function requestContentTypeFilter(flow) { + return flow.request && regex.test(flowutils.RequestUtils.getContentType(flow.request)); + } + requestContentTypeFilter.desc = "req. content type matches " + regex; + return requestContentTypeFilter; + } + function responseContentType(regex) { + regex = new RegExp(regex, "i"); + function responseContentTypeFilter(flow) { + return flow.response && regex.test(flowutils.ResponseUtils.getContentType(flow.response)); + } + responseContentTypeFilter.desc = "resp. content type matches " + regex; + return responseContentTypeFilter; + } + function url(regex) { + regex = new RegExp(regex, "i"); + function urlFilter(flow) { + return flow.request && regex.test(flowutils.RequestUtils.pretty_url(flow.request)); + } + urlFilter.desc = "url matches " + regex; + return urlFilter; + } + + peg$result = peg$startRuleFunction(); + + if (peg$result !== peg$FAILED && peg$currPos === input.length) { + return peg$result; + } else { + if (peg$result !== peg$FAILED && peg$currPos < input.length) { + peg$fail({ type: "end", description: "end of input" }); + } + + throw peg$buildException(null, peg$maxFailExpected, peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null, peg$maxFailPos < input.length ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1) : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)); + } + } + + return { + SyntaxError: peg$SyntaxError, + parse: peg$parse + }; +}(); + +},{"../flow/utils.js":39}],39:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.parseHttpVersion = exports.isValidHttpVersion = exports.parseUrl = exports.ResponseUtils = exports.RequestUtils = exports.MessageUtils = undefined; + +var _lodash = require("lodash"); + +var _lodash2 = _interopRequireDefault(_lodash); + +var _jquery = require("jquery"); + +var _jquery2 = _interopRequireDefault(_jquery); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var defaultPorts = { + "http": 80, + "https": 443 +}; + +var MessageUtils = exports.MessageUtils = { + getContentType: function getContentType(message) { + var ct = this.get_first_header(message, /^Content-Type$/i); + if (ct) { + return ct.split(";")[0].trim(); + } + }, + get_first_header: function get_first_header(message, regex) { + //FIXME: Cache Invalidation. + if (!message._headerLookups) Object.defineProperty(message, "_headerLookups", { + value: {}, + configurable: false, + enumerable: false, + writable: false + }); + if (!(regex in message._headerLookups)) { + var header; + for (var i = 0; i < message.headers.length; i++) { + if (!!message.headers[i][0].match(regex)) { + header = message.headers[i]; + break; + } + } + message._headerLookups[regex] = header ? header[1] : undefined; + } + return message._headerLookups[regex]; + }, + match_header: function match_header(message, regex) { + var headers = message.headers; + var i = headers.length; + while (i--) { + if (regex.test(headers[i].join(" "))) { + return headers[i]; + } + } + return false; + }, + getContentURL: function getContentURL(flow, message) { + if (message === flow.request) { + message = "request"; + } else if (message === flow.response) { + message = "response"; + } + return "/flows/" + flow.id + "/" + message + "/content"; + }, + getContent: function getContent(flow, message) { + var url = MessageUtils.getContentURL(flow, message); + return _jquery2.default.get(url); + } +}; + +var RequestUtils = exports.RequestUtils = _lodash2.default.extend(MessageUtils, { + pretty_host: function pretty_host(request) { + //FIXME: Add hostheader + return request.host; + }, + pretty_url: function pretty_url(request) { + var port = ""; + if (defaultPorts[request.scheme] !== request.port) { + port = ":" + request.port; + } + return request.scheme + "://" + this.pretty_host(request) + port + request.path; + } +}); + +var ResponseUtils = exports.ResponseUtils = _lodash2.default.extend(MessageUtils, {}); + +var parseUrl_regex = /^(?:(https?):\/\/)?([^\/:]+)?(?::(\d+))?(\/.*)?$/i; +var parseUrl = exports.parseUrl = function parseUrl(url) { + //there are many correct ways to parse a URL, + //however, a mitmproxy user may also wish to generate a not-so-correct URL. ;-) + var parts = parseUrl_regex.exec(url); + if (!parts) { + return false; + } + + var scheme = parts[1], + host = parts[2], + port = parseInt(parts[3]), + path = parts[4]; + if (scheme) { + port = port || defaultPorts[scheme]; + } + var ret = {}; + if (scheme) { + ret.scheme = scheme; + } + if (host) { + ret.host = host; + } + if (port) { + ret.port = port; + } + if (path) { + ret.path = path; + } + return ret; +}; + +var isValidHttpVersion_regex = /^HTTP\/\d+(\.\d+)*$/i; +var isValidHttpVersion = exports.isValidHttpVersion = function isValidHttpVersion(httpVersion) { + return isValidHttpVersion_regex.test(httpVersion); +}; + +var parseHttpVersion = exports.parseHttpVersion = function parseHttpVersion(httpVersion) { + httpVersion = httpVersion.replace("HTTP/", "").split("."); + return _lodash2.default.map(httpVersion, function (x) { + return parseInt(x); + }); +}; + +},{"jquery":"jquery","lodash":"lodash"}],40:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.SettingsStore = SettingsStore; + +var _lodash = require("lodash"); + +var _lodash2 = _interopRequireDefault(_lodash); + +var _jquery = require("jquery"); + +var _jquery2 = _interopRequireDefault(_jquery); + +var _events = require("events"); + +var _actions = require("../actions.js"); + +var _dispatcher = require("../dispatcher.js"); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function DictStore() { + _events.EventEmitter.call(this); + this.reset(); +} +_lodash2.default.extend(DictStore.prototype, _events.EventEmitter.prototype, { + update: function update(dict) { + _lodash2.default.merge(this.dict, dict); + this.emit("recalculate"); + }, + reset: function reset(dict) { + this.dict = dict || {}; + this.emit("recalculate"); + } +}); -},{"../../ducks/flows":27,"./FlowColumns":7,"classnames":"classnames","react":"react","react-redux":"react-redux","redux":"redux"}],10:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function Footer(e){var a=e.settings;return _react2["default"].createElement("footer",null,a.mode&&"regular"!=a.mode&&_react2["default"].createElement("span",{className:"label label-success"},a.mode," mode"),a.intercept&&_react2["default"].createElement("span",{className:"label label-success"},"Intercept: ",a.intercept),a.showhost&&_react2["default"].createElement("span",{className:"label label-success"},"showhost"),a.no_upstream_cert&&_react2["default"].createElement("span",{className:"label label-success"},"no-upstream-cert"),a.rawtcp&&_react2["default"].createElement("span",{className:"label label-success"},"raw-tcp"),!a.http2&&_react2["default"].createElement("span",{className:"label label-success"},"no-http2"),a.anticache&&_react2["default"].createElement("span",{className:"label label-success"},"anticache"),a.anticomp&&_react2["default"].createElement("span",{className:"label label-success"},"anticomp"),a.stickyauth&&_react2["default"].createElement("span",{className:"label label-success"},"stickyauth: ",a.stickyauth),a.stickycookie&&_react2["default"].createElement("span",{className:"label label-success"},"stickycookie: ",a.stickycookie),a.stream&&_react2["default"].createElement("span",{className:"label label-success"},"stream: ",(0,_utils.formatSize)(a.stream)))}Object.defineProperty(exports,"__esModule",{value:!0}),exports["default"]=Footer;var _react=require("react"),_react2=_interopRequireDefault(_react),_utils=require("../utils.js"),_common=require("./common.js");Footer.propTypes={settings:_react2["default"].PropTypes.object.isRequired}; +function LiveStoreMixin(type) { + this.type = type; -},{"../utils.js":35,"./common.js":13,"react":"react"}],11:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var s=0;se&&(o=s.length-1),this.selectFlow(s[o])}},{key:"onMainKeyDown",value:function(e){var t=this.props.selectedFlow;if(!e.ctrlKey){switch(e.keyCode){case _utils.Key.K:case _utils.Key.UP:this.selectFlowRelative(-1);break;case _utils.Key.J:case _utils.Key.DOWN:this.selectFlowRelative(1);break;case _utils.Key.SPACE:case _utils.Key.PAGE_DOWN:this.selectFlowRelative(10);break;case _utils.Key.PAGE_UP:this.selectFlowRelative(-10);break;case _utils.Key.END:this.selectFlowRelative(1e10);break;case _utils.Key.HOME:this.selectFlowRelative(-1e10);break;case _utils.Key.ESC:this.selectFlow(null);break;case _utils.Key.H:case _utils.Key.LEFT:this.refs.flowDetails&&this.refs.flowDetails.nextTab(-1);break;case _utils.Key.L:case _utils.Key.TAB:case _utils.Key.RIGHT:this.refs.flowDetails&&this.refs.flowDetails.nextTab(1);break;case _utils.Key.C:e.shiftKey&&_actions.FlowActions.clear();break;case _utils.Key.D:t&&(e.shiftKey?_actions.FlowActions.duplicate(t):_actions.FlowActions["delete"](t));break;case _utils.Key.A:e.shiftKey?_actions.FlowActions.accept_all():t&&t.intercepted&&_actions.FlowActions.accept(t);break;case _utils.Key.R:!e.shiftKey&&t&&_actions.FlowActions.replay(t);break;case _utils.Key.V:e.shiftKey&&t&&t.modified&&_actions.FlowActions.revert(t);break;case _utils.Key.E:this.refs.flowDetails&&this.refs.flowDetails.promptEdit();break;case _utils.Key.SHIFT:break;default:return void console.debug("keydown",e.keyCode)}e.preventDefault()}}},{key:"render",value:function(){var e=this,t=this.props,s=t.flows,i=t.selectedFlow,l=t.highlight;t.sort;return _react2["default"].createElement("div",{className:"main-view"},_react2["default"].createElement(_FlowTable2["default"],{ref:"flowTable",flows:s,selected:i,highlight:l,onSelect:function(t){return e.selectFlow(t)}}),i&&[_react2["default"].createElement(_common.Splitter,{key:"splitter"}),_react2["default"].createElement(_index2["default"],{key:"flowDetails",ref:"flowDetails",tab:this.props.routeParams.detailTab,query:this.props.query,updateLocation:this.props.updateLocation,flow:i})])}}]),t}(_react.Component);MainView.propTypes={highlight:_react.PropTypes.string,sort:_react.PropTypes.object},exports["default"]=(0,_reactRedux.connect)(function(e){return{flows:e.flows.view,filter:e.flows.filter,sort:e.flows.sort,highlight:e.flows.highlight,selectedFlow:e.flows.all.byId[e.flows.selected[0]]}},function(e){return(0,_redux.bindActionCreators)({selectFlow:_flows.selectFlow,setFilter:_flows.setFilter,setHighlight:_flows.setHighlight},e)},void 0,{withRef:!0})(MainView); + this._updates_before_fetch = undefined; + this._fetchxhr = false; -},{"../actions.js":2,"../ducks/flows":27,"../utils.js":35,"./FlowTable":6,"./common.js":13,"./flowview/index.js":17,"react":"react","react-redux":"react-redux","redux":"redux"}],12:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function e(e,t){for(var r=0;r0)e=o.getRangeAt(0);else if(document.caretPositionFromPoint&&t.clientX&&t.clientY){var n=document.caretPositionFromPoint(t.clientX,t.clientY);e=document.createRange(),e.setStart(n.offsetNode,n.offset)}else document.caretRangeFromPoint&&t.clientX&&t.clientY?e=document.caretRangeFromPoint(t.clientX,t.clientY):(e=document.createRange(),e.selectNodeContents(_reactDom2["default"].findDOMNode(this)));this._ignore_events=!0,this.setState({editable:!0},function(){var t=_reactDom2["default"].findDOMNode(this);t.blur(),t.focus(),this._ignore_events=!1})}},stop:function(){_reactDom2["default"].findDOMNode(this).blur(),this.props.onStop&&this.props.onStop()},_stop:function(t){if(!this._ignore_events){console.log("_stop",_.extend({},t)),window.getSelection().removeAllRanges();var e=_reactDom2["default"].findDOMNode(this),o=this.props.nodeToContent(e);this.setState({editable:!1}),this.props.onDone(o),this.props.onBlur&&this.props.onBlur(t)}},reset:function(){_reactDom2["default"].findDOMNode(this).innerHTML=this.props.contentToHtml(this.props.content)},onKeyDown:function(t){switch(t.stopPropagation(),t.keyCode){case _utils.Key.ESC:t.preventDefault(),this.reset(),this.stop();break;case _utils.Key.ENTER:this.props.submitOnEnter&&!t.shiftKey&&(t.preventDefault(),this.stop())}},onInput:function(){var t=_reactDom2["default"].findDOMNode(this),e=this.props.nodeToContent(t);this.props.onInput&&this.props.onInput(e)}}),ValidateEditor=_react2["default"].createClass({displayName:"ValidateEditor",propTypes:{content:_react2["default"].PropTypes.string.isRequired,onDone:_react2["default"].PropTypes.func.isRequired,onInput:_react2["default"].PropTypes.func,isValid:_react2["default"].PropTypes.func,className:_react2["default"].PropTypes.string},getInitialState:function(){return{currentContent:this.props.content}},componentWillReceiveProps:function(){this.setState({currentContent:this.props.content})},onInput:function(t){this.setState({currentContent:t}),this.props.onInput&&this.props.onInput(t)},render:function(){var t=this.props.className||"";return this.props.isValid&&(t+=this.props.isValid(this.state.currentContent)?" has-success":" has-warning"),_react2["default"].createElement(EditorBase,_extends({},this.props,{ref:"editor",className:t,onDone:this.onDone,onInput:this.onInput}))},onDone:function(t){this.props.isValid&&!this.props.isValid(t)&&(this.refs.editor.reset(),t=this.props.content),this.props.onDone(t)}}),ValueEditor=exports.ValueEditor=_react2["default"].createClass({displayName:"ValueEditor",contextTypes:{returnFocus:_react2["default"].PropTypes.func},propTypes:{content:_react2["default"].PropTypes.string.isRequired,onDone:_react2["default"].PropTypes.func.isRequired,inline:_react2["default"].PropTypes.bool},render:function(){var t=this.props.inline?"span":"div";return _react2["default"].createElement(ValidateEditor,_extends({},this.props,{onStop:this.onStop,tag:t}))},focus:function(){_reactDom2["default"].findDOMNode(this).focus()},onStop:function(){this.context.returnFocus()}}); +function LiveDictStore(type) { + DictStore.call(this); + LiveStoreMixin.call(this, type); +} +_lodash2.default.extend(LiveDictStore.prototype, DictStore.prototype, LiveStoreMixin.prototype); -},{"../utils.js":35,"react":"react","react-dom":"react-dom"}],15:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0});var _extends=Object.assign||function(e){for(var t=1;t1048576*t}},render:function(){var e=(0,_utils2.formatSize)(this.props.message.contentLength);return _react2["default"].createElement("div",{className:"alert alert-warning"},_react2["default"].createElement("button",{onClick:this.props.onClick,className:"btn btn-xs btn-warning pull-right"},"Display anyway"),e," content size.")}}),ViewSelector=_react2["default"].createClass({displayName:"ViewSelector",render:function(){for(var e=[],t=0;t0&&(r.preventDefault(),this.refs[e-1+"-value"].focus())},render:function(){var e=this.props.message.headers.map(function(e,t){var r=_react2["default"].createElement(HeaderEditor,{ref:t+"-key",content:e[0],onDone:this.onChange.bind(null,t,0),onRemove:this.onRemove.bind(null,t,0),onTab:this.onTab.bind(null,t,0)}),s=_react2["default"].createElement(HeaderEditor,{ref:t+"-value",content:e[1],onDone:this.onChange.bind(null,t,1),onRemove:this.onRemove.bind(null,t,1),onTab:this.onTab.bind(null,t,1)});return _react2["default"].createElement("tr",{key:t},_react2["default"].createElement("td",{className:"header-name"},r,":"),_react2["default"].createElement("td",{className:"header-value"},s))}.bind(this));return _react2["default"].createElement("table",{className:"header-table"},_react2["default"].createElement("tbody",null,e))}}),HeaderEditor=_react2["default"].createClass({displayName:"HeaderEditor",render:function(){return _react2["default"].createElement(_editor.ValueEditor,_extends({ref:"input"},this.props,{onKeyDown:this.onKeyDown,inline:!0}))},focus:function(){_reactDom2["default"].findDOMNode(this).focus()},onKeyDown:function(e){switch(e.keyCode){case _utils2.Key.BACKSPACE:var t=window.getSelection().getRangeAt(0);0===t.startOffset&&0===t.endOffset&&this.props.onRemove(e);break;case _utils2.Key.TAB:e.shiftKey||this.props.onTab(e)}}}),RequestLine=_react2["default"].createClass({displayName:"RequestLine",render:function(){var e=this.props.flow,t=_utils.RequestUtils.pretty_url(e.request),r=e.request.http_version;return _react2["default"].createElement("div",{className:"first-line request-line"},_react2["default"].createElement(_editor.ValueEditor,{ref:"method",content:e.request.method,onDone:this.onMethodChange,inline:!0})," ",_react2["default"].createElement(_editor.ValueEditor,{ref:"url",content:t,onDone:this.onUrlChange,isValid:this.isValidUrl,inline:!0})," ",_react2["default"].createElement(_editor.ValueEditor,{ref:"httpVersion",content:r,onDone:this.onHttpVersionChange,isValid:_utils.isValidHttpVersion,inline:!0}))},isValidUrl:function(e){var t=(0,_utils.parseUrl)(e);return!!t.host},onMethodChange:function(e){_actions.FlowActions.update(this.props.flow,{request:{method:e}})},onUrlChange:function(e){var t=(0,_utils.parseUrl)(e);t.path=t.path||"",_actions.FlowActions.update(this.props.flow,{request:t})},onHttpVersionChange:function(e){var t=(0,_utils.parseHttpVersion)(e);_actions.FlowActions.update(this.props.flow,{request:{http_version:t}})}}),ResponseLine=_react2["default"].createClass({displayName:"ResponseLine",render:function(){var e=this.props.flow,t=e.response.http_version;return _react2["default"].createElement("div",{className:"first-line response-line"},_react2["default"].createElement(_editor.ValueEditor,{ref:"httpVersion",content:t,onDone:this.onHttpVersionChange,isValid:_utils.isValidHttpVersion,inline:!0})," ",_react2["default"].createElement(_editor.ValueEditor,{ref:"code",content:e.response.status_code+"",onDone:this.onCodeChange,isValid:this.isValidCode,inline:!0})," ",_react2["default"].createElement(_editor.ValueEditor,{ref:"msg",content:e.response.reason,onDone:this.onMsgChange,inline:!0}))},isValidCode:function(e){return/^\d+$/.test(e)},onHttpVersionChange:function(e){var t=(0,_utils.parseHttpVersion)(e);_actions.FlowActions.update(this.props.flow,{response:{http_version:t}})},onMsgChange:function(e){_actions.FlowActions.update(this.props.flow,{response:{msg:e}})},onCodeChange:function(e){e=parseInt(e),_actions.FlowActions.update(this.props.flow,{response:{code:e}})}}),Request=exports.Request=_react2["default"].createClass({displayName:"Request",render:function(){var e=this.props.flow;return _react2["default"].createElement("section",{className:"request"},_react2["default"].createElement(RequestLine,{ref:"requestLine",flow:e}),_react2["default"].createElement(Headers,{ref:"headers",message:e.request,onChange:this.onHeaderChange}),_react2["default"].createElement("hr",null),_react2["default"].createElement(_contentview2["default"],{flow:e,message:e.request}))},edit:function(e){switch(e){case"m":this.refs.requestLine.refs.method.focus();break;case"u":this.refs.requestLine.refs.url.focus();break;case"v":this.refs.requestLine.refs.httpVersion.focus();break;case"h":this.refs.headers.edit();break;default:throw"Unimplemented: "+e}},onHeaderChange:function(e){_actions.FlowActions.update(this.props.flow,{request:{headers:e}})}}),Response=exports.Response=_react2["default"].createClass({displayName:"Response",render:function(){var e=this.props.flow;return _react2["default"].createElement("section",{className:"response"},_react2["default"].createElement(ResponseLine,{ref:"responseLine",flow:e}),_react2["default"].createElement(Headers,{ref:"headers",message:e.response,onChange:this.onHeaderChange}),_react2["default"].createElement("hr",null),_react2["default"].createElement(_contentview2["default"],{flow:e,message:e.response}))},edit:function(e){switch(e){case"c":this.refs.responseLine.refs.status_code.focus();break;case"m":this.refs.responseLine.refs.msg.focus();break;case"v":this.refs.responseLine.refs.httpVersion.focus();break;case"h":this.refs.headers.edit();break;default:throw"Unimplemented: "+e}},onHeaderChange:function(e){_actions.FlowActions.update(this.props.flow,{response:{headers:e}})}}),Error=exports.Error=_react2["default"].createClass({displayName:"Error",render:function(){var e=this.props.flow;return _react2["default"].createElement("section",null,_react2["default"].createElement("div",{className:"alert alert-warning"},e.error.msg,_react2["default"].createElement("div",null,_react2["default"].createElement("small",null,(0,_utils2.formatTimeStamp)(e.error.timestamp)))))}}); +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; }; -},{"../../actions.js":2,"../../flow/utils.js":33,"../../utils.js":35,"../editor.js":14,"./contentview.js":15,"lodash":"lodash","react":"react","react-dom":"react-dom"}],19:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0});var _react=require("react"),_react2=_interopRequireDefault(_react),_actions=require("../../actions.js"),NavAction=_react2["default"].createClass({displayName:"NavAction",onClick:function(e){e.preventDefault(),this.props.onClick()},render:function(){return _react2["default"].createElement("a",{title:this.props.title,href:"#",className:"nav-action",onClick:this.onClick},_react2["default"].createElement("i",{className:"fa fa-fw "+this.props.icon}))}}),Nav=_react2["default"].createClass({displayName:"Nav",render:function(){var e=this.props.flow,t=this.props.tabs.map(function(e){var t=e.charAt(0).toUpperCase()+e.slice(1),a=this.props.active===e?"active":"",c=function(t){this.props.selectTab(e),t.preventDefault()}.bind(this);return _react2["default"].createElement("a",{key:e,href:"#",className:a,onClick:c},t)}.bind(this)),a=null;e.intercepted&&(a=_react2["default"].createElement(NavAction,{title:"[a]ccept intercepted flow",icon:"fa-play",onClick:_actions.FlowActions.accept.bind(null,e)}));var c=null;return e.modified&&(c=_react2["default"].createElement(NavAction,{title:"revert changes to flow [V]",icon:"fa-history",onClick:_actions.FlowActions.revert.bind(null,e)})),_react2["default"].createElement("nav",{ref:"head",className:"nav-tabs nav-tabs-sm"},t,_react2["default"].createElement(NavAction,{title:"[d]elete flow",icon:"fa-trash",onClick:_actions.FlowActions["delete"].bind(null,e)}),_react2["default"].createElement(NavAction,{title:"[D]uplicate flow",icon:"fa-copy",onClick:_actions.FlowActions.duplicate.bind(null,e)}),_react2["default"].createElement(NavAction,{disabled:!0,title:"[r]eplay flow",icon:"fa-repeat",onClick:_actions.FlowActions.replay.bind(null,e)}),a,c)}});exports["default"]=Nav; +exports.reverseString = reverseString; +exports.fetchApi = fetchApi; -},{"../../actions.js":2,"react":"react"}],20:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.Header=exports.OptionMenu=exports.MainMenu=void 0;var _react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_redux=require("redux"),_jquery=require("jquery"),_jquery2=_interopRequireDefault(_jquery),_reactRedux=require("react-redux"),_filt=require("../filt/filt.js"),_filt2=_interopRequireDefault(_filt),_utils=require("../utils.js"),_common=require("./common.js"),_actions=require("../actions.js"),_eventLog=require("../ducks/eventLog"),ToggleEventLog=(0,_reactRedux.connect)(function(e){return{checked:e.eventLog.visible}},function(e){return(0,_redux.bindActionCreators)({onToggle:_eventLog.toggleEventLogVisibility},e)})(_common.ToggleButton),FilterDocs=_react2["default"].createClass({displayName:"FilterDocs",statics:{xhr:!1,doc:!1},componentWillMount:function(){FilterDocs.doc||(FilterDocs.xhr=_jquery2["default"].getJSON("/filter-help").done(function(e){FilterDocs.doc=e,FilterDocs.xhr=!1})),FilterDocs.xhr&&FilterDocs.xhr.done(function(){this.forceUpdate()}.bind(this))},render:function(){if(FilterDocs.doc){var e=FilterDocs.doc.commands.map(function(e){return _react2["default"].createElement("tr",{key:e[1]},_react2["default"].createElement("td",null,e[0].replace(" "," ")),_react2["default"].createElement("td",null,e[1]))});return e.push(_react2["default"].createElement("tr",{key:"docs-link"},_react2["default"].createElement("td",{colSpan:"2"},_react2["default"].createElement("a",{href:"http://docs.mitmproxy.org/en/stable/features/filters.html",target:"_blank"},_react2["default"].createElement("i",{className:"fa fa-external-link"}),"  mitmproxy docs")))),_react2["default"].createElement("table",{className:"table table-condensed"},_react2["default"].createElement("tbody",null,e))}return _react2["default"].createElement("i",{className:"fa fa-spinner fa-spin"})}}),FilterInput=_react2["default"].createClass({displayName:"FilterInput",contextTypes:{returnFocus:_react2["default"].PropTypes.func},getInitialState:function(){return{value:this.props.value,focus:!1,mousefocus:!1}},componentWillReceiveProps:function(e){this.setState({value:e.value})},onChange:function(e){var t=e.target.value;this.setState({value:t}),this.isValid(t)&&this.props.onChange(t)},isValid:function(e){try{var t=e||this.state.value;return t&&_filt2["default"].parse(e||this.state.value),!0}catch(a){return!1}},getDesc:function(){if(this.state.value)try{return _filt2["default"].parse(this.state.value).desc}catch(e){return""+e}return _react2["default"].createElement(FilterDocs,null)},onFocus:function(){this.setState({focus:!0})},onBlur:function(){this.setState({focus:!1})},onMouseEnter:function(){this.setState({mousefocus:!0})},onMouseLeave:function(){this.setState({mousefocus:!1})},onKeyDown:function(e){e.keyCode!==_utils.Key.ESC&&e.keyCode!==_utils.Key.ENTER||(this.blur(),this.setState({mousefocus:!1})),e.stopPropagation()},blur:function(){_reactDom2["default"].findDOMNode(this.refs.input).blur(),this.context.returnFocus()},select:function(){_reactDom2["default"].findDOMNode(this.refs.input).select()},render:function(){var e,t=this.isValid(),a="fa fa-fw fa-"+this.props.type,n="filter-input input-group"+(t?"":" has-error");return(this.state.focus||this.state.mousefocus)&&(e=_react2["default"].createElement("div",{className:"popover bottom",onMouseEnter:this.onMouseEnter,onMouseLeave:this.onMouseLeave},_react2["default"].createElement("div",{className:"arrow"}),_react2["default"].createElement("div",{className:"popover-content"},this.getDesc()))),_react2["default"].createElement("div",{className:n},_react2["default"].createElement("span",{className:"input-group-addon"},_react2["default"].createElement("i",{className:a,style:{color:this.props.color}})),_react2["default"].createElement("input",{type:"text",placeholder:this.props.placeholder,className:"form-control",ref:"input",onChange:this.onChange,onFocus:this.onFocus,onBlur:this.onBlur,onKeyDown:this.onKeyDown,value:this.state.value}),e)}}),MainMenu=exports.MainMenu=_react2["default"].createClass({displayName:"MainMenu",propTypes:{settings:_react2["default"].PropTypes.object.isRequired},statics:{title:"Start",route:"flows"},onSearchChange:function(e){var t={};t[_actions.Query.SEARCH]=e,this.props.updateLocation(void 0,t)},onHighlightChange:function(e){var t={};t[_actions.Query.HIGHLIGHT]=e,this.props.updateLocation(void 0,t)},onInterceptChange:function(e){_actions.SettingsActions.update({intercept:e})},render:function(){var e=this.props.query[_actions.Query.SEARCH]||"",t=this.props.query[_actions.Query.HIGHLIGHT]||"",a=this.props.settings.intercept||"";return _react2["default"].createElement("div",null,_react2["default"].createElement("div",{className:"menu-row"},_react2["default"].createElement(FilterInput,{ref:"search",placeholder:"Search",type:"search",color:"black",value:e,onChange:this.onSearchChange}),_react2["default"].createElement(FilterInput,{ref:"highlight",placeholder:"Highlight",type:"tag",color:"hsl(48, 100%, 50%)",value:t,onChange:this.onHighlightChange}),_react2["default"].createElement(FilterInput,{ref:"intercept",placeholder:"Intercept",type:"pause",color:"hsl(208, 56%, 53%)",value:a,onChange:this.onInterceptChange})),_react2["default"].createElement("div",{className:"clearfix"}))}}),ViewMenu=_react2["default"].createClass({displayName:"ViewMenu",statics:{title:"View",route:"flows"},render:function(){return _react2["default"].createElement("div",null,_react2["default"].createElement("div",{className:"menu-row"},_react2["default"].createElement(ToggleEventLog,{text:"Show Event Log"})),_react2["default"].createElement("div",{className:"clearfix"}))}}),OptionMenu=exports.OptionMenu=function(e){var t=e.settings,a=(t.mode,t.intercept,t.showhost),n=t.no_upstream_cert,r=t.rawtcp,l=t.http2,c=t.anticache,o=t.anticomp,i=t.stickycookie,u=t.stickyauth,s=t.stream;return _react2["default"].createElement("div",null,_react2["default"].createElement("div",{className:"menu-row"},_react2["default"].createElement(_common.ToggleButton,{text:"showhost",checked:a,onToggle:function(){return _actions.SettingsActions.update({showhost:!a})}}),_react2["default"].createElement(_common.ToggleButton,{text:"no_upstream_cert",checked:n,onToggle:function(){return _actions.SettingsActions.update({no_upstream_cert:!n})}}),_react2["default"].createElement(_common.ToggleButton,{text:"rawtcp",checked:r,onToggle:function(){return _actions.SettingsActions.update({rawtcp:!r})}}),_react2["default"].createElement(_common.ToggleButton,{text:"http2",checked:l,onToggle:function(){return _actions.SettingsActions.update({http2:!l})}}),_react2["default"].createElement(_common.ToggleButton,{text:"anticache",checked:c,onToggle:function(){return _actions.SettingsActions.update({anticache:!c})}}),_react2["default"].createElement(_common.ToggleButton,{text:"anticomp",checked:o,onToggle:function(){return _actions.SettingsActions.update({anticomp:!o})}}),_react2["default"].createElement(_common.ToggleInputButton,{name:"stickyauth",placeholder:"Sticky auth filter",checked:Boolean(u),txt:u||"",onToggleChanged:function(e){return _actions.SettingsActions.update({stickyauth:u?null:e})}}),_react2["default"].createElement(_common.ToggleInputButton,{name:"stickycookie",placeholder:"Sticky cookie filter",checked:Boolean(i),txt:i||"",onToggleChanged:function(e){return _actions.SettingsActions.update({stickycookie:i?null:e})}}),_react2["default"].createElement(_common.ToggleInputButton,{name:"stream",placeholder:"stream...",checked:Boolean(s),txt:s||"",inputType:"number",onToggleChanged:function(e){return _actions.SettingsActions.update({stream:s?null:e})}})),_react2["default"].createElement("div",{className:"clearfix"}))};OptionMenu.title="Options",OptionMenu.propTypes={settings:_react2["default"].PropTypes.object.isRequired};var ReportsMenu=_react2["default"].createClass({displayName:"ReportsMenu",statics:{title:"Visualization",route:"reports"},render:function(){return _react2["default"].createElement("div",null,"Reports Menu")}}),FileMenu=_react2["default"].createClass({displayName:"FileMenu",getInitialState:function(){return{showFileMenu:!1}},handleFileClick:function(e){if(e.preventDefault(),!this.state.showFileMenu){var t=function(){this.setState({showFileMenu:!1}),document.removeEventListener("click",t)}.bind(this);document.addEventListener("click",t),this.setState({showFileMenu:!0})}},handleNewClick:function(e){e.preventDefault(),confirm("Delete all flows?")&&_actions.FlowActions.clear()},handleOpenClick:function(e){this.fileInput.click(),e.preventDefault()},handleOpenFile:function(e){e.target.files.length>0&&(_actions.FlowActions.upload(e.target.files[0]),this.fileInput.value=""),e.preventDefault()},handleSaveClick:function(e){e.preventDefault(),_actions.FlowActions.download()},handleShutdownClick:function(e){e.preventDefault(),console.error("unimplemented: handleShutdownClick")},render:function(){var e=this,t="dropdown pull-left"+(this.state.showFileMenu?" open":"");return _react2["default"].createElement("div",{className:t},_react2["default"].createElement("a",{href:"#",className:"special",onClick:this.handleFileClick}," mitmproxy "),_react2["default"].createElement("ul",{className:"dropdown-menu",role:"menu"},_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"#",onClick:this.handleNewClick},_react2["default"].createElement("i",{className:"fa fa-fw fa-file"}),"New")),_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"#",onClick:this.handleOpenClick},_react2["default"].createElement("i",{className:"fa fa-fw fa-folder-open"}),"Open..."),_react2["default"].createElement("input",{ref:function(t){return e.fileInput=t},className:"hidden",type:"file",onChange:this.handleOpenFile})),_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"#",onClick:this.handleSaveClick},_react2["default"].createElement("i",{className:"fa fa-fw fa-floppy-o"}),"Save...")),_react2["default"].createElement("li",{role:"presentation",className:"divider"}),_react2["default"].createElement("li",null,_react2["default"].createElement("a",{href:"http://mitm.it/",target:"_blank"},_react2["default"].createElement("i",{className:"fa fa-fw fa-external-link"}),"Install Certificates..."))))}}),header_entries=[MainMenu,ViewMenu,OptionMenu],Header=exports.Header=_react2["default"].createClass({displayName:"Header",propTypes:{settings:_react2["default"].PropTypes.object.isRequired},getInitialState:function(){return{active:header_entries[0]}},handleClick:function(e,t){t.preventDefault(),this.props.updateLocation(e.route),this.setState({active:e})},render:function(){var e=header_entries.map(function(e,t){var a;return a=e===this.state.active?"active":"",_react2["default"].createElement("a",{key:t,href:"#",className:a,onClick:this.handleClick.bind(this,e)},e.title)}.bind(this));return _react2["default"].createElement("header",null,_react2["default"].createElement("nav",{className:"nav-tabs nav-tabs-lg"},_react2["default"].createElement(FileMenu,null),e),_react2["default"].createElement("div",{className:"menu"},_react2["default"].createElement(this.state.active,{ref:"active",settings:this.props.settings,updateLocation:this.props.updateLocation,query:this.props.query})))}}); +var _jquery = require("jquery"); -},{"../actions.js":2,"../ducks/eventLog":26,"../filt/filt.js":32,"../utils.js":35,"./common.js":13,"jquery":"jquery","react":"react","react-dom":"react-dom","react-redux":"react-redux","redux":"redux"}],21:[function(require,module,exports){ -"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(exports,"__esModule",{value:!0});var _createClass=function(){function t(t,e){for(var o=0;oh;h++){var m=i[h]||o;r>=s&&h%2===0&&(d=s,n=h),l>=s?c=h+1:p+=m,s+=m}else n=-2&Math.max(0,Math.floor(r/o)-1),c=Math.min(e,n+Math.ceil(a/o)+2),d=Math.min(n,e)*o,p=Math.max(0,e-c)*o;return{start:n,end:c,paddingTop:d,paddingBottom:p}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.calcVScroll=calcVScroll; +var _lodash = require("lodash"); -},{}],23:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0});var _react=require("react"),_react2=_interopRequireDefault(_react),_reactDom=require("react-dom"),_reactDom2=_interopRequireDefault(_reactDom),_lodash=require("lodash"),_lodash2=_interopRequireDefault(_lodash),_utils=require("../utils.js"),Prompt=_react2["default"].createClass({displayName:"Prompt",contextTypes:{returnFocus:_react2["default"].PropTypes.func},propTypes:{options:_react2["default"].PropTypes.array.isRequired,done:_react2["default"].PropTypes.func.isRequired,prompt:_react2["default"].PropTypes.string},componentDidMount:function(){_reactDom2["default"].findDOMNode(this).focus()},onKeyDown:function(e){e.stopPropagation(),e.preventDefault();for(var t=this.getOptions(),r=0;r0&&t(n[0]);)n=n.substr(1);o={text:o,key:n[0]}}if(!o.text||!o.key||t(o.key))throw"invalid options";e.push(o)}return e},render:function(){var e=this.getOptions();return e=_lodash2["default"].map(e,function(e){var t,r,o=e.text.indexOf(e.key);-1!==o?(t=e.text.substring(0,o),r=e.text.substring(o+1)):(t=e.text+" (",r=")");var n=function(t){this.done(e.key),t.stopPropagation()}.bind(this);return _react2["default"].createElement("span",{key:e.key,className:"option",onClick:n},t,_react2["default"].createElement("strong",{className:"text-primary"},e.key),r)}.bind(this)),_react2["default"].createElement("div",{tabIndex:"0",onKeyDown:this.onKeyDown,onClick:this.onClick,className:"prompt-dialog"},_react2["default"].createElement("div",{className:"prompt-content"},this.props.prompt||_react2["default"].createElement("strong",null,"Select: "),e))}});exports["default"]=Prompt; +var _lodash2 = _interopRequireDefault(_lodash); -},{"../utils.js":35,"lodash":"lodash","react":"react","react-dom":"react-dom"}],24:[function(require,module,exports){ -"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var o={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(o[n]=e[n]);return o["default"]=e,o}function Connection(e,o){"/"===e[0]&&(e=location.origin.replace("http","ws")+e);var n=new WebSocket(e);return n.onopen=function(){o(webSocketActions.connected()),o(flowActions.fetchFlows()).then(function(){console.log("flows are loaded now"),_actions.ConnectionActions.open()}),o(eventLogActions.fetchLogEntries())},n.onmessage=function(e){var n=JSON.parse(e.data);switch(_dispatcher.AppDispatcher.dispatchServerAction(n),n.type){case eventLogActions.UPDATE_LOG:return o(eventLogActions.updateLogEntries(n));case flowActions.UPDATE_FLOWS:return o(flowActions.updateFlows(n));default:console.warn("unknown message",n)}},n.onerror=function(){_actions.ConnectionActions.error(),o(eventLogActions.addLogEntry("WebSocket connection error."))},n.onclose=function(){_actions.ConnectionActions.close(),o(eventLogActions.addLogEntry("WebSocket connection closed.")),o(webSocketActions.disconnected())},n}Object.defineProperty(exports,"__esModule",{value:!0}),exports["default"]=Connection;var _actions=require("./actions.js"),_dispatcher=require("./dispatcher.js"),_websocket=require("./ducks/websocket"),webSocketActions=_interopRequireWildcard(_websocket),_eventLog=require("./ducks/eventLog"),eventLogActions=_interopRequireWildcard(_eventLog),_flows=require("./ducks/flows"),flowActions=_interopRequireWildcard(_flows); +var _actions = require("./actions.js"); -},{"./actions.js":2,"./dispatcher.js":25,"./ducks/eventLog":26,"./ducks/flows":27,"./ducks/websocket":31}],25:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.AppDispatcher=void 0;var _flux=require("flux"),_flux2=_interopRequireDefault(_flux),PayloadSources={VIEW:"view",SERVER:"server"},AppDispatcher=exports.AppDispatcher=new _flux2["default"].Dispatcher;AppDispatcher.dispatchViewAction=function(e){e.source=PayloadSources.VIEW,this.dispatch(e)},AppDispatcher.dispatchServerAction=function(e){e.source=PayloadSources.SERVER,this.dispatch(e)}; +var _actions2 = _interopRequireDefault(_actions); -},{"flux":"flux"}],26:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _defineProperty(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function reducer(){var e=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],t=arguments[1];switch(t.type){case TOGGLE_FILTER:var i=_extends({},e.filter,_defineProperty({},t.filter,!e.filter[t.filter]));return _extends({},e,{filter:i,filteredEvents:(0,_view.updateViewFilter)(e.events,function(e){return i[e.level]})});case TOGGLE_VISIBILITY:return _extends({},e,{visible:!e.visible});case UPDATE_LOG:var r=reduceList(e.events,t);return _extends({},e,{events:r,filteredEvents:(0,_view.updateViewList)(e.filteredEvents,e.events,r,t,function(t){return e.filter[t.level]})});default:return e}}function toggleEventLogFilter(e){return{type:TOGGLE_FILTER,filter:e}}function toggleEventLogVisibility(){return{type:TOGGLE_VISIBILITY}}function addLogEntry(e){var t=arguments.length<=1||void 0===arguments[1]?"web":arguments[1];return addItem({message:e,level:t,id:"log-"+id++})}Object.defineProperty(exports,"__esModule",{value:!0}),exports.fetchLogEntries=exports.updateLogEntries=exports.UPDATE_LOG=void 0;var _extends=Object.assign||function(e){for(var t=1;t bytes) { + break; + } + } + var precision; + if (bytes % Math.pow(1024, i) === 0) precision = 0;else precision = 1; + return (bytes / Math.pow(1024, i)).toFixed(precision) + prefix[i]; +}; -},{"../../utils":35}],30:[function(require,module,exports){ -"use strict";function _toConsumableArray(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);tn;)u=n+o>>>1,r(e[u])n?-1:n>o?1:0};return t},sortedInsert=function(e,t,r){var n=[].concat(_toConsumableArray(e),[r]);n.indexOf=function(e){return sortedIndexOf(n,e,t)};var o=makeCompareFn(t);return t&&o(e[e.length-1],r)>0&&(console.debug("sorting view..."),n.sort(o)),n},sortedRemove=function(e,t,r){var n=r.id,o=e.filter(function(e){return e.id!==n});return o.indexOf=function(e){return sortedIndexOf(o,e,t)},o}; +var formatTimeDelta = exports.formatTimeDelta = function formatTimeDelta(milliseconds) { + var time = milliseconds; + var prefix = ["ms", "s", "min", "h"]; + var div = [1000, 60, 60]; + var i = 0; + while (Math.abs(time) >= div[i] && i < div.length) { + time = time / div[i]; + i++; + } + return Math.round(time) + prefix[i]; +}; -},{"./list":29}],31:[function(require,module,exports){ -"use strict";function reducer(){var e=arguments.length<=0||void 0===arguments[0]?defaultState:arguments[0],t=arguments[1];switch(t.type){case CONNECTED:return{connected:!0};case DISCONNECTED:return{connected:!1};default:return e}}function connected(){return{type:CONNECTED}}function disconnected(){return{type:DISCONNECTED}}Object.defineProperty(exports,"__esModule",{value:!0}),exports["default"]=reducer,exports.connected=connected,exports.disconnected=disconnected;var CONNECTED="WEBSOCKET_CONNECTED",DISCONNECTED="WEBSOCKET_DISCONNECTED",defaultState={connected:!1}; +var formatTimeStamp = exports.formatTimeStamp = function formatTimeStamp(seconds) { + var ts = new Date(seconds * 1000).toISOString(); + return ts.replace("T", " ").replace("Z", ""); +}; -},{}],32:[function(require,module,exports){ -"use strict";module.exports=function(){function e(e,t){function r(){this.constructor=e}r.prototype=t.prototype,e.prototype=new r}function t(e,r,n,i){this.message=e,this.expected=r,this.found=n,this.location=i,this.name="SyntaxError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,t)}function r(e){function r(t){var r,n,i=Ot[t];if(i)return i;for(r=t-1;!Ot[r];)r--;for(i=Ot[r],i={line:i.line,column:i.column,seenCR:i.seenCR};t>r;)n=e.charAt(r),"\n"===n?(i.seenCR||i.line++,i.column=1,i.seenCR=!1):"\r"===n||"\u2028"===n||"\u2029"===n?(i.line++,i.column=1,i.seenCR=!0):(i.column++,i.seenCR=!1),r++;return Ot[t]=i,i}function n(e,t){var n=r(e),i=r(t);return{start:{offset:e,line:n.line,column:n.column},end:{offset:t,line:i.line,column:i.column}}}function i(e){Pt>Mt||(Mt>Pt&&(Pt=Mt,Qt=[]),Qt.push(e))}function s(e,r,n,i){function s(e){var t=1;for(e.sort(function(e,t){return e.descriptiont.description?1:0});t1?u.slice(0,-1).join(", ")+" or "+u[e.length-1]:u[0],i=t?'"'+r(t)+'"':"end of input","Expected "+n+" but "+i+" found."}return null!==r&&s(r),new t(null!==e?e:u(r,n),r,n,i)}function u(){var e,t,r,n;return Vt++,e=Mt,t=a(),t!==P?(r=l(),r!==P?(n=a(),n!==P?(Nt=e,t=X(r),e=t):(Mt=e,e=P)):(Mt=e,e=P)):(Mt=e,e=P),Vt--,e===P&&(t=P,0===Vt&&i(W)),e}function c(){var t,r;return Vt++,Z.test(e.charAt(Mt))?(t=e.charAt(Mt),Mt++):(t=P,0===Vt&&i($)),Vt--,t===P&&(r=P,0===Vt&&i(Y)),t}function o(){var t,r;return Vt++,te.test(e.charAt(Mt))?(t=e.charAt(Mt),Mt++):(t=P,0===Vt&&i(re)),Vt--,t===P&&(r=P,0===Vt&&i(ee)),t}function a(){var e,t;for(Vt++,e=[],t=c();t!==P;)e.push(t),t=c();return Vt--,e===P&&(t=P,0===Vt&&i(ne)),e}function l(){var t,r,n,s,u,c;return t=Mt,r=p(),r!==P?(n=a(),n!==P?(124===e.charCodeAt(Mt)?(s=ie,Mt++):(s=P,0===Vt&&i(se)),s!==P?(u=a(),u!==P?(c=l(),c!==P?(Nt=t,r=ue(r,c),t=r):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P),t===P&&(t=p()),t}function p(){var t,r,n,s,u,o;if(t=Mt,r=f(),r!==P?(n=a(),n!==P?(38===e.charCodeAt(Mt)?(s=ce,Mt++):(s=P,0===Vt&&i(oe)),s!==P?(u=a(),u!==P?(o=p(),o!==P?(Nt=t,r=ae(r,o),t=r):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P),t===P){if(t=Mt,r=f(),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=p(),s!==P?(Nt=t,r=ae(r,s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;t===P&&(t=f())}return t}function f(){var t,r,n,s;return t=Mt,33===e.charCodeAt(Mt)?(r=le,Mt++):(r=P,0===Vt&&i(pe)),r!==P?(n=a(),n!==P?(s=f(),s!==P?(Nt=t,r=fe(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P),t===P&&(t=h()),t}function h(){var t,r,n,s,u,c;return t=Mt,40===e.charCodeAt(Mt)?(r=he,Mt++):(r=P,0===Vt&&i(de)),r!==P?(n=a(),n!==P?(s=l(),s!==P?(u=a(),u!==P?(41===e.charCodeAt(Mt)?(c=ve,Mt++):(c=P,0===Vt&&i(ye)),c!==P?(Nt=t,r=ge(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P)):(Mt=t,t=P),t===P&&(t=d()),t}function d(){var e;return e=v(),e===P&&(e=g()),e}function v(){var t,r;return t=y(),t===P&&(t=Mt,e.substr(Mt,2)===Ae?(r=Ae,Mt+=2):(r=P,0===Vt&&i(xe)),r!==P&&(Nt=t,r=Re()),t=r,t===P&&(t=Mt,e.substr(Mt,2)===me?(r=me,Mt+=2):(r=P,0===Vt&&i(qe)),r!==P&&(Nt=t,r=Ce()),t=r,t===P&&(t=Mt,e.substr(Mt,2)===we?(r=we,Mt+=2):(r=P,0===Vt&&i(Ee)),r!==P&&(Nt=t,r=be()),t=r,t===P&&(t=Mt,e.substr(Mt,2)===Fe?(r=Fe,Mt+=2):(r=P,0===Vt&&i(Ue)),r!==P&&(Nt=t,r=je()),t=r)))),t}function y(){var t,r;return t=Mt,e.substr(Mt,4)===Te?(r=Te,Mt+=4):(r=P,0===Vt&&i(_e)),r!==P&&(Nt=t,r=Se()),t=r,t===P&&(t=Mt,e.substr(Mt,5)===ke?(r=ke,Mt+=5):(r=P,0===Vt&&i(Be)),r!==P&&(Nt=t,r=Ie()),t=r),t}function g(){var t,r,n,s;if(t=Mt,e.substr(Mt,2)===ze?(r=ze,Mt+=2):(r=P,0===Vt&&i(De)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=A(),s!==P?(Nt=t,r=Ge(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,2)===He?(r=He,Mt+=2):(r=P,0===Vt&&i(Je)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=Ke(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,2)===Le?(r=Le,Mt+=2):(r=P,0===Vt&&i(Me)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=Ne(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,3)===Oe?(r=Oe,Mt+=3):(r=P,0===Vt&&i(Pe)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=Qe(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,3)===Ve?(r=Ve,Mt+=3):(r=P,0===Vt&&i(We)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=Xe(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,2)===Ye?(r=Ye,Mt+=2):(r=P,0===Vt&&i(Ze)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=$e(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,2)===et?(r=et,Mt+=2):(r=P,0===Vt&&i(tt)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=rt(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,3)===nt?(r=nt,Mt+=3):(r=P,0===Vt&&i(it)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=st(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,3)===ut?(r=ut,Mt+=3):(r=P,0===Vt&&i(ct)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=ot(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,e.substr(Mt,2)===at?(r=at,Mt+=2):(r=P,0===Vt&&i(lt)),r!==P){if(n=[],s=c(),s!==P)for(;s!==P;)n.push(s),s=c();else n=P;n!==P?(s=x(),s!==P?(Nt=t,r=pt(s),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;t===P&&(t=Mt,r=x(),r!==P&&(Nt=t,r=pt(r)),t=r)}}}}}}}}}return t}function A(){var t,r,n,s;if(Vt++,t=Mt,ht.test(e.charAt(Mt))?(r=e.charAt(Mt),Mt++):(r=P,0===Vt&&i(dt)),r===P&&(r=null),r!==P){if(n=[],vt.test(e.charAt(Mt))?(s=e.charAt(Mt),Mt++):(s=P,0===Vt&&i(yt)),s!==P)for(;s!==P;)n.push(s),vt.test(e.charAt(Mt))?(s=e.charAt(Mt),Mt++):(s=P,0===Vt&&i(yt));else n=P;n!==P?(ht.test(e.charAt(Mt))?(s=e.charAt(Mt),Mt++):(s=P,0===Vt&&i(dt)),s===P&&(s=null),s!==P?(Nt=t,r=gt(n),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;return Vt--,t===P&&(r=P,0===Vt&&i(ft)),t}function x(){var t,r,n,s;if(Vt++,t=Mt,34===e.charCodeAt(Mt)?(r=xt,Mt++):(r=P,0===Vt&&i(Rt)),r!==P){for(n=[],s=R();s!==P;)n.push(s),s=R();n!==P?(34===e.charCodeAt(Mt)?(s=xt,Mt++):(s=P,0===Vt&&i(Rt)),s!==P?(Nt=t,r=mt(n),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P){if(t=Mt,39===e.charCodeAt(Mt)?(r=qt,Mt++):(r=P,0===Vt&&i(Ct)),r!==P){for(n=[],s=m();s!==P;)n.push(s),s=m();n!==P?(39===e.charCodeAt(Mt)?(s=qt,Mt++):(s=P,0===Vt&&i(Ct)),s!==P?(Nt=t,r=mt(n),t=r):(Mt=t,t=P)):(Mt=t,t=P)}else Mt=t,t=P;if(t===P)if(t=Mt,r=Mt,Vt++,n=o(),Vt--,n===P?r=void 0:(Mt=r,r=P),r!==P){if(n=[],s=q(),s!==P)for(;s!==P;)n.push(s),s=q();else n=P;n!==P?(Nt=t,r=mt(n),t=r):(Mt=t,t=P)}else Mt=t,t=P}return Vt--,t===P&&(r=P,0===Vt&&i(At)),t}function R(){var t,r,n;return t=Mt,r=Mt,Vt++,wt.test(e.charAt(Mt))?(n=e.charAt(Mt),Mt++):(n=P,0===Vt&&i(Et)),Vt--,n===P?r=void 0:(Mt=r,r=P),r!==P?(e.length>Mt?(n=e.charAt(Mt),Mt++):(n=P,0===Vt&&i(bt)),n!==P?(Nt=t,r=Ft(n),t=r):(Mt=t,t=P)):(Mt=t,t=P),t===P&&(t=Mt,92===e.charCodeAt(Mt)?(r=Ut,Mt++):(r=P,0===Vt&&i(jt)),r!==P?(n=C(),n!==P?(Nt=t,r=Ft(n),t=r):(Mt=t,t=P)):(Mt=t,t=P)),t}function m(){var t,r,n;return t=Mt,r=Mt,Vt++,Tt.test(e.charAt(Mt))?(n=e.charAt(Mt),Mt++):(n=P,0===Vt&&i(_t)),Vt--,n===P?r=void 0:(Mt=r,r=P),r!==P?(e.length>Mt?(n=e.charAt(Mt),Mt++):(n=P,0===Vt&&i(bt)),n!==P?(Nt=t,r=Ft(n),t=r):(Mt=t,t=P)):(Mt=t,t=P),t===P&&(t=Mt,92===e.charCodeAt(Mt)?(r=Ut,Mt++):(r=P,0===Vt&&i(jt)),r!==P?(n=C(),n!==P?(Nt=t,r=Ft(n),t=r):(Mt=t,t=P)):(Mt=t,t=P)),t}function q(){var t,r,n;return t=Mt,r=Mt,Vt++,n=c(),Vt--,n===P?r=void 0:(Mt=r,r=P),r!==P?(e.length>Mt?(n=e.charAt(Mt),Mt++):(n=P,0===Vt&&i(bt)),n!==P?(Nt=t,r=Ft(n),t=r):(Mt=t,t=P)):(Mt=t,t=P),t}function C(){var t,r;return St.test(e.charAt(Mt))?(t=e.charAt(Mt),Mt++):(t=P,0===Vt&&i(kt)),t===P&&(t=Mt,110===e.charCodeAt(Mt)?(r=Bt,Mt++):(r=P,0===Vt&&i(It)),r!==P&&(Nt=t,r=zt()),t=r,t===P&&(t=Mt,114===e.charCodeAt(Mt)?(r=Dt,Mt++):(r=P,0===Vt&&i(Gt)),r!==P&&(Nt=t,r=Ht()),t=r,t===P&&(t=Mt,116===e.charCodeAt(Mt)?(r=Jt,Mt++):(r=P,0===Vt&&i(Kt)),r!==P&&(Nt=t,r=Lt()),t=r))),t}function w(e,t){function r(){return e.apply(this,arguments)||t.apply(this,arguments)}return r.desc=e.desc+" or "+t.desc,r}function E(e,t){function r(){return e.apply(this,arguments)&&t.apply(this,arguments)}return r.desc=e.desc+" and "+t.desc,r}function b(e){function t(){return!e.apply(this,arguments)}return t.desc="not "+e.desc,t}function F(e){function t(){return e.apply(this,arguments)}return t.desc="("+e.desc+")",t}function U(e){return!0}function j(e){return!1}function T(e){if(e.response)for(var t=Wt.ResponseUtils.getContentType(e.response),r=Xt.length;r--;)if(Xt[r].test(t))return!0;return!1}function _(e){function t(t){return t.response&&t.response.status_code===e}return t.desc="resp. code is "+e,t}function S(e){function t(t){return t.request&&e.test(t.request.host)}return e=new RegExp(e,"i"),t.desc="domain matches "+e,t}function k(e){return!!e.error}function B(e){function t(t){return t.request&&Wt.RequestUtils.match_header(t.request,e)||t.response&&Wt.ResponseUtils.match_header(t.response,e)}return e=new RegExp(e,"i"),t.desc="header matches "+e,t}function I(e){function t(t){return t.request&&Wt.RequestUtils.match_header(t.request,e)}return e=new RegExp(e,"i"),t.desc="req. header matches "+e,t}function z(e){function t(t){return t.response&&Wt.ResponseUtils.match_header(t.response,e)}return e=new RegExp(e,"i"),t.desc="resp. header matches "+e,t}function D(e){function t(t){return t.request&&e.test(t.request.method)}return e=new RegExp(e,"i"),t.desc="method matches "+e,t}function G(e){return e.request&&!e.response}function H(e){return!!e.response}function J(e){function t(t){return t.request&&e.test(Wt.RequestUtils.getContentType(t.request))||t.response&&e.test(Wt.ResponseUtils.getContentType(t.response))}return e=new RegExp(e,"i"),t.desc="content type matches "+e,t}function K(e){function t(t){return t.request&&e.test(Wt.RequestUtils.getContentType(t.request))}return e=new RegExp(e,"i"),t.desc="req. content type matches "+e,t}function L(e){function t(t){return t.response&&e.test(Wt.ResponseUtils.getContentType(t.response))}return e=new RegExp(e,"i"),t.desc="resp. content type matches "+e,t}function M(e){function t(t){return t.request&&e.test(Wt.RequestUtils.pretty_url(t.request))}return e=new RegExp(e,"i"),t.desc="url matches "+e,t}var N,O=arguments.length>1?arguments[1]:{},P={},Q={start:u},V=u,W={type:"other",description:"filter expression"},X=function(e){return e},Y={type:"other",description:"whitespace"},Z=/^[ \t\n\r]/,$={type:"class",value:"[ \\t\\n\\r]",description:"[ \\t\\n\\r]"},ee={type:"other",description:"control character"},te=/^[|&!()~"]/,re={type:"class",value:'[|&!()~"]',description:'[|&!()~"]'},ne={type:"other",description:"optional whitespace"},ie="|",se={type:"literal",value:"|",description:'"|"'},ue=function(e,t){return w(e,t)},ce="&",oe={type:"literal",value:"&",description:'"&"'},ae=function(e,t){return E(e,t)},le="!",pe={type:"literal",value:"!",description:'"!"'},fe=function(e){return b(e)},he="(",de={type:"literal",value:"(",description:'"("'},ve=")",ye={type:"literal",value:")",description:'")"'},ge=function(e){return F(e)},Ae="~a",xe={type:"literal",value:"~a",description:'"~a"'},Re=function(){return T},me="~e",qe={type:"literal",value:"~e",description:'"~e"'},Ce=function(){return k},we="~q",Ee={type:"literal",value:"~q",description:'"~q"'},be=function(){return G},Fe="~s",Ue={type:"literal",value:"~s",description:'"~s"'},je=function(){return H},Te="true",_e={type:"literal",value:"true",description:'"true"'},Se=function(){return U},ke="false",Be={type:"literal",value:"false",description:'"false"'},Ie=function(){return j},ze="~c",De={type:"literal",value:"~c",description:'"~c"'},Ge=function(e){return _(e)},He="~d",Je={type:"literal",value:"~d",description:'"~d"'},Ke=function(e){return S(e)},Le="~h",Me={type:"literal",value:"~h",description:'"~h"'},Ne=function(e){return B(e)},Oe="~hq",Pe={type:"literal",value:"~hq",description:'"~hq"'},Qe=function(e){return I(e)},Ve="~hs",We={type:"literal",value:"~hs",description:'"~hs"'},Xe=function(e){return z(e)},Ye="~m",Ze={type:"literal",value:"~m",description:'"~m"'},$e=function(e){return D(e)},et="~t",tt={type:"literal",value:"~t",description:'"~t"'},rt=function(e){return J(e)},nt="~tq",it={type:"literal",value:"~tq",description:'"~tq"'},st=function(e){return K(e)},ut="~ts",ct={type:"literal",value:"~ts",description:'"~ts"'},ot=function(e){return L(e)},at="~u",lt={type:"literal",value:"~u",description:'"~u"'},pt=function(e){return M(e)},ft={type:"other",description:"integer"},ht=/^['"]/,dt={type:"class",value:"['\"]",description:"['\"]"},vt=/^[0-9]/,yt={type:"class",value:"[0-9]",description:"[0-9]"},gt=function(e){return parseInt(e.join(""),10)},At={type:"other",description:"string"},xt='"',Rt={type:"literal",value:'"',description:'"\\""'},mt=function(e){return e.join("")},qt="'",Ct={type:"literal",value:"'",description:'"\'"'},wt=/^["\\]/,Et={type:"class",value:'["\\\\]',description:'["\\\\]'},bt={type:"any",description:"any character"},Ft=function(e){return e},Ut="\\",jt={type:"literal",value:"\\",description:'"\\\\"'},Tt=/^['\\]/,_t={type:"class",value:"['\\\\]",description:"['\\\\]"},St=/^['"\\]/,kt={type:"class",value:"['\"\\\\]",description:"['\"\\\\]"},Bt="n",It={type:"literal",value:"n",description:'"n"'},zt=function(){return"\n"},Dt="r",Gt={type:"literal",value:"r",description:'"r"'},Ht=function(){return"\r"},Jt="t",Kt={type:"literal",value:"t",description:'"t"'},Lt=function(){return" "},Mt=0,Nt=0,Ot=[{line:1,column:1,seenCR:!1}],Pt=0,Qt=[],Vt=0;if("startRule"in O){if(!(O.startRule in Q))throw new Error("Can't start parsing from rule \""+O.startRule+'".');V=Q[O.startRule]}var Wt=require("../flow/utils.js");U.desc="true",j.desc="false";var Xt=[new RegExp("text/javascript"),new RegExp("application/x-javascript"),new RegExp("application/javascript"),new RegExp("text/css"),new RegExp("image/.*"),new RegExp("application/x-shockwave-flash")];if(T.desc="is asset",k.desc="has error",G.desc="has no response",H.desc="has response",N=V(),N!==P&&Mt===e.length)return N;throw N!==P&&Mt= 0 && options.url[0] === "/") { + if (options.url.indexOf("?") === -1) { + options.url += "?" + xsrf; + } else { + options.url += "&" + xsrf; + } + } +}); +// Log AJAX Errors +(0, _jquery2.default)(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) { + if (thrownError === "abort") { + return; + } + var message = jqXHR.responseText; + console.error(thrownError, message, arguments); + alert(message); +}); -},{"../actions.js":2,"../dispatcher.js":25,"events":1,"jquery":"jquery","lodash":"lodash"}],35:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function reverseString(e){return String.fromCharCode.apply(String,_lodash2["default"].map(e.split(""),function(e){return 65535-e.charCodeAt(0)}))+end}function getCookie(e){var r=document.cookie.match(new RegExp("\\b"+e+"=([^;]*)\\b"));return r?r[1]:void 0}function fetchApi(e,r){return e+=-1===e.indexOf("?")?"?"+xsrf:"&"+xsrf,fetch(e,_extends({},r,{credentials:"same-origin"}))}Object.defineProperty(exports,"__esModule",{value:!0}),exports.formatTimeStamp=exports.formatTimeDelta=exports.formatSize=exports.Key=void 0;var _extends=Object.assign||function(e){for(var r=1;r=i;i++)Key[String.fromCharCode(i)]=i;var formatSize=exports.formatSize=function(e){if(0===e)return"0";for(var r=["b","kb","mb","gb","tb"],t=0;te);t++);var o;return o=e%Math.pow(1024,t)===0?0:1,(e/Math.pow(1024,t)).toFixed(o)+r[t]},formatTimeDelta=exports.formatTimeDelta=function(e){for(var r=e,t=["ms","s","min","h"],o=[1e3,60,60],a=0;Math.abs(r)>=o[a]&&a=0&&"/"===e.url[0]&&(-1===e.url.indexOf("?")?e.url+="?"+xsrf:e.url+="&"+xsrf)}),(0,_jquery2["default"])(document).ajaxError(function(e,r,t,o){if("abort"!==o){var a=r.responseText;console.error(o,a,arguments),alert(a)}}); +function fetchApi(url, options) { + if (url.indexOf("?") === -1) { + url += "?" + xsrf; + } else { + url += "&" + xsrf; + } + return fetch(url, _extends({}, options, { + credentials: 'same-origin' + })); +} },{"./actions.js":2,"jquery":"jquery","lodash":"lodash","react":"react"}]},{},[3]) diff --git a/mitmproxy/web/static/vendor.js b/mitmproxy/web/static/vendor.js index a02a645d..08af964a 100644 --- a/mitmproxy/web/static/vendor.js +++ b/mitmproxy/web/static/vendor.js @@ -1,1129 +1,54178 @@ require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o0&&"number"!=typeof e[0]):!1}function objEquiv(e,t,r){var n,i;if(isUndefinedOrNull(e)||isUndefinedOrNull(t))return!1;if(e.prototype!==t.prototype)return!1;if(isArguments(e))return isArguments(t)?(e=pSlice.call(e),t=pSlice.call(t),deepEqual(e,t,r)):!1;if(isBuffer(e)){if(!isBuffer(t))return!1;if(e.length!==t.length)return!1;for(n=0;n=0;n--)if(u[n]!=o[n])return!1;for(n=u.length-1;n>=0;n--)if(i=u[n],!deepEqual(e[i],t[i],r))return!1;return typeof e==typeof t}var pSlice=Array.prototype.slice,objectKeys=require("./lib/keys.js"),isArguments=require("./lib/is_arguments.js"),deepEqual=module.exports=function(e,t,r){return r||(r={}),e===t?!0:e instanceof Date&&t instanceof Date?e.getTime()===t.getTime():!e||!t||"object"!=typeof e&&"object"!=typeof t?r.strict?e===t:e==t:objEquiv(e,t,r)}; +var pSlice = Array.prototype.slice; +var objectKeys = require('./lib/keys.js'); +var isArguments = require('./lib/is_arguments.js'); + +var deepEqual = module.exports = function (actual, expected, opts) { + if (!opts) opts = {}; + // 7.1. All identical values are equivalent, as determined by ===. + if (actual === expected) { + return true; + + } else if (actual instanceof Date && expected instanceof Date) { + return actual.getTime() === expected.getTime(); + + // 7.3. Other pairs that do not both pass typeof value == 'object', + // equivalence is determined by ==. + } else if (!actual || !expected || typeof actual != 'object' && typeof expected != 'object') { + return opts.strict ? actual === expected : actual == expected; + + // 7.4. For all other Object pairs, including Array objects, equivalence is + // determined by having the same number of owned properties (as verified + // with Object.prototype.hasOwnProperty.call), the same set of keys + // (although not necessarily the same order), equivalent values for every + // corresponding key, and an identical 'prototype' property. Note: this + // accounts for both named and indexed properties on Arrays. + } else { + return objEquiv(actual, expected, opts); + } +} + +function isUndefinedOrNull(value) { + return value === null || value === undefined; +} + +function isBuffer (x) { + if (!x || typeof x !== 'object' || typeof x.length !== 'number') return false; + if (typeof x.copy !== 'function' || typeof x.slice !== 'function') { + return false; + } + if (x.length > 0 && typeof x[0] !== 'number') return false; + return true; +} + +function objEquiv(a, b, opts) { + var i, key; + if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) + return false; + // an identical 'prototype' property. + if (a.prototype !== b.prototype) return false; + //~~~I've managed to break Object.keys through screwy arguments passing. + // Converting to array solves the problem. + if (isArguments(a)) { + if (!isArguments(b)) { + return false; + } + a = pSlice.call(a); + b = pSlice.call(b); + return deepEqual(a, b, opts); + } + if (isBuffer(a)) { + if (!isBuffer(b)) { + return false; + } + if (a.length !== b.length) return false; + for (i = 0; i < a.length; i++) { + if (a[i] !== b[i]) return false; + } + return true; + } + try { + var ka = objectKeys(a), + kb = objectKeys(b); + } catch (e) {//happens when one is a string literal and the other isn't + return false; + } + // having the same number of owned properties (keys incorporates + // hasOwnProperty) + if (ka.length != kb.length) + return false; + //the same set of keys (although not necessarily the same order), + ka.sort(); + kb.sort(); + //~~~cheap key test + for (i = ka.length - 1; i >= 0; i--) { + if (ka[i] != kb[i]) + return false; + } + //equivalent values for every corresponding key, and + //~~~possibly expensive deep test + for (i = ka.length - 1; i >= 0; i--) { + key = ka[i]; + if (!deepEqual(a[key], b[key], opts)) return false; + } + return typeof a === typeof b; +} },{"./lib/is_arguments.js":2,"./lib/keys.js":3}],2:[function(require,module,exports){ -function supported(t){return"[object Arguments]"==Object.prototype.toString.call(t)}function unsupported(t){return t&&"object"==typeof t&&"number"==typeof t.length&&Object.prototype.hasOwnProperty.call(t,"callee")&&!Object.prototype.propertyIsEnumerable.call(t,"callee")||!1}var supportsArgumentsClass="[object Arguments]"==function(){return Object.prototype.toString.call(arguments)}();exports=module.exports=supportsArgumentsClass?supported:unsupported,exports.supported=supported,exports.unsupported=unsupported; +var supportsArgumentsClass = (function(){ + return Object.prototype.toString.call(arguments) +})() == '[object Arguments]'; + +exports = module.exports = supportsArgumentsClass ? supported : unsupported; + +exports.supported = supported; +function supported(object) { + return Object.prototype.toString.call(object) == '[object Arguments]'; +}; + +exports.unsupported = unsupported; +function unsupported(object){ + return object && + typeof object == 'object' && + typeof object.length == 'number' && + Object.prototype.hasOwnProperty.call(object, 'callee') && + !Object.prototype.propertyIsEnumerable.call(object, 'callee') || + false; +}; },{}],3:[function(require,module,exports){ -function shim(e){var s=[];for(var t in e)s.push(t);return s}exports=module.exports="function"==typeof Object.keys?Object.keys:shim,exports.shim=shim; +exports = module.exports = typeof Object.keys === 'function' + ? Object.keys : shim; + +exports.shim = shim; +function shim (obj) { + var keys = []; + for (var key in obj) keys.push(key); + return keys; +} },{}],4:[function(require,module,exports){ (function (process){ -"use strict";var invariant=function(r,e,n,i,o,a,t,s){if("production"!==process.env.NODE_ENV&&void 0===e)throw new Error("invariant requires an error message argument");if(!r){var u;if(void 0===e)u=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var v=[n,i,o,a,t,s],d=0;u=new Error("Invariant Violation: "+e.replace(/%s/g,function(){return v[d++]}))}throw u.framesToPop=1,u}};module.exports=invariant; - +/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule invariant + */ + +"use strict"; + +/** + * Use invariant() to assert state which your program assumes to be true. + * + * Provide sprintf-style format (only %s is supported) and arguments + * to provide information about what broke and what you were + * expecting. + * + * The invariant message will be stripped in production, but the invariant + * will remain to ensure logic does not differ in production. + */ + +var invariant = function (condition, format, a, b, c, d, e, f) { + if (process.env.NODE_ENV !== 'production') { + if (format === undefined) { + throw new Error('invariant requires an error message argument'); + } + } + + if (!condition) { + var error; + if (format === undefined) { + error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.'); + } else { + var args = [a, b, c, d, e, f]; + var argIndex = 0; + error = new Error('Invariant Violation: ' + format.replace(/%s/g, function () { + return args[argIndex++]; + })); + } + + error.framesToPop = 1; // we don't care about invariant's own frame + throw error; + } +}; + +module.exports = invariant; }).call(this,require('_process')) },{"_process":32}],5:[function(require,module,exports){ (function (process){ -"use strict";function _classCallCheck(i,t){if(!(i instanceof t))throw new TypeError("Cannot call a class as a function")}exports.__esModule=!0;var invariant=require("fbjs/lib/invariant"),_prefix="ID_",Dispatcher=function(){function i(){_classCallCheck(this,i),this._callbacks={},this._isDispatching=!1,this._isHandled={},this._isPending={},this._lastID=1}return i.prototype.register=function(i){var t=_prefix+this._lastID++;return this._callbacks[t]=i,t},i.prototype.unregister=function(i){this._callbacks[i]?void 0:"production"!==process.env.NODE_ENV?invariant(!1,"Dispatcher.unregister(...): `%s` does not map to a registered callback.",i):invariant(!1),delete this._callbacks[i]},i.prototype.waitFor=function(i){this._isDispatching?void 0:"production"!==process.env.NODE_ENV?invariant(!1,"Dispatcher.waitFor(...): Must be invoked while dispatching."):invariant(!1);for(var t=0;tl&&e;)e=!1,i.call(this,l++,s,c);return n=!1,r?void t.apply(this,p):void(l>=o&&e&&(r=!0,t()))}}var l=0,r=!1,n=!1,e=!1,p=void 0;s()}exports.__esModule=!0;var _slice=Array.prototype.slice;exports.loopAsync=loopAsync; - +"use strict"; + +exports.__esModule = true; +var _slice = Array.prototype.slice; +exports.loopAsync = loopAsync; + +function loopAsync(turns, work, callback) { + var currentTurn = 0, + isDone = false; + var sync = false, + hasNext = false, + doneArgs = undefined; + + function done() { + isDone = true; + if (sync) { + // Iterate instead of recursing if possible. + doneArgs = [].concat(_slice.call(arguments)); + return; + } + + callback.apply(this, arguments); + } + + function next() { + if (isDone) { + return; + } + + hasNext = true; + if (sync) { + // Iterate instead of recursing if possible. + return; + } + + sync = true; + + while (!isDone && currentTurn < turns && hasNext) { + hasNext = false; + work.call(this, currentTurn++, next, done); + } + + sync = false; + + if (isDone) { + // This means the loop finished synchronously. + callback.apply(this, doneArgs); + return; + } + + if (currentTurn >= turns && hasNext) { + isDone = true; + callback(); + } + } + + next(); +} },{}],8:[function(require,module,exports){ (function (process){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function createKey(e){return KeyPrefix+e}function saveState(e,r){try{null==r?window.sessionStorage.removeItem(createKey(e)):window.sessionStorage.setItem(createKey(e),JSON.stringify(r))}catch(t){if(t.name===SecurityError)return void("production"!==process.env.NODE_ENV?_warning2["default"](!1,"[history] Unable to save state; sessionStorage is not available due to security settings"):void 0);if(QuotaExceededErrors.indexOf(t.name)>=0&&0===window.sessionStorage.length)return void("production"!==process.env.NODE_ENV?_warning2["default"](!1,"[history] Unable to save state; sessionStorage is not available in Safari private mode"):void 0);throw t}}function readState(e){var r=void 0;try{r=window.sessionStorage.getItem(createKey(e))}catch(t){if(t.name===SecurityError)return"production"!==process.env.NODE_ENV?_warning2["default"](!1,"[history] Unable to read state; sessionStorage is not available due to security settings"):void 0,null}if(r)try{return JSON.parse(r)}catch(t){}return null}exports.__esModule=!0,exports.saveState=saveState,exports.readState=readState;var _warning=require("warning"),_warning2=_interopRequireDefault(_warning),KeyPrefix="@@History/",QuotaExceededErrors=["QuotaExceededError","QUOTA_EXCEEDED_ERR"],SecurityError="SecurityError"; - +/*eslint-disable no-empty */ +'use strict'; + +exports.__esModule = true; +exports.saveState = saveState; +exports.readState = readState; + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _warning = require('warning'); + +var _warning2 = _interopRequireDefault(_warning); + +var KeyPrefix = '@@History/'; +var QuotaExceededErrors = ['QuotaExceededError', 'QUOTA_EXCEEDED_ERR']; + +var SecurityError = 'SecurityError'; + +function createKey(key) { + return KeyPrefix + key; +} + +function saveState(key, state) { + try { + if (state == null) { + window.sessionStorage.removeItem(createKey(key)); + } else { + window.sessionStorage.setItem(createKey(key), JSON.stringify(state)); + } + } catch (error) { + if (error.name === SecurityError) { + // Blocking cookies in Chrome/Firefox/Safari throws SecurityError on any + // attempt to access window.sessionStorage. + process.env.NODE_ENV !== 'production' ? _warning2['default'](false, '[history] Unable to save state; sessionStorage is not available due to security settings') : undefined; + + return; + } + + if (QuotaExceededErrors.indexOf(error.name) >= 0 && window.sessionStorage.length === 0) { + // Safari "private mode" throws QuotaExceededError. + process.env.NODE_ENV !== 'production' ? _warning2['default'](false, '[history] Unable to save state; sessionStorage is not available in Safari private mode') : undefined; + + return; + } + + throw error; + } +} + +function readState(key) { + var json = undefined; + try { + json = window.sessionStorage.getItem(createKey(key)); + } catch (error) { + if (error.name === SecurityError) { + // Blocking cookies in Chrome/Firefox/Safari throws SecurityError on any + // attempt to access window.sessionStorage. + process.env.NODE_ENV !== 'production' ? _warning2['default'](false, '[history] Unable to read state; sessionStorage is not available due to security settings') : undefined; + + return null; + } + } + + if (json) { + try { + return JSON.parse(json); + } catch (error) { + // Ignore invalid JSON. + } + } + + return null; +} }).call(this,require('_process')) },{"_process":32,"warning":250}],9:[function(require,module,exports){ -"use strict";function addEventListener(t,e,o){t.addEventListener?t.addEventListener(e,o,!1):t.attachEvent("on"+e,o)}function removeEventListener(t,e,o){t.removeEventListener?t.removeEventListener(e,o,!1):t.detachEvent("on"+e,o)}function getHashPath(){return window.location.href.split("#")[1]||""}function replaceHashPath(t){window.location.replace(window.location.pathname+window.location.search+"#"+t)}function getWindowPath(){return window.location.pathname+window.location.search+window.location.hash}function go(t){t&&window.history.go(t)}function getUserConfirmation(t,e){e(window.confirm(t))}function supportsHistory(){var t=navigator.userAgent;return-1===t.indexOf("Android 2.")&&-1===t.indexOf("Android 4.0")||-1===t.indexOf("Mobile Safari")||-1!==t.indexOf("Chrome")||-1!==t.indexOf("Windows Phone")?window.history&&"pushState"in window.history:!1}function supportsGoWithoutReloadUsingHash(){var t=navigator.userAgent;return-1===t.indexOf("Firefox")}exports.__esModule=!0,exports.addEventListener=addEventListener,exports.removeEventListener=removeEventListener,exports.getHashPath=getHashPath,exports.replaceHashPath=replaceHashPath,exports.getWindowPath=getWindowPath,exports.go=go,exports.getUserConfirmation=getUserConfirmation,exports.supportsHistory=supportsHistory,exports.supportsGoWithoutReloadUsingHash=supportsGoWithoutReloadUsingHash; - +'use strict'; + +exports.__esModule = true; +exports.addEventListener = addEventListener; +exports.removeEventListener = removeEventListener; +exports.getHashPath = getHashPath; +exports.replaceHashPath = replaceHashPath; +exports.getWindowPath = getWindowPath; +exports.go = go; +exports.getUserConfirmation = getUserConfirmation; +exports.supportsHistory = supportsHistory; +exports.supportsGoWithoutReloadUsingHash = supportsGoWithoutReloadUsingHash; + +function addEventListener(node, event, listener) { + if (node.addEventListener) { + node.addEventListener(event, listener, false); + } else { + node.attachEvent('on' + event, listener); + } +} + +function removeEventListener(node, event, listener) { + if (node.removeEventListener) { + node.removeEventListener(event, listener, false); + } else { + node.detachEvent('on' + event, listener); + } +} + +function getHashPath() { + // We can't use window.location.hash here because it's not + // consistent across browsers - Firefox will pre-decode it! + return window.location.href.split('#')[1] || ''; +} + +function replaceHashPath(path) { + window.location.replace(window.location.pathname + window.location.search + '#' + path); +} + +function getWindowPath() { + return window.location.pathname + window.location.search + window.location.hash; +} + +function go(n) { + if (n) window.history.go(n); +} + +function getUserConfirmation(message, callback) { + callback(window.confirm(message)); +} + +/** + * Returns true if the HTML5 history API is supported. Taken from Modernizr. + * + * https://github.com/Modernizr/Modernizr/blob/master/LICENSE + * https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js + * changed to avoid false negatives for Windows Phones: https://github.com/rackt/react-router/issues/586 + */ + +function supportsHistory() { + var ua = navigator.userAgent; + if ((ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) && ua.indexOf('Mobile Safari') !== -1 && ua.indexOf('Chrome') === -1 && ua.indexOf('Windows Phone') === -1) { + return false; + } + return window.history && 'pushState' in window.history; +} + +/** + * Returns false if using go(n) with hash history causes a full page reload. + */ + +function supportsGoWithoutReloadUsingHash() { + var ua = navigator.userAgent; + return ua.indexOf('Firefox') === -1; +} },{}],10:[function(require,module,exports){ -"use strict";exports.__esModule=!0;var canUseDOM=!("undefined"==typeof window||!window.document||!window.document.createElement);exports.canUseDOM=canUseDOM; +'use strict'; +exports.__esModule = true; +var canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement); +exports.canUseDOM = canUseDOM; },{}],11:[function(require,module,exports){ (function (process){ -"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function extractPath(t){var e=t.match(/^https?:\/\/[^\/]*/);return null==e?t:t.substring(e[0].length)}function parsePath(t){var e=extractPath(t),r="",a="";"production"!==process.env.NODE_ENV?_warning2["default"](t===e,'A path must be pathname + search + hash only, not a fully qualified URL like "%s"',t):void 0;var n=e.indexOf("#");-1!==n&&(a=e.substring(n),e=e.substring(0,n));var s=e.indexOf("?");return-1!==s&&(r=e.substring(s),e=e.substring(0,s)),""===e&&(e="/"),{pathname:e,search:r,hash:a}}exports.__esModule=!0,exports.extractPath=extractPath,exports.parsePath=parsePath;var _warning=require("warning"),_warning2=_interopRequireDefault(_warning); +'use strict'; -}).call(this,require('_process')) +exports.__esModule = true; +exports.extractPath = extractPath; +exports.parsePath = parsePath; -},{"_process":32,"warning":250}],12:[function(require,module,exports){ -(function (process){ -"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function createBrowserHistory(){function t(t){try{t=t||window.history.state||{}}catch(e){t={}}var r=_DOMUtils.getWindowPath(),n=t,i=n.key,o=void 0;i?o=_DOMStateStorage.readState(i):(o=null,i=_.createKey(),c&&window.history.replaceState(_extends({},t,{key:i}),null));var a=_PathUtils.parsePath(r);return _.createLocation(_extends({},a,{state:o}),void 0,i)}function e(e){function r(e){void 0!==e.state&&n(t(e.state))}var n=e.transitionTo;return _DOMUtils.addEventListener(window,"popstate",r),function(){_DOMUtils.removeEventListener(window,"popstate",r)}}function r(t){var e=t.basename,r=t.pathname,n=t.search,i=t.hash,o=t.state,a=t.action,s=t.key;if(a!==_Actions.POP){_DOMStateStorage.saveState(s,o);var u=(e||"")+r+n+i,c={key:s};if(a===_Actions.PUSH){if(l)return window.location.href=u,!1;window.history.pushState(c,null,u)}else{if(l)return window.location.replace(u),!1;window.history.replaceState(c,null,u)}}}function n(t){1===++f&&(v=e(_));var r=_.listenBefore(t);return function(){r(),0===--f&&v()}}function i(t){1===++f&&(v=e(_));var r=_.listen(t);return function(){r(),0===--f&&v()}}function o(t){1===++f&&(v=e(_)),_.registerTransitionHook(t)}function a(t){_.unregisterTransitionHook(t),0===--f&&v()}var s=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];_ExecutionEnvironment.canUseDOM?void 0:"production"!==process.env.NODE_ENV?_invariant2["default"](!1,"Browser history needs a DOM"):_invariant2["default"](!1);var u=s.forceRefresh,c=_DOMUtils.supportsHistory(),l=!c||u,_=_createDOMHistory2["default"](_extends({},s,{getCurrentLocation:t,finishTransition:r,saveState:_DOMStateStorage.saveState})),f=0,v=void 0;return _extends({},_,{listenBefore:n,listen:i,registerTransitionHook:o,unregisterTransitionHook:a})}exports.__esModule=!0;var _extends=Object.assign||function(t){for(var e=1;e=0&&t=0&&f= 0 and < %s, was %s",c.length,f):_invariant2["default"](!1);var _=createStateStorage(c);return s}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t is deprecated and will be removed in the next major release. The semantics of are subtly different from basename. Please pass the basename explicitly in the options to createHistory"):void 0)}m=!0}}function n(e){return t(),_&&null==e.basename&&(0===e.pathname.indexOf(_)?(e.pathname=e.pathname.substring(_.length),e.basename=_,""===e.pathname&&(e.pathname="/")):e.basename=""),e}function a(e){if(t(),!_)return e;"string"==typeof e&&(e=_PathUtils.parsePath(e));var n=e.pathname,a="/"===_.slice(-1)?_:_+"/",r="/"===n.charAt(0)?n.slice(1):n,i=a+r;return _extends({},e,{pathname:i})}function r(e){return h.listenBefore(function(t,a){_runTransitionHook2["default"](e,n(t),a)})}function i(e){return h.listen(function(t){e(n(t))})}function s(e){h.push(a(e))}function o(e){h.replace(a(e))}function u(e){return h.createPath(a(e))}function c(e){return h.createHref(a(e))}function l(e){for(var t=arguments.length,r=Array(t>1?t-1:0),i=1;t>i;i++)r[i-1]=arguments[i];return n(h.createLocation.apply(h,[a(e)].concat(r)))}function f(e,t){"string"==typeof t&&(t=_PathUtils.parsePath(t)),s(_extends({state:e},t))}function p(e,t){"string"==typeof t&&(t=_PathUtils.parsePath(t)),o(_extends({state:e},t))}var d=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],h=e(d),_=d.basename,m=!1;return _extends({},h,{listenBefore:r,listen:i,push:s,replace:o,createPath:u,createHref:c,createLocation:l,pushState:_deprecate2["default"](f,"pushState is deprecated; use push instead"),replaceState:_deprecate2["default"](p,"replaceState is deprecated; use replace instead")})}}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t1?n-1:0),u=1;n>u;u++)a[u-1]=arguments[u];var i=l.createLocation.apply(l,[t(e,e.query)].concat(a));return e.query&&(i.query=e.query),r(i)}function f(e,r,t){"string"==typeof r&&(r=_PathUtils.parsePath(r)),u(_extends({state:e},r,{query:t}))}function p(e,r,t){"string"==typeof r&&(r=_PathUtils.parsePath(r)),i(_extends({state:e},r,{query:t}))}var d=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],l=e(d),y=d.stringifyQuery,_=d.parseQueryString;return"function"!=typeof y&&(y=defaultStringifyQuery),"function"!=typeof _&&(_=defaultParseQueryString),_extends({},l,{listenBefore:n,listen:a,push:u,replace:i,createPath:s,createHref:o,createLocation:c,pushState:_deprecate2["default"](f,"pushState is deprecated; use push instead"),replaceState:_deprecate2["default"](p,"replaceState is deprecated; use replace instead")})}}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var r=1;r-1&&t%1==0&&MAX_SAFE_INTEGER>=t}function isObject(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function isObjectLike(t){return!!t&&"object"==typeof t}var MAX_SAFE_INTEGER=9007199254740991,argsTag="[object Arguments]",funcTag="[object Function]",genTag="[object GeneratorFunction]",objectProto=Object.prototype,hasOwnProperty=objectProto.hasOwnProperty,objectToString=objectProto.toString,propertyIsEnumerable=objectProto.propertyIsEnumerable,getLength=baseProperty("length");module.exports=isArguments; +var _createDOMHistory = require('./createDOMHistory'); -},{}],26:[function(require,module,exports){ -function isObjectLike(t){return!!t&&"object"==typeof t}function getNative(t,r){var e=null==t?void 0:t[r];return isNative(e)?e:void 0}function isLength(t){return"number"==typeof t&&t>-1&&t%1==0&&MAX_SAFE_INTEGER>=t}function isFunction(t){return isObject(t)&&objToString.call(t)==funcTag}function isObject(t){var r=typeof t;return!!t&&("object"==r||"function"==r)}function isNative(t){return null==t?!1:isFunction(t)?reIsNative.test(fnToString.call(t)):isObjectLike(t)&&reIsHostCtor.test(t)}var arrayTag="[object Array]",funcTag="[object Function]",reIsHostCtor=/^\[object .+?Constructor\]$/,objectProto=Object.prototype,fnToString=Function.prototype.toString,hasOwnProperty=objectProto.hasOwnProperty,objToString=objectProto.toString,reIsNative=RegExp("^"+fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),nativeIsArray=getNative(Array,"isArray"),MAX_SAFE_INTEGER=9007199254740991,isArray=nativeIsArray||function(t){return isObjectLike(t)&&isLength(t.length)&&objToString.call(t)==arrayTag};module.exports=isArray; +var _createDOMHistory2 = _interopRequireDefault(_createDOMHistory); -},{}],27:[function(require,module,exports){ -function baseProperty(e){return function(t){return null==t?void 0:t[e]}}function isArrayLike(e){return null!=e&&isLength(getLength(e))}function isIndex(e,t){return e="number"==typeof e||reIsUint.test(e)?+e:-1,t=null==t?MAX_SAFE_INTEGER:t,e>-1&&e%1==0&&t>e}function isLength(e){return"number"==typeof e&&e>-1&&e%1==0&&MAX_SAFE_INTEGER>=e}function shimKeys(e){for(var t=keysIn(e),r=t.length,n=r&&e.length,s=!!n&&isLength(n)&&(isArray(e)||isArguments(e)),o=-1,i=[];++o0;++n1)for(var r=1;r 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."))}exports.__esModule=!0,exports["default"]=void 0;var _react=require("react"),_storeShape=require("../utils/storeShape"),_storeShape2=_interopRequireDefault(_storeShape),_warning=require("../utils/warning"),_warning2=_interopRequireDefault(_warning),didWarnAboutReceivingStore=!1,Provider=function(e){function t(r,o){_classCallCheck(this,t);var n=_possibleConstructorReturn(this,e.call(this,r,o));return n.store=r.store,n}return _inherits(t,e),t.prototype.getChildContext=function(){return{store:this.store}},t.prototype.render=function(){var e=this.props.children;return _react.Children.only(e)},t}(_react.Component);exports["default"]=Provider,"production"!==process.env.NODE_ENV&&(Provider.prototype.componentWillReceiveProps=function(e){var t=this.store,r=e.store;t!==r&&warnAboutReceivingStore()}),Provider.propTypes={store:_storeShape2["default"].isRequired,children:_react.PropTypes.element.isRequired},Provider.childContextTypes={store:_storeShape2["default"].isRequired}; + if (isSupported) window.history.replaceState(_extends({}, historyState, { key: key }), null); + } -}).call(this,require('_process')) + var location = _PathUtils.parsePath(path); -},{"../utils/storeShape":37,"../utils/warning":38,"_process":32,"react":"react"}],35:[function(require,module,exports){ -(function (process){ -"use strict";function _interopRequireDefault(t){return t&&t.__esModule?t:{"default":t}}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function getDisplayName(t){return t.displayName||t.name||"Component"}function tryCatch(t,e){try{return t.apply(e)}catch(r){return errorObject.value=r,errorObject}}function connect(t,e,r){var o=arguments.length<=3||void 0===arguments[3]?{}:arguments[3],s=Boolean(t),a=t||defaultMapStateToProps,n=void 0;n="function"==typeof e?e:e?(0,_wrapActionCreators2["default"])(e):defaultMapDispatchToProps;var i=r||defaultMergeProps,p=o.pure,u=void 0===p?!0:p,c=o.withRef,h=void 0===c?!1:c,l=u&&i!==defaultMergeProps,d=nextVersion++;return function(t){function e(t,e){(0,_isPlainObject2["default"])(t)||(0,_warning2["default"])(e+"() in "+o+" must return a plain object. "+("Instead received "+t+"."))}function r(t,r,o){var s=i(t,r,o);return"production"!==process.env.NODE_ENV&&e(s,"mergeProps"),s}var o="Connect("+getDisplayName(t)+")",p=function(i){function p(t,e){_classCallCheck(this,p);var r=_possibleConstructorReturn(this,i.call(this,t,e));r.version=d,r.store=t.store||e.store,(0,_invariant2["default"])(r.store,'Could not find "store" in either the context or '+('props of "'+o+'". ')+"Either wrap the root component in a , "+('or explicitly pass "store" as a prop to "'+o+'".'));var s=r.store.getState();return r.state={storeState:s},r.clearCache(),r}return _inherits(p,i),p.prototype.shouldComponentUpdate=function(){return!u||this.haveOwnPropsChanged||this.hasStoreStateChanged},p.prototype.computeStateProps=function(t,r){if(!this.finalMapStateToProps)return this.configureFinalMapState(t,r);var o=t.getState(),s=this.doStatePropsDependOnOwnProps?this.finalMapStateToProps(o,r):this.finalMapStateToProps(o);return"production"!==process.env.NODE_ENV&&e(s,"mapStateToProps"),s},p.prototype.configureFinalMapState=function(t,r){var o=a(t.getState(),r),s="function"==typeof o;return this.finalMapStateToProps=s?o:a,this.doStatePropsDependOnOwnProps=1!==this.finalMapStateToProps.length,s?this.computeStateProps(t,r):("production"!==process.env.NODE_ENV&&e(o,"mapStateToProps"),o)},p.prototype.computeDispatchProps=function(t,r){if(!this.finalMapDispatchToProps)return this.configureFinalMapDispatch(t,r);var o=t.dispatch,s=this.doDispatchPropsDependOnOwnProps?this.finalMapDispatchToProps(o,r):this.finalMapDispatchToProps(o);return"production"!==process.env.NODE_ENV&&e(s,"mapDispatchToProps"),s},p.prototype.configureFinalMapDispatch=function(t,r){var o=n(t.dispatch,r),s="function"==typeof o;return this.finalMapDispatchToProps=s?o:n,this.doDispatchPropsDependOnOwnProps=1!==this.finalMapDispatchToProps.length,s?this.computeDispatchProps(t,r):("production"!==process.env.NODE_ENV&&e(o,"mapDispatchToProps"),o)},p.prototype.updateStatePropsIfNeeded=function(){var t=this.computeStateProps(this.store,this.props);return this.stateProps&&(0,_shallowEqual2["default"])(t,this.stateProps)?!1:(this.stateProps=t,!0)},p.prototype.updateDispatchPropsIfNeeded=function(){var t=this.computeDispatchProps(this.store,this.props);return this.dispatchProps&&(0,_shallowEqual2["default"])(t,this.dispatchProps)?!1:(this.dispatchProps=t,!0)},p.prototype.updateMergedPropsIfNeeded=function(){var t=r(this.stateProps,this.dispatchProps,this.props);return this.mergedProps&&l&&(0,_shallowEqual2["default"])(t,this.mergedProps)?!1:(this.mergedProps=t,!0)},p.prototype.isSubscribed=function(){return"function"==typeof this.unsubscribe},p.prototype.trySubscribe=function(){s&&!this.unsubscribe&&(this.unsubscribe=this.store.subscribe(this.handleChange.bind(this)),this.handleChange())},p.prototype.tryUnsubscribe=function(){this.unsubscribe&&(this.unsubscribe(),this.unsubscribe=null)},p.prototype.componentDidMount=function(){this.trySubscribe()},p.prototype.componentWillReceiveProps=function(t){u&&(0,_shallowEqual2["default"])(t,this.props)||(this.haveOwnPropsChanged=!0)},p.prototype.componentWillUnmount=function(){this.tryUnsubscribe(),this.clearCache()},p.prototype.clearCache=function(){this.dispatchProps=null,this.stateProps=null,this.mergedProps=null,this.haveOwnPropsChanged=!0,this.hasStoreStateChanged=!0,this.haveStatePropsBeenPrecalculated=!1,this.statePropsPrecalculationError=null,this.renderedElement=null,this.finalMapDispatchToProps=null,this.finalMapStateToProps=null},p.prototype.handleChange=function(){if(this.unsubscribe){var t=this.store.getState(),e=this.state.storeState;if(!u||e!==t){if(u&&!this.doStatePropsDependOnOwnProps){var r=tryCatch(this.updateStatePropsIfNeeded,this);if(!r)return;r===errorObject&&(this.statePropsPrecalculationError=errorObject.value),this.haveStatePropsBeenPrecalculated=!0}this.hasStoreStateChanged=!0,this.setState({storeState:t})}}},p.prototype.getWrappedInstance=function(){return(0,_invariant2["default"])(h,"To access the wrapped instance, you need to specify { withRef: true } as the fourth argument of the connect() call."),this.refs.wrappedInstance},p.prototype.render=function(){var e=this.haveOwnPropsChanged,r=this.hasStoreStateChanged,o=this.haveStatePropsBeenPrecalculated,s=this.statePropsPrecalculationError,a=this.renderedElement;if(this.haveOwnPropsChanged=!1,this.hasStoreStateChanged=!1,this.haveStatePropsBeenPrecalculated=!1,this.statePropsPrecalculationError=null,s)throw s;var n=!0,i=!0;u&&a&&(n=r||e&&this.doStatePropsDependOnOwnProps,i=e&&this.doDispatchPropsDependOnOwnProps);var p=!1,c=!1;o?p=!0:n&&(p=this.updateStatePropsIfNeeded()),i&&(c=this.updateDispatchPropsIfNeeded());var l=!0;return l=p||c||e?this.updateMergedPropsIfNeeded():!1,!l&&a?a:(h?this.renderedElement=(0,_react.createElement)(t,_extends({},this.mergedProps,{ref:"wrappedInstance"})):this.renderedElement=(0,_react.createElement)(t,this.mergedProps),this.renderedElement)},p}(_react.Component);return p.displayName=o,p.WrappedComponent=t,p.contextTypes={store:_storeShape2["default"]},p.propTypes={store:_storeShape2["default"]},"production"!==process.env.NODE_ENV&&(p.prototype.componentWillUpdate=function(){this.version!==d&&(this.version=d,this.trySubscribe(),this.clearCache())}),(0,_hoistNonReactStatics2["default"])(p,t)}}var _extends=Object.assign||function(t){for(var e=1;er&&p;)p=!1,o.call(this,r++,i,c);return s=!1,l?void t.apply(this,u):void(r>=n&&p&&(l=!0,t()))}}var r=0,l=!1,s=!1,p=!1,u=void 0;i()}function mapAsync(n,o,t){function c(n,o,c){l||(o?(l=!0,t(o)):(r[n]=c,l=++s===i,l&&t(null,r)))}var i=n.length,r=[];if(0===i)return t(null,r);var l=!1,s=0;n.forEach(function(n,t){o(n,t,function(n,o){c(t,n,o)})})}exports.__esModule=!0,exports.loopAsync=loopAsync,exports.mapAsync=mapAsync; + function finishTransition(location) { + var basename = location.basename; + var pathname = location.pathname; + var search = location.search; + var hash = location.hash; + var state = location.state; + var action = location.action; + var key = location.key; -},{}],41:[function(require,module,exports){ -(function (process){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0;var _routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),_InternalPropTypes=require("./InternalPropTypes"),History={contextTypes:{history:_InternalPropTypes.history},componentWillMount:function(){"production"!==process.env.NODE_ENV?(0,_routerWarning2["default"])(!1,"the `History` mixin is deprecated, please access `context.router` with your own `contextTypes`. http://tiny.cc/router-historymixin"):void 0,this.history=this.context.history}};exports["default"]=History,module.exports=exports["default"]; + if (action === _Actions.POP) return; // Nothing to do. -}).call(this,require('_process')) + _DOMStateStorage.saveState(key, state); -},{"./InternalPropTypes":45,"./routerWarning":72,"_process":32}],42:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t does not make sense at the root of your route config"):void 0}},propTypes:{to:string.isRequired,query:object,state:object,onEnter:_InternalPropTypes.falsy,children:_InternalPropTypes.falsy},render:function(){"production"!==process.env.NODE_ENV?(0,_invariant2["default"])(!1," elements are for router configuration only and should not be rendered"):(0,_invariant2["default"])(!1)}});exports["default"]=IndexRedirect,module.exports=exports["default"]; + if (action === _Actions.PUSH) { + if (useRefresh) { + window.location.href = path; + return false; // Prevent location update. + } else { + window.history.pushState(historyState, null, path); + } + } else { + // REPLACE + if (useRefresh) { + window.location.replace(path); + return false; // Prevent location update. + } else { + window.history.replaceState(historyState, null, path); + } + } + } + + var history = _createDOMHistory2['default'](_extends({}, options, { + getCurrentLocation: getCurrentLocation, + finishTransition: finishTransition, + saveState: _DOMStateStorage.saveState + })); + + var listenerCount = 0, + stopPopStateListener = undefined; + + function listenBefore(listener) { + if (++listenerCount === 1) stopPopStateListener = startPopStateListener(history); + + var unlisten = history.listenBefore(listener); + + return function () { + unlisten(); + + if (--listenerCount === 0) stopPopStateListener(); + }; + } + + function listen(listener) { + if (++listenerCount === 1) stopPopStateListener = startPopStateListener(history); + + var unlisten = history.listen(listener); + + return function () { + unlisten(); + + if (--listenerCount === 0) stopPopStateListener(); + }; + } + + // deprecated + function registerTransitionHook(hook) { + if (++listenerCount === 1) stopPopStateListener = startPopStateListener(history); + + history.registerTransitionHook(hook); + } + // deprecated + function unregisterTransitionHook(hook) { + history.unregisterTransitionHook(hook); + + if (--listenerCount === 0) stopPopStateListener(); + } + + return _extends({}, history, { + listenBefore: listenBefore, + listen: listen, + registerTransitionHook: registerTransitionHook, + unregisterTransitionHook: unregisterTransitionHook + }); +} + +exports['default'] = createBrowserHistory; +module.exports = exports['default']; }).call(this,require('_process')) -},{"./InternalPropTypes":45,"./Redirect":50,"./routerWarning":72,"_process":32,"invariant":76,"react":"react"}],44:[function(require,module,exports){ +},{"./Actions":6,"./DOMStateStorage":8,"./DOMUtils":9,"./ExecutionEnvironment":10,"./PathUtils":11,"./createDOMHistory":13,"_process":32,"invariant":23}],13:[function(require,module,exports){ (function (process){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0;var _react=require("react"),_react2=_interopRequireDefault(_react),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_RouteUtils=require("./RouteUtils"),_InternalPropTypes=require("./InternalPropTypes"),func=_react2["default"].PropTypes.func,IndexRoute=_react2["default"].createClass({displayName:"IndexRoute",statics:{createRouteFromReactElement:function(e,t){t?t.indexRoute=(0,_RouteUtils.createRouteFromReactElement)(e):"production"!==process.env.NODE_ENV?(0,_routerWarning2["default"])(!1,"An does not make sense at the root of your route config"):void 0}},propTypes:{path:_InternalPropTypes.falsy,component:_InternalPropTypes.component,components:_InternalPropTypes.components,getComponent:func,getComponents:func},render:function(){"production"!==process.env.NODE_ENV?(0,_invariant2["default"])(!1," elements are for router configuration only and should not be rendered"):(0,_invariant2["default"])(!1)}});exports["default"]=IndexRoute,module.exports=exports["default"]; +'use strict'; -}).call(this,require('_process')) +exports.__esModule = true; -},{"./InternalPropTypes":45,"./RouteUtils":53,"./routerWarning":72,"_process":32,"invariant":76,"react":"react"}],45:[function(require,module,exports){ -"use strict";function falsy(e,r,o){return e[r]?new Error("<"+o+'> should not have a "'+r+'" prop'):void 0}exports.__esModule=!0,exports.routes=exports.route=exports.components=exports.component=exports.history=void 0,exports.falsy=falsy;var _react=require("react"),func=_react.PropTypes.func,object=_react.PropTypes.object,arrayOf=_react.PropTypes.arrayOf,oneOfType=_react.PropTypes.oneOfType,element=_react.PropTypes.element,shape=_react.PropTypes.shape,string=_react.PropTypes.string,history=exports.history=shape({listen:func.isRequired,push:func.isRequired,replace:func.isRequired,go:func.isRequired,goBack:func.isRequired,goForward:func.isRequired}),component=exports.component=oneOfType([func,string]),components=exports.components=oneOfType([component,object]),route=exports.route=oneOfType([object,element]),routes=exports.routes=oneOfType([route,arrayOf(route)]); +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; }; -},{"react":"react"}],46:[function(require,module,exports){ -(function (process){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0;var _routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),_react=require("react"),_react2=_interopRequireDefault(_react),_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),object=_react2["default"].PropTypes.object,Lifecycle={contextTypes:{history:object.isRequired,route:object},propTypes:{route:object},componentDidMount:function(){"production"!==process.env.NODE_ENV?(0,_routerWarning2["default"])(!1,"the `Lifecycle` mixin is deprecated, please use `context.router.setRouteLeaveHook(route, hook)`. http://tiny.cc/router-lifecyclemixin"):void 0,this.routerWillLeave?void 0:"production"!==process.env.NODE_ENV?(0,_invariant2["default"])(!1,"The Lifecycle mixin requires you to define a routerWillLeave method"):(0,_invariant2["default"])(!1);var e=this.props.route||this.context.route;e?void 0:"production"!==process.env.NODE_ENV?(0,_invariant2["default"])(!1,"The Lifecycle mixin must be used on either a) a or b) a descendant of a that uses the RouteContext mixin"):(0,_invariant2["default"])(!1),this._unlistenBeforeLeavingRoute=this.context.history.listenBeforeLeavingRoute(e,this.routerWillLeave)},componentWillUnmount:function(){this._unlistenBeforeLeavingRoute&&this._unlistenBeforeLeavingRoute()}};exports["default"]=Lifecycle,module.exports=exports["default"]; +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -}).call(this,require('_process')) +var _invariant = require('invariant'); -},{"./routerWarning":72,"_process":32,"invariant":76,"react":"react"}],47:[function(require,module,exports){ -(function (process){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _objectWithoutProperties(e,t){var r={};for(var a in e)t.indexOf(a)>=0||Object.prototype.hasOwnProperty.call(e,a)&&(r[a]=e[a]);return r}function isLeftClickEvent(e){return 0===e.button}function isModifiedEvent(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function isEmptyObject(e){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))return!1;return!0}function createLocationDescriptor(e,t){var r=t.query,a=t.hash,o=t.state;return r||a||o?{pathname:e,query:r,hash:a,state:o}:e}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t` are deprecated, use `. http://tiny.cc/router-isActivedeprecated"):void 0;var u=this.context.router;if(u){var p=createLocationDescriptor(t,{query:r,hash:a,state:o});c.href=u.createHref(p),(n||null!=s&&!isEmptyObject(s))&&u.isActive(p,i)&&(n&&(c.className?c.className+=" "+n:c.className=n),s&&(c.style=_extends({},c.style,s)))}return _react2["default"].createElement("a",_extends({},c,{onClick:this.handleClick}))}});exports["default"]=Link,module.exports=exports["default"]; +var _invariant2 = _interopRequireDefault(_invariant); -}).call(this,require('_process')) +var _ExecutionEnvironment = require('./ExecutionEnvironment'); -},{"./PropTypes":49,"./routerWarning":72,"_process":32,"react":"react"}],48:[function(require,module,exports){ -(function (process){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function escapeRegExp(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function _compilePattern(e){for(var t="",a=[],r=[],n=void 0,i=0,s=/:([a-zA-Z_$][a-zA-Z0-9_$]*)|\*\*|\*|\(|\)/g;n=s.exec(e);)n.index!==i&&(r.push(e.slice(i,n.index)),t+=escapeRegExp(e.slice(i,n.index))),n[1]?(t+="([^/]+)",a.push(n[1])):"**"===n[0]?(t+="(.*)",a.push("splat")):"*"===n[0]?(t+="(.*?)",a.push("splat")):"("===n[0]?t+="(?:":")"===n[0]&&(t+=")?"),r.push(n[0]),i=s.lastIndex;return i!==e.length&&(r.push(e.slice(i,e.length)),t+=escapeRegExp(e.slice(i,e.length))),{pattern:e,regexpSource:t,paramNames:a,tokens:r}}function compilePattern(e){return e in CompiledPatternsCache||(CompiledPatternsCache[e]=_compilePattern(e)),CompiledPatternsCache[e]}function matchPattern(e,t){"/"!==e.charAt(0)&&(e="/"+e);var a=compilePattern(e),r=a.regexpSource,n=a.paramNames,i=a.tokens;"/"!==e.charAt(e.length-1)&&(r+="/?"),"*"===i[i.length-1]&&(r+="$");var s=t.match(new RegExp("^"+r,"i"));if(null==s)return null;var o=s[0],l=t.substr(o.length);if(l){if("/"!==o.charAt(o.length-1))return null;l="/"+l}return{remainingPathname:l,paramNames:n,paramValues:s.slice(1).map(function(e){return e&&decodeURIComponent(e)})}}function getParamNames(e){return compilePattern(e).paramNames}function getParams(e,t){var a=matchPattern(e,t);if(!a)return null;var r=a.paramNames,n=a.paramValues,i={};return r.forEach(function(e,t){i[e]=n[t]}),i}function formatPattern(e,t){t=t||{};for(var a=compilePattern(e),r=a.tokens,n=0,i="",s=0,o=void 0,l=void 0,p=void 0,u=0,c=r.length;c>u;++u)o=r[u],"*"===o||"**"===o?(p=Array.isArray(t.splat)?t.splat[s++]:t.splat,null!=p||n>0?void 0:"production"!==process.env.NODE_ENV?(0,_invariant2["default"])(!1,'Missing splat #%s for path "%s"',s,e):(0,_invariant2["default"])(!1),null!=p&&(i+=encodeURI(p))):"("===o?n+=1:")"===o?n-=1:":"===o.charAt(0)?(l=o.substring(1),p=t[l],null!=p||n>0?void 0:"production"!==process.env.NODE_ENV?(0,_invariant2["default"])(!1,'Missing "%s" parameter for path "%s"',l,e):(0,_invariant2["default"])(!1),null!=p&&(i+=encodeURIComponent(p))):i+=o;return i.replace(/\/+/g,"/")}exports.__esModule=!0,exports.compilePattern=compilePattern,exports.matchPattern=matchPattern,exports.getParamNames=getParamNames,exports.getParams=getParams,exports.formatPattern=formatPattern;var _invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),CompiledPatternsCache={}; +var _DOMUtils = require('./DOMUtils'); -}).call(this,require('_process')) +var _createHistory = require('./createHistory'); -},{"_process":32,"invariant":76}],49:[function(require,module,exports){ -(function (process){ -"use strict";function _interopRequireWildcard(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o]);return r["default"]=e,r}function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0,exports.router=exports.routes=exports.route=exports.components=exports.component=exports.location=exports.history=exports.falsy=exports.locationShape=exports.routerShape=void 0;var _react=require("react"),_deprecateObjectProperties=require("./deprecateObjectProperties"),_deprecateObjectProperties2=_interopRequireDefault(_deprecateObjectProperties),_InternalPropTypes=require("./InternalPropTypes"),InternalPropTypes=_interopRequireWildcard(_InternalPropTypes),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),func=_react.PropTypes.func,object=_react.PropTypes.object,shape=_react.PropTypes.shape,string=_react.PropTypes.string,routerShape=exports.routerShape=shape({push:func.isRequired,replace:func.isRequired,go:func.isRequired,goBack:func.isRequired,goForward:func.isRequired,setRouteLeaveHook:func.isRequired,isActive:func.isRequired}),locationShape=exports.locationShape=shape({pathname:string.isRequired,search:string.isRequired,state:object,action:string.isRequired,key:string}),falsy=exports.falsy=InternalPropTypes.falsy,history=exports.history=InternalPropTypes.history,location=exports.location=locationShape,component=exports.component=InternalPropTypes.component,components=exports.components=InternalPropTypes.components,route=exports.route=InternalPropTypes.route,routes=exports.routes=InternalPropTypes.routes,router=exports.router=routerShape;"production"!==process.env.NODE_ENV&&!function(){var e=function(e,r){return function(){return"production"!==process.env.NODE_ENV?(0,_routerWarning2["default"])(!1,r):void 0,e.apply(void 0,arguments)}},r=function(r){return e(r,"This prop type is not intended for external use, and was previously exported by mistake. These internal prop types are deprecated for external use, and will be removed in a later version.")},o=function(r,o){return e(r,"The `"+o+"` prop type is now exported as `"+o+"Shape` to avoid name conflicts. This export is deprecated and will be removed in a later version.")};exports.falsy=falsy=r(falsy),exports.history=history=r(history),exports.component=component=r(component),exports.components=components=r(components),exports.route=route=r(route),exports.routes=routes=r(routes),exports.location=location=o(location,"location"),exports.router=router=o(router,"router")}();var defaultExport={falsy:falsy,history:history,location:location,component:component,components:components,route:route,router:router};"production"!==process.env.NODE_ENV&&(defaultExport=(0,_deprecateObjectProperties2["default"])(defaultExport,"The default export from `react-router/lib/PropTypes` is deprecated. Please use the named exports instead.")),exports["default"]=defaultExport; +var _createHistory2 = _interopRequireDefault(_createHistory); -}).call(this,require('_process')) +function createDOMHistory(options) { + var history = _createHistory2['default'](_extends({ + getUserConfirmation: _DOMUtils.getUserConfirmation + }, options, { + go: _DOMUtils.go + })); -},{"./InternalPropTypes":45,"./deprecateObjectProperties":65,"./routerWarning":72,"_process":32,"react":"react"}],50:[function(require,module,exports){ -(function (process){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0;var _react=require("react"),_react2=_interopRequireDefault(_react),_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_RouteUtils=require("./RouteUtils"),_PatternUtils=require("./PatternUtils"),_InternalPropTypes=require("./InternalPropTypes"),_React$PropTypes=_react2["default"].PropTypes,string=_React$PropTypes.string,object=_React$PropTypes.object,Redirect=_react2["default"].createClass({displayName:"Redirect",statics:{createRouteFromReactElement:function(e){var t=(0,_RouteUtils.createRouteFromReactElement)(e);return t.from&&(t.path=t.from),t.onEnter=function(e,r){var a=e.location,n=e.params,o=void 0;if("/"===t.to.charAt(0))o=(0,_PatternUtils.formatPattern)(t.to,n);else if(t.to){var i=e.routes.indexOf(t),s=Redirect.getRoutePattern(e.routes,i-1),u=s.replace(/\/*$/,"/")+t.to;o=(0,_PatternUtils.formatPattern)(u,n)}else o=a.pathname;r({pathname:o,query:t.query||a.query,state:t.state||a.state})},t},getRoutePattern:function(e,t){for(var r="",a=t;a>=0;a--){var n=e[a],o=n.path||"";if(r=o.replace(/\/*$/,"/")+r,0===o.indexOf("/"))break}return"/"+r}},propTypes:{path:string,from:string,to:string.isRequired,query:object,state:object,onEnter:_InternalPropTypes.falsy,children:_InternalPropTypes.falsy},render:function(){"production"!==process.env.NODE_ENV?(0,_invariant2["default"])(!1," elements are for router configuration only and should not be rendered"):(0,_invariant2["default"])(!1)}});exports["default"]=Redirect,module.exports=exports["default"]; + function listen(listener) { + !_ExecutionEnvironment.canUseDOM ? process.env.NODE_ENV !== 'production' ? _invariant2['default'](false, 'DOM history needs a DOM') : _invariant2['default'](false) : undefined; -}).call(this,require('_process')) + return history.listen(listener); + } -},{"./InternalPropTypes":45,"./PatternUtils":48,"./RouteUtils":53,"_process":32,"invariant":76,"react":"react"}],51:[function(require,module,exports){ -(function (process){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0;var _react=require("react"),_react2=_interopRequireDefault(_react),_invariant=require("invariant"),_invariant2=_interopRequireDefault(_invariant),_RouteUtils=require("./RouteUtils"),_InternalPropTypes=require("./InternalPropTypes"),_React$PropTypes=_react2["default"].PropTypes,string=_React$PropTypes.string,func=_React$PropTypes.func,Route=_react2["default"].createClass({displayName:"Route",statics:{createRouteFromReactElement:_RouteUtils.createRouteFromReactElement},propTypes:{path:string,component:_InternalPropTypes.component,components:_InternalPropTypes.components,getComponent:func,getComponents:func},render:function(){"production"!==process.env.NODE_ENV?(0,_invariant2["default"])(!1," elements are for router configuration only and should not be rendered"):(0,_invariant2["default"])(!1)}});exports["default"]=Route,module.exports=exports["default"]; + return _extends({}, history, { + listen: listen + }); +} +exports['default'] = createDOMHistory; +module.exports = exports['default']; }).call(this,require('_process')) -},{"./InternalPropTypes":45,"./RouteUtils":53,"_process":32,"invariant":76,"react":"react"}],52:[function(require,module,exports){ +},{"./DOMUtils":9,"./ExecutionEnvironment":10,"./createHistory":15,"_process":32,"invariant":23}],14:[function(require,module,exports){ (function (process){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0;var _routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning),_react=require("react"),_react2=_interopRequireDefault(_react),object=_react2["default"].PropTypes.object,RouteContext={propTypes:{route:object.isRequired},childContextTypes:{route:object.isRequired},getChildContext:function(){return{route:this.props.route}},componentWillMount:function(){"production"!==process.env.NODE_ENV?(0,_routerWarning2["default"])(!1,"The `RouteContext` mixin is deprecated. You can provide `this.props.route` on context with your own `contextTypes`. http://tiny.cc/router-routecontextmixin"):void 0}};exports["default"]=RouteContext,module.exports=exports["default"]; +'use strict'; -}).call(this,require('_process')) +exports.__esModule = true; -},{"./routerWarning":72,"_process":32,"react":"react"}],53:[function(require,module,exports){ -(function (process){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function isValidChild(e){return null==e||_react2["default"].isValidElement(e)}function isReactChildren(e){return isValidChild(e)||Array.isArray(e)&&e.every(isValidChild)}function checkPropTypes(e,r,t){e=e||"UnknownComponent";for(var a in r)if(Object.prototype.hasOwnProperty.call(r,a)){var n=r[a](t,a,e);n instanceof Error&&("production"!==process.env.NODE_ENV?(0,_routerWarning2["default"])(!1,n.message):void 0)}}function createRoute(e,r){return _extends({},e,r)}function createRouteFromReactElement(e){var r=e.type,t=createRoute(r.defaultProps,e.props);if(r.propTypes&&checkPropTypes(r.displayName||r.name,r.propTypes,t),t.children){var a=createRoutesFromReactChildren(t.children,t);a.length&&(t.childRoutes=a),delete t.children}return t}function createRoutesFromReactChildren(e,r){var t=[];return _react2["default"].Children.forEach(e,function(e){if(_react2["default"].isValidElement(e))if(e.type.createRouteFromReactElement){var a=e.type.createRouteFromReactElement(e,r);a&&t.push(a)}else t.push(createRouteFromReactElement(e))}),t}function createRoutes(e){return isReactChildren(e)?e=createRoutesFromReactChildren(e):e&&!Array.isArray(e)&&(e=[e]),e}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var r=1;r=0||Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t}function isDeprecatedHistory(e){return!e||!e.__v2_compatible__}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var r=1;r`, please use a history provided by React Router with `import { browserHistory } from 'react-router'` or `import { hashHistory } from 'react-router'`. If you are using a custom history please create it with `useRouterHistory`, see http://tiny.cc/router-usinghistory for details."):void 0,n=function(){return e}):("production"!==process.env.NODE_ENV?(0,_routerWarning2["default"])(!1,"`Router` no longer defaults the history prop to hash history. Please use the `hashHistory` singleton instead. http://tiny.cc/router-defaulthistory"):void 0,n=_createHashHistory2["default"]),(0,_useQueries2["default"])(n)({parseQueryString:t,stringifyQuery:o})},componentWillReceiveProps:function(e){"production"!==process.env.NODE_ENV?(0,_routerWarning2["default"])(e.history===this.props.history,"You cannot change ; it will be ignored"):void 0,"production"!==process.env.NODE_ENV?(0,_routerWarning2["default"])((e.routes||e.children)===(this.props.routes||this.props.children),"You cannot change ; it will be ignored"):void 0},componentWillUnmount:function(){this._unlisten&&this._unlisten()},render:function e(){var r=this.state,t=r.location,o=r.routes,n=r.params,i=r.components,s=this.props,u=s.createElement,e=s.render,a=_objectWithoutProperties(s,["createElement","render"]);return null==t?null:(Object.keys(Router.propTypes).forEach(function(e){return delete a[e]}),e(_extends({},a,{history:this.history,router:this.router,location:t,routes:o,params:n,components:i,createElement:u})))}});exports["default"]=Router,module.exports=exports["default"]; +var _warning = require('warning'); -}).call(this,require('_process')) +var _warning2 = _interopRequireDefault(_warning); -},{"./InternalPropTypes":45,"./RouteUtils":53,"./RouterContext":55,"./RouterUtils":56,"./createTransitionManager":64,"./routerWarning":72,"_process":32,"history/lib/createHashHistory":14,"history/lib/useQueries":21,"react":"react"}],55:[function(require,module,exports){ -(function (process){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0;var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},_extends=Object.assign||function(e){for(var t=1;t` expects a `router` rather than a `history`"):void 0,t=_extends({},r,{setRouteLeaveHook:r.listenBeforeLeavingRoute}),delete t.listenBeforeLeavingRoute),"production"!==process.env.NODE_ENV&&(o=(0,_deprecateObjectProperties2["default"])(o,"`context.location` is deprecated, please use a route component's `props.location` instead. http://tiny.cc/router-accessinglocation")),{history:r,location:o,router:t}},createElement:function(e,t){return null==e?null:this.props.createElement(e,t)},render:function(){var e=this,t=this.props,r=t.history,o=t.location,n=t.routes,a=t.params,i=t.components,u=null;return i&&(u=i.reduceRight(function(t,i,u){if(null==i)return t;var s=n[u],c=(0,_getRouteParams2["default"])(s,a),l={history:r,location:o,params:a,route:s,routeParams:c,routes:n};if((0,_RouteUtils.isReactChildren)(t))l.children=t;else if(t)for(var p in t)Object.prototype.hasOwnProperty.call(t,p)&&(l[p]=t[p]);if("object"===("undefined"==typeof i?"undefined":_typeof(i))){var d={};for(var f in i)Object.prototype.hasOwnProperty.call(i,f)&&(d[f]=e.createElement(i[f],_extends({key:f},l)));return d}return e.createElement(i,l)},u)),null===u||u===!1||_react2["default"].isValidElement(u)?void 0:"production"!==process.env.NODE_ENV?(0,_invariant2["default"])(!1,"The root route must render a single element"):(0,_invariant2["default"])(!1),u}});exports["default"]=RouterContext,module.exports=exports["default"]; +var _invariant = require('invariant'); -}).call(this,require('_process')) +var _invariant2 = _interopRequireDefault(_invariant); -},{"./RouteUtils":53,"./deprecateObjectProperties":65,"./getRouteParams":67,"./routerWarning":72,"_process":32,"invariant":76,"react":"react"}],56:[function(require,module,exports){ -(function (process){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function createRouterObject(e,t){return _extends({},e,{setRouteLeaveHook:t.listenBeforeLeavingRoute,isActive:t.isActive})}function createRoutingHistory(e,t){return e=_extends({},e,t),"production"!==process.env.NODE_ENV&&(e=(0,_deprecateObjectProperties2["default"])(e,"`props.history` and `context.history` are deprecated. Please use `context.router`. http://tiny.cc/router-contextchanges")),e}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;tu;u++)t[u]=arguments[u];if(n.apply(e,t),n.lengthe;++e)n[e].onLeave&&n[e].onLeave.call(n[e])}exports.__esModule=!0,exports.runEnterHooks=runEnterHooks,exports.runChangeHooks=runChangeHooks,exports.runLeaveHooks=runLeaveHooks;var _AsyncUtils=require("./AsyncUtils"),_routerWarning=require("./routerWarning"),_routerWarning2=_interopRequireDefault(_routerWarning); +var _DOMStateStorage = require('./DOMStateStorage'); -}).call(this,require('_process')) +var _createDOMHistory = require('./createDOMHistory'); -},{"./AsyncUtils":40,"./routerWarning":72,"_process":32}],59:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;tr;r++)t[r]=arguments[r];var n=t.map(function(e){return e.renderRouterContext}).filter(function(e){return e}),u=t.map(function(e){return e.renderRouteComponent}).filter(function(e){return e}),o=function(){var e=arguments.length<=0||void 0===arguments[0]?_react.createElement:arguments[0];return function(t,r){return u.reduceRight(function(e,t){return t(e,r)},e(t,r))}};return function(e){return n.reduceRight(function(t,r){return r(t,e)},_react2["default"].createElement(_RouterContext2["default"],_extends({},e,{createElement:o(e.createElement)})))}},module.exports=exports["default"]; +var _createDOMHistory2 = _interopRequireDefault(_createDOMHistory); -},{"./RouterContext":55,"react":"react"}],60:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0;var _createBrowserHistory=require("history/lib/createBrowserHistory"),_createBrowserHistory2=_interopRequireDefault(_createBrowserHistory),_createRouterHistory=require("./createRouterHistory"),_createRouterHistory2=_interopRequireDefault(_createRouterHistory);exports["default"]=(0,_createRouterHistory2["default"])(_createBrowserHistory2["default"]),module.exports=exports["default"]; +function isAbsolutePath(path) { + return typeof path === 'string' && path.charAt(0) === '/'; +} -},{"./createRouterHistory":63,"history/lib/createBrowserHistory":12}],61:[function(require,module,exports){ -"use strict";function routeParamsChanged(e,t,r){if(!e.path)return!1;var a=(0,_PatternUtils.getParamNames)(e.path);return a.some(function(e){return t.params[e]!==r.params[e]})}function computeChangedRoutes(e,t){var r=e&&e.routes,a=t.routes,u=void 0,n=void 0,o=void 0;return r?!function(){var s=!1;u=r.filter(function(r){if(s)return!0;var u=-1===a.indexOf(r)||routeParamsChanged(r,e,t);return u&&(s=!0),u}),u.reverse(),o=[],n=[],a.forEach(function(e){var t=-1===r.indexOf(e),a=-1!==u.indexOf(e);t||a?o.push(e):n.push(e)})}():(u=[],n=[],o=a),{leaveRoutes:u,changeRoutes:n,enterRoutes:o}}exports.__esModule=!0;var _PatternUtils=require("./PatternUtils");exports["default"]=computeChangedRoutes,module.exports=exports["default"]; +function ensureSlash() { + var path = _DOMUtils.getHashPath(); -},{"./PatternUtils":48}],62:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function createMemoryHistory(e){var r=(0,_createMemoryHistory2["default"])(e),t=function(){return r},u=(0,_useQueries2["default"])((0,_useBasename2["default"])(t))(e);return u.__v2_compatible__=!0,u}exports.__esModule=!0,exports["default"]=createMemoryHistory;var _useQueries=require("history/lib/useQueries"),_useQueries2=_interopRequireDefault(_useQueries),_useBasename=require("history/lib/useBasename"),_useBasename2=_interopRequireDefault(_useBasename),_createMemoryHistory=require("history/lib/createMemoryHistory"),_createMemoryHistory2=_interopRequireDefault(_createMemoryHistory);module.exports=exports["default"]; + if (isAbsolutePath(path)) return true; -},{"history/lib/createMemoryHistory":17,"history/lib/useBasename":20,"history/lib/useQueries":21}],63:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}exports.__esModule=!0,exports["default"]=function(e){var t=void 0;return canUseDOM&&(t=(0,_useRouterHistory2["default"])(e)()),t};var _useRouterHistory=require("./useRouterHistory"),_useRouterHistory2=_interopRequireDefault(_useRouterHistory),canUseDOM=!("undefined"==typeof window||!window.document||!window.document.createElement);module.exports=exports["default"]; + _DOMUtils.replaceHashPath('/' + path); -},{"./useRouterHistory":73}],64:[function(require,module,exports){ -(function (process){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function hasAnyProperties(e){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))return!0;return!1}function createTransitionManager(e,t){function n(t){var n=arguments.length<=1||void 0===arguments[1]?!1:arguments[1],o=arguments.length<=2||void 0===arguments[2]?null:arguments[2],r=void 0;return n&&n!==!0||null!==o?("production"!==process.env.NODE_ENV?(0,_routerWarning2["default"])(!1,"`isActive(pathname, query, indexOnly) is deprecated; use `isActive(location, indexOnly)` with a location descriptor instead. http://tiny.cc/router-isActivedeprecated"):void 0,t={pathname:t,query:n},r=o||!1):(t=e.createLocation(t),r=n),(0,_isActive3["default"])(t,r,_.location,_.routes,_.params)}function o(t){return e.createLocation(t,_Actions.REPLACE)}function r(e,n){p&&p.location===e?i(p,n):(0,_matchRoutes2["default"])(t,e,function(t,o){t?n(t):o?i(_extends({},o,{location:e}),n):n()})}function i(e,t){function n(n,o){return n||o?r(n,o):void(0,_getComponents2["default"])(e,function(n,o){n?t(n):t(null,null,_=_extends({},e,{components:o}))})}function r(e,n){e?t(e):t(null,o(n))}var i=(0,_computeChangedRoutes3["default"])(_,e),u=i.leaveRoutes,a=i.changeRoutes,s=i.enterRoutes;(0,_TransitionUtils.runLeaveHooks)(u),u.filter(function(e){return-1===s.indexOf(e)}).forEach(l),(0,_TransitionUtils.runChangeHooks)(a,_,e,function(t,o){return t||o?r(t,o):void(0,_TransitionUtils.runEnterHooks)(s,e,n)})}function u(e){var t=arguments.length<=1||void 0===arguments[1]?!0:arguments[1];return e.__id__||t&&(e.__id__=v++)}function a(e){return e.reduce(function(e,t){return e.push.apply(e,h[u(t)]),e},[])}function s(e,n){(0,_matchRoutes2["default"])(t,e,function(t,o){if(null==o)return void n();p=_extends({},o,{location:e});for(var r=a((0,_computeChangedRoutes3["default"])(_,p).leaveRoutes),i=void 0,u=0,s=r.length;null==i&&s>u;++u)i=r[u](e);n(i)})}function c(){if(_.routes){for(var e=a(_.routes),t=void 0,n=0,o=e.length;"string"!=typeof t&&o>n;++n)t=e[n]();return t}}function l(e){var t=u(e,!1);t&&(delete h[t],hasAnyProperties(h)||(g&&(g(),g=null),m&&(m(),m=null)))}function d(t,n){var o=u(t),r=h[o];if(r)-1===r.indexOf(n)&&("production"!==process.env.NODE_ENV?(0,_routerWarning2["default"])(!1,"adding multiple leave hooks for the same route is deprecated; manage multiple confirmations in your own code instead"):void 0,r.push(n));else{var i=!hasAnyProperties(h);h[o]=[n],i&&(g=e.listenBefore(s),e.listenBeforeUnload&&(m=e.listenBeforeUnload(c)))}return function(){var e=h[o];if(e){var r=e.filter(function(e){return e!==n});0===r.length?l(t):h[o]=r}}}function f(t){return e.listen(function(n){_.location===n?t(null,_):r(n,function(o,r,i){o?t(o):r?e.transitionTo(r):i?t(null,i):"production"!==process.env.NODE_ENV?(0,_routerWarning2["default"])(!1,'Location "%s" did not match any routes',n.pathname+n.search+n.hash):void 0})})}var _={},p=void 0,v=1,h=Object.create(null),g=void 0,m=void 0;return{isActive:n,match:r,listenBeforeLeavingRoute:d,listen:f}}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;ta;++a){var l=e[a],c=l.path||"";if("/"===c.charAt(0)&&(n=t,u=[],i=[]),null!==n&&c){var f=(0,_PatternUtils.matchPattern)(c,n);if(f?(n=f.remainingPathname,u=[].concat(u,f.paramNames),i=[].concat(i,f.paramValues)):n=null,""===n)return u.every(function(t,e){return String(i[e])===String(r[t])})}}return!1}function queryIsActive(t,e){return null==e?null==t:null==t?!0:deepEqual(t,e)}function isActive(t,e,r,n,u){var i=t.pathname,a=t.query;return null==r?!1:("/"!==i.charAt(0)&&(i="/"+i),pathIsActive(i,r.pathname)||!e&&routeIsActive(i,n,u)?queryIsActive(a,r.query):!1)}exports.__esModule=!0;var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol?"symbol":typeof t};exports["default"]=isActive;var _PatternUtils=require("./PatternUtils");module.exports=exports["default"]; + if (queryKey === undefined || !!queryKey) queryKey = typeof queryKey === 'string' ? queryKey : DefaultQueryKey; -},{"./PatternUtils":48}],70:[function(require,module,exports){ -(function (process){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _objectWithoutProperties(e,t){var r={};for(var o in e)t.indexOf(o)>=0||Object.prototype.hasOwnProperty.call(e,o)&&(r[o]=e[o]);return r}function match(e,t){var r=e.history,o=e.routes,a=e.location,i=_objectWithoutProperties(e,["history","routes","location"]);r||a?void 0:"production"!==process.env.NODE_ENV?(0,_invariant2["default"])(!1,"match needs a history or a location"):(0,_invariant2["default"])(!1),r=r?r:(0,_createMemoryHistory2["default"])(i);var n=(0,_createTransitionManager2["default"])(r,(0,_RouteUtils.createRoutes)(o)),u=void 0;a?a=r.createLocation(a):u=r.listen(function(e){a=e});var s=(0,_RouterUtils.createRouterObject)(r,n);r=(0,_RouterUtils.createRoutingHistory)(r,n),n.match(a,function(e,o,a){t(e,o,a&&_extends({},a,{history:r,router:s,matchContext:{history:r,transitionManager:n,router:s}})),u&&u()})}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var t=1;t2?n-2:0),a=2;n>a;a++)t[a-2]=arguments[a];_warning2["default"].apply(void 0,[e,r].concat(t))}function _resetWarned(){warned={}}exports.__esModule=!0,exports["default"]=routerWarning,exports._resetWarned=_resetWarned;var _warning=require("warning"),_warning2=_interopRequireDefault(_warning),warned={}; + return history.createLocation(_extends({}, location, { state: state }), undefined, key); + } -},{"warning":250}],73:[function(require,module,exports){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function useRouterHistory(e){return function(u){var r=(0,_useQueries2["default"])((0,_useBasename2["default"])(e))(u);return r.__v2_compatible__=!0,r}}exports.__esModule=!0,exports["default"]=useRouterHistory;var _useQueries=require("history/lib/useQueries"),_useQueries2=_interopRequireDefault(_useQueries),_useBasename=require("history/lib/useBasename"),_useBasename2=_interopRequireDefault(_useBasename);module.exports=exports["default"]; + function startHashChangeListener(_ref) { + var transitionTo = _ref.transitionTo; -},{"history/lib/useBasename":20,"history/lib/useQueries":21}],74:[function(require,module,exports){ -(function (process){ -"use strict";function _interopRequireDefault(e){return e&&e.__esModule?e:{"default":e}}function _objectWithoutProperties(e,r){var t={};for(var n in e)r.indexOf(n)>=0||Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t}function useRoutes(e){return"production"!==process.env.NODE_ENV?(0,_routerWarning2["default"])(!1,"`useRoutes` is deprecated. Please use `createTransitionManager` instead."):void 0,function(){var r=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],t=r.routes,n=_objectWithoutProperties(r,["routes"]),u=(0,_useQueries2["default"])(e)(n),a=(0,_createTransitionManager2["default"])(u,t);return _extends({},u,a)}}exports.__esModule=!0;var _extends=Object.assign||function(e){for(var r=1;r8&&11>=documentMode),SPACEBAR_CODE=32,SPACEBAR_CHAR=String.fromCharCode(SPACEBAR_CODE),topLevelTypes=EventConstants.topLevelTypes,eventTypes={beforeInput:{phasedRegistrationNames:{bubbled:keyOf({onBeforeInput:null}),captured:keyOf({onBeforeInputCapture:null})},dependencies:[topLevelTypes.topCompositionEnd,topLevelTypes.topKeyPress,topLevelTypes.topTextInput,topLevelTypes.topPaste]},compositionEnd:{phasedRegistrationNames:{bubbled:keyOf({onCompositionEnd:null}),captured:keyOf({onCompositionEndCapture:null})},dependencies:[topLevelTypes.topBlur,topLevelTypes.topCompositionEnd,topLevelTypes.topKeyDown,topLevelTypes.topKeyPress,topLevelTypes.topKeyUp,topLevelTypes.topMouseDown]},compositionStart:{phasedRegistrationNames:{bubbled:keyOf({onCompositionStart:null}),captured:keyOf({onCompositionStartCapture:null})},dependencies:[topLevelTypes.topBlur,topLevelTypes.topCompositionStart,topLevelTypes.topKeyDown,topLevelTypes.topKeyPress,topLevelTypes.topKeyUp,topLevelTypes.topMouseDown]},compositionUpdate:{phasedRegistrationNames:{bubbled:keyOf({onCompositionUpdate:null}),captured:keyOf({onCompositionUpdateCapture:null})},dependencies:[topLevelTypes.topBlur,topLevelTypes.topCompositionUpdate,topLevelTypes.topKeyDown,topLevelTypes.topKeyPress,topLevelTypes.topKeyUp,topLevelTypes.topMouseDown]}},hasSpaceKeypress=!1,currentComposition=null,BeforeInputEventPlugin={eventTypes:eventTypes,extractEvents:function(e,t,o,n){return[extractCompositionEvent(e,t,o,n),extractBeforeInputEvent(e,t,o,n)]}};module.exports=BeforeInputEventPlugin; + var path = (basename || '') + pathname + search; -},{"./EventConstants":92,"./EventPropagators":96,"./FallbackCompositionState":97,"./SyntheticCompositionEvent":172,"./SyntheticInputEvent":176,"fbjs/lib/ExecutionEnvironment":215,"fbjs/lib/keyOf":233}],79:[function(require,module,exports){ -"use strict";function prefixKey(o,r){return o+r.charAt(0).toUpperCase()+r.substring(1)}var isUnitlessNumber={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridRow:!0,gridColumn:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},prefixes=["Webkit","ms","Moz","O"];Object.keys(isUnitlessNumber).forEach(function(o){prefixes.forEach(function(r){isUnitlessNumber[prefixKey(r,o)]=isUnitlessNumber[o]})});var shorthandPropertyExpansions={background:{backgroundAttachment:!0,backgroundColor:!0,backgroundImage:!0,backgroundPositionX:!0,backgroundPositionY:!0,backgroundRepeat:!0},backgroundPosition:{backgroundPositionX:!0,backgroundPositionY:!0},border:{borderWidth:!0,borderStyle:!0,borderColor:!0},borderBottom:{borderBottomWidth:!0,borderBottomStyle:!0,borderBottomColor:!0},borderLeft:{borderLeftWidth:!0,borderLeftStyle:!0,borderLeftColor:!0},borderRight:{borderRightWidth:!0,borderRightStyle:!0,borderRightColor:!0},borderTop:{borderTopWidth:!0,borderTopStyle:!0,borderTopColor:!0},font:{fontStyle:!0,fontVariant:!0,fontWeight:!0,fontSize:!0,lineHeight:!0,fontFamily:!0},outline:{outlineWidth:!0,outlineStyle:!0,outlineColor:!0}},CSSProperty={isUnitlessNumber:isUnitlessNumber,shorthandPropertyExpansions:shorthandPropertyExpansions};module.exports=CSSProperty; + if (queryKey) { + path = addQueryStringValueToPath(path, queryKey, key); + _DOMStateStorage.saveState(key, state); + } else { + // Drop key and state. + location.key = location.state = null; + } -},{}],80:[function(require,module,exports){ -(function (process){ -"use strict";var CSSProperty=require("./CSSProperty"),ExecutionEnvironment=require("fbjs/lib/ExecutionEnvironment"),ReactInstrumentation=require("./ReactInstrumentation"),camelizeStyleName=require("fbjs/lib/camelizeStyleName"),dangerousStyleValue=require("./dangerousStyleValue"),hyphenateStyleName=require("fbjs/lib/hyphenateStyleName"),memoizeStringOnly=require("fbjs/lib/memoizeStringOnly"),warning=require("fbjs/lib/warning"),processStyleName=memoizeStringOnly(function(e){return hyphenateStyleName(e)}),hasShorthandPropertyBug=!1,styleFloatAccessor="cssFloat";if(ExecutionEnvironment.canUseDOM){var tempStyle=document.createElement("div").style;try{tempStyle.font=""}catch(e){hasShorthandPropertyBug=!0}void 0===document.documentElement.style.cssFloat&&(styleFloatAccessor="styleFloat")}if("production"!==process.env.NODE_ENV)var badVendoredStyleNamePattern=/^(?:webkit|moz|o)[A-Z]/,badStyleValueWithSemicolonPattern=/;\s*$/,warnedStyleNames={},warnedStyleValues={},warnedForNaNValue=!1,warnHyphenatedStyleName=function(e,r){warnedStyleNames.hasOwnProperty(e)&&warnedStyleNames[e]||(warnedStyleNames[e]=!0,"production"!==process.env.NODE_ENV?warning(!1,"Unsupported style property %s. Did you mean %s?%s",e,camelizeStyleName(e),checkRenderMessage(r)):void 0)},warnBadVendoredStyleName=function(e,r){warnedStyleNames.hasOwnProperty(e)&&warnedStyleNames[e]||(warnedStyleNames[e]=!0,"production"!==process.env.NODE_ENV?warning(!1,"Unsupported vendor-prefixed style property %s. Did you mean %s?%s",e,e.charAt(0).toUpperCase()+e.slice(1),checkRenderMessage(r)):void 0)},warnStyleValueWithSemicolon=function(e,r,t){warnedStyleValues.hasOwnProperty(r)&&warnedStyleValues[r]||(warnedStyleValues[r]=!0,"production"!==process.env.NODE_ENV?warning(!1,'Style property values shouldn\'t contain a semicolon.%s Try "%s: %s" instead.',checkRenderMessage(t),e,r.replace(badStyleValueWithSemicolonPattern,"")):void 0)},warnStyleValueIsNaN=function(e,r,t){warnedForNaNValue||(warnedForNaNValue=!0,"production"!==process.env.NODE_ENV?warning(!1,"`NaN` is an invalid value for the `%s` css style property.%s",e,checkRenderMessage(t)):void 0)},checkRenderMessage=function(e){if(e){var r=e.getName();if(r)return" Check the render method of `"+r+"`."}return""},warnValidStyle=function(e,r,t){var n;t&&(n=t._currentElement._owner),e.indexOf("-")>-1?warnHyphenatedStyleName(e,n):badVendoredStyleNamePattern.test(e)?warnBadVendoredStyleName(e,n):badStyleValueWithSemicolonPattern.test(r)&&warnStyleValueWithSemicolon(e,r,n),"number"==typeof r&&isNaN(r)&&warnStyleValueIsNaN(e,r,n)};var CSSPropertyOperations={createMarkupForStyles:function(e,r){var t="";for(var n in e)if(e.hasOwnProperty(n)){var a=e[n];"production"!==process.env.NODE_ENV&&warnValidStyle(n,a,r),null!=a&&(t+=processStyleName(n)+":",t+=dangerousStyleValue(n,a,r)+";")}return t||null},setValueForStyles:function(e,r,t){"production"!==process.env.NODE_ENV&&ReactInstrumentation.debugTool.onNativeOperation(t._debugID,"update styles",r);var n=e.style;for(var a in r)if(r.hasOwnProperty(a)){"production"!==process.env.NODE_ENV&&warnValidStyle(a,r[a],t);var o=dangerousStyleValue(a,r[a],t);if("float"!==a&&"cssFloat"!==a||(a=styleFloatAccessor),o)n[a]=o;else{var s=hasShorthandPropertyBug&&CSSProperty.shorthandPropertyExpansions[a];if(s)for(var l in s)n[l]="";else n[a]=""}}}};module.exports=CSSPropertyOperations; + var currentHash = _DOMUtils.getHashPath(); -}).call(this,require('_process')) + if (action === _Actions.PUSH) { + if (currentHash !== path) { + window.location.hash = path; + } else { + process.env.NODE_ENV !== 'production' ? _warning2['default'](false, 'You cannot PUSH the same path using hash history') : undefined; + } + } else if (currentHash !== path) { + // REPLACE + _DOMUtils.replaceHashPath(path); + } + } -},{"./CSSProperty":79,"./ReactInstrumentation":146,"./dangerousStyleValue":189,"_process":32,"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){ -"use strict";function CallbackQueue(){this._callbacks=null,this._contexts=null}var _assign=require("object-assign"),PooledClass=require("./PooledClass"),invariant=require("fbjs/lib/invariant");_assign(CallbackQueue.prototype,{enqueue:function(t,l){this._callbacks=this._callbacks||[],this._contexts=this._contexts||[],this._callbacks.push(t),this._contexts.push(l)},notifyAll:function(){var t=this._callbacks,l=this._contexts;if(t){t.length!==l.length?"production"!==process.env.NODE_ENV?invariant(!1,"Mismatched list of contexts in callback queue"):invariant(!1):void 0,this._callbacks=null,this._contexts=null;for(var s=0;s8));var isInputEventSupported=!1;ExecutionEnvironment.canUseDOM&&(isInputEventSupported=isEventSupported("input")&&(!("documentMode"in document)||document.documentMode>11));var newValueProp={get:function(){return activeElementValueProp.get.call(this)},set:function(e){activeElementValue=""+e,activeElementValueProp.set.call(this,e)}},ChangeEventPlugin={eventTypes:eventTypes,extractEvents:function(e,t,n,a){var o,l,v=t?ReactDOMComponentTree.getNodeFromInstance(t):window;if(shouldUseChangeEvent(v)?doesChangeEventBubble?o=getTargetInstForChangeEvent:l=handleEventsForChangeEventIE8:isTextInputElement(v)?isInputEventSupported?o=getTargetInstForInputEvent:(o=getTargetInstForInputEventIE,l=handleEventsForInputEventIE):shouldUseClickEvent(v)&&(o=getTargetInstForClickEvent),o){var r=o(e,t);if(r){var p=SyntheticEvent.getPooled(eventTypes.change,r,n,a);return p.type="change",EventPropagators.accumulateTwoPhaseDispatches(p),p}}l&&l(e,v,t)}};module.exports=ChangeEventPlugin; + function listenBefore(listener) { + if (++listenerCount === 1) stopHashChangeListener = startHashChangeListener(history); -},{"./EventConstants":92,"./EventPluginHub":93,"./EventPropagators":96,"./ReactDOMComponentTree":117,"./ReactUpdates":165,"./SyntheticEvent":174,"./getEventTarget":197,"./isEventSupported":204,"./isTextInputElement":205,"fbjs/lib/ExecutionEnvironment":215,"fbjs/lib/keyOf":233}],83:[function(require,module,exports){ -(function (process){ -"use strict";function getNodeAfter(e,t){return Array.isArray(t)&&(t=t[1]),t?t.nextSibling:e.firstChild}function insertLazyTreeChildAt(e,t,n){DOMLazyTree.insertTreeBefore(e,t,n)}function moveChild(e,t,n){Array.isArray(t)?moveDelimitedText(e,t[0],t[1],n):insertChildAt(e,t,n)}function removeChild(e,t){if(Array.isArray(t)){var n=t[1];t=t[0],removeDelimitedText(e,t,n),e.removeChild(n)}e.removeChild(t)}function moveDelimitedText(e,t,n,o){for(var r=t;;){var i=r.nextSibling;if(insertChildAt(e,r,o),r===n)break;r=i}}function removeDelimitedText(e,t,n){for(;;){var o=t.nextSibling;if(o===n)break;e.removeChild(o)}}function replaceDelimitedText(e,t,n){var o=e.parentNode,r=e.nextSibling;r===t?n&&insertChildAt(o,document.createTextNode(n),r):n?(setTextContent(r,n),removeDelimitedText(o,r,t)):removeDelimitedText(o,e,t),"production"!==process.env.NODE_ENV&&ReactInstrumentation.debugTool.onNativeOperation(ReactDOMComponentTree.getInstanceFromNode(e)._debugID,"replace text",n)}var DOMLazyTree=require("./DOMLazyTree"),Danger=require("./Danger"),ReactMultiChildUpdateTypes=require("./ReactMultiChildUpdateTypes"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactInstrumentation=require("./ReactInstrumentation"),createMicrosoftUnsafeLocalFunction=require("./createMicrosoftUnsafeLocalFunction"),setInnerHTML=require("./setInnerHTML"),setTextContent=require("./setTextContent"),insertChildAt=createMicrosoftUnsafeLocalFunction(function(e,t,n){e.insertBefore(t,n)}),dangerouslyReplaceNodeWithMarkup=Danger.dangerouslyReplaceNodeWithMarkup;"production"!==process.env.NODE_ENV&&(dangerouslyReplaceNodeWithMarkup=function(e,t,n){if(Danger.dangerouslyReplaceNodeWithMarkup(e,t),0!==n._debugID)ReactInstrumentation.debugTool.onNativeOperation(n._debugID,"replace with",t.toString());else{var o=ReactDOMComponentTree.getInstanceFromNode(t.node);0!==o._debugID&&ReactInstrumentation.debugTool.onNativeOperation(o._debugID,"mount",t.toString())}});var DOMChildrenOperations={dangerouslyReplaceNodeWithMarkup:dangerouslyReplaceNodeWithMarkup,replaceDelimitedText:replaceDelimitedText,processUpdates:function(e,t){if("production"!==process.env.NODE_ENV)var n=ReactDOMComponentTree.getInstanceFromNode(e)._debugID;for(var o=0;ot||e.hasOverloadedBooleanValue&&t===!1}var DOMProperty=require("./DOMProperty"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactDOMInstrumentation=require("./ReactDOMInstrumentation"),ReactInstrumentation=require("./ReactInstrumentation"),quoteAttributeValueForBrowser=require("./quoteAttributeValueForBrowser"),warning=require("fbjs/lib/warning"),VALID_ATTRIBUTE_NAME_REGEX=new RegExp("^["+DOMProperty.ATTRIBUTE_NAME_START_CHAR+"]["+DOMProperty.ATTRIBUTE_NAME_CHAR+"]*$"),illegalAttributeNameCache={},validatedAttributeNameCache={},DOMPropertyOperations={createMarkupForID:function(e){return DOMProperty.ID_ATTRIBUTE_NAME+"="+quoteAttributeValueForBrowser(e)},setAttributeForID:function(e,t){e.setAttribute(DOMProperty.ID_ATTRIBUTE_NAME,t)},createMarkupForRoot:function(){return DOMProperty.ROOT_ATTRIBUTE_NAME+'=""'},setAttributeForRoot:function(e){e.setAttribute(DOMProperty.ROOT_ATTRIBUTE_NAME,"")},createMarkupForProperty:function(e,t){"production"!==process.env.NODE_ENV&&ReactDOMInstrumentation.debugTool.onCreateMarkupForProperty(e,t);var r=DOMProperty.properties.hasOwnProperty(e)?DOMProperty.properties[e]:null;if(r){if(shouldIgnoreValue(r,t))return"";var o=r.attributeName;return r.hasBooleanValue||r.hasOverloadedBooleanValue&&t===!0?o+'=""':o+"="+quoteAttributeValueForBrowser(t)}return DOMProperty.isCustomAttribute(e)?null==t?"":e+"="+quoteAttributeValueForBrowser(t):null},createMarkupForCustomAttribute:function(e,t){return isAttributeNameSafe(e)&&null!=t?e+"="+quoteAttributeValueForBrowser(t):""},setValueForProperty:function(e,t,r){var o=DOMProperty.properties.hasOwnProperty(t)?DOMProperty.properties[t]:null;if(o){var a=o.mutationMethod;if(a)a(e,r);else{if(shouldIgnoreValue(o,r))return void this.deleteValueForProperty(e,t);if(o.mustUseProperty){var u=o.propertyName;o.hasSideEffects&&""+e[u]==""+r||(e[u]=r)}else{var n=o.attributeName,i=o.attributeNamespace;i?e.setAttributeNS(i,n,""+r):o.hasBooleanValue||o.hasOverloadedBooleanValue&&r===!0?e.setAttribute(n,""):e.setAttribute(n,""+r)}}}else if(DOMProperty.isCustomAttribute(t))return void DOMPropertyOperations.setValueForAttribute(e,t,r);if("production"!==process.env.NODE_ENV){ReactDOMInstrumentation.debugTool.onSetValueForProperty(e,t,r);var s={};s[t]=r,ReactInstrumentation.debugTool.onNativeOperation(ReactDOMComponentTree.getInstanceFromNode(e)._debugID,"update attribute",s)}},setValueForAttribute:function(e,t,r){if(isAttributeNameSafe(t)&&(null==r?e.removeAttribute(t):e.setAttribute(t,""+r),"production"!==process.env.NODE_ENV)){var o={};o[t]=r,ReactInstrumentation.debugTool.onNativeOperation(ReactDOMComponentTree.getInstanceFromNode(e)._debugID,"update attribute",o)}},deleteValueForProperty:function(e,t){var r=DOMProperty.properties.hasOwnProperty(t)?DOMProperty.properties[t]:null;if(r){var o=r.mutationMethod;if(o)o(e,void 0);else if(r.mustUseProperty){var a=r.propertyName;r.hasBooleanValue?e[a]=!1:r.hasSideEffects&&""+e[a]==""||(e[a]="")}else e.removeAttribute(r.attributeName)}else DOMProperty.isCustomAttribute(t)&&e.removeAttribute(t);"production"!==process.env.NODE_ENV&&(ReactDOMInstrumentation.debugTool.onDeleteValueForProperty(e,t),ReactInstrumentation.debugTool.onNativeOperation(ReactDOMComponentTree.getInstanceFromNode(e)._debugID,"remove attribute",t))}};module.exports=DOMPropertyOperations; + if (--listenerCount === 0) stopHashChangeListener(); + }; + } -}).call(this,require('_process')) + function push(location) { + process.env.NODE_ENV !== 'production' ? _warning2['default'](queryKey || location.state == null, 'You cannot use state without a queryKey it will be dropped') : undefined; -},{"./DOMProperty":86,"./ReactDOMComponentTree":117,"./ReactDOMInstrumentation":125,"./ReactInstrumentation":146,"./quoteAttributeValueForBrowser":207,"_process":32,"fbjs/lib/warning":239}],88:[function(require,module,exports){ -(function (process){ -"use strict";function getNodeName(e){return e.substring(1,e.indexOf(" "))}var DOMLazyTree=require("./DOMLazyTree"),ExecutionEnvironment=require("fbjs/lib/ExecutionEnvironment"),createNodesFromMarkup=require("fbjs/lib/createNodesFromMarkup"),emptyFunction=require("fbjs/lib/emptyFunction"),getMarkupWrap=require("fbjs/lib/getMarkupWrap"),invariant=require("fbjs/lib/invariant"),OPEN_TAG_NAME_EXP=/^(<[^ \/>]+)/,RESULT_INDEX_ATTR="data-danger-index",Danger={dangerouslyRenderMarkup:function(e){ExecutionEnvironment.canUseDOM?void 0:"production"!==process.env.NODE_ENV?invariant(!1,"dangerouslyRenderMarkup(...): Cannot render markup in a worker thread. Make sure `window` and `document` are available globally before requiring React when unit testing or use ReactDOMServer.renderToString for server rendering."):invariant(!1);for(var r,n={},a=0;a node. This is because browser quirks make this unreliable and/or slow. If you want to render to the root you must use server rendering. See ReactDOMServer.renderToString()."):invariant(!1):void 0,"string"==typeof r){var n=createNodesFromMarkup(r,emptyFunction)[0];e.parentNode.replaceChild(n,e)}else DOMLazyTree.replaceChildWithTree(e,r)}};module.exports=Danger; + history.push(location); + } -}).call(this,require('_process')) + function replace(location) { + process.env.NODE_ENV !== 'production' ? _warning2['default'](queryKey || location.state == null, 'You cannot use state without a queryKey it will be dropped') : undefined; -},{"./DOMLazyTree":84,"_process":32,"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){ -"use strict";var keyOf=require("fbjs/lib/keyOf"),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; + history.replace(location); + } -},{"fbjs/lib/keyOf":233}],90:[function(require,module,exports){ -"use strict";var disableableMouseListenerNames={onClick:!0,onDoubleClick:!0,onMouseDown:!0,onMouseMove:!0,onMouseUp:!0,onClickCapture:!0,onDoubleClickCapture:!0,onMouseDownCapture:!0,onMouseMoveCapture:!0,onMouseUpCapture:!0},DisabledInputUtils={getNativeProps:function(e,o){if(!o.disabled)return o;var s={};for(var n in o)!disableableMouseListenerNames[n]&&o.hasOwnProperty(n)&&(s[n]=o[n]);return s}};module.exports=DisabledInputUtils; + var goIsSupportedWithoutReload = _DOMUtils.supportsGoWithoutReloadUsingHash(); -},{}],91:[function(require,module,exports){ -"use strict";var EventConstants=require("./EventConstants"),EventPropagators=require("./EventPropagators"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),SyntheticMouseEvent=require("./SyntheticMouseEvent"),keyOf=require("fbjs/lib/keyOf"),topLevelTypes=EventConstants.topLevelTypes,eventTypes={mouseEnter:{registrationName:keyOf({onMouseEnter:null}),dependencies:[topLevelTypes.topMouseOut,topLevelTypes.topMouseOver]},mouseLeave:{registrationName:keyOf({onMouseLeave:null}),dependencies:[topLevelTypes.topMouseOut,topLevelTypes.topMouseOver]}},EnterLeaveEventPlugin={eventTypes:eventTypes,extractEvents:function(e,t,n,o){if(e===topLevelTypes.topMouseOver&&(n.relatedTarget||n.fromElement))return null;if(e!==topLevelTypes.topMouseOut&&e!==topLevelTypes.topMouseOver)return null;var r;if(o.window===o)r=o;else{var s=o.ownerDocument;r=s?s.defaultView||s.parentWindow:window}var a,u;if(e===topLevelTypes.topMouseOut){a=t;var p=n.relatedTarget||n.toElement;u=p?ReactDOMComponentTree.getClosestInstanceFromNode(p):null}else a=null,u=t;if(a===u)return null;var l=null==a?r:ReactDOMComponentTree.getNodeFromInstance(a),v=null==u?r:ReactDOMComponentTree.getNodeFromInstance(u),i=SyntheticMouseEvent.getPooled(eventTypes.mouseLeave,a,n,o);i.type="mouseleave",i.target=l,i.relatedTarget=v;var y=SyntheticMouseEvent.getPooled(eventTypes.mouseEnter,u,n,o);return y.type="mouseenter",y.target=v,y.relatedTarget=l,EventPropagators.accumulateEnterLeaveDispatches(i,y,a,u),[i,y]}};module.exports=EnterLeaveEventPlugin; + function go(n) { + process.env.NODE_ENV !== 'production' ? _warning2['default'](goIsSupportedWithoutReload, 'Hash history go(n) causes a full page reload in this browser') : undefined; -},{"./EventConstants":92,"./EventPropagators":96,"./ReactDOMComponentTree":117,"./SyntheticMouseEvent":178,"fbjs/lib/keyOf":233}],92:[function(require,module,exports){ -"use strict";var keyMirror=require("fbjs/lib/keyMirror"),PropagationPhases=keyMirror({bubbled:null,captured:null}),topLevelTypes=keyMirror({topAbort:null,topAnimationEnd:null,topAnimationIteration:null,topAnimationStart:null,topBlur:null,topCanPlay:null,topCanPlayThrough:null,topChange:null,topClick:null,topCompositionEnd:null,topCompositionStart:null,topCompositionUpdate:null,topContextMenu:null,topCopy:null,topCut:null,topDoubleClick:null,topDrag:null,topDragEnd:null,topDragEnter:null,topDragExit:null,topDragLeave:null,topDragOver:null,topDragStart:null,topDrop:null,topDurationChange:null,topEmptied:null,topEncrypted:null,topEnded:null,topError:null,topFocus:null,topInput:null,topInvalid:null,topKeyDown:null,topKeyPress:null,topKeyUp:null,topLoad:null,topLoadedData:null,topLoadedMetadata:null,topLoadStart:null,topMouseDown:null,topMouseMove:null,topMouseOut:null,topMouseOver:null,topMouseUp:null,topPaste:null,topPause:null,topPlay:null,topPlaying:null,topProgress:null,topRateChange:null,topReset:null,topScroll:null,topSeeked:null,topSeeking:null,topSelectionChange:null,topStalled:null,topSubmit:null,topSuspend:null,topTextInput:null,topTimeUpdate:null,topTouchCancel:null,topTouchEnd:null,topTouchMove:null,topTouchStart:null,topTransitionEnd:null,topVolumeChange:null,topWaiting:null,topWheel:null}),EventConstants={topLevelTypes:topLevelTypes,PropagationPhases:PropagationPhases};module.exports=EventConstants; + history.go(n); + } -},{"fbjs/lib/keyMirror":232}],93:[function(require,module,exports){ -(function (process){ -"use strict";var EventPluginRegistry=require("./EventPluginRegistry"),EventPluginUtils=require("./EventPluginUtils"),ReactErrorUtils=require("./ReactErrorUtils"),accumulateInto=require("./accumulateInto"),forEachAccumulated=require("./forEachAccumulated"),invariant=require("fbjs/lib/invariant"),listenerBank={},eventQueue=null,executeDispatchesAndRelease=function(e,t){e&&(EventPluginUtils.executeDispatchesInOrder(e,t),e.isPersistent()||e.constructor.release(e))},executeDispatchesAndReleaseSimulated=function(e){return executeDispatchesAndRelease(e,!0)},executeDispatchesAndReleaseTopLevel=function(e){return executeDispatchesAndRelease(e,!1)},EventPluginHub={injection:{injectEventPluginOrder:EventPluginRegistry.injectEventPluginOrder,injectEventPluginsByName:EventPluginRegistry.injectEventPluginsByName},putListener:function(e,t,n){"function"!=typeof n?"production"!==process.env.NODE_ENV?invariant(!1,"Expected %s listener to be a function, instead got type %s",t,typeof n):invariant(!1):void 0;var i=listenerBank[t]||(listenerBank[t]={});i[e._rootNodeID]=n;var r=EventPluginRegistry.registrationNameModules[t];r&&r.didPutListener&&r.didPutListener(e,t,n)},getListener:function(e,t){var n=listenerBank[t];return n&&n[e._rootNodeID]},deleteListener:function(e,t){var n=EventPluginRegistry.registrationNameModules[t];n&&n.willDeleteListener&&n.willDeleteListener(e,t);var i=listenerBank[t];i&&delete i[e._rootNodeID]},deleteAllListeners:function(e){for(var t in listenerBank)if(listenerBank[t][e._rootNodeID]){var n=EventPluginRegistry.registrationNameModules[t];n&&n.willDeleteListener&&n.willDeleteListener(e,t),delete listenerBank[t][e._rootNodeID]}},extractEvents:function(e,t,n,i){for(var r,u=EventPluginRegistry.plugins,s=0;s-1?void 0:"production"!==process.env.NODE_ENV?invariant(!1,"EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `%s`.",e):invariant(!1),!EventPluginRegistry.plugins[i]){n.extractEvents?void 0:"production"!==process.env.NODE_ENV?invariant(!1,"EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `%s` does not.",e):invariant(!1),EventPluginRegistry.plugins[i]=n;var t=n.eventTypes;for(var r in t)publishEventForPlugin(t[r],n,r)?void 0:"production"!==process.env.NODE_ENV?invariant(!1,"EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.",r,e):invariant(!1)}}}function publishEventForPlugin(e,n,i){EventPluginRegistry.eventNameDispatchConfigs.hasOwnProperty(i)?"production"!==process.env.NODE_ENV?invariant(!1,"EventPluginHub: More than one plugin attempted to publish the same event name, `%s`.",i):invariant(!1):void 0,EventPluginRegistry.eventNameDispatchConfigs[i]=e;var t=e.phasedRegistrationNames;if(t){for(var r in t)if(t.hasOwnProperty(r)){var s=t[r];publishRegistrationName(s,n,i)}return!0}return e.registrationName?(publishRegistrationName(e.registrationName,n,i),!0):!1}function publishRegistrationName(e,n,i){if(EventPluginRegistry.registrationNameModules[e]?"production"!==process.env.NODE_ENV?invariant(!1,"EventPluginHub: More than one plugin attempted to publish the same registration name, `%s`.",e):invariant(!1):void 0,EventPluginRegistry.registrationNameModules[e]=n,EventPluginRegistry.registrationNameDependencies[e]=n.eventTypes[i].dependencies,"production"!==process.env.NODE_ENV){var t=e.toLowerCase();EventPluginRegistry.possibleRegistrationNames[t]=e}}var invariant=require("fbjs/lib/invariant"),EventPluginOrder=null,namesToPlugins={},EventPluginRegistry={plugins:[],eventNameDispatchConfigs:{},registrationNameModules:{},registrationNameDependencies:{},possibleRegistrationNames:"production"!==process.env.NODE_ENV?{}:null,injectEventPluginOrder:function(e){EventPluginOrder?"production"!==process.env.NODE_ENV?invariant(!1,"EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React."):invariant(!1):void 0,EventPluginOrder=Array.prototype.slice.call(e),recomputePluginOrdering()},injectEventPluginsByName:function(e){var n=!1;for(var i in e)if(e.hasOwnProperty(i)){var t=e[i];namesToPlugins.hasOwnProperty(i)&&namesToPlugins[i]===t||(namesToPlugins[i]?"production"!==process.env.NODE_ENV?invariant(!1,"EventPluginRegistry: Cannot inject two different event plugins using the same name, `%s`.",i):invariant(!1):void 0,namesToPlugins[i]=t,n=!0)}n&&recomputePluginOrdering()},getPluginModuleForEvent:function(e){var n=e.dispatchConfig;if(n.registrationName)return EventPluginRegistry.registrationNameModules[n.registrationName]||null;for(var i in n.phasedRegistrationNames)if(n.phasedRegistrationNames.hasOwnProperty(i)){var t=EventPluginRegistry.registrationNameModules[n.phasedRegistrationNames[i]];if(t)return t}return null},_resetEventPlugins:function(){EventPluginOrder=null;for(var e in namesToPlugins)namesToPlugins.hasOwnProperty(e)&&delete namesToPlugins[e];EventPluginRegistry.plugins.length=0;var n=EventPluginRegistry.eventNameDispatchConfigs;for(var i in n)n.hasOwnProperty(i)&&delete n[i];var t=EventPluginRegistry.registrationNameModules;for(var r in t)t.hasOwnProperty(r)&&delete t[r];if("production"!==process.env.NODE_ENV){var s=EventPluginRegistry.possibleRegistrationNames;for(var a in s)s.hasOwnProperty(a)&&delete s[a]}}};module.exports=EventPluginRegistry; + history.registerTransitionHook(hook); + } -}).call(this,require('_process')) + // deprecated + function unregisterTransitionHook(hook) { + history.unregisterTransitionHook(hook); -},{"_process":32,"fbjs/lib/invariant":229}],95:[function(require,module,exports){ -(function (process){ -"use strict";function isEndish(e){return e===topLevelTypes.topMouseUp||e===topLevelTypes.topTouchEnd||e===topLevelTypes.topTouchCancel}function isMoveish(e){return e===topLevelTypes.topMouseMove||e===topLevelTypes.topTouchMove}function isStartish(e){return e===topLevelTypes.topMouseDown||e===topLevelTypes.topTouchStart}function executeDispatch(e,t,n,r){var s=e.type||"unknown-event";e.currentTarget=EventPluginUtils.getNodeFromInstance(r),t?ReactErrorUtils.invokeGuardedCallbackWithCatch(s,n,e):ReactErrorUtils.invokeGuardedCallback(s,n,e),e.currentTarget=null}function executeDispatchesInOrder(e,t){var n=e._dispatchListeners,r=e._dispatchInstances;if("production"!==process.env.NODE_ENV&&validateEventDispatches(e),Array.isArray(n))for(var s=0;st&&o[t]===a[t];t++);var i=s-t;for(e=1;i>=e&&o[s-e]===a[l-e];e++);var r=e>1?1-e:void 0;return this._fallbackText=a.slice(t,r),this._fallbackText}}),PooledClass.addPoolingTo(FallbackCompositionState),module.exports=FallbackCompositionState; +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; }; -},{"./PooledClass":101,"./getTextContentAccessor":201,"object-assign":240}],98:[function(require,module,exports){ -"use strict";var DOMProperty=require("./DOMProperty"),MUST_USE_PROPERTY=DOMProperty.injection.MUST_USE_PROPERTY,HAS_BOOLEAN_VALUE=DOMProperty.injection.HAS_BOOLEAN_VALUE,HAS_SIDE_EFFECTS=DOMProperty.injection.HAS_SIDE_EFFECTS,HAS_NUMERIC_VALUE=DOMProperty.injection.HAS_NUMERIC_VALUE,HAS_POSITIVE_NUMERIC_VALUE=DOMProperty.injection.HAS_POSITIVE_NUMERIC_VALUE,HAS_OVERLOADED_BOOLEAN_VALUE=DOMProperty.injection.HAS_OVERLOADED_BOOLEAN_VALUE,HTMLDOMPropertyConfig={isCustomAttribute:RegExp.prototype.test.bind(new RegExp("^(data|aria)-["+DOMProperty.ATTRIBUTE_NAME_CHAR+"]*$")),Properties:{accept:0,acceptCharset:0,accessKey:0,action:0,allowFullScreen:HAS_BOOLEAN_VALUE,allowTransparency:0,alt:0,async:HAS_BOOLEAN_VALUE,autoComplete:0,autoPlay:HAS_BOOLEAN_VALUE,capture:HAS_BOOLEAN_VALUE,cellPadding:0,cellSpacing:0,charSet:0,challenge:0,checked:MUST_USE_PROPERTY|HAS_BOOLEAN_VALUE,cite:0,classID:0,className:0,cols:HAS_POSITIVE_NUMERIC_VALUE,colSpan:0,content:0,contentEditable:0,contextMenu:0,controls:HAS_BOOLEAN_VALUE,coords:0,crossOrigin:0,data:0,dateTime:0,"default":HAS_BOOLEAN_VALUE,defer:HAS_BOOLEAN_VALUE,dir:0,disabled:HAS_BOOLEAN_VALUE,download:HAS_OVERLOADED_BOOLEAN_VALUE,draggable:0,encType:0,form:0,formAction:0,formEncType:0,formMethod:0,formNoValidate:HAS_BOOLEAN_VALUE,formTarget:0,frameBorder:0,headers:0,height:0,hidden:HAS_BOOLEAN_VALUE,high:0,href:0,hrefLang:0,htmlFor:0,httpEquiv:0,icon:0,id:0,inputMode:0,integrity:0,is:0,keyParams:0,keyType:0,kind:0,label:0,lang:0,list:0,loop:HAS_BOOLEAN_VALUE,low:0,manifest:0,marginHeight:0,marginWidth:0,max:0,maxLength:0,media:0,mediaGroup:0,method:0,min:0,minLength:0,multiple:MUST_USE_PROPERTY|HAS_BOOLEAN_VALUE,muted:MUST_USE_PROPERTY|HAS_BOOLEAN_VALUE,name:0,nonce:0,noValidate:HAS_BOOLEAN_VALUE,open:HAS_BOOLEAN_VALUE,optimum:0,pattern:0,placeholder:0,poster:0,preload:0,profile:0,radioGroup:0,readOnly:HAS_BOOLEAN_VALUE,rel:0,required:HAS_BOOLEAN_VALUE,reversed:HAS_BOOLEAN_VALUE,role:0,rows:HAS_POSITIVE_NUMERIC_VALUE,rowSpan:HAS_NUMERIC_VALUE,sandbox:0,scope:0,scoped:HAS_BOOLEAN_VALUE,scrolling:0,seamless:HAS_BOOLEAN_VALUE,selected:MUST_USE_PROPERTY|HAS_BOOLEAN_VALUE,shape:0,size:HAS_POSITIVE_NUMERIC_VALUE,sizes:0,span:HAS_POSITIVE_NUMERIC_VALUE,spellCheck:0,src:0,srcDoc:0,srcLang:0,srcSet:0,start:HAS_NUMERIC_VALUE,step:0,style:0,summary:0,tabIndex:0,target:0,title:0,type:0,useMap:0,value:MUST_USE_PROPERTY|HAS_SIDE_EFFECTS,width:0,wmode:0,wrap:0,about:0,datatype:0,inlist:0,prefix:0,property:0,resource:0,"typeof":0,vocab:0,autoCapitalize:0,autoCorrect:0,autoSave:0,color:0,itemProp:0,itemScope:HAS_BOOLEAN_VALUE,itemType:0,itemID:0,itemRef:0,results:0,security:0,unselectable:0},DOMAttributeNames:{acceptCharset:"accept-charset",className:"class",htmlFor:"for",httpEquiv:"http-equiv"},DOMPropertyNames:{}};module.exports=HTMLDOMPropertyConfig; +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } -},{"./DOMProperty":86}],99:[function(require,module,exports){ -"use strict";function escape(e){var n=/[=:]/g,r={"=":"=0",":":"=2"},s=(""+e).replace(n,function(e){return r[e]});return"$"+s}function unescape(e){var n=/(=0|=2)/g,r={"=0":"=","=2":":"},s="."===e[0]&&"$"===e[1]?e.substring(2):e.substring(1);return(""+s).replace(n,function(e){return r[e]})}var KeyEscapeUtils={escape:escape,unescape:unescape};module.exports=KeyEscapeUtils; +var _warning = require('warning'); -},{}],100:[function(require,module,exports){ -(function (process){ -"use strict";function _assertSingleLink(e){null!=e.checkedLink&&null!=e.valueLink?"production"!==process.env.NODE_ENV?invariant(!1,"Cannot provide a checkedLink and a valueLink. If you want to use checkedLink, you probably don't want to use valueLink and vice versa."):invariant(!1):void 0}function _assertValueLink(e){_assertSingleLink(e),null!=e.value||null!=e.onChange?"production"!==process.env.NODE_ENV?invariant(!1,"Cannot provide a valueLink and a value or onChange event. If you want to use value or onChange, you probably don't want to use valueLink."):invariant(!1):void 0}function _assertCheckedLink(e){_assertSingleLink(e),null!=e.checked||null!=e.onChange?"production"!==process.env.NODE_ENV?invariant(!1,"Cannot provide a checkedLink and a checked property or onChange event. If you want to use checked or onChange, you probably don't want to use checkedLink"):invariant(!1):void 0}function getDeclarationErrorAddendum(e){if(e){var n=e.getName();if(n)return" Check the render method of `"+n+"`."}return""}var ReactPropTypes=require("./ReactPropTypes"),ReactPropTypeLocations=require("./ReactPropTypeLocations"),invariant=require("fbjs/lib/invariant"),warning=require("fbjs/lib/warning"),hasReadOnlyValue={button:!0,checkbox:!0,image:!0,hidden:!0,radio:!0,reset:!0,submit:!0},propTypes={value:function(e,n,a){return!e[n]||hasReadOnlyValue[e.type]||e.onChange||e.readOnly||e.disabled?null:new Error("You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.")},checked:function(e,n,a){return!e[n]||e.onChange||e.readOnly||e.disabled?null:new Error("You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`.")},onChange:ReactPropTypes.func},loggedTypeFailures={},LinkedValueUtils={checkPropTypes:function(e,n,a){for(var r in propTypes){if(propTypes.hasOwnProperty(r))var o=propTypes[r](n,r,e,ReactPropTypeLocations.prop);if(o instanceof Error&&!(o.message in loggedTypeFailures)){loggedTypeFailures[o.message]=!0;var i=getDeclarationErrorAddendum(a);"production"!==process.env.NODE_ENV?warning(!1,"Failed form propType: %s%s",o.message,i):void 0}}},getValue:function(e){return e.valueLink?(_assertValueLink(e),e.valueLink.value):e.value},getChecked:function(e){return e.checkedLink?(_assertCheckedLink(e),e.checkedLink.value):e.checked},executeOnChange:function(e,n){return e.valueLink?(_assertValueLink(e),e.valueLink.requestChange(n.target.value)):e.checkedLink?(_assertCheckedLink(e),e.checkedLink.requestChange(n.target.checked)):e.onChange?e.onChange.call(void 0,n):void 0}};module.exports=LinkedValueUtils; +var _warning2 = _interopRequireDefault(_warning); -}).call(this,require('_process')) +var _deepEqual = require('deep-equal'); -},{"./ReactPropTypeLocations":158,"./ReactPropTypes":159,"_process":32,"fbjs/lib/invariant":229,"fbjs/lib/warning":239}],101:[function(require,module,exports){ -(function (process){ -"use strict";var invariant=require("fbjs/lib/invariant"),oneArgumentPooler=function(o){var e=this;if(e.instancePool.length){var n=e.instancePool.pop();return e.call(n,o),n}return new e(o)},twoArgumentPooler=function(o,e){var n=this;if(n.instancePool.length){var r=n.instancePool.pop();return n.call(r,o,e),r}return new n(o,e)},threeArgumentPooler=function(o,e,n){var r=this;if(r.instancePool.length){var t=r.instancePool.pop();return r.call(t,o,e,n),t}return new r(o,e,n)},fourArgumentPooler=function(o,e,n,r){var t=this;if(t.instancePool.length){var l=t.instancePool.pop();return t.call(l,o,e,n,r),l}return new t(o,e,n,r)},fiveArgumentPooler=function(o,e,n,r,t){var l=this;if(l.instancePool.length){var i=l.instancePool.pop();return l.call(i,o,e,n,r,t),i}return new l(o,e,n,r,t)},standardReleaser=function(o){var e=this;o instanceof e?void 0:"production"!==process.env.NODE_ENV?invariant(!1,"Trying to release an instance into a pool of a different type."):invariant(!1),o.destructor(),e.instancePool.length1?r-1:0),s=1;r>s;s++)c[s-1]=arguments[s];if(a!==e&&null!==a)"production"!==process.env.NODE_ENV?warning(!1,"bind(): React component methods may only be bound to the component instance. See %s",o):void 0;else if(!c.length)return"production"!==process.env.NODE_ENV?warning(!1,"bind(): You are binding a component method to the component. React does this for you automatically in a high-performance way, so you can safely remove this call. See %s",o):void 0,n;var p=i.apply(n,arguments);return p.__reactBoundContext=e,p.__reactBoundMethod=t,p.__reactBoundArguments=c,p}}return n}function bindAutoBindMethods(e){for(var t=e.__reactAutoBindPairs,n=0;n-1&&-1===navigator.userAgent.indexOf("Edge")||navigator.userAgent.indexOf("Firefox")>-1)){var showFileUrlMessage=-1===window.location.protocol.indexOf("http")&&-1===navigator.userAgent.indexOf("Firefox");console.debug("Download the React DevTools "+(showFileUrlMessage?"and use an HTTP server (instead of a file: URL) ":"")+"for a better development experience: https://fb.me/react-devtools")}var testFunc=function(){};"production"!==process.env.NODE_ENV?warning(-1!==(testFunc.name||testFunc.toString()).indexOf("testFn"),"It looks like you're using a minified copy of the development build of React. When deploying React apps to production, make sure to use the production build which skips development warnings and is faster. See https://fb.me/react-minification for more details."):void 0;var ieCompatibilityMode=document.documentMode&&document.documentMode<8;"production"!==process.env.NODE_ENV?warning(!ieCompatibilityMode,'Internet Explorer is running in compatibility mode; please add the following tag to your HTML to prevent this from happening: '):void 0;for(var expectedFeatures=[Array.isArray,Array.prototype.every,Array.prototype.forEach,Array.prototype.indexOf,Array.prototype.map,Date.now,Function.prototype.bind,Object.keys,String.prototype.split,String.prototype.trim],i=0;i",friendlyStringify(e),friendlyStringify(t)):void 0)}}function assertValidProps(e,t){t&&(voidElementTags[e._tag]&&(null!=t.children||null!=t.dangerouslySetInnerHTML?"production"!==process.env.NODE_ENV?invariant(!1,"%s is a void element tag and must not have `children` or use `props.dangerouslySetInnerHTML`.%s",e._tag,e._currentElement._owner?" Check the render method of "+e._currentElement._owner.getName()+".":""):invariant(!1):void 0),null!=t.dangerouslySetInnerHTML&&(null!=t.children?"production"!==process.env.NODE_ENV?invariant(!1,"Can only set one of `children` or `props.dangerouslySetInnerHTML`."):invariant(!1):void 0,"object"==typeof t.dangerouslySetInnerHTML&&HTML in t.dangerouslySetInnerHTML?void 0:"production"!==process.env.NODE_ENV?invariant(!1,"`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://fb.me/react-invariant-dangerously-set-inner-html for more information."):invariant(!1)),"production"!==process.env.NODE_ENV&&("production"!==process.env.NODE_ENV?warning(null==t.innerHTML,"Directly setting property `innerHTML` is not permitted. For more information, lookup documentation on `dangerouslySetInnerHTML`."):void 0,"production"!==process.env.NODE_ENV?warning(t.suppressContentEditableWarning||!t.contentEditable||null==t.children,"A component is `contentEditable` and contains `children` managed by React. It is now your responsibility to guarantee that none of those nodes are unexpectedly modified or duplicated. This is probably not intentional."):void 0,"production"!==process.env.NODE_ENV?warning(null==t.onFocusIn&&null==t.onFocusOut,"React uses onFocus and onBlur instead of onFocusIn and onFocusOut. All React events are normalized to bubble, so onFocusIn and onFocusOut are not needed/supported by React."):void 0),null!=t.style&&"object"!=typeof t.style?"production"!==process.env.NODE_ENV?invariant(!1,"The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX.%s",getDeclarationErrorAddendum(e)):invariant(!1):void 0)}function enqueuePutListener(e,t,n,r){if(!(r instanceof ReactServerRenderingTransaction)){"production"!==process.env.NODE_ENV&&("production"!==process.env.NODE_ENV?warning("onScroll"!==t||isEventSupported("scroll",!0),"This browser doesn't support the `onScroll` event"):void 0);var o=e._nativeContainerInfo,a=o._node&&o._node.nodeType===DOC_FRAGMENT_TYPE,i=a?o._node:o._ownerDocument;listenTo(t,i),r.getReactMountReady().enqueue(putListener,{inst:e,registrationName:t,listener:n})}}function putListener(){var e=this;EventPluginHub.putListener(e.inst,e.registrationName,e.listener)}function optionPostMount(){var e=this;ReactDOMOption.postMountWrapper(e)}function trapBubbledEventsLocal(){var e=this;e._rootNodeID?void 0:"production"!==process.env.NODE_ENV?invariant(!1,"Must be mounted to trap events"):invariant(!1);var t=getNode(e);switch(t?void 0:"production"!==process.env.NODE_ENV?invariant(!1,"trapBubbledEvent(...): Requires node to be rendered."):invariant(!1),e._tag){case"iframe":case"object":e._wrapperState.listeners=[ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topLoad,"load",t)];break;case"video":case"audio":e._wrapperState.listeners=[];for(var n in mediaEvents)mediaEvents.hasOwnProperty(n)&&e._wrapperState.listeners.push(ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes[n],mediaEvents[n],t));break;case"img":e._wrapperState.listeners=[ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topError,"error",t),ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topLoad,"load",t)];break;case"form":e._wrapperState.listeners=[ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topReset,"reset",t),ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topSubmit,"submit",t)];break;case"input":case"select":case"textarea":e._wrapperState.listeners=[ReactBrowserEventEmitter.trapBubbledEvent(EventConstants.topLevelTypes.topInvalid,"invalid",t)]}}function postUpdateSelectWrapper(){ReactDOMSelect.postUpdateWrapper(this)}function validateDangerousTag(e){hasOwnProperty.call(validatedTagCache,e)||(VALID_TAG_REGEX.test(e)?void 0:"production"!==process.env.NODE_ENV?invariant(!1,"Invalid tag: %s",e):invariant(!1),validatedTagCache[e]=!0)}function isCustomComponent(e,t){return e.indexOf("-")>=0||null!=t.is}function ReactDOMComponent(e){var t=e.type;validateDangerousTag(t),this._currentElement=e,this._tag=t.toLowerCase(),this._namespaceURI=null,this._renderedChildren=null,this._previousStyle=null,this._previousStyleCopy=null,this._nativeNode=null,this._nativeParent=null,this._rootNodeID=null,this._domID=null,this._nativeContainerInfo=null,this._wrapperState=null,this._topLevelWrapper=null,this._flags=0,"production"!==process.env.NODE_ENV&&(this._ancestorInfo=null,this._contentDebugID=null)}var _assign=require("object-assign"),AutoFocusUtils=require("./AutoFocusUtils"),CSSPropertyOperations=require("./CSSPropertyOperations"),DOMLazyTree=require("./DOMLazyTree"),DOMNamespaces=require("./DOMNamespaces"),DOMProperty=require("./DOMProperty"),DOMPropertyOperations=require("./DOMPropertyOperations"),EventConstants=require("./EventConstants"),EventPluginHub=require("./EventPluginHub"),EventPluginRegistry=require("./EventPluginRegistry"),ReactBrowserEventEmitter=require("./ReactBrowserEventEmitter"),ReactComponentBrowserEnvironment=require("./ReactComponentBrowserEnvironment"),ReactDOMButton=require("./ReactDOMButton"),ReactDOMComponentFlags=require("./ReactDOMComponentFlags"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactDOMInput=require("./ReactDOMInput"),ReactDOMOption=require("./ReactDOMOption"),ReactDOMSelect=require("./ReactDOMSelect"),ReactDOMTextarea=require("./ReactDOMTextarea"),ReactInstrumentation=require("./ReactInstrumentation"),ReactMultiChild=require("./ReactMultiChild"),ReactServerRenderingTransaction=require("./ReactServerRenderingTransaction"),emptyFunction=require("fbjs/lib/emptyFunction"),escapeTextContentForBrowser=require("./escapeTextContentForBrowser"),invariant=require("fbjs/lib/invariant"),isEventSupported=require("./isEventSupported"),keyOf=require("fbjs/lib/keyOf"),shallowEqual=require("fbjs/lib/shallowEqual"),validateDOMNesting=require("./validateDOMNesting"),warning=require("fbjs/lib/warning"),Flags=ReactDOMComponentFlags,deleteListener=EventPluginHub.deleteListener,getNode=ReactDOMComponentTree.getNodeFromInstance,listenTo=ReactBrowserEventEmitter.listenTo,registrationNameModules=EventPluginRegistry.registrationNameModules,CONTENT_TYPES={string:!0,number:!0},STYLE=keyOf({style:null}),HTML=keyOf({__html:null}),RESERVED_PROPS={children:null,dangerouslySetInnerHTML:null,suppressContentEditableWarning:null},DOC_FRAGMENT_TYPE=11,styleMutationWarning={},setContentChildForInstrumentation=emptyFunction;"production"!==process.env.NODE_ENV&&(setContentChildForInstrumentation=function(e){var t=this._debugID,n=t+"#text";this._contentDebugID=n,ReactInstrumentation.debugTool.onSetDisplayName(n,"#text"),ReactInstrumentation.debugTool.onSetText(n,""+e),ReactInstrumentation.debugTool.onMountComponent(n),ReactInstrumentation.debugTool.onSetChildren(t,[n])});var mediaEvents={topAbort:"abort",topCanPlay:"canplay",topCanPlayThrough:"canplaythrough",topDurationChange:"durationchange",topEmptied:"emptied",topEncrypted:"encrypted",topEnded:"ended",topError:"error",topLoadedData:"loadeddata",topLoadedMetadata:"loadedmetadata",topLoadStart:"loadstart",topPause:"pause",topPlay:"play",topPlaying:"playing",topProgress:"progress",topRateChange:"ratechange",topSeeked:"seeked",topSeeking:"seeking",topStalled:"stalled",topSuspend:"suspend",topTimeUpdate:"timeupdate",topVolumeChange:"volumechange",topWaiting:"waiting"},omittedCloseTags={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},newlineEatingTags={listing:!0,pre:!0,textarea:!0},voidElementTags=_assign({menuitem:!0},omittedCloseTags),VALID_TAG_REGEX=/^[a-zA-Z][a-zA-Z:_\.\-\d]*$/,validatedTagCache={},hasOwnProperty={}.hasOwnProperty,globalIdCounter=1;ReactDOMComponent.displayName="ReactDOMComponent",ReactDOMComponent.Mixin={mountComponent:function(e,t,n,r){this._rootNodeID=globalIdCounter++,this._domID=n._idCounter++,this._nativeParent=t,this._nativeContainerInfo=n;var o=this._currentElement.props;switch(this._tag){case"iframe":case"object":case"img":case"form":case"video":case"audio":this._wrapperState={listeners:null},e.getReactMountReady().enqueue(trapBubbledEventsLocal,this);break;case"button":o=ReactDOMButton.getNativeProps(this,o,t);break;case"input":ReactDOMInput.mountWrapper(this,o,t),o=ReactDOMInput.getNativeProps(this,o),e.getReactMountReady().enqueue(trapBubbledEventsLocal,this);break;case"option":ReactDOMOption.mountWrapper(this,o,t),o=ReactDOMOption.getNativeProps(this,o);break;case"select":ReactDOMSelect.mountWrapper(this,o,t),o=ReactDOMSelect.getNativeProps(this,o),e.getReactMountReady().enqueue(trapBubbledEventsLocal,this);break;case"textarea":ReactDOMTextarea.mountWrapper(this,o,t),o=ReactDOMTextarea.getNativeProps(this,o),e.getReactMountReady().enqueue(trapBubbledEventsLocal,this)}assertValidProps(this,o);var a,i;if(null!=t?(a=t._namespaceURI,i=t._tag):n._tag&&(a=n._namespaceURI,i=n._tag),(null==a||a===DOMNamespaces.svg&&"foreignobject"===i)&&(a=DOMNamespaces.html),a===DOMNamespaces.html&&("svg"===this._tag?a=DOMNamespaces.svg:"math"===this._tag&&(a=DOMNamespaces.mathml)),this._namespaceURI=a,"production"!==process.env.NODE_ENV){var s;null!=t?s=t._ancestorInfo:n._tag&&(s=n._ancestorInfo),s&&validateDOMNesting(this._tag,this,s),this._ancestorInfo=validateDOMNesting.updatedAncestorInfo(s,this._tag,this)}var l;if(e.useCreateElement){var u,p=n._ownerDocument;if(a===DOMNamespaces.html)if("script"===this._tag){var c=p.createElement("div"),d=this._currentElement.type;c.innerHTML="<"+d+">",u=c.removeChild(c.firstChild)}else u=p.createElement(this._currentElement.type,o.is||null);else u=p.createElementNS(a,this._currentElement.type);ReactDOMComponentTree.precacheNode(this,u),this._flags|=Flags.hasCachedChildNodes,this._nativeParent||DOMPropertyOperations.setAttributeForRoot(u),this._updateDOMProperties(null,o,e);var h=DOMLazyTree(u);this._createInitialChildren(e,o,r,h),l=h}else{var v=this._createOpenTagMarkupAndPutListeners(e,o),g=this._createContentMarkup(e,o,r);l=!g&&omittedCloseTags[this._tag]?v+"/>":v+">"+g+""}switch(this._tag){case"button":case"input":case"select":case"textarea":o.autoFocus&&e.getReactMountReady().enqueue(AutoFocusUtils.focusDOMComponent,this);break;case"option":e.getReactMountReady().enqueue(optionPostMount,this)}return l},_createOpenTagMarkupAndPutListeners:function(e,t){var n="<"+this._currentElement.type;for(var r in t)if(t.hasOwnProperty(r)){var o=t[r];if(null!=o)if(registrationNameModules.hasOwnProperty(r))o&&enqueuePutListener(this,r,o,e);else{r===STYLE&&(o&&("production"!==process.env.NODE_ENV&&(this._previousStyle=o),o=this._previousStyleCopy=_assign({},t.style)),o=CSSPropertyOperations.createMarkupForStyles(o,this));var a=null;null!=this._tag&&isCustomComponent(this._tag,t)?RESERVED_PROPS.hasOwnProperty(r)||(a=DOMPropertyOperations.createMarkupForCustomAttribute(r,o)):a=DOMPropertyOperations.createMarkupForProperty(r,o),a&&(n+=" "+a)}}return e.renderToStaticMarkup?n:(this._nativeParent||(n+=" "+DOMPropertyOperations.createMarkupForRoot()),n+=" "+DOMPropertyOperations.createMarkupForID(this._domID))},_createContentMarkup:function(e,t,n){var r="",o=t.dangerouslySetInnerHTML;if(null!=o)null!=o.__html&&(r=o.__html);else{var a=CONTENT_TYPES[typeof t.children]?t.children:null,i=null!=a?null:t.children;if(null!=a)r=escapeTextContentForBrowser(a),"production"!==process.env.NODE_ENV&&setContentChildForInstrumentation.call(this,a);else if(null!=i){var s=this.mountChildren(i,e,n);r=s.join("")}}return newlineEatingTags[this._tag]&&"\n"===r.charAt(0)?"\n"+r:r},_createInitialChildren:function(e,t,n,r){var o=t.dangerouslySetInnerHTML;if(null!=o)null!=o.__html&&DOMLazyTree.queueHTML(r,o.__html);else{var a=CONTENT_TYPES[typeof t.children]?t.children:null,i=null!=a?null:t.children;if(null!=a)"production"!==process.env.NODE_ENV&&setContentChildForInstrumentation.call(this,a),DOMLazyTree.queueText(r,a);else if(null!=i)for(var s=this.mountChildren(i,e,n),l=0;l tried to unmount. Because of cross-browser quirks it is impossible to unmount some top-level components (eg , , and ) reliably and efficiently. To fix this, have a single top-level component that never unmounts render these elements.",this._tag):invariant(!1)}this.unmountChildren(e),ReactDOMComponentTree.uncacheNode(this),EventPluginHub.deleteAllListeners(this),ReactComponentBrowserEnvironment.unmountIDFromEnvironment(this._rootNodeID),this._rootNodeID=null,this._domID=null,this._wrapperState=null,"production"!==process.env.NODE_ENV&&this._contentDebugID&&(ReactInstrumentation.debugTool.onUnmountComponent(this._contentDebugID),this._contentDebugID=null)},getPublicInstance:function(){return getNode(this)}},_assign(ReactDOMComponent.prototype,ReactDOMComponent.Mixin,ReactMultiChild.Mixin),module.exports=ReactDOMComponent; + changeListeners.forEach(function (listener) { + listener(location); + }); + } -}).call(this,require('_process')) + function listen(listener) { + changeListeners.push(listener); -},{"./AutoFocusUtils":77,"./CSSPropertyOperations":80,"./DOMLazyTree":84,"./DOMNamespaces":85,"./DOMProperty":86,"./DOMPropertyOperations":87,"./EventConstants":92,"./EventPluginHub":93,"./EventPluginRegistry":94,"./ReactBrowserEventEmitter":103,"./ReactComponentBrowserEnvironment":108,"./ReactDOMButton":114,"./ReactDOMComponentFlags":116,"./ReactDOMComponentTree":117,"./ReactDOMInput":124,"./ReactDOMOption":126,"./ReactDOMSelect":127,"./ReactDOMTextarea":130,"./ReactInstrumentation":146,"./ReactMultiChild":150,"./ReactServerRenderingTransaction":163,"./escapeTextContentForBrowser":190,"./isEventSupported":204,"./validateDOMNesting":213,"_process":32,"fbjs/lib/emptyFunction":221,"fbjs/lib/invariant":229,"fbjs/lib/keyOf":233,"fbjs/lib/shallowEqual":238,"fbjs/lib/warning":239,"object-assign":240}],116:[function(require,module,exports){ -"use strict";var ReactDOMComponentFlags={hasCachedChildNodes:1};module.exports=ReactDOMComponentFlags; + if (location) { + listener(location); + } else { + var _location = getCurrentLocation(); + allKeys = [_location.key]; + updateLocation(_location); + } -},{}],117:[function(require,module,exports){ -(function (process){ -"use strict";function getRenderedNativeOrTextFromComponent(e){for(var n;n=e._renderedComponent;)e=n;return e}function precacheNode(e,n){var t=getRenderedNativeOrTextFromComponent(e);t._nativeNode=n,n[internalInstanceKey]=t}function uncacheNode(e){var n=e._nativeNode;n&&(delete n[internalInstanceKey],e._nativeNode=null)}function precacheChildNodes(e,n){if(!(e._flags&Flags.hasCachedChildNodes)){var t=e._renderedChildren,r=n.firstChild;e:for(var o in t)if(t.hasOwnProperty(o)){var a=t[o],i=getRenderedNativeOrTextFromComponent(a)._domID;if(null!=i){for(;null!==r;r=r.nextSibling)if(1===r.nodeType&&r.getAttribute(ATTR_NAME)===String(i)||8===r.nodeType&&r.nodeValue===" react-text: "+i+" "||8===r.nodeType&&r.nodeValue===" react-empty: "+i+" "){precacheNode(a,r);continue e}"production"!==process.env.NODE_ENV?invariant(!1,"Unable to find element with ID %s.",i):invariant(!1)}}e._flags|=Flags.hasCachedChildNodes}}function getClosestInstanceFromNode(e){if(e[internalInstanceKey])return e[internalInstanceKey];for(var n=[];!e[internalInstanceKey];){if(n.push(e),!e.parentNode)return null;e=e.parentNode}for(var t,r;e&&(r=e[internalInstanceKey]);e=n.pop())t=r,n.length&&precacheChildNodes(r,e);return t}function getInstanceFromNode(e){var n=getClosestInstanceFromNode(e);return null!=n&&n._nativeNode===e?n:null}function getNodeFromInstance(e){if(void 0===e._nativeNode?"production"!==process.env.NODE_ENV?invariant(!1,"getNodeFromInstance: Invalid argument."):invariant(!1):void 0,e._nativeNode)return e._nativeNode;for(var n=[];!e._nativeNode;)n.push(e),e._nativeParent?void 0:"production"!==process.env.NODE_ENV?invariant(!1,"React DOM tree root should always have a node reference."):invariant(!1),e=e._nativeParent;for(;n.length;e=n.pop())precacheChildNodes(e,e._nativeNode);return e._nativeNode}var DOMProperty=require("./DOMProperty"),ReactDOMComponentFlags=require("./ReactDOMComponentFlags"),invariant=require("fbjs/lib/invariant"),ATTR_NAME=DOMProperty.ID_ATTRIBUTE_NAME,Flags=ReactDOMComponentFlags,internalInstanceKey="__reactInternalInstance$"+Math.random().toString(36).slice(2),ReactDOMComponentTree={getClosestInstanceFromNode:getClosestInstanceFromNode,getInstanceFromNode:getInstanceFromNode,getNodeFromInstance:getNodeFromInstance,precacheChildNodes:precacheChildNodes,precacheNode:precacheNode,uncacheNode:uncacheNode};module.exports=ReactDOMComponentTree; + return function () { + changeListeners = changeListeners.filter(function (item) { + return item !== listener; + }); + }; + } + function confirmTransitionTo(location, callback) { + _AsyncUtils.loopAsync(transitionHooks.length, function (index, next, done) { + _runTransitionHook2['default'](transitionHooks[index], location, function (result) { + if (result != null) { + done(result); + } else { + next(); + } + }); + }, function (message) { + if (getUserConfirmation && typeof message === 'string') { + getUserConfirmation(message, function (ok) { + callback(ok !== false); + }); + } else { + callback(message !== false); + } + }); + } + + var pendingLocation = undefined; + + function transitionTo(nextLocation) { + if (location && locationsAreEqual(location, nextLocation)) return; // Nothing to do. + + pendingLocation = nextLocation; + + confirmTransitionTo(nextLocation, function (ok) { + if (pendingLocation !== nextLocation) return; // Transition was interrupted. + + if (ok) { + // treat PUSH to current path like REPLACE to be consistent with browsers + if (nextLocation.action === _Actions.PUSH) { + var prevPath = createPath(location); + var nextPath = createPath(nextLocation); + + if (nextPath === prevPath && _deepEqual2['default'](location.state, nextLocation.state)) nextLocation.action = _Actions.REPLACE; + } + + if (finishTransition(nextLocation) !== false) updateLocation(nextLocation); + } else if (location && nextLocation.action === _Actions.POP) { + var prevIndex = allKeys.indexOf(location.key); + var nextIndex = allKeys.indexOf(nextLocation.key); + + if (prevIndex !== -1 && nextIndex !== -1) go(prevIndex - nextIndex); // Restore the URL. + } + }); + } + + function push(location) { + transitionTo(createLocation(location, _Actions.PUSH, createKey())); + } + + function replace(location) { + transitionTo(createLocation(location, _Actions.REPLACE, createKey())); + } + + function goBack() { + go(-1); + } + + function goForward() { + go(1); + } + + function createKey() { + return createRandomKey(keyLength); + } + + function createPath(location) { + if (location == null || typeof location === 'string') return location; + + var pathname = location.pathname; + var search = location.search; + var hash = location.hash; + + var result = pathname; + + if (search) result += search; + + if (hash) result += hash; + + return result; + } + + function createHref(location) { + return createPath(location); + } + + function createLocation(location, action) { + var key = arguments.length <= 2 || arguments[2] === undefined ? createKey() : arguments[2]; + + if (typeof action === 'object') { + process.env.NODE_ENV !== 'production' ? _warning2['default'](false, 'The state (2nd) argument to history.createLocation is deprecated; use a ' + 'location descriptor instead') : undefined; + + if (typeof location === 'string') location = _PathUtils.parsePath(location); + + location = _extends({}, location, { state: action }); + + action = key; + key = arguments[3] || createKey(); + } + + return _createLocation3['default'](location, action, key); + } + + // deprecated + function setState(state) { + if (location) { + updateLocationState(location, state); + updateLocation(location); + } else { + updateLocationState(getCurrentLocation(), state); + } + } + + function updateLocationState(location, state) { + location.state = _extends({}, location.state, state); + saveState(location.key, location.state); + } + + // deprecated + function registerTransitionHook(hook) { + if (transitionHooks.indexOf(hook) === -1) transitionHooks.push(hook); + } + + // deprecated + function unregisterTransitionHook(hook) { + transitionHooks = transitionHooks.filter(function (item) { + return item !== hook; + }); + } + + // deprecated + function pushState(state, path) { + if (typeof path === 'string') path = _PathUtils.parsePath(path); + + push(_extends({ state: state }, path)); + } + + // deprecated + function replaceState(state, path) { + if (typeof path === 'string') path = _PathUtils.parsePath(path); + + replace(_extends({ state: state }, path)); + } + + return { + listenBefore: listenBefore, + listen: listen, + transitionTo: transitionTo, + push: push, + replace: replace, + go: go, + goBack: goBack, + goForward: goForward, + createKey: createKey, + createPath: createPath, + createHref: createHref, + createLocation: createLocation, + + setState: _deprecate2['default'](setState, 'setState is deprecated; use location.key to save state instead'), + registerTransitionHook: _deprecate2['default'](registerTransitionHook, 'registerTransitionHook is deprecated; use listenBefore instead'), + unregisterTransitionHook: _deprecate2['default'](unregisterTransitionHook, 'unregisterTransitionHook is deprecated; use the callback returned from listenBefore instead'), + pushState: _deprecate2['default'](pushState, 'pushState is deprecated; use push instead'), + replaceState: _deprecate2['default'](replaceState, 'replaceState is deprecated; use replace instead') + }; +} + +exports['default'] = createHistory; +module.exports = exports['default']; }).call(this,require('_process')) -},{"./DOMProperty":86,"./ReactDOMComponentFlags":116,"_process":32,"fbjs/lib/invariant":229}],118:[function(require,module,exports){ +},{"./Actions":6,"./AsyncUtils":7,"./PathUtils":11,"./createLocation":16,"./deprecate":18,"./runTransitionHook":19,"_process":32,"deep-equal":1,"warning":250}],16:[function(require,module,exports){ (function (process){ -"use strict";function ReactDOMContainerInfo(e,n){var t={_topLevelWrapper:e,_idCounter:1,_ownerDocument:n?n.nodeType===DOC_NODE_TYPE?n:n.ownerDocument:null,_node:n,_tag:n?n.nodeName.toLowerCase():null,_namespaceURI:n?n.namespaceURI:null};return"production"!==process.env.NODE_ENV&&(t._ancestorInfo=n?validateDOMNesting.updatedAncestorInfo(null,t._tag,null):null),t}var validateDOMNesting=require("./validateDOMNesting"),DOC_NODE_TYPE=9;module.exports=ReactDOMContainerInfo; +'use strict'; -}).call(this,require('_process')) +exports.__esModule = true; -},{"./validateDOMNesting":213,"_process":32}],119:[function(require,module,exports){ -(function (process){ -"use strict";function emitEvent(e,o,n,r,t,a){"production"!==process.env.NODE_ENV&&eventHandlers.forEach(function(l){try{l[e]&&l[e](o,n,r,t,a)}catch(v){"production"!==process.env.NODE_ENV?warning(!handlerDoesThrowForEvent[e],"exception thrown by devtool while handling %s: %s",e,v.message):void 0,handlerDoesThrowForEvent[e]=!0}})}var ReactDOMUnknownPropertyDevtool=require("./ReactDOMUnknownPropertyDevtool"),warning=require("fbjs/lib/warning"),eventHandlers=[],handlerDoesThrowForEvent={},ReactDOMDebugTool={addDevtool:function(e){eventHandlers.push(e)},removeDevtool:function(e){for(var o=0;o"},receiveComponent:function(){},getNativeNode:function(){return ReactDOMComponentTree.getNodeFromInstance(this)},unmountComponent:function(){ReactDOMComponentTree.uncacheNode(this)}}),module.exports=ReactDOMEmptyComponent; +var _warning = require('warning'); -},{"./DOMLazyTree":84,"./ReactDOMComponentTree":117,"object-assign":240}],121:[function(require,module,exports){ -(function (process){ -"use strict";function createDOMFactory(e){return"production"!==process.env.NODE_ENV?ReactElementValidator.createFactory(e):ReactElement.createFactory(e)}var ReactElement=require("./ReactElement"),ReactElementValidator=require("./ReactElementValidator"),mapObject=require("fbjs/lib/mapObject"),ReactDOMFactories=mapObject({a:"a",abbr:"abbr",address:"address",area:"area",article:"article",aside:"aside",audio:"audio",b:"b",base:"base",bdi:"bdi",bdo:"bdo",big:"big",blockquote:"blockquote",body:"body",br:"br",button:"button",canvas:"canvas",caption:"caption",cite:"cite",code:"code",col:"col",colgroup:"colgroup",data:"data",datalist:"datalist",dd:"dd",del:"del",details:"details",dfn:"dfn",dialog:"dialog",div:"div",dl:"dl",dt:"dt",em:"em",embed:"embed",fieldset:"fieldset",figcaption:"figcaption",figure:"figure",footer:"footer",form:"form",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",h6:"h6",head:"head",header:"header",hgroup:"hgroup",hr:"hr",html:"html",i:"i",iframe:"iframe",img:"img",input:"input",ins:"ins",kbd:"kbd",keygen:"keygen",label:"label",legend:"legend",li:"li",link:"link",main:"main",map:"map",mark:"mark",menu:"menu",menuitem:"menuitem",meta:"meta",meter:"meter",nav:"nav",noscript:"noscript",object:"object",ol:"ol",optgroup:"optgroup",option:"option",output:"output",p:"p",param:"param",picture:"picture",pre:"pre",progress:"progress",q:"q",rp:"rp",rt:"rt",ruby:"ruby",s:"s",samp:"samp",script:"script",section:"section",select:"select",small:"small",source:"source",span:"span",strong:"strong",style:"style",sub:"sub",summary:"summary",sup:"sup",table:"table",tbody:"tbody",td:"td",textarea:"textarea",tfoot:"tfoot",th:"th",thead:"thead",time:"time",title:"title",tr:"tr",track:"track",u:"u",ul:"ul","var":"var",video:"video",wbr:"wbr",circle:"circle",clipPath:"clipPath",defs:"defs",ellipse:"ellipse",g:"g",image:"image",line:"line",linearGradient:"linearGradient",mask:"mask",path:"path",pattern:"pattern",polygon:"polygon",polyline:"polyline",radialGradient:"radialGradient",rect:"rect",stop:"stop",svg:"svg",text:"text",tspan:"tspan"},createDOMFactory);module.exports=ReactDOMFactories; +var _warning2 = _interopRequireDefault(_warning); -}).call(this,require('_process')) +var _Actions = require('./Actions'); -},{"./ReactElement":136,"./ReactElementValidator":137,"_process":32,"fbjs/lib/mapObject":234}],122:[function(require,module,exports){ -"use strict";var ReactDOMFeatureFlags={useCreateElement:!0};module.exports=ReactDOMFeatureFlags; +var _PathUtils = require('./PathUtils'); -},{}],123:[function(require,module,exports){ -"use strict";var DOMChildrenOperations=require("./DOMChildrenOperations"),ReactDOMComponentTree=require("./ReactDOMComponentTree"),ReactDOMIDOperations={dangerouslyProcessChildrenUpdates:function(e,r){var t=ReactDOMComponentTree.getNodeFromInstance(e);DOMChildrenOperations.processUpdates(t,r)}};module.exports=ReactDOMIDOperations; +function createLocation() { + var location = arguments.length <= 0 || arguments[0] === undefined ? '/' : arguments[0]; + var action = arguments.length <= 1 || arguments[1] === undefined ? _Actions.POP : arguments[1]; + var key = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2]; -},{"./DOMChildrenOperations":83,"./ReactDOMComponentTree":117}],124:[function(require,module,exports){ -(function (process){ -"use strict";function forceUpdateIfMounted(){this._rootNodeID&&ReactDOMInput.updateWrapper(this)}function warnIfValueIsNull(e){null==e||null!==e.value||didWarnValueNull||("production"!==process.env.NODE_ENV?warning(!1,"`value` prop on `input` should not be null. Consider using the empty string to clear the component or `undefined` for uncontrolled components."):void 0,didWarnValueNull=!0)}function _handleChange(e){var n=this._currentElement.props,t=LinkedValueUtils.executeOnChange(n,e);ReactUpdates.asap(forceUpdateIfMounted,this);var o=n.name;if("radio"===n.type&&null!=o){for(var r=ReactDOMComponentTree.getNodeFromInstance(this),a=r;a.parentNode;)a=a.parentNode;for(var l=a.querySelectorAll("input[name="+JSON.stringify(""+o)+'][type="radio"]'),i=0;i instead of setting `selected` on