diff options
-rw-r--r-- | CONTRIBUTING.md | 2 | ||||
-rw-r--r-- | docs/certinstall.rst | 2 | ||||
-rw-r--r-- | docs/install.rst | 2 | ||||
-rw-r--r-- | libmproxy/console/statusbar.py | 3 | ||||
-rw-r--r-- | libmproxy/models/connections.py | 8 | ||||
-rw-r--r-- | libmproxy/web/app.py | 2 | ||||
-rw-r--r-- | libmproxy/web/static/app.css | 6 | ||||
-rw-r--r-- | libmproxy/web/static/app.js | 3276 | ||||
-rw-r--r-- | libmproxy/web/static/vendor.css | 674 | ||||
-rw-r--r-- | libmproxy/web/static/vendor.js | 6033 | ||||
-rw-r--r-- | web/.eslintrc | 8 | ||||
-rw-r--r-- | web/.jshintrc | 5 | ||||
-rw-r--r-- | web/conf.js | 8 | ||||
-rw-r--r-- | web/gulpfile.js | 278 | ||||
-rw-r--r-- | web/package.json | 61 | ||||
-rw-r--r-- | web/src/css/vendor.less | 2 | ||||
-rw-r--r-- | web/src/fonts/FontAwesome.otf (renamed from web/src/fontawesome/FontAwesome.otf) | bin | 85908 -> 85908 bytes | |||
-rw-r--r-- | web/src/fonts/README (renamed from web/src/fontawesome/README) | 0 | ||||
-rw-r--r-- | web/src/fonts/font-awesome.css (renamed from web/src/fontawesome/font-awesome.css) | 0 | ||||
-rw-r--r-- | web/src/fonts/fontawesome-webfont.eot (renamed from web/src/fontawesome/fontawesome-webfont.eot) | bin | 56006 -> 56006 bytes | |||
-rw-r--r-- | web/src/fonts/fontawesome-webfont.svg (renamed from web/src/fontawesome/fontawesome-webfont.svg) | 0 | ||||
-rw-r--r-- | web/src/fonts/fontawesome-webfont.ttf (renamed from web/src/fontawesome/fontawesome-webfont.ttf) | bin | 112160 -> 112160 bytes | |||
-rw-r--r-- | web/src/fonts/fontawesome-webfont.woff (renamed from web/src/fontawesome/fontawesome-webfont.woff) | bin | 65452 -> 65452 bytes | |||
-rw-r--r-- | web/src/js/components/eventlog.js | 1 | ||||
-rw-r--r-- | web/src/js/filt/filt.js | 2 |
25 files changed, 5858 insertions, 4515 deletions
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 66851622..ae948d73 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -36,4 +36,4 @@ We're happy to hear what you'd like to see in mitmproxy. Please file feature req We're always happy to accept patches. Please submit them in the form of pull requests to the main [mitmproxy repository](https://github.com/mitmproxy/mitmproxy/). If you're working on something cool, please do not hesistate and get in touch! -Instructions for setting up a development environment can be found in the [README](README.mkd). +Instructions for setting up a development environment can be found in the [README](README.rst). diff --git a/docs/certinstall.rst b/docs/certinstall.rst index 96227217..542c6dd2 100644 --- a/docs/certinstall.rst +++ b/docs/certinstall.rst @@ -159,7 +159,7 @@ Using a custom certificate authority By default, mitmproxy will use ``~/.mitmproxy/mitmproxy-ca.pem`` as the certificate authority to generate certificates for all domains for which no custom certificate is provided (see above). You can use your own certificate -authority by passing the ``--confdir`` option to mitmproxy. Mitmproxy +authority by passing the ``--cadir DIRECTORY`` option to mitmproxy. Mitmproxy will then look for ``mitmproxy-ca.pem`` in the specified directory. If no such file exists, it will be generated automatically. diff --git a/docs/install.rst b/docs/install.rst index 35de18e5..a4a26a42 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -11,7 +11,7 @@ Installation On Ubuntu Ubuntu comes with Python but we need to install pip, python-dev and several libraries. This was tested on a fully patched installation of Ubuntu 14.04. ->>> sudo apt-get install python-pip python-dev libffi-dev libssl-dev libxml2-dev libxslt1-dev +>>> sudo apt-get install python-pip python-dev libffi-dev libssl-dev libxml2-dev libxslt1-dev libjpeg8-dev zlib1g-dev >>> sudo pip install mitmproxy Once installation is complete you can run :ref:`mitmproxy` or :ref:`mitmdump` from a terminal. diff --git a/libmproxy/console/statusbar.py b/libmproxy/console/statusbar.py index ea2dbfa8..fd084f8c 100644 --- a/libmproxy/console/statusbar.py +++ b/libmproxy/console/statusbar.py @@ -4,7 +4,6 @@ import urwid import netlib.utils from . import pathedit, signals, common -from .. import utils class ActionBar(urwid.WidgetWrap): @@ -25,6 +24,7 @@ class ActionBar(urwid.WidgetWrap): def sig_message(self, sender, message, expire=None): w = urwid.Text(message) self._w = w + self.prompting = False if expire: def cb(*args): if w == self._w: @@ -88,6 +88,7 @@ class ActionBar(urwid.WidgetWrap): def clear(self): self._w = urwid.Text("") + self.prompting = False def prompt_done(self): self.prompting = False diff --git a/libmproxy/models/connections.py b/libmproxy/models/connections.py index f1e10de9..ec089471 100644 --- a/libmproxy/models/connections.py +++ b/libmproxy/models/connections.py @@ -51,9 +51,9 @@ class ClientConnection(tcp.BaseHandler, stateobject.StateObject): def get_state(self, short=False): d = super(ClientConnection, self).get_state(short) d.update( - address={ + address=({ "address": self.address(), - "use_ipv6": self.address.use_ipv6}, + "use_ipv6": self.address.use_ipv6} if self.address else {}), clientcert=self.cert.to_pem() if self.clientcert else None) return d @@ -135,8 +135,8 @@ class ServerConnection(tcp.TCPClient, stateobject.StateObject): def get_state(self, short=False): d = super(ServerConnection, self).get_state(short) d.update( - address={"address": self.address(), - "use_ipv6": self.address.use_ipv6}, + address=({"address": self.address(), + "use_ipv6": self.address.use_ipv6} if self.address else {}), source_address=({"address": self.source_address(), "use_ipv6": self.source_address.use_ipv6} if self.source_address else None), cert=self.cert.to_pem() if self.cert else None diff --git a/libmproxy/web/app.py b/libmproxy/web/app.py index 58dc77e7..5c80584d 100644 --- a/libmproxy/web/app.py +++ b/libmproxy/web/app.py @@ -29,7 +29,7 @@ class RequestHandler(tornado.web.RequestHandler): def json(self): if not self.request.headers.get("Content-Type").startswith("application/json"): return None - return json.loads(self.request.content) + return json.loads(self.request.body) @property def state(self): diff --git a/libmproxy/web/static/app.css b/libmproxy/web/static/app.css index 8a2a4356..94a6abf0 100644 --- a/libmproxy/web/static/app.css +++ b/libmproxy/web/static/app.css @@ -137,8 +137,8 @@ header .menu { border-bottom: solid #a6a6a6 1px; } .menu-row { - margin-left: -2.5px; - margin-right: -2.5px; + margin-left: -2px; + margin-right: -3px; } .filter-input { position: relative; @@ -418,4 +418,4 @@ footer { padding: 0px 10px 3px; } -/*# sourceMappingURL=app.css.map */
\ No newline at end of file +/*# sourceMappingURL=app.css.map */ diff --git a/libmproxy/web/static/app.js b/libmproxy/web/static/app.js index edcc95ba..27f356f7 100644 --- a/libmproxy/web/static/app.js +++ b/libmproxy/web/static/app.js @@ -302,6 +302,8 @@ function isUndefined(arg) { } },{}],2:[function(require,module,exports){ +"use strict"; + var $ = require("jquery"); var _ = require("lodash"); var AppDispatcher = require("./dispatcher.js").AppDispatcher; @@ -315,7 +317,7 @@ var ActionTypes = { // Stores SETTINGS_STORE: "settings", EVENT_STORE: "events", - FLOW_STORE: "flows", + FLOW_STORE: "flows" }; var StoreCmds = { @@ -326,17 +328,17 @@ var StoreCmds = { }; var ConnectionActions = { - open: function () { + open: function open() { AppDispatcher.dispatchViewAction({ type: ActionTypes.CONNECTION_OPEN }); }, - close: function () { + close: function close() { AppDispatcher.dispatchViewAction({ type: ActionTypes.CONNECTION_CLOSE }); }, - error: function () { + error: function error() { AppDispatcher.dispatchViewAction({ type: ActionTypes.CONNECTION_ERROR }); @@ -344,7 +346,7 @@ var ConnectionActions = { }; var SettingsActions = { - update: function (settings) { + update: function update(settings) { $.ajax({ type: "PUT", @@ -366,7 +368,7 @@ var SettingsActions = { var EventLogActions_event_id = 0; var EventLogActions = { - add_event: function (message) { + add_event: function add_event(message) { AppDispatcher.dispatchViewAction({ type: ActionTypes.EVENT_STORE, cmd: StoreCmds.ADD, @@ -380,28 +382,28 @@ var EventLogActions = { }; var FlowActions = { - accept: function (flow) { + accept: function accept(flow) { $.post("/flows/" + flow.id + "/accept"); }, - accept_all: function(){ + accept_all: function accept_all() { $.post("/flows/accept"); }, - "delete": function(flow){ + "delete": function _delete(flow) { $.ajax({ - type:"DELETE", + type: "DELETE", url: "/flows/" + flow.id }); }, - duplicate: function(flow){ + duplicate: function duplicate(flow) { $.post("/flows/" + flow.id + "/duplicate"); }, - replay: function(flow){ + replay: function replay(flow) { $.post("/flows/" + flow.id + "/replay"); }, - revert: function(flow){ + revert: function revert(flow) { $.post("/flows/" + flow.id + "/revert"); }, - update: function (flow, nextProps) { + update: function update(flow, nextProps) { /* //Facebook Flux: We do an optimistic update on the client already. var nextFlow = _.cloneDeep(flow); @@ -419,7 +421,7 @@ var FlowActions = { data: JSON.stringify(nextProps) }); }, - clear: function(){ + clear: function clear() { $.post("/clear"); } }; @@ -440,7 +442,10 @@ module.exports = { Query: Query }; + },{"./dispatcher.js":21,"jquery":"jquery","lodash":"lodash"}],3:[function(require,module,exports){ +"use strict"; + var React = require("react"); var ReactRouter = require("react-router"); var $ = require("jquery"); @@ -461,32 +466,29 @@ $(function () { }); - },{"./actions.js":2,"./components/proxyapp.js":18,"./connection":20,"jquery":"jquery","react":"react","react-router":"react-router"}],4:[function(require,module,exports){ +"use strict"; + var React = require("react"); var ReactRouter = require("react-router"); var _ = require("lodash"); // http://blog.vjeux.com/2013/javascript/scroll-position-with-react.html (also contains inverse example) var AutoScrollMixin = { - componentWillUpdate: function () { + componentWillUpdate: function componentWillUpdate() { var node = this.getDOMNode(); - this._shouldScrollBottom = ( - node.scrollTop !== 0 && - node.scrollTop + node.clientHeight === node.scrollHeight - ); + this._shouldScrollBottom = node.scrollTop !== 0 && node.scrollTop + node.clientHeight === node.scrollHeight; }, - componentDidUpdate: function () { + componentDidUpdate: function componentDidUpdate() { if (this._shouldScrollBottom) { var node = this.getDOMNode(); node.scrollTop = node.scrollHeight; } - }, + } }; - var StickyHeadMixin = { - adjustHead: function () { + adjustHead: function adjustHead() { // Abusing CSS transforms to set the element // referenced as head into some kind of position:sticky. var head = this.refs.head.getDOMNode(); @@ -498,39 +500,37 @@ var SettingsState = { contextTypes: { settingsStore: React.PropTypes.object.isRequired }, - getInitialState: function () { + getInitialState: function getInitialState() { return { settings: this.context.settingsStore.dict }; }, - componentDidMount: function () { + componentDidMount: function componentDidMount() { this.context.settingsStore.addListener("recalculate", this.onSettingsChange); }, - componentWillUnmount: function () { + componentWillUnmount: function componentWillUnmount() { this.context.settingsStore.removeListener("recalculate", this.onSettingsChange); }, - onSettingsChange: function () { + onSettingsChange: function onSettingsChange() { this.setState({ settings: this.context.settingsStore.dict }); - }, + } }; - var ChildFocus = { contextTypes: { returnFocus: React.PropTypes.func }, - returnFocus: function(){ + returnFocus: function returnFocus() { React.findDOMNode(this).blur(); window.getSelection().removeAllRanges(); this.context.returnFocus(); } }; - var Navigation = _.extend({}, ReactRouter.Navigation, { - setQuery: function (dict) { + setQuery: function setQuery(dict) { var q = this.context.router.getCurrentQuery(); for (var i in dict) { if (dict.hasOwnProperty(i)) { @@ -539,7 +539,7 @@ var Navigation = _.extend({}, ReactRouter.Navigation, { } this.replaceWith(this.context.router.getCurrentPath(), this.context.router.getCurrentParams(), q); }, - replaceWith: function (routeNameOrPath, params, query) { + replaceWith: function replaceWith(routeNameOrPath, params, query) { if (routeNameOrPath === undefined) { routeNameOrPath = this.context.router.getCurrentPath(); } @@ -558,30 +558,32 @@ var Navigation = _.extend({}, ReactRouter.Navigation, { // We keep the old method for now - if it should turn out that their changes are permanent, // we may remove this mixin and access react-router directly again. var RouterState = _.extend({}, ReactRouter.State, { - getQuery: function () { + getQuery: 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 _.clone(this.context.router.getCurrentQuery()); }, - getParams: function () { + getParams: function getParams() { return _.clone(this.context.router.getCurrentParams()); } }); -var Splitter = React.createClass({displayName: "Splitter", - getDefaultProps: function () { +var Splitter = React.createClass({ + displayName: "Splitter", + + getDefaultProps: function getDefaultProps() { return { axis: "x" }; }, - getInitialState: function () { + getInitialState: function getInitialState() { return { applied: false, startX: false, startY: false }; }, - onMouseDown: function (e) { + onMouseDown: function onMouseDown(e) { this.setState({ startX: e.pageX, startY: e.pageY @@ -591,13 +593,13 @@ var Splitter = React.createClass({displayName: "Splitter", // Occasionally, only a dragEnd event is triggered, but no mouseUp. window.addEventListener("dragend", this.onDragEnd); }, - onDragEnd: function () { + onDragEnd: function onDragEnd() { this.getDOMNode().style.transform = ""; window.removeEventListener("dragend", this.onDragEnd); window.removeEventListener("mouseup", this.onMouseUp); window.removeEventListener("mousemove", this.onMouseMove); }, - onMouseUp: function (e) { + onMouseUp: function onMouseUp(e) { this.onDragEnd(); var node = this.getDOMNode(); @@ -621,8 +623,9 @@ var Splitter = React.createClass({displayName: "Splitter", }); this.onResize(); }, - onMouseMove: function (e) { - var dX = 0, dY = 0; + onMouseMove: function onMouseMove(e) { + var dX = 0, + dY = 0; if (this.props.axis === "x") { dX = e.pageX - this.state.startX; } else { @@ -630,14 +633,14 @@ var Splitter = React.createClass({displayName: "Splitter", } this.getDOMNode().style.transform = "translate(" + dX + "px," + dY + "px)"; }, - onResize: function () { + 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 (willUnmount) { + reset: function reset(willUnmount) { if (!this.state.applied) { return; } @@ -655,20 +658,20 @@ var Splitter = React.createClass({displayName: "Splitter", } this.onResize(); }, - componentWillUnmount: function () { + componentWillUnmount: function componentWillUnmount() { this.reset(true); }, - render: function () { + render: function render() { var className = "splitter"; if (this.props.axis === "x") { className += " splitter-x"; } else { className += " splitter-y"; } - return ( - React.createElement("div", {className: className}, - React.createElement("div", {onMouseDown: this.onMouseDown, draggable: "true"}) - ) + return React.createElement( + "div", + { className: className }, + React.createElement("div", { onMouseDown: this.onMouseDown, draggable: "true" }) ); } }); @@ -683,32 +686,40 @@ module.exports = { SettingsState: SettingsState }; + },{"lodash":"lodash","react":"react","react-router":"react-router"}],5:[function(require,module,exports){ +"use strict"; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + var React = require("react"); var common = require("./common.js"); var utils = require("../utils.js"); -var contentToHtml = function (content) { +var contentToHtml = function contentToHtml(content) { return _.escape(content); }; -var nodeToContent = function (node) { +var nodeToContent = function nodeToContent(node) { return node.textContent; }; /* -Basic Editor Functionality + Basic Editor Functionality */ -var EditorBase = React.createClass({displayName: "EditorBase", +var EditorBase = React.createClass({ + displayName: "EditorBase", + propTypes: { content: React.PropTypes.string.isRequired, onDone: React.PropTypes.func.isRequired, contentToHtml: React.PropTypes.func, nodeToContent: React.PropTypes.func, // content === nodeToContent( Node<innerHTML=contentToHtml(content)> ) + onStop: React.PropTypes.func, submitOnEnter: React.PropTypes.bool, className: React.PropTypes.string, tag: React.PropTypes.string }, - getDefaultProps: function () { + getDefaultProps: function getDefaultProps() { return { contentToHtml: contentToHtml, nodeToContent: nodeToContent, @@ -717,68 +728,113 @@ var EditorBase = React.createClass({displayName: "EditorBase", tag: "div" }; }, - getInitialState: function () { + getInitialState: function getInitialState() { return { editable: false }; }, - render: function () { + render: function render() { var className = "inline-input " + this.props.className; - var html = {__html: this.props.contentToHtml(this.props.content)}; + var html = { __html: this.props.contentToHtml(this.props.content) }; var Tag = this.props.tag; - return React.createElement(Tag, React.__spread({}, - this.props, - {tabIndex: "0", - className: className, + return React.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, - onBlur: this._stop, - onKeyDown: this.onKeyDown, - onInput: this.onInput, - onPaste: this.onPaste, - dangerouslySetInnerHTML: html}) - ); - }, - onPaste: function(e){ + 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); }, - onFocus: function (e) { - this.setState({editable: true}, function () { - React.findDOMNode(this).focus(); - var range = document.createRange(); - range.selectNodeContents(this.getDOMNode()); - var sel = window.getSelection(); - sel.removeAllRanges(); - sel.addRange(range); + 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(React.findDOMNode(this)); + } + + this._ignore_events = true; + this.setState({ editable: true }, function () { + var node = React.findDOMNode(this); + node.blur(); + node.focus(); + this._ignore_events = false; + //sel.removeAllRanges(); + //sel.addRange(range); }); - this.props.onFocus && this.props.onFocus(e); }, - stop: function () { + 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. React.findDOMNode(this).blur(); + this.props.onStop && this.props.onStop(); }, - _stop: function (e) { + _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 = React.findDOMNode(this); var content = this.props.nodeToContent(node); - this.setState({editable: false}); + this.setState({ editable: false }); this.props.onDone(content); this.props.onBlur && this.props.onBlur(e); }, - cancel: function () { + reset: function reset() { React.findDOMNode(this).innerHTML = this.props.contentToHtml(this.props.content); - this.stop(); }, - onKeyDown: function (e) { + onKeyDown: function onKeyDown(e) { e.stopPropagation(); switch (e.keyCode) { case utils.Key.ESC: e.preventDefault(); - this.cancel(); + this.reset(); + this.stop(); break; case utils.Key.ENTER: if (this.props.submitOnEnter && !e.shiftKey) { @@ -790,7 +846,7 @@ var EditorBase = React.createClass({displayName: "EditorBase", break; } }, - onInput: function () { + onInput: function onInput() { var node = React.findDOMNode(this); var content = this.props.nodeToContent(node); this.props.onInput && this.props.onInput(content); @@ -798,48 +854,49 @@ var EditorBase = React.createClass({displayName: "EditorBase", }); /* -Add Validation to EditorBase + Add Validation to EditorBase */ -var ValidateEditor = React.createClass({displayName: "ValidateEditor", +var ValidateEditor = React.createClass({ + displayName: "ValidateEditor", + propTypes: { content: React.PropTypes.string.isRequired, onDone: React.PropTypes.func.isRequired, onInput: React.PropTypes.func, isValid: React.PropTypes.func, - className: React.PropTypes.string, + className: React.PropTypes.string }, - getInitialState: function(){ + getInitialState: function getInitialState() { return { currentContent: this.props.content }; }, - componentWillReceiveProps: function(){ - this.setState({currentContent: this.props.content}); + componentWillReceiveProps: function componentWillReceiveProps() { + this.setState({ currentContent: this.props.content }); }, - onInput: function(content){ - this.setState({currentContent: content}); + onInput: function onInput(content) { + this.setState({ currentContent: content }); this.props.onInput && this.props.onInput(content); }, - render: function () { + 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" + className += " has-warning"; } } - return React.createElement(EditorBase, React.__spread({}, - this.props, - {ref: "editor", - className: className, - onDone: this.onDone, - onInput: this.onInput}) - ); + return React.createElement(EditorBase, _extends({}, this.props, { + ref: "editor", + className: className, + onDone: this.onDone, + onInput: this.onInput + })); }, - onDone: function (content) { - if(this.props.isValid && !this.props.isValid(content)){ - this.refs.editor.cancel(); + onDone: function onDone(content) { + if (this.props.isValid && !this.props.isValid(content)) { + this.refs.editor.reset(); content = this.props.content; } this.props.onDone(content); @@ -847,31 +904,29 @@ var ValidateEditor = React.createClass({displayName: "ValidateEditor", }); /* -Text Editor with mitmweb-specific convenience features + Text Editor with mitmweb-specific convenience features */ -var ValueEditor = React.createClass({displayName: "ValueEditor", +var ValueEditor = React.createClass({ + displayName: "ValueEditor", + mixins: [common.ChildFocus], propTypes: { content: React.PropTypes.string.isRequired, onDone: React.PropTypes.func.isRequired, - inline: React.PropTypes.bool, + inline: React.PropTypes.bool }, - render: function () { + render: function render() { var tag = this.props.inline ? "span" : "div"; - return React.createElement(ValidateEditor, React.__spread({}, - this.props, - {onBlur: this.onBlur, - tag: tag}) - ); + return React.createElement(ValidateEditor, _extends({}, this.props, { + onStop: this.onStop, + tag: tag + })); }, - focus: function () { + focus: function focus() { React.findDOMNode(this).focus(); }, - onBlur: function(e){ - if(!e.relatedTarget){ - this.returnFocus(); - } - this.props.onBlur && this.props.onBlur(e); + onStop: function onStop() { + this.returnFocus(); } }); @@ -879,7 +934,10 @@ module.exports = { ValueEditor: ValueEditor }; + },{"../utils.js":26,"./common.js":4,"react":"react"}],6:[function(require,module,exports){ +"use strict"; + var React = require("react"); var common = require("./common.js"); var Query = require("../actions.js").Query; @@ -887,38 +945,44 @@ var VirtualScrollMixin = require("./virtualscroll.js"); var views = require("../store/view.js"); var _ = require("lodash"); -var LogMessage = React.createClass({displayName: "LogMessage", - render: function () { +var LogMessage = React.createClass({ + displayName: "LogMessage", + + render: function render() { var entry = this.props.entry; var indicator; switch (entry.level) { case "web": - indicator = React.createElement("i", {className: "fa fa-fw fa-html5"}); + indicator = React.createElement("i", { className: "fa fa-fw fa-html5" }); break; case "debug": - indicator = React.createElement("i", {className: "fa fa-fw fa-bug"}); + indicator = React.createElement("i", { className: "fa fa-fw fa-bug" }); break; default: - indicator = React.createElement("i", {className: "fa fa-fw fa-info"}); - } - return ( - React.createElement("div", null, - indicator, " ", entry.message - ) + indicator = React.createElement("i", { className: "fa fa-fw fa-info" }); + } + return React.createElement( + "div", + null, + indicator, + " ", + entry.message ); }, - shouldComponentUpdate: function () { + shouldComponentUpdate: function shouldComponentUpdate() { return false; // log entries are immutable. } }); -var EventLogContents = React.createClass({displayName: "EventLogContents", +var EventLogContents = React.createClass({ + displayName: "EventLogContents", + contextTypes: { eventStore: React.PropTypes.object.isRequired }, mixins: [common.AutoScrollMixin, VirtualScrollMixin], - getInitialState: function () { - var filterFn = function (entry) { + getInitialState: function getInitialState() { + var filterFn = function filterFn(entry) { return this.props.filter[entry.level]; }; var view = new views.StoreView(this.context.eventStore, filterFn.bind(this)); @@ -929,68 +993,75 @@ var EventLogContents = React.createClass({displayName: "EventLogContents", view: view }; }, - componentWillUnmount: function () { + componentWillUnmount: function componentWillUnmount() { this.state.view.close(); }, - filter: function (entry) { + filter: function filter(entry) { return this.props.filter[entry.level]; }, - onEventLogChange: function () { + onEventLogChange: function onEventLogChange() { this.forceUpdate(); }, - componentWillReceiveProps: function (nextProps) { + componentWillReceiveProps: function componentWillReceiveProps(nextProps) { if (nextProps.filter !== this.props.filter) { this.props.filter = nextProps.filter; // Dirty: Make sure that view filter sees the update. this.state.view.recalculate(); } }, - getDefaultProps: function () { + getDefaultProps: function getDefaultProps() { return { rowHeight: 45, rowHeightMin: 15, placeholderTagName: "div" }; }, - renderRow: function (elem) { - return React.createElement(LogMessage, {key: elem.id, entry: elem}); + renderRow: function renderRow(elem) { + return React.createElement(LogMessage, { key: elem.id, entry: elem }); }, - render: function () { + render: function render() { var entries = this.state.view.list; var rows = this.renderRows(entries); - return React.createElement("pre", {onScroll: this.onScroll}, - this.getPlaceholderTop(entries.length), - rows, - this.getPlaceholderBottom(entries.length) + return React.createElement( + "pre", + { onScroll: this.onScroll }, + this.getPlaceholderTop(entries.length), + rows, + this.getPlaceholderBottom(entries.length) ); } }); -var ToggleFilter = React.createClass({displayName: "ToggleFilter", - toggle: function (e) { +var ToggleFilter = React.createClass({ + displayName: "ToggleFilter", + + toggle: function toggle(e) { e.preventDefault(); return this.props.toggleLevel(this.props.name); }, - render: function () { + render: function render() { var className = "label "; if (this.props.active) { className += "label-primary"; } else { className += "label-default"; } - return ( - React.createElement("a", { - href: "#", - className: className, - onClick: this.toggle}, - this.props.name - ) + return React.createElement( + "a", + { + href: "#", + className: className, + onClick: this.toggle }, + this.props.name ); } }); -var EventLog = React.createClass({displayName: "EventLog", - getInitialState: function () { +var EventLog = React.createClass({ + displayName: "EventLog", + + mixins: [common.Navigation], + getInitialState: function getInitialState() { return { filter: { "debug": false, @@ -999,77 +1070,92 @@ var EventLog = React.createClass({displayName: "EventLog", } }; }, - close: function () { + close: function close() { var d = {}; d[Query.SHOW_EVENTLOG] = undefined; this.setQuery(d); }, - toggleLevel: function (level) { + toggleLevel: function toggleLevel(level) { var filter = _.extend({}, this.state.filter); filter[level] = !filter[level]; - this.setState({filter: filter}); - }, - render: function () { - return ( - React.createElement("div", {className: "eventlog"}, - React.createElement("div", null, - "Eventlog", - React.createElement("div", {className: "pull-right"}, - React.createElement(ToggleFilter, {name: "debug", active: this.state.filter.debug, toggleLevel: this.toggleLevel}), - React.createElement(ToggleFilter, {name: "info", active: this.state.filter.info, toggleLevel: this.toggleLevel}), - React.createElement(ToggleFilter, {name: "web", active: this.state.filter.web, toggleLevel: this.toggleLevel}), - React.createElement("i", {onClick: this.close, className: "fa fa-close"}) - ) - - ), - React.createElement(EventLogContents, {filter: this.state.filter}) - ) + this.setState({ filter: filter }); + }, + render: function render() { + return React.createElement( + "div", + { className: "eventlog" }, + React.createElement( + "div", + null, + "Eventlog", + React.createElement( + "div", + { className: "pull-right" }, + React.createElement(ToggleFilter, { name: "debug", active: this.state.filter.debug, toggleLevel: this.toggleLevel }), + React.createElement(ToggleFilter, { name: "info", active: this.state.filter.info, toggleLevel: this.toggleLevel }), + React.createElement(ToggleFilter, { name: "web", active: this.state.filter.web, toggleLevel: this.toggleLevel }), + React.createElement("i", { onClick: this.close, className: "fa fa-close" }) + ) + ), + React.createElement(EventLogContents, { filter: this.state.filter }) ); } }); module.exports = EventLog; + },{"../actions.js":2,"../store/view.js":25,"./common.js":4,"./virtualscroll.js":19,"lodash":"lodash","react":"react"}],7:[function(require,module,exports){ +"use strict"; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + var React = require("react"); var RequestUtils = require("../flow/utils.js").RequestUtils; var ResponseUtils = require("../flow/utils.js").ResponseUtils; var utils = require("../utils.js"); -var TLSColumn = React.createClass({displayName: "TLSColumn", +var TLSColumn = React.createClass({ + displayName: "TLSColumn", + statics: { - Title: React.createClass({displayName: "Title", - render: function(){ - return React.createElement("th", React.__spread({}, this.props, {className: "col-tls " + (this.props.className || "") })); + Title: React.createClass({ + displayName: "Title", + + render: function render() { + return React.createElement("th", _extends({}, this.props, { className: "col-tls " + (this.props.className || "") })); } }), - sortKeyFun: function(flow){ + sortKeyFun: function sortKeyFun(flow) { return flow.request.scheme; } }, - render: function () { + render: function render() { var flow = this.props.flow; - var ssl = (flow.request.scheme === "https"); + var ssl = flow.request.scheme === "https"; var classes; if (ssl) { classes = "col-tls col-tls-https"; } else { classes = "col-tls col-tls-http"; } - return React.createElement("td", {className: classes}); + return React.createElement("td", { className: classes }); } }); +var IconColumn = React.createClass({ + displayName: "IconColumn", -var IconColumn = React.createClass({displayName: "IconColumn", statics: { - Title: React.createClass({displayName: "Title", - render: function(){ - return React.createElement("th", React.__spread({}, this.props, {className: "col-icon " + (this.props.className || "") })); + Title: React.createClass({ + displayName: "Title", + + render: function render() { + return React.createElement("th", _extends({}, this.props, { className: "col-icon " + (this.props.className || "") })); } }) }, - render: function () { + render: function render() { var flow = this.props.flow; var icon; @@ -1077,9 +1163,9 @@ var IconColumn = React.createClass({displayName: "IconColumn", var contentType = ResponseUtils.getContentType(flow.response); //TODO: We should assign a type to the flow somewhere else. - if (flow.response.code === 304) { + if (flow.response.status_code === 304) { icon = "resource-icon-not-modified"; - } else if (300 <= flow.response.code && flow.response.code < 400) { + } 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"; @@ -1095,86 +1181,126 @@ var IconColumn = React.createClass({displayName: "IconColumn", icon = "resource-icon-plain"; } - icon += " resource-icon"; - return React.createElement("td", {className: "col-icon"}, - React.createElement("div", {className: icon}) + return React.createElement( + "td", + { className: "col-icon" }, + React.createElement("div", { className: icon }) ); } }); -var PathColumn = React.createClass({displayName: "PathColumn", +var PathColumn = React.createClass({ + displayName: "PathColumn", + statics: { - Title: React.createClass({displayName: "Title", - render: function(){ - return React.createElement("th", React.__spread({}, this.props, {className: "col-path " + (this.props.className || "") }), "Path"); + Title: React.createClass({ + displayName: "Title", + + render: function render() { + return React.createElement( + "th", + _extends({}, this.props, { className: "col-path " + (this.props.className || "") }), + "Path" + ); } }), - sortKeyFun: function(flow){ + sortKeyFun: function sortKeyFun(flow) { return RequestUtils.pretty_url(flow.request); } }, - render: function () { + render: function render() { var flow = this.props.flow; - return React.createElement("td", {className: "col-path"}, - flow.request.is_replay ? React.createElement("i", {className: "fa fa-fw fa-repeat pull-right"}) : null, - flow.intercepted ? React.createElement("i", {className: "fa fa-fw fa-pause pull-right"}) : null, - RequestUtils.pretty_url(flow.request) + return React.createElement( + "td", + { className: "col-path" }, + flow.request.is_replay ? React.createElement("i", { className: "fa fa-fw fa-repeat pull-right" }) : null, + flow.intercepted ? React.createElement("i", { className: "fa fa-fw fa-pause pull-right" }) : null, + RequestUtils.pretty_url(flow.request) ); } }); +var MethodColumn = React.createClass({ + displayName: "MethodColumn", -var MethodColumn = React.createClass({displayName: "MethodColumn", statics: { - Title: React.createClass({displayName: "Title", - render: function(){ - return React.createElement("th", React.__spread({}, this.props, {className: "col-method " + (this.props.className || "") }), "Method"); + Title: React.createClass({ + displayName: "Title", + + render: function render() { + return React.createElement( + "th", + _extends({}, this.props, { className: "col-method " + (this.props.className || "") }), + "Method" + ); } }), - sortKeyFun: function(flow){ + sortKeyFun: function sortKeyFun(flow) { return flow.request.method; } }, - render: function () { + render: function render() { var flow = this.props.flow; - return React.createElement("td", {className: "col-method"}, flow.request.method); + return React.createElement( + "td", + { className: "col-method" }, + flow.request.method + ); } }); +var StatusColumn = React.createClass({ + displayName: "StatusColumn", -var StatusColumn = React.createClass({displayName: "StatusColumn", statics: { - Title: React.createClass({displayName: "Title", - render: function(){ - return React.createElement("th", React.__spread({}, this.props, {className: "col-status " + (this.props.className || "") }), "Status"); + Title: React.createClass({ + displayName: "Title", + + render: function render() { + return React.createElement( + "th", + _extends({}, this.props, { className: "col-status " + (this.props.className || "") }), + "Status" + ); } }), - sortKeyFun: function(flow){ - return flow.response ? flow.response.code : undefined; + sortKeyFun: function sortKeyFun(flow) { + return flow.response ? flow.response.status_code : undefined; } }, - render: function () { + render: function render() { var flow = this.props.flow; var status; if (flow.response) { - status = flow.response.code; + status = flow.response.status_code; } else { status = null; } - return React.createElement("td", {className: "col-status"}, status); + return React.createElement( + "td", + { className: "col-status" }, + status + ); } }); +var SizeColumn = React.createClass({ + displayName: "SizeColumn", -var SizeColumn = React.createClass({displayName: "SizeColumn", statics: { - Title: React.createClass({displayName: "Title", - render: function(){ - return React.createElement("th", React.__spread({}, this.props, {className: "col-size " + (this.props.className || "") }), "Size"); + Title: React.createClass({ + displayName: "Title", + + render: function render() { + return React.createElement( + "th", + _extends({}, this.props, { className: "col-size " + (this.props.className || "") }), + "Size" + ); } }), - sortKeyFun: function(flow){ + sortKeyFun: function sortKeyFun(flow) { var total = flow.request.contentLength; if (flow.response) { total += flow.response.contentLength || 0; @@ -1182,7 +1308,7 @@ var SizeColumn = React.createClass({displayName: "SizeColumn", return total; } }, - render: function () { + render: function render() { var flow = this.props.flow; var total = flow.request.contentLength; @@ -1190,25 +1316,36 @@ var SizeColumn = React.createClass({displayName: "SizeColumn", total += flow.response.contentLength || 0; } var size = utils.formatSize(total); - return React.createElement("td", {className: "col-size"}, size); + return React.createElement( + "td", + { className: "col-size" }, + size + ); } }); +var TimeColumn = React.createClass({ + displayName: "TimeColumn", -var TimeColumn = React.createClass({displayName: "TimeColumn", statics: { - Title: React.createClass({displayName: "Title", - render: function(){ - return React.createElement("th", React.__spread({}, this.props, {className: "col-time " + (this.props.className || "") }), "Time"); + Title: React.createClass({ + displayName: "Title", + + render: function render() { + return React.createElement( + "th", + _extends({}, this.props, { className: "col-time " + (this.props.className || "") }), + "Time" + ); } }), - sortKeyFun: function(flow){ - if(flow.response) { + sortKeyFun: function sortKeyFun(flow) { + if (flow.response) { return flow.response.timestamp_end - flow.request.timestamp_start; } } }, - render: function () { + render: function render() { var flow = this.props.flow; var time; if (flow.response) { @@ -1216,24 +1353,22 @@ var TimeColumn = React.createClass({displayName: "TimeColumn", } else { time = "..."; } - return React.createElement("td", {className: "col-time"}, time); + return React.createElement( + "td", + { className: "col-time" }, + time + ); } }); - -var all_columns = [ - TLSColumn, - IconColumn, - PathColumn, - MethodColumn, - StatusColumn, - SizeColumn, - TimeColumn -]; +var all_columns = [TLSColumn, IconColumn, PathColumn, MethodColumn, StatusColumn, SizeColumn, TimeColumn]; module.exports = all_columns; + },{"../flow/utils.js":23,"../utils.js":26,"react":"react"}],8:[function(require,module,exports){ +"use strict"; + var React = require("react"); var common = require("./common.js"); var utils = require("../utils.js"); @@ -1242,12 +1377,14 @@ var _ = require("lodash"); var VirtualScrollMixin = require("./virtualscroll.js"); var flowtable_columns = require("./flowtable-columns.js"); -var FlowRow = React.createClass({displayName: "FlowRow", - render: function () { +var FlowRow = React.createClass({ + displayName: "FlowRow", + + render: function render() { var flow = this.props.flow; - var columns = this.props.columns.map(function (Column) { - return React.createElement(Column, {key: Column.displayName, flow: flow}); - }.bind(this)); + var columns = this.props.columns.map((function (Column) { + return React.createElement(Column, { key: Column.displayName, flow: flow }); + }).bind(this)); var className = ""; if (this.props.selected) { className += " selected"; @@ -1265,12 +1402,13 @@ var FlowRow = React.createClass({displayName: "FlowRow", className += " has-response"; } - return ( - React.createElement("tr", {className: className, onClick: this.props.selectFlow.bind(null, flow)}, - columns - )); + return React.createElement( + "tr", + { className: className, onClick: this.props.selectFlow.bind(null, flow) }, + columns + ); }, - shouldComponentUpdate: function (nextProps) { + shouldComponentUpdate: function shouldComponentUpdate(nextProps) { return true; // Further optimization could be done here // by calling forceUpdate on flow updates, selection changes and column changes. @@ -1281,17 +1419,19 @@ var FlowRow = React.createClass({displayName: "FlowRow", } }); -var FlowTableHead = React.createClass({displayName: "FlowTableHead", - getInitialState: function(){ +var FlowTableHead = React.createClass({ + displayName: "FlowTableHead", + + getInitialState: function getInitialState() { return { sortColumn: undefined, sortDesc: false }; }, - onClick: function(Column){ + onClick: function onClick(Column) { var sortDesc = this.state.sortDesc; var hasSort = Column.sortKeyFun; - if(Column === this.state.sortColumn){ + if (Column === this.state.sortColumn) { sortDesc = !sortDesc; this.setState({ sortDesc: sortDesc @@ -1300,120 +1440,124 @@ var FlowTableHead = React.createClass({displayName: "FlowTableHead", this.setState({ sortColumn: hasSort && Column, sortDesc: false - }) + }); } var sortKeyFun; - if(!sortDesc){ + if (!sortDesc) { sortKeyFun = Column.sortKeyFun; } else { - sortKeyFun = hasSort && function(){ + sortKeyFun = hasSort && function () { var k = Column.sortKeyFun.apply(this, arguments); - if(_.isString(k)){ - return utils.reverseString(""+k); + if (_.isString(k)) { + return utils.reverseString("" + k); } else { return -k; } - } + }; } this.props.setSortKeyFun(sortKeyFun); }, - render: function () { - var columns = this.props.columns.map(function (Column) { + render: function render() { + var columns = this.props.columns.map((function (Column) { var onClick = this.onClick.bind(this, Column); var className; - if(this.state.sortColumn === Column) { - if(this.state.sortDesc){ + if (this.state.sortColumn === Column) { + if (this.state.sortDesc) { className = "sort-desc"; } else { className = "sort-asc"; } } return React.createElement(Column.Title, { - key: Column.displayName, - onClick: onClick, - className: className}); - }.bind(this)); - return React.createElement("thead", null, - React.createElement("tr", null, columns) + key: Column.displayName, + onClick: onClick, + className: className }); + }).bind(this)); + return React.createElement( + "thead", + null, + React.createElement( + "tr", + null, + columns + ) ); } }); - var ROW_HEIGHT = 32; -var FlowTable = React.createClass({displayName: "FlowTable", +var FlowTable = React.createClass({ + displayName: "FlowTable", + mixins: [common.StickyHeadMixin, common.AutoScrollMixin, VirtualScrollMixin], contextTypes: { view: React.PropTypes.object.isRequired }, - getInitialState: function () { + getInitialState: function getInitialState() { return { columns: flowtable_columns }; }, - componentWillMount: function () { + componentWillMount: function componentWillMount() { this.context.view.addListener("add", this.onChange); this.context.view.addListener("update", this.onChange); this.context.view.addListener("remove", this.onChange); this.context.view.addListener("recalculate", this.onChange); }, - componentWillUnmount: function(){ + componentWillUnmount: function componentWillUnmount() { this.context.view.removeListener("add", this.onChange); this.context.view.removeListener("update", this.onChange); this.context.view.removeListener("remove", this.onChange); this.context.view.removeListener("recalculate", this.onChange); }, - getDefaultProps: function () { + getDefaultProps: function getDefaultProps() { return { rowHeight: ROW_HEIGHT }; }, - onScrollFlowTable: function () { + onScrollFlowTable: function onScrollFlowTable() { this.adjustHead(); this.onScroll(); }, - onChange: function () { + onChange: function onChange() { this.forceUpdate(); }, - scrollIntoView: function (flow) { - this.scrollRowIntoView( - this.context.view.index(flow), - this.refs.body.getDOMNode().offsetTop - ); + scrollIntoView: function scrollIntoView(flow) { + this.scrollRowIntoView(this.context.view.index(flow), this.refs.body.getDOMNode().offsetTop); }, - renderRow: function (flow) { - var selected = (flow === this.props.selected); - var highlighted = - ( - this.context.view._highlight && - this.context.view._highlight[flow.id] - ); + renderRow: function renderRow(flow) { + var selected = flow === this.props.selected; + var highlighted = this.context.view._highlight && this.context.view._highlight[flow.id]; - return React.createElement(FlowRow, {key: flow.id, - ref: flow.id, - flow: flow, - columns: this.state.columns, - selected: selected, - highlighted: highlighted, - selectFlow: this.props.selectFlow} - ); + return React.createElement(FlowRow, { key: flow.id, + ref: flow.id, + flow: flow, + columns: this.state.columns, + selected: selected, + highlighted: highlighted, + selectFlow: this.props.selectFlow + }); }, - render: function () { + render: function render() { var flows = this.context.view.list; var rows = this.renderRows(flows); - return ( - React.createElement("div", {className: "flow-table", onScroll: this.onScrollFlowTable}, - React.createElement("table", null, - React.createElement(FlowTableHead, {ref: "head", - columns: this.state.columns, - setSortKeyFun: this.props.setSortKeyFun}), - React.createElement("tbody", {ref: "body"}, - this.getPlaceholderTop(flows.length), - rows, - this.getPlaceholderBottom(flows.length) - ) + return React.createElement( + "div", + { className: "flow-table", onScroll: this.onScrollFlowTable }, + React.createElement( + "table", + null, + React.createElement(FlowTableHead, { ref: "head", + columns: this.state.columns, + setSortKeyFun: this.props.setSortKeyFun }), + React.createElement( + "tbody", + { ref: "body" }, + this.getPlaceholderTop(flows.length), + rows, + this.getPlaceholderBottom(flows.length) ) ) ); @@ -1424,6 +1568,10 @@ module.exports = FlowTable; },{"../utils.js":26,"./common.js":4,"./flowtable-columns.js":7,"./virtualscroll.js":19,"lodash":"lodash","react":"react"}],9:[function(require,module,exports){ +"use strict"; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + var React = require("react"); var _ = require("lodash"); @@ -1431,28 +1579,32 @@ var MessageUtils = require("../../flow/utils.js").MessageUtils; var utils = require("../../utils.js"); var image_regex = /^image\/(png|jpe?g|gif|vnc.microsoft.icon|x-icon)$/i; -var ViewImage = React.createClass({displayName: "ViewImage", +var ViewImage = React.createClass({ + displayName: "ViewImage", + statics: { - matches: function (message) { + matches: function matches(message) { return image_regex.test(MessageUtils.getContentType(message)); } }, - render: function () { + render: function render() { var url = MessageUtils.getContentURL(this.props.flow, this.props.message); - return React.createElement("div", {className: "flowview-image"}, - React.createElement("img", {src: url, alt: "preview", className: "img-thumbnail"}) + return React.createElement( + "div", + { className: "flowview-image" }, + React.createElement("img", { src: url, alt: "preview", className: "img-thumbnail" }) ); } }); var RawMixin = { - getInitialState: function () { + getInitialState: function getInitialState() { return { content: undefined, request: undefined - } + }; }, - requestContent: function (nextProps) { + requestContent: function requestContent(nextProps) { if (this.state.request) { this.state.request.abort(); } @@ -1461,77 +1613,91 @@ var RawMixin = { content: undefined, request: request }); - request.done(function (data) { - this.setState({content: data}); - }.bind(this)).fail(function (jqXHR, textStatus, errorThrown) { + 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)); - + this.setState({ content: "AJAX Error: " + textStatus + "\r\n" + errorThrown }); + }).bind(this)).always((function () { + this.setState({ request: undefined }); + }).bind(this)); }, - componentWillMount: function () { + componentWillMount: function componentWillMount() { this.requestContent(this.props); }, - componentWillReceiveProps: function (nextProps) { + componentWillReceiveProps: function componentWillReceiveProps(nextProps) { if (nextProps.message !== this.props.message) { this.requestContent(nextProps); } }, - componentWillUnmount: function () { + componentWillUnmount: function componentWillUnmount() { if (this.state.request) { this.state.request.abort(); } }, - render: function () { + render: function render() { if (!this.state.content) { - return React.createElement("div", {className: "text-center"}, - React.createElement("i", {className: "fa fa-spinner fa-spin"}) + return React.createElement( + "div", + { className: "text-center" }, + React.createElement("i", { className: "fa fa-spinner fa-spin" }) ); } return this.renderContent(); } }; -var ViewRaw = React.createClass({displayName: "ViewRaw", +var ViewRaw = React.createClass({ + displayName: "ViewRaw", + mixins: [RawMixin], statics: { - matches: function (message) { + matches: function matches(message) { return true; } }, - renderContent: function () { - return React.createElement("pre", null, this.state.content); + renderContent: function renderContent() { + return React.createElement( + "pre", + null, + this.state.content + ); } }); var json_regex = /^application\/json$/i; -var ViewJSON = React.createClass({displayName: "ViewJSON", +var ViewJSON = React.createClass({ + displayName: "ViewJSON", + mixins: [RawMixin], statics: { - matches: function (message) { + matches: function matches(message) { return json_regex.test(MessageUtils.getContentType(message)); } }, - renderContent: function () { + renderContent: function renderContent() { var json = this.state.content; try { json = JSON.stringify(JSON.parse(json), null, 2); - } catch (e) { - } - return React.createElement("pre", null, json); + } catch (e) {} + return React.createElement( + "pre", + null, + json + ); } }); -var ViewAuto = React.createClass({displayName: "ViewAuto", +var ViewAuto = React.createClass({ + displayName: "ViewAuto", + statics: { - matches: function () { + matches: function matches() { return false; // don't match itself }, - findView: function (message) { + findView: function findView(message) { for (var i = 0; i < all.length; i++) { if (all[i].matches(message)) { return all[i]; @@ -1540,47 +1706,72 @@ var ViewAuto = React.createClass({displayName: "ViewAuto", return all[all.length - 1]; } }, - render: function () { + render: function render() { var View = ViewAuto.findView(this.props.message); - return React.createElement(View, React.__spread({}, this.props)); + return React.createElement(View, this.props); } }); var all = [ViewAuto, ViewImage, ViewJSON, ViewRaw]; +var ContentEmpty = React.createClass({ + displayName: "ContentEmpty", -var ContentEmpty = React.createClass({displayName: "ContentEmpty", - render: function () { + render: function render() { var message_name = this.props.flow.request === this.props.message ? "request" : "response"; - return React.createElement("div", {className: "alert alert-info"}, "No ", message_name, " content."); + return React.createElement( + "div", + { className: "alert alert-info" }, + "No ", + message_name, + " content." + ); } }); -var ContentMissing = React.createClass({displayName: "ContentMissing", - render: function () { +var ContentMissing = React.createClass({ + displayName: "ContentMissing", + + render: function render() { var message_name = this.props.flow.request === this.props.message ? "Request" : "Response"; - return React.createElement("div", {className: "alert alert-info"}, message_name, " content missing."); + return React.createElement( + "div", + { className: "alert alert-info" }, + message_name, + " content missing." + ); } }); -var TooLarge = React.createClass({displayName: "TooLarge", +var TooLarge = React.createClass({ + displayName: "TooLarge", + statics: { - isTooLarge: function (message) { + isTooLarge: function isTooLarge(message) { var max_mb = ViewImage.matches(message) ? 10 : 0.2; return message.contentLength > 1024 * 1024 * max_mb; } }, - render: function () { + render: function render() { var size = utils.formatSize(this.props.message.contentLength); - return React.createElement("div", {className: "alert alert-warning"}, - React.createElement("button", {onClick: this.props.onClick, className: "btn btn-xs btn-warning pull-right"}, "Display anyway"), - size, " content size." + return React.createElement( + "div", + { className: "alert alert-warning" }, + React.createElement( + "button", + { onClick: this.props.onClick, className: "btn btn-xs btn-warning pull-right" }, + "Display anyway" + ), + size, + " content size." ); } }); -var ViewSelector = React.createClass({displayName: "ViewSelector", - render: function () { +var ViewSelector = React.createClass({ + displayName: "ViewSelector", + + render: function render() { var views = []; for (var i = 0; i < all.length; i++) { var view = all[i]; @@ -1594,22 +1785,28 @@ var ViewSelector = React.createClass({displayName: "ViewSelector", } else { text = view.displayName.toLowerCase().replace("view", ""); } - views.push( - React.createElement("button", { - key: view.displayName, - onClick: this.props.selectView.bind(null, view), - className: className}, - text - ) - ); + views.push(React.createElement( + "button", + { + key: view.displayName, + onClick: this.props.selectView.bind(null, view), + className: className }, + text + )); } - return React.createElement("div", {className: "view-selector btn-group btn-group-xs"}, views); + return React.createElement( + "div", + { className: "view-selector btn-group btn-group-xs" }, + views + ); } }); -var ContentView = React.createClass({displayName: "ContentView", - getInitialState: function () { +var ContentView = React.createClass({ + displayName: "ContentView", + + getInitialState: function getInitialState() { return { displayLarge: false, View: ViewAuto @@ -1620,40 +1817,46 @@ var ContentView = React.createClass({displayName: "ContentView", // Every view takes the flow and the message as props, e.g. // <Auto flow={flow} message={flow.request}/> flow: React.PropTypes.object.isRequired, - message: React.PropTypes.object.isRequired, + message: React.PropTypes.object.isRequired }, - selectView: function (view) { + selectView: function selectView(view) { this.setState({ View: view }); }, - displayLarge: function () { - this.setState({displayLarge: true}); + displayLarge: function displayLarge() { + this.setState({ displayLarge: true }); }, - componentWillReceiveProps: function (nextProps) { + componentWillReceiveProps: function componentWillReceiveProps(nextProps) { if (nextProps.message !== this.props.message) { this.setState(this.getInitialState()); } }, - render: function () { + render: function render() { var message = this.props.message; if (message.contentLength === 0) { - return React.createElement(ContentEmpty, React.__spread({}, this.props)); + return React.createElement(ContentEmpty, this.props); } else if (message.contentLength === null) { - return React.createElement(ContentMissing, React.__spread({}, this.props)); + return React.createElement(ContentMissing, this.props); } else if (!this.state.displayLarge && TooLarge.isTooLarge(message)) { - return React.createElement(TooLarge, React.__spread({}, this.props, {onClick: this.displayLarge})); + return React.createElement(TooLarge, _extends({}, this.props, { onClick: this.displayLarge })); } var downloadUrl = MessageUtils.getContentURL(this.props.flow, message); - return React.createElement("div", null, - React.createElement(this.state.View, React.__spread({}, this.props)), - React.createElement("div", {className: "view-options text-center"}, - React.createElement(ViewSelector, {selectView: this.selectView, active: this.state.View, message: message}), - "Â ", - React.createElement("a", {className: "btn btn-default btn-xs", href: downloadUrl}, - React.createElement("i", {className: "fa fa-download"}) + return React.createElement( + "div", + null, + React.createElement(this.state.View, this.props), + React.createElement( + "div", + { className: "view-options text-center" }, + React.createElement(ViewSelector, { selectView: this.selectView, active: this.state.View, message: message }), + "Â ", + React.createElement( + "a", + { className: "btn btn-default btn-xs", href: downloadUrl }, + React.createElement("i", { className: "fa fa-download" }) ) ) ); @@ -1662,14 +1865,19 @@ var ContentView = React.createClass({displayName: "ContentView", module.exports = ContentView; + },{"../../flow/utils.js":23,"../../utils.js":26,"lodash":"lodash","react":"react"}],10:[function(require,module,exports){ +"use strict"; + var React = require("react"); var _ = require("lodash"); var utils = require("../../utils.js"); -var TimeStamp = React.createClass({displayName: "TimeStamp", - render: function () { +var TimeStamp = React.createClass({ + displayName: "TimeStamp", + + render: function render() { if (!this.props.t) { //should be return null, but that triggers a React bug. @@ -1681,119 +1889,175 @@ var TimeStamp = React.createClass({displayName: "TimeStamp", var delta; if (this.props.deltaTo) { delta = utils.formatTimeDelta(1000 * (this.props.t - this.props.deltaTo)); - delta = React.createElement("span", {className: "text-muted"}, "(" + delta + ")"); + delta = React.createElement( + "span", + { className: "text-muted" }, + "(" + delta + ")" + ); } else { delta = null; } - return React.createElement("tr", null, - React.createElement("td", null, this.props.title + ":"), - React.createElement("td", null, ts, " ", delta) + return React.createElement( + "tr", + null, + React.createElement( + "td", + null, + this.props.title + ":" + ), + React.createElement( + "td", + null, + ts, + " ", + delta + ) ); } }); -var ConnectionInfo = React.createClass({displayName: "ConnectionInfo", +var ConnectionInfo = React.createClass({ + displayName: "ConnectionInfo", - render: function () { + render: function render() { var conn = this.props.conn; var address = conn.address.address.join(":"); - var sni = React.createElement("tr", {key: "sni"}); //should be null, but that triggers a React bug. + var sni = React.createElement("tr", { key: "sni" }); //should be null, but that triggers a React bug. if (conn.sni) { - sni = React.createElement("tr", {key: "sni"}, - React.createElement("td", null, - React.createElement("abbr", {title: "TLS Server Name Indication"}, "TLS SNI:") - ), - React.createElement("td", null, conn.sni) + sni = React.createElement( + "tr", + { key: "sni" }, + React.createElement( + "td", + null, + React.createElement( + "abbr", + { title: "TLS Server Name Indication" }, + "TLS SNI:" + ) + ), + React.createElement( + "td", + null, + conn.sni + ) ); } - return ( - React.createElement("table", {className: "connection-table"}, - React.createElement("tbody", null, - React.createElement("tr", {key: "address"}, - React.createElement("td", null, "Address:"), - React.createElement("td", null, address) - ), - sni - ) + return React.createElement( + "table", + { className: "connection-table" }, + React.createElement( + "tbody", + null, + React.createElement( + "tr", + { key: "address" }, + React.createElement( + "td", + null, + "Address:" + ), + React.createElement( + "td", + null, + address + ) + ), + sni ) ); } }); -var CertificateInfo = React.createClass({displayName: "CertificateInfo", - render: function () { +var CertificateInfo = React.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 ( - React.createElement("div", null, - client_conn.cert ? React.createElement("h4", null, "Client Certificate") : null, - client_conn.cert ? React.createElement("pre", {style: preStyle}, client_conn.cert) : null, - - server_conn.cert ? React.createElement("h4", null, "Server Certificate") : null, - server_conn.cert ? React.createElement("pre", {style: preStyle}, server_conn.cert) : null - ) + var preStyle = { maxHeight: 100 }; + return React.createElement( + "div", + null, + client_conn.cert ? React.createElement( + "h4", + null, + "Client Certificate" + ) : null, + client_conn.cert ? React.createElement( + "pre", + { style: preStyle }, + client_conn.cert + ) : null, + server_conn.cert ? React.createElement( + "h4", + null, + "Server Certificate" + ) : null, + server_conn.cert ? React.createElement( + "pre", + { style: preStyle }, + server_conn.cert + ) : null ); } }); -var Timing = React.createClass({displayName: "Timing", - render: function () { +var Timing = React.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, + 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: "First request byte", - t: req.timestamp_start, - }, { - title: "Request complete", - t: req.timestamp_end, + title: "Response complete", + t: resp.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. @@ -1804,48 +2068,64 @@ var Timing = React.createClass({displayName: "Timing", timestamps = _.sortBy(timestamps, 't'); var rows = timestamps.map(function (e) { - return React.createElement(TimeStamp, React.__spread({}, e)); + return React.createElement(TimeStamp, e); }); - return ( - React.createElement("div", null, - React.createElement("h4", null, "Timing"), - React.createElement("table", {className: "timing-table"}, - React.createElement("tbody", null, + return React.createElement( + "div", + null, + React.createElement( + "h4", + null, + "Timing" + ), + React.createElement( + "table", + { className: "timing-table" }, + React.createElement( + "tbody", + null, rows - ) ) ) ); } }); -var Details = React.createClass({displayName: "Details", - render: function () { +var Details = React.createClass({ + displayName: "Details", + + render: function render() { var flow = this.props.flow; var client_conn = flow.client_conn; var server_conn = flow.server_conn; - return ( - React.createElement("section", null, - - React.createElement("h4", null, "Client Connection"), - React.createElement(ConnectionInfo, {conn: client_conn}), - - React.createElement("h4", null, "Server Connection"), - React.createElement(ConnectionInfo, {conn: server_conn}), - - React.createElement(CertificateInfo, {flow: flow}), - - React.createElement(Timing, {flow: flow}) - - ) + return React.createElement( + "section", + null, + React.createElement( + "h4", + null, + "Client Connection" + ), + React.createElement(ConnectionInfo, { conn: client_conn }), + React.createElement( + "h4", + null, + "Server Connection" + ), + React.createElement(ConnectionInfo, { conn: server_conn }), + React.createElement(CertificateInfo, { flow: flow }), + React.createElement(Timing, { flow: flow }) ); } }); module.exports = Details; + },{"../../utils.js":26,"lodash":"lodash","react":"react"}],11:[function(require,module,exports){ +"use strict"; + var React = require("react"); var _ = require("lodash"); @@ -1855,7 +2135,6 @@ var Messages = require("./messages.js"); var Details = require("./details.js"); var Prompt = require("../prompt.js"); - var allTabs = { request: Messages.Request, response: Messages.Response, @@ -1863,14 +2142,16 @@ var allTabs = { details: Details }; -var FlowView = React.createClass({displayName: "FlowView", +var FlowView = React.createClass({ + displayName: "FlowView", + mixins: [common.StickyHeadMixin, common.Navigation, common.RouterState], - getInitialState: function () { + getInitialState: function getInitialState() { return { prompt: false }; }, - getTabs: function (flow) { + getTabs: function getTabs(flow) { var tabs = []; ["request", "response", "error"].forEach(function (e) { if (flow[e]) { @@ -1880,43 +2161,32 @@ var FlowView = React.createClass({displayName: "FlowView", tabs.push("details"); return tabs; }, - nextTab: function (i) { + nextTab: function nextTab(i) { var tabs = this.getTabs(this.props.flow); var currentIndex = tabs.indexOf(this.getActive()); // 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 (panel) { - this.replaceWith( - "flow", - { - flowId: this.getParams().flowId, - detailTab: panel - } - ); + selectTab: function selectTab(panel) { + this.replaceWith("flow", { + flowId: this.getParams().flowId, + detailTab: panel + }); }, - getActive: function(){ + getActive: function getActive() { return this.getParams().detailTab; }, - promptEdit: function () { + promptEdit: function promptEdit() { var options; - switch(this.getActive()){ + switch (this.getActive()) { case "request": - options = [ - "method", - "url", - {text:"http version", key:"v"}, - "header" - /*, "content"*/]; + options = ["method", "url", { text: "http version", key: "v" }, "header" + /*, "content"*/]; break; case "response": - options = [ - {text:"http version", key:"v"}, - "code", - "message", - "header" - /*, "content"*/]; + options = [{ text: "http version", key: "v" }, "code", "message", "header" + /*, "content"*/]; break; case "details": return; @@ -1926,17 +2196,17 @@ var FlowView = React.createClass({displayName: "FlowView", this.setState({ prompt: { - done: function (k) { - this.setState({prompt: false}); - if(k){ + done: (function (k) { + this.setState({ prompt: false }); + if (k) { this.refs.tab.edit(k); } - }.bind(this), + }).bind(this), options: options } }); }, - render: function () { + render: function render() { var flow = this.props.flow; var tabs = this.getTabs(flow); var active = this.getActive(); @@ -1954,27 +2224,32 @@ var FlowView = React.createClass({displayName: "FlowView", var prompt = null; if (this.state.prompt) { - prompt = React.createElement(Prompt, React.__spread({}, this.state.prompt)); + prompt = React.createElement(Prompt, this.state.prompt); } var Tab = allTabs[active]; - return ( - React.createElement("div", {className: "flow-detail", onScroll: this.adjustHead}, - React.createElement(Nav, {ref: "head", - flow: flow, - tabs: tabs, - active: active, - selectTab: this.selectTab}), - React.createElement(Tab, {ref: "tab", flow: flow}), - prompt - ) + return React.createElement( + "div", + { className: "flow-detail", onScroll: this.adjustHead }, + React.createElement(Nav, { ref: "head", + flow: flow, + tabs: tabs, + active: active, + selectTab: this.selectTab }), + React.createElement(Tab, { ref: "tab", flow: flow }), + prompt ); } }); module.exports = FlowView; + },{"../common.js":4,"../prompt.js":17,"./details.js":10,"./messages.js":12,"./nav.js":13,"lodash":"lodash","react":"react"}],12:[function(require,module,exports){ +"use strict"; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + var React = require("react"); var _ = require("lodash"); @@ -1985,12 +2260,14 @@ var utils = require("../../utils.js"); var ContentView = require("./contentview.js"); var ValueEditor = require("../editor.js").ValueEditor; -var Headers = React.createClass({displayName: "Headers", +var Headers = React.createClass({ + displayName: "Headers", + propTypes: { onChange: React.PropTypes.func.isRequired, message: React.PropTypes.object.isRequired }, - onChange: function (row, col, val) { + onChange: function onChange(row, col, val) { var nextHeaders = _.cloneDeep(this.props.message.headers); nextHeaders[row][col] = val; if (!nextHeaders[row][0] && !nextHeaders[row][1]) { @@ -2002,16 +2279,16 @@ var Headers = React.createClass({displayName: "Headers", 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._nextSel = row - 1 + "-value"; } } } this.props.onChange(nextHeaders); }, - edit: function () { + edit: function edit() { this.refs["0-key"].focus(); }, - onTab: function (row, col, e) { + onTab: function onTab(row, col, e) { var headers = this.props.message.headers; if (row === headers.length - 1 && col === 1) { e.preventDefault(); @@ -2019,65 +2296,78 @@ var Headers = React.createClass({displayName: "Headers", var nextHeaders = _.cloneDeep(this.props.message.headers); nextHeaders.push(["Name", "Value"]); this.props.onChange(nextHeaders); - this._nextSel = (row + 1) + "-key"; + this._nextSel = row + 1 + "-key"; } }, - componentDidUpdate: function () { + componentDidUpdate: function componentDidUpdate() { if (this._nextSel && this.refs[this._nextSel]) { this.refs[this._nextSel].focus(); this._nextSel = undefined; } }, - onRemove: function (row, col, e) { + 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(); + this.refs[row - 1 + "-value"].focus(); } }, - render: function () { + render: function render() { - var rows = this.props.message.headers.map(function (header, i) { + var rows = this.props.message.headers.map((function (header, i) { var kEdit = React.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)}); + 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 = React.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 ( - React.createElement("tr", {key: i}, - React.createElement("td", {className: "header-name"}, kEdit, ":"), - React.createElement("td", {className: "header-value"}, vEdit) + 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 React.createElement( + "tr", + { key: i }, + React.createElement( + "td", + { className: "header-name" }, + kEdit, + ":" + ), + React.createElement( + "td", + { className: "header-value" }, + vEdit ) ); - }.bind(this)); - return ( - React.createElement("table", {className: "header-table"}, - React.createElement("tbody", null, - rows - ) + }).bind(this)); + return React.createElement( + "table", + { className: "header-table" }, + React.createElement( + "tbody", + null, + rows ) ); } }); -var HeaderEditor = React.createClass({displayName: "HeaderEditor", - render: function () { - return React.createElement(ValueEditor, React.__spread({ref: "input"}, this.props, {onKeyDown: this.onKeyDown, inline: true})); +var HeaderEditor = React.createClass({ + displayName: "HeaderEditor", + + render: function render() { + return React.createElement(ValueEditor, _extends({ ref: "input" }, this.props, { onKeyDown: this.onKeyDown, inline: true })); }, - focus: function () { + focus: function focus() { this.getDOMNode().focus(); }, - onKeyDown: function (e) { + onKeyDown: function onKeyDown(e) { switch (e.keyCode) { case utils.Key.BACKSPACE: var s = window.getSelection().getRangeAt(0); @@ -2094,126 +2384,118 @@ var HeaderEditor = React.createClass({displayName: "HeaderEditor", } }); -var RequestLine = React.createClass({displayName: "RequestLine", - render: function () { +var RequestLine = React.createClass({ + displayName: "RequestLine", + + render: function render() { var flow = this.props.flow; var url = flowutils.RequestUtils.pretty_url(flow.request); - var httpver = "HTTP/" + flow.request.http_version.join("."); + var httpver = flow.request.http_version; - return React.createElement("div", {className: "first-line request-line"}, + return React.createElement( + "div", + { className: "first-line request-line" }, React.createElement(ValueEditor, { - ref: "method", - content: flow.request.method, - onDone: this.onMethodChange, - inline: true}), - "Â ", + ref: "method", + content: flow.request.method, + onDone: this.onMethodChange, + inline: true }), + "Â ", React.createElement(ValueEditor, { - ref: "url", - content: url, - onDone: this.onUrlChange, - isValid: this.isValidUrl, - inline: true}), - "Â ", + ref: "url", + content: url, + onDone: this.onUrlChange, + isValid: this.isValidUrl, + inline: true }), + "Â ", React.createElement(ValueEditor, { - ref: "httpVersion", - content: httpver, - onDone: this.onHttpVersionChange, - isValid: flowutils.isValidHttpVersion, - inline: true}) - ) - }, - isValidUrl: function (url) { + ref: "httpVersion", + content: httpver, + onDone: this.onHttpVersionChange, + isValid: flowutils.isValidHttpVersion, + inline: true }) + ); + }, + isValidUrl: function isValidUrl(url) { var u = flowutils.parseUrl(url); return !!u.host; }, - onMethodChange: function (nextMethod) { - actions.FlowActions.update( - this.props.flow, - {request: {method: nextMethod}} - ); + onMethodChange: function onMethodChange(nextMethod) { + actions.FlowActions.update(this.props.flow, { request: { method: nextMethod } }); }, - onUrlChange: function (nextUrl) { + onUrlChange: function onUrlChange(nextUrl) { var props = flowutils.parseUrl(nextUrl); props.path = props.path || ""; - actions.FlowActions.update( - this.props.flow, - {request: props} - ); + actions.FlowActions.update(this.props.flow, { request: props }); }, - onHttpVersionChange: function (nextVer) { + onHttpVersionChange: function onHttpVersionChange(nextVer) { var ver = flowutils.parseHttpVersion(nextVer); - actions.FlowActions.update( - this.props.flow, - {request: {http_version: ver}} - ); + actions.FlowActions.update(this.props.flow, { request: { http_version: ver } }); } }); -var ResponseLine = React.createClass({displayName: "ResponseLine", - render: function () { +var ResponseLine = React.createClass({ + displayName: "ResponseLine", + + render: function render() { var flow = this.props.flow; - var httpver = "HTTP/" + flow.response.http_version.join("."); - return React.createElement("div", {className: "first-line response-line"}, + var httpver = flow.response.http_version; + return React.createElement( + "div", + { className: "first-line response-line" }, React.createElement(ValueEditor, { - ref: "httpVersion", - content: httpver, - onDone: this.onHttpVersionChange, - isValid: flowutils.isValidHttpVersion, - inline: true}), - "Â ", + ref: "httpVersion", + content: httpver, + onDone: this.onHttpVersionChange, + isValid: flowutils.isValidHttpVersion, + inline: true }), + "Â ", React.createElement(ValueEditor, { - ref: "code", - content: flow.response.code + "", - onDone: this.onCodeChange, - isValid: this.isValidCode, - inline: true}), - "Â ", + ref: "code", + content: flow.response.status_code + "", + onDone: this.onCodeChange, + isValid: this.isValidCode, + inline: true }), + "Â ", React.createElement(ValueEditor, { - ref: "msg", - content: flow.response.msg, - onDone: this.onMsgChange, - inline: true}) + ref: "msg", + content: flow.response.msg, + onDone: this.onMsgChange, + inline: true }) ); }, - isValidCode: function (code) { - return /^\d+$/.test(code); + isValidCode: function isValidCode(code) { + return (/^\d+$/.test(code) + ); }, - onHttpVersionChange: function (nextVer) { + onHttpVersionChange: function onHttpVersionChange(nextVer) { var ver = flowutils.parseHttpVersion(nextVer); - actions.FlowActions.update( - this.props.flow, - {response: {httpversion: ver}} - ); + actions.FlowActions.update(this.props.flow, { response: { http_version: ver } }); }, - onMsgChange: function (nextMsg) { - actions.FlowActions.update( - this.props.flow, - {response: {msg: nextMsg}} - ); + onMsgChange: function onMsgChange(nextMsg) { + actions.FlowActions.update(this.props.flow, { response: { msg: nextMsg } }); }, - onCodeChange: function (nextCode) { + onCodeChange: function onCodeChange(nextCode) { nextCode = parseInt(nextCode); - actions.FlowActions.update( - this.props.flow, - {response: {code: nextCode}} - ); + actions.FlowActions.update(this.props.flow, { response: { code: nextCode } }); } }); -var Request = React.createClass({displayName: "Request", - render: function () { +var Request = React.createClass({ + displayName: "Request", + + render: function render() { var flow = this.props.flow; - return ( - React.createElement("section", {className: "request"}, - React.createElement(RequestLine, {ref: "requestLine", flow: flow}), - /*<ResponseLine flow={flow}/>*/ - React.createElement(Headers, {ref: "headers", message: flow.request, onChange: this.onHeaderChange}), - React.createElement("hr", null), - React.createElement(ContentView, {flow: flow, message: flow.request}) - ) + return React.createElement( + "section", + { className: "request" }, + React.createElement(RequestLine, { ref: "requestLine", flow: flow }), + React.createElement(Headers, { ref: "headers", message: flow.request, onChange: this.onHeaderChange }), + React.createElement("hr", null), + React.createElement(ContentView, { flow: flow, message: flow.request }) ); }, - edit: function (k) { + edit: function edit(k) { switch (k) { case "m": this.refs.requestLine.refs.method.focus(); @@ -2231,7 +2513,7 @@ var Request = React.createClass({displayName: "Request", throw "Unimplemented: " + k; } }, - onHeaderChange: function (nextHeaders) { + onHeaderChange: function onHeaderChange(nextHeaders) { actions.FlowActions.update(this.props.flow, { request: { headers: nextHeaders @@ -2240,23 +2522,24 @@ var Request = React.createClass({displayName: "Request", } }); -var Response = React.createClass({displayName: "Response", - render: function () { +var Response = React.createClass({ + displayName: "Response", + + render: function render() { var flow = this.props.flow; - return ( - React.createElement("section", {className: "response"}, - /*<RequestLine flow={flow}/>*/ - React.createElement(ResponseLine, {ref: "responseLine", flow: flow}), - React.createElement(Headers, {ref: "headers", message: flow.response, onChange: this.onHeaderChange}), - React.createElement("hr", null), - React.createElement(ContentView, {flow: flow, message: flow.response}) - ) + return React.createElement( + "section", + { className: "response" }, + React.createElement(ResponseLine, { ref: "responseLine", flow: flow }), + React.createElement(Headers, { ref: "headers", message: flow.response, onChange: this.onHeaderChange }), + React.createElement("hr", null), + React.createElement(ContentView, { flow: flow, message: flow.response }) ); }, - edit: function (k) { + edit: function edit(k) { switch (k) { case "c": - this.refs.responseLine.refs.code.focus(); + this.refs.responseLine.refs.status_code.focus(); break; case "m": this.refs.responseLine.refs.msg.focus(); @@ -2271,7 +2554,7 @@ var Response = React.createClass({displayName: "Response", throw "Unimplemented: " + k; } }, - onHeaderChange: function (nextHeaders) { + onHeaderChange: function onHeaderChange(nextHeaders) { actions.FlowActions.update(this.props.flow, { response: { headers: nextHeaders @@ -2280,15 +2563,25 @@ var Response = React.createClass({displayName: "Response", } }); -var Error = React.createClass({displayName: "Error", - render: function () { +var Error = React.createClass({ + displayName: "Error", + + render: function render() { var flow = this.props.flow; - return ( - React.createElement("section", null, - React.createElement("div", {className: "alert alert-warning"}, - flow.error.msg, - React.createElement("div", null, - React.createElement("small", null, utils.formatTimeStamp(flow.error.timestamp) ) + return React.createElement( + "section", + null, + React.createElement( + "div", + { className: "alert alert-warning" }, + flow.error.msg, + React.createElement( + "div", + null, + React.createElement( + "small", + null, + utils.formatTimeStamp(flow.error.timestamp) ) ) ) @@ -2301,92 +2594,122 @@ module.exports = { Response: Response, Error: Error }; +/*<ResponseLine flow={flow}/>*/ /*<RequestLine flow={flow}/>*/ + },{"../../actions.js":2,"../../flow/utils.js":23,"../../utils.js":26,"../common.js":4,"../editor.js":5,"./contentview.js":9,"lodash":"lodash","react":"react"}],13:[function(require,module,exports){ +"use strict"; + var React = require("react"); var actions = require("../../actions.js"); -var NavAction = React.createClass({displayName: "NavAction", - onClick: function (e) { +var NavAction = React.createClass({ + displayName: "NavAction", + + onClick: function onClick(e) { e.preventDefault(); this.props.onClick(); }, - render: function () { - return ( - React.createElement("a", {title: this.props.title, - href: "#", - className: "nav-action", - onClick: this.onClick}, - React.createElement("i", {className: "fa fa-fw " + this.props.icon}) - ) + render: function render() { + return React.createElement( + "a", + { title: this.props.title, + href: "#", + className: "nav-action", + onClick: this.onClick }, + React.createElement("i", { className: "fa fa-fw " + this.props.icon }) ); } }); -var Nav = React.createClass({displayName: "Nav", - render: function () { +var Nav = React.createClass({ + displayName: "Nav", + + render: function render() { var flow = this.props.flow; - var tabs = this.props.tabs.map(function (e) { + 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) { + var onClick = (function (event) { this.props.selectTab(e); event.preventDefault(); - }.bind(this); - return React.createElement("a", {key: e, - href: "#", - className: className, - onClick: onClick}, str); - }.bind(this)); + }).bind(this); + return React.createElement( + "a", + { key: e, + href: "#", + className: className, + onClick: onClick }, + str + ); + }).bind(this)); var acceptButton = null; - if(flow.intercepted){ - acceptButton = React.createElement(NavAction, {title: "[a]ccept intercepted flow", icon: "fa-play", onClick: actions.FlowActions.accept.bind(null, flow)}); + if (flow.intercepted) { + acceptButton = React.createElement(NavAction, { title: "[a]ccept intercepted flow", icon: "fa-play", onClick: actions.FlowActions.accept.bind(null, flow) }); } var revertButton = null; - if(flow.modified){ - revertButton = React.createElement(NavAction, {title: "revert changes to flow [V]", icon: "fa-history", onClick: actions.FlowActions.revert.bind(null, flow)}); - } - - return ( - React.createElement("nav", {ref: "head", className: "nav-tabs nav-tabs-sm"}, - tabs, - React.createElement(NavAction, {title: "[d]elete flow", icon: "fa-trash", onClick: actions.FlowActions.delete.bind(null, flow)}), - React.createElement(NavAction, {title: "[D]uplicate flow", icon: "fa-copy", onClick: actions.FlowActions.duplicate.bind(null, flow)}), - React.createElement(NavAction, {disabled: true, title: "[r]eplay flow", icon: "fa-repeat", onClick: actions.FlowActions.replay.bind(null, flow)}), - acceptButton, - revertButton - ) + if (flow.modified) { + revertButton = React.createElement(NavAction, { title: "revert changes to flow [V]", icon: "fa-history", onClick: actions.FlowActions.revert.bind(null, flow) }); + } + + return React.createElement( + "nav", + { ref: "head", className: "nav-tabs nav-tabs-sm" }, + tabs, + React.createElement(NavAction, { title: "[d]elete flow", icon: "fa-trash", onClick: actions.FlowActions["delete"].bind(null, flow) }), + React.createElement(NavAction, { title: "[D]uplicate flow", icon: "fa-copy", onClick: actions.FlowActions.duplicate.bind(null, flow) }), + React.createElement(NavAction, { disabled: true, title: "[r]eplay flow", icon: "fa-repeat", onClick: actions.FlowActions.replay.bind(null, flow) }), + acceptButton, + revertButton ); } }); module.exports = Nav; + },{"../../actions.js":2,"react":"react"}],14:[function(require,module,exports){ +"use strict"; + var React = require("react"); var common = require("./common.js"); -var Footer = React.createClass({displayName: "Footer", +var Footer = React.createClass({ + displayName: "Footer", + mixins: [common.SettingsState], - render: function () { + render: function render() { var mode = this.state.settings.mode; var intercept = this.state.settings.intercept; - return ( - React.createElement("footer", null, - mode && mode != "regular" ? React.createElement("span", {className: "label label-success"}, mode, " mode") : null, - "Â ", - intercept ? React.createElement("span", {className: "label label-success"}, "Intercept: ", intercept) : null - ) + return React.createElement( + "footer", + null, + mode && mode != "regular" ? React.createElement( + "span", + { className: "label label-success" }, + mode, + " mode" + ) : null, + "Â ", + intercept ? React.createElement( + "span", + { className: "label label-success" }, + "Intercept: ", + intercept + ) : null ); } }); module.exports = Footer; + },{"./common.js":4,"react":"react"}],15:[function(require,module,exports){ +"use strict"; + var React = require("react"); var $ = require("jquery"); @@ -2396,12 +2719,14 @@ var common = require("./common.js"); var actions = require("../actions.js"); var Query = require("../actions.js").Query; -var FilterDocs = React.createClass({displayName: "FilterDocs", +var FilterDocs = React.createClass({ + displayName: "FilterDocs", + statics: { xhr: false, doc: false }, - componentWillMount: function () { + componentWillMount: function componentWillMount() { if (!FilterDocs.doc) { FilterDocs.xhr = $.getJSON("/filter-help").done(function (doc) { FilterDocs.doc = doc; @@ -2409,38 +2734,63 @@ var FilterDocs = React.createClass({displayName: "FilterDocs", }); } if (FilterDocs.xhr) { - FilterDocs.xhr.done(function () { + FilterDocs.xhr.done((function () { this.forceUpdate(); - }.bind(this)); + }).bind(this)); } }, - render: function () { + render: function render() { if (!FilterDocs.doc) { - return React.createElement("i", {className: "fa fa-spinner fa-spin"}); + return React.createElement("i", { className: "fa fa-spinner fa-spin" }); } else { var commands = FilterDocs.doc.commands.map(function (c) { - return React.createElement("tr", {key: c[1]}, - React.createElement("td", null, c[0].replace(" ", '\u00a0')), - React.createElement("td", null, c[1]) + return React.createElement( + "tr", + { key: c[1] }, + React.createElement( + "td", + null, + c[0].replace(" ", "Â ") + ), + React.createElement( + "td", + null, + c[1] + ) ); }); - commands.push(React.createElement("tr", {key: "docs-link"}, - React.createElement("td", {colSpan: "2"}, - React.createElement("a", {href: "https://mitmproxy.org/doc/features/filters.html", - target: "_blank"}, - React.createElement("i", {className: "fa fa-external-link"}), - "Â mitmproxy docs") + commands.push(React.createElement( + "tr", + { key: "docs-link" }, + React.createElement( + "td", + { colSpan: "2" }, + React.createElement( + "a", + { href: "https://mitmproxy.org/doc/features/filters.html", + target: "_blank" }, + React.createElement("i", { className: "fa fa-external-link" }), + "Â mitmproxy docs" + ) ) )); - return React.createElement("table", {className: "table table-condensed"}, - React.createElement("tbody", null, commands) + return React.createElement( + "table", + { className: "table table-condensed" }, + React.createElement( + "tbody", + null, + commands + ) ); } } }); -var FilterInput = React.createClass({displayName: "FilterInput", +var FilterInput = React.createClass({ + displayName: "FilterInput", + mixins: [common.ChildFocus], - getInitialState: function () { + getInitialState: function getInitialState() { // 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. @@ -2450,10 +2800,10 @@ var FilterInput = React.createClass({displayName: "FilterInput", mousefocus: false }; }, - componentWillReceiveProps: function (nextProps) { - this.setState({value: nextProps.value}); + componentWillReceiveProps: function componentWillReceiveProps(nextProps) { + this.setState({ value: nextProps.value }); }, - onChange: function (e) { + onChange: function onChange(e) { var nextValue = e.target.value; this.setState({ value: nextValue @@ -2463,7 +2813,7 @@ var FilterInput = React.createClass({displayName: "FilterInput", this.props.onChange(nextValue); } }, - isValid: function (filt) { + isValid: function isValid(filt) { try { Filt.parse(filt || this.state.value); return true; @@ -2471,7 +2821,7 @@ var FilterInput = React.createClass({displayName: "FilterInput", return false; } }, - getDesc: function () { + getDesc: function getDesc() { var desc; try { desc = Filt.parse(this.state.value).desc; @@ -2481,136 +2831,143 @@ var FilterInput = React.createClass({displayName: "FilterInput", if (desc !== "true") { return desc; } else { - return ( - React.createElement(FilterDocs, null) - ); + return React.createElement(FilterDocs, null); } }, - onFocus: function () { - this.setState({focus: true}); + onFocus: function onFocus() { + this.setState({ focus: true }); }, - onBlur: function () { - this.setState({focus: false}); + onBlur: function onBlur() { + this.setState({ focus: false }); }, - onMouseEnter: function () { - this.setState({mousefocus: true}); + onMouseEnter: function onMouseEnter() { + this.setState({ mousefocus: true }); }, - onMouseLeave: function () { - this.setState({mousefocus: false}); + onMouseLeave: function onMouseLeave() { + this.setState({ mousefocus: false }); }, - onKeyDown: function (e) { + onKeyDown: 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}); + this.setState({ mousefocus: false }); } e.stopPropagation(); }, - blur: function () { + blur: function blur() { this.refs.input.getDOMNode().blur(); this.returnFocus(); }, - select: function () { + select: function select() { this.refs.input.getDOMNode().select(); }, - render: function () { + render: function render() { var isValid = this.isValid(); var icon = "fa fa-fw fa-" + this.props.type; var groupClassName = "filter-input input-group" + (isValid ? "" : " has-error"); var popover; if (this.state.focus || this.state.mousefocus) { - popover = ( - React.createElement("div", {className: "popover bottom", onMouseEnter: this.onMouseEnter, onMouseLeave: this.onMouseLeave}, - React.createElement("div", {className: "arrow"}), - React.createElement("div", {className: "popover-content"}, + popover = React.createElement( + "div", + { className: "popover bottom", onMouseEnter: this.onMouseEnter, onMouseLeave: this.onMouseLeave }, + React.createElement("div", { className: "arrow" }), + React.createElement( + "div", + { className: "popover-content" }, this.getDesc() - ) ) ); } - return ( - React.createElement("div", {className: groupClassName}, - React.createElement("span", {className: "input-group-addon"}, - React.createElement("i", {className: icon, style: {color: this.props.color}}) - ), - React.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}), - popover - ) + return React.createElement( + "div", + { className: groupClassName }, + React.createElement( + "span", + { className: "input-group-addon" }, + React.createElement("i", { className: icon, style: { color: this.props.color } }) + ), + React.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 }), + popover ); } }); -var MainMenu = React.createClass({displayName: "MainMenu", +var MainMenu = React.createClass({ + displayName: "MainMenu", + mixins: [common.Navigation, common.RouterState, common.SettingsState], statics: { title: "Start", route: "flows" }, - onSearchChange: function (val) { + onSearchChange: function onSearchChange(val) { var d = {}; d[Query.SEARCH] = val; this.setQuery(d); }, - onHighlightChange: function (val) { + onHighlightChange: function onHighlightChange(val) { var d = {}; d[Query.HIGHLIGHT] = val; this.setQuery(d); }, - onInterceptChange: function (val) { - actions.SettingsActions.update({intercept: val}); + onInterceptChange: function onInterceptChange(val) { + actions.SettingsActions.update({ intercept: val }); }, - render: function () { + render: function render() { var search = this.getQuery()[Query.SEARCH] || ""; var highlight = this.getQuery()[Query.HIGHLIGHT] || ""; var intercept = this.state.settings.intercept || ""; - return ( - React.createElement("div", null, - React.createElement("div", {className: "menu-row"}, - React.createElement(FilterInput, { - ref: "search", - placeholder: "Search", - type: "search", - color: "black", - value: search, - onChange: this.onSearchChange}), - React.createElement(FilterInput, { - ref: "highlight", - placeholder: "Highlight", - type: "tag", - color: "hsl(48, 100%, 50%)", - value: highlight, - onChange: this.onHighlightChange}), - React.createElement(FilterInput, { - ref: "intercept", - placeholder: "Intercept", - type: "pause", - color: "hsl(208, 56%, 53%)", - value: intercept, - onChange: this.onInterceptChange}) - ), - React.createElement("div", {className: "clearfix"}) - ) + return React.createElement( + "div", + null, + React.createElement( + "div", + { className: "menu-row" }, + React.createElement(FilterInput, { + ref: "search", + placeholder: "Search", + type: "search", + color: "black", + value: search, + onChange: this.onSearchChange }), + React.createElement(FilterInput, { + ref: "highlight", + placeholder: "Highlight", + type: "tag", + color: "hsl(48, 100%, 50%)", + value: highlight, + onChange: this.onHighlightChange }), + React.createElement(FilterInput, { + ref: "intercept", + placeholder: "Intercept", + type: "pause", + color: "hsl(208, 56%, 53%)", + value: intercept, + onChange: this.onInterceptChange }) + ), + React.createElement("div", { className: "clearfix" }) ); } }); +var ViewMenu = React.createClass({ + displayName: "ViewMenu", -var ViewMenu = React.createClass({displayName: "ViewMenu", statics: { title: "View", route: "flows" }, mixins: [common.Navigation, common.RouterState], - toggleEventLog: function () { + toggleEventLog: function toggleEventLog() { var d = {}; if (this.getQuery()[Query.SHOW_EVENTLOG]) { @@ -2621,46 +2978,59 @@ var ViewMenu = React.createClass({displayName: "ViewMenu", this.setQuery(d); }, - render: function () { + render: function render() { var showEventLog = this.getQuery()[Query.SHOW_EVENTLOG]; - return ( - React.createElement("div", null, - React.createElement("button", { - className: "btn " + (showEventLog ? "btn-primary" : "btn-default"), - onClick: this.toggleEventLog}, - React.createElement("i", {className: "fa fa-database"}), + return React.createElement( + "div", + null, + React.createElement( + "button", + { + className: "btn " + (showEventLog ? "btn-primary" : "btn-default"), + onClick: this.toggleEventLog }, + React.createElement("i", { className: "fa fa-database" }), "Â Show Eventlog" - ), - React.createElement("span", null, " ") + ), + React.createElement( + "span", + null, + " " ) ); } }); +var ReportsMenu = React.createClass({ + displayName: "ReportsMenu", -var ReportsMenu = React.createClass({displayName: "ReportsMenu", statics: { title: "Visualization", route: "reports" }, - render: function () { - return React.createElement("div", null, "Reports Menu"); + render: function render() { + return React.createElement( + "div", + null, + "Reports Menu" + ); } }); -var FileMenu = React.createClass({displayName: "FileMenu", - getInitialState: function () { +var FileMenu = React.createClass({ + displayName: "FileMenu", + + getInitialState: function getInitialState() { return { showFileMenu: false }; }, - handleFileClick: function (e) { + handleFileClick: function handleFileClick(e) { e.preventDefault(); if (!this.state.showFileMenu) { - var close = function () { - this.setState({showFileMenu: false}); + var close = (function () { + this.setState({ showFileMenu: false }); document.removeEventListener("click", close); - }.bind(this); + }).bind(this); document.addEventListener("click", close); this.setState({ @@ -2668,126 +3038,146 @@ var FileMenu = React.createClass({displayName: "FileMenu", }); } }, - handleNewClick: function (e) { + handleNewClick: function handleNewClick(e) { e.preventDefault(); if (confirm("Delete all flows?")) { actions.FlowActions.clear(); } }, - handleOpenClick: function (e) { + handleOpenClick: function handleOpenClick(e) { e.preventDefault(); console.error("unimplemented: handleOpenClick"); }, - handleSaveClick: function (e) { + handleSaveClick: function handleSaveClick(e) { e.preventDefault(); console.error("unimplemented: handleSaveClick"); }, - handleShutdownClick: function (e) { + handleShutdownClick: function handleShutdownClick(e) { e.preventDefault(); console.error("unimplemented: handleShutdownClick"); }, - render: function () { + render: function render() { var fileMenuClass = "dropdown pull-left" + (this.state.showFileMenu ? " open" : ""); - return ( - React.createElement("div", {className: fileMenuClass}, - React.createElement("a", {href: "#", className: "special", onClick: this.handleFileClick}, " mitmproxy "), - React.createElement("ul", {className: "dropdown-menu", role: "menu"}, - React.createElement("li", null, - React.createElement("a", {href: "#", onClick: this.handleNewClick}, - React.createElement("i", {className: "fa fa-fw fa-file"}), - "New" - ) - ), - React.createElement("li", {role: "presentation", className: "divider"}), - React.createElement("li", null, - React.createElement("a", {href: "http://mitm.it/", target: "_blank"}, - React.createElement("i", {className: "fa fa-fw fa-external-link"}), - "Install Certificates..." - ) + return React.createElement( + "div", + { className: fileMenuClass }, + React.createElement( + "a", + { href: "#", className: "special", onClick: this.handleFileClick }, + " mitmproxy " + ), + React.createElement( + "ul", + { className: "dropdown-menu", role: "menu" }, + React.createElement( + "li", + null, + React.createElement( + "a", + { href: "#", onClick: this.handleNewClick }, + React.createElement("i", { className: "fa fa-fw fa-file" }), + "New" + ) + ), + React.createElement("li", { role: "presentation", className: "divider" }), + React.createElement( + "li", + null, + React.createElement( + "a", + { href: "http://mitm.it/", target: "_blank" }, + React.createElement("i", { className: "fa fa-fw fa-external-link" }), + "Install Certificates..." ) - /* - <li> - <a href="#" onClick={this.handleOpenClick}> - <i className="fa fa-fw fa-folder-open"></i> - Open - </a> - </li> - <li> - <a href="#" onClick={this.handleSaveClick}> - <i className="fa fa-fw fa-save"></i> - Save - </a> - </li> - <li role="presentation" className="divider"></li> - <li> - <a href="#" onClick={this.handleShutdownClick}> - <i className="fa fa-fw fa-plug"></i> - Shutdown - </a> - </li> - */ ) ) ); } }); - var header_entries = [MainMenu, ViewMenu /*, ReportsMenu */]; +var Header = React.createClass({ + displayName: "Header", -var Header = React.createClass({displayName: "Header", mixins: [common.Navigation], - getInitialState: function () { + getInitialState: function getInitialState() { return { active: header_entries[0] }; }, - handleClick: function (active, e) { + handleClick: function handleClick(active, e) { e.preventDefault(); this.replaceWith(active.route); - this.setState({active: active}); + this.setState({ active: active }); }, - render: function () { - var header = header_entries.map(function (entry, i) { + render: function render() { + var header = header_entries.map((function (entry, i) { var className; if (entry === this.state.active) { className = "active"; } else { className = ""; } - return ( - React.createElement("a", {key: i, - href: "#", - className: className, - onClick: this.handleClick.bind(this, entry)}, - entry.title - ) + return React.createElement( + "a", + { key: i, + href: "#", + className: className, + onClick: this.handleClick.bind(this, entry) }, + entry.title ); - }.bind(this)); - - return ( - React.createElement("header", null, - React.createElement("nav", {className: "nav-tabs nav-tabs-lg"}, - React.createElement(FileMenu, null), - header - ), - React.createElement("div", {className: "menu"}, - React.createElement(this.state.active, {ref: "active"}) - ) + }).bind(this)); + + return React.createElement( + "header", + null, + React.createElement( + "nav", + { className: "nav-tabs nav-tabs-lg" }, + React.createElement(FileMenu, null), + header + ), + React.createElement( + "div", + { className: "menu" }, + React.createElement(this.state.active, { ref: "active" }) ) ); } }); - module.exports = { Header: Header, MainMenu: MainMenu }; +/* +<li> +<a href="#" onClick={this.handleOpenClick}> +<i className="fa fa-fw fa-folder-open"></i> +Open +</a> +</li> +<li> +<a href="#" onClick={this.handleSaveClick}> +<i className="fa fa-fw fa-save"></i> +Save +</a> +</li> +<li role="presentation" className="divider"></li> +<li> +<a href="#" onClick={this.handleShutdownClick}> +<i className="fa fa-fw fa-plug"></i> +Shutdown +</a> +</li> +*/ + },{"../actions.js":2,"../filt/filt.js":22,"../utils.js":26,"./common.js":4,"jquery":"jquery","react":"react"}],16:[function(require,module,exports){ +"use strict"; + var React = require("react"); var actions = require("../actions.js"); @@ -2800,20 +3190,22 @@ var common = require("./common.js"); var FlowTable = require("./flowtable.js"); var FlowView = require("./flowview/index.js"); -var MainView = React.createClass({displayName: "MainView", +var MainView = React.createClass({ + displayName: "MainView", + mixins: [common.Navigation, common.RouterState], contextTypes: { - flowStore: React.PropTypes.object.isRequired, + flowStore: React.PropTypes.object.isRequired }, childContextTypes: { - view: React.PropTypes.object.isRequired, + view: React.PropTypes.object.isRequired }, - getChildContext: function () { + getChildContext: function getChildContext() { return { view: this.state.view }; }, - getInitialState: function () { + getInitialState: function getInitialState() { var sortKeyFun = false; var view = new views.StoreView(this.context.flowStore, this.getViewFilt(), sortKeyFun); view.addListener("recalculate", this.onRecalculate); @@ -2827,10 +3219,10 @@ var MainView = React.createClass({displayName: "MainView", sortKeyFun: sortKeyFun }; }, - componentWillUnmount: function () { + componentWillUnmount: function componentWillUnmount() { this.state.view.close(); }, - getViewFilt: function () { + getViewFilt: function getViewFilt() { try { var filt = Filt.parse(this.getQuery()[Query.SEARCH] || ""); var highlightStr = this.getQuery()[Query.HIGHLIGHT]; @@ -2847,52 +3239,49 @@ var MainView = React.createClass({displayName: "MainView", return filt(flow); }; }, - componentWillReceiveProps: function (nextProps) { - var filterChanged = (this.props.query[Query.SEARCH] !== nextProps.query[Query.SEARCH]); - var highlightChanged = (this.props.query[Query.HIGHLIGHT] !== nextProps.query[Query.HIGHLIGHT]); + componentWillReceiveProps: function componentWillReceiveProps(nextProps) { + var filterChanged = this.props.query[Query.SEARCH] !== nextProps.query[Query.SEARCH]; + var highlightChanged = this.props.query[Query.HIGHLIGHT] !== nextProps.query[Query.HIGHLIGHT]; if (filterChanged || highlightChanged) { this.state.view.recalculate(this.getViewFilt(), this.state.sortKeyFun); } }, - onRecalculate: function () { + onRecalculate: function onRecalculate() { this.forceUpdate(); var selected = this.getSelected(); if (selected) { this.refs.flowTable.scrollIntoView(selected); } }, - onUpdate: function (flow) { + onUpdate: function onUpdate(flow) { if (flow.id === this.getParams().flowId) { this.forceUpdate(); } }, - onRemove: function (flow_id, index) { + onRemove: function onRemove(flow_id, index) { if (flow_id === this.getParams().flowId) { var flow_to_select = this.state.view.list[Math.min(index, this.state.view.list.length - 1)]; this.selectFlow(flow_to_select); } }, - setSortKeyFun: function (sortKeyFun) { + setSortKeyFun: function setSortKeyFun(sortKeyFun) { this.setState({ sortKeyFun: sortKeyFun }); this.state.view.recalculate(this.getViewFilt(), sortKeyFun); }, - selectFlow: function (flow) { + selectFlow: function selectFlow(flow) { if (flow) { - this.replaceWith( - "flow", - { - flowId: flow.id, - detailTab: this.getParams().detailTab || "request" - } - ); + this.replaceWith("flow", { + flowId: flow.id, + detailTab: this.getParams().detailTab || "request" + }); this.refs.flowTable.scrollIntoView(flow); } else { this.replaceWith("flows", {}); } }, - selectFlowRelative: function (shift) { + selectFlowRelative: function selectFlowRelative(shift) { var flows = this.state.view.list; var index; if (!this.getParams().flowId) { @@ -2910,13 +3299,11 @@ var MainView = React.createClass({displayName: "MainView", break; } } - index = Math.min( - Math.max(0, index + shift), - flows.length - 1); + index = Math.min(Math.max(0, index + shift), flows.length - 1); } this.selectFlow(flows[index]); }, - onMainKeyDown: function (e) { + onMainKeyDown: function onMainKeyDown(e) { var flow = this.getSelected(); if (e.ctrlKey) { return; @@ -2969,7 +3356,7 @@ var MainView = React.createClass({displayName: "MainView", if (e.shiftKey) { actions.FlowActions.duplicate(flow); } else { - actions.FlowActions.delete(flow); + actions.FlowActions["delete"](flow); } } break; @@ -3003,30 +3390,27 @@ var MainView = React.createClass({displayName: "MainView", } e.preventDefault(); }, - getSelected: function () { + getSelected: function getSelected() { return this.context.flowStore.get(this.getParams().flowId); }, - render: function () { + render: function render() { var selected = this.getSelected(); var details; if (selected) { - details = [ - React.createElement(common.Splitter, {key: "splitter"}), - React.createElement(FlowView, {key: "flowDetails", ref: "flowDetails", flow: selected}) - ]; + details = [React.createElement(common.Splitter, { key: "splitter" }), React.createElement(FlowView, { key: "flowDetails", ref: "flowDetails", flow: selected })]; } else { details = null; } - return ( - React.createElement("div", {className: "main-view"}, - React.createElement(FlowTable, {ref: "flowTable", - selectFlow: this.selectFlow, - setSortKeyFun: this.setSortKeyFun, - selected: selected}), - details - ) + return React.createElement( + "div", + { className: "main-view" }, + React.createElement(FlowTable, { ref: "flowTable", + selectFlow: this.selectFlow, + setSortKeyFun: this.setSortKeyFun, + selected: selected }), + details ); } }); @@ -3035,23 +3419,27 @@ module.exports = MainView; },{"../actions.js":2,"../filt/filt.js":22,"../store/view.js":25,"../utils.js":26,"./common.js":4,"./flowtable.js":8,"./flowview/index.js":11,"react":"react"}],17:[function(require,module,exports){ +"use strict"; + var React = require("react"); var _ = require("lodash"); var utils = require("../utils.js"); var common = require("./common.js"); -var Prompt = React.createClass({displayName: "Prompt", +var Prompt = React.createClass({ + displayName: "Prompt", + mixins: [common.ChildFocus], propTypes: { options: React.PropTypes.array.isRequired, done: React.PropTypes.func.isRequired, prompt: React.PropTypes.string }, - componentDidMount: function () { + componentDidMount: function componentDidMount() { React.findDOMNode(this).focus(); }, - onKeyDown: function (e) { + onKeyDown: function onKeyDown(e) { e.stopPropagation(); e.preventDefault(); var opts = this.getOptions(); @@ -3066,17 +3454,17 @@ var Prompt = React.createClass({displayName: "Prompt", this.done(false); } }, - onClick: function (e) { + onClick: function onClick(e) { this.done(false); }, - done: function (ret) { + done: function done(ret) { this.props.done(ret); this.returnFocus(); }, - getOptions: function () { + getOptions: function getOptions() { var opts = []; - var keyTaken = function (k) { + var keyTaken = function keyTaken(k) { return _.includes(_.pluck(opts, "key"), k); }; @@ -3100,35 +3488,49 @@ var Prompt = React.createClass({displayName: "Prompt", } return opts; }, - render: function () { + render: function render() { var opts = this.getOptions(); - opts = _.map(opts, function (o) { + opts = _.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) { + var onClick = (function (e) { this.done(o.key); e.stopPropagation(); - }.bind(this); - return React.createElement("span", { - key: o.key, - className: "option", - onClick: onClick}, - prefix, - React.createElement("strong", {className: "text-primary"}, o.key), suffix + }).bind(this); + return React.createElement( + "span", + { + key: o.key, + className: "option", + onClick: onClick }, + prefix, + React.createElement( + "strong", + { className: "text-primary" }, + o.key + ), + suffix ); - }.bind(this)); - return React.createElement("div", {tabIndex: "0", onKeyDown: this.onKeyDown, onClick: this.onClick, className: "prompt-dialog"}, - React.createElement("div", {className: "prompt-content"}, - this.props.prompt || React.createElement("strong", null, "Select: "), - opts + }).bind(this)); + return React.createElement( + "div", + { tabIndex: "0", onKeyDown: this.onKeyDown, onClick: this.onClick, className: "prompt-dialog" }, + React.createElement( + "div", + { className: "prompt-content" }, + this.props.prompt || React.createElement( + "strong", + null, + "Select: " + ), + opts ) ); } @@ -3136,7 +3538,10 @@ var Prompt = React.createClass({displayName: "Prompt", module.exports = Prompt; + },{"../utils.js":26,"./common.js":4,"lodash":"lodash","react":"react"}],18:[function(require,module,exports){ +"use strict"; + var React = require("react"); var ReactRouter = require("react-router"); var _ = require("lodash"); @@ -3150,35 +3555,41 @@ var store = require("../store/store.js"); var Query = require("../actions.js").Query; var Key = require("../utils.js").Key; - //TODO: Move out of here, just a stub. -var Reports = React.createClass({displayName: "Reports", - render: function () { - return React.createElement("div", null, "ReportEditor"); +var Reports = React.createClass({ + displayName: "Reports", + + render: function render() { + return React.createElement( + "div", + null, + "ReportEditor" + ); } }); +var ProxyAppMain = React.createClass({ + displayName: "ProxyAppMain", -var ProxyAppMain = React.createClass({displayName: "ProxyAppMain", mixins: [common.RouterState], childContextTypes: { settingsStore: React.PropTypes.object.isRequired, flowStore: React.PropTypes.object.isRequired, eventStore: React.PropTypes.object.isRequired, - returnFocus: React.PropTypes.func.isRequired, + returnFocus: React.PropTypes.func.isRequired }, - componentDidMount: function () { + componentDidMount: function componentDidMount() { this.focus(); }, - getChildContext: function () { + getChildContext: function getChildContext() { return { settingsStore: this.state.settingsStore, flowStore: this.state.flowStore, eventStore: this.state.eventStore, - returnFocus: this.focus, + returnFocus: this.focus }; }, - getInitialState: function () { + getInitialState: function getInitialState() { var eventStore = new store.EventLogStore(); var flowStore = new store.FlowStore(); var settingsStore = new store.SettingsStore(); @@ -3191,20 +3602,20 @@ var ProxyAppMain = React.createClass({displayName: "ProxyAppMain", eventStore: eventStore }; }, - focus: function () { + focus: function focus() { React.findDOMNode(this).focus(); }, - getMainComponent: function () { + getMainComponent: function getMainComponent() { return this.refs.view.refs.__routeHandler__; }, - onKeydown: function (e) { + onKeydown: function onKeydown(e) { - var selectFilterInput = function (name) { + var selectFilterInput = (function (name) { var headerComponent = this.refs.header; - headerComponent.setState({active: header.MainMenu}, function () { + headerComponent.setState({ active: header.MainMenu }, function () { headerComponent.refs.active.refs[name].select(); }); - }.bind(this); + }).bind(this); switch (e.keyCode) { case Key.I: @@ -3225,94 +3636,92 @@ var ProxyAppMain = React.createClass({displayName: "ProxyAppMain", } e.preventDefault(); }, - render: function () { + render: function render() { var eventlog; if (this.getQuery()[Query.SHOW_EVENTLOG]) { - eventlog = [ - React.createElement(common.Splitter, {key: "splitter", axis: "y"}), - React.createElement(EventLog, {key: "eventlog"}) - ]; + eventlog = [React.createElement(common.Splitter, { key: "splitter", axis: "y" }), React.createElement(EventLog, { key: "eventlog" })]; } else { eventlog = null; } - return ( - React.createElement("div", {id: "container", tabIndex: "0", onKeyDown: this.onKeydown}, - React.createElement(header.Header, {ref: "header"}), - React.createElement(RouteHandler, {ref: "view", query: this.getQuery()}), - eventlog, - React.createElement(Footer, null) - ) + return React.createElement( + "div", + { id: "container", tabIndex: "0", onKeyDown: this.onKeydown }, + React.createElement(header.Header, { ref: "header" }), + React.createElement(RouteHandler, { ref: "view", query: this.getQuery() }), + eventlog, + React.createElement(Footer, null) ); } }); - var Route = ReactRouter.Route; var RouteHandler = ReactRouter.RouteHandler; var Redirect = ReactRouter.Redirect; var DefaultRoute = ReactRouter.DefaultRoute; var NotFoundRoute = ReactRouter.NotFoundRoute; - -var routes = ( - React.createElement(Route, {path: "/", handler: ProxyAppMain}, - React.createElement(Route, {name: "flows", path: "flows", handler: MainView}), - React.createElement(Route, {name: "flow", path: "flows/:flowId/:detailTab", handler: MainView}), - React.createElement(Route, {name: "reports", handler: Reports}), - React.createElement(Redirect, {path: "/", to: "flows"}) - ) +var routes = React.createElement( + Route, + { path: "/", handler: ProxyAppMain }, + React.createElement(Route, { name: "flows", path: "flows", handler: MainView }), + React.createElement(Route, { name: "flow", path: "flows/:flowId/:detailTab", handler: MainView }), + React.createElement(Route, { name: "reports", handler: Reports }), + React.createElement(Redirect, { path: "/", to: "flows" }) ); module.exports = { routes: routes }; + },{"../actions.js":2,"../store/store.js":24,"../utils.js":26,"./common.js":4,"./eventlog.js":6,"./footer.js":14,"./header.js":15,"./mainview.js":16,"lodash":"lodash","react":"react","react-router":"react-router"}],19:[function(require,module,exports){ +"use strict"; + var React = require("react"); var VirtualScrollMixin = { - getInitialState: function () { + getInitialState: function getInitialState() { return { start: 0, stop: 0 }; }, - componentWillMount: function () { + componentWillMount: function componentWillMount() { if (!this.props.rowHeight) { console.warn("VirtualScrollMixin: No rowHeight specified", this); } }, - getPlaceholderTop: function (total) { + getPlaceholderTop: function getPlaceholderTop(total) { var Tag = this.props.placeholderTagName || "tr"; // 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. var style = { height: Math.min(this.state.start, total) * this.props.rowHeight }; - var spacer = React.createElement(Tag, {key: "placeholder-top", style: style}); + var spacer = React.createElement(Tag, { key: "placeholder-top", style: style }); if (this.state.start % 2 === 1) { // fix even/odd rows - return [spacer, React.createElement(Tag, {key: "placeholder-top-2"})]; + return [spacer, React.createElement(Tag, { key: "placeholder-top-2" })]; } else { return spacer; } }, - getPlaceholderBottom: function (total) { + getPlaceholderBottom: function getPlaceholderBottom(total) { var Tag = this.props.placeholderTagName || "tr"; var style = { height: Math.max(0, total - this.state.stop) * this.props.rowHeight }; - return React.createElement(Tag, {key: "placeholder-bottom", style: style}); + return React.createElement(Tag, { key: "placeholder-bottom", style: style }); }, - componentDidMount: function () { + componentDidMount: function componentDidMount() { this.onScroll(); window.addEventListener('resize', this.onScroll); }, - componentWillUnmount: function(){ + componentWillUnmount: function componentWillUnmount() { window.removeEventListener('resize', this.onScroll); }, - onScroll: function () { + onScroll: function onScroll() { var viewport = this.getDOMNode(); var top = viewport.scrollTop; var height = viewport.offsetHeight; @@ -3324,7 +3733,7 @@ var VirtualScrollMixin = { stop: stop }); }, - renderRows: function (elems) { + renderRows: function renderRows(elems) { var rows = []; var max = Math.min(elems.length, this.state.stop); @@ -3334,9 +3743,9 @@ var VirtualScrollMixin = { } return rows; }, - scrollRowIntoView: function (index, head_height) { + scrollRowIntoView: function scrollRowIntoView(index, head_height) { - var row_top = (index * this.props.rowHeight) + head_height; + var row_top = index * this.props.rowHeight + head_height; var row_bottom = row_top + this.props.rowHeight; var viewport = this.getDOMNode(); @@ -3349,12 +3758,14 @@ var VirtualScrollMixin = { } else if (row_bottom > viewport_bottom) { viewport.scrollTop = row_bottom - viewport.offsetHeight; } - }, + } }; -module.exports = VirtualScrollMixin; +module.exports = VirtualScrollMixin; + },{"react":"react"}],20:[function(require,module,exports){ +"use strict"; var actions = require("./actions.js"); var AppDispatcher = require("./dispatcher.js").AppDispatcher; @@ -3385,16 +3796,17 @@ function Connection(url) { module.exports = Connection; + },{"./actions.js":2,"./dispatcher.js":21}],21:[function(require,module,exports){ +"use strict"; var flux = require("flux"); -const PayloadSources = { +var PayloadSources = { VIEW: "view", SERVER: "server" }; - var AppDispatcher = new flux.Dispatcher(); AppDispatcher.dispatchViewAction = function (action) { action.source = PayloadSources.VIEW; @@ -3409,8 +3821,11 @@ module.exports = { AppDispatcher: AppDispatcher }; + },{"flux":"flux"}],22:[function(require,module,exports){ -module.exports = (function() { +"use strict"; + +module.exports = (function () { /* * Generated by PEG.js 0.8.0. * @@ -3418,37 +3833,40 @@ module.exports = (function() { */ function peg$subclass(child, parent) { - function ctor() { this.constructor = child; } + function ctor() { + this.constructor = child; + } ctor.prototype = parent.prototype; child.prototype = new ctor(); } function SyntaxError(message, expected, found, offset, line, column) { - this.message = message; + this.message = message; this.expected = expected; - this.found = found; - this.offset = offset; - this.line = line; - this.column = column; + this.found = found; + this.offset = offset; + this.line = line; + this.column = column; - this.name = "SyntaxError"; + this.name = "SyntaxError"; } peg$subclass(SyntaxError, Error); function parse(input) { var options = arguments.length > 1 ? arguments[1] : {}, - peg$FAILED = {}, - peg$startRuleFunctions = { start: peg$parsestart }, - peg$startRuleFunction = peg$parsestart, - + peg$startRuleFunction = peg$parsestart, peg$c0 = { type: "other", description: "filter expression" }, peg$c1 = peg$FAILED, - peg$c2 = function(orExpr) { return orExpr; }, + peg$c2 = function peg$c2(orExpr) { + return orExpr; + }, peg$c3 = [], - peg$c4 = function() {return trueFilter; }, + peg$c4 = function peg$c4() { + return trueFilter; + }, peg$c5 = { type: "other", description: "whitespace" }, peg$c6 = /^[ \t\n\r]/, peg$c7 = { type: "class", value: "[ \\t\\n\\r]", description: "[ \\t\\n\\r]" }, @@ -3458,84 +3876,130 @@ module.exports = (function() { peg$c11 = { type: "other", description: "optional whitespace" }, peg$c12 = "|", peg$c13 = { type: "literal", value: "|", description: "\"|\"" }, - peg$c14 = function(first, second) { return or(first, second); }, + peg$c14 = function peg$c14(first, second) { + return or(first, second); + }, peg$c15 = "&", peg$c16 = { type: "literal", value: "&", description: "\"&\"" }, - peg$c17 = function(first, second) { return and(first, second); }, + peg$c17 = function peg$c17(first, second) { + return and(first, second); + }, peg$c18 = "!", peg$c19 = { type: "literal", value: "!", description: "\"!\"" }, - peg$c20 = function(expr) { return not(expr); }, + peg$c20 = function peg$c20(expr) { + return not(expr); + }, peg$c21 = "(", peg$c22 = { type: "literal", value: "(", description: "\"(\"" }, peg$c23 = ")", peg$c24 = { type: "literal", value: ")", description: "\")\"" }, - peg$c25 = function(expr) { return binding(expr); }, + peg$c25 = function peg$c25(expr) { + return binding(expr); + }, peg$c26 = "~a", peg$c27 = { type: "literal", value: "~a", description: "\"~a\"" }, - peg$c28 = function() { return assetFilter; }, + peg$c28 = function peg$c28() { + return assetFilter; + }, peg$c29 = "~e", peg$c30 = { type: "literal", value: "~e", description: "\"~e\"" }, - peg$c31 = function() { return errorFilter; }, + peg$c31 = function peg$c31() { + return errorFilter; + }, peg$c32 = "~q", peg$c33 = { type: "literal", value: "~q", description: "\"~q\"" }, - peg$c34 = function() { return noResponseFilter; }, + peg$c34 = function peg$c34() { + return noResponseFilter; + }, peg$c35 = "~s", peg$c36 = { type: "literal", value: "~s", description: "\"~s\"" }, - peg$c37 = function() { return responseFilter; }, + peg$c37 = function peg$c37() { + return responseFilter; + }, peg$c38 = "true", peg$c39 = { type: "literal", value: "true", description: "\"true\"" }, - peg$c40 = function() { return trueFilter; }, + peg$c40 = function peg$c40() { + return trueFilter; + }, peg$c41 = "false", peg$c42 = { type: "literal", value: "false", description: "\"false\"" }, - peg$c43 = function() { return falseFilter; }, + peg$c43 = function peg$c43() { + return falseFilter; + }, peg$c44 = "~c", peg$c45 = { type: "literal", value: "~c", description: "\"~c\"" }, - peg$c46 = function(s) { return responseCode(s); }, + peg$c46 = function peg$c46(s) { + return responseCode(s); + }, peg$c47 = "~d", peg$c48 = { type: "literal", value: "~d", description: "\"~d\"" }, - peg$c49 = function(s) { return domain(s); }, + peg$c49 = function peg$c49(s) { + return domain(s); + }, peg$c50 = "~h", peg$c51 = { type: "literal", value: "~h", description: "\"~h\"" }, - peg$c52 = function(s) { return header(s); }, + peg$c52 = function peg$c52(s) { + return header(s); + }, peg$c53 = "~hq", peg$c54 = { type: "literal", value: "~hq", description: "\"~hq\"" }, - peg$c55 = function(s) { return requestHeader(s); }, + peg$c55 = function peg$c55(s) { + return requestHeader(s); + }, peg$c56 = "~hs", peg$c57 = { type: "literal", value: "~hs", description: "\"~hs\"" }, - peg$c58 = function(s) { return responseHeader(s); }, + peg$c58 = function peg$c58(s) { + return responseHeader(s); + }, peg$c59 = "~m", peg$c60 = { type: "literal", value: "~m", description: "\"~m\"" }, - peg$c61 = function(s) { return method(s); }, + peg$c61 = function peg$c61(s) { + return method(s); + }, peg$c62 = "~t", peg$c63 = { type: "literal", value: "~t", description: "\"~t\"" }, - peg$c64 = function(s) { return contentType(s); }, + peg$c64 = function peg$c64(s) { + return contentType(s); + }, peg$c65 = "~tq", peg$c66 = { type: "literal", value: "~tq", description: "\"~tq\"" }, - peg$c67 = function(s) { return requestContentType(s); }, + peg$c67 = function peg$c67(s) { + return requestContentType(s); + }, peg$c68 = "~ts", peg$c69 = { type: "literal", value: "~ts", description: "\"~ts\"" }, - peg$c70 = function(s) { return responseContentType(s); }, + peg$c70 = function peg$c70(s) { + return responseContentType(s); + }, peg$c71 = "~u", peg$c72 = { type: "literal", value: "~u", description: "\"~u\"" }, - peg$c73 = function(s) { return url(s); }, + peg$c73 = function peg$c73(s) { + return url(s); + }, peg$c74 = { type: "other", description: "integer" }, peg$c75 = null, peg$c76 = /^['"]/, peg$c77 = { type: "class", value: "['\"]", description: "['\"]" }, peg$c78 = /^[0-9]/, peg$c79 = { type: "class", value: "[0-9]", description: "[0-9]" }, - peg$c80 = function(digits) { return parseInt(digits.join(""), 10); }, + peg$c80 = function peg$c80(digits) { + return parseInt(digits.join(""), 10); + }, peg$c81 = { type: "other", description: "string" }, peg$c82 = "\"", peg$c83 = { type: "literal", value: "\"", description: "\"\\\"\"" }, - peg$c84 = function(chars) { return chars.join(""); }, + peg$c84 = function peg$c84(chars) { + return chars.join(""); + }, peg$c85 = "'", peg$c86 = { type: "literal", value: "'", description: "\"'\"" }, peg$c87 = void 0, peg$c88 = /^["\\]/, peg$c89 = { type: "class", value: "[\"\\\\]", description: "[\"\\\\]" }, peg$c90 = { type: "any", description: "any character" }, - peg$c91 = function(char) { return char; }, + peg$c91 = function peg$c91(char) { + return char; + }, peg$c92 = "\\", peg$c93 = { type: "literal", value: "\\", description: "\"\\\\\"" }, peg$c94 = /^['\\]/, @@ -3544,22 +4008,26 @@ module.exports = (function() { peg$c97 = { type: "class", value: "['\"\\\\]", description: "['\"\\\\]" }, peg$c98 = "n", peg$c99 = { type: "literal", value: "n", description: "\"n\"" }, - peg$c100 = function() { return "\n"; }, + peg$c100 = function peg$c100() { + return "\n"; + }, peg$c101 = "r", peg$c102 = { type: "literal", value: "r", description: "\"r\"" }, - peg$c103 = function() { return "\r"; }, + peg$c103 = function peg$c103() { + return "\r"; + }, peg$c104 = "t", peg$c105 = { type: "literal", value: "t", description: "\"t\"" }, - peg$c106 = function() { return "\t"; }, - - peg$currPos = 0, - peg$reportedPos = 0, - peg$cachedPos = 0, + peg$c106 = function peg$c106() { + return "\t"; + }, + peg$currPos = 0, + peg$reportedPos = 0, + peg$cachedPos = 0, peg$cachedPosDetails = { line: 1, column: 1, seenCR: false }, - peg$maxFailPos = 0, - peg$maxFailExpected = [], - peg$silentFails = 0, - + peg$maxFailPos = 0, + peg$maxFailExpected = [], + peg$silentFails = 0, peg$result; if ("startRule" in options) { @@ -3587,11 +4055,7 @@ module.exports = (function() { } function expected(description) { - throw peg$buildException( - null, - [{ type: "other", description: description }], - peg$reportedPos - ); + throw peg$buildException(null, [{ type: "other", description: description }], peg$reportedPos); } function error(message) { @@ -3605,7 +4069,9 @@ module.exports = (function() { for (p = startPos; p < endPos; p++) { ch = input.charAt(p); if (ch === "\n") { - if (!details.seenCR) { details.line++; } + if (!details.seenCR) { + details.line++; + } details.column = 1; details.seenCR = false; } else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") { @@ -3632,7 +4098,9 @@ module.exports = (function() { } function peg$fail(expected) { - if (peg$currPos < peg$maxFailPos) { return; } + if (peg$currPos < peg$maxFailPos) { + return; + } if (peg$currPos > peg$maxFailPos) { peg$maxFailPos = peg$currPos; @@ -3646,7 +4114,7 @@ module.exports = (function() { function cleanupExpected(expected) { var i = 1; - expected.sort(function(a, b) { + expected.sort(function (a, b) { if (a.description < b.description) { return -1; } else if (a.description > b.description) { @@ -3667,34 +4135,31 @@ module.exports = (function() { 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(/[\u0180-\u0FFF]/g, function(ch) { return '\\u0' + hex(ch); }) - .replace(/[\u1080-\uFFFF]/g, function(ch) { return '\\u' + hex(ch); }); + 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(/[\u0180-\u0FFF]/g, function (ch) { + return "\\u0" + hex(ch); + }).replace(/[\u1080-\uFFFF]/g, function (ch) { + return "\\u" + hex(ch); + }); } var expectedDescs = new Array(expected.length), - expectedDesc, foundDesc, i; + 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]; + expectedDesc = expected.length > 1 ? expectedDescs.slice(0, -1).join(", ") + " or " + expectedDescs[expected.length - 1] : expectedDescs[0]; foundDesc = found ? "\"" + stringEscape(found) + "\"" : "end of input"; @@ -3702,20 +4167,13 @@ module.exports = (function() { } var posDetails = peg$computePosDetails(pos), - found = pos < input.length ? input.charAt(pos) : null; + found = pos < input.length ? input.charAt(pos) : null; if (expected !== null) { cleanupExpected(expected); } - return new SyntaxError( - message !== null ? message : buildMessage(expected, found), - expected, - found, - pos, - posDetails.line, - posDetails.column - ); + return new SyntaxError(message !== null ? message : buildMessage(expected, found), expected, found, pos, posDetails.line, posDetails.column); } function peg$parsestart() { @@ -3756,7 +4214,9 @@ module.exports = (function() { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c0); } + if (peg$silentFails === 0) { + peg$fail(peg$c0); + } } return s0; @@ -3771,12 +4231,16 @@ module.exports = (function() { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c7); } + 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); } + if (peg$silentFails === 0) { + peg$fail(peg$c5); + } } return s0; @@ -3791,12 +4255,16 @@ module.exports = (function() { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c10); } + if (peg$silentFails === 0) { + peg$fail(peg$c10); + } } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c8); } + if (peg$silentFails === 0) { + peg$fail(peg$c8); + } } return s0; @@ -3815,7 +4283,9 @@ module.exports = (function() { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c11); } + if (peg$silentFails === 0) { + peg$fail(peg$c11); + } } return s0; @@ -3834,7 +4304,9 @@ module.exports = (function() { peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c13); } + if (peg$silentFails === 0) { + peg$fail(peg$c13); + } } if (s3 !== peg$FAILED) { s4 = peg$parse__(); @@ -3884,7 +4356,9 @@ module.exports = (function() { peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c16); } + if (peg$silentFails === 0) { + peg$fail(peg$c16); + } } if (s3 !== peg$FAILED) { s4 = peg$parse__(); @@ -3963,7 +4437,9 @@ module.exports = (function() { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c19); } + if (peg$silentFails === 0) { + peg$fail(peg$c19); + } } if (s1 !== peg$FAILED) { s2 = peg$parse__(); @@ -4001,7 +4477,9 @@ module.exports = (function() { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c22); } + if (peg$silentFails === 0) { + peg$fail(peg$c22); + } } if (s1 !== peg$FAILED) { s2 = peg$parse__(); @@ -4015,7 +4493,9 @@ module.exports = (function() { peg$currPos++; } else { s5 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c24); } + if (peg$silentFails === 0) { + peg$fail(peg$c24); + } } if (s5 !== peg$FAILED) { peg$reportedPos = s0; @@ -4070,7 +4550,9 @@ module.exports = (function() { peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c27); } + if (peg$silentFails === 0) { + peg$fail(peg$c27); + } } if (s1 !== peg$FAILED) { peg$reportedPos = s0; @@ -4084,7 +4566,9 @@ module.exports = (function() { peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c30); } + if (peg$silentFails === 0) { + peg$fail(peg$c30); + } } if (s1 !== peg$FAILED) { peg$reportedPos = s0; @@ -4098,7 +4582,9 @@ module.exports = (function() { peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c33); } + if (peg$silentFails === 0) { + peg$fail(peg$c33); + } } if (s1 !== peg$FAILED) { peg$reportedPos = s0; @@ -4112,7 +4598,9 @@ module.exports = (function() { peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c36); } + if (peg$silentFails === 0) { + peg$fail(peg$c36); + } } if (s1 !== peg$FAILED) { peg$reportedPos = s0; @@ -4136,7 +4624,9 @@ module.exports = (function() { peg$currPos += 4; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c39); } + if (peg$silentFails === 0) { + peg$fail(peg$c39); + } } if (s1 !== peg$FAILED) { peg$reportedPos = s0; @@ -4150,7 +4640,9 @@ module.exports = (function() { peg$currPos += 5; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c42); } + if (peg$silentFails === 0) { + peg$fail(peg$c42); + } } if (s1 !== peg$FAILED) { peg$reportedPos = s0; @@ -4171,7 +4663,9 @@ module.exports = (function() { peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c45); } + if (peg$silentFails === 0) { + peg$fail(peg$c45); + } } if (s1 !== peg$FAILED) { s2 = []; @@ -4209,7 +4703,9 @@ module.exports = (function() { peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c48); } + if (peg$silentFails === 0) { + peg$fail(peg$c48); + } } if (s1 !== peg$FAILED) { s2 = []; @@ -4247,7 +4743,9 @@ module.exports = (function() { peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c51); } + if (peg$silentFails === 0) { + peg$fail(peg$c51); + } } if (s1 !== peg$FAILED) { s2 = []; @@ -4285,7 +4783,9 @@ module.exports = (function() { peg$currPos += 3; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c54); } + if (peg$silentFails === 0) { + peg$fail(peg$c54); + } } if (s1 !== peg$FAILED) { s2 = []; @@ -4323,7 +4823,9 @@ module.exports = (function() { peg$currPos += 3; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c57); } + if (peg$silentFails === 0) { + peg$fail(peg$c57); + } } if (s1 !== peg$FAILED) { s2 = []; @@ -4361,7 +4863,9 @@ module.exports = (function() { peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c60); } + if (peg$silentFails === 0) { + peg$fail(peg$c60); + } } if (s1 !== peg$FAILED) { s2 = []; @@ -4399,7 +4903,9 @@ module.exports = (function() { peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c63); } + if (peg$silentFails === 0) { + peg$fail(peg$c63); + } } if (s1 !== peg$FAILED) { s2 = []; @@ -4437,7 +4943,9 @@ module.exports = (function() { peg$currPos += 3; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c66); } + if (peg$silentFails === 0) { + peg$fail(peg$c66); + } } if (s1 !== peg$FAILED) { s2 = []; @@ -4475,7 +4983,9 @@ module.exports = (function() { peg$currPos += 3; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c69); } + if (peg$silentFails === 0) { + peg$fail(peg$c69); + } } if (s1 !== peg$FAILED) { s2 = []; @@ -4513,7 +5023,9 @@ module.exports = (function() { peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c72); } + if (peg$silentFails === 0) { + peg$fail(peg$c72); + } } if (s1 !== peg$FAILED) { s2 = []; @@ -4576,7 +5088,9 @@ module.exports = (function() { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c77); } + if (peg$silentFails === 0) { + peg$fail(peg$c77); + } } if (s1 === peg$FAILED) { s1 = peg$c75; @@ -4588,7 +5102,9 @@ module.exports = (function() { peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c79); } + if (peg$silentFails === 0) { + peg$fail(peg$c79); + } } if (s3 !== peg$FAILED) { while (s3 !== peg$FAILED) { @@ -4598,7 +5114,9 @@ module.exports = (function() { peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c79); } + if (peg$silentFails === 0) { + peg$fail(peg$c79); + } } } } else { @@ -4610,7 +5128,9 @@ module.exports = (function() { peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c77); } + if (peg$silentFails === 0) { + peg$fail(peg$c77); + } } if (s3 === peg$FAILED) { s3 = peg$c75; @@ -4634,7 +5154,9 @@ module.exports = (function() { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c74); } + if (peg$silentFails === 0) { + peg$fail(peg$c74); + } } return s0; @@ -4650,7 +5172,9 @@ module.exports = (function() { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c83); } + if (peg$silentFails === 0) { + peg$fail(peg$c83); + } } if (s1 !== peg$FAILED) { s2 = []; @@ -4665,7 +5189,9 @@ module.exports = (function() { peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c83); } + if (peg$silentFails === 0) { + peg$fail(peg$c83); + } } if (s3 !== peg$FAILED) { peg$reportedPos = s0; @@ -4690,7 +5216,9 @@ module.exports = (function() { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c86); } + if (peg$silentFails === 0) { + peg$fail(peg$c86); + } } if (s1 !== peg$FAILED) { s2 = []; @@ -4705,7 +5233,9 @@ module.exports = (function() { peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c86); } + if (peg$silentFails === 0) { + peg$fail(peg$c86); + } } if (s3 !== peg$FAILED) { peg$reportedPos = s0; @@ -4763,7 +5293,9 @@ module.exports = (function() { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c81); } + if (peg$silentFails === 0) { + peg$fail(peg$c81); + } } return s0; @@ -4780,7 +5312,9 @@ module.exports = (function() { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c89); } + if (peg$silentFails === 0) { + peg$fail(peg$c89); + } } peg$silentFails--; if (s2 === peg$FAILED) { @@ -4795,7 +5329,9 @@ module.exports = (function() { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c90); } + if (peg$silentFails === 0) { + peg$fail(peg$c90); + } } if (s2 !== peg$FAILED) { peg$reportedPos = s0; @@ -4816,7 +5352,9 @@ module.exports = (function() { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c93); } + if (peg$silentFails === 0) { + peg$fail(peg$c93); + } } if (s1 !== peg$FAILED) { s2 = peg$parseEscapeSequence(); @@ -4848,7 +5386,9 @@ module.exports = (function() { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c95); } + if (peg$silentFails === 0) { + peg$fail(peg$c95); + } } peg$silentFails--; if (s2 === peg$FAILED) { @@ -4863,7 +5403,9 @@ module.exports = (function() { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c90); } + if (peg$silentFails === 0) { + peg$fail(peg$c90); + } } if (s2 !== peg$FAILED) { peg$reportedPos = s0; @@ -4884,7 +5426,9 @@ module.exports = (function() { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c93); } + if (peg$silentFails === 0) { + peg$fail(peg$c93); + } } if (s1 !== peg$FAILED) { s2 = peg$parseEscapeSequence(); @@ -4925,7 +5469,9 @@ module.exports = (function() { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c90); } + if (peg$silentFails === 0) { + peg$fail(peg$c90); + } } if (s2 !== peg$FAILED) { peg$reportedPos = s0; @@ -4951,7 +5497,9 @@ module.exports = (function() { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c97); } + if (peg$silentFails === 0) { + peg$fail(peg$c97); + } } if (s0 === peg$FAILED) { s0 = peg$currPos; @@ -4960,7 +5508,9 @@ module.exports = (function() { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c99); } + if (peg$silentFails === 0) { + peg$fail(peg$c99); + } } if (s1 !== peg$FAILED) { peg$reportedPos = s0; @@ -4974,7 +5524,9 @@ module.exports = (function() { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c102); } + if (peg$silentFails === 0) { + peg$fail(peg$c102); + } } if (s1 !== peg$FAILED) { peg$reportedPos = s0; @@ -4988,7 +5540,9 @@ module.exports = (function() { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c105); } + if (peg$silentFails === 0) { + peg$fail(peg$c105); + } } if (s1 !== peg$FAILED) { peg$reportedPos = s0; @@ -5002,170 +5556,153 @@ module.exports = (function() { 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; + // 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 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 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 bindingFilter() { + return expr.apply(this, arguments); + } + bindingFilter.desc = "(" + expr.desc + ")"; + return bindingFilter; } function trueFilter(flow) { - return true; + return true; } trueFilter.desc = "true"; function falseFilter(flow) { - return false; + 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") - ]; + 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; - } - } + 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; + } + return false; } assetFilter.desc = "is asset"; - function responseCode(code){ - function responseCodeFilter(flow){ - return flow.response && flow.response.code === code; - } - responseCodeFilter.desc = "resp. code is " + code; - return responseCodeFilter; + 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 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; + 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 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 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 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 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; + function noResponseFilter(flow) { + return flow.request && !flow.response; } noResponseFilter.desc = "has no response"; - function responseFilter(flow){ - return !!flow.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 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 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 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; + 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) { @@ -5181,11 +5718,14 @@ module.exports = (function() { return { SyntaxError: SyntaxError, - parse: parse + parse: parse }; })(); + },{"../flow/utils.js":23}],23:[function(require,module,exports){ +"use strict"; + var _ = require("lodash"); var $ = require("jquery"); @@ -5195,21 +5735,20 @@ var defaultPorts = { }; var MessageUtils = { - getContentType: function (message) { + getContentType: function getContentType(message) { var ct = this.get_first_header(message, /^Content-Type$/i); - if(ct){ + if (ct) { return ct.split(";")[0].trim(); } }, - get_first_header: function (message, regex) { + 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 (!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++) { @@ -5222,7 +5761,7 @@ var MessageUtils = { } return message._headerLookups[regex]; }, - match_header: function (message, regex) { + match_header: function match_header(message, regex) { var headers = message.headers; var i = headers.length; while (i--) { @@ -5232,7 +5771,7 @@ var MessageUtils = { } return false; }, - getContentURL: function (flow, message) { + getContentURL: function getContentURL(flow, message) { if (message === flow.request) { message = "request"; } else if (message === flow.response) { @@ -5240,18 +5779,18 @@ var MessageUtils = { } return "/flows/" + flow.id + "/" + message + "/content"; }, - getContent: function (flow, message) { + getContent: function getContent(flow, message) { var url = MessageUtils.getContentURL(flow, message); return $.get(url); } }; var RequestUtils = _.extend(MessageUtils, { - pretty_host: function (request) { + pretty_host: function pretty_host(request) { //FIXME: Add hostheader return request.host; }, - pretty_url: function (request) { + pretty_url: function pretty_url(request) { var port = ""; if (defaultPorts[request.scheme] !== request.port) { port = ":" + request.port; @@ -5262,13 +5801,12 @@ var RequestUtils = _.extend(MessageUtils, { var ResponseUtils = _.extend(MessageUtils, {}); - var parseUrl_regex = /^(?:(https?):\/\/)?([^\/:]+)?(?::(\d+))?(\/.*)?$/i; -var parseUrl = function (url) { +var 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){ + if (!parts) { return false; } @@ -5295,13 +5833,12 @@ var parseUrl = function (url) { return ret; }; - var isValidHttpVersion_regex = /^HTTP\/\d+(\.\d+)*$/i; -var isValidHttpVersion = function (httpVersion) { +var isValidHttpVersion = function isValidHttpVersion(httpVersion) { return isValidHttpVersion_regex.test(httpVersion); }; -var parseHttpVersion = function (httpVersion) { +var parseHttpVersion = function parseHttpVersion(httpVersion) { httpVersion = httpVersion.replace("HTTP/", "").split("."); return _.map(httpVersion, function (x) { return parseInt(x); @@ -5317,7 +5854,9 @@ module.exports = { isValidHttpVersion: isValidHttpVersion }; + },{"jquery":"jquery","lodash":"lodash"}],24:[function(require,module,exports){ +"use strict"; var _ = require("lodash"); var $ = require("jquery"); @@ -5327,13 +5866,12 @@ var utils = require("../utils.js"); var actions = require("../actions.js"); var dispatcher = require("../dispatcher.js"); - function ListStore() { EventEmitter.call(this); this.reset(); } _.extend(ListStore.prototype, EventEmitter.prototype, { - add: function (elem) { + add: function add(elem) { if (elem.id in this._pos_map) { return; } @@ -5341,14 +5879,14 @@ _.extend(ListStore.prototype, EventEmitter.prototype, { this.list.push(elem); this.emit("add", elem); }, - update: function (elem) { + update: function update(elem) { if (!(elem.id in this._pos_map)) { return; } this.list[this._pos_map[elem.id]] = elem; this.emit("update", elem); }, - remove: function (elem_id) { + remove: function remove(elem_id) { if (!(elem_id in this._pos_map)) { return; } @@ -5356,37 +5894,36 @@ _.extend(ListStore.prototype, EventEmitter.prototype, { this._build_map(); this.emit("remove", elem_id); }, - reset: function (elems) { + reset: function reset(elems) { this.list = elems || []; this._build_map(); this.emit("recalculate"); }, - _build_map: function () { + _build_map: function _build_map() { this._pos_map = {}; for (var i = 0; i < this.list.length; i++) { var elem = this.list[i]; this._pos_map[elem.id] = i; } }, - get: function (elem_id) { + get: function get(elem_id) { return this.list[this._pos_map[elem_id]]; }, - index: function (elem_id) { + index: function index(elem_id) { return this._pos_map[elem_id]; } }); - function DictStore() { EventEmitter.call(this); this.reset(); } _.extend(DictStore.prototype, EventEmitter.prototype, { - update: function (dict) { + update: function update(dict) { _.merge(this.dict, dict); this.emit("recalculate"); }, - reset: function (dict) { + reset: function reset(dict) { this.dict = dict || {}; this.emit("recalculate"); } @@ -5407,7 +5944,7 @@ function LiveStoreMixin(type) { } } _.extend(LiveStoreMixin.prototype, { - handle: function (event) { + handle: function handle(event) { if (event.type === actions.ActionTypes.CONNECTION_OPEN) { return this.fetch(); } @@ -5422,10 +5959,10 @@ _.extend(LiveStoreMixin.prototype, { } } }, - close: function () { + close: function close() { dispatcher.AppDispatcher.unregister(this.handle); }, - fetch: function (data) { + fetch: function fetch(data) { console.log("fetch " + this.type); if (this._fetchxhr) { this._fetchxhr.abort(); @@ -5434,16 +5971,14 @@ _.extend(LiveStoreMixin.prototype, { if (data) { this.handle_fetch(data); } else { - this._fetchxhr = $.getJSON("/" + this.type) - .done(function (message) { - this.handle_fetch(message.data); - }.bind(this)) - .fail(function () { - EventLogActions.add_event("Could not fetch " + this.type); - }.bind(this)); + this._fetchxhr = $.getJSON("/" + this.type).done((function (message) { + this.handle_fetch(message.data); + }).bind(this)).fail((function () { + EventLogActions.add_event("Could not fetch " + this.type); + }).bind(this)); } }, - handle_fetch: function (data) { + handle_fetch: function handle_fetch(data) { this._fetchxhr = false; console.log(this.type + " fetched.", this._updates_before_fetch); this.reset(data); @@ -5452,7 +5987,7 @@ _.extend(LiveStoreMixin.prototype, { for (var i = 0; i < updates.length; i++) { this.handle(updates[i]); } - }, + } }); function LiveListStore(type) { @@ -5467,7 +6002,6 @@ function LiveDictStore(type) { } _.extend(LiveDictStore.prototype, DictStore.prototype, LiveStoreMixin.prototype); - function FlowStore() { return new LiveListStore(actions.ActionTypes.FLOW_STORE); } @@ -5480,27 +6014,29 @@ function EventLogStore() { LiveListStore.call(this, actions.ActionTypes.EVENT_STORE); } _.extend(EventLogStore.prototype, LiveListStore.prototype, { - fetch: function(){ + fetch: function fetch() { LiveListStore.prototype.fetch.apply(this, arguments); // Make sure to display updates even if fetching all events failed. // This way, we can send "fetch failed" log messages to the log. - if(this._fetchxhr){ - this._fetchxhr.fail(function(){ + if (this._fetchxhr) { + this._fetchxhr.fail((function () { this.handle_fetch(null); - }.bind(this)); + }).bind(this)); } } }); - module.exports = { EventLogStore: EventLogStore, SettingsStore: SettingsStore, FlowStore: FlowStore }; + },{"../actions.js":2,"../dispatcher.js":21,"../utils.js":26,"events":1,"jquery":"jquery","lodash":"lodash"}],25:[function(require,module,exports){ +"use strict"; + var EventEmitter = require('events').EventEmitter; var _ = require("lodash"); @@ -5511,7 +6047,7 @@ function SortByStoreOrder(elem) { } var default_sort = SortByStoreOrder; -var default_filt = function (elem) { +var default_filt = function default_filt(elem) { return true; }; @@ -5533,14 +6069,14 @@ function StoreView(store, filt, sortfun) { } _.extend(StoreView.prototype, EventEmitter.prototype, { - close: function () { + close: function close() { this.store.removeListener("add", this.add); this.store.removeListener("update", this.update); this.store.removeListener("remove", this.remove); this.store.removeListener("recalculate", this.recalculate); this.removeAllListeners(); }, - recalculate: function (filt, sortfun) { + recalculate: function recalculate(filt, sortfun) { filt = filt || this.filt || default_filt; sortfun = sortfun || this.sortfun || default_sort; filt = filt.bind(this); @@ -5552,9 +6088,9 @@ _.extend(StoreView.prototype, EventEmitter.prototype, { this.list.sort(function (a, b) { var akey = sortfun(a); var bkey = sortfun(b); - if(akey < bkey){ + if (akey < bkey) { return -1; - } else if(akey > bkey){ + } else if (akey > bkey) { return 1; } else { return 0; @@ -5562,13 +6098,14 @@ _.extend(StoreView.prototype, EventEmitter.prototype, { }); this.emit("recalculate"); }, - index: function (elem) { + index: function index(elem) { return _.sortedIndex(this.list, elem, this.sortfun); }, - add: function (elem) { + add: function add(elem) { if (this.filt(elem)) { var idx = this.index(elem); - if (idx === this.list.length) { //happens often, .push is way faster. + if (idx === this.list.length) { + //happens often, .push is way faster. this.list.push(elem); } else { this.list.splice(idx, 0, elem); @@ -5576,7 +6113,7 @@ _.extend(StoreView.prototype, EventEmitter.prototype, { this.emit("add", elem, idx); } }, - update: function (elem) { + update: function update(elem) { var idx; var i = this.list.length; // Search from the back, we usually update the latest entries. @@ -5587,12 +6124,14 @@ _.extend(StoreView.prototype, EventEmitter.prototype, { } } - if (idx === -1) { //not contained in list + if (idx === -1) { + //not contained in list this.add(elem); } else if (!this.filt(elem)) { this.remove(elem.id); } else { - if (this.sortfun(this.list[idx]) !== this.sortfun(elem)) { //sortpos has changed + if (this.sortfun(this.list[idx]) !== this.sortfun(elem)) { + //sortpos has changed this.remove(this.list[idx]); this.add(elem); } else { @@ -5601,7 +6140,7 @@ _.extend(StoreView.prototype, EventEmitter.prototype, { } } }, - remove: function (elem_id) { + remove: function remove(elem_id) { var idx = this.list.length; while (idx--) { if (this.list[idx].id === elem_id) { @@ -5617,7 +6156,10 @@ module.exports = { StoreView: StoreView }; + },{"../utils.js":26,"events":1,"lodash":"lodash"}],26:[function(require,module,exports){ +"use strict"; + var $ = require("jquery"); var _ = require("lodash"); var actions = require("./actions.js"); @@ -5647,10 +6189,8 @@ for (var i = 65; i <= 90; i++) { Key[String.fromCharCode(i)] = i; } - -var formatSize = function (bytes) { - if (bytes === 0) - return "0"; +var formatSize = function formatSize(bytes) { + if (bytes === 0) return "0"; var prefix = ["b", "kb", "mb", "gb", "tb"]; for (var i = 0; i < prefix.length; i++) { if (Math.pow(1024, i + 1) > bytes) { @@ -5658,15 +6198,11 @@ var formatSize = function (bytes) { } } var precision; - if (bytes % Math.pow(1024, i) === 0) - precision = 0; - else - precision = 1; + if (bytes % Math.pow(1024, i) === 0) precision = 0;else precision = 1; return (bytes / Math.pow(1024, i)).toFixed(precision) + prefix[i]; }; - -var formatTimeDelta = function (milliseconds) { +var formatTimeDelta = function formatTimeDelta(milliseconds) { var time = milliseconds; var prefix = ["ms", "s", "min", "h"]; var div = [1000, 60, 60]; @@ -5678,9 +6214,8 @@ var formatTimeDelta = function (milliseconds) { return Math.round(time) + prefix[i]; }; - -var formatTimeStamp = function (seconds) { - var ts = (new Date(seconds * 1000)).toISOString(); +var formatTimeStamp = function formatTimeStamp(seconds) { + var ts = new Date(seconds * 1000).toISOString(); return ts.replace("T", " ").replace("Z", ""); }; @@ -5689,23 +6224,21 @@ var formatTimeStamp = function (seconds) { // This beauty "reverses" a JS string. var end = String.fromCharCode(0xffff); function reverseString(s) { - return String.fromCharCode.apply(String, - _.map(s.split(""), function (c) { - return 0xffff - c.charCodeAt(0); - }) - ) + end; + return String.fromCharCode.apply(String, _.map(s.split(""), function (c) { + return 0xffff - c.charCodeAt(0); + })) + end; } function getCookie(name) { var r = document.cookie.match(new RegExp("\\b" + name + "=([^;]*)\\b")); return r ? r[1] : undefined; } -var xsrf = $.param({_xsrf: getCookie("_xsrf")}); +var xsrf = $.param({ _xsrf: getCookie("_xsrf") }); //Tornado XSRF Protection. $.ajaxPrefilter(function (options) { if (["post", "put", "delete"].indexOf(options.type.toLowerCase()) >= 0 && options.url[0] === "/") { - if(options.url.indexOf("?") === -1){ + if (options.url.indexOf("?") === -1) { options.url += "?" + xsrf; } else { options.url += "&" + xsrf; @@ -5728,9 +6261,10 @@ module.exports = { formatTimeDelta: formatTimeDelta, formatTimeStamp: formatTimeStamp, reverseString: reverseString, - Key: Key, + Key: Key }; + },{"./actions.js":2,"jquery":"jquery","lodash":"lodash","react":"react"}]},{},[3]) diff --git a/libmproxy/web/static/vendor.css b/libmproxy/web/static/vendor.css index a170c49a..4ed1f0b8 100644 --- a/libmproxy/web/static/vendor.css +++ b/libmproxy/web/static/vendor.css @@ -1,4 +1,4 @@ -/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ html { font-family: sans-serif; -ms-text-size-adjust: 100%; @@ -88,7 +88,6 @@ figure { margin: 1em 40px; } hr { - -moz-box-sizing: content-box; box-sizing: content-box; height: 0; } @@ -148,8 +147,6 @@ input[type="number"]::-webkit-outer-spin-button { } input[type="search"] { -webkit-appearance: textfield; - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; box-sizing: content-box; } input[type="search"]::-webkit-search-cancel-button, @@ -228,9 +225,6 @@ th { h3 { page-break-after: avoid; } - select { - background: #fff !important; - } .navbar { display: none; } @@ -1076,7 +1070,7 @@ body { font-size: 14px; line-height: 1.42857143; color: #333333; - background-color: #ffffff; + background-color: #fff; } input, button, @@ -1121,8 +1115,8 @@ img { .img-thumbnail { padding: 4px; line-height: 1.42857143; - background-color: #ffffff; - border: 1px solid #dddddd; + background-color: #fff; + border: 1px solid #ddd; border-radius: 4px; -webkit-transition: all 0.2s ease-in-out; -o-transition: all 0.2s ease-in-out; @@ -1330,62 +1324,72 @@ mark, .text-primary { color: #337ab7; } -a.text-primary:hover { +a.text-primary:hover, +a.text-primary:focus { color: #286090; } .text-success { color: #3c763d; } -a.text-success:hover { +a.text-success:hover, +a.text-success:focus { color: #2b542c; } .text-info { color: #31708f; } -a.text-info:hover { +a.text-info:hover, +a.text-info:focus { color: #245269; } .text-warning { color: #8a6d3b; } -a.text-warning:hover { +a.text-warning:hover, +a.text-warning:focus { color: #66512c; } .text-danger { color: #a94442; } -a.text-danger:hover { +a.text-danger:hover, +a.text-danger:focus { color: #843534; } .bg-primary { color: #fff; background-color: #337ab7; } -a.bg-primary:hover { +a.bg-primary:hover, +a.bg-primary:focus { background-color: #286090; } .bg-success { background-color: #dff0d8; } -a.bg-success:hover { +a.bg-success:hover, +a.bg-success:focus { background-color: #c1e2b3; } .bg-info { background-color: #d9edf7; } -a.bg-info:hover { +a.bg-info:hover, +a.bg-info:focus { background-color: #afd9ee; } .bg-warning { background-color: #fcf8e3; } -a.bg-warning:hover { +a.bg-warning:hover, +a.bg-warning:focus { background-color: #f7ecb5; } .bg-danger { background-color: #f2dede; } -a.bg-danger:hover { +a.bg-danger:hover, +a.bg-danger:focus { background-color: #e4b9b9; } .page-header { @@ -1524,8 +1528,8 @@ code { kbd { padding: 2px 4px; font-size: 90%; - color: #ffffff; - background-color: #333333; + color: #fff; + background-color: #333; border-radius: 3px; box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); } @@ -1545,7 +1549,7 @@ pre { word-wrap: break-word; color: #333333; background-color: #f5f5f5; - border: 1px solid #cccccc; + border: 1px solid #ccc; border-radius: 4px; } pre code { @@ -2253,11 +2257,11 @@ th { padding: 8px; line-height: 1.42857143; vertical-align: top; - border-top: 1px solid #dddddd; + border-top: 1px solid #ddd; } .table > thead > tr > th { vertical-align: bottom; - border-bottom: 2px solid #dddddd; + border-bottom: 2px solid #ddd; } .table > caption + thead > tr:first-child > th, .table > colgroup + thead > tr:first-child > th, @@ -2268,10 +2272,10 @@ th { border-top: 0; } .table > tbody + tbody { - border-top: 2px solid #dddddd; + border-top: 2px solid #ddd; } .table .table { - background-color: #ffffff; + background-color: #fff; } .table-condensed > thead > tr > th, .table-condensed > tbody > tr > th, @@ -2282,7 +2286,7 @@ th { padding: 5px; } .table-bordered { - border: 1px solid #dddddd; + border: 1px solid #ddd; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, @@ -2290,7 +2294,7 @@ th { .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { - border: 1px solid #dddddd; + border: 1px solid #ddd; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { @@ -2428,7 +2432,7 @@ table th[class*="col-"] { margin-bottom: 15px; overflow-y: hidden; -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #dddddd; + border: 1px solid #ddd; } .table-responsive > .table { margin-bottom: 0; @@ -2534,9 +2538,9 @@ output { font-size: 14px; line-height: 1.42857143; color: #555555; - background-color: #ffffff; + background-color: #fff; background-image: none; - border: 1px solid #cccccc; + border: 1px solid #ccc; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); @@ -2551,14 +2555,14 @@ output { box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); } .form-control::-moz-placeholder { - color: #999999; + color: #999; opacity: 1; } .form-control:-ms-input-placeholder { - color: #999999; + color: #999; } .form-control::-webkit-input-placeholder { - color: #999999; + color: #999; } .form-control[disabled], .form-control[readonly], @@ -2577,10 +2581,10 @@ input[type="search"] { -webkit-appearance: none; } @media screen and (-webkit-min-device-pixel-ratio: 0) { - input[type="date"], - input[type="time"], - input[type="datetime-local"], - input[type="month"] { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { line-height: 34px; } input[type="date"].input-sm, @@ -2702,20 +2706,20 @@ select[multiple].input-sm { line-height: 1.5; border-radius: 3px; } -select.form-group-sm .form-control { +.form-group-sm select.form-control { height: 30px; line-height: 30px; } -textarea.form-group-sm .form-control, -select[multiple].form-group-sm .form-control { +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { height: auto; } .form-group-sm .form-control-static { height: 30px; - padding: 5px 10px; + min-height: 32px; + padding: 6px 10px; font-size: 12px; line-height: 1.5; - min-height: 32px; } .input-lg { height: 46px; @@ -2739,20 +2743,20 @@ select[multiple].input-lg { line-height: 1.3333333; border-radius: 6px; } -select.form-group-lg .form-control { +.form-group-lg select.form-control { height: 46px; line-height: 46px; } -textarea.form-group-lg .form-control, -select[multiple].form-group-lg .form-control { +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { height: auto; } .form-group-lg .form-control-static { height: 46px; - padding: 10px 16px; + min-height: 38px; + padding: 11px 16px; font-size: 18px; line-height: 1.3333333; - min-height: 38px; } .has-feedback { position: relative; @@ -2772,12 +2776,16 @@ select[multiple].form-group-lg .form-control { text-align: center; pointer-events: none; } -.input-lg + .form-control-feedback { +.input-lg + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { width: 46px; height: 46px; line-height: 46px; } -.input-sm + .form-control-feedback { +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { width: 30px; height: 30px; line-height: 30px; @@ -2963,11 +2971,13 @@ select[multiple].form-group-lg .form-control { @media (min-width: 768px) { .form-horizontal .form-group-lg .control-label { padding-top: 14.333333px; + font-size: 18px; } } @media (min-width: 768px) { .form-horizontal .form-group-sm .control-label { padding-top: 6px; + font-size: 12px; } } .btn { @@ -3003,7 +3013,7 @@ select[multiple].form-group-lg .form-control { .btn:hover, .btn:focus, .btn.focus { - color: #333333; + color: #333; text-decoration: none; } .btn:active, @@ -3017,27 +3027,51 @@ select[multiple].form-group-lg .form-control { .btn[disabled], fieldset[disabled] .btn { cursor: not-allowed; - pointer-events: none; opacity: 0.65; filter: alpha(opacity=65); -webkit-box-shadow: none; box-shadow: none; } +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} .btn-default { - color: #333333; - background-color: #ffffff; - border-color: #cccccc; + color: #333; + background-color: #fff; + border-color: #ccc; } -.btn-default:hover, .btn-default:focus, -.btn-default.focus, +.btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { - color: #333333; + color: #333; background-color: #e6e6e6; border-color: #adadad; } +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; +} .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { @@ -3061,28 +3095,49 @@ fieldset[disabled] .btn-default:active, .btn-default.disabled.active, .btn-default[disabled].active, fieldset[disabled] .btn-default.active { - background-color: #ffffff; - border-color: #cccccc; + background-color: #fff; + border-color: #ccc; } .btn-default .badge { - color: #ffffff; - background-color: #333333; + color: #fff; + background-color: #333; } .btn-primary { - color: #ffffff; + color: #fff; background-color: #337ab7; border-color: #2e6da4; } -.btn-primary:hover, .btn-primary:focus, -.btn-primary.focus, +.btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; +} +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; +} .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { - color: #ffffff; + color: #fff; background-color: #286090; border-color: #204d74; } +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; +} .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { @@ -3111,23 +3166,44 @@ fieldset[disabled] .btn-primary.active { } .btn-primary .badge { color: #337ab7; - background-color: #ffffff; + background-color: #fff; } .btn-success { - color: #ffffff; + color: #fff; background-color: #5cb85c; border-color: #4cae4c; } -.btn-success:hover, .btn-success:focus, -.btn-success.focus, +.btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; +} +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; +} .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { - color: #ffffff; + color: #fff; background-color: #449d44; border-color: #398439; } +.btn-success:active:hover, +.btn-success.active:hover, +.open > .dropdown-toggle.btn-success:hover, +.btn-success:active:focus, +.btn-success.active:focus, +.open > .dropdown-toggle.btn-success:focus, +.btn-success:active.focus, +.btn-success.active.focus, +.open > .dropdown-toggle.btn-success.focus { + color: #fff; + background-color: #398439; + border-color: #255625; +} .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { @@ -3156,23 +3232,44 @@ fieldset[disabled] .btn-success.active { } .btn-success .badge { color: #5cb85c; - background-color: #ffffff; + background-color: #fff; } .btn-info { - color: #ffffff; + color: #fff; background-color: #5bc0de; border-color: #46b8da; } -.btn-info:hover, .btn-info:focus, -.btn-info.focus, +.btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; +} +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { - color: #ffffff; + color: #fff; background-color: #31b0d5; border-color: #269abc; } +.btn-info:active:hover, +.btn-info.active:hover, +.open > .dropdown-toggle.btn-info:hover, +.btn-info:active:focus, +.btn-info.active:focus, +.open > .dropdown-toggle.btn-info:focus, +.btn-info:active.focus, +.btn-info.active.focus, +.open > .dropdown-toggle.btn-info.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; +} .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { @@ -3201,23 +3298,44 @@ fieldset[disabled] .btn-info.active { } .btn-info .badge { color: #5bc0de; - background-color: #ffffff; + background-color: #fff; } .btn-warning { - color: #ffffff; + color: #fff; background-color: #f0ad4e; border-color: #eea236; } -.btn-warning:hover, .btn-warning:focus, -.btn-warning.focus, +.btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; +} +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { - color: #ffffff; + color: #fff; background-color: #ec971f; border-color: #d58512; } +.btn-warning:active:hover, +.btn-warning.active:hover, +.open > .dropdown-toggle.btn-warning:hover, +.btn-warning:active:focus, +.btn-warning.active:focus, +.open > .dropdown-toggle.btn-warning:focus, +.btn-warning:active.focus, +.btn-warning.active.focus, +.open > .dropdown-toggle.btn-warning.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; +} .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { @@ -3246,23 +3364,44 @@ fieldset[disabled] .btn-warning.active { } .btn-warning .badge { color: #f0ad4e; - background-color: #ffffff; + background-color: #fff; } .btn-danger { - color: #ffffff; + color: #fff; background-color: #d9534f; border-color: #d43f3a; } -.btn-danger:hover, .btn-danger:focus, -.btn-danger.focus, +.btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; +} +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { - color: #ffffff; + color: #fff; background-color: #c9302c; border-color: #ac2925; } +.btn-danger:active:hover, +.btn-danger.active:hover, +.open > .dropdown-toggle.btn-danger:hover, +.btn-danger:active:focus, +.btn-danger.active:focus, +.open > .dropdown-toggle.btn-danger:focus, +.btn-danger:active.focus, +.btn-danger.active.focus, +.open > .dropdown-toggle.btn-danger.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; +} .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { @@ -3291,7 +3430,7 @@ fieldset[disabled] .btn-danger.active { } .btn-danger .badge { color: #d9534f; - background-color: #ffffff; + background-color: #fff; } .btn-link { color: #337ab7; @@ -3398,6 +3537,7 @@ tbody.collapse.in { margin-left: 2px; vertical-align: middle; border-top: 4px dashed; + border-top: 4px solid \9; border-right: 4px solid transparent; border-left: 4px solid transparent; } @@ -3421,8 +3561,8 @@ tbody.collapse.in { list-style: none; font-size: 14px; text-align: left; - background-color: #ffffff; - border: 1px solid #cccccc; + background-color: #fff; + border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.15); border-radius: 4px; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); @@ -3457,7 +3597,7 @@ tbody.collapse.in { .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { - color: #ffffff; + color: #fff; text-decoration: none; outline: 0; background-color: #337ab7; @@ -3512,7 +3652,8 @@ tbody.collapse.in { .dropup .caret, .navbar-fixed-bottom .dropdown .caret { border-top: 0; - border-bottom: 4px solid; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; content: ""; } .dropup .dropdown-menu, @@ -3561,6 +3702,7 @@ tbody.collapse.in { .btn-toolbar { margin-left: -5px; } +.btn-toolbar .btn, .btn-toolbar .btn-group, .btn-toolbar .input-group { float: left; @@ -3786,7 +3928,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { color: #555555; text-align: center; background-color: #eeeeee; - border: 1px solid #cccccc; + border: 1px solid #ccc; border-radius: 4px; } .input-group-addon.input-sm { @@ -3851,6 +3993,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { } .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group { + z-index: 2; margin-left: -1px; } .nav { @@ -3898,7 +4041,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { max-width: none; } .nav-tabs { - border-bottom: 1px solid #dddddd; + border-bottom: 1px solid #ddd; } .nav-tabs > li { float: left; @@ -3911,14 +4054,14 @@ select[multiple].input-group-sm > .input-group-btn > .btn { border-radius: 4px 4px 0 0; } .nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #dddddd; + border-color: #eeeeee #eeeeee #ddd; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: #555555; - background-color: #ffffff; - border: 1px solid #dddddd; + background-color: #fff; + border: 1px solid #ddd; border-bottom-color: transparent; cursor: default; } @@ -3953,17 +4096,17 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #dddddd; + border: 1px solid #ddd; } @media (min-width: 768px) { .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #dddddd; + border-bottom: 1px solid #ddd; border-radius: 4px 4px 0 0; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #ffffff; + border-bottom-color: #fff; } } .nav-pills > li { @@ -3978,7 +4121,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { - color: #ffffff; + color: #fff; background-color: #337ab7; } .nav-stacked > li { @@ -4021,17 +4164,17 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { - border: 1px solid #dddddd; + border: 1px solid #ddd; } @media (min-width: 768px) { .nav-tabs-justified > li > a { - border-bottom: 1px solid #dddddd; + border-bottom: 1px solid #ddd; border-radius: 4px 4px 0 0; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { - border-bottom-color: #ffffff; + border-bottom-color: #fff; } } .tab-content > .tab-pane { @@ -4393,30 +4536,30 @@ select[multiple].input-group-sm > .input-group-btn > .btn { } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { - color: #333333; + color: #333; background-color: transparent; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { - color: #555555; + color: #555; background-color: #eeeeee; } .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { - color: #cccccc; + color: #ccc; background-color: transparent; } .navbar-default .navbar-toggle { - border-color: #dddddd; + border-color: #ddd; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { - background-color: #dddddd; + background-color: #ddd; } .navbar-default .navbar-toggle .icon-bar { - background-color: #888888; + background-color: #888; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { @@ -4426,7 +4569,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { background-color: #eeeeee; - color: #555555; + color: #555; } @media (max-width: 767px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { @@ -4434,19 +4577,19 @@ select[multiple].input-group-sm > .input-group-btn > .btn { } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333333; + color: #333; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555555; + color: #555; background-color: #eeeeee; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #cccccc; + color: #ccc; background-color: transparent; } } @@ -4454,23 +4597,23 @@ select[multiple].input-group-sm > .input-group-btn > .btn { color: #303030; } .navbar-default .navbar-link:hover { - color: #333333; + color: #333; } .navbar-default .btn-link { color: #303030; } .navbar-default .btn-link:hover, .navbar-default .btn-link:focus { - color: #333333; + color: #333; } .navbar-default .btn-link[disabled]:hover, fieldset[disabled] .navbar-default .btn-link:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:focus { - color: #cccccc; + color: #ccc; } .navbar-inverse { - background-color: #222222; + background-color: #222; border-color: #080808; } .navbar-inverse .navbar-brand { @@ -4478,7 +4621,7 @@ fieldset[disabled] .navbar-default .btn-link:focus { } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { - color: #ffffff; + color: #fff; background-color: transparent; } .navbar-inverse .navbar-text { @@ -4489,30 +4632,30 @@ fieldset[disabled] .navbar-default .btn-link:focus { } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { - color: #ffffff; + color: #fff; background-color: transparent; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { - color: #ffffff; + color: #fff; background-color: #080808; } .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444444; + color: #444; background-color: transparent; } .navbar-inverse .navbar-toggle { - border-color: #333333; + border-color: #333; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { - background-color: #333333; + background-color: #333; } .navbar-inverse .navbar-toggle .icon-bar { - background-color: #ffffff; + background-color: #fff; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { @@ -4522,7 +4665,7 @@ fieldset[disabled] .navbar-default .btn-link:focus { .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { background-color: #080808; - color: #ffffff; + color: #fff; } @media (max-width: 767px) { .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { @@ -4536,19 +4679,19 @@ fieldset[disabled] .navbar-default .btn-link:focus { } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #ffffff; + color: #fff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #ffffff; + color: #fff; background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444444; + color: #444; background-color: transparent; } } @@ -4556,20 +4699,20 @@ fieldset[disabled] .navbar-default .btn-link:focus { color: #9d9d9d; } .navbar-inverse .navbar-link:hover { - color: #ffffff; + color: #fff; } .navbar-inverse .btn-link { color: #9d9d9d; } .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { - color: #ffffff; + color: #fff; } .navbar-inverse .btn-link[disabled]:hover, fieldset[disabled] .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:focus { - color: #444444; + color: #444; } .breadcrumb { padding: 8px 15px; @@ -4584,7 +4727,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .breadcrumb > li + li:before { content: "/\00a0"; padding: 0 5px; - color: #cccccc; + color: #ccc; } .breadcrumb > .active { color: #777777; @@ -4606,8 +4749,8 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { line-height: 1.42857143; text-decoration: none; color: #337ab7; - background-color: #ffffff; - border: 1px solid #dddddd; + background-color: #fff; + border: 1px solid #ddd; margin-left: -1px; } .pagination > li:first-child > a, @@ -4625,9 +4768,10 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { + z-index: 3; color: #23527c; background-color: #eeeeee; - border-color: #dddddd; + border-color: #ddd; } .pagination > .active > a, .pagination > .active > span, @@ -4636,7 +4780,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 2; - color: #ffffff; + color: #fff; background-color: #337ab7; border-color: #337ab7; cursor: default; @@ -4648,14 +4792,15 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { color: #777777; - background-color: #ffffff; - border-color: #dddddd; + background-color: #fff; + border-color: #ddd; cursor: not-allowed; } .pagination-lg > li > a, .pagination-lg > li > span { padding: 10px 16px; font-size: 18px; + line-height: 1.3333333; } .pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { @@ -4671,6 +4816,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pagination-sm > li > span { padding: 5px 10px; font-size: 12px; + line-height: 1.5; } .pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { @@ -4695,8 +4841,8 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pager li > span { display: inline-block; padding: 5px 14px; - background-color: #ffffff; - border: 1px solid #dddddd; + background-color: #fff; + border: 1px solid #ddd; border-radius: 15px; } .pager li > a:hover, @@ -4717,7 +4863,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { .pager .disabled > a:focus, .pager .disabled > span { color: #777777; - background-color: #ffffff; + background-color: #fff; cursor: not-allowed; } .label { @@ -4726,7 +4872,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { font-size: 75%; font-weight: bold; line-height: 1; - color: #ffffff; + color: #fff; text-align: center; white-space: nowrap; vertical-align: baseline; @@ -4734,7 +4880,7 @@ fieldset[disabled] .navbar-inverse .btn-link:focus { } a.label:hover, a.label:focus { - color: #ffffff; + color: #fff; text-decoration: none; cursor: pointer; } @@ -4793,9 +4939,9 @@ a.label:focus { padding: 3px 7px; font-size: 12px; font-weight: bold; - color: #ffffff; + color: #fff; line-height: 1; - vertical-align: baseline; + vertical-align: middle; white-space: nowrap; text-align: center; background-color: #777777; @@ -4815,14 +4961,14 @@ a.label:focus { } a.badge:hover, a.badge:focus { - color: #ffffff; + color: #fff; text-decoration: none; cursor: pointer; } .list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #337ab7; - background-color: #ffffff; + background-color: #fff; } .list-group-item > .badge { float: right; @@ -4834,7 +4980,8 @@ a.badge:focus { margin-left: 3px; } .jumbotron { - padding: 30px 15px; + padding-top: 30px; + padding-bottom: 30px; margin-bottom: 30px; color: inherit; background-color: #eeeeee; @@ -4860,7 +5007,8 @@ a.badge:focus { } @media screen and (min-width: 768px) { .jumbotron { - padding: 48px 0; + padding-top: 48px; + padding-bottom: 48px; } .container .jumbotron, .container-fluid .jumbotron { @@ -4877,8 +5025,8 @@ a.badge:focus { padding: 4px; margin-bottom: 20px; line-height: 1.42857143; - background-color: #ffffff; - border: 1px solid #dddddd; + background-color: #fff; + border: 1px solid #ddd; border-radius: 4px; -webkit-transition: border 0.2s ease-in-out; -o-transition: border 0.2s ease-in-out; @@ -5004,7 +5152,7 @@ a.thumbnail.active { height: 100%; font-size: 12px; line-height: 20px; - color: #ffffff; + color: #fff; text-align: center; background-color: #337ab7; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); @@ -5075,6 +5223,9 @@ a.thumbnail.active { .media-object { display: block; } +.media-object.img-thumbnail { + max-width: none; +} .media-right, .media > .pull-right { padding-left: 10px; @@ -5112,8 +5263,8 @@ a.thumbnail.active { display: block; padding: 10px 15px; margin-bottom: -1px; - background-color: #ffffff; - border: 1px solid #dddddd; + background-color: #fff; + border: 1px solid #ddd; } .list-group-item:first-child { border-top-right-radius: 4px; @@ -5124,18 +5275,26 @@ a.thumbnail.active { border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } -a.list-group-item { - color: #555555; +a.list-group-item, +button.list-group-item { + color: #555; } -a.list-group-item .list-group-item-heading { - color: #333333; +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; } a.list-group-item:hover, -a.list-group-item:focus { +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { text-decoration: none; - color: #555555; + color: #555; background-color: #f5f5f5; } +button.list-group-item { + width: 100%; + text-align: left; +} .list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus { @@ -5157,7 +5316,7 @@ a.list-group-item:focus { .list-group-item.active:hover, .list-group-item.active:focus { z-index: 2; - color: #ffffff; + color: #fff; background-color: #337ab7; border-color: #337ab7; } @@ -5181,20 +5340,27 @@ a.list-group-item:focus { color: #3c763d; background-color: #dff0d8; } -a.list-group-item-success { +a.list-group-item-success, +button.list-group-item-success { color: #3c763d; } -a.list-group-item-success .list-group-item-heading { +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { color: inherit; } a.list-group-item-success:hover, -a.list-group-item-success:focus { +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { color: #3c763d; background-color: #d0e9c6; } a.list-group-item-success.active, +button.list-group-item-success.active, a.list-group-item-success.active:hover, -a.list-group-item-success.active:focus { +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { color: #fff; background-color: #3c763d; border-color: #3c763d; @@ -5203,20 +5369,27 @@ a.list-group-item-success.active:focus { color: #31708f; background-color: #d9edf7; } -a.list-group-item-info { +a.list-group-item-info, +button.list-group-item-info { color: #31708f; } -a.list-group-item-info .list-group-item-heading { +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { color: inherit; } a.list-group-item-info:hover, -a.list-group-item-info:focus { +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { color: #31708f; background-color: #c4e3f3; } a.list-group-item-info.active, +button.list-group-item-info.active, a.list-group-item-info.active:hover, -a.list-group-item-info.active:focus { +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { color: #fff; background-color: #31708f; border-color: #31708f; @@ -5225,20 +5398,27 @@ a.list-group-item-info.active:focus { color: #8a6d3b; background-color: #fcf8e3; } -a.list-group-item-warning { +a.list-group-item-warning, +button.list-group-item-warning { color: #8a6d3b; } -a.list-group-item-warning .list-group-item-heading { +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { color: inherit; } a.list-group-item-warning:hover, -a.list-group-item-warning:focus { +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { color: #8a6d3b; background-color: #faf2cc; } a.list-group-item-warning.active, +button.list-group-item-warning.active, a.list-group-item-warning.active:hover, -a.list-group-item-warning.active:focus { +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { color: #fff; background-color: #8a6d3b; border-color: #8a6d3b; @@ -5247,20 +5427,27 @@ a.list-group-item-warning.active:focus { color: #a94442; background-color: #f2dede; } -a.list-group-item-danger { +a.list-group-item-danger, +button.list-group-item-danger { color: #a94442; } -a.list-group-item-danger .list-group-item-heading { +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { color: inherit; } a.list-group-item-danger:hover, -a.list-group-item-danger:focus { +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { color: #a94442; background-color: #ebcccc; } a.list-group-item-danger.active, +button.list-group-item-danger.active, a.list-group-item-danger.active:hover, -a.list-group-item-danger.active:focus { +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { color: #fff; background-color: #a94442; border-color: #a94442; @@ -5275,7 +5462,7 @@ a.list-group-item-danger.active:focus { } .panel { margin-bottom: 20px; - background-color: #ffffff; + background-color: #fff; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); @@ -5309,7 +5496,7 @@ a.list-group-item-danger.active:focus { .panel-footer { padding: 10px 15px; background-color: #f5f5f5; - border-top: 1px solid #dddddd; + border-top: 1px solid #ddd; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } @@ -5334,6 +5521,10 @@ a.list-group-item-danger.active:focus { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} .panel-heading + .list-group .list-group-item:first-child { border-top-width: 0; } @@ -5419,7 +5610,7 @@ a.list-group-item-danger.active:focus { .panel > .panel-body + .table-responsive, .panel > .table + .panel-body, .panel > .table-responsive + .panel-body { - border-top: 1px solid #dddddd; + border-top: 1px solid #ddd; } .panel > .table > tbody:first-child > tr:first-child th, .panel > .table > tbody:first-child > tr:first-child td { @@ -5496,37 +5687,37 @@ a.list-group-item-danger.active:focus { } .panel-group .panel-heading + .panel-collapse > .panel-body, .panel-group .panel-heading + .panel-collapse > .list-group { - border-top: 1px solid #dddddd; + border-top: 1px solid #ddd; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #dddddd; + border-bottom: 1px solid #ddd; } .panel-default { - border-color: #dddddd; + border-color: #ddd; } .panel-default > .panel-heading { color: #333333; background-color: #f5f5f5; - border-color: #dddddd; + border-color: #ddd; } .panel-default > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #dddddd; + border-top-color: #ddd; } .panel-default > .panel-heading .badge { color: #f5f5f5; background-color: #333333; } .panel-default > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #dddddd; + border-bottom-color: #ddd; } .panel-primary { border-color: #337ab7; } .panel-primary > .panel-heading { - color: #ffffff; + color: #fff; background-color: #337ab7; border-color: #337ab7; } @@ -5535,7 +5726,7 @@ a.list-group-item-danger.active:focus { } .panel-primary > .panel-heading .badge { color: #337ab7; - background-color: #ffffff; + background-color: #fff; } .panel-primary > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #337ab7; @@ -5665,14 +5856,14 @@ a.list-group-item-danger.active:focus { font-size: 21px; font-weight: bold; line-height: 1; - color: #000000; - text-shadow: 0 1px 0 #ffffff; + color: #000; + text-shadow: 0 1px 0 #fff; opacity: 0.2; filter: alpha(opacity=20); } .close:hover, .close:focus { - color: #000000; + color: #000; text-decoration: none; cursor: pointer; opacity: 0.5; @@ -5727,8 +5918,8 @@ button.close { } .modal-content { position: relative; - background-color: #ffffff; - border: 1px solid #999999; + background-color: #fff; + border: 1px solid #999; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); @@ -5743,7 +5934,7 @@ button.close { bottom: 0; left: 0; z-index: 1040; - background-color: #000000; + background-color: #000; } .modal-backdrop.fade { opacity: 0; @@ -5814,9 +6005,21 @@ button.close { z-index: 1070; display: block; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 12px; + font-style: normal; font-weight: normal; - line-height: 1.4; + letter-spacing: normal; + line-break: auto; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + font-size: 12px; opacity: 0; filter: alpha(opacity=0); } @@ -5843,10 +6046,9 @@ button.close { .tooltip-inner { max-width: 200px; padding: 3px 8px; - color: #ffffff; + color: #fff; text-align: center; - text-decoration: none; - background-color: #000000; + background-color: #000; border-radius: 4px; } .tooltip-arrow { @@ -5861,56 +6063,56 @@ button.close { left: 50%; margin-left: -5px; border-width: 5px 5px 0; - border-top-color: #000000; + border-top-color: #000; } .tooltip.top-left .tooltip-arrow { bottom: 0; right: 5px; margin-bottom: -5px; border-width: 5px 5px 0; - border-top-color: #000000; + border-top-color: #000; } .tooltip.top-right .tooltip-arrow { bottom: 0; left: 5px; margin-bottom: -5px; border-width: 5px 5px 0; - border-top-color: #000000; + border-top-color: #000; } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-width: 5px 5px 5px 0; - border-right-color: #000000; + border-right-color: #000; } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-width: 5px 0 5px 5px; - border-left-color: #000000; + border-left-color: #000; } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-width: 0 5px 5px; - border-bottom-color: #000000; + border-bottom-color: #000; } .tooltip.bottom-left .tooltip-arrow { top: 0; right: 5px; margin-top: -5px; border-width: 0 5px 5px; - border-bottom-color: #000000; + border-bottom-color: #000; } .tooltip.bottom-right .tooltip-arrow { top: 0; left: 5px; margin-top: -5px; border-width: 0 5px 5px; - border-bottom-color: #000000; + border-bottom-color: #000; } .popover { position: absolute; @@ -5921,18 +6123,28 @@ button.close { max-width: 276px; padding: 1px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; + font-style: normal; font-weight: normal; + letter-spacing: normal; + line-break: auto; line-height: 1.42857143; text-align: left; - background-color: #ffffff; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + font-size: 14px; + background-color: #fff; background-clip: padding-box; - border: 1px solid #cccccc; + border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - white-space: normal; } .popover.top { margin-top: -10px; @@ -5986,7 +6198,7 @@ button.close { bottom: 1px; margin-left: -10px; border-bottom-width: 0; - border-top-color: #ffffff; + border-top-color: #fff; } .popover.right > .arrow { top: 50%; @@ -6001,7 +6213,7 @@ button.close { left: 1px; bottom: -10px; border-left-width: 0; - border-right-color: #ffffff; + border-right-color: #fff; } .popover.bottom > .arrow { left: 50%; @@ -6016,7 +6228,7 @@ button.close { top: 1px; margin-left: -10px; border-top-width: 0; - border-bottom-color: #ffffff; + border-bottom-color: #fff; } .popover.left > .arrow { top: 50%; @@ -6030,7 +6242,7 @@ button.close { content: " "; right: 1px; border-right-width: 0; - border-left-color: #ffffff; + border-left-color: #fff; bottom: -10px; } .carousel { @@ -6061,9 +6273,9 @@ button.close { -webkit-backface-visibility: hidden; -moz-backface-visibility: hidden; backface-visibility: hidden; - -webkit-perspective: 1000; - -moz-perspective: 1000; - perspective: 1000; + -webkit-perspective: 1000px; + -moz-perspective: 1000px; + perspective: 1000px; } .carousel-inner > .item.next, .carousel-inner > .item.active.right { @@ -6124,7 +6336,7 @@ button.close { opacity: 0.5; filter: alpha(opacity=50); font-size: 20px; - color: #ffffff; + color: #fff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } @@ -6147,7 +6359,7 @@ button.close { .carousel-control:hover, .carousel-control:focus { outline: 0; - color: #ffffff; + color: #fff; text-decoration: none; opacity: 0.9; filter: alpha(opacity=90); @@ -6158,6 +6370,7 @@ button.close { .carousel-control .glyphicon-chevron-right { position: absolute; top: 50%; + margin-top: -10px; z-index: 5; display: inline-block; } @@ -6175,7 +6388,6 @@ button.close { .carousel-control .icon-next { width: 20px; height: 20px; - margin-top: -10px; line-height: 1; font-family: serif; } @@ -6202,7 +6414,7 @@ button.close { height: 10px; margin: 1px; text-indent: -999px; - border: 1px solid #ffffff; + border: 1px solid #fff; border-radius: 10px; cursor: pointer; background-color: #000 \9; @@ -6212,7 +6424,7 @@ button.close { margin: 0; width: 12px; height: 12px; - background-color: #ffffff; + background-color: #fff; } .carousel-caption { position: absolute; @@ -6222,7 +6434,7 @@ button.close { z-index: 10; padding-top: 20px; padding-bottom: 20px; - color: #ffffff; + color: #fff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } @@ -6367,7 +6579,7 @@ button.close { display: block !important; } table.visible-xs { - display: table; + display: table !important; } tr.visible-xs { display: table-row !important; @@ -6397,7 +6609,7 @@ button.close { display: block !important; } table.visible-sm { - display: table; + display: table !important; } tr.visible-sm { display: table-row !important; @@ -6427,7 +6639,7 @@ button.close { display: block !important; } table.visible-md { - display: table; + display: table !important; } tr.visible-md { display: table-row !important; @@ -6457,7 +6669,7 @@ button.close { display: block !important; } table.visible-lg { - display: table; + display: table !important; } tr.visible-lg { display: table-row !important; @@ -6510,7 +6722,7 @@ button.close { display: block !important; } table.visible-print { - display: table; + display: table !important; } tr.visible-print { display: table-row !important; @@ -8222,4 +8434,4 @@ button.close { content: "\f20c"; } -/*# sourceMappingURL=vendor.css.map */
\ No newline at end of file +/*# sourceMappingURL=vendor.css.map */ diff --git a/libmproxy/web/static/vendor.js b/libmproxy/web/static/vendor.js index 1e83ac50..59d10445 100644 --- a/libmproxy/web/static/vendor.js +++ b/libmproxy/web/static/vendor.js @@ -2,69 +2,74 @@ require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof requ // shim for using process in browser var process = module.exports = {}; - -process.nextTick = (function () { - var canSetImmediate = typeof window !== 'undefined' - && window.setImmediate; - var canMutationObserver = typeof window !== 'undefined' - && window.MutationObserver; - var canPost = typeof window !== 'undefined' - && window.postMessage && window.addEventListener - ; - - if (canSetImmediate) { - return function (f) { return window.setImmediate(f) }; +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; } + if (queue.length) { + drainQueue(); + } +} - var queue = []; - - if (canMutationObserver) { - var hiddenDiv = document.createElement("div"); - var observer = new MutationObserver(function () { - var queueList = queue.slice(); - queue.length = 0; - queueList.forEach(function (fn) { - fn(); - }); - }); - - observer.observe(hiddenDiv, { attributes: true }); - - return function nextTick(fn) { - if (!queue.length) { - hiddenDiv.setAttribute('yes', 'no'); - } - queue.push(fn); - }; +function drainQueue() { + if (draining) { + return; } + var timeout = setTimeout(cleanUpNextTick); + draining = true; - if (canPost) { - window.addEventListener('message', function (ev) { - var source = ev.source; - if ((source === window || source === null) && ev.data === 'process-tick') { - ev.stopPropagation(); - if (queue.length > 0) { - var fn = queue.shift(); - fn(); - } + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); } - }, true); - - return function nextTick(fn) { - queue.push(fn); - window.postMessage('process-tick', '*'); - }; + } + queueIndex = -1; + len = queue.length; } + currentQueue = null; + draining = false; + clearTimeout(timeout); +} - return function nextTick(fn) { - setTimeout(fn, 0); - }; -})(); +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + setTimeout(drainQueue, 0); + } +}; +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; process.title = 'browser'; process.browser = true; process.env = {}; process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; function noop() {} @@ -80,15 +85,16 @@ process.binding = function (name) { throw new Error('process.binding is not supported'); }; -// TODO(shtylman) process.cwd = function () { return '/' }; process.chdir = function (dir) { throw new Error('process.chdir is not supported'); }; +process.umask = function() { return 0; }; },{}],2:[function(require,module,exports){ -/* - * Copyright (c) 2014, Facebook, Inc. +(function (process){ +/** + * Copyright (c) 2014-2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the @@ -96,14 +102,18 @@ process.chdir = function (dir) { * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule Dispatcher - * @typechecks + * + * @preventMunge */ -"use strict"; +'use strict'; + +exports.__esModule = true; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -var invariant = require('./invariant'); +var invariant = require('fbjs/lib/invariant'); -var _lastID = 1; var _prefix = 'ID_'; /** @@ -153,7 +163,7 @@ var _prefix = 'ID_'; * * This payload is digested by both stores: * - * CountryStore.dispatchToken = flightDispatcher.register(function(payload) { + * CountryStore.dispatchToken = flightDispatcher.register(function(payload) { * if (payload.actionType === 'country-update') { * CountryStore.country = payload.selectedCountry; * } @@ -181,15 +191,11 @@ var _prefix = 'ID_'; * flightDispatcher.register(function(payload) { * switch (payload.actionType) { * case 'country-update': + * case 'city-update': * flightDispatcher.waitFor([CityStore.dispatchToken]); * FlightPriceStore.price = * getFlightPriceStore(CountryStore.country, CityStore.city); * break; - * - * case 'city-update': - * FlightPriceStore.price = - * FlightPriceStore(CountryStore.country, CityStore.city); - * break; * } * }); * @@ -198,131 +204,109 @@ var _prefix = 'ID_'; * `FlightPriceStore`. */ +var Dispatcher = (function () { function Dispatcher() { - this.$Dispatcher_callbacks = {}; - this.$Dispatcher_isPending = {}; - this.$Dispatcher_isHandled = {}; - this.$Dispatcher_isDispatching = false; - this.$Dispatcher_pendingPayload = null; + _classCallCheck(this, Dispatcher); + + this._callbacks = {}; + this._isDispatching = false; + this._isHandled = {}; + this._isPending = {}; + this._lastID = 1; } /** * Registers a callback to be invoked with every dispatched payload. Returns * a token that can be used with `waitFor()`. - * - * @param {function} callback - * @return {string} */ - Dispatcher.prototype.register=function(callback) { - var id = _prefix + _lastID++; - this.$Dispatcher_callbacks[id] = callback; + + Dispatcher.prototype.register = function register(callback) { + var id = _prefix + this._lastID++; + this._callbacks[id] = callback; return id; }; /** * Removes a callback based on its token. - * - * @param {string} id */ - Dispatcher.prototype.unregister=function(id) { - invariant( - this.$Dispatcher_callbacks[id], - 'Dispatcher.unregister(...): `%s` does not map to a registered callback.', - id - ); - delete this.$Dispatcher_callbacks[id]; + + Dispatcher.prototype.unregister = function unregister(id) { + !this._callbacks[id] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Dispatcher.unregister(...): `%s` does not map to a registered callback.', id) : invariant(false) : undefined; + delete this._callbacks[id]; }; /** * Waits for the callbacks specified to be invoked before continuing execution * of the current callback. This method should only be used by a callback in * response to a dispatched payload. - * - * @param {array<string>} ids */ - Dispatcher.prototype.waitFor=function(ids) { - invariant( - this.$Dispatcher_isDispatching, - 'Dispatcher.waitFor(...): Must be invoked while dispatching.' - ); + + Dispatcher.prototype.waitFor = function waitFor(ids) { + !this._isDispatching ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Dispatcher.waitFor(...): Must be invoked while dispatching.') : invariant(false) : undefined; for (var ii = 0; ii < ids.length; ii++) { var id = ids[ii]; - if (this.$Dispatcher_isPending[id]) { - invariant( - this.$Dispatcher_isHandled[id], - 'Dispatcher.waitFor(...): Circular dependency detected while ' + - 'waiting for `%s`.', - id - ); + if (this._isPending[id]) { + !this._isHandled[id] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Dispatcher.waitFor(...): Circular dependency detected while ' + 'waiting for `%s`.', id) : invariant(false) : undefined; continue; } - invariant( - this.$Dispatcher_callbacks[id], - 'Dispatcher.waitFor(...): `%s` does not map to a registered callback.', - id - ); - this.$Dispatcher_invokeCallback(id); + !this._callbacks[id] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Dispatcher.waitFor(...): `%s` does not map to a registered callback.', id) : invariant(false) : undefined; + this._invokeCallback(id); } }; /** * Dispatches a payload to all registered callbacks. - * - * @param {object} payload */ - Dispatcher.prototype.dispatch=function(payload) { - invariant( - !this.$Dispatcher_isDispatching, - 'Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.' - ); - this.$Dispatcher_startDispatching(payload); + + Dispatcher.prototype.dispatch = function dispatch(payload) { + !!this._isDispatching ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.') : invariant(false) : undefined; + this._startDispatching(payload); try { - for (var id in this.$Dispatcher_callbacks) { - if (this.$Dispatcher_isPending[id]) { + for (var id in this._callbacks) { + if (this._isPending[id]) { continue; } - this.$Dispatcher_invokeCallback(id); + this._invokeCallback(id); } } finally { - this.$Dispatcher_stopDispatching(); + this._stopDispatching(); } }; /** * Is this Dispatcher currently dispatching. - * - * @return {boolean} */ - Dispatcher.prototype.isDispatching=function() { - return this.$Dispatcher_isDispatching; + + Dispatcher.prototype.isDispatching = function isDispatching() { + return this._isDispatching; }; /** * Call the callback stored with the given id. Also do some internal * bookkeeping. * - * @param {string} id * @internal */ - Dispatcher.prototype.$Dispatcher_invokeCallback=function(id) { - this.$Dispatcher_isPending[id] = true; - this.$Dispatcher_callbacks[id](this.$Dispatcher_pendingPayload); - this.$Dispatcher_isHandled[id] = true; + + Dispatcher.prototype._invokeCallback = function _invokeCallback(id) { + this._isPending[id] = true; + this._callbacks[id](this._pendingPayload); + this._isHandled[id] = true; }; /** * Set up bookkeeping needed when dispatching. * - * @param {object} payload * @internal */ - Dispatcher.prototype.$Dispatcher_startDispatching=function(payload) { - for (var id in this.$Dispatcher_callbacks) { - this.$Dispatcher_isPending[id] = false; - this.$Dispatcher_isHandled[id] = false; + + Dispatcher.prototype._startDispatching = function _startDispatching(payload) { + for (var id in this._callbacks) { + this._isPending[id] = false; + this._isHandled[id] = false; } - this.$Dispatcher_pendingPayload = payload; - this.$Dispatcher_isDispatching = true; + this._pendingPayload = payload; + this._isDispatching = true; }; /** @@ -330,17 +314,22 @@ var _prefix = 'ID_'; * * @internal */ - Dispatcher.prototype.$Dispatcher_stopDispatching=function() { - this.$Dispatcher_pendingPayload = null; - this.$Dispatcher_isDispatching = false; + + Dispatcher.prototype._stopDispatching = function _stopDispatching() { + delete this._pendingPayload; + this._isDispatching = false; }; + return Dispatcher; +})(); module.exports = Dispatcher; +}).call(this,require('_process')) -},{"./invariant":3}],3:[function(require,module,exports){ +},{"_process":1,"fbjs/lib/invariant":3}],3:[function(require,module,exports){ +(function (process){ /** - * Copyright (c) 2014, Facebook, Inc. + * Copyright 2013-2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the @@ -363,8 +352,8 @@ module.exports = Dispatcher; * will remain to ensure logic does not differ in production. */ -var invariant = function(condition, format, a, b, c, d, e, f) { - if (false) { +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'); } @@ -373,17 +362,13 @@ var invariant = function(condition, format, a, b, c, d, e, f) { 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.' - ); + 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 = new Error('Invariant Violation: ' + format.replace(/%s/g, function () { + return args[argIndex++]; + })); } error.framesToPop = 1; // we don't care about invariant's own frame @@ -392,438 +377,23 @@ var invariant = function(condition, format, a, b, c, d, e, f) { }; module.exports = invariant; +}).call(this,require('_process')) -},{}],4:[function(require,module,exports){ -module.exports = require('./lib/'); - -},{"./lib/":5}],5:[function(require,module,exports){ -// Load modules - -var Stringify = require('./stringify'); -var Parse = require('./parse'); - - -// Declare internals - -var internals = {}; - - -module.exports = { - stringify: Stringify, - parse: Parse -}; - -},{"./parse":6,"./stringify":7}],6:[function(require,module,exports){ -// Load modules - -var Utils = require('./utils'); - - -// Declare internals - -var internals = { - delimiter: '&', - depth: 5, - arrayLimit: 20, - parameterLimit: 1000 -}; - - -internals.parseValues = function (str, options) { - - var obj = {}; - var parts = str.split(options.delimiter, options.parameterLimit === Infinity ? undefined : options.parameterLimit); - - for (var i = 0, il = parts.length; i < il; ++i) { - var part = parts[i]; - var pos = part.indexOf(']=') === -1 ? part.indexOf('=') : part.indexOf(']=') + 1; - - if (pos === -1) { - obj[Utils.decode(part)] = ''; - } - else { - var key = Utils.decode(part.slice(0, pos)); - var val = Utils.decode(part.slice(pos + 1)); - - if (Object.prototype.hasOwnProperty(key)) { - continue; - } - - if (!obj.hasOwnProperty(key)) { - obj[key] = val; - } - else { - obj[key] = [].concat(obj[key]).concat(val); - } - } - } - - return obj; -}; - - -internals.parseObject = function (chain, val, options) { - - if (!chain.length) { - return val; - } - - var root = chain.shift(); - - var obj = {}; - if (root === '[]') { - obj = []; - obj = obj.concat(internals.parseObject(chain, val, options)); - } - else { - var cleanRoot = root[0] === '[' && root[root.length - 1] === ']' ? root.slice(1, root.length - 1) : root; - var index = parseInt(cleanRoot, 10); - var indexString = '' + index; - if (!isNaN(index) && - root !== cleanRoot && - indexString === cleanRoot && - index >= 0 && - index <= options.arrayLimit) { - - obj = []; - obj[index] = internals.parseObject(chain, val, options); - } - else { - obj[cleanRoot] = internals.parseObject(chain, val, options); - } - } - - return obj; -}; - - -internals.parseKeys = function (key, val, options) { - - if (!key) { - return; - } - - // The regex chunks - - var parent = /^([^\[\]]*)/; - var child = /(\[[^\[\]]*\])/g; - - // Get the parent - - var segment = parent.exec(key); - - // Don't allow them to overwrite object prototype properties - - if (Object.prototype.hasOwnProperty(segment[1])) { - return; - } - - // Stash the parent if it exists - - var keys = []; - if (segment[1]) { - keys.push(segment[1]); - } - - // Loop through children appending to the array until we hit depth - - var i = 0; - while ((segment = child.exec(key)) !== null && i < options.depth) { - - ++i; - if (!Object.prototype.hasOwnProperty(segment[1].replace(/\[|\]/g, ''))) { - keys.push(segment[1]); - } - } - - // If there's a remainder, just add whatever is left - - if (segment) { - keys.push('[' + key.slice(segment.index) + ']'); - } - - return internals.parseObject(keys, val, options); -}; - - -module.exports = function (str, options) { - - if (str === '' || - str === null || - typeof str === 'undefined') { - - return {}; - } - - options = options || {}; - options.delimiter = typeof options.delimiter === 'string' || Utils.isRegExp(options.delimiter) ? options.delimiter : internals.delimiter; - options.depth = typeof options.depth === 'number' ? options.depth : internals.depth; - options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : internals.arrayLimit; - options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : internals.parameterLimit; - - var tempObj = typeof str === 'string' ? internals.parseValues(str, options) : str; - var obj = {}; - - // Iterate over the keys and setup the new object - - var keys = Object.keys(tempObj); - for (var i = 0, il = keys.length; i < il; ++i) { - var key = keys[i]; - var newObj = internals.parseKeys(key, tempObj[key], options); - obj = Utils.merge(obj, newObj); - } - - return Utils.compact(obj); -}; - -},{"./utils":8}],7:[function(require,module,exports){ -// Load modules - -var Utils = require('./utils'); - - -// Declare internals - -var internals = { - delimiter: '&', - arrayPrefixGenerators: { - brackets: function (prefix, key) { - return prefix + '[]'; - }, - indices: function (prefix, key) { - return prefix + '[' + key + ']'; - }, - repeat: function (prefix, key) { - return prefix; - } - } -}; - - -internals.stringify = function (obj, prefix, generateArrayPrefix) { - - if (Utils.isBuffer(obj)) { - obj = obj.toString(); - } - else if (obj instanceof Date) { - obj = obj.toISOString(); - } - else if (obj === null) { - obj = ''; - } - - if (typeof obj === 'string' || - typeof obj === 'number' || - typeof obj === 'boolean') { - - return [encodeURIComponent(prefix) + '=' + encodeURIComponent(obj)]; - } - - var values = []; - - if (typeof obj === 'undefined') { - return values; - } - - var objKeys = Object.keys(obj); - for (var i = 0, il = objKeys.length; i < il; ++i) { - var key = objKeys[i]; - if (Array.isArray(obj)) { - values = values.concat(internals.stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix)); - } - else { - values = values.concat(internals.stringify(obj[key], prefix + '[' + key + ']', generateArrayPrefix)); - } - } - - return values; -}; - - -module.exports = function (obj, options) { - - options = options || {}; - var delimiter = typeof options.delimiter === 'undefined' ? internals.delimiter : options.delimiter; - - var keys = []; - - if (typeof obj !== 'object' || - obj === null) { - - return ''; - } - - var arrayFormat; - if (options.arrayFormat in internals.arrayPrefixGenerators) { - arrayFormat = options.arrayFormat; - } - else if ('indices' in options) { - arrayFormat = options.indices ? 'indices' : 'repeat'; - } - else { - arrayFormat = 'indices'; - } - - var generateArrayPrefix = internals.arrayPrefixGenerators[arrayFormat]; - - var objKeys = Object.keys(obj); - for (var i = 0, il = objKeys.length; i < il; ++i) { - var key = objKeys[i]; - keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix)); - } - - return keys.join(delimiter); -}; - -},{"./utils":8}],8:[function(require,module,exports){ -// Load modules - - -// Declare internals - -var internals = {}; - - -exports.arrayToObject = function (source) { - - var obj = {}; - for (var i = 0, il = source.length; i < il; ++i) { - if (typeof source[i] !== 'undefined') { - - obj[i] = source[i]; - } - } - - return obj; -}; - - -exports.merge = function (target, source) { - - if (!source) { - return target; - } - - if (typeof source !== 'object') { - if (Array.isArray(target)) { - target.push(source); - } - else { - target[source] = true; - } - - return target; - } - - if (typeof target !== 'object') { - target = [target].concat(source); - return target; - } - - if (Array.isArray(target) && - !Array.isArray(source)) { - - target = exports.arrayToObject(target); - } - - var keys = Object.keys(source); - for (var k = 0, kl = keys.length; k < kl; ++k) { - var key = keys[k]; - var value = source[key]; - - if (!target[key]) { - target[key] = value; - } - else { - target[key] = exports.merge(target[key], value); - } - } - - return target; -}; - - -exports.decode = function (str) { - - try { - return decodeURIComponent(str.replace(/\+/g, ' ')); - } catch (e) { - return str; - } -}; - - -exports.compact = function (obj, refs) { - - if (typeof obj !== 'object' || - obj === null) { - - return obj; - } - - refs = refs || []; - var lookup = refs.indexOf(obj); - if (lookup !== -1) { - return refs[lookup]; - } - - refs.push(obj); - - if (Array.isArray(obj)) { - var compacted = []; - - for (var i = 0, il = obj.length; i < il; ++i) { - if (typeof obj[i] !== 'undefined') { - compacted.push(obj[i]); - } - } - - return compacted; - } - - var keys = Object.keys(obj); - for (i = 0, il = keys.length; i < il; ++i) { - var key = keys[i]; - obj[key] = exports.compact(obj[key], refs); - } - - return obj; -}; - - -exports.isRegExp = function (obj) { - return Object.prototype.toString.call(obj) === '[object RegExp]'; -}; - - -exports.isBuffer = function (obj) { - - if (obj === null || - typeof obj === 'undefined') { - - return false; - } - - return !!(obj.constructor && - obj.constructor.isBuffer && - obj.constructor.isBuffer(obj)); -}; - -},{}],9:[function(require,module,exports){ -"use strict"; - +},{"_process":1}],4:[function(require,module,exports){ /** * Represents a cancellation caused by navigating away * before the previous transition has fully resolved. */ +"use strict"; + function Cancellation() {} module.exports = Cancellation; -},{}],10:[function(require,module,exports){ -"use strict"; +},{}],5:[function(require,module,exports){ +'use strict'; -var invariant = require("react/lib/invariant"); -var canUseDOM = require("react/lib/ExecutionEnvironment").canUseDOM; +var invariant = require('react/lib/invariant'); +var canUseDOM = require('react/lib/ExecutionEnvironment').canUseDOM; var History = { @@ -838,7 +408,7 @@ var History = { * Sends the browser back one entry in the history. */ back: function back() { - invariant(canUseDOM, "Cannot use History.back without a DOM"); + invariant(canUseDOM, 'Cannot use History.back without a DOM'); // Do this first so that History.length will // be accurate in location change listeners. @@ -850,15 +420,15 @@ var History = { }; module.exports = History; -},{"react/lib/ExecutionEnvironment":62,"react/lib/invariant":191}],11:[function(require,module,exports){ -"use strict"; +},{"react/lib/ExecutionEnvironment":62,"react/lib/invariant":191}],6:[function(require,module,exports){ +'use strict'; -var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); +var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }; -var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; +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; }; })(); /* jshint -W084 */ -var PathUtils = require("./PathUtils"); +var PathUtils = require('./PathUtils'); function deepSearch(route, pathname, query) { // Check the subtree first to find the most deeply-nested match. @@ -903,44 +473,33 @@ var Match = (function () { this.routes = routes; } - _createClass(Match, null, { - findMatch: { + _createClass(Match, null, [{ + key: 'findMatch', - /** - * Attempts to match depth-first a route in the given route's - * subtree against the given path and returns the match if it - * succeeds, null if no match can be made. - */ - - value: function findMatch(routes, path) { - var pathname = PathUtils.withoutQuery(path); - var query = PathUtils.extractQuery(path); - var match = null; + /** + * Attempts to match depth-first a route in the given route's + * subtree against the given path and returns the match if it + * succeeds, null if no match can be made. + */ + value: function findMatch(routes, path) { + var pathname = PathUtils.withoutQuery(path); + var query = PathUtils.extractQuery(path); + var match = null; - for (var i = 0, len = routes.length; match == null && i < len; ++i) match = deepSearch(routes[i], pathname, query); + for (var i = 0, len = routes.length; match == null && i < len; ++i) match = deepSearch(routes[i], pathname, query); - return match; - } + return match; } - }); + }]); return Match; })(); module.exports = Match; -},{"./PathUtils":13}],12:[function(require,module,exports){ -"use strict"; - -var warning = require("react/lib/warning"); -var PropTypes = require("./PropTypes"); +},{"./PathUtils":8}],7:[function(require,module,exports){ +'use strict'; -function deprecatedMethod(routerMethodName, fn) { - return function () { - warning(false, "Router.Navigation is deprecated. Please use this.context.router." + routerMethodName + "() instead"); - - return fn.apply(this, arguments); - }; -} +var PropTypes = require('./PropTypes'); /** * A mixin for components that modify the URL. @@ -970,50 +529,50 @@ var Navigation = { * Returns an absolute URL path created from the given route * name, URL parameters, and query values. */ - makePath: deprecatedMethod("makePath", function (to, params, query) { + makePath: function makePath(to, params, query) { return this.context.router.makePath(to, params, query); - }), + }, /** * Returns a string that may safely be used as the href of a * link to the route with the given name. */ - makeHref: deprecatedMethod("makeHref", function (to, params, query) { + makeHref: function makeHref(to, params, query) { return this.context.router.makeHref(to, params, query); - }), + }, /** * Transitions to the URL specified in the arguments by pushing * a new URL onto the history stack. */ - transitionTo: deprecatedMethod("transitionTo", function (to, params, query) { + transitionTo: function transitionTo(to, params, query) { this.context.router.transitionTo(to, params, query); - }), + }, /** * Transitions to the URL specified in the arguments by replacing * the current URL in the history stack. */ - replaceWith: deprecatedMethod("replaceWith", function (to, params, query) { + replaceWith: function replaceWith(to, params, query) { this.context.router.replaceWith(to, params, query); - }), + }, /** * Transitions to the previous URL. */ - goBack: deprecatedMethod("goBack", function () { + goBack: function goBack() { return this.context.router.goBack(); - }) + } }; module.exports = Navigation; -},{"./PropTypes":14,"react/lib/warning":212}],13:[function(require,module,exports){ -"use strict"; +},{"./PropTypes":9}],8:[function(require,module,exports){ +'use strict'; -var invariant = require("react/lib/invariant"); -var objectAssign = require("object-assign"); -var qs = require("qs"); +var invariant = require('react/lib/invariant'); +var assign = require('object-assign'); +var qs = require('qs'); var paramCompileMatcher = /:([a-zA-Z_$][a-zA-Z0-9_$]*)|[*.()\[\]\\+|{}^$]/g; var paramInjectMatcher = /:([a-zA-Z_$][a-zA-Z0-9_$?]*[?]?)|[*]/g; @@ -1028,17 +587,17 @@ function compilePattern(pattern) { var source = pattern.replace(paramCompileMatcher, function (match, paramName) { if (paramName) { paramNames.push(paramName); - return "([^/?#]+)"; - } else if (match === "*") { - paramNames.push("splat"); - return "(.*?)"; + return '([^/?#]+)'; + } else if (match === '*') { + paramNames.push('splat'); + return '(.*?)'; } else { - return "\\" + match; + return '\\' + match; } }); _compiledPatterns[pattern] = { - matcher: new RegExp("^" + source + "$", "i"), + matcher: new RegExp('^' + source + '$', 'i'), paramNames: paramNames }; } @@ -1052,14 +611,14 @@ var PathUtils = { * Returns true if the given path is absolute. */ isAbsolute: function isAbsolute(path) { - return path.charAt(0) === "/"; + return path.charAt(0) === '/'; }, /** * Joins two URL paths together. */ join: function join(a, b) { - return a.replace(/\/*$/, "/") + b; + return a.replace(/\/*$/, '/') + b; }, /** @@ -1103,28 +662,28 @@ var PathUtils = { var splatIndex = 0; return pattern.replace(paramInjectMatcher, function (match, paramName) { - paramName = paramName || "splat"; + paramName = paramName || 'splat'; // If param is optional don't check for existence - if (paramName.slice(-1) === "?") { + if (paramName.slice(-1) === '?') { paramName = paramName.slice(0, -1); - if (params[paramName] == null) return ""; + if (params[paramName] == null) return ''; } else { - invariant(params[paramName] != null, "Missing \"%s\" parameter for path \"%s\"", paramName, pattern); + invariant(params[paramName] != null, 'Missing "%s" parameter for path "%s"', paramName, pattern); } var segment; - if (paramName === "splat" && Array.isArray(params[paramName])) { + if (paramName === 'splat' && Array.isArray(params[paramName])) { segment = params[paramName][splatIndex++]; - invariant(segment != null, "Missing splat # %s for path \"%s\"", splatIndex, pattern); + invariant(segment != null, 'Missing splat # %s for path "%s"', splatIndex, pattern); } else { segment = params[paramName]; } return segment; - }).replace(paramInjectTrailingSlashMatcher, "/"); + }).replace(paramInjectTrailingSlashMatcher, '/'); }, /** @@ -1140,7 +699,7 @@ var PathUtils = { * Returns a version of the given path without the query string. */ withoutQuery: function withoutQuery(path) { - return path.replace(queryMatcher, ""); + return path.replace(queryMatcher, ''); }, /** @@ -1150,24 +709,24 @@ var PathUtils = { withQuery: function withQuery(path, query) { var existingQuery = PathUtils.extractQuery(path); - if (existingQuery) query = query ? objectAssign(existingQuery, query) : existingQuery; + if (existingQuery) query = query ? assign(existingQuery, query) : existingQuery; - var queryString = qs.stringify(query, { arrayFormat: "brackets" }); + var queryString = qs.stringify(query, { arrayFormat: 'brackets' }); if (queryString) { - return PathUtils.withoutQuery(path) + "?" + queryString; + return PathUtils.withoutQuery(path) + '?' + queryString; }return PathUtils.withoutQuery(path); } }; module.exports = PathUtils; -},{"object-assign":41,"qs":4,"react/lib/invariant":191}],14:[function(require,module,exports){ -"use strict"; +},{"object-assign":36,"qs":37,"react/lib/invariant":191}],9:[function(require,module,exports){ +'use strict'; -var assign = require("react/lib/Object.assign"); -var ReactPropTypes = require("react").PropTypes; -var Route = require("./Route"); +var assign = require('react/lib/Object.assign'); +var ReactPropTypes = require('react').PropTypes; +var Route = require('./Route'); var PropTypes = assign({}, ReactPropTypes, { @@ -1176,7 +735,7 @@ var PropTypes = assign({}, ReactPropTypes, { */ falsy: function falsy(props, propName, componentName) { if (props[propName]) { - return new Error("<" + componentName + "> may not have a \"" + propName + "\" prop"); + return new Error('<' + componentName + '> should not have a "' + propName + '" prop'); } }, @@ -1194,12 +753,12 @@ var PropTypes = assign({}, ReactPropTypes, { }); module.exports = PropTypes; -},{"./Route":16,"react":"react","react/lib/Object.assign":69}],15:[function(require,module,exports){ -"use strict"; - +},{"./Route":11,"react":"react","react/lib/Object.assign":69}],10:[function(require,module,exports){ /** * Encapsulates a redirect to the given route. */ +"use strict"; + function Redirect(to, params, query) { this.to = to; this.params = params; @@ -1207,17 +766,17 @@ function Redirect(to, params, query) { } module.exports = Redirect; -},{}],16:[function(require,module,exports){ -"use strict"; +},{}],11:[function(require,module,exports){ +'use strict'; -var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); +var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }; -var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; +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 assign = require("react/lib/Object.assign"); -var invariant = require("react/lib/invariant"); -var warning = require("react/lib/warning"); -var PathUtils = require("./PathUtils"); +var assign = require('react/lib/Object.assign'); +var invariant = require('react/lib/invariant'); +var warning = require('react/lib/warning'); +var PathUtils = require('./PathUtils'); var _currentRoute; @@ -1236,191 +795,184 @@ var Route = (function () { this.handler = handler; } - _createClass(Route, { - appendChild: { - - /** - * Appends the given route to this route's child routes. - */ - - value: function appendChild(route) { - invariant(route instanceof Route, "route.appendChild must use a valid Route"); + _createClass(Route, [{ + key: 'appendChild', - if (!this.childRoutes) this.childRoutes = []; - - this.childRoutes.push(route); - } - }, - toString: { - value: function toString() { - var string = "<Route"; - - if (this.name) string += " name=\"" + this.name + "\""; + /** + * Appends the given route to this route's child routes. + */ + value: function appendChild(route) { + invariant(route instanceof Route, 'route.appendChild must use a valid Route'); - string += " path=\"" + this.path + "\">"; + if (!this.childRoutes) this.childRoutes = []; - return string; - } + this.childRoutes.push(route); } }, { - createRoute: { - - /** - * Creates and returns a new route. Options may be a URL pathname string - * with placeholders for named params or an object with any of the following - * properties: - * - * - name The name of the route. This is used to lookup a - * route relative to its parent route and should be - * unique among all child routes of the same parent - * - path A URL pathname string with optional placeholders - * that specify the names of params to extract from - * the URL when the path matches. Defaults to `/${name}` - * when there is a name given, or the path of the parent - * route, or / - * - ignoreScrollBehavior True to make this route (and all descendants) ignore - * the scroll behavior of the router - * - isDefault True to make this route the default route among all - * its siblings - * - isNotFound True to make this route the "not found" route among - * all its siblings - * - onEnter A transition hook that will be called when the - * router is going to enter this route - * - onLeave A transition hook that will be called when the - * router is going to leave this route - * - handler A React component that will be rendered when - * this route is active - * - parentRoute The parent route to use for this route. This option - * is automatically supplied when creating routes inside - * the callback to another invocation of createRoute. You - * only ever need to use this when declaring routes - * independently of one another to manually piece together - * the route hierarchy - * - * The callback may be used to structure your route hierarchy. Any call to - * createRoute, createDefaultRoute, createNotFoundRoute, or createRedirect - * inside the callback automatically uses this route as its parent. - */ - - value: function createRoute(options, callback) { - options = options || {}; - - if (typeof options === "string") options = { path: options }; - - var parentRoute = _currentRoute; - - if (parentRoute) { - warning(options.parentRoute == null || options.parentRoute === parentRoute, "You should not use parentRoute with createRoute inside another route's child callback; it is ignored"); - } else { - parentRoute = options.parentRoute; - } + key: 'toString', + value: function toString() { + var string = '<Route'; + + if (this.name) string += ' name="' + this.name + '"'; + + string += ' path="' + this.path + '">'; + + return string; + } + }], [{ + key: 'createRoute', + + /** + * Creates and returns a new route. Options may be a URL pathname string + * with placeholders for named params or an object with any of the following + * properties: + * + * - name The name of the route. This is used to lookup a + * route relative to its parent route and should be + * unique among all child routes of the same parent + * - path A URL pathname string with optional placeholders + * that specify the names of params to extract from + * the URL when the path matches. Defaults to `/${name}` + * when there is a name given, or the path of the parent + * route, or / + * - ignoreScrollBehavior True to make this route (and all descendants) ignore + * the scroll behavior of the router + * - isDefault True to make this route the default route among all + * its siblings + * - isNotFound True to make this route the "not found" route among + * all its siblings + * - onEnter A transition hook that will be called when the + * router is going to enter this route + * - onLeave A transition hook that will be called when the + * router is going to leave this route + * - handler A React component that will be rendered when + * this route is active + * - parentRoute The parent route to use for this route. This option + * is automatically supplied when creating routes inside + * the callback to another invocation of createRoute. You + * only ever need to use this when declaring routes + * independently of one another to manually piece together + * the route hierarchy + * + * The callback may be used to structure your route hierarchy. Any call to + * createRoute, createDefaultRoute, createNotFoundRoute, or createRedirect + * inside the callback automatically uses this route as its parent. + */ + value: function createRoute(options, callback) { + options = options || {}; + + if (typeof options === 'string') options = { path: options }; + + var parentRoute = _currentRoute; + + if (parentRoute) { + warning(options.parentRoute == null || options.parentRoute === parentRoute, 'You should not use parentRoute with createRoute inside another route\'s child callback; it is ignored'); + } else { + parentRoute = options.parentRoute; + } - var name = options.name; - var path = options.path || name; + var name = options.name; + var path = options.path || name; - if (path && !(options.isDefault || options.isNotFound)) { - if (PathUtils.isAbsolute(path)) { - if (parentRoute) { - invariant(path === parentRoute.path || parentRoute.paramNames.length === 0, "You cannot nest path \"%s\" inside \"%s\"; the parent requires URL parameters", path, parentRoute.path); - } - } else if (parentRoute) { - // Relative paths extend their parent. - path = PathUtils.join(parentRoute.path, path); - } else { - path = "/" + path; + if (path && !(options.isDefault || options.isNotFound)) { + if (PathUtils.isAbsolute(path)) { + if (parentRoute) { + invariant(path === parentRoute.path || parentRoute.paramNames.length === 0, 'You cannot nest path "%s" inside "%s"; the parent requires URL parameters', path, parentRoute.path); } + } else if (parentRoute) { + // Relative paths extend their parent. + path = PathUtils.join(parentRoute.path, path); } else { - path = parentRoute ? parentRoute.path : "/"; + path = '/' + path; } + } else { + path = parentRoute ? parentRoute.path : '/'; + } - if (options.isNotFound && !/\*$/.test(path)) path += "*"; // Auto-append * to the path of not found routes. - - var route = new Route(name, path, options.ignoreScrollBehavior, options.isDefault, options.isNotFound, options.onEnter, options.onLeave, options.handler); - - if (parentRoute) { - if (route.isDefault) { - invariant(parentRoute.defaultRoute == null, "%s may not have more than one default route", parentRoute); + if (options.isNotFound && !/\*$/.test(path)) path += '*'; // Auto-append * to the path of not found routes. - parentRoute.defaultRoute = route; - } else if (route.isNotFound) { - invariant(parentRoute.notFoundRoute == null, "%s may not have more than one not found route", parentRoute); + var route = new Route(name, path, options.ignoreScrollBehavior, options.isDefault, options.isNotFound, options.onEnter, options.onLeave, options.handler); - parentRoute.notFoundRoute = route; - } + if (parentRoute) { + if (route.isDefault) { + invariant(parentRoute.defaultRoute == null, '%s may not have more than one default route', parentRoute); - parentRoute.appendChild(route); - } + parentRoute.defaultRoute = route; + } else if (route.isNotFound) { + invariant(parentRoute.notFoundRoute == null, '%s may not have more than one not found route', parentRoute); - // Any routes created in the callback - // use this route as their parent. - if (typeof callback === "function") { - var currentRoute = _currentRoute; - _currentRoute = route; - callback.call(route, route); - _currentRoute = currentRoute; + parentRoute.notFoundRoute = route; } - return route; + parentRoute.appendChild(route); } - }, - createDefaultRoute: { - - /** - * Creates and returns a route that is rendered when its parent matches - * the current URL. - */ - value: function createDefaultRoute(options) { - return Route.createRoute(assign({}, options, { isDefault: true })); + // Any routes created in the callback + // use this route as their parent. + if (typeof callback === 'function') { + var currentRoute = _currentRoute; + _currentRoute = route; + callback.call(route, route); + _currentRoute = currentRoute; } - }, - createNotFoundRoute: { - /** - * Creates and returns a route that is rendered when its parent matches - * the current URL but none of its siblings do. - */ + return route; + } + }, { + key: 'createDefaultRoute', - value: function createNotFoundRoute(options) { - return Route.createRoute(assign({}, options, { isNotFound: true })); - } - }, - createRedirect: { + /** + * Creates and returns a route that is rendered when its parent matches + * the current URL. + */ + value: function createDefaultRoute(options) { + return Route.createRoute(assign({}, options, { isDefault: true })); + } + }, { + key: 'createNotFoundRoute', - /** - * Creates and returns a route that automatically redirects the transition - * to another route. In addition to the normal options to createRoute, this - * function accepts the following options: - * - * - from An alias for the `path` option. Defaults to * - * - to The path/route/route name to redirect to - * - params The params to use in the redirect URL. Defaults - * to using the current params - * - query The query to use in the redirect URL. Defaults - * to using the current query - */ + /** + * Creates and returns a route that is rendered when its parent matches + * the current URL but none of its siblings do. + */ + value: function createNotFoundRoute(options) { + return Route.createRoute(assign({}, options, { isNotFound: true })); + } + }, { + key: 'createRedirect', - value: function createRedirect(options) { - return Route.createRoute(assign({}, options, { - path: options.path || options.from || "*", - onEnter: function onEnter(transition, params, query) { - transition.redirect(options.to, options.params || params, options.query || query); - } - })); - } + /** + * Creates and returns a route that automatically redirects the transition + * to another route. In addition to the normal options to createRoute, this + * function accepts the following options: + * + * - from An alias for the `path` option. Defaults to * + * - to The path/route/route name to redirect to + * - params The params to use in the redirect URL. Defaults + * to using the current params + * - query The query to use in the redirect URL. Defaults + * to using the current query + */ + value: function createRedirect(options) { + return Route.createRoute(assign({}, options, { + path: options.path || options.from || '*', + onEnter: function onEnter(transition, params, query) { + transition.redirect(options.to, options.params || params, options.query || query); + } + })); } - }); + }]); return Route; })(); module.exports = Route; -},{"./PathUtils":13,"react/lib/Object.assign":69,"react/lib/invariant":191,"react/lib/warning":212}],17:[function(require,module,exports){ -"use strict"; +},{"./PathUtils":8,"react/lib/Object.assign":69,"react/lib/invariant":191,"react/lib/warning":212}],12:[function(require,module,exports){ +'use strict'; -var invariant = require("react/lib/invariant"); -var canUseDOM = require("react/lib/ExecutionEnvironment").canUseDOM; -var getWindowScrollPosition = require("./getWindowScrollPosition"); +var invariant = require('react/lib/invariant'); +var canUseDOM = require('react/lib/ExecutionEnvironment').canUseDOM; +var getWindowScrollPosition = require('./getWindowScrollPosition'); function shouldUpdateScroll(state, prevState) { if (!prevState) { @@ -1469,7 +1021,7 @@ var ScrollHistory = { }, componentWillMount: function componentWillMount() { - invariant(this.constructor.getScrollBehavior() == null || canUseDOM, "Cannot use scroll behavior without a DOM"); + invariant(this.constructor.getScrollBehavior() == null || canUseDOM, 'Cannot use scroll behavior without a DOM'); }, componentDidMount: function componentDidMount() { @@ -1491,19 +1043,10 @@ var ScrollHistory = { }; module.exports = ScrollHistory; -},{"./getWindowScrollPosition":32,"react/lib/ExecutionEnvironment":62,"react/lib/invariant":191}],18:[function(require,module,exports){ -"use strict"; - -var warning = require("react/lib/warning"); -var PropTypes = require("./PropTypes"); - -function deprecatedMethod(routerMethodName, fn) { - return function () { - warning(false, "Router.State is deprecated. Please use this.context.router." + routerMethodName + "() instead"); +},{"./getWindowScrollPosition":27,"react/lib/ExecutionEnvironment":62,"react/lib/invariant":191}],13:[function(require,module,exports){ +'use strict'; - return fn.apply(this, arguments); - }; -} +var PropTypes = require('./PropTypes'); /** * A mixin for components that need to know the path, routes, URL @@ -1515,10 +1058,10 @@ function deprecatedMethod(routerMethodName, fn) { * mixins: [ Router.State ], * render() { * var className = this.props.className; - * + * * if (this.isActive('about')) * className += ' is-active'; - * + * * return React.DOM.a({ className: className }, this.props.children); * } * }); @@ -1532,56 +1075,56 @@ var State = { /** * Returns the current URL path. */ - getPath: deprecatedMethod("getCurrentPath", function () { + getPath: function getPath() { return this.context.router.getCurrentPath(); - }), + }, /** * Returns the current URL path without the query string. */ - getPathname: deprecatedMethod("getCurrentPathname", function () { + getPathname: function getPathname() { return this.context.router.getCurrentPathname(); - }), + }, /** * Returns an object of the URL params that are currently active. */ - getParams: deprecatedMethod("getCurrentParams", function () { + getParams: function getParams() { return this.context.router.getCurrentParams(); - }), + }, /** * Returns an object of the query params that are currently active. */ - getQuery: deprecatedMethod("getCurrentQuery", function () { + getQuery: function getQuery() { return this.context.router.getCurrentQuery(); - }), + }, /** * Returns an array of the routes that are currently active. */ - getRoutes: deprecatedMethod("getCurrentRoutes", function () { + getRoutes: function getRoutes() { return this.context.router.getCurrentRoutes(); - }), + }, /** * A helper method to determine if a given route, params, and query * are active. */ - isActive: deprecatedMethod("isActive", function (to, params, query) { + isActive: function isActive(to, params, query) { return this.context.router.isActive(to, params, query); - }) + } }; module.exports = State; -},{"./PropTypes":14,"react/lib/warning":212}],19:[function(require,module,exports){ -"use strict"; - +},{"./PropTypes":9}],14:[function(require,module,exports){ /* jshint -W058 */ -var Cancellation = require("./Cancellation"); -var Redirect = require("./Redirect"); +'use strict'; + +var Cancellation = require('./Cancellation'); +var Redirect = require('./Redirect'); /** * Encapsulates a transition to a given path. @@ -1597,7 +1140,7 @@ function Transition(path, retry) { } Transition.prototype.abort = function (reason) { - if (this.abortReason == null) this.abortReason = reason || "ABORT"; + if (this.abortReason == null) this.abortReason = reason || 'ABORT'; }; Transition.prototype.redirect = function (to, params, query) { @@ -1651,36 +1194,36 @@ Transition.to = function (transition, routes, params, query, callback) { }; module.exports = Transition; -},{"./Cancellation":9,"./Redirect":15}],20:[function(require,module,exports){ -"use strict"; - +},{"./Cancellation":4,"./Redirect":10}],15:[function(require,module,exports){ /** * Actions that modify the URL. */ +'use strict'; + var LocationActions = { /** * Indicates a new location is being pushed to the history stack. */ - PUSH: "push", + PUSH: 'push', /** * Indicates the current location should be replaced. */ - REPLACE: "replace", + REPLACE: 'replace', /** * Indicates the most recent entry should be removed from the history stack. */ - POP: "pop" + POP: 'pop' }; module.exports = LocationActions; -},{}],21:[function(require,module,exports){ -"use strict"; +},{}],16:[function(require,module,exports){ +'use strict'; -var LocationActions = require("../actions/LocationActions"); +var LocationActions = require('../actions/LocationActions'); /** * A scroll behavior that attempts to imitate the default behavior @@ -1707,13 +1250,13 @@ var ImitateBrowserBehavior = { }; module.exports = ImitateBrowserBehavior; -},{"../actions/LocationActions":20}],22:[function(require,module,exports){ -"use strict"; - +},{"../actions/LocationActions":15}],17:[function(require,module,exports){ /** * A scroll behavior that always scrolls to the top of the page * after a transition. */ +"use strict"; + var ScrollToTopBehavior = { updateScrollPosition: function updateScrollPosition() { @@ -1723,14 +1266,14 @@ var ScrollToTopBehavior = { }; module.exports = ScrollToTopBehavior; -},{}],23:[function(require,module,exports){ -"use strict"; +},{}],18:[function(require,module,exports){ +'use strict'; -var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); +var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }; -var _inherits = function (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) subClass.__proto__ = superClass; }; +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 _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; +var _inherits = function (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) subClass.__proto__ = superClass; }; /** * This component is necessary to get around a context warning @@ -1738,7 +1281,7 @@ var _classCallCheck = function (instance, Constructor) { if (!(instance instance * between the "owner" and "parent" contexts. */ -var React = require("react"); +var React = require('react'); var ContextWrapper = (function (_React$Component) { function ContextWrapper() { @@ -1751,28 +1294,27 @@ var ContextWrapper = (function (_React$Component) { _inherits(ContextWrapper, _React$Component); - _createClass(ContextWrapper, { - render: { - value: function render() { - return this.props.children; - } + _createClass(ContextWrapper, [{ + key: 'render', + value: function render() { + return this.props.children; } - }); + }]); return ContextWrapper; })(React.Component); module.exports = ContextWrapper; -},{"react":"react"}],24:[function(require,module,exports){ -"use strict"; +},{"react":"react"}],19:[function(require,module,exports){ +'use strict'; -var _inherits = function (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) subClass.__proto__ = superClass; }; +var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }; -var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; +var _inherits = function (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) subClass.__proto__ = superClass; }; -var PropTypes = require("../PropTypes"); -var RouteHandler = require("./RouteHandler"); -var Route = require("./Route"); +var PropTypes = require('../PropTypes'); +var RouteHandler = require('./RouteHandler'); +var Route = require('./Route'); /** * A <DefaultRoute> component is a special kind of <Route> that @@ -1811,18 +1353,18 @@ DefaultRoute.defaultProps = { }; module.exports = DefaultRoute; -},{"../PropTypes":14,"./Route":28,"./RouteHandler":29}],25:[function(require,module,exports){ -"use strict"; +},{"../PropTypes":9,"./Route":23,"./RouteHandler":24}],20:[function(require,module,exports){ +'use strict'; -var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); +var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }; -var _inherits = function (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) subClass.__proto__ = superClass; }; +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 _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; +var _inherits = function (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) subClass.__proto__ = superClass; }; -var React = require("react"); -var assign = require("react/lib/Object.assign"); -var PropTypes = require("../PropTypes"); +var React = require('react'); +var assign = require('react/lib/Object.assign'); +var PropTypes = require('../PropTypes'); function isLeftClickEvent(event) { return event.button === 0; @@ -1862,67 +1404,64 @@ var Link = (function (_React$Component) { _inherits(Link, _React$Component); - _createClass(Link, { - handleClick: { - value: function handleClick(event) { - var allowTransition = true; - var clickResult; - - if (this.props.onClick) clickResult = this.props.onClick(event); + _createClass(Link, [{ + key: 'handleClick', + value: function handleClick(event) { + var allowTransition = true; + var clickResult; - if (isModifiedEvent(event) || !isLeftClickEvent(event)) { - return; - }if (clickResult === false || event.defaultPrevented === true) allowTransition = false; - - event.preventDefault(); + if (this.props.onClick) clickResult = this.props.onClick(event); - if (allowTransition) this.context.router.transitionTo(this.props.to, this.props.params, this.props.query); - } - }, - getHref: { + if (isModifiedEvent(event) || !isLeftClickEvent(event)) { + return; + }if (clickResult === false || event.defaultPrevented === true) allowTransition = false; - /** - * Returns the value of the "href" attribute to use on the DOM element. - */ + event.preventDefault(); - value: function getHref() { - return this.context.router.makeHref(this.props.to, this.props.params, this.props.query); - } - }, - getClassName: { + if (allowTransition) this.context.router.transitionTo(this.props.to, this.props.params, this.props.query); + } + }, { + key: 'getHref', - /** - * Returns the value of the "class" attribute to use on the DOM element, which contains - * the value of the activeClassName property when this <Link> is active. - */ + /** + * Returns the value of the "href" attribute to use on the DOM element. + */ + value: function getHref() { + return this.context.router.makeHref(this.props.to, this.props.params, this.props.query); + } + }, { + key: 'getClassName', - value: function getClassName() { - var className = this.props.className; + /** + * Returns the value of the "class" attribute to use on the DOM element, which contains + * the value of the activeClassName property when this <Link> is active. + */ + value: function getClassName() { + var className = this.props.className; - if (this.getActiveState()) className += " " + this.props.activeClassName; + if (this.getActiveState()) className += ' ' + this.props.activeClassName; - return className; - } - }, - getActiveState: { - value: function getActiveState() { - return this.context.router.isActive(this.props.to, this.props.params, this.props.query); - } - }, - render: { - value: function render() { - var props = assign({}, this.props, { - href: this.getHref(), - className: this.getClassName(), - onClick: this.handleClick.bind(this) - }); + return className; + } + }, { + key: 'getActiveState', + value: function getActiveState() { + return this.context.router.isActive(this.props.to, this.props.params, this.props.query); + } + }, { + key: 'render', + value: function render() { + var props = assign({}, this.props, { + href: this.getHref(), + className: this.getClassName(), + onClick: this.handleClick.bind(this) + }); - if (props.activeStyle && this.getActiveState()) props.style = props.activeStyle; + if (props.activeStyle && this.getActiveState()) props.style = props.activeStyle; - return React.DOM.a(props, this.props.children); - } + return React.DOM.a(props, this.props.children); } - }); + }]); return Link; })(React.Component); @@ -1945,21 +1484,21 @@ Link.propTypes = { }; Link.defaultProps = { - activeClassName: "active", - className: "" + activeClassName: 'active', + className: '' }; module.exports = Link; -},{"../PropTypes":14,"react":"react","react/lib/Object.assign":69}],26:[function(require,module,exports){ -"use strict"; +},{"../PropTypes":9,"react":"react","react/lib/Object.assign":69}],21:[function(require,module,exports){ +'use strict'; -var _inherits = function (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) subClass.__proto__ = superClass; }; +var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }; -var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; +var _inherits = function (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) subClass.__proto__ = superClass; }; -var PropTypes = require("../PropTypes"); -var RouteHandler = require("./RouteHandler"); -var Route = require("./Route"); +var PropTypes = require('../PropTypes'); +var RouteHandler = require('./RouteHandler'); +var Route = require('./Route'); /** * A <NotFoundRoute> is a special kind of <Route> that @@ -1999,15 +1538,15 @@ NotFoundRoute.defaultProps = { }; module.exports = NotFoundRoute; -},{"../PropTypes":14,"./Route":28,"./RouteHandler":29}],27:[function(require,module,exports){ -"use strict"; +},{"../PropTypes":9,"./Route":23,"./RouteHandler":24}],22:[function(require,module,exports){ +'use strict'; -var _inherits = function (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) subClass.__proto__ = superClass; }; +var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }; -var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; +var _inherits = function (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) subClass.__proto__ = superClass; }; -var PropTypes = require("../PropTypes"); -var Route = require("./Route"); +var PropTypes = require('../PropTypes'); +var Route = require('./Route'); /** * A <Redirect> component is a special kind of <Route> that always @@ -2043,19 +1582,19 @@ Redirect.propTypes = { Redirect.defaultProps = {}; module.exports = Redirect; -},{"../PropTypes":14,"./Route":28}],28:[function(require,module,exports){ -"use strict"; +},{"../PropTypes":9,"./Route":23}],23:[function(require,module,exports){ +'use strict'; -var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); +var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }; -var _inherits = function (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) subClass.__proto__ = superClass; }; +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 _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; +var _inherits = function (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) subClass.__proto__ = superClass; }; -var React = require("react"); -var invariant = require("react/lib/invariant"); -var PropTypes = require("../PropTypes"); -var RouteHandler = require("./RouteHandler"); +var React = require('react'); +var invariant = require('react/lib/invariant'); +var PropTypes = require('../PropTypes'); +var RouteHandler = require('./RouteHandler'); /** * <Route> components specify components that are rendered to the page when the @@ -2109,13 +1648,12 @@ var Route = (function (_React$Component) { _inherits(Route, _React$Component); - _createClass(Route, { - render: { - value: function render() { - invariant(false, "%s elements are for router configuration only and should not be rendered", this.constructor.name); - } + _createClass(Route, [{ + key: 'render', + value: function render() { + invariant(false, '%s elements are for router configuration only and should not be rendered', this.constructor.name); } - }); + }]); return Route; })(React.Component); @@ -2136,21 +1674,21 @@ Route.defaultProps = { }; module.exports = Route; -},{"../PropTypes":14,"./RouteHandler":29,"react":"react","react/lib/invariant":191}],29:[function(require,module,exports){ -"use strict"; +},{"../PropTypes":9,"./RouteHandler":24,"react":"react","react/lib/invariant":191}],24:[function(require,module,exports){ +'use strict'; -var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); +var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }; -var _inherits = function (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) subClass.__proto__ = superClass; }; +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 _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; +var _inherits = function (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) subClass.__proto__ = superClass; }; -var React = require("react"); -var ContextWrapper = require("./ContextWrapper"); -var assign = require("react/lib/Object.assign"); -var PropTypes = require("../PropTypes"); +var React = require('react'); +var ContextWrapper = require('./ContextWrapper'); +var assign = require('react/lib/Object.assign'); +var PropTypes = require('../PropTypes'); -var REF_NAME = "__routeHandler__"; +var REF_NAME = '__routeHandler__'; /** * A <RouteHandler> component renders the active child route handler @@ -2168,57 +1706,65 @@ var RouteHandler = (function (_React$Component) { _inherits(RouteHandler, _React$Component); - _createClass(RouteHandler, { - getChildContext: { - value: function getChildContext() { - return { - routeDepth: this.context.routeDepth + 1 - }; - } - }, - componentDidMount: { - value: function componentDidMount() { - this._updateRouteComponent(this.refs[REF_NAME]); - } - }, - componentDidUpdate: { - value: function componentDidUpdate() { - this._updateRouteComponent(this.refs[REF_NAME]); - } - }, - componentWillUnmount: { - value: function componentWillUnmount() { - this._updateRouteComponent(null); - } - }, - _updateRouteComponent: { - value: function _updateRouteComponent(component) { - this.context.router.setRouteComponentAtDepth(this.getRouteDepth(), component); - } - }, - getRouteDepth: { - value: function getRouteDepth() { - return this.context.routeDepth; - } - }, - createChildRouteHandler: { - value: function createChildRouteHandler(props) { - var route = this.context.router.getRouteAtDepth(this.getRouteDepth()); - return route ? React.createElement(route.handler, assign({}, props || this.props, { ref: REF_NAME })) : null; - } - }, - render: { - value: function render() { - var handler = this.createChildRouteHandler(); - // <script/> for things like <CSSTransitionGroup/> that don't like null - return handler ? React.createElement( - ContextWrapper, - null, - handler - ) : React.createElement("script", null); - } + _createClass(RouteHandler, [{ + key: 'getChildContext', + value: function getChildContext() { + return { + routeDepth: this.context.routeDepth + 1 + }; } - }); + }, { + key: 'componentDidMount', + value: function componentDidMount() { + this._updateRouteComponent(this.refs[REF_NAME]); + } + }, { + key: 'componentDidUpdate', + value: function componentDidUpdate() { + this._updateRouteComponent(this.refs[REF_NAME]); + } + }, { + key: 'componentWillUnmount', + value: function componentWillUnmount() { + this._updateRouteComponent(null); + } + }, { + key: '_updateRouteComponent', + value: function _updateRouteComponent(component) { + this.context.router.setRouteComponentAtDepth(this.getRouteDepth(), component); + } + }, { + key: 'getRouteDepth', + value: function getRouteDepth() { + return this.context.routeDepth; + } + }, { + key: 'createChildRouteHandler', + value: function createChildRouteHandler(props) { + var route = this.context.router.getRouteAtDepth(this.getRouteDepth()); + + if (route == null) { + return null; + }var childProps = assign({}, props || this.props, { + ref: REF_NAME, + params: this.context.router.getCurrentParams(), + query: this.context.router.getCurrentQuery() + }); + + return React.createElement(route.handler, childProps); + } + }, { + key: 'render', + value: function render() { + var handler = this.createChildRouteHandler(); + // <script/> for things like <CSSTransitionGroup/> that don't like null + return handler ? React.createElement( + ContextWrapper, + null, + handler + ) : React.createElement('script', null); + } + }]); return RouteHandler; })(React.Component); @@ -2237,38 +1783,38 @@ RouteHandler.childContextTypes = { }; module.exports = RouteHandler; -},{"../PropTypes":14,"./ContextWrapper":23,"react":"react","react/lib/Object.assign":69}],30:[function(require,module,exports){ +},{"../PropTypes":9,"./ContextWrapper":18,"react":"react","react/lib/Object.assign":69}],25:[function(require,module,exports){ (function (process){ -"use strict"; - /* jshint -W058 */ -var React = require("react"); -var warning = require("react/lib/warning"); -var invariant = require("react/lib/invariant"); -var canUseDOM = require("react/lib/ExecutionEnvironment").canUseDOM; -var LocationActions = require("./actions/LocationActions"); -var ImitateBrowserBehavior = require("./behaviors/ImitateBrowserBehavior"); -var HashLocation = require("./locations/HashLocation"); -var HistoryLocation = require("./locations/HistoryLocation"); -var RefreshLocation = require("./locations/RefreshLocation"); -var StaticLocation = require("./locations/StaticLocation"); -var ScrollHistory = require("./ScrollHistory"); -var createRoutesFromReactChildren = require("./createRoutesFromReactChildren"); -var isReactChildren = require("./isReactChildren"); -var Transition = require("./Transition"); -var PropTypes = require("./PropTypes"); -var Redirect = require("./Redirect"); -var History = require("./History"); -var Cancellation = require("./Cancellation"); -var Match = require("./Match"); -var Route = require("./Route"); -var supportsHistory = require("./supportsHistory"); -var PathUtils = require("./PathUtils"); +'use strict'; + +var React = require('react'); +var warning = require('react/lib/warning'); +var invariant = require('react/lib/invariant'); +var canUseDOM = require('react/lib/ExecutionEnvironment').canUseDOM; +var LocationActions = require('./actions/LocationActions'); +var ImitateBrowserBehavior = require('./behaviors/ImitateBrowserBehavior'); +var HashLocation = require('./locations/HashLocation'); +var HistoryLocation = require('./locations/HistoryLocation'); +var RefreshLocation = require('./locations/RefreshLocation'); +var StaticLocation = require('./locations/StaticLocation'); +var ScrollHistory = require('./ScrollHistory'); +var createRoutesFromReactChildren = require('./createRoutesFromReactChildren'); +var isReactChildren = require('./isReactChildren'); +var Transition = require('./Transition'); +var PropTypes = require('./PropTypes'); +var Redirect = require('./Redirect'); +var History = require('./History'); +var Cancellation = require('./Cancellation'); +var Match = require('./Match'); +var Route = require('./Route'); +var supportsHistory = require('./supportsHistory'); +var PathUtils = require('./PathUtils'); /** * The default location for new routers. */ -var DEFAULT_LOCATION = canUseDOM ? HashLocation : "/"; +var DEFAULT_LOCATION = canUseDOM ? HashLocation : '/'; /** * The default scroll behavior for new routers. @@ -2306,7 +1852,7 @@ function addRoutesToNamedRoutes(routes, namedRoutes) { route = routes[i]; if (route.name) { - invariant(namedRoutes[route.name] == null, "You may not have more than one route named \"%s\"", route.name); + invariant(namedRoutes[route.name] == null, 'You may not have more than one route named "%s"', route.name); namedRoutes[route.name] = route; } @@ -2364,12 +1910,12 @@ function createRouter(options) { var pendingTransition = null; var dispatchHandler = null; - if (typeof location === "string") location = new StaticLocation(location); + if (typeof location === 'string') location = new StaticLocation(location); if (location instanceof StaticLocation) { - warning(!canUseDOM || process.env.NODE_ENV === "test", "You should not use a static location in a DOM environment because " + "the router will not be kept in sync with the current URL"); + warning(!canUseDOM || process.env.NODE_ENV === 'test', 'You should not use a static location in a DOM environment because ' + 'the router will not be kept in sync with the current URL'); } else { - invariant(canUseDOM || location.needsDOM === false, "You cannot use %s without a DOM", location); + invariant(canUseDOM || location.needsDOM === false, 'You cannot use %s without a DOM', location); } // Automatically fall back to full page refreshes in @@ -2378,7 +1924,7 @@ function createRouter(options) { var Router = React.createClass({ - displayName: "Router", + displayName: 'Router', statics: { @@ -2437,7 +1983,7 @@ function createRouter(options) { } else { var route = to instanceof Route ? to : Router.namedRoutes[to]; - invariant(route instanceof Route, "Cannot find a route named \"%s\"", to); + invariant(route instanceof Route, 'Cannot find a route named "%s"', to); path = route.path; } @@ -2451,7 +1997,7 @@ function createRouter(options) { */ makeHref: function makeHref(to, params, query) { var path = Router.makePath(to, params, query); - return location === HashLocation ? "#" + path : path; + return location === HashLocation ? '#' + path : path; }, /** @@ -2494,13 +2040,13 @@ function createRouter(options) { return true; } - warning(false, "goBack() was ignored because there is no router history"); + warning(false, 'goBack() was ignored because there is no router history'); return false; }, handleAbort: options.onAbort || function (abortReason) { - if (location instanceof StaticLocation) throw new Error("Unhandled aborted transition! Reason: " + abortReason); + if (location instanceof StaticLocation) throw new Error('Unhandled aborted transition! Reason: ' + abortReason); if (abortReason instanceof Cancellation) { return; @@ -2552,7 +2098,7 @@ function createRouter(options) { var match = Router.match(path); - warning(match != null, "No route matches path \"%s\". Make sure you have <Route path=\"%s\"> somewhere in your routes", path, path); + warning(match != null, 'No route matches path "%s". Make sure you have <Route path="%s"> somewhere in your routes', path, path); if (match == null) match = {}; @@ -2607,7 +2153,7 @@ function createRouter(options) { * Router.*Location objects (e.g. Router.HashLocation or Router.HistoryLocation). */ run: function run(callback) { - invariant(!Router.isRunning, "Router is already running"); + invariant(!Router.isRunning, 'Router is already running'); dispatchHandler = function (error, transition, newState) { if (error) Router.handleError(error); @@ -2754,20 +2300,21 @@ function createRouter(options) { module.exports = createRouter; }).call(this,require('_process')) -},{"./Cancellation":9,"./History":10,"./Match":11,"./PathUtils":13,"./PropTypes":14,"./Redirect":15,"./Route":16,"./ScrollHistory":17,"./Transition":19,"./actions/LocationActions":20,"./behaviors/ImitateBrowserBehavior":21,"./createRoutesFromReactChildren":31,"./isReactChildren":33,"./locations/HashLocation":34,"./locations/HistoryLocation":35,"./locations/RefreshLocation":36,"./locations/StaticLocation":37,"./supportsHistory":40,"_process":1,"react":"react","react/lib/ExecutionEnvironment":62,"react/lib/invariant":191,"react/lib/warning":212}],31:[function(require,module,exports){ -"use strict"; +},{"./Cancellation":4,"./History":5,"./Match":6,"./PathUtils":8,"./PropTypes":9,"./Redirect":10,"./Route":11,"./ScrollHistory":12,"./Transition":14,"./actions/LocationActions":15,"./behaviors/ImitateBrowserBehavior":16,"./createRoutesFromReactChildren":26,"./isReactChildren":28,"./locations/HashLocation":29,"./locations/HistoryLocation":30,"./locations/RefreshLocation":31,"./locations/StaticLocation":32,"./supportsHistory":35,"_process":1,"react":"react","react/lib/ExecutionEnvironment":62,"react/lib/invariant":191,"react/lib/warning":212}],26:[function(require,module,exports){ /* jshint -W084 */ -var React = require("react"); -var assign = require("react/lib/Object.assign"); -var warning = require("react/lib/warning"); -var DefaultRoute = require("./components/DefaultRoute"); -var NotFoundRoute = require("./components/NotFoundRoute"); -var Redirect = require("./components/Redirect"); -var Route = require("./Route"); +'use strict'; + +var React = require('react'); +var assign = require('react/lib/Object.assign'); +var warning = require('react/lib/warning'); +var DefaultRoute = require('./components/DefaultRoute'); +var NotFoundRoute = require('./components/NotFoundRoute'); +var Redirect = require('./components/Redirect'); +var Route = require('./Route'); function checkPropTypes(componentName, propTypes, props) { - componentName = componentName || "UnknownComponent"; + componentName = componentName || 'UnknownComponent'; for (var propName in propTypes) { if (propTypes.hasOwnProperty(propName)) { @@ -2836,17 +2383,17 @@ function createRoutesFromReactChildren(children) { } module.exports = createRoutesFromReactChildren; -},{"./Route":16,"./components/DefaultRoute":24,"./components/NotFoundRoute":26,"./components/Redirect":27,"react":"react","react/lib/Object.assign":69,"react/lib/warning":212}],32:[function(require,module,exports){ -"use strict"; +},{"./Route":11,"./components/DefaultRoute":19,"./components/NotFoundRoute":21,"./components/Redirect":22,"react":"react","react/lib/Object.assign":69,"react/lib/warning":212}],27:[function(require,module,exports){ +'use strict'; -var invariant = require("react/lib/invariant"); -var canUseDOM = require("react/lib/ExecutionEnvironment").canUseDOM; +var invariant = require('react/lib/invariant'); +var canUseDOM = require('react/lib/ExecutionEnvironment').canUseDOM; /** * Returns the current scroll position of the window as { x, y }. */ function getWindowScrollPosition() { - invariant(canUseDOM, "Cannot get current scroll position without a DOM"); + invariant(canUseDOM, 'Cannot get current scroll position without a DOM'); return { x: window.pageXOffset || document.documentElement.scrollLeft, @@ -2855,10 +2402,10 @@ function getWindowScrollPosition() { } module.exports = getWindowScrollPosition; -},{"react/lib/ExecutionEnvironment":62,"react/lib/invariant":191}],33:[function(require,module,exports){ -"use strict"; +},{"react/lib/ExecutionEnvironment":62,"react/lib/invariant":191}],28:[function(require,module,exports){ +'use strict'; -var React = require("react"); +var React = require('react'); function isValidChild(object) { return object == null || React.isValidElement(object); @@ -2869,11 +2416,11 @@ function isReactChildren(object) { } module.exports = isReactChildren; -},{"react":"react"}],34:[function(require,module,exports){ -"use strict"; +},{"react":"react"}],29:[function(require,module,exports){ +'use strict'; -var LocationActions = require("../actions/LocationActions"); -var History = require("../History"); +var LocationActions = require('../actions/LocationActions'); +var History = require('../History'); var _listeners = []; var _isListening = false; @@ -2895,9 +2442,9 @@ function notifyChange(type) { function ensureSlash() { var path = HashLocation.getCurrentPath(); - if (path.charAt(0) === "/") { + if (path.charAt(0) === '/') { return true; - }HashLocation.replace("/" + path); + }HashLocation.replace('/' + path); return false; } @@ -2927,9 +2474,9 @@ var HashLocation = { if (!_isListening) { if (window.addEventListener) { - window.addEventListener("hashchange", onHashChange, false); + window.addEventListener('hashchange', onHashChange, false); } else { - window.attachEvent("onhashchange", onHashChange); + window.attachEvent('onhashchange', onHashChange); } _isListening = true; @@ -2943,9 +2490,9 @@ var HashLocation = { if (_listeners.length === 0) { if (window.removeEventListener) { - window.removeEventListener("hashchange", onHashChange, false); + window.removeEventListener('hashchange', onHashChange, false); } else { - window.removeEvent("onhashchange", onHashChange); + window.removeEvent('onhashchange', onHashChange); } _isListening = false; @@ -2959,7 +2506,7 @@ var HashLocation = { replace: function replace(path) { _actionType = LocationActions.REPLACE; - window.location.replace(window.location.pathname + window.location.search + "#" + path); + window.location.replace(window.location.pathname + window.location.search + '#' + path); }, pop: function pop() { @@ -2971,21 +2518,21 @@ var HashLocation = { return decodeURI( // We can't use window.location.hash here because it's not // consistent across browsers - Firefox will pre-decode it! - window.location.href.split("#")[1] || ""); + window.location.href.split('#')[1] || ''); }, toString: function toString() { - return "<HashLocation>"; + return '<HashLocation>'; } }; module.exports = HashLocation; -},{"../History":10,"../actions/LocationActions":20}],35:[function(require,module,exports){ -"use strict"; +},{"../History":5,"../actions/LocationActions":15}],30:[function(require,module,exports){ +'use strict'; -var LocationActions = require("../actions/LocationActions"); -var History = require("../History"); +var LocationActions = require('../actions/LocationActions'); +var History = require('../History'); var _listeners = []; var _isListening = false; @@ -3019,9 +2566,9 @@ var HistoryLocation = { if (!_isListening) { if (window.addEventListener) { - window.addEventListener("popstate", onPopState, false); + window.addEventListener('popstate', onPopState, false); } else { - window.attachEvent("onpopstate", onPopState); + window.attachEvent('onpopstate', onPopState); } _isListening = true; @@ -3035,9 +2582,9 @@ var HistoryLocation = { if (_listeners.length === 0) { if (window.addEventListener) { - window.removeEventListener("popstate", onPopState, false); + window.removeEventListener('popstate', onPopState, false); } else { - window.removeEvent("onpopstate", onPopState); + window.removeEvent('onpopstate', onPopState); } _isListening = false; @@ -3045,13 +2592,13 @@ var HistoryLocation = { }, push: function push(path) { - window.history.pushState({ path: path }, "", path); + window.history.pushState({ path: path }, '', path); History.length += 1; notifyChange(LocationActions.PUSH); }, replace: function replace(path) { - window.history.replaceState({ path: path }, "", path); + window.history.replaceState({ path: path }, '', path); notifyChange(LocationActions.REPLACE); }, @@ -3062,17 +2609,17 @@ var HistoryLocation = { }, toString: function toString() { - return "<HistoryLocation>"; + return '<HistoryLocation>'; } }; module.exports = HistoryLocation; -},{"../History":10,"../actions/LocationActions":20}],36:[function(require,module,exports){ -"use strict"; +},{"../History":5,"../actions/LocationActions":15}],31:[function(require,module,exports){ +'use strict'; -var HistoryLocation = require("./HistoryLocation"); -var History = require("../History"); +var HistoryLocation = require('./HistoryLocation'); +var History = require('../History'); /** * A Location that uses full page refreshes. This is used as @@ -3094,23 +2641,23 @@ var RefreshLocation = { getCurrentPath: HistoryLocation.getCurrentPath, toString: function toString() { - return "<RefreshLocation>"; + return '<RefreshLocation>'; } }; module.exports = RefreshLocation; -},{"../History":10,"./HistoryLocation":35}],37:[function(require,module,exports){ -"use strict"; +},{"../History":5,"./HistoryLocation":30}],32:[function(require,module,exports){ +'use strict'; -var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); +var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }; -var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; +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 invariant = require("react/lib/invariant"); +var invariant = require('react/lib/invariant'); function throwCannotModify() { - invariant(false, "You cannot modify a static location"); + invariant(false, 'You cannot modify a static location'); } /** @@ -3126,18 +2673,17 @@ var StaticLocation = (function () { this.path = path; } - _createClass(StaticLocation, { - getCurrentPath: { - value: function getCurrentPath() { - return this.path; - } - }, - toString: { - value: function toString() { - return "<StaticLocation path=\"" + this.path + "\">"; - } + _createClass(StaticLocation, [{ + key: 'getCurrentPath', + value: function getCurrentPath() { + return this.path; } - }); + }, { + key: 'toString', + value: function toString() { + return '<StaticLocation path="' + this.path + '">'; + } + }]); return StaticLocation; })(); @@ -3151,16 +2697,16 @@ StaticLocation.prototype.replace = throwCannotModify; StaticLocation.prototype.pop = throwCannotModify; module.exports = StaticLocation; -},{"react/lib/invariant":191}],38:[function(require,module,exports){ -"use strict"; +},{"react/lib/invariant":191}],33:[function(require,module,exports){ +'use strict'; -var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); +var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }; -var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; +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 invariant = require("react/lib/invariant"); -var LocationActions = require("../actions/LocationActions"); -var History = require("../History"); +var invariant = require('react/lib/invariant'); +var LocationActions = require('../actions/LocationActions'); +var History = require('../History'); /** * A location that is convenient for testing and does not require a DOM. @@ -3175,82 +2721,81 @@ var TestLocation = (function () { this._updateHistoryLength(); } - _createClass(TestLocation, { - needsDOM: { - get: function () { - return false; - } - }, - _updateHistoryLength: { - value: function _updateHistoryLength() { - History.length = this.history.length; - } - }, - _notifyChange: { - value: function _notifyChange(type) { - var change = { - path: this.getCurrentPath(), - type: type - }; + _createClass(TestLocation, [{ + key: 'needsDOM', + get: function () { + return false; + } + }, { + key: '_updateHistoryLength', + value: function _updateHistoryLength() { + History.length = this.history.length; + } + }, { + key: '_notifyChange', + value: function _notifyChange(type) { + var change = { + path: this.getCurrentPath(), + type: type + }; - for (var i = 0, len = this.listeners.length; i < len; ++i) this.listeners[i].call(this, change); - } - }, - addChangeListener: { - value: function addChangeListener(listener) { - this.listeners.push(listener); - } - }, - removeChangeListener: { - value: function removeChangeListener(listener) { - this.listeners = this.listeners.filter(function (l) { - return l !== listener; - }); - } - }, - push: { - value: function push(path) { - this.history.push(path); - this._updateHistoryLength(); - this._notifyChange(LocationActions.PUSH); - } - }, - replace: { - value: function replace(path) { - invariant(this.history.length, "You cannot replace the current path with no history"); + for (var i = 0, len = this.listeners.length; i < len; ++i) this.listeners[i].call(this, change); + } + }, { + key: 'addChangeListener', + value: function addChangeListener(listener) { + this.listeners.push(listener); + } + }, { + key: 'removeChangeListener', + value: function removeChangeListener(listener) { + this.listeners = this.listeners.filter(function (l) { + return l !== listener; + }); + } + }, { + key: 'push', + value: function push(path) { + this.history.push(path); + this._updateHistoryLength(); + this._notifyChange(LocationActions.PUSH); + } + }, { + key: 'replace', + value: function replace(path) { + invariant(this.history.length, 'You cannot replace the current path with no history'); - this.history[this.history.length - 1] = path; + this.history[this.history.length - 1] = path; - this._notifyChange(LocationActions.REPLACE); - } - }, - pop: { - value: function pop() { - this.history.pop(); - this._updateHistoryLength(); - this._notifyChange(LocationActions.POP); - } - }, - getCurrentPath: { - value: function getCurrentPath() { - return this.history[this.history.length - 1]; - } - }, - toString: { - value: function toString() { - return "<TestLocation>"; - } + this._notifyChange(LocationActions.REPLACE); } - }); + }, { + key: 'pop', + value: function pop() { + this.history.pop(); + this._updateHistoryLength(); + this._notifyChange(LocationActions.POP); + } + }, { + key: 'getCurrentPath', + value: function getCurrentPath() { + return this.history[this.history.length - 1]; + } + }, { + key: 'toString', + value: function toString() { + return '<TestLocation>'; + } + }]); return TestLocation; })(); module.exports = TestLocation; -},{"../History":10,"../actions/LocationActions":20,"react/lib/invariant":191}],39:[function(require,module,exports){ -"use strict"; +},{"../History":5,"../actions/LocationActions":15,"react/lib/invariant":191}],34:[function(require,module,exports){ +'use strict'; -var createRouter = require("./createRouter"); +var createRouter = require('./createRouter'); /** * A high-level convenience method that creates, configures, and @@ -3282,7 +2827,7 @@ var createRouter = require("./createRouter"); * }); */ function runRouter(routes, location, callback) { - if (typeof location === "function") { + if (typeof location === 'function') { callback = location; location = null; } @@ -3298,8 +2843,8 @@ function runRouter(routes, location, callback) { } module.exports = runRouter; -},{"./createRouter":30}],40:[function(require,module,exports){ -"use strict"; +},{"./createRouter":25}],35:[function(require,module,exports){ +'use strict'; function supportsHistory() { /*! taken from modernizr @@ -3308,14 +2853,14 @@ function supportsHistory() { * changed to avoid false negatives for Windows Phones: https://github.com/rackt/react-router/issues/586 */ 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) { + 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; + return window.history && 'pushState' in window.history; } module.exports = supportsHistory; -},{}],41:[function(require,module,exports){ +},{}],36:[function(require,module,exports){ 'use strict'; function ToObject(val) { @@ -3343,6 +2888,422 @@ module.exports = Object.assign || function (target, source) { return to; }; +},{}],37:[function(require,module,exports){ +module.exports = require('./lib/'); + +},{"./lib/":38}],38:[function(require,module,exports){ +// Load modules + +var Stringify = require('./stringify'); +var Parse = require('./parse'); + + +// Declare internals + +var internals = {}; + + +module.exports = { + stringify: Stringify, + parse: Parse +}; + +},{"./parse":39,"./stringify":40}],39:[function(require,module,exports){ +// Load modules + +var Utils = require('./utils'); + + +// Declare internals + +var internals = { + delimiter: '&', + depth: 5, + arrayLimit: 20, + parameterLimit: 1000 +}; + + +internals.parseValues = function (str, options) { + + var obj = {}; + var parts = str.split(options.delimiter, options.parameterLimit === Infinity ? undefined : options.parameterLimit); + + for (var i = 0, il = parts.length; i < il; ++i) { + var part = parts[i]; + var pos = part.indexOf(']=') === -1 ? part.indexOf('=') : part.indexOf(']=') + 1; + + if (pos === -1) { + obj[Utils.decode(part)] = ''; + } + else { + var key = Utils.decode(part.slice(0, pos)); + var val = Utils.decode(part.slice(pos + 1)); + + if (Object.prototype.hasOwnProperty(key)) { + continue; + } + + if (!obj.hasOwnProperty(key)) { + obj[key] = val; + } + else { + obj[key] = [].concat(obj[key]).concat(val); + } + } + } + + return obj; +}; + + +internals.parseObject = function (chain, val, options) { + + if (!chain.length) { + return val; + } + + var root = chain.shift(); + + var obj = {}; + if (root === '[]') { + obj = []; + obj = obj.concat(internals.parseObject(chain, val, options)); + } + else { + var cleanRoot = root[0] === '[' && root[root.length - 1] === ']' ? root.slice(1, root.length - 1) : root; + var index = parseInt(cleanRoot, 10); + var indexString = '' + index; + if (!isNaN(index) && + root !== cleanRoot && + indexString === cleanRoot && + index >= 0 && + index <= options.arrayLimit) { + + obj = []; + obj[index] = internals.parseObject(chain, val, options); + } + else { + obj[cleanRoot] = internals.parseObject(chain, val, options); + } + } + + return obj; +}; + + +internals.parseKeys = function (key, val, options) { + + if (!key) { + return; + } + + // The regex chunks + + var parent = /^([^\[\]]*)/; + var child = /(\[[^\[\]]*\])/g; + + // Get the parent + + var segment = parent.exec(key); + + // Don't allow them to overwrite object prototype properties + + if (Object.prototype.hasOwnProperty(segment[1])) { + return; + } + + // Stash the parent if it exists + + var keys = []; + if (segment[1]) { + keys.push(segment[1]); + } + + // Loop through children appending to the array until we hit depth + + var i = 0; + while ((segment = child.exec(key)) !== null && i < options.depth) { + + ++i; + if (!Object.prototype.hasOwnProperty(segment[1].replace(/\[|\]/g, ''))) { + keys.push(segment[1]); + } + } + + // If there's a remainder, just add whatever is left + + if (segment) { + keys.push('[' + key.slice(segment.index) + ']'); + } + + return internals.parseObject(keys, val, options); +}; + + +module.exports = function (str, options) { + + if (str === '' || + str === null || + typeof str === 'undefined') { + + return {}; + } + + options = options || {}; + options.delimiter = typeof options.delimiter === 'string' || Utils.isRegExp(options.delimiter) ? options.delimiter : internals.delimiter; + options.depth = typeof options.depth === 'number' ? options.depth : internals.depth; + options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : internals.arrayLimit; + options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : internals.parameterLimit; + + var tempObj = typeof str === 'string' ? internals.parseValues(str, options) : str; + var obj = {}; + + // Iterate over the keys and setup the new object + + var keys = Object.keys(tempObj); + for (var i = 0, il = keys.length; i < il; ++i) { + var key = keys[i]; + var newObj = internals.parseKeys(key, tempObj[key], options); + obj = Utils.merge(obj, newObj); + } + + return Utils.compact(obj); +}; + +},{"./utils":41}],40:[function(require,module,exports){ +// Load modules + +var Utils = require('./utils'); + + +// Declare internals + +var internals = { + delimiter: '&', + arrayPrefixGenerators: { + brackets: function (prefix, key) { + return prefix + '[]'; + }, + indices: function (prefix, key) { + return prefix + '[' + key + ']'; + }, + repeat: function (prefix, key) { + return prefix; + } + } +}; + + +internals.stringify = function (obj, prefix, generateArrayPrefix) { + + if (Utils.isBuffer(obj)) { + obj = obj.toString(); + } + else if (obj instanceof Date) { + obj = obj.toISOString(); + } + else if (obj === null) { + obj = ''; + } + + if (typeof obj === 'string' || + typeof obj === 'number' || + typeof obj === 'boolean') { + + return [encodeURIComponent(prefix) + '=' + encodeURIComponent(obj)]; + } + + var values = []; + + if (typeof obj === 'undefined') { + return values; + } + + var objKeys = Object.keys(obj); + for (var i = 0, il = objKeys.length; i < il; ++i) { + var key = objKeys[i]; + if (Array.isArray(obj)) { + values = values.concat(internals.stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix)); + } + else { + values = values.concat(internals.stringify(obj[key], prefix + '[' + key + ']', generateArrayPrefix)); + } + } + + return values; +}; + + +module.exports = function (obj, options) { + + options = options || {}; + var delimiter = typeof options.delimiter === 'undefined' ? internals.delimiter : options.delimiter; + + var keys = []; + + if (typeof obj !== 'object' || + obj === null) { + + return ''; + } + + var arrayFormat; + if (options.arrayFormat in internals.arrayPrefixGenerators) { + arrayFormat = options.arrayFormat; + } + else if ('indices' in options) { + arrayFormat = options.indices ? 'indices' : 'repeat'; + } + else { + arrayFormat = 'indices'; + } + + var generateArrayPrefix = internals.arrayPrefixGenerators[arrayFormat]; + + var objKeys = Object.keys(obj); + for (var i = 0, il = objKeys.length; i < il; ++i) { + var key = objKeys[i]; + keys = keys.concat(internals.stringify(obj[key], key, generateArrayPrefix)); + } + + return keys.join(delimiter); +}; + +},{"./utils":41}],41:[function(require,module,exports){ +// Load modules + + +// Declare internals + +var internals = {}; + + +exports.arrayToObject = function (source) { + + var obj = {}; + for (var i = 0, il = source.length; i < il; ++i) { + if (typeof source[i] !== 'undefined') { + + obj[i] = source[i]; + } + } + + return obj; +}; + + +exports.merge = function (target, source) { + + if (!source) { + return target; + } + + if (typeof source !== 'object') { + if (Array.isArray(target)) { + target.push(source); + } + else { + target[source] = true; + } + + return target; + } + + if (typeof target !== 'object') { + target = [target].concat(source); + return target; + } + + if (Array.isArray(target) && + !Array.isArray(source)) { + + target = exports.arrayToObject(target); + } + + var keys = Object.keys(source); + for (var k = 0, kl = keys.length; k < kl; ++k) { + var key = keys[k]; + var value = source[key]; + + if (!target[key]) { + target[key] = value; + } + else { + target[key] = exports.merge(target[key], value); + } + } + + return target; +}; + + +exports.decode = function (str) { + + try { + return decodeURIComponent(str.replace(/\+/g, ' ')); + } catch (e) { + return str; + } +}; + + +exports.compact = function (obj, refs) { + + if (typeof obj !== 'object' || + obj === null) { + + return obj; + } + + refs = refs || []; + var lookup = refs.indexOf(obj); + if (lookup !== -1) { + return refs[lookup]; + } + + refs.push(obj); + + if (Array.isArray(obj)) { + var compacted = []; + + for (var i = 0, il = obj.length; i < il; ++i) { + if (typeof obj[i] !== 'undefined') { + compacted.push(obj[i]); + } + } + + return compacted; + } + + var keys = Object.keys(obj); + for (i = 0, il = keys.length; i < il; ++i) { + var key = keys[i]; + obj[key] = exports.compact(obj[key], refs); + } + + return obj; +}; + + +exports.isRegExp = function (obj) { + return Object.prototype.toString.call(obj) === '[object RegExp]'; +}; + + +exports.isBuffer = function (obj) { + + if (obj === null || + typeof obj === 'undefined') { + + return false; + } + + return !!(obj.constructor && + obj.constructor.isBuffer && + obj.constructor.isBuffer(obj)); +}; + },{}],42:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -3977,6 +3938,7 @@ var CSSCore = { module.exports = CSSCore; }).call(this,require('_process')) + },{"./invariant":191,"_process":1}],45:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -4000,7 +3962,9 @@ var isUnitlessNumber = { columnCount: true, flex: true, flexGrow: true, + flexPositive: true, flexShrink: true, + flexNegative: true, fontWeight: true, lineClamp: true, lineHeight: true, @@ -4013,7 +3977,9 @@ var isUnitlessNumber = { // SVG-related properties fillOpacity: true, - strokeOpacity: true + strokeDashoffset: true, + strokeOpacity: true, + strokeWidth: true }; /** @@ -4280,6 +4246,7 @@ var CSSPropertyOperations = { module.exports = CSSPropertyOperations; }).call(this,require('_process')) + },{"./CSSProperty":45,"./ExecutionEnvironment":62,"./camelizeStyleName":162,"./dangerousStyleValue":169,"./hyphenateStyleName":189,"./memoizeStringOnly":200,"./warning":212,"_process":1}],47:[function(require,module,exports){ (function (process){ /** @@ -4380,6 +4347,7 @@ PooledClass.addPoolingTo(CallbackQueue); module.exports = CallbackQueue; }).call(this,require('_process')) + },{"./Object.assign":69,"./PooledClass":70,"./invariant":191,"_process":1}],48:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -4925,6 +4893,7 @@ var DOMChildrenOperations = { module.exports = DOMChildrenOperations; }).call(this,require('_process')) + },{"./Danger":53,"./ReactMultiChildUpdateTypes":119,"./invariant":191,"./setTextContent":206,"_process":1}],51:[function(require,module,exports){ (function (process){ /** @@ -5224,6 +5193,7 @@ var DOMProperty = { module.exports = DOMProperty; }).call(this,require('_process')) + },{"./invariant":191,"_process":1}],52:[function(require,module,exports){ (function (process){ /** @@ -5416,6 +5386,7 @@ var DOMPropertyOperations = { module.exports = DOMPropertyOperations; }).call(this,require('_process')) + },{"./DOMProperty":51,"./quoteAttributeValueForBrowser":204,"./warning":212,"_process":1}],53:[function(require,module,exports){ (function (process){ /** @@ -5603,6 +5574,7 @@ var Danger = { module.exports = Danger; }).call(this,require('_process')) + },{"./ExecutionEnvironment":62,"./createNodesFromMarkup":167,"./emptyFunction":170,"./getMarkupWrap":183,"./invariant":191,"_process":1}],54:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -5944,6 +5916,7 @@ var EventListener = { module.exports = EventListener; }).call(this,require('_process')) + },{"./emptyFunction":170,"_process":1}],58:[function(require,module,exports){ (function (process){ /** @@ -6222,6 +6195,7 @@ var EventPluginHub = { module.exports = EventPluginHub; }).call(this,require('_process')) + },{"./EventPluginRegistry":59,"./EventPluginUtils":60,"./accumulateInto":159,"./forEachAccumulated":176,"./invariant":191,"_process":1}],59:[function(require,module,exports){ (function (process){ /** @@ -6502,6 +6476,7 @@ var EventPluginRegistry = { module.exports = EventPluginRegistry; }).call(this,require('_process')) + },{"./invariant":191,"_process":1}],60:[function(require,module,exports){ (function (process){ /** @@ -6723,6 +6698,7 @@ var EventPluginUtils = { module.exports = EventPluginUtils; }).call(this,require('_process')) + },{"./EventConstants":56,"./invariant":191,"_process":1}],61:[function(require,module,exports){ (function (process){ /** @@ -6865,6 +6841,7 @@ var EventPropagators = { module.exports = EventPropagators; }).call(this,require('_process')) + },{"./EventConstants":56,"./EventPluginHub":58,"./accumulateInto":159,"./forEachAccumulated":176,"_process":1}],62:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -7100,6 +7077,7 @@ var HTMLDOMPropertyConfig = { headers: null, height: MUST_USE_ATTRIBUTE, hidden: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, + high: null, href: null, hrefLang: null, htmlFor: null, @@ -7110,6 +7088,7 @@ var HTMLDOMPropertyConfig = { lang: null, list: MUST_USE_ATTRIBUTE, loop: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, + low: null, manifest: MUST_USE_ATTRIBUTE, marginHeight: null, marginWidth: null, @@ -7124,6 +7103,7 @@ var HTMLDOMPropertyConfig = { name: null, noValidate: HAS_BOOLEAN_VALUE, open: HAS_BOOLEAN_VALUE, + optimum: null, pattern: null, placeholder: null, poster: null, @@ -7137,6 +7117,7 @@ var HTMLDOMPropertyConfig = { rowSpan: null, sandbox: null, scope: null, + scoped: HAS_BOOLEAN_VALUE, scrolling: null, seamless: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE, selected: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, @@ -7178,7 +7159,9 @@ var HTMLDOMPropertyConfig = { itemID: MUST_USE_ATTRIBUTE, itemRef: MUST_USE_ATTRIBUTE, // property is supported for OpenGraph in meta tags. - property: null + property: null, + // IE-only attribute that controls focus behavior + unselectable: MUST_USE_ATTRIBUTE }, DOMAttributeNames: { acceptCharset: 'accept-charset', @@ -7402,6 +7385,7 @@ var LinkedValueUtils = { module.exports = LinkedValueUtils; }).call(this,require('_process')) + },{"./ReactPropTypes":126,"./invariant":191,"_process":1}],67:[function(require,module,exports){ (function (process){ /** @@ -7459,6 +7443,7 @@ var LocalEventTrapMixin = { module.exports = LocalEventTrapMixin; }).call(this,require('_process')) + },{"./ReactBrowserEventEmitter":73,"./accumulateInto":159,"./forEachAccumulated":176,"./invariant":191,"_process":1}],68:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -7682,6 +7667,7 @@ var PooledClass = { module.exports = PooledClass; }).call(this,require('_process')) + },{"./invariant":191,"_process":1}],71:[function(require,module,exports){ (function (process){ /** @@ -7794,7 +7780,7 @@ if ("production" !== process.env.NODE_ENV) { if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') { console.debug( 'Download the React DevTools for a better development experience: ' + - 'http://fb.me/react-devtools' + 'https://fb.me/react-devtools' ); } } @@ -7821,7 +7807,7 @@ if ("production" !== process.env.NODE_ENV) { if (!expectedFeatures[i]) { console.error( 'One or more ES5 shim/shams expected by React are not available: ' + - 'http://fb.me/react-warning-polyfills' + 'https://fb.me/react-warning-polyfills' ); break; } @@ -7829,11 +7815,12 @@ if ("production" !== process.env.NODE_ENV) { } } -React.version = '0.13.1'; +React.version = '0.13.3'; module.exports = React; }).call(this,require('_process')) + },{"./EventPluginUtils":60,"./ExecutionEnvironment":62,"./Object.assign":69,"./ReactChildren":77,"./ReactClass":78,"./ReactComponent":79,"./ReactContext":84,"./ReactCurrentOwner":85,"./ReactDOM":86,"./ReactDOMTextComponent":97,"./ReactDefaultInjection":100,"./ReactElement":103,"./ReactElementValidator":104,"./ReactInstanceHandles":112,"./ReactMount":117,"./ReactPerf":122,"./ReactPropTypes":126,"./ReactReconciler":129,"./ReactServerRendering":132,"./findDOMNode":173,"./onlyChild":201,"_process":1}],72:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -8436,6 +8423,7 @@ var ReactCSSTransitionGroupChild = React.createClass({ module.exports = ReactCSSTransitionGroupChild; }).call(this,require('_process')) + },{"./CSSCore":44,"./React":71,"./ReactTransitionEvents":137,"./onlyChild":201,"./warning":212,"_process":1}],76:[function(require,module,exports){ /** * Copyright 2014-2015, Facebook, Inc. @@ -8716,6 +8704,7 @@ var ReactChildren = { module.exports = ReactChildren; }).call(this,require('_process')) + },{"./PooledClass":70,"./ReactFragment":109,"./traverseAllChildren":210,"./warning":212,"_process":1}],78:[function(require,module,exports){ (function (process){ /** @@ -9554,7 +9543,7 @@ var ReactClass = { ("production" !== process.env.NODE_ENV ? warning( this instanceof Constructor, 'Something is calling a React component directly. Use a factory or ' + - 'JSX instead. See: http://fb.me/react-legacyfactory' + 'JSX instead. See: https://fb.me/react-legacyfactory' ) : null); } @@ -9662,6 +9651,7 @@ var ReactClass = { module.exports = ReactClass; }).call(this,require('_process')) + },{"./Object.assign":69,"./ReactComponent":79,"./ReactCurrentOwner":85,"./ReactElement":103,"./ReactErrorUtils":106,"./ReactInstanceMap":113,"./ReactLifeCycle":114,"./ReactPropTypeLocationNames":124,"./ReactPropTypeLocations":125,"./ReactUpdateQueue":139,"./invariant":191,"./keyMirror":197,"./keyOf":198,"./warning":212,"_process":1}],79:[function(require,module,exports){ (function (process){ /** @@ -9766,20 +9756,38 @@ ReactComponent.prototype.forceUpdate = function(callback) { */ if ("production" !== process.env.NODE_ENV) { var deprecatedAPIs = { - getDOMNode: 'getDOMNode', - isMounted: 'isMounted', - replaceProps: 'replaceProps', - replaceState: 'replaceState', - setProps: 'setProps' + getDOMNode: [ + 'getDOMNode', + 'Use React.findDOMNode(component) instead.' + ], + isMounted: [ + 'isMounted', + 'Instead, make sure to clean up subscriptions and pending requests in ' + + 'componentWillUnmount to prevent memory leaks.' + ], + replaceProps: [ + 'replaceProps', + 'Instead, call React.render again at the top level.' + ], + replaceState: [ + 'replaceState', + 'Refactor your code to use setState instead (see ' + + 'https://github.com/facebook/react/issues/3236).' + ], + setProps: [ + 'setProps', + 'Instead, call React.render again at the top level.' + ] }; - var defineDeprecationWarning = function(methodName, displayName) { + var defineDeprecationWarning = function(methodName, info) { try { Object.defineProperty(ReactComponent.prototype, methodName, { get: function() { ("production" !== process.env.NODE_ENV ? warning( false, - '%s(...) is deprecated in plain JavaScript React classes.', - displayName + '%s(...) is deprecated in plain JavaScript React classes. %s', + info[0], + info[1] ) : null); return undefined; } @@ -9798,6 +9806,7 @@ if ("production" !== process.env.NODE_ENV) { module.exports = ReactComponent; }).call(this,require('_process')) + },{"./ReactUpdateQueue":139,"./invariant":191,"./warning":212,"_process":1}],80:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -9906,6 +9915,7 @@ var ReactComponentEnvironment = { module.exports = ReactComponentEnvironment; }).call(this,require('_process')) + },{"./invariant":191,"_process":1}],82:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -10134,6 +10144,14 @@ var ReactCompositeComponentMixin = { this.getName() || 'a component' ) : null); ("production" !== process.env.NODE_ENV ? warning( + !inst.getDefaultProps || + inst.getDefaultProps.isReactClassApproved, + 'getDefaultProps was defined on %s, a plain JavaScript class. ' + + 'This is only supported for classes created using React.createClass. ' + + 'Use a static property to define defaultProps instead.', + this.getName() || 'a component' + ) : null); + ("production" !== process.env.NODE_ENV ? warning( !inst.propTypes, 'propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', @@ -10169,6 +10187,7 @@ var ReactCompositeComponentMixin = { this._pendingReplaceState = false; this._pendingForceUpdate = false; + var childContext; var renderedElement; var previouslyMounting = ReactLifeCycle.currentlyMountingInstance; @@ -10183,7 +10202,8 @@ var ReactCompositeComponentMixin = { } } - renderedElement = this._renderValidatedComponent(); + childContext = this._getValidatedChildContext(context); + renderedElement = this._renderValidatedComponent(childContext); } finally { ReactLifeCycle.currentlyMountingInstance = previouslyMounting; } @@ -10197,7 +10217,7 @@ var ReactCompositeComponentMixin = { this._renderedComponent, rootID, transaction, - this._processChildContext(context) + this._mergeChildContext(context, childContext) ); if (inst.componentDidMount) { transaction.getReactMountReady().enqueue(inst.componentDidMount, inst); @@ -10327,7 +10347,7 @@ var ReactCompositeComponentMixin = { * @return {object} * @private */ - _processChildContext: function(currentContext) { + _getValidatedChildContext: function(currentContext) { var inst = this._instance; var childContext = inst.getChildContext && inst.getChildContext(); if (childContext) { @@ -10352,6 +10372,13 @@ var ReactCompositeComponentMixin = { name ) : invariant(name in inst.constructor.childContextTypes)); } + return childContext; + } + return null; + }, + + _mergeChildContext: function(currentContext, childContext) { + if (childContext) { return assign({}, currentContext, childContext); } return currentContext; @@ -10611,6 +10638,10 @@ var ReactCompositeComponentMixin = { return inst.state; } + if (replace && queue.length === 1) { + return queue[0]; + } + var nextState = assign({}, replace ? queue[0] : inst.state); for (var i = replace ? 1 : 0; i < queue.length; i++) { var partial = queue[i]; @@ -10680,13 +10711,14 @@ var ReactCompositeComponentMixin = { _updateRenderedComponent: function(transaction, context) { var prevComponentInstance = this._renderedComponent; var prevRenderedElement = prevComponentInstance._currentElement; - var nextRenderedElement = this._renderValidatedComponent(); + var childContext = this._getValidatedChildContext(); + var nextRenderedElement = this._renderValidatedComponent(childContext); if (shouldUpdateReactComponent(prevRenderedElement, nextRenderedElement)) { ReactReconciler.receiveComponent( prevComponentInstance, nextRenderedElement, transaction, - this._processChildContext(context) + this._mergeChildContext(context, childContext) ); } else { // These two IDs are actually the same! But nothing should rely on that. @@ -10702,7 +10734,7 @@ var ReactCompositeComponentMixin = { this._renderedComponent, thisID, transaction, - context + this._mergeChildContext(context, childContext) ); this._replaceNodeWithMarkupByID(prevComponentID, nextMarkup); } @@ -10740,11 +10772,12 @@ var ReactCompositeComponentMixin = { /** * @private */ - _renderValidatedComponent: function() { + _renderValidatedComponent: function(childContext) { var renderedComponent; var previousContext = ReactContext.current; - ReactContext.current = this._processChildContext( - this._currentElement._context + ReactContext.current = this._mergeChildContext( + this._currentElement._context, + childContext ); ReactCurrentOwner.current = this; try { @@ -10845,6 +10878,7 @@ var ReactCompositeComponent = { module.exports = ReactCompositeComponent; }).call(this,require('_process')) + },{"./Object.assign":69,"./ReactComponentEnvironment":81,"./ReactContext":84,"./ReactCurrentOwner":85,"./ReactElement":103,"./ReactElementValidator":104,"./ReactInstanceMap":113,"./ReactLifeCycle":114,"./ReactNativeComponent":120,"./ReactPerf":122,"./ReactPropTypeLocationNames":124,"./ReactPropTypeLocations":125,"./ReactReconciler":129,"./ReactUpdates":140,"./emptyObject":171,"./invariant":191,"./shouldUpdateReactComponent":208,"./warning":212,"_process":1}],84:[function(require,module,exports){ (function (process){ /** @@ -10923,6 +10957,7 @@ var ReactContext = { module.exports = ReactContext; }).call(this,require('_process')) + },{"./Object.assign":69,"./emptyObject":171,"./warning":212,"_process":1}],85:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -11113,6 +11148,7 @@ var ReactDOM = mapObject({ // SVG circle: 'circle', + clipPath: 'clipPath', defs: 'defs', ellipse: 'ellipse', g: 'g', @@ -11135,6 +11171,7 @@ var ReactDOM = mapObject({ module.exports = ReactDOM; }).call(this,require('_process')) + },{"./ReactElement":103,"./ReactElementValidator":104,"./mapObject":199,"_process":1}],87:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -11264,11 +11301,13 @@ function assertValidProps(props) { 'Can only set one of `children` or `props.dangerouslySetInnerHTML`.' ) : invariant(props.children == null)); ("production" !== process.env.NODE_ENV ? invariant( - props.dangerouslySetInnerHTML.__html != null, + typeof props.dangerouslySetInnerHTML === 'object' && + '__html' in props.dangerouslySetInnerHTML, '`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. ' + - 'Please visit http://fb.me/react-invariant-dangerously-set-inner-html ' + + 'Please visit https://fb.me/react-invariant-dangerously-set-inner-html ' + 'for more information.' - ) : invariant(props.dangerouslySetInnerHTML.__html != null)); + ) : invariant(typeof props.dangerouslySetInnerHTML === 'object' && + '__html' in props.dangerouslySetInnerHTML)); } if ("production" !== process.env.NODE_ENV) { ("production" !== process.env.NODE_ENV ? warning( @@ -11576,6 +11615,8 @@ ReactDOMComponent.Mixin = { if (propKey === STYLE) { if (nextProp) { nextProp = this._previousStyleCopy = assign({}, nextProp); + } else { + this._previousStyleCopy = null; } if (lastProp) { // Unset styles on `lastProp` but not on `nextProp`. @@ -11705,6 +11746,7 @@ ReactDOMComponent.injection = { module.exports = ReactDOMComponent; }).call(this,require('_process')) + },{"./CSSPropertyOperations":46,"./DOMProperty":51,"./DOMPropertyOperations":52,"./Object.assign":69,"./ReactBrowserEventEmitter":73,"./ReactComponentBrowserEnvironment":80,"./ReactMount":117,"./ReactMultiChild":118,"./ReactPerf":122,"./escapeTextContentForBrowser":172,"./invariant":191,"./isEventSupported":192,"./keyOf":198,"./warning":212,"_process":1}],89:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -11922,6 +11964,7 @@ ReactPerf.measureMethods(ReactDOMIDOperations, 'ReactDOMIDOperations', { module.exports = ReactDOMIDOperations; }).call(this,require('_process')) + },{"./CSSPropertyOperations":46,"./DOMChildrenOperations":50,"./DOMPropertyOperations":52,"./ReactMount":117,"./ReactPerf":122,"./invariant":191,"./setInnerHTML":205,"_process":1}],91:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -12190,6 +12233,7 @@ var ReactDOMInput = ReactClass.createClass({ module.exports = ReactDOMInput; }).call(this,require('_process')) + },{"./AutoFocusMixin":42,"./DOMPropertyOperations":52,"./LinkedValueUtils":66,"./Object.assign":69,"./ReactBrowserComponentMixin":72,"./ReactClass":78,"./ReactElement":103,"./ReactMount":117,"./ReactUpdates":140,"./invariant":191,"_process":1}],94:[function(require,module,exports){ (function (process){ /** @@ -12242,6 +12286,7 @@ var ReactDOMOption = ReactClass.createClass({ module.exports = ReactDOMOption; }).call(this,require('_process')) + },{"./ReactBrowserComponentMixin":72,"./ReactClass":78,"./ReactElement":103,"./warning":212,"_process":1}],95:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -12890,6 +12935,7 @@ var ReactDOMTextarea = ReactClass.createClass({ module.exports = ReactDOMTextarea; }).call(this,require('_process')) + },{"./AutoFocusMixin":42,"./DOMPropertyOperations":52,"./LinkedValueUtils":66,"./Object.assign":69,"./ReactBrowserComponentMixin":72,"./ReactClass":78,"./ReactElement":103,"./ReactUpdates":140,"./invariant":191,"./warning":212,"_process":1}],99:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -13122,6 +13168,7 @@ module.exports = { }; }).call(this,require('_process')) + },{"./BeforeInputEventPlugin":43,"./ChangeEventPlugin":48,"./ClientReactRootIndex":49,"./DefaultEventPluginOrder":54,"./EnterLeaveEventPlugin":55,"./ExecutionEnvironment":62,"./HTMLDOMPropertyConfig":64,"./MobileSafariClickEventPlugin":68,"./ReactBrowserComponentMixin":72,"./ReactClass":78,"./ReactComponentBrowserEnvironment":80,"./ReactDOMButton":87,"./ReactDOMComponent":88,"./ReactDOMForm":89,"./ReactDOMIDOperations":90,"./ReactDOMIframe":91,"./ReactDOMImg":92,"./ReactDOMInput":93,"./ReactDOMOption":94,"./ReactDOMSelect":95,"./ReactDOMTextComponent":97,"./ReactDOMTextarea":98,"./ReactDefaultBatchingStrategy":99,"./ReactDefaultPerf":101,"./ReactElement":103,"./ReactEventListener":108,"./ReactInjection":110,"./ReactInstanceHandles":112,"./ReactMount":117,"./ReactReconcileTransaction":128,"./SVGDOMPropertyConfig":142,"./SelectEventPlugin":143,"./ServerReactRootIndex":144,"./SimpleEventPlugin":145,"./createFullPageComponent":166,"_process":1}],101:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -13902,6 +13949,7 @@ ReactElement.isValidElement = function(object) { module.exports = ReactElement; }).call(this,require('_process')) + },{"./Object.assign":69,"./ReactContext":84,"./ReactCurrentOwner":85,"./warning":212,"_process":1}],104:[function(require,module,exports){ (function (process){ /** @@ -14072,7 +14120,7 @@ function warnAndMonitorForKeyUse(message, element, parentType) { ("production" !== process.env.NODE_ENV ? warning( false, - message + '%s%s See http://fb.me/react-warning-keys for more information.', + message + '%s%s See https://fb.me/react-warning-keys for more information.', parentOrOwnerAddendum, childOwnerAddendum ) : null); @@ -14196,9 +14244,9 @@ function warnForPropsMutation(propName, element) { ("production" !== process.env.NODE_ENV ? warning( false, - 'Don\'t set .props.%s of the React component%s. ' + - 'Instead, specify the correct value when ' + - 'initially creating the element.%s', + 'Don\'t set .props.%s of the React component%s. Instead, specify the ' + + 'correct value when initially creating the element or use ' + + 'React.cloneElement to make a new element with updated props.%s', propName, elementInfo, ownerInfo @@ -14367,6 +14415,7 @@ var ReactElementValidator = { module.exports = ReactElementValidator; }).call(this,require('_process')) + },{"./ReactCurrentOwner":85,"./ReactElement":103,"./ReactFragment":109,"./ReactNativeComponent":120,"./ReactPropTypeLocationNames":124,"./ReactPropTypeLocations":125,"./getIteratorFn":182,"./invariant":191,"./warning":212,"_process":1}],105:[function(require,module,exports){ (function (process){ /** @@ -14462,6 +14511,7 @@ var ReactEmptyComponent = { module.exports = ReactEmptyComponent; }).call(this,require('_process')) + },{"./ReactElement":103,"./ReactInstanceMap":113,"./invariant":191,"_process":1}],106:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -14912,6 +14962,7 @@ var ReactFragment = { module.exports = ReactFragment; }).call(this,require('_process')) + },{"./ReactElement":103,"./warning":212,"_process":1}],110:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -15425,6 +15476,7 @@ var ReactInstanceHandles = { module.exports = ReactInstanceHandles; }).call(this,require('_process')) + },{"./ReactRootIndex":131,"./invariant":191,"_process":1}],113:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -16523,6 +16575,7 @@ ReactPerf.measureMethods(ReactMount, 'ReactMount', { module.exports = ReactMount; }).call(this,require('_process')) + },{"./DOMProperty":51,"./ReactBrowserEventEmitter":73,"./ReactCurrentOwner":85,"./ReactElement":103,"./ReactElementValidator":104,"./ReactEmptyComponent":105,"./ReactInstanceHandles":112,"./ReactInstanceMap":113,"./ReactMarkupChecksum":116,"./ReactPerf":122,"./ReactReconciler":129,"./ReactUpdateQueue":139,"./ReactUpdates":140,"./containsNode":164,"./emptyObject":171,"./getReactRootElementInContainer":185,"./instantiateReactComponent":190,"./invariant":191,"./setInnerHTML":205,"./shouldUpdateReactComponent":208,"./warning":212,"_process":1}],118:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -17093,6 +17146,7 @@ var ReactNativeComponent = { module.exports = ReactNativeComponent; }).call(this,require('_process')) + },{"./Object.assign":69,"./invariant":191,"_process":1}],121:[function(require,module,exports){ (function (process){ /** @@ -17205,6 +17259,7 @@ var ReactOwner = { module.exports = ReactOwner; }).call(this,require('_process')) + },{"./invariant":191,"_process":1}],122:[function(require,module,exports){ (function (process){ /** @@ -17309,6 +17364,7 @@ function _noMeasure(objName, fnName, func) { module.exports = ReactPerf; }).call(this,require('_process')) + },{"_process":1}],123:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -17447,6 +17503,7 @@ if ("production" !== process.env.NODE_ENV) { module.exports = ReactPropTypeLocationNames; }).call(this,require('_process')) + },{"_process":1}],125:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -18176,6 +18233,7 @@ var ReactReconciler = { module.exports = ReactReconciler; }).call(this,require('_process')) + },{"./ReactElementValidator":104,"./ReactRef":130,"_process":1}],130:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -18360,6 +18418,7 @@ module.exports = { }; }).call(this,require('_process')) + },{"./ReactElement":103,"./ReactInstanceHandles":112,"./ReactMarkupChecksum":116,"./ReactServerRenderingTransaction":133,"./emptyObject":171,"./instantiateReactComponent":190,"./invariant":191,"_process":1}],133:[function(require,module,exports){ /** * Copyright 2014-2015, Facebook, Inc. @@ -18608,6 +18667,7 @@ var ReactUpdates = require("./ReactUpdates"); var SyntheticEvent = require("./SyntheticEvent"); var assign = require("./Object.assign"); +var emptyObject = require("./emptyObject"); var topLevelTypes = EventConstants.topLevelTypes; @@ -18949,6 +19009,9 @@ assign( ); ReactShallowRenderer.prototype.render = function(element, context) { + if (!context) { + context = emptyObject; + } var transaction = ReactUpdates.ReactReconcileTransaction.getPooled(); this._render(element, transaction, context); ReactUpdates.ReactReconcileTransaction.release(transaction); @@ -19089,7 +19152,7 @@ for (eventType in topLevelTypes) { module.exports = ReactTestUtils; -},{"./EventConstants":56,"./EventPluginHub":58,"./EventPropagators":61,"./Object.assign":69,"./React":71,"./ReactBrowserEventEmitter":73,"./ReactCompositeComponent":83,"./ReactElement":103,"./ReactEmptyComponent":105,"./ReactInstanceHandles":112,"./ReactInstanceMap":113,"./ReactMount":117,"./ReactUpdates":140,"./SyntheticEvent":149}],136:[function(require,module,exports){ +},{"./EventConstants":56,"./EventPluginHub":58,"./EventPropagators":61,"./Object.assign":69,"./React":71,"./ReactBrowserEventEmitter":73,"./ReactCompositeComponent":83,"./ReactElement":103,"./ReactEmptyComponent":105,"./ReactInstanceHandles":112,"./ReactInstanceMap":113,"./ReactMount":117,"./ReactUpdates":140,"./SyntheticEvent":149,"./emptyObject":171}],136:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -19834,6 +19897,7 @@ var ReactUpdateQueue = { module.exports = ReactUpdateQueue; }).call(this,require('_process')) + },{"./Object.assign":69,"./ReactCurrentOwner":85,"./ReactElement":103,"./ReactInstanceMap":113,"./ReactLifeCycle":114,"./ReactUpdates":140,"./invariant":191,"./warning":212,"_process":1}],140:[function(require,module,exports){ (function (process){ /** @@ -20116,6 +20180,7 @@ var ReactUpdates = { module.exports = ReactUpdates; }).call(this,require('_process')) + },{"./CallbackQueue":47,"./Object.assign":69,"./PooledClass":70,"./ReactCurrentOwner":85,"./ReactPerf":122,"./ReactReconciler":129,"./Transaction":157,"./invariant":191,"./warning":212,"_process":1}],141:[function(require,module,exports){ (function (process){ /** @@ -20172,6 +20237,7 @@ if ("production" !== process.env.NODE_ENV) { module.exports = React; }).call(this,require('_process')) + },{"./LinkedStateMixin":65,"./React":71,"./ReactCSSTransitionGroup":74,"./ReactComponentWithPureRenderMixin":82,"./ReactDefaultPerf":101,"./ReactFragment":109,"./ReactTestUtils":135,"./ReactTransitionGroup":138,"./ReactUpdates":140,"./cloneWithProps":163,"./cx":168,"./update":211,"_process":1}],142:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -20194,6 +20260,7 @@ var MUST_USE_ATTRIBUTE = DOMProperty.injection.MUST_USE_ATTRIBUTE; var SVGDOMPropertyConfig = { Properties: { + clipPath: MUST_USE_ATTRIBUTE, cx: MUST_USE_ATTRIBUTE, cy: MUST_USE_ATTRIBUTE, d: MUST_USE_ATTRIBUTE, @@ -20239,6 +20306,7 @@ var SVGDOMPropertyConfig = { y: MUST_USE_ATTRIBUTE }, DOMAttributeNames: { + clipPath: 'clip-path', fillOpacity: 'fill-opacity', fontFamily: 'font-family', fontSize: 'font-size', @@ -20918,6 +20986,7 @@ var SimpleEventPlugin = { module.exports = SimpleEventPlugin; }).call(this,require('_process')) + },{"./EventConstants":56,"./EventPluginUtils":60,"./EventPropagators":61,"./SyntheticClipboardEvent":146,"./SyntheticDragEvent":148,"./SyntheticEvent":149,"./SyntheticFocusEvent":150,"./SyntheticKeyboardEvent":152,"./SyntheticMouseEvent":153,"./SyntheticTouchEvent":154,"./SyntheticUIEvent":155,"./SyntheticWheelEvent":156,"./getEventCharCode":178,"./invariant":191,"./keyOf":198,"./warning":212,"_process":1}],146:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -21878,6 +21947,7 @@ var Transaction = { module.exports = Transaction; }).call(this,require('_process')) + },{"./invariant":191,"_process":1}],158:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -21973,6 +22043,7 @@ function accumulateInto(current, next) { module.exports = accumulateInto; }).call(this,require('_process')) + },{"./invariant":191,"_process":1}],160:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -22140,6 +22211,7 @@ function cloneWithProps(child, props) { module.exports = cloneWithProps; }).call(this,require('_process')) + },{"./ReactElement":103,"./ReactPropTransferer":123,"./keyOf":198,"./warning":212,"_process":1}],164:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -22332,6 +22404,7 @@ function createFullPageComponent(tag) { module.exports = createFullPageComponent; }).call(this,require('_process')) + },{"./ReactClass":78,"./ReactElement":103,"./invariant":191,"_process":1}],167:[function(require,module,exports){ (function (process){ /** @@ -22422,6 +22495,7 @@ function createNodesFromMarkup(markup, handleScript) { module.exports = createNodesFromMarkup; }).call(this,require('_process')) + },{"./ExecutionEnvironment":62,"./createArrayFromMixed":165,"./getMarkupWrap":183,"./invariant":191,"_process":1}],168:[function(require,module,exports){ (function (process){ /** @@ -22478,6 +22552,7 @@ function cx(classNames) { module.exports = cx; }).call(this,require('_process')) + },{"./warning":212,"_process":1}],169:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -22594,6 +22669,7 @@ if ("production" !== process.env.NODE_ENV) { module.exports = emptyObject; }).call(this,require('_process')) + },{"_process":1}],172:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -22707,6 +22783,7 @@ function findDOMNode(componentOrElement) { module.exports = findDOMNode; }).call(this,require('_process')) + },{"./ReactCurrentOwner":85,"./ReactInstanceMap":113,"./ReactMount":117,"./invariant":191,"./isNode":193,"./warning":212,"_process":1}],174:[function(require,module,exports){ (function (process){ /** @@ -22765,6 +22842,7 @@ function flattenChildren(children) { module.exports = flattenChildren; }).call(this,require('_process')) + },{"./traverseAllChildren":210,"./warning":212,"_process":1}],175:[function(require,module,exports){ /** * Copyright 2014-2015, Facebook, Inc. @@ -23166,6 +23244,7 @@ var shouldWrap = { // Force wrapping for SVG elements because if they get created inside a <div>, // they will be initialized in the wrong namespace (and will not display). 'circle': true, + 'clipPath': true, 'defs': true, 'ellipse': true, 'g': true, @@ -23208,6 +23287,7 @@ var markupWrap = { 'th': trWrap, 'circle': svgWrap, + 'clipPath': svgWrap, 'defs': svgWrap, 'ellipse': svgWrap, 'g': svgWrap, @@ -23250,6 +23330,7 @@ function getMarkupWrap(nodeName) { module.exports = getMarkupWrap; }).call(this,require('_process')) + },{"./ExecutionEnvironment":62,"./invariant":191,"_process":1}],184:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -23555,6 +23636,7 @@ assign( function isInternalComponentType(type) { return ( typeof type === 'function' && + typeof type.prototype !== 'undefined' && typeof type.prototype.mountComponent === 'function' && typeof type.prototype.receiveComponent === 'function' ); @@ -23648,6 +23730,7 @@ function instantiateReactComponent(node, parentCompositeType) { module.exports = instantiateReactComponent; }).call(this,require('_process')) + },{"./Object.assign":69,"./ReactCompositeComponent":83,"./ReactEmptyComponent":105,"./ReactNativeComponent":120,"./invariant":191,"./warning":212,"_process":1}],191:[function(require,module,exports){ (function (process){ /** @@ -23705,6 +23788,7 @@ var invariant = function(condition, format, a, b, c, d, e, f) { module.exports = invariant; }).call(this,require('_process')) + },{"_process":1}],192:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -23961,6 +24045,7 @@ var keyMirror = function(obj) { module.exports = keyMirror; }).call(this,require('_process')) + },{"./invariant":191,"_process":1}],198:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -24123,6 +24208,7 @@ function onlyChild(children) { module.exports = onlyChild; }).call(this,require('_process')) + },{"./ReactElement":103,"./invariant":191,"_process":1}],202:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. @@ -24486,6 +24572,7 @@ function shouldUpdateReactComponent(prevElement, nextElement) { module.exports = shouldUpdateReactComponent; }).call(this,require('_process')) + },{"./warning":212,"_process":1}],209:[function(require,module,exports){ (function (process){ /** @@ -24558,6 +24645,7 @@ function toArray(obj) { module.exports = toArray; }).call(this,require('_process')) + },{"./invariant":191,"_process":1}],210:[function(require,module,exports){ (function (process){ /** @@ -24811,6 +24899,7 @@ function traverseAllChildren(children, callback, traverseContext) { module.exports = traverseAllChildren; }).call(this,require('_process')) + },{"./ReactElement":103,"./ReactFragment":109,"./ReactInstanceHandles":112,"./getIteratorFn":182,"./invariant":191,"./warning":212,"_process":1}],211:[function(require,module,exports){ (function (process){ /** @@ -24824,11 +24913,14 @@ module.exports = traverseAllChildren; * @providesModule update */ + /* global hasOwnProperty:true */ + 'use strict'; var assign = require("./Object.assign"); var keyOf = require("./keyOf"); var invariant = require("./invariant"); +var hasOwnProperty = {}.hasOwnProperty; function shallowCopy(x) { if (Array.isArray(x)) { @@ -24888,7 +24980,7 @@ function update(value, spec) { COMMAND_SET ) : invariant(typeof spec === 'object')); - if (spec.hasOwnProperty(COMMAND_SET)) { + if (hasOwnProperty.call(spec, COMMAND_SET)) { ("production" !== process.env.NODE_ENV ? invariant( Object.keys(spec).length === 1, 'Cannot have more than one key in an object with %s', @@ -24900,7 +24992,7 @@ function update(value, spec) { var nextValue = shallowCopy(value); - if (spec.hasOwnProperty(COMMAND_MERGE)) { + if (hasOwnProperty.call(spec, COMMAND_MERGE)) { var mergeObj = spec[COMMAND_MERGE]; ("production" !== process.env.NODE_ENV ? invariant( mergeObj && typeof mergeObj === 'object', @@ -24917,21 +25009,21 @@ function update(value, spec) { assign(nextValue, spec[COMMAND_MERGE]); } - if (spec.hasOwnProperty(COMMAND_PUSH)) { + if (hasOwnProperty.call(spec, COMMAND_PUSH)) { invariantArrayCase(value, spec, COMMAND_PUSH); spec[COMMAND_PUSH].forEach(function(item) { nextValue.push(item); }); } - if (spec.hasOwnProperty(COMMAND_UNSHIFT)) { + if (hasOwnProperty.call(spec, COMMAND_UNSHIFT)) { invariantArrayCase(value, spec, COMMAND_UNSHIFT); spec[COMMAND_UNSHIFT].forEach(function(item) { nextValue.unshift(item); }); } - if (spec.hasOwnProperty(COMMAND_SPLICE)) { + if (hasOwnProperty.call(spec, COMMAND_SPLICE)) { ("production" !== process.env.NODE_ENV ? invariant( Array.isArray(value), 'Expected %s target to be an array; got %s', @@ -24957,7 +25049,7 @@ function update(value, spec) { }); } - if (spec.hasOwnProperty(COMMAND_APPLY)) { + if (hasOwnProperty.call(spec, COMMAND_APPLY)) { ("production" !== process.env.NODE_ENV ? invariant( typeof spec[COMMAND_APPLY] === 'function', 'update(): expected spec of %s to be a function; got %s.', @@ -24979,6 +25071,7 @@ function update(value, spec) { module.exports = update; }).call(this,require('_process')) + },{"./Object.assign":69,"./invariant":191,"./keyOf":198,"_process":1}],212:[function(require,module,exports){ (function (process){ /** @@ -25042,9 +25135,10 @@ if ("production" !== process.env.NODE_ENV) { module.exports = warning; }).call(this,require('_process')) + },{"./emptyFunction":170,"_process":1}],"flux":[function(require,module,exports){ /** - * Copyright (c) 2014, Facebook, Inc. + * Copyright (c) 2014-2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the @@ -25052,11 +25146,11 @@ module.exports = warning; * of patent rights can be found in the PATENTS file in the same directory. */ -module.exports.Dispatcher = require('./lib/Dispatcher') +module.exports.Dispatcher = require('./lib/Dispatcher'); },{"./lib/Dispatcher":2}],"jquery":[function(require,module,exports){ /*! - * jQuery JavaScript Library v2.1.3 + * jQuery JavaScript Library v2.1.4 * http://jquery.com/ * * Includes Sizzle.js @@ -25066,7 +25160,7 @@ module.exports.Dispatcher = require('./lib/Dispatcher') * Released under the MIT license * http://jquery.org/license * - * Date: 2014-12-18T15:11Z + * Date: 2015-04-28T16:01Z */ (function( global, factory ) { @@ -25124,7 +25218,7 @@ var // Use the correct document accordingly with window argument (sandbox) document = window.document, - version = "2.1.3", + version = "2.1.4", // Define a local copy of jQuery jQuery = function( selector, context ) { @@ -25588,7 +25682,12 @@ jQuery.each("Boolean Number String Function Array Date RegExp Object Error".spli }); function isArraylike( obj ) { - var length = obj.length, + + // Support: iOS 8.2 (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = "length" in obj && obj.length, type = jQuery.type( obj ); if ( type === "function" || jQuery.isWindow( obj ) ) { @@ -34265,10 +34364,10 @@ return jQuery; (function (global){ /** * @license - * lodash 3.6.0 (Custom Build) <https://lodash.com/> + * lodash 3.10.1 (Custom Build) <https://lodash.com/> * Build: `lodash modern -d -o ./index.js` * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/> - * Based on Underscore.js 1.8.2 <http://underscorejs.org/LICENSE> + * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors * Available under MIT license <https://lodash.com/license> */ @@ -34278,7 +34377,7 @@ return jQuery; var undefined; /** Used as the semantic version number. */ - var VERSION = '3.6.0'; + var VERSION = '3.10.1'; /** Used to compose bitmasks for wrapper metadata. */ var BIND_FLAG = 1, @@ -34299,9 +34398,11 @@ return jQuery; var HOT_COUNT = 150, HOT_SPAN = 16; + /** Used as the size to enable large array optimizations. */ + var LARGE_ARRAY_SIZE = 200; + /** Used to indicate the type of lazy iteratees. */ - var LAZY_DROP_WHILE_FLAG = 0, - LAZY_FILTER_FLAG = 1, + var LAZY_FILTER_FLAG = 1, LAZY_MAP_FLAG = 2; /** Used as the `TypeError` message for "Functions" methods. */ @@ -34352,24 +34453,38 @@ return jQuery; reEvaluate = /<%([\s\S]+?)%>/g, reInterpolate = /<%=([\s\S]+?)%>/g; - /** - * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). - */ - var reComboMarks = /[\u0300-\u036f\ufe20-\ufe23]/g; + /** Used to match property names within property paths. */ + var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\n\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/, + rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g; /** - * Used to match [ES template delimiters](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-template-literal-lexical-components). + * Used to match `RegExp` [syntax characters](http://ecma-international.org/ecma-262/6.0/#sec-patterns) + * and those outlined by [`EscapeRegExpPattern`](http://ecma-international.org/ecma-262/6.0/#sec-escaperegexppattern). */ + var reRegExpChars = /^[:!,]|[\\^$.*+?()[\]{}|\/]|(^[0-9a-fA-Fnrtuvx])|([\n\r\u2028\u2029])/g, + reHasRegExpChars = RegExp(reRegExpChars.source); + + /** Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). */ + var reComboMark = /[\u0300-\u036f\ufe20-\ufe23]/g; + + /** Used to match backslashes in property paths. */ + var reEscapeChar = /\\(\\)?/g; + + /** Used to match [ES template delimiters](http://ecma-international.org/ecma-262/6.0/#sec-template-literal-lexical-components). */ var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g; /** Used to match `RegExp` flags from their coerced string values. */ var reFlags = /\w*$/; /** Used to detect hexadecimal string values. */ - var reHexPrefix = /^0[xX]/; + var reHasHexPrefix = /^0[xX]/; /** Used to detect host constructors (Safari > 5). */ - var reHostCtor = /^\[object .+?Constructor\]$/; + var reIsHostCtor = /^\[object .+?Constructor\]$/; + + /** Used to detect unsigned integer values. */ + var reIsUint = /^\d+$/; /** Used to match latin-1 supplementary letters (excluding mathematical operators). */ var reLatin1 = /[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g; @@ -34377,14 +34492,6 @@ return jQuery; /** Used to ensure capturing order of template delimiters. */ var reNoMatch = /($^)/; - /** - * Used to match `RegExp` [special characters](http://www.regular-expressions.info/characters.html#special). - * In addition to special characters the forward slash is escaped to allow for - * easier `eval` use and `Function` compilation. - */ - var reRegExpChars = /[.*+?^${}()|[\]\/\\]/g, - reHasRegExpChars = RegExp(reRegExpChars.source); - /** Used to match unescaped characters in compiled string literals. */ var reUnescapedString = /['\n\r\u2028\u2029\\]/g; @@ -34396,26 +34503,13 @@ return jQuery; return RegExp(upper + '+(?=' + upper + lower + ')|' + upper + '?' + lower + '|' + upper + '+|[0-9]+', 'g'); }()); - /** Used to detect and test for whitespace. */ - var whitespace = ( - // Basic whitespace characters. - ' \t\x0b\f\xa0\ufeff' + - - // Line terminators. - '\n\r\u2028\u2029' + - - // Unicode category "Zs" space separators. - '\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000' - ); - /** Used to assign default `context` object properties. */ var contextProps = [ 'Array', 'ArrayBuffer', 'Date', 'Error', 'Float32Array', 'Float64Array', 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Math', 'Number', - 'Object', 'RegExp', 'Set', 'String', '_', 'clearTimeout', 'document', - 'isFinite', 'parseInt', 'setTimeout', 'TypeError', 'Uint8Array', - 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap', - 'window' + 'Object', 'RegExp', 'Set', 'String', '_', 'clearTimeout', 'isFinite', + 'parseFloat', 'parseInt', 'setTimeout', 'TypeError', 'Uint8Array', + 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap' ]; /** Used to make template sourceURLs easier to identify. */ @@ -34451,13 +34545,6 @@ return jQuery; cloneableTags[mapTag] = cloneableTags[setTag] = cloneableTags[weakMapTag] = false; - /** Used as an internal `_.debounce` options object by `_.throttle`. */ - var debounceOptions = { - 'leading': false, - 'maxWait': 0, - 'trailing': false - }; - /** Used to map latin-1 supplementary letters to basic latin letters. */ var deburredLetters = { '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A', @@ -34505,6 +34592,15 @@ return jQuery; 'object': true }; + /** Used to escape characters for inclusion in compiled regexes. */ + var regexpEscapes = { + '0': 'x30', '1': 'x31', '2': 'x32', '3': 'x33', '4': 'x34', + '5': 'x35', '6': 'x36', '7': 'x37', '8': 'x38', '9': 'x39', + 'A': 'x41', 'B': 'x42', 'C': 'x43', 'D': 'x44', 'E': 'x45', 'F': 'x46', + 'a': 'x61', 'b': 'x62', 'c': 'x63', 'd': 'x64', 'e': 'x65', 'f': 'x66', + 'n': 'x6e', 'r': 'x72', 't': 'x74', 'u': 'x75', 'v': 'x76', 'x': 'x78' + }; + /** Used to escape characters for inclusion in compiled string literals. */ var stringEscapes = { '\\': '\\', @@ -34522,7 +34618,7 @@ return jQuery; var freeModule = objectTypes[typeof module] && module && !module.nodeType && module; /** Detect free variable `global` from Node.js. */ - var freeGlobal = freeExports && freeModule && typeof global == 'object' && global; + var freeGlobal = freeExports && freeModule && typeof global == 'object' && global && global.Object && global; /** Detect free variable `self`. */ var freeSelf = objectTypes[typeof self] && self && self.Object && self; @@ -34536,7 +34632,7 @@ return jQuery; /** * Used as a reference to the global object. * - * The `this` value is used if it is the global object to avoid Greasemonkey's + * The `this` value is used if it's the global object to avoid Greasemonkey's * restricted `window` object, otherwise the `window` object is used. */ var root = freeGlobal || ((freeWindow !== (this && this.window)) && freeWindow) || freeSelf || this; @@ -34548,19 +34644,28 @@ return jQuery; * sorts them in ascending order without guaranteeing a stable sort. * * @private - * @param {*} value The value to compare to `other`. - * @param {*} other The value to compare to `value`. + * @param {*} value The value to compare. + * @param {*} other The other value to compare. * @returns {number} Returns the sort order indicator for `value`. */ function baseCompareAscending(value, other) { if (value !== other) { - var valIsReflexive = value === value, + var valIsNull = value === null, + valIsUndef = value === undefined, + valIsReflexive = value === value; + + var othIsNull = other === null, + othIsUndef = other === undefined, othIsReflexive = other === other; - if (value > other || !valIsReflexive || (typeof value == 'undefined' && othIsReflexive)) { + if ((value > other && !othIsNull) || !valIsReflexive || + (valIsNull && !othIsUndef && othIsReflexive) || + (valIsUndef && othIsReflexive)) { return 1; } - if (value < other || !othIsReflexive || (typeof other == 'undefined' && valIsReflexive)) { + if ((value < other && !valIsNull) || !othIsReflexive || + (othIsNull && !valIsUndef && valIsReflexive) || + (othIsUndef && valIsReflexive)) { return -1; } } @@ -34628,7 +34733,7 @@ return jQuery; } /** - * Converts `value` to a string if it is not one. An empty string is returned + * Converts `value` to a string if it's not one. An empty string is returned * for `null` or `undefined` values. * * @private @@ -34636,24 +34741,10 @@ return jQuery; * @returns {string} Returns the string. */ function baseToString(value) { - if (typeof value == 'string') { - return value; - } return value == null ? '' : (value + ''); } /** - * Used by `_.max` and `_.min` as the default callback for string values. - * - * @private - * @param {string} string The string to inspect. - * @returns {number} Returns the code unit of the first character of the string. - */ - function charAtCallback(string) { - return string.charCodeAt(0); - } - - /** * Used by `_.trim` and `_.trimLeft` to get the index of the first character * of `string` that is not found in `chars`. * @@ -34691,8 +34782,8 @@ return jQuery; * sort them in ascending order. * * @private - * @param {Object} object The object to compare to `other`. - * @param {Object} other The object to compare to `object`. + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. * @returns {number} Returns the sort order indicator for `object`. */ function compareAscending(object, other) { @@ -34700,16 +34791,16 @@ return jQuery; } /** - * Used by `_.sortByOrder` to compare multiple properties of each element - * in a collection and stable sort them in the following order: + * Used by `_.sortByOrder` to compare multiple properties of a value to another + * and stable sort them. * - * If orders is unspecified, sort in ascending order for all properties. - * Otherwise, for each property, sort in ascending order if its corresponding value in - * orders is true, and descending order if false. + * If `orders` is unspecified, all valuess are sorted in ascending order. Otherwise, + * a value is sorted in ascending order if its corresponding order is "asc", and + * descending if "desc". * * @private - * @param {Object} object The object to compare to `other`. - * @param {Object} other The object to compare to `object`. + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. * @param {boolean[]} orders The order to sort by for each property. * @returns {number} Returns the sort order indicator for `object`. */ @@ -34726,7 +34817,8 @@ return jQuery; if (index >= ordersLength) { return result; } - return result * (orders[index] ? 1 : -1); + var order = orders[index]; + return result * ((order === 'asc' || order === true) ? 1 : -1); } } // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications @@ -34762,8 +34854,25 @@ return jQuery; } /** - * Used by `_.template` to escape characters for inclusion in compiled - * string literals. + * Used by `_.escapeRegExp` to escape characters for inclusion in compiled regexes. + * + * @private + * @param {string} chr The matched character to escape. + * @param {string} leadingChar The capture group for a leading character. + * @param {string} whitespaceChar The capture group for a whitespace character. + * @returns {string} Returns the escaped character. + */ + function escapeRegExpChar(chr, leadingChar, whitespaceChar) { + if (leadingChar) { + chr = regexpEscapes[chr]; + } else if (whitespaceChar) { + chr = stringEscapes[chr]; + } + return '\\' + chr; + } + + /** + * Used by `_.template` to escape characters for inclusion in compiled string literals. * * @private * @param {string} chr The matched character to escape. @@ -34974,15 +35083,9 @@ return jQuery; objectProto = Object.prototype, stringProto = String.prototype; - /** Used to detect DOM support. */ - var document = (document = context.window) && document.document; - /** Used to resolve the decompiled source of functions. */ var fnToString = Function.prototype.toString; - /** Used to the length of n-tuples for `_.unzip`. */ - var getLength = baseProperty('length'); - /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; @@ -34990,56 +35093,42 @@ return jQuery; var idCounter = 0; /** - * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring) + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) * of values. */ var objToString = objectProto.toString; /** Used to restore the original `_` reference in `_.noConflict`. */ - var oldDash = context._; + var oldDash = root._; /** Used to detect if a method is native. */ - var reNative = RegExp('^' + - escapeRegExp(objToString) - .replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' + var reIsNative = RegExp('^' + + fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' ); /** Native method references. */ - var ArrayBuffer = isNative(ArrayBuffer = context.ArrayBuffer) && ArrayBuffer, - bufferSlice = isNative(bufferSlice = ArrayBuffer && new ArrayBuffer(0).slice) && bufferSlice, - ceil = Math.ceil, + var ArrayBuffer = context.ArrayBuffer, clearTimeout = context.clearTimeout, - floor = Math.floor, - getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf, - push = arrayProto.push, + parseFloat = context.parseFloat, + pow = Math.pow, propertyIsEnumerable = objectProto.propertyIsEnumerable, - Set = isNative(Set = context.Set) && Set, + Set = getNative(context, 'Set'), setTimeout = context.setTimeout, splice = arrayProto.splice, - Uint8Array = isNative(Uint8Array = context.Uint8Array) && Uint8Array, - WeakMap = isNative(WeakMap = context.WeakMap) && WeakMap; - - /** Used to clone array buffers. */ - var Float64Array = (function() { - // Safari 5 errors when using an array buffer to initialize a typed array - // where the array buffer's `byteLength` is not a multiple of the typed - // array's `BYTES_PER_ELEMENT`. - try { - var func = isNative(func = context.Float64Array) && func, - result = new func(new ArrayBuffer(10), 0, 1) && func; - } catch(e) {} - return result; - }()); + Uint8Array = context.Uint8Array, + WeakMap = getNative(context, 'WeakMap'); /* Native method references for those with the same name as other `lodash` methods. */ - var nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray, - nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate, + var nativeCeil = Math.ceil, + nativeCreate = getNative(Object, 'create'), + nativeFloor = Math.floor, + nativeIsArray = getNative(Array, 'isArray'), nativeIsFinite = context.isFinite, - nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys, + nativeKeys = getNative(Object, 'keys'), nativeMax = Math.max, nativeMin = Math.min, - nativeNow = isNative(nativeNow = Date.now) && nativeNow, - nativeNumIsFinite = isNative(nativeNumIsFinite = Number.isFinite) && nativeNumIsFinite, + nativeNow = getNative(Date, 'now'), nativeParseInt = context.parseInt, nativeRandom = Math.random; @@ -35048,18 +35137,15 @@ return jQuery; POSITIVE_INFINITY = Number.POSITIVE_INFINITY; /** Used as references for the maximum length and index of an array. */ - var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1, - MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, + var MAX_ARRAY_LENGTH = 4294967295, + MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; - /** Used as the size, in bytes, of each `Float64Array` element. */ - var FLOAT64_BYTES_PER_ELEMENT = Float64Array ? Float64Array.BYTES_PER_ELEMENT : 0; - /** - * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer) + * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) * of an array-like value. */ - var MAX_SAFE_INTEGER = Math.pow(2, 53) - 1; + var MAX_SAFE_INTEGER = 9007199254740991; /** Used to store function metadata. */ var metaMap = WeakMap && new WeakMap; @@ -35072,15 +35158,16 @@ return jQuery; /** * Creates a `lodash` object which wraps `value` to enable implicit chaining. * Methods that operate on and return arrays, collections, and functions can - * be chained together. Methods that return a boolean or single value will - * automatically end the chain returning the unwrapped value. Explicit chaining - * may be enabled using `_.chain`. The execution of chained methods is lazy, - * that is, execution is deferred until `_#value` is implicitly or explicitly - * called. + * be chained together. Methods that retrieve a single value or may return a + * primitive value will automatically end the chain returning the unwrapped + * value. Explicit chaining may be enabled using `_.chain`. The execution of + * chained methods is lazy, that is, execution is deferred until `_#value` + * is implicitly or explicitly called. * * Lazy evaluation allows several methods to support shortcut fusion. Shortcut - * fusion is an optimization that merges iteratees to avoid creating intermediate - * arrays and reduce the number of iteratee executions. + * fusion is an optimization strategy which merge iteratee calls; this can help + * to avoid the creation of intermediate data structures and greatly reduce the + * number of iteratee executions. * * Chaining is supported in custom builds as long as the `_#value` method is * directly or indirectly included in the build. @@ -35103,35 +35190,37 @@ return jQuery; * The chainable wrapper methods are: * `after`, `ary`, `assign`, `at`, `before`, `bind`, `bindAll`, `bindKey`, * `callback`, `chain`, `chunk`, `commit`, `compact`, `concat`, `constant`, - * `countBy`, `create`, `curry`, `debounce`, `defaults`, `defer`, `delay`, - * `difference`, `drop`, `dropRight`, `dropRightWhile`, `dropWhile`, `fill`, - * `filter`, `flatten`, `flattenDeep`, `flow`, `flowRight`, `forEach`, - * `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `functions`, - * `groupBy`, `indexBy`, `initial`, `intersection`, `invert`, `invoke`, `keys`, - * `keysIn`, `map`, `mapValues`, `matches`, `matchesProperty`, `memoize`, `merge`, - * `mixin`, `negate`, `noop`, `omit`, `once`, `pairs`, `partial`, `partialRight`, + * `countBy`, `create`, `curry`, `debounce`, `defaults`, `defaultsDeep`, + * `defer`, `delay`, `difference`, `drop`, `dropRight`, `dropRightWhile`, + * `dropWhile`, `fill`, `filter`, `flatten`, `flattenDeep`, `flow`, `flowRight`, + * `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`, + * `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`, + * `invoke`, `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, + * `matchesProperty`, `memoize`, `merge`, `method`, `methodOf`, `mixin`, + * `modArgs`, `negate`, `omit`, `once`, `pairs`, `partial`, `partialRight`, * `partition`, `pick`, `plant`, `pluck`, `property`, `propertyOf`, `pull`, - * `pullAt`, `push`, `range`, `rearg`, `reject`, `remove`, `rest`, `reverse`, - * `shuffle`, `slice`, `sort`, `sortBy`, `sortByAll`, `sortByOrder`, `splice`, - * `spread`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `tap`, - * `throttle`, `thru`, `times`, `toArray`, `toPlainObject`, `transform`, - * `union`, `uniq`, `unshift`, `unzip`, `values`, `valuesIn`, `where`, - * `without`, `wrap`, `xor`, `zip`, and `zipObject` + * `pullAt`, `push`, `range`, `rearg`, `reject`, `remove`, `rest`, `restParam`, + * `reverse`, `set`, `shuffle`, `slice`, `sort`, `sortBy`, `sortByAll`, + * `sortByOrder`, `splice`, `spread`, `take`, `takeRight`, `takeRightWhile`, + * `takeWhile`, `tap`, `throttle`, `thru`, `times`, `toArray`, `toPlainObject`, + * `transform`, `union`, `uniq`, `unshift`, `unzip`, `unzipWith`, `values`, + * `valuesIn`, `where`, `without`, `wrap`, `xor`, `zip`, `zipObject`, `zipWith` * * The wrapper methods that are **not** chainable by default are: - * `add`, `attempt`, `camelCase`, `capitalize`, `clone`, `cloneDeep`, `deburr`, - * `endsWith`, `escape`, `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, - * `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`, `has`, - * `identity`, `includes`, `indexOf`, `inRange`, `isArguments`, `isArray`, - * `isBoolean`, `isDate`, `isElement`, `isEmpty`, `isEqual`, `isError`, - * `isFinite`,`isFunction`, `isMatch`, `isNative`, `isNaN`, `isNull`, `isNumber`, - * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, - * `isTypedArray`, `join`, `kebabCase`, `last`, `lastIndexOf`, `max`, `min`, - * `noConflict`, `now`, `pad`, `padLeft`, `padRight`, `parseInt`, `pop`, - * `random`, `reduce`, `reduceRight`, `repeat`, `result`, `runInContext`, - * `shift`, `size`, `snakeCase`, `some`, `sortedIndex`, `sortedLastIndex`, - * `startCase`, `startsWith`, `sum`, `template`, `trim`, `trimLeft`, - * `trimRight`, `trunc`, `unescape`, `uniqueId`, `value`, and `words` + * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clone`, `cloneDeep`, + * `deburr`, `endsWith`, `escape`, `escapeRegExp`, `every`, `find`, `findIndex`, + * `findKey`, `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`, + * `floor`, `get`, `gt`, `gte`, `has`, `identity`, `includes`, `indexOf`, + * `inRange`, `isArguments`, `isArray`, `isBoolean`, `isDate`, `isElement`, + * `isEmpty`, `isEqual`, `isError`, `isFinite` `isFunction`, `isMatch`, + * `isNative`, `isNaN`, `isNull`, `isNumber`, `isObject`, `isPlainObject`, + * `isRegExp`, `isString`, `isUndefined`, `isTypedArray`, `join`, `kebabCase`, + * `last`, `lastIndexOf`, `lt`, `lte`, `max`, `min`, `noConflict`, `noop`, + * `now`, `pad`, `padLeft`, `padRight`, `parseInt`, `pop`, `random`, `reduce`, + * `reduceRight`, `repeat`, `result`, `round`, `runInContext`, `shift`, `size`, + * `snakeCase`, `some`, `sortedIndex`, `sortedLastIndex`, `startCase`, + * `startsWith`, `sum`, `template`, `trim`, `trimLeft`, `trimRight`, `trunc`, + * `unescape`, `uniqueId`, `value`, and `words` * * The wrapper method `sample` will return a wrapped value when `n` is provided, * otherwise an unwrapped value is returned. @@ -35146,8 +35235,8 @@ return jQuery; * var wrapped = _([1, 2, 3]); * * // returns an unwrapped value - * wrapped.reduce(function(sum, n) { - * return sum + n; + * wrapped.reduce(function(total, n) { + * return total + n; * }); * // => 6 * @@ -35206,57 +35295,6 @@ return jQuery; */ var support = lodash.support = {}; - (function(x) { - - /** - * Detect if functions can be decompiled by `Function#toString` - * (all but Firefox OS certified apps, older Opera mobile browsers, and - * the PlayStation 3; forced `false` for Windows 8 apps). - * - * @memberOf _.support - * @type boolean - */ - support.funcDecomp = /\bthis\b/.test(function() { return this; }); - - /** - * Detect if `Function#name` is supported (all but IE). - * - * @memberOf _.support - * @type boolean - */ - support.funcNames = typeof Function.name == 'string'; - - /** - * Detect if the DOM is supported. - * - * @memberOf _.support - * @type boolean - */ - try { - support.dom = document.createDocumentFragment().nodeType === 11; - } catch(e) { - support.dom = false; - } - - /** - * Detect if `arguments` object indexes are non-enumerable. - * - * In Firefox < 4, IE < 9, PhantomJS, and Safari < 5.1 `arguments` object - * indexes are non-enumerable. Chrome < 25 and Node.js < 0.11.0 treat - * `arguments` object indexes as non-enumerable and fail `hasOwnProperty` - * checks for indexes that exceed their function's formal parameters with - * associated values of `0`. - * - * @memberOf _.support - * @type boolean - */ - try { - support.nonEnumArgs = !propertyIsEnumerable.call(arguments, 1); - } catch(e) { - support.nonEnumArgs = true; - } - }(0, 0)); - /** * By default, the template delimiters used by lodash are like those in * embedded Ruby (ERB). Change the following template settings to use @@ -35328,13 +35366,12 @@ return jQuery; */ function LazyWrapper(value) { this.__wrapped__ = value; - this.__actions__ = null; + this.__actions__ = []; this.__dir__ = 1; - this.__dropCount__ = 0; this.__filtered__ = false; - this.__iteratees__ = null; + this.__iteratees__ = []; this.__takeCount__ = POSITIVE_INFINITY; - this.__views__ = null; + this.__views__ = []; } /** @@ -35346,17 +35383,13 @@ return jQuery; * @returns {Object} Returns the cloned `LazyWrapper` object. */ function lazyClone() { - var actions = this.__actions__, - iteratees = this.__iteratees__, - views = this.__views__, - result = new LazyWrapper(this.__wrapped__); - - result.__actions__ = actions ? arrayCopy(actions) : null; + var result = new LazyWrapper(this.__wrapped__); + result.__actions__ = arrayCopy(this.__actions__); result.__dir__ = this.__dir__; result.__filtered__ = this.__filtered__; - result.__iteratees__ = iteratees ? arrayCopy(iteratees) : null; + result.__iteratees__ = arrayCopy(this.__iteratees__); result.__takeCount__ = this.__takeCount__; - result.__views__ = views ? arrayCopy(views) : null; + result.__views__ = arrayCopy(this.__views__); return result; } @@ -35389,22 +35422,25 @@ return jQuery; * @returns {*} Returns the unwrapped value. */ function lazyValue() { - var array = this.__wrapped__.value(); - if (!isArray(array)) { - return baseWrapperValue(array, this.__actions__); - } - var dir = this.__dir__, + var array = this.__wrapped__.value(), + dir = this.__dir__, + isArr = isArray(array), isRight = dir < 0, - view = getView(0, array.length, this.__views__), + arrLength = isArr ? array.length : 0, + view = getView(0, arrLength, this.__views__), start = view.start, end = view.end, length = end - start, index = isRight ? end : (start - 1), - takeCount = nativeMin(length, this.__takeCount__), iteratees = this.__iteratees__, - iterLength = iteratees ? iteratees.length : 0, + iterLength = iteratees.length, resIndex = 0, - result = []; + takeCount = nativeMin(length, this.__takeCount__); + + if (!isArr || arrLength < LARGE_ARRAY_SIZE || (arrLength == length && takeCount == length)) { + return baseWrapperValue((isRight && isArr) ? array.reverse() : array, this.__actions__); + } + var result = []; outer: while (length-- && resIndex < takeCount) { @@ -35416,30 +35452,16 @@ return jQuery; while (++iterIndex < iterLength) { var data = iteratees[iterIndex], iteratee = data.iteratee, - type = data.type; + type = data.type, + computed = iteratee(value); - if (type == LAZY_DROP_WHILE_FLAG) { - if (data.done && (isRight ? (index > data.index) : (index < data.index))) { - data.count = 0; - data.done = false; - } - data.index = index; - if (!data.done) { - var limit = data.limit; - if (!(data.done = limit > -1 ? (data.count++ >= limit) : !iteratee(value))) { - continue outer; - } - } - } else { - var computed = iteratee(value); - if (type == LAZY_MAP_FLAG) { - value = computed; - } else if (!computed) { - if (type == LAZY_FILTER_FLAG) { - continue outer; - } else { - break outer; - } + if (type == LAZY_MAP_FLAG) { + value = computed; + } else if (!computed) { + if (type == LAZY_FILTER_FLAG) { + continue outer; + } else { + break outer; } } } @@ -35502,7 +35524,7 @@ return jQuery; } /** - * Adds `value` to `key` of the cache. + * Sets `value` to `key` of the cache. * * @private * @name set @@ -35572,6 +35594,30 @@ return jQuery; /*------------------------------------------------------------------------*/ /** + * Creates a new array joining `array` with `other`. + * + * @private + * @param {Array} array The array to join. + * @param {Array} other The other array to join. + * @returns {Array} Returns the new concatenated array. + */ + function arrayConcat(array, other) { + var index = -1, + length = array.length, + othIndex = -1, + othLength = other.length, + result = Array(length + othLength); + + while (++index < length) { + result[index] = array[index]; + } + while (++othIndex < othLength) { + result[index++] = other[othIndex]; + } + return result; + } + + /** * Copies the values of `source` to `array`. * * @private @@ -35654,6 +35700,35 @@ return jQuery; } /** + * A specialized version of `baseExtremum` for arrays which invokes `iteratee` + * with one argument: (value). + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} comparator The function used to compare values. + * @param {*} exValue The initial extremum value. + * @returns {*} Returns the extremum value. + */ + function arrayExtremum(array, iteratee, comparator, exValue) { + var index = -1, + length = array.length, + computed = exValue, + result = computed; + + while (++index < length) { + var value = array[index], + current = +iteratee(value); + + if (comparator(current, computed)) { + computed = current; + result = value; + } + } + return result; + } + + /** * A specialized version of `_.filter` for arrays without support for callback * shorthands and `this` binding. * @@ -35698,45 +35773,22 @@ return jQuery; } /** - * A specialized version of `_.max` for arrays without support for iteratees. + * Appends the elements of `values` to `array`. * * @private - * @param {Array} array The array to iterate over. - * @returns {*} Returns the maximum value. + * @param {Array} array The array to modify. + * @param {Array} values The values to append. + * @returns {Array} Returns `array`. */ - function arrayMax(array) { + function arrayPush(array, values) { var index = -1, - length = array.length, - result = NEGATIVE_INFINITY; + length = values.length, + offset = array.length; while (++index < length) { - var value = array[index]; - if (value > result) { - result = value; - } + array[offset + index] = values[index]; } - return result; - } - - /** - * A specialized version of `_.min` for arrays without support for iteratees. - * - * @private - * @param {Array} array The array to iterate over. - * @returns {*} Returns the minimum value. - */ - function arrayMin(array) { - var index = -1, - length = array.length, - result = POSITIVE_INFINITY; - - while (++index < length) { - var value = array[index]; - if (value < result) { - result = value; - } - } - return result; + return array; } /** @@ -35810,18 +35862,20 @@ return jQuery; } /** - * A specialized version of `_.sum` for arrays without support for iteratees. + * A specialized version of `_.sum` for arrays without support for callback + * shorthands and `this` binding.. * * @private * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. * @returns {number} Returns the sum. */ - function arraySum(array) { + function arraySum(array, iteratee) { var length = array.length, result = 0; while (length--) { - result += +array[length] || 0; + result += +iteratee(array[length]) || 0; } return result; } @@ -35835,13 +35889,13 @@ return jQuery; * @returns {*} Returns the value to assign to the destination object. */ function assignDefaults(objectValue, sourceValue) { - return typeof objectValue == 'undefined' ? sourceValue : objectValue; + return objectValue === undefined ? sourceValue : objectValue; } /** * Used by `_.template` to customize its `_.assign` use. * - * **Note:** This method is like `assignDefaults` except that it ignores + * **Note:** This function is like `assignDefaults` except that it ignores * inherited property values when checking if a property is `undefined`. * * @private @@ -35852,27 +35906,25 @@ return jQuery; * @returns {*} Returns the value to assign to the destination object. */ function assignOwnDefaults(objectValue, sourceValue, key, object) { - return (typeof objectValue == 'undefined' || !hasOwnProperty.call(object, key)) + return (objectValue === undefined || !hasOwnProperty.call(object, key)) ? sourceValue : objectValue; } /** - * The base implementation of `_.assign` without support for argument juggling, - * multiple sources, and `this` binding `customizer` functions. + * A specialized version of `_.assign` for customizing assigned values without + * support for argument juggling, multiple sources, and `this` binding `customizer` + * functions. * * @private * @param {Object} object The destination object. * @param {Object} source The source object. - * @param {Function} [customizer] The function to customize assigning values. - * @returns {Object} Returns the destination object. + * @param {Function} customizer The function to customize assigned values. + * @returns {Object} Returns `object`. */ - function baseAssign(object, source, customizer) { - var props = keys(source); - if (!customizer) { - return baseCopy(source, object, props); - } + function assignWith(object, source, customizer) { var index = -1, + props = keys(source), length = props.length; while (++index < length) { @@ -35881,7 +35933,7 @@ return jQuery; result = customizer(value, source[key], key, object, source); if ((result === result ? (result !== value) : (value === value)) || - (typeof value == 'undefined' && !(key in object))) { + (value === undefined && !(key in object))) { object[key] = result; } } @@ -35889,47 +35941,60 @@ return jQuery; } /** - * The base implementation of `_.at` without support for strings and individual - * key arguments. + * The base implementation of `_.assign` without support for argument juggling, + * multiple sources, and `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ + function baseAssign(object, source) { + return source == null + ? object + : baseCopy(source, keys(source), object); + } + + /** + * The base implementation of `_.at` without support for string collections + * and individual key arguments. * * @private * @param {Array|Object} collection The collection to iterate over. - * @param {number[]|string[]} [props] The property names or indexes of elements to pick. + * @param {number[]|string[]} props The property names or indexes of elements to pick. * @returns {Array} Returns the new array of picked elements. */ function baseAt(collection, props) { var index = -1, - length = collection.length, - isArr = isLength(length), + isNil = collection == null, + isArr = !isNil && isArrayLike(collection), + length = isArr ? collection.length : 0, propsLength = props.length, result = Array(propsLength); while(++index < propsLength) { var key = props[index]; if (isArr) { - key = parseFloat(key); result[index] = isIndex(key, length) ? collection[key] : undefined; } else { - result[index] = collection[key]; + result[index] = isNil ? undefined : collection[key]; } } return result; } /** - * Copies the properties of `source` to `object`. + * Copies properties of `source` to `object`. * * @private * @param {Object} source The object to copy properties from. - * @param {Object} [object={}] The object to copy properties to. * @param {Array} props The property names to copy. + * @param {Object} [object={}] The object to copy properties to. * @returns {Object} Returns `object`. */ - function baseCopy(source, object, props) { - if (!props) { - props = object; - object = {}; - } + function baseCopy(source, props, object) { + object || (object = {}); + var index = -1, length = props.length; @@ -35953,7 +36018,7 @@ return jQuery; function baseCallback(func, thisArg, argCount) { var type = typeof func; if (type == 'function') { - return typeof thisArg == 'undefined' + return thisArg === undefined ? func : bindCallback(func, thisArg, argCount); } @@ -35963,9 +36028,9 @@ return jQuery; if (type == 'object') { return baseMatches(func); } - return typeof thisArg == 'undefined' - ? baseProperty(func + '') - : baseMatchesProperty(func + '', thisArg); + return thisArg === undefined + ? property(func) + : baseMatchesProperty(func, thisArg); } /** @@ -35987,7 +36052,7 @@ return jQuery; if (customizer) { result = object ? customizer(value, key, object) : customizer(value); } - if (typeof result != 'undefined') { + if (result !== undefined) { return result; } if (!isObject(value)) { @@ -36006,7 +36071,7 @@ return jQuery; if (tag == objectTag || tag == argsTag || (isFunc && !object)) { result = initCloneObject(isFunc ? {} : value); if (!isDeep) { - return baseCopy(value, result, keys(value)); + return baseAssign(result, value); } } else { return cloneableTags[tag] @@ -36014,7 +36079,7 @@ return jQuery; : (object ? value : {}); } } - // Check for circular references and return corresponding clone. + // Check for circular references and return its corresponding clone. stackA || (stackA = []); stackB || (stackB = []); @@ -36044,14 +36109,14 @@ return jQuery; * @returns {Object} Returns the new object. */ var baseCreate = (function() { - function Object() {} + function object() {} return function(prototype) { if (isObject(prototype)) { - Object.prototype = prototype; - var result = new Object; - Object.prototype = null; + object.prototype = prototype; + var result = new object; + object.prototype = undefined; } - return result || context.Object(); + return result || {}; }; }()); @@ -36091,7 +36156,7 @@ return jQuery; var index = -1, indexOf = getIndexOf(), isCommon = indexOf == baseIndexOf, - cache = (isCommon && values.length >= 200) ? createCache(values) : null, + cache = (isCommon && values.length >= LARGE_ARRAY_SIZE) ? createCache(values) : null, valuesLength = values.length; if (cache) { @@ -36161,6 +36226,32 @@ return jQuery; } /** + * Gets the extremum value of `collection` invoking `iteratee` for each value + * in `collection` to generate the criterion by which the value is ranked. + * The `iteratee` is invoked with three arguments: (value, index|key, collection). + * + * @private + * @param {Array|Object|string} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} comparator The function used to compare values. + * @param {*} exValue The initial extremum value. + * @returns {*} Returns the extremum value. + */ + function baseExtremum(collection, iteratee, comparator, exValue) { + var computed = exValue, + result = computed; + + baseEach(collection, function(value, index, collection) { + var current = +iteratee(value, index, collection); + if (comparator(current, computed) || (current === exValue && current === result)) { + computed = current; + result = value; + } + }); + return result; + } + + /** * The base implementation of `_.fill` without an iteratee call guard. * * @private @@ -36177,7 +36268,7 @@ return jQuery; if (start < 0) { start = -start > length ? 0 : (length + start); } - end = (typeof end == 'undefined' || end > length) ? length : (+end || 0); + end = (end === undefined || end > length) ? length : (+end || 0); if (end < 0) { end += length; } @@ -36239,33 +36330,29 @@ return jQuery; * * @private * @param {Array} array The array to flatten. - * @param {boolean} isDeep Specify a deep flatten. - * @param {boolean} isStrict Restrict flattening to arrays and `arguments` objects. + * @param {boolean} [isDeep] Specify a deep flatten. + * @param {boolean} [isStrict] Restrict flattening to arrays-like objects. + * @param {Array} [result=[]] The initial result value. * @returns {Array} Returns the new flattened array. */ - function baseFlatten(array, isDeep, isStrict) { + function baseFlatten(array, isDeep, isStrict, result) { + result || (result = []); + var index = -1, - length = array.length, - resIndex = -1, - result = []; + length = array.length; while (++index < length) { var value = array[index]; - - if (isObjectLike(value) && isLength(value.length) && (isArray(value) || isArguments(value))) { + if (isObjectLike(value) && isArrayLike(value) && + (isStrict || isArray(value) || isArguments(value))) { if (isDeep) { // Recursively flatten arrays (susceptible to call stack limits). - value = baseFlatten(value, isDeep, isStrict); - } - var valIndex = -1, - valLength = value.length; - - result.length += valLength; - while (++valIndex < valLength) { - result[++resIndex] = value[valIndex]; + baseFlatten(value, isDeep, isStrict, result); + } else { + arrayPush(result, value); } } else if (!isStrict) { - result[++resIndex] = value; + result[result.length] = value; } } return result; @@ -36274,7 +36361,7 @@ return jQuery; /** * The base implementation of `baseForIn` and `baseForOwn` which iterates * over `object` properties returned by `keysFunc` invoking `iteratee` for - * each property. Iterator functions may exit iteration early by explicitly + * each property. Iteratee functions may exit iteration early by explicitly * returning `false`. * * @private @@ -36361,6 +36448,32 @@ return jQuery; } /** + * The base implementation of `get` without support for string paths + * and default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array} path The path of the property to get. + * @param {string} [pathKey] The key representation of path. + * @returns {*} Returns the resolved value. + */ + function baseGet(object, path, pathKey) { + if (object == null) { + return; + } + if (pathKey !== undefined && pathKey in toObject(object)) { + path = [pathKey]; + } + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[path[index++]]; + } + return (index && index == length) ? object : undefined; + } + + /** * The base implementation of `_.isEqual` without support for `this` binding * `customizer` functions. * @@ -36374,18 +36487,10 @@ return jQuery; * @returns {boolean} Returns `true` if the values are equivalent, else `false`. */ function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) { - // Exit early for identical values. if (value === other) { - // Treat `+0` vs. `-0` as not equal. - return value !== 0 || (1 / value == 1 / other); + return true; } - var valType = typeof value, - othType = typeof other; - - // Exit early for unlike primitive values. - if ((valType != 'function' && valType != 'object' && othType != 'function' && othType != 'object') || - value == null || other == null) { - // Return `false` unless both values are `NaN`. + if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) { return value !== value && other !== other; } return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB); @@ -36428,28 +36533,24 @@ return jQuery; othIsArr = isTypedArray(other); } } - var objIsObj = (objTag == objectTag || (isLoose && objTag == funcTag)), - othIsObj = (othTag == objectTag || (isLoose && othTag == funcTag)), + var objIsObj = objTag == objectTag, + othIsObj = othTag == objectTag, isSameTag = objTag == othTag; if (isSameTag && !(objIsArr || objIsObj)) { return equalByTag(object, other, objTag); } - if (isLoose) { - if (!isSameTag && !(objIsObj && othIsObj)) { - return false; - } - } else { - var valWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), - othWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); + if (!isLoose) { + var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), + othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); - if (valWrapped || othWrapped) { - return equalFunc(valWrapped ? object.value() : object, othWrapped ? other.value() : other, customizer, isLoose, stackA, stackB); - } - if (!isSameTag) { - return false; + if (objIsWrapped || othIsWrapped) { + return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB); } } + if (!isSameTag) { + return false; + } // Assume cyclic values are equal. // For more information on detecting circular references see https://es5.github.io/#JO. stackA || (stackA = []); @@ -36479,42 +36580,44 @@ return jQuery; * * @private * @param {Object} object The object to inspect. - * @param {Array} props The source property names to match. - * @param {Array} values The source values to match. - * @param {Array} strictCompareFlags Strict comparison flags for source values. + * @param {Array} matchData The propery names, values, and compare flags to match. * @param {Function} [customizer] The function to customize comparing objects. * @returns {boolean} Returns `true` if `object` is a match, else `false`. */ - function baseIsMatch(object, props, values, strictCompareFlags, customizer) { - var index = -1, - length = props.length, + function baseIsMatch(object, matchData, customizer) { + var index = matchData.length, + length = index, noCustomizer = !customizer; - while (++index < length) { - if ((noCustomizer && strictCompareFlags[index]) - ? values[index] !== object[props[index]] - : !(props[index] in object) + if (object == null) { + return !length; + } + object = toObject(object); + while (index--) { + var data = matchData[index]; + if ((noCustomizer && data[2]) + ? data[1] !== object[data[0]] + : !(data[0] in object) ) { return false; } } - index = -1; while (++index < length) { - var key = props[index], + data = matchData[index]; + var key = data[0], objValue = object[key], - srcValue = values[index]; + srcValue = data[1]; - if (noCustomizer && strictCompareFlags[index]) { - var result = typeof objValue != 'undefined' || (key in object); + if (noCustomizer && data[2]) { + if (objValue === undefined && !(key in object)) { + return false; + } } else { - result = customizer ? customizer(objValue, srcValue, key) : undefined; - if (typeof result == 'undefined') { - result = baseIsEqual(srcValue, objValue, customizer, true); + var result = customizer ? customizer(objValue, srcValue, key) : undefined; + if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, true) : result)) { + return false; } } - if (!result) { - return false; - } } return true; } @@ -36529,9 +36632,11 @@ return jQuery; * @returns {Array} Returns the new mapped array. */ function baseMap(collection, iteratee) { - var result = []; + var index = -1, + result = isArrayLike(collection) ? Array(collection.length) : []; + baseEach(collection, function(value, key, collection) { - result.push(iteratee(value, key, collection)); + result[++index] = iteratee(value, key, collection); }); return result; } @@ -36544,54 +36649,54 @@ return jQuery; * @returns {Function} Returns the new function. */ function baseMatches(source) { - var props = keys(source), - length = props.length; + var matchData = getMatchData(source); + if (matchData.length == 1 && matchData[0][2]) { + var key = matchData[0][0], + value = matchData[0][1]; - if (!length) { - return constant(true); - } - if (length == 1) { - var key = props[0], - value = source[key]; - - if (isStrictComparable(value)) { - return function(object) { - return object != null && object[key] === value && - (typeof value != 'undefined' || (key in toObject(object))); - }; - } - } - var values = Array(length), - strictCompareFlags = Array(length); - - while (length--) { - value = source[props[length]]; - values[length] = value; - strictCompareFlags[length] = isStrictComparable(value); + return function(object) { + if (object == null) { + return false; + } + return object[key] === value && (value !== undefined || (key in toObject(object))); + }; } return function(object) { - return object != null && baseIsMatch(toObject(object), props, values, strictCompareFlags); + return baseIsMatch(object, matchData); }; } /** - * The base implementation of `_.matchesProperty` which does not coerce `key` - * to a string. + * The base implementation of `_.matchesProperty` which does not clone `srcValue`. * * @private - * @param {string} key The key of the property to get. - * @param {*} value The value to compare. + * @param {string} path The path of the property to get. + * @param {*} srcValue The value to compare. * @returns {Function} Returns the new function. */ - function baseMatchesProperty(key, value) { - if (isStrictComparable(value)) { - return function(object) { - return object != null && object[key] === value && - (typeof value != 'undefined' || (key in toObject(object))); - }; - } + function baseMatchesProperty(path, srcValue) { + var isArr = isArray(path), + isCommon = isKey(path) && isStrictComparable(srcValue), + pathKey = (path + ''); + + path = toPath(path); return function(object) { - return object != null && baseIsEqual(value, object[key], null, true); + if (object == null) { + return false; + } + var key = pathKey; + object = toObject(object); + if ((isArr || !isCommon) && !(key in object)) { + object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1)); + if (object == null) { + return false; + } + key = last(path); + object = toObject(object); + } + return object[key] === srcValue + ? (srcValue !== undefined || (key in object)) + : baseIsEqual(srcValue, object[key], undefined, true); }; } @@ -36602,32 +36707,40 @@ return jQuery; * @private * @param {Object} object The destination object. * @param {Object} source The source object. - * @param {Function} [customizer] The function to customize merging properties. + * @param {Function} [customizer] The function to customize merged values. * @param {Array} [stackA=[]] Tracks traversed source objects. * @param {Array} [stackB=[]] Associates values with source counterparts. - * @returns {Object} Returns the destination object. + * @returns {Object} Returns `object`. */ function baseMerge(object, source, customizer, stackA, stackB) { if (!isObject(object)) { return object; } - var isSrcArr = isLength(source.length) && (isArray(source) || isTypedArray(source)); - (isSrcArr ? arrayEach : baseForOwn)(source, function(srcValue, key, source) { + var isSrcArr = isArrayLike(source) && (isArray(source) || isTypedArray(source)), + props = isSrcArr ? undefined : keys(source); + + arrayEach(props || source, function(srcValue, key) { + if (props) { + key = srcValue; + srcValue = source[key]; + } if (isObjectLike(srcValue)) { stackA || (stackA = []); stackB || (stackB = []); - return baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB); + baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB); } - var value = object[key], - result = customizer ? customizer(value, srcValue, key, object, source) : undefined, - isCommon = typeof result == 'undefined'; + else { + var value = object[key], + result = customizer ? customizer(value, srcValue, key, object, source) : undefined, + isCommon = result === undefined; - if (isCommon) { - result = srcValue; - } - if ((isSrcArr || typeof result != 'undefined') && - (isCommon || (result === result ? (result !== value) : (value === value)))) { - object[key] = result; + if (isCommon) { + result = srcValue; + } + if ((result !== undefined || (isSrcArr && !(key in object))) && + (isCommon || (result === result ? (result !== value) : (value === value)))) { + object[key] = result; + } } }); return object; @@ -36643,7 +36756,7 @@ return jQuery; * @param {Object} source The source object. * @param {string} key The key of the value to merge. * @param {Function} mergeFunc The function to merge values. - * @param {Function} [customizer] The function to customize merging properties. + * @param {Function} [customizer] The function to customize merged values. * @param {Array} [stackA=[]] Tracks traversed source objects. * @param {Array} [stackB=[]] Associates values with source counterparts. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. @@ -36660,14 +36773,14 @@ return jQuery; } var value = object[key], result = customizer ? customizer(value, srcValue, key, object, source) : undefined, - isCommon = typeof result == 'undefined'; + isCommon = result === undefined; if (isCommon) { result = srcValue; - if (isLength(srcValue.length) && (isArray(srcValue) || isTypedArray(srcValue))) { + if (isArrayLike(srcValue) && (isArray(srcValue) || isTypedArray(srcValue))) { result = isArray(value) ? value - : ((value && value.length) ? arrayCopy(value) : []); + : (isArrayLike(value) ? arrayCopy(value) : []); } else if (isPlainObject(srcValue) || isArguments(srcValue)) { result = isArguments(value) @@ -36692,7 +36805,7 @@ return jQuery; } /** - * The base implementation of `_.property` which does not coerce `key` to a string. + * The base implementation of `_.property` without support for deep paths. * * @private * @param {string} key The key of the property to get. @@ -36705,6 +36818,42 @@ return jQuery; } /** + * A specialized version of `baseProperty` which supports deep paths. + * + * @private + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new function. + */ + function basePropertyDeep(path) { + var pathKey = (path + ''); + path = toPath(path); + return function(object) { + return baseGet(object, path, pathKey); + }; + } + + /** + * The base implementation of `_.pullAt` without support for individual + * index arguments and capturing the removed elements. + * + * @private + * @param {Array} array The array to modify. + * @param {number[]} indexes The indexes of elements to remove. + * @returns {Array} Returns `array`. + */ + function basePullAt(array, indexes) { + var length = array ? indexes.length : 0; + while (length--) { + var index = indexes[length]; + if (index != previous && isIndex(index)) { + var previous = index; + splice.call(array, index, 1); + } + } + return array; + } + + /** * The base implementation of `_.random` without support for argument juggling * and returning floating-point numbers. * @@ -36714,7 +36863,7 @@ return jQuery; * @returns {number} Returns the random number. */ function baseRandom(min, max) { - return min + floor(nativeRandom() * (max - min + 1)); + return min + nativeFloor(nativeRandom() * (max - min + 1)); } /** @@ -36770,7 +36919,7 @@ return jQuery; if (start < 0) { start = -start > length ? 0 : (length + start); } - end = (typeof end == 'undefined' || end > length) ? length : (+end || 0); + end = (end === undefined || end > length) ? length : (+end || 0); if (end < 0) { end += length; } @@ -36829,23 +36978,19 @@ return jQuery; * * @private * @param {Array|Object|string} collection The collection to iterate over. - * @param {string[]} props The property names to sort by. - * @param {boolean[]} orders The sort orders of `props`. + * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. + * @param {boolean[]} orders The sort orders of `iteratees`. * @returns {Array} Returns the new sorted array. */ - function baseSortByOrder(collection, props, orders) { - var index = -1, - length = collection.length, - result = isLength(length) ? Array(length) : []; + function baseSortByOrder(collection, iteratees, orders) { + var callback = getCallback(), + index = -1; - baseEach(collection, function(value) { - var length = props.length, - criteria = Array(length); + iteratees = arrayMap(iteratees, function(iteratee) { return callback(iteratee); }); - while (length--) { - criteria[length] = value == null ? undefined : value[props[length]]; - } - result[++index] = { 'criteria': criteria, 'index': index, 'value': value }; + var result = baseMap(collection, function(value) { + var criteria = arrayMap(iteratees, function(iteratee) { return iteratee(value); }); + return { 'criteria': criteria, 'index': ++index, 'value': value }; }); return baseSortBy(result, function(object, other) { @@ -36884,7 +37029,7 @@ return jQuery; indexOf = getIndexOf(), length = array.length, isCommon = indexOf == baseIndexOf, - isLarge = isCommon && length >= 200, + isLarge = isCommon && length >= LARGE_ARRAY_SIZE, seen = isLarge ? createCache() : null, result = []; @@ -36925,7 +37070,7 @@ return jQuery; /** * The base implementation of `_.values` and `_.valuesIn` which creates an * array of `object` property values corresponding to the property names - * returned by `keysFunc`. + * of `props`. * * @private * @param {Object} object The object to query. @@ -36983,11 +37128,8 @@ return jQuery; length = actions.length; while (++index < length) { - var args = [result], - action = actions[index]; - - push.apply(args, action.args); - result = action.func.apply(action.thisArg, args); + var action = actions[index]; + result = action.func.apply(action.thisArg, arrayPush([result], action.args)); } return result; } @@ -37012,7 +37154,7 @@ return jQuery; var mid = (low + high) >>> 1, computed = array[mid]; - if (retHighest ? (computed <= value) : (computed < value)) { + if ((retHighest ? (computed <= value) : (computed < value)) && computed !== null) { low = mid + 1; } else { high = mid; @@ -37042,17 +37184,23 @@ return jQuery; var low = 0, high = array ? array.length : 0, valIsNaN = value !== value, - valIsUndef = typeof value == 'undefined'; + valIsNull = value === null, + valIsUndef = value === undefined; while (low < high) { - var mid = floor((low + high) / 2), + var mid = nativeFloor((low + high) / 2), computed = iteratee(array[mid]), + isDef = computed !== undefined, isReflexive = computed === computed; if (valIsNaN) { var setLow = isReflexive || retHighest; + } else if (valIsNull) { + setLow = isReflexive && isDef && (retHighest || computed != null); } else if (valIsUndef) { - setLow = isReflexive && (retHighest || typeof computed != 'undefined'); + setLow = isReflexive && (retHighest || isDef); + } else if (computed == null) { + setLow = false; } else { setLow = retHighest ? (computed <= value) : (computed < value); } @@ -37079,7 +37227,7 @@ return jQuery; if (typeof func != 'function') { return identity; } - if (typeof thisArg == 'undefined') { + if (thisArg === undefined) { return func; } switch (argCount) { @@ -37109,26 +37257,11 @@ return jQuery; * @returns {ArrayBuffer} Returns the cloned array buffer. */ function bufferClone(buffer) { - return bufferSlice.call(buffer, 0); - } - if (!bufferSlice) { - // PhantomJS has `ArrayBuffer` and `Uint8Array` but not `Float64Array`. - bufferClone = !(ArrayBuffer && Uint8Array) ? constant(null) : function(buffer) { - var byteLength = buffer.byteLength, - floatLength = Float64Array ? floor(byteLength / FLOAT64_BYTES_PER_ELEMENT) : 0, - offset = floatLength * FLOAT64_BYTES_PER_ELEMENT, - result = new ArrayBuffer(byteLength); - - if (floatLength) { - var view = new Float64Array(result, 0, floatLength); - view.set(new Float64Array(buffer, 0, floatLength)); - } - if (byteLength != offset) { - view = new Uint8Array(result, offset); - view.set(new Uint8Array(buffer, offset)); - } - return result; - }; + var result = new ArrayBuffer(buffer.byteLength), + view = new Uint8Array(result); + + view.set(new Uint8Array(buffer)); + return result; } /** @@ -37147,7 +37280,7 @@ return jQuery; argsLength = nativeMax(args.length - holdersLength, 0), leftIndex = -1, leftLength = partials.length, - result = Array(argsLength + leftLength); + result = Array(leftLength + argsLength); while (++leftIndex < leftLength) { result[leftIndex] = partials[leftIndex]; @@ -37183,23 +37316,18 @@ return jQuery; while (++argsIndex < argsLength) { result[argsIndex] = args[argsIndex]; } - var pad = argsIndex; + var offset = argsIndex; while (++rightIndex < rightLength) { - result[pad + rightIndex] = partials[rightIndex]; + result[offset + rightIndex] = partials[rightIndex]; } while (++holdersIndex < holdersLength) { - result[pad + holders[holdersIndex]] = args[argsIndex++]; + result[offset + holders[holdersIndex]] = args[argsIndex++]; } return result; } /** - * Creates a function that aggregates a collection, creating an accumulator - * object composed from the results of running each element in the collection - * through an iteratee. - * - * **Note:** This function is used to create `_.countBy`, `_.groupBy`, `_.indexBy`, - * and `_.partition`. + * Creates a `_.countBy`, `_.groupBy`, `_.indexBy`, or `_.partition` function. * * @private * @param {Function} setter The function to set keys and values of the accumulator object. @@ -37229,48 +37357,39 @@ return jQuery; } /** - * Creates a function that assigns properties of source object(s) to a given - * destination object. - * - * **Note:** This function is used to create `_.assign`, `_.defaults`, and `_.merge`. + * Creates a `_.assign`, `_.defaults`, or `_.merge` function. * * @private * @param {Function} assigner The function to assign values. * @returns {Function} Returns the new assigner function. */ function createAssigner(assigner) { - return function() { - var args = arguments, - length = args.length, - object = args[0]; - - if (length < 2 || object == null) { - return object; - } - var customizer = args[length - 2], - thisArg = args[length - 1], - guard = args[3]; + return restParam(function(object, sources) { + var index = -1, + length = object == null ? 0 : sources.length, + customizer = length > 2 ? sources[length - 2] : undefined, + guard = length > 2 ? sources[2] : undefined, + thisArg = length > 1 ? sources[length - 1] : undefined; - if (length > 3 && typeof customizer == 'function') { + if (typeof customizer == 'function') { customizer = bindCallback(customizer, thisArg, 5); length -= 2; } else { - customizer = (length > 2 && typeof thisArg == 'function') ? thisArg : null; + customizer = typeof thisArg == 'function' ? thisArg : undefined; length -= (customizer ? 1 : 0); } - if (guard && isIterateeCall(args[1], args[2], guard)) { - customizer = length == 3 ? null : customizer; - length = 2; + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? undefined : customizer; + length = 1; } - var index = 0; while (++index < length) { - var source = args[index]; + var source = sources[index]; if (source) { assigner(object, source, customizer); } } return object; - }; + }); } /** @@ -37283,7 +37402,7 @@ return jQuery; */ function createBaseEach(eachFunc, fromRight) { return function(collection, iteratee) { - var length = collection ? collection.length : 0; + var length = collection ? getLength(collection) : 0; if (!isLength(length)) { return eachFunc(collection, iteratee); } @@ -37349,9 +37468,9 @@ return jQuery; * @param {Array} [values] The values to cache. * @returns {null|Object} Returns the new cache object if `Set` is supported, else `null`. */ - var createCache = !(nativeCreate && Set) ? constant(null) : function(values) { - return new SetCache(values); - }; + function createCache(values) { + return (nativeCreate && Set) ? new SetCache(values) : null; + } /** * Creates a function that produces compound words out of the words in a @@ -37385,8 +37504,22 @@ return jQuery; */ function createCtorWrapper(Ctor) { return function() { + // Use a `switch` statement to work with class constructors. + // See http://ecma-international.org/ecma-262/6.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist + // for more details. + var args = arguments; + switch (args.length) { + case 0: return new Ctor; + case 1: return new Ctor(args[0]); + case 2: return new Ctor(args[0], args[1]); + case 3: return new Ctor(args[0], args[1], args[2]); + case 4: return new Ctor(args[0], args[1], args[2], args[3]); + case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]); + case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]); + case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + } var thisBinding = baseCreate(Ctor.prototype), - result = Ctor.apply(thisBinding, arguments); + result = Ctor.apply(thisBinding, args); // Mimic the constructor's `return` behavior. // See https://es5.github.io/#x13.2.2 for more details. @@ -37404,9 +37537,9 @@ return jQuery; function createCurry(flag) { function curryFunc(func, arity, guard) { if (guard && isIterateeCall(func, arity, guard)) { - arity = null; + arity = undefined; } - var result = createWrapper(func, flag, null, null, null, null, null, arity); + var result = createWrapper(func, flag, undefined, undefined, undefined, undefined, undefined, arity); result.placeholder = curryFunc.placeholder; return result; } @@ -37414,35 +37547,46 @@ return jQuery; } /** + * Creates a `_.defaults` or `_.defaultsDeep` function. + * + * @private + * @param {Function} assigner The function to assign values. + * @param {Function} customizer The function to customize assigned values. + * @returns {Function} Returns the new defaults function. + */ + function createDefaults(assigner, customizer) { + return restParam(function(args) { + var object = args[0]; + if (object == null) { + return object; + } + args.push(customizer); + return assigner.apply(undefined, args); + }); + } + + /** * Creates a `_.max` or `_.min` function. * * @private - * @param {Function} arrayFunc The function to get the extremum value from an array. - * @param {boolean} [isMin] Specify returning the minimum, instead of the maximum, - * extremum value. + * @param {Function} comparator The function used to compare values. + * @param {*} exValue The initial extremum value. * @returns {Function} Returns the new extremum function. */ - function createExtremum(arrayFunc, isMin) { + function createExtremum(comparator, exValue) { return function(collection, iteratee, thisArg) { if (thisArg && isIterateeCall(collection, iteratee, thisArg)) { - iteratee = null; + iteratee = undefined; } - var func = getCallback(), - noIteratee = iteratee == null; - - if (!(func === baseCallback && noIteratee)) { - noIteratee = false; - iteratee = func(iteratee, thisArg, 3); - } - if (noIteratee) { - var isArr = isArray(collection); - if (!isArr && isString(collection)) { - iteratee = charAtCallback; - } else { - return arrayFunc(isArr ? collection : toIterable(collection)); + iteratee = getCallback(iteratee, thisArg, 3); + if (iteratee.length == 1) { + collection = isArray(collection) ? collection : toIterable(collection); + var result = arrayExtremum(collection, iteratee, comparator, exValue); + if (!(collection.length && result === exValue)) { + return result; } } - return extremumBy(collection, iteratee, isMin); + return baseExtremum(collection, iteratee, comparator, exValue); }; } @@ -37462,7 +37606,7 @@ return jQuery; return index > -1 ? collection[index] : undefined; } return baseFind(collection, predicate, eachFunc); - } + }; } /** @@ -37505,11 +37649,8 @@ return jQuery; */ function createFlow(fromRight) { return function() { - var length = arguments.length; - if (!length) { - return function() { return arguments[0]; }; - } var wrapper, + length = arguments.length, index = fromRight ? length : -1, leftIndex = 0, funcs = Array(length); @@ -37519,28 +37660,32 @@ return jQuery; if (typeof func != 'function') { throw new TypeError(FUNC_ERROR_TEXT); } - var funcName = wrapper ? '' : getFuncName(func); - wrapper = funcName == 'wrapper' ? new LodashWrapper([]) : wrapper; + if (!wrapper && LodashWrapper.prototype.thru && getFuncName(func) == 'wrapper') { + wrapper = new LodashWrapper([], true); + } } index = wrapper ? -1 : length; while (++index < length) { func = funcs[index]; - funcName = getFuncName(func); - var data = funcName == 'wrapper' ? getData(func) : null; - if (data && isLaziable(data[0])) { + var funcName = getFuncName(func), + data = funcName == 'wrapper' ? getData(func) : undefined; + + if (data && isLaziable(data[0]) && data[1] == (ARY_FLAG | CURRY_FLAG | PARTIAL_FLAG | REARG_FLAG) && !data[4].length && data[9] == 1) { wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]); } else { wrapper = (func.length == 1 && isLaziable(func)) ? wrapper[funcName]() : wrapper.thru(func); } } return function() { - var args = arguments; - if (wrapper && args.length == 1 && isArray(args[0])) { - return wrapper.plant(args[0]).value(); + var args = arguments, + value = args[0]; + + if (wrapper && args.length == 1 && isArray(value) && value.length >= LARGE_ARRAY_SIZE) { + return wrapper.plant(value).value(); } var index = 0, - result = funcs[index].apply(this, args); + result = length ? funcs[index].apply(this, args) : value; while (++index < length) { result = funcs[index].call(this, result); @@ -37560,7 +37705,7 @@ return jQuery; */ function createForEach(arrayFunc, eachFunc) { return function(collection, iteratee, thisArg) { - return (typeof iteratee == 'function' && typeof thisArg == 'undefined' && isArray(collection)) + return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection)) ? arrayFunc(collection, iteratee) : eachFunc(collection, bindCallback(iteratee, thisArg, 3)); }; @@ -37575,7 +37720,7 @@ return jQuery; */ function createForIn(objectFunc) { return function(object, iteratee, thisArg) { - if (typeof iteratee != 'function' || typeof thisArg != 'undefined') { + if (typeof iteratee != 'function' || thisArg !== undefined) { iteratee = bindCallback(iteratee, thisArg, 3); } return objectFunc(object, iteratee, keysIn); @@ -37591,7 +37736,7 @@ return jQuery; */ function createForOwn(objectFunc) { return function(object, iteratee, thisArg) { - if (typeof iteratee != 'function' || typeof thisArg != 'undefined') { + if (typeof iteratee != 'function' || thisArg !== undefined) { iteratee = bindCallback(iteratee, thisArg, 3); } return objectFunc(object, iteratee); @@ -37599,6 +37744,28 @@ return jQuery; } /** + * Creates a function for `_.mapKeys` or `_.mapValues`. + * + * @private + * @param {boolean} [isMapKeys] Specify mapping keys instead of values. + * @returns {Function} Returns the new map function. + */ + function createObjectMapper(isMapKeys) { + return function(object, iteratee, thisArg) { + var result = {}; + iteratee = getCallback(iteratee, thisArg, 3); + + baseForOwn(object, function(value, key, object) { + var mapped = iteratee(value, key, object); + key = isMapKeys ? mapped : key; + value = isMapKeys ? value : mapped; + result[key] = value; + }); + return result; + }; + } + + /** * Creates a function for `_.padLeft` or `_.padRight`. * * @private @@ -37608,7 +37775,7 @@ return jQuery; function createPadDir(fromRight) { return function(string, length, chars) { string = baseToString(string); - return string && ((fromRight ? string : '') + createPadding(string, length, chars) + (fromRight ? '' : string)); + return (fromRight ? string : '') + createPadding(string, length, chars) + (fromRight ? '' : string); }; } @@ -37622,7 +37789,7 @@ return jQuery; function createPartial(flag) { var partialFunc = restParam(function(func, partials) { var holders = replaceHolders(partials, partialFunc.placeholder); - return createWrapper(func, flag, null, partials, holders); + return createWrapper(func, flag, undefined, partials, holders); }); return partialFunc; } @@ -37638,7 +37805,7 @@ return jQuery; function createReduce(arrayFunc, eachFunc) { return function(collection, iteratee, accumulator, thisArg) { var initFromArray = arguments.length < 3; - return (typeof iteratee == 'function' && typeof thisArg == 'undefined' && isArray(collection)) + return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection)) ? arrayFunc(collection, iteratee, accumulator, initFromArray) : baseReduce(collection, getCallback(iteratee, thisArg, 4), accumulator, initFromArray, eachFunc); }; @@ -37667,10 +37834,8 @@ return jQuery; isBindKey = bitmask & BIND_KEY_FLAG, isCurry = bitmask & CURRY_FLAG, isCurryBound = bitmask & CURRY_BOUND_FLAG, - isCurryRight = bitmask & CURRY_RIGHT_FLAG; - - var Ctor = !isBindKey && createCtorWrapper(func), - key = func; + isCurryRight = bitmask & CURRY_RIGHT_FLAG, + Ctor = isBindKey ? undefined : createCtorWrapper(func); function wrapper() { // Avoid `arguments` object use disqualifying optimizations by @@ -37694,12 +37859,12 @@ return jQuery; length -= argsHolders.length; if (length < arity) { - var newArgPos = argPos ? arrayCopy(argPos) : null, + var newArgPos = argPos ? arrayCopy(argPos) : undefined, newArity = nativeMax(arity - length, 0), - newsHolders = isCurry ? argsHolders : null, - newHoldersRight = isCurry ? null : argsHolders, - newPartials = isCurry ? args : null, - newPartialsRight = isCurry ? null : args; + newsHolders = isCurry ? argsHolders : undefined, + newHoldersRight = isCurry ? undefined : argsHolders, + newPartials = isCurry ? args : undefined, + newPartialsRight = isCurry ? undefined : args; bitmask |= (isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG); bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG); @@ -37717,17 +37882,18 @@ return jQuery; return result; } } - var thisBinding = isBind ? thisArg : this; - if (isBindKey) { - func = thisBinding[key]; - } + var thisBinding = isBind ? thisArg : this, + fn = isBindKey ? thisBinding[func] : func; + if (argPos) { args = reorder(args, argPos); } if (isAry && ary < args.length) { args.length = ary; } - var fn = (this && this !== root && this instanceof wrapper) ? (Ctor || createCtorWrapper(func)) : func; + if (this && this !== root && this instanceof wrapper) { + fn = Ctor || createCtorWrapper(func); + } return fn.apply(thisBinding, args); } return wrapper; @@ -37752,7 +37918,7 @@ return jQuery; } var padLength = length - strLength; chars = chars == null ? ' ' : (chars + ''); - return repeat(chars, ceil(padLength / chars.length)).slice(0, padLength); + return repeat(chars, nativeCeil(padLength / chars.length)).slice(0, padLength); } /** @@ -37778,7 +37944,7 @@ return jQuery; argsLength = arguments.length, leftIndex = -1, leftLength = partials.length, - args = Array(argsLength + leftLength); + args = Array(leftLength + argsLength); while (++leftIndex < leftLength) { args[leftIndex] = partials[leftIndex]; @@ -37793,6 +37959,25 @@ return jQuery; } /** + * Creates a `_.ceil`, `_.floor`, or `_.round` function. + * + * @private + * @param {string} methodName The name of the `Math` method to use when rounding. + * @returns {Function} Returns the new round function. + */ + function createRound(methodName) { + var func = Math[methodName]; + return function(number, precision) { + precision = precision === undefined ? 0 : (+precision || 0); + if (precision) { + precision = pow(10, precision); + return func(number * precision) / precision; + } + return func(number); + }; + } + + /** * Creates a `_.sortedIndex` or `_.sortedLastIndex` function. * * @private @@ -37801,10 +37986,10 @@ return jQuery; */ function createSortedIndex(retHighest) { return function(array, value, iteratee, thisArg) { - var func = getCallback(iteratee); - return (func === baseCallback && iteratee == null) + var callback = getCallback(iteratee); + return (iteratee == null && callback === baseCallback) ? binaryIndex(array, value, retHighest) - : binaryIndexBy(array, value, func(iteratee, thisArg, 1), retHighest); + : binaryIndexBy(array, value, callback(iteratee, thisArg, 1), retHighest); }; } @@ -37841,16 +38026,16 @@ return jQuery; var length = partials ? partials.length : 0; if (!length) { bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG); - partials = holders = null; + partials = holders = undefined; } length -= (holders ? holders.length : 0); if (bitmask & PARTIAL_RIGHT_FLAG) { var partialsRight = partials, holdersRight = holders; - partials = holders = null; + partials = holders = undefined; } - var data = isBindKey ? null : getData(func), + var data = isBindKey ? undefined : getData(func), newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity]; if (data) { @@ -37890,40 +38075,35 @@ return jQuery; function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) { var index = -1, arrLength = array.length, - othLength = other.length, - result = true; + othLength = other.length; if (arrLength != othLength && !(isLoose && othLength > arrLength)) { return false; } - // Deep compare the contents, ignoring non-numeric properties. - while (result && ++index < arrLength) { + // Ignore non-index properties. + while (++index < arrLength) { var arrValue = array[index], - othValue = other[index]; + othValue = other[index], + result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined; - result = undefined; - if (customizer) { - result = isLoose - ? customizer(othValue, arrValue, index) - : customizer(arrValue, othValue, index); + if (result !== undefined) { + if (result) { + continue; + } + return false; } - if (typeof result == 'undefined') { - // Recursively compare arrays (susceptible to call stack limits). - if (isLoose) { - var othIndex = othLength; - while (othIndex--) { - othValue = other[othIndex]; - result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB); - if (result) { - break; - } - } - } else { - result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB); + // Recursively compare arrays (susceptible to call stack limits). + if (isLoose) { + if (!arraySome(other, function(othValue) { + return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB); + })) { + return false; } + } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) { + return false; } } - return !!result; + return true; } /** @@ -37934,7 +38114,7 @@ return jQuery; * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. * * @private - * @param {Object} value The object to compare. + * @param {Object} object The object to compare. * @param {Object} other The other object to compare. * @param {string} tag The `toStringTag` of the objects to compare. * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. @@ -37954,8 +38134,7 @@ return jQuery; // Treat `NaN` vs. `NaN` as equal. return (object != +object) ? other != +other - // But, treat `-0` vs. `+0` as not equal. - : (object == 0 ? ((1 / object) == (1 / other)) : object == +other); + : object == +other; case regexpTag: case stringTag: @@ -37989,29 +38168,22 @@ return jQuery; if (objLength != othLength && !isLoose) { return false; } - var skipCtor = isLoose, - index = -1; - + var index = objLength; + while (index--) { + var key = objProps[index]; + if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) { + return false; + } + } + var skipCtor = isLoose; while (++index < objLength) { - var key = objProps[index], - result = isLoose ? key in other : hasOwnProperty.call(other, key); + key = objProps[index]; + var objValue = object[key], + othValue = other[key], + result = customizer ? customizer(isLoose ? othValue : objValue, isLoose? objValue : othValue, key) : undefined; - if (result) { - var objValue = object[key], - othValue = other[key]; - - result = undefined; - if (customizer) { - result = isLoose - ? customizer(othValue, objValue, key) - : customizer(objValue, othValue, key); - } - if (typeof result == 'undefined') { - // Recursively compare objects (susceptible to call stack limits). - result = (objValue && objValue === othValue) || equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB); - } - } - if (!result) { + // Recursively compare objects (susceptible to call stack limits). + if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) { return false; } skipCtor || (skipCtor = key == 'constructor'); @@ -38032,34 +38204,6 @@ return jQuery; } /** - * Gets the extremum value of `collection` invoking `iteratee` for each value - * in `collection` to generate the criterion by which the value is ranked. - * The `iteratee` is invoked with three arguments: (value, index, collection). - * - * @private - * @param {Array|Object|string} collection The collection to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @param {boolean} [isMin] Specify returning the minimum, instead of the - * maximum, extremum value. - * @returns {*} Returns the extremum value. - */ - function extremumBy(collection, iteratee, isMin) { - var exValue = isMin ? POSITIVE_INFINITY : NEGATIVE_INFINITY, - computed = exValue, - result = computed; - - baseEach(collection, function(value, index, collection) { - var current = iteratee(value, index, collection); - if ((isMin ? (current < computed) : (current > computed)) || - (current === exValue && current === result)) { - computed = current; - result = value; - } - }); - return result; - } - - /** * Gets the appropriate "callback" function. If the `_.callback` method is * customized this function returns the custom method, otherwise it returns * the `baseCallback` function. If arguments are provided the chosen function @@ -38092,29 +38236,20 @@ return jQuery; * @param {Function} func The function to query. * @returns {string} Returns the function name. */ - var getFuncName = (function() { - if (!support.funcNames) { - return constant(''); - } - if (constant.name == 'constant') { - return baseProperty('name'); - } - return function(func) { - var result = func.name, - array = realNames[result], - length = array ? array.length : 0; + function getFuncName(func) { + var result = func.name, + array = realNames[result], + length = array ? array.length : 0; - while (length--) { - var data = array[length], - otherFunc = data.func; - - if (otherFunc == null || otherFunc == func) { - return data.name; - } + while (length--) { + var data = array[length], + otherFunc = data.func; + if (otherFunc == null || otherFunc == func) { + return data.name; } - return result; - }; - }()); + } + return result; + } /** * Gets the appropriate "indexOf" function. If the `_.indexOf` method is @@ -38132,18 +38267,60 @@ return jQuery; } /** + * Gets the "length" property value of `object`. + * + * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) + * that affects Safari on at least iOS 8.1-8.3 ARM64. + * + * @private + * @param {Object} object The object to query. + * @returns {*} Returns the "length" value. + */ + var getLength = baseProperty('length'); + + /** + * Gets the propery names, values, and compare flags of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the match data of `object`. + */ + function getMatchData(object) { + var result = pairs(object), + length = result.length; + + while (length--) { + result[length][2] = isStrictComparable(result[length][1]); + } + return result; + } + + /** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ + function getNative(object, key) { + var value = object == null ? undefined : object[key]; + return isNative(value) ? value : undefined; + } + + /** * Gets the view, applying any `transforms` to the `start` and `end` positions. * * @private * @param {number} start The start of the view. * @param {number} end The end of the view. - * @param {Array} [transforms] The transformations to apply to the view. + * @param {Array} transforms The transformations to apply to the view. * @returns {Object} Returns an object containing the `start` and `end` * positions of the view. */ function getView(start, end, transforms) { var index = -1, - length = transforms ? transforms.length : 0; + length = transforms.length; while (++index < length) { var data = transforms[index], @@ -38199,7 +38376,6 @@ return jQuery; * **Note:** This function only supports cloning values with tags of * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. * - * * @private * @param {Object} object The object to clone. * @param {string} tag The `toStringTag` of the object to clone. @@ -38234,6 +38410,36 @@ return jQuery; } /** + * Invokes the method at `path` on `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the method to invoke. + * @param {Array} args The arguments to invoke the method with. + * @returns {*} Returns the result of the invoked method. + */ + function invokePath(object, path, args) { + if (object != null && !isKey(path, object)) { + path = toPath(path); + object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1)); + path = last(path); + } + var func = object == null ? object : object[path]; + return func == null ? undefined : func.apply(object, args); + } + + /** + * Checks if `value` is array-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + */ + function isArrayLike(value) { + return value != null && isLength(getLength(value)); + } + + /** * Checks if `value` is a valid array-like index. * * @private @@ -38242,7 +38448,7 @@ return jQuery; * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. */ function isIndex(value, length) { - value = +value; + value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1; length = length == null ? MAX_SAFE_INTEGER : length; return value > -1 && value % 1 == 0 && value < length; } @@ -38261,13 +38467,9 @@ return jQuery; return false; } var type = typeof index; - if (type == 'number') { - var length = object.length, - prereq = isLength(length) && isIndex(index, length); - } else { - prereq = type == 'string' && index in object; - } - if (prereq) { + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object)) { var other = object[index]; return value === value ? (value === other) : (other !== other); } @@ -38275,6 +38477,26 @@ return jQuery; } /** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ + function isKey(value, object) { + var type = typeof value; + if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') { + return true; + } + if (isArray(value)) { + return false; + } + var result = !reIsDeepProp.test(value); + return result || (object != null && value in toObject(object)); + } + + /** * Checks if `func` has a lazy counterpart. * * @private @@ -38283,13 +38505,21 @@ return jQuery; */ function isLaziable(func) { var funcName = getFuncName(func); - return !!funcName && func === lodash[funcName] && funcName in LazyWrapper.prototype; + if (!(funcName in LazyWrapper.prototype)) { + return false; + } + var other = lodash[funcName]; + if (func === other) { + return true; + } + var data = getData(other); + return !!data && func === data[0]; } /** * Checks if `value` is a valid array-like length. * - * **Note:** This function is based on [`ToLength`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength). + * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). * * @private * @param {*} value The value to check. @@ -38308,7 +38538,7 @@ return jQuery; * equality comparisons, else `false`. */ function isStrictComparable(value) { - return value === value && (value === 0 ? ((1 / value) > 0) : !isObject(value)); + return value === value && !isObject(value); } /** @@ -38382,8 +38612,20 @@ return jQuery; } /** - * A specialized version of `_.pick` that picks `object` properties specified - * by the `props` array. + * Used by `_.defaultsDeep` to customize its `_.merge` use. + * + * @private + * @param {*} objectValue The destination object property value. + * @param {*} sourceValue The source object property value. + * @returns {*} Returns the value to assign to the destination object. + */ + function mergeDefaults(objectValue, sourceValue) { + return objectValue === undefined ? sourceValue : merge(objectValue, sourceValue, mergeDefaults); + } + + /** + * A specialized version of `_.pick` which picks `object` properties specified + * by `props`. * * @private * @param {Object} object The source object. @@ -38407,7 +38649,7 @@ return jQuery; } /** - * A specialized version of `_.pick` that picks `object` properties `predicate` + * A specialized version of `_.pick` which picks `object` properties `predicate` * returns truthy for. * * @private @@ -38481,53 +38723,20 @@ return jQuery; }()); /** - * A fallback implementation of `_.isPlainObject` which checks if `value` - * is an object created by the `Object` constructor or has a `[[Prototype]]` - * of `null`. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. - */ - function shimIsPlainObject(value) { - var Ctor, - support = lodash.support; - - // Exit early for non `Object` objects. - if (!(isObjectLike(value) && objToString.call(value) == objectTag) || - (!hasOwnProperty.call(value, 'constructor') && - (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) { - return false; - } - // IE < 9 iterates inherited properties before own properties. If the first - // iterated property is an object's own property then there are no inherited - // enumerable properties. - var result; - // In most environments an object's own properties are iterated before - // its inherited properties. If the last iterated property is an object's - // own property then there are no inherited enumerable properties. - baseForIn(value, function(subValue, key) { - result = key; - }); - return typeof result == 'undefined' || hasOwnProperty.call(value, result); - } - - /** * A fallback implementation of `Object.keys` which creates an array of the * own enumerable property names of `object`. * * @private - * @param {Object} object The object to inspect. + * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. */ function shimKeys(object) { var props = keysIn(object), propsLength = props.length, - length = propsLength && object.length, - support = lodash.support; + length = propsLength && object.length; - var allowIndexes = length && isLength(length) && - (isArray(object) || (support.nonEnumArgs && isArguments(object))); + var allowIndexes = !!length && isLength(length) && + (isArray(object) || isArguments(object)); var index = -1, result = []; @@ -38542,7 +38751,7 @@ return jQuery; } /** - * Converts `value` to an array-like object if it is not one. + * Converts `value` to an array-like object if it's not one. * * @private * @param {*} value The value to process. @@ -38552,14 +38761,14 @@ return jQuery; if (value == null) { return []; } - if (!isLength(value.length)) { + if (!isArrayLike(value)) { return values(value); } return isObject(value) ? value : Object(value); } /** - * Converts `value` to an object if it is not one. + * Converts `value` to an object if it's not one. * * @private * @param {*} value The value to process. @@ -38570,6 +38779,24 @@ return jQuery; } /** + * Converts `value` to property path array if it's not one. + * + * @private + * @param {*} value The value to process. + * @returns {Array} Returns the property path array. + */ + function toPath(value) { + if (isArray(value)) { + return value; + } + var result = []; + baseToString(value).replace(rePropName, function(match, number, quote, string) { + result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; + } + + /** * Creates a clone of `wrapper`. * * @private @@ -38608,12 +38835,12 @@ return jQuery; if (guard ? isIterateeCall(array, size, guard) : size == null) { size = 1; } else { - size = nativeMax(+size || 1, 1); + size = nativeMax(nativeFloor(size) || 1, 1); } var index = 0, length = array ? array.length : 0, resIndex = -1, - result = Array(ceil(length / size)); + result = Array(nativeCeil(length / size)); while (index < length) { result[++resIndex] = baseSlice(array, index, (index += size)); @@ -38651,12 +38878,9 @@ return jQuery; } /** - * Creates an array excluding all values of the provided arrays using - * `SameValueZero` for equality comparisons. - * - * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero) - * comparisons are like strict equality comparisons, e.g. `===`, except that - * `NaN` matches `NaN`. + * Creates an array of unique `array` values not included in the other + * provided arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) + * for equality comparisons. * * @static * @memberOf _ @@ -38670,7 +38894,7 @@ return jQuery; * // => [1, 3] */ var difference = restParam(function(array, values) { - return (isArray(array) || isArguments(array)) + return (isObjectLike(array) && isArrayLike(array)) ? baseDifference(array, baseFlatten(values, false, true)) : []; }); @@ -39065,13 +39289,10 @@ return jQuery; /** * Gets the index at which the first occurrence of `value` is found in `array` - * using `SameValueZero` for equality comparisons. If `fromIndex` is negative, - * it is used as the offset from the end of `array`. If `array` is sorted - * providing `true` for `fromIndex` performs a faster binary search. - * - * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero) - * comparisons are like strict equality comparisons, e.g. `===`, except that - * `NaN` matches `NaN`. + * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) + * for equality comparisons. If `fromIndex` is negative, it is used as the offset + * from the end of `array`. If `array` is sorted providing `true` for `fromIndex` + * performs a faster binary search. * * @static * @memberOf _ @@ -39102,10 +39323,9 @@ return jQuery; if (typeof fromIndex == 'number') { fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex; } else if (fromIndex) { - var index = binaryIndex(array, value), - other = array[index]; - - if (value === value ? (value === other) : (other !== other)) { + var index = binaryIndex(array, value); + if (index < length && + (value === value ? (value === array[index]) : (array[index] !== array[index]))) { return index; } return -1; @@ -39131,13 +39351,10 @@ return jQuery; } /** - * Creates an array of unique values in all provided arrays using `SameValueZero` + * Creates an array of unique values that are included in all of the provided + * arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) * for equality comparisons. * - * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero) - * comparisons are like strict equality comparisons, e.g. `===`, except that - * `NaN` matches `NaN`. - * * @static * @memberOf _ * @category Array @@ -39147,36 +39364,31 @@ return jQuery; * _.intersection([1, 2], [4, 2], [2, 1]); * // => [2] */ - function intersection() { - var args = [], - argsIndex = -1, - argsLength = arguments.length, - caches = [], + var intersection = restParam(function(arrays) { + var othLength = arrays.length, + othIndex = othLength, + caches = Array(length), indexOf = getIndexOf(), - isCommon = indexOf == baseIndexOf; + isCommon = indexOf == baseIndexOf, + result = []; - while (++argsIndex < argsLength) { - var value = arguments[argsIndex]; - if (isArray(value) || isArguments(value)) { - args.push(value); - caches.push((isCommon && value.length >= 120) ? createCache(argsIndex && value) : null); - } + while (othIndex--) { + var value = arrays[othIndex] = isArrayLike(value = arrays[othIndex]) ? value : []; + caches[othIndex] = (isCommon && value.length >= 120) ? createCache(othIndex && value) : null; } - argsLength = args.length; - var array = args[0], + var array = arrays[0], index = -1, length = array ? array.length : 0, - result = [], seen = caches[0]; outer: while (++index < length) { value = array[index]; if ((seen ? cacheIndexOf(seen, value) : indexOf(result, value, 0)) < 0) { - argsIndex = argsLength; - while (--argsIndex) { - var cache = caches[argsIndex]; - if ((cache ? cacheIndexOf(cache, value) : indexOf(args[argsIndex], value, 0)) < 0) { + var othIndex = othLength; + while (--othIndex) { + var cache = caches[othIndex]; + if ((cache ? cacheIndexOf(cache, value) : indexOf(arrays[othIndex], value, 0)) < 0) { continue outer; } } @@ -39187,7 +39399,7 @@ return jQuery; } } return result; - } + }); /** * Gets the last element of `array`. @@ -39260,14 +39472,11 @@ return jQuery; } /** - * Removes all provided values from `array` using `SameValueZero` for equality - * comparisons. + * Removes all provided values from `array` using + * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) + * for equality comparisons. * - * **Notes:** - * - Unlike `_.without`, this method mutates `array` - * - [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero) - * comparisons are like strict equality comparisons, e.g. `===`, except - * that `NaN` matches `NaN` + * **Note:** Unlike `_.without`, this method mutates `array`. * * @static * @memberOf _ @@ -39331,20 +39540,10 @@ return jQuery; * // => [10, 20] */ var pullAt = restParam(function(array, indexes) { - array || (array = []); indexes = baseFlatten(indexes); - var length = indexes.length, - result = baseAt(array, indexes); - - indexes.sort(baseCompareAscending); - while (length--) { - var index = parseFloat(indexes[length]); - if (index != previous && isIndex(index)) { - var previous = index; - splice.call(array, index, 1); - } - } + var result = baseAt(array, indexes); + basePullAt(array, indexes.sort(baseCompareAscending)); return result; }); @@ -39388,19 +39587,23 @@ return jQuery; * // => [2, 4] */ function remove(array, predicate, thisArg) { + var result = []; + if (!(array && array.length)) { + return result; + } var index = -1, - length = array ? array.length : 0, - result = []; + indexes = [], + length = array.length; predicate = getCallback(predicate, thisArg, 3); while (++index < length) { var value = array[index]; if (predicate(value, index, array)) { result.push(value); - splice.call(array, index--, 1); - length--; + indexes.push(index); } } + basePullAt(array, indexes); return result; } @@ -39425,7 +39628,7 @@ return jQuery; /** * Creates a slice of `array` from `start` up to, but not including, `end`. * - * **Note:** This function is used instead of `Array#slice` to support node + * **Note:** This method is used instead of `Array#slice` to support node * lists in IE < 9 and to ensure dense arrays are returned. * * @static @@ -39702,12 +39905,9 @@ return jQuery; } /** - * Creates an array of unique values, in order, of the provided arrays using - * `SameValueZero` for equality comparisons. - * - * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero) - * comparisons are like strict equality comparisons, e.g. `===`, except that - * `NaN` matches `NaN`. + * Creates an array of unique values, in order, from all of the provided arrays + * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) + * for equality comparisons. * * @static * @memberOf _ @@ -39724,12 +39924,14 @@ return jQuery; }); /** - * Creates a duplicate-value-free version of an array using `SameValueZero` - * for equality comparisons. Providing `true` for `isSorted` performs a faster - * search algorithm for sorted arrays. If an iteratee function is provided it - * is invoked for each value in the array to generate the criterion by which - * uniqueness is computed. The `iteratee` is bound to `thisArg` and invoked - * with three arguments: (value, index, array). + * Creates a duplicate-free version of an array, using + * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) + * for equality comparisons, in which only the first occurence of each element + * is kept. Providing `true` for `isSorted` performs a faster search algorithm + * for sorted arrays. If an iteratee function is provided it is invoked for + * each element in the array to generate the criterion by which uniqueness + * is computed. The `iteratee` is bound to `thisArg` and invoked with three + * arguments: (value, index, array). * * If a property name is provided for `iteratee` the created `_.property` * style callback returns the property value of the given element. @@ -39742,10 +39944,6 @@ return jQuery; * callback returns `true` for elements that have the properties of the given * object, else `false`. * - * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero) - * comparisons are like strict equality comparisons, e.g. `===`, except that - * `NaN` matches `NaN`. - * * @static * @memberOf _ * @alias unique @@ -39757,8 +39955,8 @@ return jQuery; * @returns {Array} Returns the new duplicate-value-free array. * @example * - * _.uniq([1, 2, 1]); - * // => [1, 2] + * _.uniq([2, 1, 2]); + * // => [2, 1] * * // using `isSorted` * _.uniq([1, 1, 2], true); @@ -39781,12 +39979,12 @@ return jQuery; } if (isSorted != null && typeof isSorted != 'boolean') { thisArg = iteratee; - iteratee = isIterateeCall(array, isSorted, thisArg) ? null : isSorted; + iteratee = isIterateeCall(array, isSorted, thisArg) ? undefined : isSorted; isSorted = false; } - var func = getCallback(); - if (!(func === baseCallback && iteratee == null)) { - iteratee = func(iteratee, thisArg, 3); + var callback = getCallback(); + if (!(iteratee == null && callback === baseCallback)) { + iteratee = callback(iteratee, thisArg, 3); } return (isSorted && getIndexOf() == baseIndexOf) ? sortedUniq(array, iteratee) @@ -39795,7 +39993,7 @@ return jQuery; /** * This method is like `_.zip` except that it accepts an array of grouped - * elements and creates an array regrouping the elements to their pre-`_.zip` + * elements and creates an array regrouping the elements to their pre-zip * configuration. * * @static @@ -39812,10 +40010,19 @@ return jQuery; * // => [['fred', 'barney'], [30, 40], [true, false]] */ function unzip(array) { + if (!(array && array.length)) { + return []; + } var index = -1, - length = (array && array.length && arrayMax(arrayMap(array, getLength))) >>> 0, - result = Array(length); + length = 0; + array = arrayFilter(array, function(group) { + if (isArrayLike(group)) { + length = nativeMax(group.length, length); + return true; + } + }); + var result = Array(length); while (++index < length) { result[index] = arrayMap(array, baseProperty(index)); } @@ -39823,12 +40030,44 @@ return jQuery; } /** - * Creates an array excluding all provided values using `SameValueZero` for - * equality comparisons. + * This method is like `_.unzip` except that it accepts an iteratee to specify + * how regrouped values should be combined. The `iteratee` is bound to `thisArg` + * and invoked with four arguments: (accumulator, value, index, group). + * + * @static + * @memberOf _ + * @category Array + * @param {Array} array The array of grouped elements to process. + * @param {Function} [iteratee] The function to combine regrouped values. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Array} Returns the new array of regrouped elements. + * @example * - * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero) - * comparisons are like strict equality comparisons, e.g. `===`, except that - * `NaN` matches `NaN`. + * var zipped = _.zip([1, 2], [10, 20], [100, 200]); + * // => [[1, 10, 100], [2, 20, 200]] + * + * _.unzipWith(zipped, _.add); + * // => [3, 30, 300] + */ + function unzipWith(array, iteratee, thisArg) { + var length = array ? array.length : 0; + if (!length) { + return []; + } + var result = unzip(array); + if (iteratee == null) { + return result; + } + iteratee = bindCallback(iteratee, thisArg, 4); + return arrayMap(result, function(group) { + return arrayReduce(group, iteratee, undefined, true); + }); + } + + /** + * Creates an array excluding all provided values using + * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) + * for equality comparisons. * * @static * @memberOf _ @@ -39842,13 +40081,13 @@ return jQuery; * // => [3] */ var without = restParam(function(array, values) { - return (isArray(array) || isArguments(array)) + return isArrayLike(array) ? baseDifference(array, values) : []; }); /** - * Creates an array that is the [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference) + * Creates an array of unique values that is the [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference) * of the provided arrays. * * @static @@ -39867,9 +40106,9 @@ return jQuery; while (++index < length) { var array = arguments[index]; - if (isArray(array) || isArguments(array)) { + if (isArrayLike(array)) { var result = result - ? baseDifference(result, array).concat(baseDifference(array, result)) + ? arrayPush(baseDifference(result, array), baseDifference(array, result)) : array; } } @@ -39933,6 +40172,38 @@ return jQuery; return result; } + /** + * This method is like `_.zip` except that it accepts an iteratee to specify + * how grouped values should be combined. The `iteratee` is bound to `thisArg` + * and invoked with four arguments: (accumulator, value, index, group). + * + * @static + * @memberOf _ + * @category Array + * @param {...Array} [arrays] The arrays to process. + * @param {Function} [iteratee] The function to combine grouped values. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Array} Returns the new array of grouped elements. + * @example + * + * _.zipWith([1, 2], [10, 20], [100, 200], _.add); + * // => [111, 222] + */ + var zipWith = restParam(function(arrays) { + var length = arrays.length, + iteratee = length > 2 ? arrays[length - 2] : undefined, + thisArg = length > 1 ? arrays[length - 1] : undefined; + + if (length > 2 && typeof iteratee == 'function') { + length -= 2; + } else { + iteratee = (length > 1 && typeof thisArg == 'function') ? (--length, thisArg) : undefined; + thisArg = undefined; + } + arrays.length = length; + return unzipWith(arrays, iteratee, thisArg); + }); + /*------------------------------------------------------------------------*/ /** @@ -40059,16 +40330,16 @@ return jQuery; * @example * * var array = [1, 2]; - * var wrapper = _(array).push(3); + * var wrapped = _(array).push(3); * * console.log(array); * // => [1, 2] * - * wrapper = wrapper.commit(); + * wrapped = wrapped.commit(); * console.log(array); * // => [1, 2, 3] * - * wrapper.last(); + * wrapped.last(); * // => 3 * * console.log(array); @@ -40079,6 +40350,33 @@ return jQuery; } /** + * Creates a new array joining a wrapped array with any additional arrays + * and/or values. + * + * @name concat + * @memberOf _ + * @category Chain + * @param {...*} [values] The values to concatenate. + * @returns {Array} Returns the new concatenated array. + * @example + * + * var array = [1]; + * var wrapped = _(array).concat(2, [3], [[4]]); + * + * console.log(wrapped.value()); + * // => [1, 2, 3, [4]] + * + * console.log(array); + * // => [1] + */ + var wrapperConcat = restParam(function(values) { + values = baseFlatten(values); + return this.thru(function(array) { + return arrayConcat(isArray(array) ? array : [toObject(array)], values); + }); + }); + + /** * Creates a clone of the chained sequence planting `value` as the wrapped value. * * @name plant @@ -40088,17 +40386,17 @@ return jQuery; * @example * * var array = [1, 2]; - * var wrapper = _(array).map(function(value) { + * var wrapped = _(array).map(function(value) { * return Math.pow(value, 2); * }); * * var other = [3, 4]; - * var otherWrapper = wrapper.plant(other); + * var otherWrapped = wrapped.plant(other); * - * otherWrapper.value(); + * otherWrapped.value(); * // => [9, 16] * - * wrapper.value(); + * wrapped.value(); * // => [1, 4] */ function wrapperPlant(value) { @@ -40141,15 +40439,20 @@ return jQuery; */ function wrapperReverse() { var value = this.__wrapped__; + + var interceptor = function(value) { + return (wrapped && wrapped.__dir__ < 0) ? value : value.reverse(); + }; if (value instanceof LazyWrapper) { + var wrapped = value; if (this.__actions__.length) { - value = new LazyWrapper(this); + wrapped = new LazyWrapper(this); } - return new LodashWrapper(value.reverse(), this.__chain__); + wrapped = wrapped.reverse(); + wrapped.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined }); + return new LodashWrapper(wrapped, this.__chain__); } - return this.thru(function(value) { - return value.reverse(); - }); + return this.thru(interceptor); } /** @@ -40208,10 +40511,6 @@ return jQuery; * // => ['barney', 'pebbles'] */ var at = restParam(function(collection, props) { - var length = collection ? collection.length : 0; - if (isLength(length)) { - collection = toIterable(collection); - } return baseAt(collection, baseFlatten(props)); }); @@ -40311,9 +40610,9 @@ return jQuery; function every(collection, predicate, thisArg) { var func = isArray(collection) ? arrayEvery : baseEvery; if (thisArg && isIterateeCall(collection, predicate, thisArg)) { - predicate = null; + predicate = undefined; } - if (typeof predicate != 'function' || typeof thisArg != 'undefined') { + if (typeof predicate != 'function' || thisArg !== undefined) { predicate = getCallback(predicate, thisArg, 3); } return func(collection, predicate); @@ -40483,10 +40782,10 @@ return jQuery; /** * Iterates over elements of `collection` invoking `iteratee` for each element. * The `iteratee` is bound to `thisArg` and invoked with three arguments: - * (value, index|key, collection). Iterator functions may exit iteration early + * (value, index|key, collection). Iteratee functions may exit iteration early * by explicitly returning `false`. * - * **Note:** As with other "Collections" methods, objects with a `length` property + * **Note:** As with other "Collections" methods, objects with a "length" property * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn` * may be used for object iteration. * @@ -40584,13 +40883,10 @@ return jQuery; }); /** - * Checks if `value` is in `collection` using `SameValueZero` for equality - * comparisons. If `fromIndex` is negative, it is used as the offset from - * the end of `collection`. - * - * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero) - * comparisons are like strict equality comparisons, e.g. `===`, except that - * `NaN` matches `NaN`. + * Checks if `value` is in `collection` using + * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) + * for equality comparisons. If `fromIndex` is negative, it is used as the offset + * from the end of `collection`. * * @static * @memberOf _ @@ -40616,22 +40912,19 @@ return jQuery; * // => true */ function includes(collection, target, fromIndex, guard) { - var length = collection ? collection.length : 0; + var length = collection ? getLength(collection) : 0; if (!isLength(length)) { collection = values(collection); length = collection.length; } - if (!length) { - return false; - } if (typeof fromIndex != 'number' || (guard && isIterateeCall(target, fromIndex, guard))) { fromIndex = 0; } else { fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : (fromIndex || 0); } return (typeof collection == 'string' || !isArray(collection) && isString(collection)) - ? (fromIndex < length && collection.indexOf(target, fromIndex) > -1) - : (getIndexOf(collection, target, fromIndex) > -1); + ? (fromIndex <= length && collection.indexOf(target, fromIndex) > -1) + : (!!length && getIndexOf(collection, target, fromIndex) > -1); } /** @@ -40685,16 +40978,16 @@ return jQuery; }); /** - * Invokes the method named by `methodName` on each element in `collection`, - * returning an array of the results of each invoked method. Any additional - * arguments are provided to each invoked method. If `methodName` is a function - * it is invoked for, and `this` bound to, each element in `collection`. + * Invokes the method at `path` of each element in `collection`, returning + * an array of the results of each invoked method. Any additional arguments + * are provided to each invoked method. If `methodName` is a function it is + * invoked for, and `this` bound to, each element in `collection`. * * @static * @memberOf _ * @category Collection * @param {Array|Object|string} collection The collection to iterate over. - * @param {Function|string} methodName The name of the method to invoke or + * @param {Array|Function|string} path The path of the method to invoke or * the function invoked per iteration. * @param {...*} [args] The arguments to invoke the method with. * @returns {Array} Returns the array of results. @@ -40706,15 +40999,15 @@ return jQuery; * _.invoke([123, 456], String.prototype.split, ''); * // => [['1', '2', '3'], ['4', '5', '6']] */ - var invoke = restParam(function(collection, methodName, args) { + var invoke = restParam(function(collection, path, args) { var index = -1, - isFunc = typeof methodName == 'function', - length = collection ? collection.length : 0, - result = isLength(length) ? Array(length) : []; + isFunc = typeof path == 'function', + isProp = isKey(path), + result = isArrayLike(collection) ? Array(collection.length) : []; baseEach(collection, function(value) { - var func = isFunc ? methodName : (value != null && value[methodName]); - result[++index] = func ? func.apply(value, args) : undefined; + var func = isFunc ? path : ((isProp && value != null) ? value[path] : undefined); + result[++index] = func ? func.apply(value, args) : invokePath(value, path, args); }); return result; }); @@ -40735,14 +41028,15 @@ return jQuery; * callback returns `true` for elements that have the properties of the given * object, else `false`. * - * Many lodash methods are guarded to work as interatees for methods like + * Many lodash methods are guarded to work as iteratees for methods like * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. * * The guarded methods are: - * `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`, `drop`, - * `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`, `parseInt`, - * `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`, `trimLeft`, - * `trimRight`, `trunc`, `random`, `range`, `sample`, `some`, `uniq`, and `words` + * `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`, + * `drop`, `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`, + * `parseInt`, `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`, + * `trimLeft`, `trimRight`, `trunc`, `random`, `range`, `sample`, `some`, + * `sum`, `uniq`, and `words` * * @static * @memberOf _ @@ -40751,7 +41045,6 @@ return jQuery; * @param {Array|Object|string} collection The collection to iterate over. * @param {Function|Object|string} [iteratee=_.identity] The function invoked * per iteration. - * create a `_.property` or `_.matches` style callback respectively. * @param {*} [thisArg] The `this` binding of `iteratee`. * @returns {Array} Returns the new mapped array. * @example @@ -40845,13 +41138,13 @@ return jQuery; }, function() { return [[], []]; }); /** - * Gets the value of `key` from all elements in `collection`. + * Gets the property value of `path` from all elements in `collection`. * * @static * @memberOf _ * @category Collection * @param {Array|Object|string} collection The collection to iterate over. - * @param {string} key The key of the property to pluck. + * @param {Array|string} path The path of the property to pluck. * @returns {Array} Returns the property values. * @example * @@ -40867,8 +41160,8 @@ return jQuery; * _.pluck(userIndex, 'age'); * // => [36, 40] (iteration order is not guaranteed) */ - function pluck(collection, key) { - return map(collection, baseProperty(key)); + function pluck(collection, path) { + return map(collection, property(path)); } /** @@ -40879,11 +41172,12 @@ return jQuery; * value. The `iteratee` is bound to `thisArg` and invoked with four arguments: * (accumulator, value, index|key, collection). * - * Many lodash methods are guarded to work as interatees for methods like + * Many lodash methods are guarded to work as iteratees for methods like * `_.reduce`, `_.reduceRight`, and `_.transform`. * * The guarded methods are: - * `assign`, `defaults`, `includes`, `merge`, `sortByAll`, and `sortByOrder` + * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `sortByAll`, + * and `sortByOrder` * * @static * @memberOf _ @@ -40896,8 +41190,8 @@ return jQuery; * @returns {*} Returns the accumulated value. * @example * - * _.reduce([1, 2], function(sum, n) { - * return sum + n; + * _.reduce([1, 2], function(total, n) { + * return total + n; * }); * // => 3 * @@ -40931,23 +41225,12 @@ return jQuery; * }, []); * // => [4, 5, 2, 3, 0, 1] */ - var reduceRight = createReduce(arrayReduceRight, baseEachRight); + var reduceRight = createReduce(arrayReduceRight, baseEachRight); /** * The opposite of `_.filter`; this method returns the elements of `collection` * that `predicate` does **not** return truthy for. * - * If a property name is provided for `predicate` the created `_.property` - * style callback returns the property value of the given element. - * - * If a value is also provided for `thisArg` the created `_.matchesProperty` - * style callback returns `true` for elements that have a matching property - * value, else `false`. - * - * If an object is provided for `predicate` the created `_.matches` style - * callback returns `true` for elements that have the properties of the given - * object, else `false`. - * * @static * @memberOf _ * @category Collection @@ -41012,8 +41295,20 @@ return jQuery; var length = collection.length; return length > 0 ? collection[baseRandom(0, length - 1)] : undefined; } - var result = shuffle(collection); - result.length = nativeMin(n < 0 ? 0 : (+n || 0), result.length); + var index = -1, + result = toArray(collection), + length = result.length, + lastIndex = length - 1; + + n = nativeMin(n < 0 ? 0 : (+n || 0), length); + while (++index < n) { + var rand = baseRandom(index, lastIndex), + value = result[rand]; + + result[rand] = result[index]; + result[index] = value; + } + result.length = n; return result; } @@ -41032,20 +41327,7 @@ return jQuery; * // => [4, 1, 3, 2] */ function shuffle(collection) { - collection = toIterable(collection); - - var index = -1, - length = collection.length, - result = Array(length); - - while (++index < length) { - var rand = baseRandom(0, index); - if (index != rand) { - result[index] = result[rand]; - } - result[rand] = collection[index]; - } - return result; + return sample(collection, POSITIVE_INFINITY); } /** @@ -41069,7 +41351,7 @@ return jQuery; * // => 7 */ function size(collection) { - var length = collection ? collection.length : 0; + var length = collection ? getLength(collection) : 0; return isLength(length) ? length : keys(collection).length; } @@ -41125,9 +41407,9 @@ return jQuery; function some(collection, predicate, thisArg) { var func = isArray(collection) ? arraySome : baseSome; if (thisArg && isIterateeCall(collection, predicate, thisArg)) { - predicate = null; + predicate = undefined; } - if (typeof predicate != 'function' || typeof thisArg != 'undefined') { + if (typeof predicate != 'function' || thisArg !== undefined) { predicate = getCallback(predicate, thisArg, 3); } return func(collection, predicate); @@ -41155,9 +41437,8 @@ return jQuery; * @memberOf _ * @category Collection * @param {Array|Object|string} collection The collection to iterate over. - * @param {Array|Function|Object|string} [iteratee=_.identity] The function - * invoked per iteration. If a property name or an object is provided it is - * used to create a `_.property` or `_.matches` style callback respectively. + * @param {Function|Object|string} [iteratee=_.identity] The function invoked + * per iteration. * @param {*} [thisArg] The `this` binding of `iteratee`. * @returns {Array} Returns the new sorted array. * @example @@ -41186,104 +41467,112 @@ return jQuery; if (collection == null) { return []; } - var index = -1, - length = collection.length, - result = isLength(length) ? Array(length) : []; - if (thisArg && isIterateeCall(collection, iteratee, thisArg)) { - iteratee = null; + iteratee = undefined; } + var index = -1; iteratee = getCallback(iteratee, thisArg, 3); - baseEach(collection, function(value, key, collection) { - result[++index] = { 'criteria': iteratee(value, key, collection), 'index': index, 'value': value }; + + var result = baseMap(collection, function(value, key, collection) { + return { 'criteria': iteratee(value, key, collection), 'index': ++index, 'value': value }; }); return baseSortBy(result, compareAscending); } /** - * This method is like `_.sortBy` except that it sorts by property names - * instead of an iteratee function. + * This method is like `_.sortBy` except that it can sort by multiple iteratees + * or property names. + * + * If a property name is provided for an iteratee the created `_.property` + * style callback returns the property value of the given element. + * + * If an object is provided for an iteratee the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. * * @static * @memberOf _ * @category Collection * @param {Array|Object|string} collection The collection to iterate over. - * @param {...(string|string[])} props The property names to sort by, - * specified as individual property names or arrays of property names. + * @param {...(Function|Function[]|Object|Object[]|string|string[])} iteratees + * The iteratees to sort by, specified as individual values or arrays of values. * @returns {Array} Returns the new sorted array. * @example * * var users = [ + * { 'user': 'fred', 'age': 48 }, * { 'user': 'barney', 'age': 36 }, - * { 'user': 'fred', 'age': 40 }, - * { 'user': 'barney', 'age': 26 }, - * { 'user': 'fred', 'age': 30 } + * { 'user': 'fred', 'age': 42 }, + * { 'user': 'barney', 'age': 34 } * ]; * * _.map(_.sortByAll(users, ['user', 'age']), _.values); - * // => [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]] + * // => [['barney', 34], ['barney', 36], ['fred', 42], ['fred', 48]] + * + * _.map(_.sortByAll(users, 'user', function(chr) { + * return Math.floor(chr.age / 10); + * }), _.values); + * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]] */ - function sortByAll() { - var args = arguments, - collection = args[0], - guard = args[3], - index = 0, - length = args.length - 1; - + var sortByAll = restParam(function(collection, iteratees) { if (collection == null) { return []; } - var props = Array(length); - while (index < length) { - props[index] = args[++index]; - } - if (guard && isIterateeCall(args[1], args[2], guard)) { - props = args[1]; + var guard = iteratees[2]; + if (guard && isIterateeCall(iteratees[0], iteratees[1], guard)) { + iteratees.length = 1; } - return baseSortByOrder(collection, baseFlatten(props), []); - } + return baseSortByOrder(collection, baseFlatten(iteratees), []); + }); /** * This method is like `_.sortByAll` except that it allows specifying the - * sort orders of the property names to sort by. A truthy value in `orders` - * will sort the corresponding property name in ascending order while a - * falsey value will sort it in descending order. + * sort orders of the iteratees to sort by. If `orders` is unspecified, all + * values are sorted in ascending order. Otherwise, a value is sorted in + * ascending order if its corresponding order is "asc", and descending if "desc". + * + * If a property name is provided for an iteratee the created `_.property` + * style callback returns the property value of the given element. + * + * If an object is provided for an iteratee the created `_.matches` style + * callback returns `true` for elements that have the properties of the given + * object, else `false`. * * @static * @memberOf _ * @category Collection * @param {Array|Object|string} collection The collection to iterate over. - * @param {string[]} props The property names to sort by. - * @param {boolean[]} orders The sort orders of `props`. + * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. + * @param {boolean[]} [orders] The sort orders of `iteratees`. * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`. * @returns {Array} Returns the new sorted array. * @example * * var users = [ - * { 'user': 'barney', 'age': 26 }, - * { 'user': 'fred', 'age': 40 }, - * { 'user': 'barney', 'age': 36 }, - * { 'user': 'fred', 'age': 30 } + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 34 }, + * { 'user': 'fred', 'age': 42 }, + * { 'user': 'barney', 'age': 36 } * ]; * * // sort by `user` in ascending order and by `age` in descending order - * _.map(_.sortByOrder(users, ['user', 'age'], [true, false]), _.values); - * // => [['barney', 36], ['barney', 26], ['fred', 40], ['fred', 30]] + * _.map(_.sortByOrder(users, ['user', 'age'], ['asc', 'desc']), _.values); + * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]] */ - function sortByOrder(collection, props, orders, guard) { + function sortByOrder(collection, iteratees, orders, guard) { if (collection == null) { return []; } - if (guard && isIterateeCall(props, orders, guard)) { - orders = null; + if (guard && isIterateeCall(iteratees, orders, guard)) { + orders = undefined; } - if (!isArray(props)) { - props = props == null ? [] : [props]; + if (!isArray(iteratees)) { + iteratees = iteratees == null ? [] : [iteratees]; } if (!isArray(orders)) { orders = orders == null ? [] : [orders]; } - return baseSortByOrder(collection, props, orders); + return baseSortByOrder(collection, iteratees, orders); } /** @@ -41400,10 +41689,10 @@ return jQuery; */ function ary(func, n, guard) { if (guard && isIterateeCall(func, n, guard)) { - n = null; + n = undefined; } n = (func && n == null) ? func.length : nativeMax(+n || 0, 0); - return createWrapper(func, ARY_FLAG, null, null, null, null, n); + return createWrapper(func, ARY_FLAG, undefined, undefined, undefined, undefined, n); } /** @@ -41436,8 +41725,9 @@ return jQuery; return function() { if (--n > 0) { result = func.apply(this, arguments); - } else { - func = null; + } + if (n <= 1) { + func = undefined; } return result; }; @@ -41451,7 +41741,7 @@ return jQuery; * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds, * may be used as a placeholder for partially applied arguments. * - * **Note:** Unlike native `Function#bind` this method does not set the `length` + * **Note:** Unlike native `Function#bind` this method does not set the "length" * property of bound functions. * * @static @@ -41493,7 +41783,7 @@ return jQuery; * of method names. If no method names are provided all enumerable function * properties, own and inherited, of `object` are bound. * - * **Note:** This method does not set the `length` property of bound functions. + * **Note:** This method does not set the "length" property of bound functions. * * @static * @memberOf _ @@ -41534,7 +41824,7 @@ return jQuery; * * This method differs from `_.bind` by allowing bound functions to reference * methods that may be redefined or don't yet exist. - * See [Peter Michaux's article](http://michaux.ca/articles/lazy-function-definition-pattern) + * See [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern) * for more details. * * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic @@ -41591,7 +41881,7 @@ return jQuery; * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds, * may be used as a placeholder for provided arguments. * - * **Note:** This method does not set the `length` property of curried functions. + * **Note:** This method does not set the "length" property of curried functions. * * @static * @memberOf _ @@ -41630,7 +41920,7 @@ return jQuery; * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic * builds, may be used as a placeholder for provided arguments. * - * **Note:** This method does not set the `length` property of curried functions. + * **Note:** This method does not set the "length" property of curried functions. * * @static * @memberOf _ @@ -41663,12 +41953,13 @@ return jQuery; var curryRight = createCurry(CURRY_RIGHT_FLAG); /** - * Creates a function that delays invoking `func` until after `wait` milliseconds - * have elapsed since the last time it was invoked. The created function comes - * with a `cancel` method to cancel delayed invocations. Provide an options - * object to indicate that `func` should be invoked on the leading and/or - * trailing edge of the `wait` timeout. Subsequent calls to the debounced - * function return the result of the last `func` invocation. + * Creates a debounced function that delays invoking `func` until after `wait` + * milliseconds have elapsed since the last time the debounced function was + * invoked. The debounced function comes with a `cancel` method to cancel + * delayed invocations. Provide an options object to indicate that `func` + * should be invoked on the leading and/or trailing edge of the `wait` timeout. + * Subsequent calls to the debounced function return the result of the last + * `func` invocation. * * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked * on the trailing edge of the timeout only if the the debounced function is @@ -41744,9 +42035,9 @@ return jQuery; var leading = true; trailing = false; } else if (isObject(options)) { - leading = options.leading; + leading = !!options.leading; maxWait = 'maxWait' in options && nativeMax(+options.maxWait || 0, wait); - trailing = 'trailing' in options ? options.trailing : trailing; + trailing = 'trailing' in options ? !!options.trailing : trailing; } function cancel() { @@ -41756,41 +42047,35 @@ return jQuery; if (maxTimeoutId) { clearTimeout(maxTimeoutId); } + lastCalled = 0; maxTimeoutId = timeoutId = trailingCall = undefined; } + function complete(isCalled, id) { + if (id) { + clearTimeout(id); + } + maxTimeoutId = timeoutId = trailingCall = undefined; + if (isCalled) { + lastCalled = now(); + result = func.apply(thisArg, args); + if (!timeoutId && !maxTimeoutId) { + args = thisArg = undefined; + } + } + } + function delayed() { var remaining = wait - (now() - stamp); if (remaining <= 0 || remaining > wait) { - if (maxTimeoutId) { - clearTimeout(maxTimeoutId); - } - var isCalled = trailingCall; - maxTimeoutId = timeoutId = trailingCall = undefined; - if (isCalled) { - lastCalled = now(); - result = func.apply(thisArg, args); - if (!timeoutId && !maxTimeoutId) { - args = thisArg = null; - } - } + complete(trailingCall, maxTimeoutId); } else { timeoutId = setTimeout(delayed, remaining); } } function maxDelayed() { - if (timeoutId) { - clearTimeout(timeoutId); - } - maxTimeoutId = timeoutId = trailingCall = undefined; - if (trailing || (maxWait !== wait)) { - lastCalled = now(); - result = func.apply(thisArg, args); - if (!timeoutId && !maxTimeoutId) { - args = thisArg = null; - } - } + complete(trailing, timeoutId); } function debounced() { @@ -41830,7 +42115,7 @@ return jQuery; result = func.apply(thisArg, args); } if (isCalled && !timeoutId && !maxTimeoutId) { - args = thisArg = null; + args = thisArg = undefined; } return result; } @@ -41935,7 +42220,7 @@ return jQuery; * * **Note:** The cache is exposed as the `cache` property on the memoized * function. Its creation may be customized by replacing the `_.memoize.Cache` - * constructor with one whose instances implement the [`Map`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-properties-of-the-map-prototype-object) + * constructor with one whose instances implement the [`Map`](http://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-map-prototype-object) * method interface of `get`, `has`, and `set`. * * @static @@ -41982,14 +42267,14 @@ return jQuery; } var memoized = function() { var args = arguments, - cache = memoized.cache, - key = resolver ? resolver.apply(this, args) : args[0]; + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; if (cache.has(key)) { return cache.get(key); } var result = func.apply(this, args); - cache.set(key, result); + memoized.cache = cache.set(key, result); return result; }; memoized.cache = new memoize.Cache; @@ -41997,6 +42282,52 @@ return jQuery; } /** + * Creates a function that runs each argument through a corresponding + * transform function. + * + * @static + * @memberOf _ + * @category Function + * @param {Function} func The function to wrap. + * @param {...(Function|Function[])} [transforms] The functions to transform + * arguments, specified as individual functions or arrays of functions. + * @returns {Function} Returns the new function. + * @example + * + * function doubled(n) { + * return n * 2; + * } + * + * function square(n) { + * return n * n; + * } + * + * var modded = _.modArgs(function(x, y) { + * return [x, y]; + * }, square, doubled); + * + * modded(1, 2); + * // => [1, 4] + * + * modded(5, 10); + * // => [25, 20] + */ + var modArgs = restParam(function(func, transforms) { + transforms = baseFlatten(transforms); + if (typeof func != 'function' || !arrayEvery(transforms, baseIsFunction)) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var length = transforms.length; + return restParam(function(args) { + var index = nativeMin(args.length, length); + while (index--) { + args[index] = transforms[index](args[index]); + } + return func.apply(this, args); + }); + }); + + /** * Creates a function that negates the result of the predicate `func`. The * `func` predicate is invoked with the `this` binding and arguments of the * created function. @@ -42042,7 +42373,7 @@ return jQuery; * // `initialize` invokes `createApplication` once */ function once(func) { - return before(func, 2); + return before(2, func); } /** @@ -42053,7 +42384,7 @@ return jQuery; * The `_.partial.placeholder` value, which defaults to `_` in monolithic * builds, may be used as a placeholder for partially applied arguments. * - * **Note:** This method does not set the `length` property of partially + * **Note:** This method does not set the "length" property of partially * applied functions. * * @static @@ -42086,7 +42417,7 @@ return jQuery; * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic * builds, may be used as a placeholder for partially applied arguments. * - * **Note:** This method does not set the `length` property of partially + * **Note:** This method does not set the "length" property of partially * applied functions. * * @static @@ -42141,7 +42472,7 @@ return jQuery; * // => [3, 6, 9] */ var rearg = restParam(function(func, indexes) { - return createWrapper(func, REARG_FLAG, null, null, null, baseFlatten(indexes)); + return createWrapper(func, REARG_FLAG, undefined, undefined, undefined, baseFlatten(indexes)); }); /** @@ -42170,7 +42501,7 @@ return jQuery; if (typeof func != 'function') { throw new TypeError(FUNC_ERROR_TEXT); } - start = nativeMax(typeof start == 'undefined' ? (func.length - 1) : (+start || 0), 0); + start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0); return function() { var args = arguments, index = -1, @@ -42236,12 +42567,12 @@ return jQuery; } /** - * Creates a function that only invokes `func` at most once per every `wait` - * milliseconds. The created function comes with a `cancel` method to cancel - * delayed invocations. Provide an options object to indicate that `func` - * should be invoked on the leading and/or trailing edge of the `wait` timeout. - * Subsequent calls to the throttled function return the result of the last - * `func` call. + * Creates a throttled function that only invokes `func` at most once per + * every `wait` milliseconds. The throttled function comes with a `cancel` + * method to cancel delayed invocations. Provide an options object to indicate + * that `func` should be invoked on the leading and/or trailing edge of the + * `wait` timeout. Subsequent calls to the throttled function return the + * result of the last `func` call. * * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked * on the trailing edge of the timeout only if the the throttled function is @@ -42287,10 +42618,7 @@ return jQuery; leading = 'leading' in options ? !!options.leading : leading; trailing = 'trailing' in options ? !!options.trailing : trailing; } - debounceOptions.leading = leading; - debounceOptions.maxWait = +wait; - debounceOptions.trailing = trailing; - return debounce(func, wait, debounceOptions); + return debounce(func, wait, { 'leading': leading, 'maxWait': +wait, 'trailing': trailing }); } /** @@ -42316,7 +42644,7 @@ return jQuery; */ function wrap(value, wrapper) { wrapper = wrapper == null ? identity : wrapper; - return createWrapper(wrapper, PARTIAL_FLAG, null, [value], []); + return createWrapper(wrapper, PARTIAL_FLAG, undefined, [value], []); } /*------------------------------------------------------------------------*/ @@ -42381,8 +42709,9 @@ return jQuery; customizer = isDeep; isDeep = false; } - customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 1); - return baseClone(value, isDeep, customizer); + return typeof customizer == 'function' + ? baseClone(value, isDeep, bindCallback(customizer, thisArg, 1)) + : baseClone(value, isDeep); } /** @@ -42431,8 +42760,57 @@ return jQuery; * // => 20 */ function cloneDeep(value, customizer, thisArg) { - customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 1); - return baseClone(value, true, customizer); + return typeof customizer == 'function' + ? baseClone(value, true, bindCallback(customizer, thisArg, 1)) + : baseClone(value, true); + } + + /** + * Checks if `value` is greater than `other`. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than `other`, else `false`. + * @example + * + * _.gt(3, 1); + * // => true + * + * _.gt(3, 3); + * // => false + * + * _.gt(1, 3); + * // => false + */ + function gt(value, other) { + return value > other; + } + + /** + * Checks if `value` is greater than or equal to `other`. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than or equal to `other`, else `false`. + * @example + * + * _.gte(3, 1); + * // => true + * + * _.gte(3, 3); + * // => true + * + * _.gte(1, 3); + * // => false + */ + function gte(value, other) { + return value >= other; } /** @@ -42452,8 +42830,8 @@ return jQuery; * // => false */ function isArguments(value) { - var length = isObjectLike(value) ? value.length : undefined; - return isLength(length) && objToString.call(value) == argsTag; + return isObjectLike(value) && isArrayLike(value) && + hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee'); } /** @@ -42533,14 +42911,7 @@ return jQuery; * // => false */ function isElement(value) { - return !!value && value.nodeType === 1 && isObjectLike(value) && - (objToString.call(value).indexOf('Element') > -1); - } - // Fallback for environments without DOM support. - if (!support.dom) { - isElement = function(value) { - return !!value && value.nodeType === 1 && isObjectLike(value) && !isPlainObject(value); - }; + return !!value && value.nodeType === 1 && isObjectLike(value) && !isPlainObject(value); } /** @@ -42574,10 +42945,9 @@ return jQuery; if (value == null) { return true; } - var length = value.length; - if (isLength(length) && (isArray(value) || isString(value) || isArguments(value) || + if (isArrayLike(value) && (isArray(value) || isString(value) || isArguments(value) || (isObjectLike(value) && isFunction(value.splice)))) { - return !length; + return !value.length; } return !keys(value).length; } @@ -42597,10 +42967,11 @@ return jQuery; * * @static * @memberOf _ + * @alias eq * @category Lang * @param {*} value The value to compare. * @param {*} other The other value to compare. - * @param {Function} [customizer] The function to customize comparing values. + * @param {Function} [customizer] The function to customize value comparisons. * @param {*} [thisArg] The `this` binding of `customizer`. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. * @example @@ -42626,12 +42997,9 @@ return jQuery; * // => true */ function isEqual(value, other, customizer, thisArg) { - customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 3); - if (!customizer && isStrictComparable(value) && isStrictComparable(other)) { - return value === other; - } + customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined; var result = customizer ? customizer(value, other) : undefined; - return typeof result == 'undefined' ? baseIsEqual(value, other, customizer) : !!result; + return result === undefined ? baseIsEqual(value, other, customizer) : !!result; } /** @@ -42658,7 +43026,7 @@ return jQuery; /** * Checks if `value` is a finite primitive number. * - * **Note:** This method is based on [`Number.isFinite`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.isfinite). + * **Note:** This method is based on [`Number.isFinite`](http://ecma-international.org/ecma-262/6.0/#sec-number.isfinite). * * @static * @memberOf _ @@ -42682,9 +43050,9 @@ return jQuery; * _.isFinite(Infinity); * // => false */ - var isFinite = nativeNumIsFinite || function(value) { + function isFinite(value) { return typeof value == 'number' && nativeIsFinite(value); - }; + } /** * Checks if `value` is classified as a `Function` object. @@ -42702,12 +43070,12 @@ return jQuery; * _.isFunction(/abc/); * // => false */ - var isFunction = !(baseIsFunction(/x/) || (Uint8Array && !baseIsFunction(Uint8Array))) ? baseIsFunction : function(value) { + function isFunction(value) { // The use of `Object#toString` avoids issues with the `typeof` operator // in older versions of Chrome and Safari which return 'function' for regexes // and Safari 8 equivalents which return 'object' for typed array constructors. - return objToString.call(value) == funcTag; - }; + return isObject(value) && objToString.call(value) == funcTag; + } /** * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. @@ -42733,7 +43101,7 @@ return jQuery; // Avoid a V8 JIT bug in Chrome 19-20. // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. var type = typeof value; - return type == 'function' || (!!value && type == 'object'); + return !!value && (type == 'object' || type == 'function'); } /** @@ -42753,7 +43121,7 @@ return jQuery; * @category Lang * @param {Object} object The object to inspect. * @param {Object} source The object of property values to match. - * @param {Function} [customizer] The function to customize comparing values. + * @param {Function} [customizer] The function to customize value comparisons. * @param {*} [thisArg] The `this` binding of `customizer`. * @returns {boolean} Returns `true` if `object` is a match, else `false`. * @example @@ -42776,32 +43144,8 @@ return jQuery; * // => true */ function isMatch(object, source, customizer, thisArg) { - var props = keys(source), - length = props.length; - - if (!length) { - return true; - } - if (object == null) { - return false; - } - customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 3); - if (!customizer && length == 1) { - var key = props[0], - value = source[key]; - - if (isStrictComparable(value)) { - return value === object[key] && (typeof value != 'undefined' || (key in toObject(object))); - } - } - var values = Array(length), - strictCompareFlags = Array(length); - - while (length--) { - value = values[length] = source[props[length]]; - strictCompareFlags[length] = isStrictComparable(value); - } - return baseIsMatch(toObject(object), props, values, strictCompareFlags, customizer); + customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined; + return baseIsMatch(object, getMatchData(source), customizer); } /** @@ -42855,10 +43199,10 @@ return jQuery; if (value == null) { return false; } - if (objToString.call(value) == funcTag) { - return reNative.test(fnToString.call(value)); + if (isFunction(value)) { + return reIsNative.test(fnToString.call(value)); } - return isObjectLike(value) && reHostCtor.test(value); + return isObjectLike(value) && reIsHostCtor.test(value); } /** @@ -42937,17 +43281,26 @@ return jQuery; * _.isPlainObject(Object.create(null)); * // => true */ - var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) { - if (!(value && objToString.call(value) == objectTag)) { + function isPlainObject(value) { + var Ctor; + + // Exit early for non `Object` objects. + if (!(isObjectLike(value) && objToString.call(value) == objectTag && !isArguments(value)) || + (!hasOwnProperty.call(value, 'constructor') && (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) { return false; } - var valueOf = value.valueOf, - objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto); - - return objProto - ? (value == objProto || getPrototypeOf(value) == objProto) - : shimIsPlainObject(value); - }; + // IE < 9 iterates inherited properties before own properties. If the first + // iterated property is an object's own property then there are no inherited + // enumerable properties. + var result; + // In most environments an object's own properties are iterated before + // its inherited properties. If the last iterated property is an object's + // own property then there are no inherited enumerable properties. + baseForIn(value, function(subValue, key) { + result = key; + }); + return result === undefined || hasOwnProperty.call(value, result); + } /** * Checks if `value` is classified as a `RegExp` object. @@ -42966,7 +43319,7 @@ return jQuery; * // => false */ function isRegExp(value) { - return (isObjectLike(value) && objToString.call(value) == regexpTag) || false; + return isObject(value) && objToString.call(value) == regexpTag; } /** @@ -43026,7 +43379,55 @@ return jQuery; * // => false */ function isUndefined(value) { - return typeof value == 'undefined'; + return value === undefined; + } + + /** + * Checks if `value` is less than `other`. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than `other`, else `false`. + * @example + * + * _.lt(1, 3); + * // => true + * + * _.lt(3, 3); + * // => false + * + * _.lt(3, 1); + * // => false + */ + function lt(value, other) { + return value < other; + } + + /** + * Checks if `value` is less than or equal to `other`. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than or equal to `other`, else `false`. + * @example + * + * _.lte(1, 3); + * // => true + * + * _.lte(3, 3); + * // => true + * + * _.lte(3, 1); + * // => false + */ + function lte(value, other) { + return value <= other; } /** @@ -43045,7 +43446,7 @@ return jQuery; * // => [2, 3] */ function toArray(value) { - var length = value ? value.length : 0; + var length = value ? getLength(value) : 0; if (!isLength(length)) { return values(value); } @@ -43085,19 +43486,72 @@ return jQuery; /*------------------------------------------------------------------------*/ /** + * Recursively merges own enumerable properties of the source object(s), that + * don't resolve to `undefined` into the destination object. Subsequent sources + * overwrite property assignments of previous sources. If `customizer` is + * provided it is invoked to produce the merged values of the destination and + * source properties. If `customizer` returns `undefined` merging is handled + * by the method instead. The `customizer` is bound to `thisArg` and invoked + * with five arguments: (objectValue, sourceValue, key, object, source). + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @param {*} [thisArg] The `this` binding of `customizer`. + * @returns {Object} Returns `object`. + * @example + * + * var users = { + * 'data': [{ 'user': 'barney' }, { 'user': 'fred' }] + * }; + * + * var ages = { + * 'data': [{ 'age': 36 }, { 'age': 40 }] + * }; + * + * _.merge(users, ages); + * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] } + * + * // using a customizer callback + * var object = { + * 'fruits': ['apple'], + * 'vegetables': ['beet'] + * }; + * + * var other = { + * 'fruits': ['banana'], + * 'vegetables': ['carrot'] + * }; + * + * _.merge(object, other, function(a, b) { + * if (_.isArray(a)) { + * return a.concat(b); + * } + * }); + * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] } + */ + var merge = createAssigner(baseMerge); + + /** * Assigns own enumerable properties of source object(s) to the destination * object. Subsequent sources overwrite property assignments of previous sources. * If `customizer` is provided it is invoked to produce the assigned values. * The `customizer` is bound to `thisArg` and invoked with five arguments: * (objectValue, sourceValue, key, object, source). * + * **Note:** This method mutates `object` and is based on + * [`Object.assign`](http://ecma-international.org/ecma-262/6.0/#sec-object.assign). + * * @static * @memberOf _ * @alias extend * @category Object * @param {Object} object The destination object. * @param {...Object} [sources] The source objects. - * @param {Function} [customizer] The function to customize assigning values. + * @param {Function} [customizer] The function to customize assigned values. * @param {*} [thisArg] The `this` binding of `customizer`. * @returns {Object} Returns `object`. * @example @@ -43107,13 +43561,17 @@ return jQuery; * * // using a customizer callback * var defaults = _.partialRight(_.assign, function(value, other) { - * return typeof value == 'undefined' ? other : value; + * return _.isUndefined(value) ? other : value; * }); * * defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' }); * // => { 'user': 'barney', 'age': 36 } */ - var assign = createAssigner(baseAssign); + var assign = createAssigner(function(object, source, customizer) { + return customizer + ? assignWith(object, source, customizer) + : baseAssign(object, source); + }); /** * Creates an object that inherits from the given `prototype` object. If a @@ -43152,9 +43610,9 @@ return jQuery; function create(prototype, properties, guard) { var result = baseCreate(prototype); if (guard && isIterateeCall(prototype, properties, guard)) { - properties = null; + properties = undefined; } - return properties ? baseCopy(properties, result, keys(properties)) : result; + return properties ? baseAssign(result, properties) : result; } /** @@ -43162,6 +43620,8 @@ return jQuery; * object for all destination properties that resolve to `undefined`. Once a * property is set, additional values of the same property are ignored. * + * **Note:** This method mutates `object`. + * * @static * @memberOf _ * @category Object @@ -43173,14 +43633,27 @@ return jQuery; * _.defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' }); * // => { 'user': 'barney', 'age': 36 } */ - var defaults = restParam(function(args) { - var object = args[0]; - if (object == null) { - return object; - } - args.push(assignDefaults); - return assign.apply(undefined, args); - }); + var defaults = createDefaults(assign, assignDefaults); + + /** + * This method is like `_.defaults` except that it recursively assigns + * default properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @example + * + * _.defaultsDeep({ 'user': { 'name': 'barney' } }, { 'user': { 'name': 'fred', 'age': 36 } }); + * // => { 'user': { 'name': 'barney', 'age': 36 } } + * + */ + var defaultsDeep = createDefaults(merge, mergeDefaults); /** * This method is like `_.find` except that it returns the key of the first @@ -43285,7 +43758,7 @@ return jQuery; /** * Iterates over own and inherited enumerable properties of an object invoking * `iteratee` for each property. The `iteratee` is bound to `thisArg` and invoked - * with three arguments: (value, key, object). Iterator functions may exit + * with three arguments: (value, key, object). Iteratee functions may exit * iteration early by explicitly returning `false`. * * @static @@ -43341,7 +43814,7 @@ return jQuery; /** * Iterates over own enumerable properties of an object invoking `iteratee` * for each property. The `iteratee` is bound to `thisArg` and invoked with - * three arguments: (value, key, object). Iterator functions may exit iteration + * three arguments: (value, key, object). Iteratee functions may exit iteration * early by explicitly returning `false`. * * @static @@ -43414,24 +43887,72 @@ return jQuery; } /** - * Checks if `key` exists as a direct property of `object` instead of an - * inherited property. + * Gets the property value at `path` of `object`. If the resolved value is + * `undefined` the `defaultValue` is used in its place. * * @static * @memberOf _ * @category Object - * @param {Object} object The object to inspect. - * @param {string} key The key to check. - * @returns {boolean} Returns `true` if `key` is a direct property, else `false`. + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned if the resolved value is `undefined`. + * @returns {*} Returns the resolved value. * @example * - * var object = { 'a': 1, 'b': 2, 'c': 3 }; + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; * - * _.has(object, 'b'); + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ + function get(object, path, defaultValue) { + var result = object == null ? undefined : baseGet(object, toPath(path), path + ''); + return result === undefined ? defaultValue : result; + } + + /** + * Checks if `path` is a direct property. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` is a direct property, else `false`. + * @example + * + * var object = { 'a': { 'b': { 'c': 3 } } }; + * + * _.has(object, 'a'); + * // => true + * + * _.has(object, 'a.b.c'); + * // => true + * + * _.has(object, ['a', 'b', 'c']); * // => true */ - function has(object, key) { - return object ? hasOwnProperty.call(object, key) : false; + function has(object, path) { + if (object == null) { + return false; + } + var result = hasOwnProperty.call(object, path); + if (!result && !isKey(path)) { + path = toPath(path); + object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1)); + if (object == null) { + return false; + } + path = last(path); + result = hasOwnProperty.call(object, path); + } + return result || (isLength(object.length) && isIndex(path, object.length) && + (isArray(object) || isArguments(object))); } /** @@ -43459,7 +43980,7 @@ return jQuery; */ function invert(object, multiValue, guard) { if (guard && isIterateeCall(object, multiValue, guard)) { - multiValue = null; + multiValue = undefined; } var index = -1, props = keys(object), @@ -43488,13 +44009,13 @@ return jQuery; * Creates an array of the own enumerable property names of `object`. * * **Note:** Non-object values are coerced to objects. See the - * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.keys) + * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys) * for more details. * * @static * @memberOf _ * @category Object - * @param {Object} object The object to inspect. + * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. * @example * @@ -43512,12 +44033,9 @@ return jQuery; * // => ['0', '1'] */ var keys = !nativeKeys ? shimKeys : function(object) { - if (object) { - var Ctor = object.constructor, - length = object.length; - } + var Ctor = object == null ? undefined : object.constructor; if ((typeof Ctor == 'function' && Ctor.prototype === object) || - (typeof object != 'function' && (length && isLength(length)))) { + (typeof object != 'function' && isArrayLike(object))) { return shimKeys(object); } return isObject(object) ? nativeKeys(object) : []; @@ -43531,7 +44049,7 @@ return jQuery; * @static * @memberOf _ * @category Object - * @param {Object} object The object to inspect. + * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. * @example * @@ -43554,7 +44072,7 @@ return jQuery; } var length = object.length; length = (length && isLength(length) && - (isArray(object) || (support.nonEnumArgs && isArguments(object))) && length) || 0; + (isArray(object) || isArguments(object)) && length) || 0; var Ctor = object.constructor, index = -1, @@ -43575,6 +44093,28 @@ return jQuery; } /** + * The opposite of `_.mapValues`; this method creates an object with the + * same values as `object` and keys generated by running each own enumerable + * property of `object` through `iteratee`. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function|Object|string} [iteratee=_.identity] The function invoked + * per iteration. + * @param {*} [thisArg] The `this` binding of `iteratee`. + * @returns {Object} Returns the new mapped object. + * @example + * + * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) { + * return key + value; + * }); + * // => { 'a1': 1, 'b2': 2 } + */ + var mapKeys = createObjectMapper(true); + + /** * Creates an object with the same keys as `object` and values generated by * running each own enumerable property of `object` through `iteratee`. The * iteratee function is bound to `thisArg` and invoked with three arguments: @@ -43615,74 +44155,11 @@ return jQuery; * _.mapValues(users, 'age'); * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) */ - function mapValues(object, iteratee, thisArg) { - var result = {}; - iteratee = getCallback(iteratee, thisArg, 3); - - baseForOwn(object, function(value, key, object) { - result[key] = iteratee(value, key, object); - }); - return result; - } - - /** - * Recursively merges own enumerable properties of the source object(s), that - * don't resolve to `undefined` into the destination object. Subsequent sources - * overwrite property assignments of previous sources. If `customizer` is - * provided it is invoked to produce the merged values of the destination and - * source properties. If `customizer` returns `undefined` merging is handled - * by the method instead. The `customizer` is bound to `thisArg` and invoked - * with five arguments: (objectValue, sourceValue, key, object, source). - * - * @static - * @memberOf _ - * @category Object - * @param {Object} object The destination object. - * @param {...Object} [sources] The source objects. - * @param {Function} [customizer] The function to customize merging properties. - * @param {*} [thisArg] The `this` binding of `customizer`. - * @returns {Object} Returns `object`. - * @example - * - * var users = { - * 'data': [{ 'user': 'barney' }, { 'user': 'fred' }] - * }; - * - * var ages = { - * 'data': [{ 'age': 36 }, { 'age': 40 }] - * }; - * - * _.merge(users, ages); - * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] } - * - * // using a customizer callback - * var object = { - * 'fruits': ['apple'], - * 'vegetables': ['beet'] - * }; - * - * var other = { - * 'fruits': ['banana'], - * 'vegetables': ['carrot'] - * }; - * - * _.merge(object, other, function(a, b) { - * if (_.isArray(a)) { - * return a.concat(b); - * } - * }); - * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] } - */ - var merge = createAssigner(baseMerge); + var mapValues = createObjectMapper(); /** * The opposite of `_.pick`; this method creates an object composed of the * own and inherited enumerable properties of `object` that are not omitted. - * Property names may be specified as individual arguments or as arrays of - * property names. If `predicate` is provided it is invoked for each property - * of `object` omitting the properties `predicate` returns truthy for. The - * predicate is bound to `thisArg` and invoked with three arguments: - * (value, key, object). * * @static * @memberOf _ @@ -43724,7 +44201,7 @@ return jQuery; * @static * @memberOf _ * @category Object - * @param {Object} object The object to inspect. + * @param {Object} object The object to query. * @returns {Array} Returns the new array of key-value pairs. * @example * @@ -43732,6 +44209,8 @@ return jQuery; * // => [['barney', 36], ['fred', 40]] (iteration order is not guaranteed) */ function pairs(object) { + object = toObject(object); + var index = -1, props = keys(object), length = props.length, @@ -43780,41 +44259,93 @@ return jQuery; }); /** - * Resolves the value of property `key` on `object`. If the value of `key` is - * a function it is invoked with the `this` binding of `object` and its result - * is returned, else the property value is returned. If the property value is - * `undefined` the `defaultValue` is used in its place. + * This method is like `_.get` except that if the resolved value is a function + * it is invoked with the `this` binding of its parent object and its result + * is returned. * * @static * @memberOf _ * @category Object * @param {Object} object The object to query. - * @param {string} key The key of the property to resolve. - * @param {*} [defaultValue] The value returned if the property value - * resolves to `undefined`. + * @param {Array|string} path The path of the property to resolve. + * @param {*} [defaultValue] The value returned if the resolved value is `undefined`. * @returns {*} Returns the resolved value. * @example * - * var object = { 'user': 'fred', 'age': _.constant(40) }; + * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] }; * - * _.result(object, 'user'); - * // => 'fred' + * _.result(object, 'a[0].b.c1'); + * // => 3 * - * _.result(object, 'age'); - * // => 40 + * _.result(object, 'a[0].b.c2'); + * // => 4 * - * _.result(object, 'status', 'busy'); - * // => 'busy' + * _.result(object, 'a.b.c', 'default'); + * // => 'default' * - * _.result(object, 'status', _.constant('busy')); - * // => 'busy' + * _.result(object, 'a.b.c', _.constant('default')); + * // => 'default' */ - function result(object, key, defaultValue) { - var value = object == null ? undefined : object[key]; - if (typeof value == 'undefined') { - value = defaultValue; + function result(object, path, defaultValue) { + var result = object == null ? undefined : object[path]; + if (result === undefined) { + if (object != null && !isKey(path, object)) { + path = toPath(path); + object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1)); + result = object == null ? undefined : object[last(path)]; + } + result = result === undefined ? defaultValue : result; + } + return isFunction(result) ? result.call(object) : result; + } + + /** + * Sets the property value of `path` on `object`. If a portion of `path` + * does not exist it is created. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to augment. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @returns {Object} Returns `object`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.set(object, 'a[0].b.c', 4); + * console.log(object.a[0].b.c); + * // => 4 + * + * _.set(object, 'x[0].y.z', 5); + * console.log(object.x[0].y.z); + * // => 5 + */ + function set(object, path, value) { + if (object == null) { + return object; + } + var pathKey = (path + ''); + path = (object[pathKey] != null || isKey(path, object)) ? [pathKey] : toPath(path); + + var index = -1, + length = path.length, + lastIndex = length - 1, + nested = object; + + while (nested != null && ++index < length) { + var key = path[index]; + if (isObject(nested)) { + if (index == lastIndex) { + nested[key] = value; + } else if (nested[key] == null) { + nested[key] = isIndex(path[index + 1]) ? [] : {}; + } + } + nested = nested[key]; } - return isFunction(value) ? value.call(object) : value; + return object; } /** @@ -43822,7 +44353,7 @@ return jQuery; * `accumulator` object which is the result of running each of its own enumerable * properties through `iteratee`, with each invocation potentially mutating * the `accumulator` object. The `iteratee` is bound to `thisArg` and invoked - * with four arguments: (accumulator, value, key, object). Iterator functions + * with four arguments: (accumulator, value, key, object). Iteratee functions * may exit iteration early by explicitly returning `false`. * * @static @@ -43856,7 +44387,7 @@ return jQuery; if (isArr) { accumulator = isArray(object) ? new Ctor : []; } else { - accumulator = baseCreate(isFunction(Ctor) && Ctor.prototype); + accumulator = baseCreate(isFunction(Ctor) ? Ctor.prototype : undefined); } } else { accumulator = {}; @@ -43959,13 +44490,13 @@ return jQuery; */ function inRange(value, start, end) { start = +start || 0; - if (typeof end === 'undefined') { + if (end === undefined) { end = start; start = 0; } else { end = +end || 0; } - return value >= start && value < end; + return value >= nativeMin(start, end) && value < nativeMax(start, end); } /** @@ -43997,7 +44528,7 @@ return jQuery; */ function random(min, max, floating) { if (floating && isIterateeCall(min, max, floating)) { - max = floating = null; + max = floating = undefined; } var noMin = min == null, noMax = max == null; @@ -44090,7 +44621,7 @@ return jQuery; */ function deburr(string) { string = baseToString(string); - return string && string.replace(reLatin1, deburrLetter).replace(reComboMarks, ''); + return string && string.replace(reLatin1, deburrLetter).replace(reComboMark, ''); } /** @@ -44119,7 +44650,7 @@ return jQuery; target = (target + ''); var length = string.length; - position = typeof position == 'undefined' + position = position === undefined ? length : nativeMin(position < 0 ? 0 : (+position || 0), length); @@ -44135,15 +44666,16 @@ return jQuery; * use a third-party library like [_he_](https://mths.be/he). * * Though the ">" character is escaped for symmetry, characters like - * ">" and "/" don't require escaping in HTML and have no special meaning + * ">" and "/" don't need escaping in HTML and have no special meaning * unless they're part of a tag or unquoted attribute value. * See [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands) * (under "semi-related fun fact") for more details. * * Backticks are escaped because in Internet Explorer < 9, they can break out - * of attribute values or HTML comments. See [#102](https://html5sec.org/#102), - * [#108](https://html5sec.org/#108), and [#133](https://html5sec.org/#133) of - * the [HTML5 Security Cheatsheet](https://html5sec.org/) for more details. + * of attribute values or HTML comments. See [#59](https://html5sec.org/#59), + * [#102](https://html5sec.org/#102), [#108](https://html5sec.org/#108), and + * [#133](https://html5sec.org/#133) of the [HTML5 Security Cheatsheet](https://html5sec.org/) + * for more details. * * When working with HTML you should always [quote attribute values](http://wonko.com/post/html-escaping) * to reduce XSS vectors. @@ -44183,8 +44715,8 @@ return jQuery; function escapeRegExp(string) { string = baseToString(string); return (string && reHasRegExpChars.test(string)) - ? string.replace(reRegExpChars, '\\$&') - : string; + ? string.replace(reRegExpChars, escapeRegExpChar) + : (string || '(?:)'); } /** @@ -44211,7 +44743,7 @@ return jQuery; }); /** - * Pads `string` on the left and right sides if it is shorter than `length`. + * Pads `string` on the left and right sides if it's shorter than `length`. * Padding characters are truncated if they can't be evenly divided by `length`. * * @static @@ -44241,15 +44773,15 @@ return jQuery; return string; } var mid = (length - strLength) / 2, - leftLength = floor(mid), - rightLength = ceil(mid); + leftLength = nativeFloor(mid), + rightLength = nativeCeil(mid); chars = createPadding('', rightLength, chars); return chars.slice(0, leftLength) + string + chars; } /** - * Pads `string` on the left side if it is shorter than `length`. Padding + * Pads `string` on the left side if it's shorter than `length`. Padding * characters are truncated if they exceed `length`. * * @static @@ -44273,7 +44805,7 @@ return jQuery; var padLeft = createPadDir(); /** - * Pads `string` on the right side if it is shorter than `length`. Padding + * Pads `string` on the right side if it's shorter than `length`. Padding * characters are truncated if they exceed `length`. * * @static @@ -44320,25 +44852,16 @@ return jQuery; * // => [6, 8, 10] */ function parseInt(string, radix, guard) { - if (guard && isIterateeCall(string, radix, guard)) { + // Firefox < 21 and Opera < 15 follow ES3 for `parseInt`. + // Chrome fails to trim leading <BOM> whitespace characters. + // See https://code.google.com/p/v8/issues/detail?id=3109 for more details. + if (guard ? isIterateeCall(string, radix, guard) : radix == null) { radix = 0; + } else if (radix) { + radix = +radix; } - return nativeParseInt(string, radix); - } - // Fallback for environments with pre-ES5 implementations. - if (nativeParseInt(whitespace + '08') != 8) { - parseInt = function(string, radix, guard) { - // Firefox < 21 and Opera < 15 follow ES3 for `parseInt`. - // Chrome fails to trim leading <BOM> whitespace characters. - // See https://code.google.com/p/v8/issues/detail?id=3109 for more details. - if (guard ? isIterateeCall(string, radix, guard) : radix == null) { - radix = 0; - } else if (radix) { - radix = +radix; - } - string = trim(string); - return nativeParseInt(string, radix || (reHexPrefix.test(string) ? 16 : 10)); - }; + string = trim(string); + return nativeParseInt(string, radix || (reHasHexPrefix.test(string) ? 16 : 10)); } /** @@ -44374,7 +44897,7 @@ return jQuery; if (n % 2) { result += string; } - n = floor(n / 2); + n = nativeFloor(n / 2); string += string; } while (n); @@ -44559,12 +45082,12 @@ return jQuery; var settings = lodash.templateSettings; if (otherOptions && isIterateeCall(string, options, otherOptions)) { - options = otherOptions = null; + options = otherOptions = undefined; } string = baseToString(string); - options = baseAssign(baseAssign({}, otherOptions || options), settings, assignOwnDefaults); + options = assignWith(baseAssign({}, otherOptions || options), settings, assignOwnDefaults); - var imports = baseAssign(baseAssign({}, options.imports), settings.imports, assignOwnDefaults), + var imports = assignWith(baseAssign({}, options.imports), settings.imports, assignOwnDefaults), importsKeys = keys(imports), importsValues = baseValues(imports, importsKeys); @@ -44754,7 +45277,7 @@ return jQuery; } /** - * Truncates `string` if it is longer than the given maximum string length. + * Truncates `string` if it's longer than the given maximum string length. * The last characters of the truncated string are replaced with the omission * string which defaults to "...". * @@ -44795,7 +45318,7 @@ return jQuery; */ function trunc(string, options, guard) { if (guard && isIterateeCall(string, options, guard)) { - options = null; + options = undefined; } var length = DEFAULT_TRUNC_LENGTH, omission = DEFAULT_TRUNC_OMISSION; @@ -44890,7 +45413,7 @@ return jQuery; */ function words(string, pattern, guard) { if (guard && isIterateeCall(string, pattern, guard)) { - pattern = null; + pattern = undefined; } string = baseToString(string); return string.match(pattern || reWords) || []; @@ -44966,7 +45489,7 @@ return jQuery; */ function callback(func, thisArg, guard) { if (guard && isIterateeCall(func, thisArg, guard)) { - thisArg = null; + thisArg = undefined; } return isObjectLike(func) ? matches(func) @@ -45015,7 +45538,7 @@ return jQuery; } /** - * Creates a function which performs a deep comparison between a given object + * Creates a function that performs a deep comparison between a given object * and `source`, returning `true` if the given object has equivalent property * values, else `false`. * @@ -45044,7 +45567,7 @@ return jQuery; } /** - * Creates a function which compares the property value of `key` on a given + * Creates a function that compares the property value of `path` on a given * object to `value`. * * **Note:** This method supports comparing arrays, booleans, `Date` objects, @@ -45054,8 +45577,8 @@ return jQuery; * @static * @memberOf _ * @category Utility - * @param {string} key The key of the property to get. - * @param {*} value The value to compare. + * @param {Array|string} path The path of the property to get. + * @param {*} srcValue The value to match. * @returns {Function} Returns the new function. * @example * @@ -45067,22 +45590,79 @@ return jQuery; * _.find(users, _.matchesProperty('user', 'fred')); * // => { 'user': 'fred' } */ - function matchesProperty(key, value) { - return baseMatchesProperty(key + '', baseClone(value, true)); + function matchesProperty(path, srcValue) { + return baseMatchesProperty(path, baseClone(srcValue, true)); } /** + * Creates a function that invokes the method at `path` on a given object. + * Any additional arguments are provided to the invoked method. + * + * @static + * @memberOf _ + * @category Utility + * @param {Array|string} path The path of the method to invoke. + * @param {...*} [args] The arguments to invoke the method with. + * @returns {Function} Returns the new function. + * @example + * + * var objects = [ + * { 'a': { 'b': { 'c': _.constant(2) } } }, + * { 'a': { 'b': { 'c': _.constant(1) } } } + * ]; + * + * _.map(objects, _.method('a.b.c')); + * // => [2, 1] + * + * _.invoke(_.sortBy(objects, _.method(['a', 'b', 'c'])), 'a.b.c'); + * // => [1, 2] + */ + var method = restParam(function(path, args) { + return function(object) { + return invokePath(object, path, args); + }; + }); + + /** + * The opposite of `_.method`; this method creates a function that invokes + * the method at a given path on `object`. Any additional arguments are + * provided to the invoked method. + * + * @static + * @memberOf _ + * @category Utility + * @param {Object} object The object to query. + * @param {...*} [args] The arguments to invoke the method with. + * @returns {Function} Returns the new function. + * @example + * + * var array = _.times(3, _.constant), + * object = { 'a': array, 'b': array, 'c': array }; + * + * _.map(['a[2]', 'c[0]'], _.methodOf(object)); + * // => [2, 0] + * + * _.map([['a', '2'], ['c', '0']], _.methodOf(object)); + * // => [2, 0] + */ + var methodOf = restParam(function(object, args) { + return function(path) { + return invokePath(object, path, args); + }; + }); + + /** * Adds all own enumerable function properties of a source object to the * destination object. If `object` is a function then methods are added to * its prototype as well. * - * **Note:** Use `_.runInContext` to create a pristine `lodash` function - * for mixins to avoid conflicts caused by modifying the original. + * **Note:** Use `_.runInContext` to create a pristine `lodash` function to + * avoid conflicts caused by modifying the original. * * @static * @memberOf _ * @category Utility - * @param {Function|Object} [object=this] object The destination object. + * @param {Function|Object} [object=lodash] The destination object. * @param {Object} source The object of functions to add. * @param {Object} [options] The options object. * @param {boolean} [options.chain=true] Specify whether the functions added @@ -45096,9 +45676,6 @@ return jQuery; * }); * } * - * // use `_.runInContext` to avoid conflicts (esp. in Node.js) - * var _ = require('lodash').runInContext(); - * * _.mixin({ 'vowels': vowels }); * _.vowels('fred'); * // => ['e'] @@ -45113,8 +45690,8 @@ return jQuery; function mixin(object, source, options) { if (options == null) { var isObj = isObject(source), - props = isObj && keys(source), - methodNames = props && props.length && baseFunctions(source, props); + props = isObj ? keys(source) : undefined, + methodNames = (props && props.length) ? baseFunctions(source, props) : undefined; if (!(methodNames ? methodNames.length : isObj)) { methodNames = false; @@ -45153,9 +45730,7 @@ return jQuery; result.__chain__ = chainAll; return result; } - var args = [this.value()]; - push.apply(args, arguments); - return func.apply(object, args); + return func.apply(object, arrayPush([this.value()], arguments)); }; }(func)); } @@ -45176,12 +45751,12 @@ return jQuery; * var lodash = _.noConflict(); */ function noConflict() { - context._ = oldDash; + root._ = oldDash; return this; } /** - * A no-operation function which returns `undefined` regardless of the + * A no-operation function that returns `undefined` regardless of the * arguments it receives. * * @static @@ -45199,61 +45774,61 @@ return jQuery; } /** - * Creates a function which returns the property value of `key` on a given object. + * Creates a function that returns the property value at `path` on a + * given object. * * @static * @memberOf _ * @category Utility - * @param {string} key The key of the property to get. + * @param {Array|string} path The path of the property to get. * @returns {Function} Returns the new function. * @example * - * var users = [ - * { 'user': 'fred' }, - * { 'user': 'barney' } + * var objects = [ + * { 'a': { 'b': { 'c': 2 } } }, + * { 'a': { 'b': { 'c': 1 } } } * ]; * - * var getName = _.property('user'); - * - * _.map(users, getName); - * // => ['fred', 'barney'] + * _.map(objects, _.property('a.b.c')); + * // => [2, 1] * - * _.pluck(_.sortBy(users, getName), 'user'); - * // => ['barney', 'fred'] + * _.pluck(_.sortBy(objects, _.property(['a', 'b', 'c'])), 'a.b.c'); + * // => [1, 2] */ - function property(key) { - return baseProperty(key + ''); + function property(path) { + return isKey(path) ? baseProperty(path) : basePropertyDeep(path); } /** - * The opposite of `_.property`; this method creates a function which returns - * the property value of a given key on `object`. + * The opposite of `_.property`; this method creates a function that returns + * the property value at a given path on `object`. * * @static * @memberOf _ * @category Utility - * @param {Object} object The object to inspect. + * @param {Object} object The object to query. * @returns {Function} Returns the new function. * @example * - * var object = { 'a': 3, 'b': 1, 'c': 2 }; + * var array = [0, 1, 2], + * object = { 'a': array, 'b': array, 'c': array }; * - * _.map(['a', 'c'], _.propertyOf(object)); - * // => [3, 2] + * _.map(['a[2]', 'c[0]'], _.propertyOf(object)); + * // => [2, 0] * - * _.sortBy(['a', 'b', 'c'], _.propertyOf(object)); - * // => ['b', 'c', 'a'] + * _.map([['a', '2'], ['c', '0']], _.propertyOf(object)); + * // => [2, 0] */ function propertyOf(object) { - return function(key) { - return object == null ? undefined : object[key]; + return function(path) { + return baseGet(object, toPath(path), path + ''); }; } /** * Creates an array of numbers (positive and/or negative) progressing from * `start` up to, but not including, `end`. If `end` is not specified it is - * set to `start` with `start` then set to `0`. If `start` is less than `end` + * set to `start` with `start` then set to `0`. If `end` is less than `start` * a zero-length range is created unless a negative `step` is specified. * * @static @@ -45285,7 +45860,7 @@ return jQuery; */ function range(start, end, step) { if (step && isIterateeCall(start, end, step)) { - end = step = null; + end = step = undefined; } start = +start || 0; step = step == null ? 1 : (+step || 0); @@ -45299,7 +45874,7 @@ return jQuery; // Use `Array(length)` so engines like Chakra and V8 avoid slower modes. // See https://youtu.be/XAqIpGU8ZZk#t=17m25s for more details. var index = -1, - length = nativeMax(ceil((end - start) / (step || 1)), 0), + length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), result = Array(length); while (++index < length) { @@ -45329,7 +45904,7 @@ return jQuery; * _.times(3, function(n) { * mage.castSpell(n); * }); - * // => invokes `mage.castSpell(n)` three times with `n` of `0`, `1`, and `2` respectively + * // => invokes `mage.castSpell(n)` three times with `n` of `0`, `1`, and `2` * * _.times(3, function(n) { * this.cast(n); @@ -45337,7 +45912,7 @@ return jQuery; * // => also invokes `mage.castSpell(n)` three times */ function times(n, iteratee, thisArg) { - n = +n; + n = nativeFloor(n); // Exit early to avoid a JSC JIT bug in Safari 8 // where `Array(0)` is treated as `Array(1)`. @@ -45396,10 +45971,54 @@ return jQuery; * // => 10 */ function add(augend, addend) { - return augend + addend; + return (+augend || 0) + (+addend || 0); } /** + * Calculates `n` rounded up to `precision`. + * + * @static + * @memberOf _ + * @category Math + * @param {number} n The number to round up. + * @param {number} [precision=0] The precision to round up to. + * @returns {number} Returns the rounded up number. + * @example + * + * _.ceil(4.006); + * // => 5 + * + * _.ceil(6.004, 2); + * // => 6.01 + * + * _.ceil(6040, -2); + * // => 6100 + */ + var ceil = createRound('ceil'); + + /** + * Calculates `n` rounded down to `precision`. + * + * @static + * @memberOf _ + * @category Math + * @param {number} n The number to round down. + * @param {number} [precision=0] The precision to round down to. + * @returns {number} Returns the rounded down number. + * @example + * + * _.floor(4.006); + * // => 4 + * + * _.floor(0.046, 2); + * // => 0.04 + * + * _.floor(4060, -2); + * // => 4000 + */ + var floor = createRound('floor'); + + /** * Gets the maximum value of `collection`. If `collection` is empty or falsey * `-Infinity` is returned. If an iteratee function is provided it is invoked * for each value in `collection` to generate the criterion by which the value @@ -45446,7 +46065,7 @@ return jQuery; * _.max(users, 'age'); * // => { 'user': 'fred', 'age': 40 } */ - var max = createExtremum(arrayMax); + var max = createExtremum(gt, NEGATIVE_INFINITY); /** * Gets the minimum value of `collection`. If `collection` is empty or falsey @@ -45495,7 +46114,29 @@ return jQuery; * _.min(users, 'age'); * // => { 'user': 'barney', 'age': 36 } */ - var min = createExtremum(arrayMin, true); + var min = createExtremum(lt, POSITIVE_INFINITY); + + /** + * Calculates `n` rounded to `precision`. + * + * @static + * @memberOf _ + * @category Math + * @param {number} n The number to round. + * @param {number} [precision=0] The precision to round to. + * @returns {number} Returns the rounded number. + * @example + * + * _.round(4.006); + * // => 4 + * + * _.round(4.006, 2); + * // => 4.01 + * + * _.round(4060, -2); + * // => 4100 + */ + var round = createRound('round'); /** * Gets the sum of the values in `collection`. @@ -45531,17 +46172,11 @@ return jQuery; */ function sum(collection, iteratee, thisArg) { if (thisArg && isIterateeCall(collection, iteratee, thisArg)) { - iteratee = null; + iteratee = undefined; } - var func = getCallback(), - noIteratee = iteratee == null; - - if (!(func === baseCallback && noIteratee)) { - noIteratee = false; - iteratee = func(iteratee, thisArg, 3); - } - return noIteratee - ? arraySum(isArray(collection) ? collection : toIterable(collection)) + iteratee = getCallback(iteratee, thisArg, 3); + return iteratee.length == 1 + ? arraySum(isArray(collection) ? collection : toIterable(collection), iteratee) : baseSum(collection, iteratee); } @@ -45588,6 +46223,7 @@ return jQuery; lodash.curryRight = curryRight; lodash.debounce = debounce; lodash.defaults = defaults; + lodash.defaultsDeep = defaultsDeep; lodash.defer = defer; lodash.delay = delay; lodash.difference = difference; @@ -45617,12 +46253,16 @@ return jQuery; lodash.keys = keys; lodash.keysIn = keysIn; lodash.map = map; + lodash.mapKeys = mapKeys; lodash.mapValues = mapValues; lodash.matches = matches; lodash.matchesProperty = matchesProperty; lodash.memoize = memoize; lodash.merge = merge; + lodash.method = method; + lodash.methodOf = methodOf; lodash.mixin = mixin; + lodash.modArgs = modArgs; lodash.negate = negate; lodash.omit = omit; lodash.once = once; @@ -45642,6 +46282,7 @@ return jQuery; lodash.remove = remove; lodash.rest = rest; lodash.restParam = restParam; + lodash.set = set; lodash.shuffle = shuffle; lodash.slice = slice; lodash.sortBy = sortBy; @@ -45662,6 +46303,7 @@ return jQuery; lodash.union = union; lodash.uniq = uniq; lodash.unzip = unzip; + lodash.unzipWith = unzipWith; lodash.values = values; lodash.valuesIn = valuesIn; lodash.where = where; @@ -45670,6 +46312,7 @@ return jQuery; lodash.xor = xor; lodash.zip = zip; lodash.zipObject = zipObject; + lodash.zipWith = zipWith; // Add aliases. lodash.backflow = flowRight; @@ -45695,6 +46338,7 @@ return jQuery; lodash.attempt = attempt; lodash.camelCase = camelCase; lodash.capitalize = capitalize; + lodash.ceil = ceil; lodash.clone = clone; lodash.cloneDeep = cloneDeep; lodash.deburr = deburr; @@ -45710,6 +46354,10 @@ return jQuery; lodash.findLastKey = findLastKey; lodash.findWhere = findWhere; lodash.first = first; + lodash.floor = floor; + lodash.get = get; + lodash.gt = gt; + lodash.gte = gte; lodash.has = has; lodash.identity = identity; lodash.includes = includes; @@ -45739,6 +46387,8 @@ return jQuery; lodash.kebabCase = kebabCase; lodash.last = last; lodash.lastIndexOf = lastIndexOf; + lodash.lt = lt; + lodash.lte = lte; lodash.max = max; lodash.min = min; lodash.noConflict = noConflict; @@ -45753,6 +46403,7 @@ return jQuery; lodash.reduceRight = reduceRight; lodash.repeat = repeat; lodash.result = result; + lodash.round = round; lodash.runInContext = runInContext; lodash.size = size; lodash.snakeCase = snakeCase; @@ -45775,6 +46426,7 @@ return jQuery; lodash.all = every; lodash.any = some; lodash.contains = includes; + lodash.eq = isEqual; lodash.detect = find; lodash.foldl = reduce; lodash.foldr = reduceRight; @@ -45822,48 +46474,20 @@ return jQuery; lodash[methodName].placeholder = lodash; }); - // Add `LazyWrapper` methods that accept an `iteratee` value. - arrayEach(['dropWhile', 'filter', 'map', 'takeWhile'], function(methodName, type) { - var isFilter = type != LAZY_MAP_FLAG, - isDropWhile = type == LAZY_DROP_WHILE_FLAG; - - LazyWrapper.prototype[methodName] = function(iteratee, thisArg) { - var filtered = this.__filtered__, - result = (filtered && isDropWhile) ? new LazyWrapper(this) : this.clone(), - iteratees = result.__iteratees__ || (result.__iteratees__ = []); - - iteratees.push({ - 'done': false, - 'count': 0, - 'index': 0, - 'iteratee': getCallback(iteratee, thisArg, 1), - 'limit': -1, - 'type': type - }); - - result.__filtered__ = filtered || isFilter; - return result; - }; - }); - // Add `LazyWrapper` methods for `_.drop` and `_.take` variants. arrayEach(['drop', 'take'], function(methodName, index) { - var whileName = methodName + 'While'; - LazyWrapper.prototype[methodName] = function(n) { - var filtered = this.__filtered__, - result = (filtered && !index) ? this.dropWhile() : this.clone(); + var filtered = this.__filtered__; + if (filtered && !index) { + return new LazyWrapper(this); + } + n = n == null ? 1 : nativeMax(nativeFloor(n) || 0, 0); - n = n == null ? 1 : nativeMax(floor(n) || 0, 0); + var result = this.clone(); if (filtered) { - if (index) { - result.__takeCount__ = nativeMin(result.__takeCount__, n); - } else { - last(result.__iteratees__).limit = n; - } + result.__takeCount__ = nativeMin(result.__takeCount__, n); } else { - var views = result.__views__ || (result.__views__ = []); - views.push({ 'size': n, 'type': methodName + (result.__dir__ < 0 ? 'Right' : '') }); + result.__views__.push({ 'size': n, 'type': methodName + (result.__dir__ < 0 ? 'Right' : '') }); } return result; }; @@ -45871,9 +46495,18 @@ return jQuery; LazyWrapper.prototype[methodName + 'Right'] = function(n) { return this.reverse()[methodName](n).reverse(); }; + }); + + // Add `LazyWrapper` methods that accept an `iteratee` value. + arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) { + var type = index + 1, + isFilter = type != LAZY_MAP_FLAG; - LazyWrapper.prototype[methodName + 'RightWhile'] = function(predicate, thisArg) { - return this.reverse()[whileName](predicate, thisArg).reverse(); + LazyWrapper.prototype[methodName] = function(iteratee, thisArg) { + var result = this.clone(); + result.__iteratees__.push({ 'iteratee': getCallback(iteratee, thisArg, 1), 'type': type }); + result.__filtered__ = result.__filtered__ || isFilter; + return result; }; }); @@ -45891,14 +46524,14 @@ return jQuery; var dropName = 'drop' + (index ? '' : 'Right'); LazyWrapper.prototype[methodName] = function() { - return this[dropName](1); + return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1); }; }); // Add `LazyWrapper` methods for `_.pluck` and `_.where`. arrayEach(['pluck', 'where'], function(methodName, index) { var operationName = index ? 'filter' : 'map', - createCallback = index ? baseMatches : baseProperty; + createCallback = index ? baseMatches : property; LazyWrapper.prototype[methodName] = function(value) { return this[operationName](createCallback(value)); @@ -45918,31 +46551,42 @@ return jQuery; LazyWrapper.prototype.slice = function(start, end) { start = start == null ? 0 : (+start || 0); - var result = start < 0 ? this.takeRight(-start) : this.drop(start); - if (typeof end != 'undefined') { + var result = this; + if (result.__filtered__ && (start > 0 || end < 0)) { + return new LazyWrapper(result); + } + if (start < 0) { + result = result.takeRight(-start); + } else if (start) { + result = result.drop(start); + } + if (end !== undefined) { end = (+end || 0); result = end < 0 ? result.dropRight(-end) : result.take(end - start); } return result; }; + LazyWrapper.prototype.takeRightWhile = function(predicate, thisArg) { + return this.reverse().takeWhile(predicate, thisArg).reverse(); + }; + LazyWrapper.prototype.toArray = function() { - return this.drop(0); + return this.take(POSITIVE_INFINITY); }; // Add `LazyWrapper` methods to `lodash.prototype`. baseForOwn(LazyWrapper.prototype, function(func, methodName) { - var lodashFunc = lodash[methodName]; + var checkIteratee = /^(?:filter|map|reject)|While$/.test(methodName), + retUnwrapped = /^(?:first|last)$/.test(methodName), + lodashFunc = lodash[retUnwrapped ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName]; + if (!lodashFunc) { return; } - var checkIteratee = /^(?:filter|map|reject)|While$/.test(methodName), - retUnwrapped = /^(?:first|last)$/.test(methodName); - lodash.prototype[methodName] = function() { - var args = arguments, - length = args.length, + var args = retUnwrapped ? [1] : arguments, chainAll = this.__chain__, value = this.__wrapped__, isHybrid = !!this.__actions__.length, @@ -45951,28 +46595,30 @@ return jQuery; useLazy = isLazy || isArray(value); if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) { - // avoid lazy use if the iteratee has a `length` other than `1` + // Avoid lazy use if the iteratee has a "length" value other than `1`. isLazy = useLazy = false; } - var onlyLazy = isLazy && !isHybrid; - if (retUnwrapped && !chainAll) { - return onlyLazy - ? func.call(value) - : lodashFunc.call(lodash, this.value()); - } var interceptor = function(value) { - var otherArgs = [value]; - push.apply(otherArgs, args); - return lodashFunc.apply(lodash, otherArgs); + return (retUnwrapped && chainAll) + ? lodashFunc(value, 1)[0] + : lodashFunc.apply(undefined, arrayPush([value], args)); }; - if (useLazy) { - var wrapper = onlyLazy ? value : new LazyWrapper(this), - result = func.apply(wrapper, args); - if (!retUnwrapped && (isHybrid || result.__actions__)) { - var actions = result.__actions__ || (result.__actions__ = []); - actions.push({ 'func': thru, 'args': [interceptor], 'thisArg': lodash }); + var action = { 'func': thru, 'args': [interceptor], 'thisArg': undefined }, + onlyLazy = isLazy && !isHybrid; + + if (retUnwrapped && !chainAll) { + if (onlyLazy) { + value = value.clone(); + value.__actions__.push(action); + return func.call(value); } + return lodashFunc.call(undefined, this.value())[0]; + } + if (!retUnwrapped && useLazy) { + value = onlyLazy ? value : new LazyWrapper(this); + var result = func.apply(value, args); + result.__actions__.push(action); return new LodashWrapper(result, chainAll); } return this.thru(interceptor); @@ -45980,7 +46626,7 @@ return jQuery; }); // Add `Array` and `String` methods to `lodash.prototype`. - arrayEach(['concat', 'join', 'pop', 'push', 'replace', 'shift', 'sort', 'splice', 'split', 'unshift'], function(methodName) { + arrayEach(['join', 'pop', 'push', 'replace', 'shift', 'sort', 'splice', 'split', 'unshift'], function(methodName) { var func = (/^(?:replace|split)$/.test(methodName) ? stringProto : arrayProto)[methodName], chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru', retUnwrapped = /^(?:join|pop|replace|shift)$/.test(methodName); @@ -46007,7 +46653,7 @@ return jQuery; } }); - realNames[createHybridWrapper(null, BIND_KEY_FLAG).name] = [{ 'name': 'wrapper', 'func': null }]; + realNames[createHybridWrapper(undefined, BIND_KEY_FLAG).name] = [{ 'name': 'wrapper', 'func': undefined }]; // Add functions to the lazy wrapper. LazyWrapper.prototype.clone = lazyClone; @@ -46017,6 +46663,7 @@ return jQuery; // Add chaining functions to the `lodash` wrapper. lodash.prototype.chain = wrapperChain; lodash.prototype.commit = wrapperCommit; + lodash.prototype.concat = wrapperConcat; lodash.prototype.plant = wrapperPlant; lodash.prototype.reverse = wrapperReverse; lodash.prototype.toString = wrapperToString; @@ -46056,7 +46703,7 @@ return jQuery; if (moduleExports) { (freeModule.exports = _)._ = _; } - // Export for Narwhal or Rhino -require. + // Export for Rhino with CommonJS support. else { freeExports._ = _; } @@ -46068,40 +46715,46 @@ return jQuery; }.call(this)); }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + },{}],"react-router":[function(require,module,exports){ -"use strict"; +'use strict'; -exports.DefaultRoute = require("./components/DefaultRoute"); -exports.Link = require("./components/Link"); -exports.NotFoundRoute = require("./components/NotFoundRoute"); -exports.Redirect = require("./components/Redirect"); -exports.Route = require("./components/Route"); -exports.RouteHandler = require("./components/RouteHandler"); - -exports.HashLocation = require("./locations/HashLocation"); -exports.HistoryLocation = require("./locations/HistoryLocation"); -exports.RefreshLocation = require("./locations/RefreshLocation"); -exports.StaticLocation = require("./locations/StaticLocation"); -exports.TestLocation = require("./locations/TestLocation"); - -exports.ImitateBrowserBehavior = require("./behaviors/ImitateBrowserBehavior"); -exports.ScrollToTopBehavior = require("./behaviors/ScrollToTopBehavior"); - -exports.History = require("./History"); -exports.Navigation = require("./Navigation"); -exports.State = require("./State"); - -exports.createRoute = require("./Route").createRoute; -exports.createDefaultRoute = require("./Route").createDefaultRoute; -exports.createNotFoundRoute = require("./Route").createNotFoundRoute; -exports.createRedirect = require("./Route").createRedirect; -exports.createRoutesFromReactChildren = require("./createRoutesFromReactChildren"); -exports.create = require("./createRouter"); -exports.run = require("./runRouter"); -},{"./History":10,"./Navigation":12,"./Route":16,"./State":18,"./behaviors/ImitateBrowserBehavior":21,"./behaviors/ScrollToTopBehavior":22,"./components/DefaultRoute":24,"./components/Link":25,"./components/NotFoundRoute":26,"./components/Redirect":27,"./components/Route":28,"./components/RouteHandler":29,"./createRouter":30,"./createRoutesFromReactChildren":31,"./locations/HashLocation":34,"./locations/HistoryLocation":35,"./locations/RefreshLocation":36,"./locations/StaticLocation":37,"./locations/TestLocation":38,"./runRouter":39}],"react/addons":[function(require,module,exports){ +exports.DefaultRoute = require('./components/DefaultRoute'); +exports.Link = require('./components/Link'); +exports.NotFoundRoute = require('./components/NotFoundRoute'); +exports.Redirect = require('./components/Redirect'); +exports.Route = require('./components/Route'); +exports.ActiveHandler = require('./components/RouteHandler'); +exports.RouteHandler = exports.ActiveHandler; + +exports.HashLocation = require('./locations/HashLocation'); +exports.HistoryLocation = require('./locations/HistoryLocation'); +exports.RefreshLocation = require('./locations/RefreshLocation'); +exports.StaticLocation = require('./locations/StaticLocation'); +exports.TestLocation = require('./locations/TestLocation'); + +exports.ImitateBrowserBehavior = require('./behaviors/ImitateBrowserBehavior'); +exports.ScrollToTopBehavior = require('./behaviors/ScrollToTopBehavior'); + +exports.History = require('./History'); +exports.Navigation = require('./Navigation'); +exports.State = require('./State'); + +exports.createRoute = require('./Route').createRoute; +exports.createDefaultRoute = require('./Route').createDefaultRoute; +exports.createNotFoundRoute = require('./Route').createNotFoundRoute; +exports.createRedirect = require('./Route').createRedirect; +exports.createRoutesFromReactChildren = require('./createRoutesFromReactChildren'); + +exports.create = require('./createRouter'); +exports.run = require('./runRouter'); +},{"./History":5,"./Navigation":7,"./Route":11,"./State":13,"./behaviors/ImitateBrowserBehavior":16,"./behaviors/ScrollToTopBehavior":17,"./components/DefaultRoute":19,"./components/Link":20,"./components/NotFoundRoute":21,"./components/Redirect":22,"./components/Route":23,"./components/RouteHandler":24,"./createRouter":25,"./createRoutesFromReactChildren":26,"./locations/HashLocation":29,"./locations/HistoryLocation":30,"./locations/RefreshLocation":31,"./locations/StaticLocation":32,"./locations/TestLocation":33,"./runRouter":34}],"react/addons":[function(require,module,exports){ module.exports = require('./lib/ReactWithAddons'); },{"./lib/ReactWithAddons":141}],"react":[function(require,module,exports){ module.exports = require('./lib/React'); -},{"./lib/React":71}]},{},["flux","jquery","lodash","react","react-router","react/addons"]); +},{"./lib/React":71}]},{},[]) + + +//# sourceMappingURL=vendor.js.map diff --git a/web/.eslintrc b/web/.eslintrc new file mode 100644 index 00000000..df187739 --- /dev/null +++ b/web/.eslintrc @@ -0,0 +1,8 @@ +{ + "ecmaFeatures": { + "jsx": true + }, + "env": { + "es6": true + } +}
\ No newline at end of file diff --git a/web/.jshintrc b/web/.jshintrc deleted file mode 100644 index d5eae073..00000000 --- a/web/.jshintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "loopfunc": true, - "esnext": true, - "validthis": true -}
\ No newline at end of file diff --git a/web/conf.js b/web/conf.js index 69984c01..7c520973 100644 --- a/web/conf.js +++ b/web/conf.js @@ -13,21 +13,19 @@ var conf = { "react/addons" ], app: 'src/js/app.js', - jshint: ["src/js/**.js", "!src/js/filt/filt.js"] + eslint: ["src/js/**/*.js", "!src/js/filt/filt.js"] }, css: { vendor: ["src/css/vendor.less"], app: ["src/css/app.less"] }, copy: [ - "src/images/**", + "src/images/**", "src/fonts/fontawesome-webfont.*" ], templates: [ "src/templates/*" ], - fonts: ["src/fontawesome/fontawesome-webfont.*"], - peg: ["src/js/filt/filt.peg"], - connect: false + peg: ["src/js/filt/filt.peg"] }; module.exports = conf;
\ No newline at end of file diff --git a/web/gulpfile.js b/web/gulpfile.js index b05998d3..83893c91 100644 --- a/web/gulpfile.js +++ b/web/gulpfile.js @@ -4,11 +4,12 @@ var packagejs = require('./package.json'); var conf = require('./conf.js'); // Sorted alphabetically! +var babelify = require('babelify'); var browserify = require('browserify'); var gulp = require("gulp"); var concat = require('gulp-concat'); var connect = require('gulp-connect'); -var jshint = require("gulp-jshint"); +var eslint = require('gulp-eslint'); var less = require("gulp-less"); var livereload = require("gulp-livereload"); var minifyCSS = require('gulp-minify-css'); @@ -18,26 +19,16 @@ var plumber = require("gulp-plumber"); var react = require("gulp-react"); var rename = require("gulp-rename"); var replace = require('gulp-replace'); -var rev = require("gulp-rev"); var sourcemaps = require('gulp-sourcemaps'); -var uglify = require('gulp-uglify'); +var gutil = require("gulp-util"); var _ = require('lodash'); var map = require("map-stream"); var reactify = require('reactify'); +var uglifyify = require('uglifyify'); var buffer = require('vinyl-buffer'); var source = require('vinyl-source-stream'); var transform = require('vinyl-transform'); - -// FIXME: react-with-addons.min.js for prod use issue -// FIXME: Sourcemap URLs don't work correctly. -// FIXME: Why don't we use gulp-rev's manifest feature? - -var manifest = { - "vendor.css": "vendor.css", - "app.css": "app.css", - "vendor.js": "vendor.js", - "app.js": "app.js", -}; +var watchify = require('watchify'); var vendor_packages = _.difference( _.union( @@ -47,45 +38,7 @@ var vendor_packages = _.difference( conf.js.vendor_excludes ); - -// Custom linting reporter used for error notify -var jsHintErrorReporter = function(){ - return map(function (file, cb) { - if (file.jshint && !file.jshint.success) { - file.jshint.results.forEach(function (err) { - if (err) { - var msg = [ - path.basename(file.path), - 'Line: ' + err.error.line, - 'Reason: ' + err.error.reason - ]; - notify.onError( - "Error: <%= error.message %>" - )(new Error(msg.join("\n"))); - } - }); - } - cb(null, file); - }) -}; - -function save_rev(){ - return map(function(file, callback){ - if (file.revOrigBase){ - manifest[path.basename(file.revOrigPath)] = path.basename(file.path); - } - callback(null, file); - }) -} - -var dont_break_on_errors = function(){ - return plumber( - function(error){ - notify.onError("Error: <%= error.message %>").apply(this, arguments); - this.emit('end'); - } - ); -}; +var handleError = {errorHandler: notify.onError("Error: <%= error.message %>")}; /* * Sourcemaps are a wonderful way to develop directly from the chrome devtools. @@ -94,193 +47,178 @@ var dont_break_on_errors = function(){ * a single misbehaving transform breaks everything. * Thus, we just manually fix all paths. */ -//Normalize \ to / on Windows. -function unixStylePath(filePath) { - return filePath.split(path.sep).join('/'); -} -// Hijack the sourceRoot attr to do our transforms -function fixSourceMapPaths(file){ +function fixSourceMaps(file) { file.sourceMap.sources = file.sourceMap.sources.map(function (x) { - return unixStylePath(path.relative(".", x)); + return path.relative(".", x).split(path.sep).join('/'); }); return "/"; } // Browserify fails for paths starting with "..". -function fixBrowserifySourceMapPaths(file){ - file.sourceMap.sources = file.sourceMap.sources.map(function (x) { - return x.replace("src/js/node_modules","node_modules"); +function fixBrowserifySourceMaps(file) { + file.sourceMap.sources = file.sourceMap.sources.map((x) => { + return x.replace("src/js/node_modules", "node_modules"); }); - return fixSourceMapPaths(file); + return fixSourceMaps(file); +} +function fixLessSourceMaps(file) { + file.sourceMap.sources = file.sourceMap.sources.map((x) => { + if(!x.startsWith("..")){ + return "../src/css/" + x; + } + return x.replace("src/js/node_modules", "node_modules"); + }); + return fixSourceMaps(file); } -gulp.task("fonts", function () { - return gulp.src(conf.fonts) - .pipe(gulp.dest(conf.static + "/fonts")) -}); - -function styles_dev(files) { - return (gulp.src(files) - .pipe(dont_break_on_errors()) +function styles(files, dev){ + return gulp.src(files) + .pipe(dev ? plumber(handleError) : gutil.noop()) .pipe(sourcemaps.init()) .pipe(less()) - .pipe(sourcemaps.write(".", {sourceRoot: fixSourceMapPaths})) + .pipe(dev ? gutil.noop() : minifyCSS()) + .pipe(sourcemaps.write(".", {sourceRoot: fixLessSourceMaps})) .pipe(gulp.dest(conf.static)) - .pipe(livereload({ auto: false }))); + .pipe(livereload({auto: false})); } -gulp.task("styles-app-dev", function(){ - styles_dev(conf.css.app); +gulp.task("styles-app-dev", function () { + styles(conf.css.app, true); }); -gulp.task("styles-vendor-dev", function(){ - styles_dev(conf.css.vendor); +gulp.task("styles-vendor-dev", function () { + styles(conf.css.vendor, true); }); - - -function styles_prod(files) { - return (gulp.src(files) - .pipe(less()) - .pipe(minifyCSS()) - .pipe(rev()) - .pipe(save_rev()) - .pipe(gulp.dest(conf.static)) - .pipe(livereload({ auto: false }))); -} -gulp.task("styles-app-prod", function(){ - styles_prod(conf.css.app); +gulp.task("styles-app-prod", function () { + styles(conf.css.app, false); }); -gulp.task("styles-vendor-prod", function(){ - styles_prod(conf.css.vendor); +gulp.task("styles-vendor-prod", function () { + styles(conf.css.app, false); }); -function vendor_stream(debug){ - var vendor = browserify(vendor_packages, {debug: debug}); - _.each(vendor_packages, function(v){ - vendor.require(v); +function buildScript(bundler, filename, dev) { + if (dev) { + bundler = watchify(bundler); + } else { + bundler = bundler.transform({global: true}, uglifyify); + } + + function rebundle() { + return bundler.bundle() + .pipe(dev ? plumber(handleError) : gutil.noop()) + .pipe(source('bundle.js')) + .pipe(buffer()) + .pipe(sourcemaps.init({loadMaps: true})) + .pipe(rename(filename)) + .pipe(sourcemaps.write('.', {sourceRoot: fixBrowserifySourceMaps})) + .pipe(gulp.dest(conf.static)) + .pipe(livereload({auto: false})); + } + + // listen for an update and run rebundle + bundler.on('update', rebundle); + bundler.on('log', gutil.log); + + // run it once the first time buildScript is called + return rebundle(); +} + +function vendor_stream(dev) { + var bundler = browserify({ + entries: [], + debug: true, + cache: {}, // required for watchify + packageCache: {} // required for watchify }); - return vendor.bundle() - .pipe(source("dummy.js")) - .pipe(rename("vendor.js")); + for (var vp of vendor_packages) { + bundler.require(vp); + } + return buildScript(bundler, "vendor.js", dev); } -gulp.task("scripts-vendor-dev", function (){ - return vendor_stream(false) - .pipe(gulp.dest(conf.static)); +gulp.task("scripts-vendor-dev", function () { + return vendor_stream(true); }); -gulp.task("scripts-vendor-prod", function(){ - return vendor_stream(false) - .pipe(buffer()) - .pipe(uglify()) - .pipe(rev()) - .pipe(save_rev()) - .pipe(gulp.dest(conf.static)); +gulp.task("scripts-vendor-prod", function () { + return vendor_stream(false); }); - -function app_stream(debug) { - var browserified = transform(function(filename) { - var b = browserify(filename, {debug: debug}); - _.each(vendor_packages, function(v){ - b.external(v); - }); - b.transform(reactify); - return b.bundle(); +function app_stream(dev) { + var bundler = browserify({ + entries: [conf.js.app], + debug: true, + cache: {}, // required for watchify + packageCache: {} // required for watchify }); - - return gulp.src([conf.js.app], {base: "."}) - .pipe(dont_break_on_errors()) - .pipe(browserified) - .pipe(sourcemaps.init({ loadMaps: true })) - .pipe(rename("app.js")); + for (var vp of vendor_packages) { + bundler.external(vp); + } + bundler = bundler.transform(babelify).transform(reactify); + return buildScript(bundler, "app.js", dev); } - gulp.task('scripts-app-dev', function () { - return app_stream(true) - .pipe(sourcemaps.write('./', {sourceRoot: fixBrowserifySourceMapPaths})) - .pipe(gulp.dest(conf.static)) - .pipe(livereload({ auto: false })); + return app_stream(true); }); - gulp.task('scripts-app-prod', function () { - return app_stream(true) - .pipe(buffer()) - .pipe(uglify()) - .pipe(rev()) - .pipe(sourcemaps.write('./', {sourceRoot: fixBrowserifySourceMapPaths})) - .pipe(save_rev()) - .pipe(gulp.dest(conf.static)); + return app_stream(false); }); -gulp.task("jshint", function () { - return gulp.src(conf.js.jshint) - .pipe(dont_break_on_errors()) - .pipe(react()) - .pipe(jshint()) - .pipe(jshint.reporter("jshint-stylish")) - .pipe(jsHintErrorReporter()); +gulp.task("eslint", function () { + return gulp.src(conf.js.eslint) + .pipe(plumber(handleError)) + .pipe(eslint()) + .pipe(eslint.format()) }); -gulp.task("copy", function(){ +gulp.task("copy", function () { return gulp.src(conf.copy, {base: conf.src}) .pipe(gulp.dest(conf.static)); }); -function templates(){ + +gulp.task('templates', function(){ return gulp.src(conf.templates, {base: conf.src}) - .pipe(replace(/\{\{\{(\S*)\}\}\}/g, function(match, p1) { - return manifest[p1]; - })) .pipe(gulp.dest(conf.dist)); -} -gulp.task('templates', templates); +}); gulp.task("peg", function () { return gulp.src(conf.peg, {base: conf.src}) - .pipe(dont_break_on_errors()) + .pipe(plumber(handleError)) .pipe(peg()) .pipe(gulp.dest("src/")); }); -gulp.task('connect', function() { - if(conf.connect){ - connect.server({ - port: conf.connect.port - }); - } -}); - gulp.task( "dev", [ - "fonts", "copy", "styles-vendor-dev", "styles-app-dev", "scripts-vendor-dev", "peg", "scripts-app-dev", - ], - templates + "templates" + ] ); gulp.task( "prod", [ - "fonts", "copy", "styles-vendor-prod", "styles-app-prod", "scripts-vendor-prod", "peg", "scripts-app-prod", - ], - templates + "templates" + ] ); -gulp.task("default", ["dev", "connect"], function () { +gulp.task("default", ["dev"], function () { livereload.listen({auto: true}); gulp.watch(["src/css/vendor*"], ["styles-vendor-dev"]); - gulp.watch(conf.peg, ["peg", "scripts-app-dev"]); - gulp.watch(["src/js/**"], ["scripts-app-dev", "jshint"]); gulp.watch(["src/css/**"], ["styles-app-dev"]); + gulp.watch(conf.templates, ["templates"]); + gulp.watch(conf.peg, ["peg"]); + gulp.watch(["src/js/**"], ["eslint"]); + // other JS is handled by watchify. gulp.watch(conf.copy, ["copy"]); }); diff --git a/web/package.json b/web/package.json index e55081a3..5bcbdd87 100644 --- a/web/package.json +++ b/web/package.json @@ -16,37 +16,40 @@ }, "dependencies": { "bootstrap": "^3.3.4", - "flux": "", - "jquery": "", - "lodash": "", - "react": "^0.13.1", + "flux": "^2.1.1", + "jquery": "^2.1.4", + "lodash": "^3.10.1", + "react": "^0.13.3", "react-router": "^0.13.2" }, "devDependencies": { - "browserify": "=8.0.1", - "gulp": "", - "gulp-concat": "", - "gulp-connect": "", - "gulp-jshint": "", - "gulp-less": "", - "gulp-livereload": "", - "gulp-minify-css": "", - "gulp-notify": "", - "gulp-peg": "", - "gulp-plumber": "", - "gulp-react": "", - "gulp-rename": "", - "gulp-replace": "", - "gulp-rev": "", - "gulp-sourcemaps": "", - "gulp-uglify": "", - "jest-cli": "^0.1.18", - "jshint-stylish": "", - "lodash": "", - "map-stream": "", - "reactify": "", - "vinyl-buffer": "", - "vinyl-source-stream": "", - "vinyl-transform": "" + "babelify": "^6.3.0", + "browserify": "^11.2.0", + "eslint": "^1.5.1", + "gulp": "^3.9.0", + "gulp-concat": "^2.6.0", + "gulp-connect": "^2.2.0", + "gulp-eslint": "^1.0.0", + "gulp-jshint": "^1.11.2", + "gulp-less": "^3.0.3", + "gulp-livereload": "^3.8.1", + "gulp-minify-css": "^1.2.1", + "gulp-notify": "^2.2.0", + "gulp-peg": "^0.1.2", + "gulp-plumber": "^1.0.1", + "gulp-react": "^3.0.1", + "gulp-rename": "^1.2.2", + "gulp-replace": "^0.5.4", + "gulp-sourcemaps": "^1.6.0", + "gulp-uglify": "^1.4.1", + "gulp-util": "^3.0.6", + "lodash": "^3.10.1", + "map-stream": "0.0.6", + "reactify": "^1.1.1", + "uglifyify": "^3.0.1", + "vinyl-buffer": "^1.0.0", + "vinyl-source-stream": "^1.1.0", + "vinyl-transform": "^1.0.0", + "watchify": "^3.4.0" } } diff --git a/web/src/css/vendor.less b/web/src/css/vendor.less index 13c72299..e91ae3a8 100644 --- a/web/src/css/vendor.less +++ b/web/src/css/vendor.less @@ -1,3 +1,3 @@ // Bootstrap @import 'vendor-bootstrap.less'; -@import (less) '../fontawesome/font-awesome.css'; +@import (less) '../fonts/font-awesome.css'; diff --git a/web/src/fontawesome/FontAwesome.otf b/web/src/fonts/FontAwesome.otf Binary files differindex 81c9ad94..81c9ad94 100644 --- a/web/src/fontawesome/FontAwesome.otf +++ b/web/src/fonts/FontAwesome.otf diff --git a/web/src/fontawesome/README b/web/src/fonts/README index 218a78e1..218a78e1 100644 --- a/web/src/fontawesome/README +++ b/web/src/fonts/README diff --git a/web/src/fontawesome/font-awesome.css b/web/src/fonts/font-awesome.css index 9eb5d5b7..9eb5d5b7 100644 --- a/web/src/fontawesome/font-awesome.css +++ b/web/src/fonts/font-awesome.css diff --git a/web/src/fontawesome/fontawesome-webfont.eot b/web/src/fonts/fontawesome-webfont.eot Binary files differindex 84677bc0..84677bc0 100644 --- a/web/src/fontawesome/fontawesome-webfont.eot +++ b/web/src/fonts/fontawesome-webfont.eot diff --git a/web/src/fontawesome/fontawesome-webfont.svg b/web/src/fonts/fontawesome-webfont.svg index d907b25a..d907b25a 100644 --- a/web/src/fontawesome/fontawesome-webfont.svg +++ b/web/src/fonts/fontawesome-webfont.svg diff --git a/web/src/fontawesome/fontawesome-webfont.ttf b/web/src/fonts/fontawesome-webfont.ttf Binary files differindex 96a3639c..96a3639c 100644 --- a/web/src/fontawesome/fontawesome-webfont.ttf +++ b/web/src/fonts/fontawesome-webfont.ttf diff --git a/web/src/fontawesome/fontawesome-webfont.woff b/web/src/fonts/fontawesome-webfont.woff Binary files differindex 628b6a52..628b6a52 100644 --- a/web/src/fontawesome/fontawesome-webfont.woff +++ b/web/src/fonts/fontawesome-webfont.woff diff --git a/web/src/js/components/eventlog.js b/web/src/js/components/eventlog.js index 4c6dafb1..fea7b247 100644 --- a/web/src/js/components/eventlog.js +++ b/web/src/js/components/eventlog.js @@ -108,6 +108,7 @@ var ToggleFilter = React.createClass({ }); var EventLog = React.createClass({ + mixins: [common.Navigation], getInitialState: function () { return { filter: { diff --git a/web/src/js/filt/filt.js b/web/src/js/filt/filt.js index 02a04c66..45b42f3a 100644 --- a/web/src/js/filt/filt.js +++ b/web/src/js/filt/filt.js @@ -1771,4 +1771,4 @@ module.exports = (function() { SyntaxError: SyntaxError, parse: parse }; -})(); +})();
\ No newline at end of file |