aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mitmproxy/addons/core.py8
-rw-r--r--mitmproxy/addons/onboardingapp/templates/index.html2
-rw-r--r--mitmproxy/addons/view.py2
-rw-r--r--mitmproxy/command.py11
-rw-r--r--mitmproxy/contrib/kaitaistruct/tls_client_hello.py9
-rw-r--r--mitmproxy/contrib/tls_client_hello.ksy7
-rw-r--r--mitmproxy/options.py2
-rw-r--r--mitmproxy/optmanager.py2
-rw-r--r--mitmproxy/proxy/protocol/tls.py4
-rw-r--r--mitmproxy/tools/console/commands.py10
-rw-r--r--mitmproxy/tools/console/consoleaddons.py500
-rw-r--r--mitmproxy/tools/console/defaultkeys.py67
-rw-r--r--mitmproxy/tools/console/flowlist.py2
-rw-r--r--mitmproxy/tools/console/keybindings.py159
-rw-r--r--mitmproxy/tools/console/keymap.py108
-rw-r--r--mitmproxy/tools/console/master.py425
-rw-r--r--mitmproxy/tools/console/signals.py3
-rw-r--r--mitmproxy/tools/console/window.py2
-rw-r--r--mitmproxy/websocket.py6
-rw-r--r--release/windows-store-experiment/AppxManifest.xml16
-rw-r--r--release/windows-store-experiment/Assets/logo.150x150.pngbin18351 -> 37556 bytes
-rw-r--r--release/windows-store-experiment/Assets/logo.44x44.pngbin4156 -> 8859 bytes
-rw-r--r--release/windows-store-experiment/Assets/logo.50x50.pngbin0 -> 10440 bytes
-rw-r--r--test/mitmproxy/addons/test_view.py10
-rw-r--r--test/mitmproxy/proxy/protocol/test_http1.py37
-rw-r--r--test/mitmproxy/test_command.py2
-rw-r--r--test/mitmproxy/test_optmanager.py4
-rw-r--r--test/mitmproxy/tools/console/test_keymap.py40
-rw-r--r--web/.eslintrc.yml5
-rw-r--r--web/package.json36
-rw-r--r--web/src/js/__tests__/components/FlowView/ToggleEditSpec.js3
-rw-r--r--web/src/js/__tests__/ducks/ui/flowSpec.js12
-rw-r--r--web/src/js/app.jsx4
-rw-r--r--web/src/js/components/ContentView.jsx13
-rw-r--r--web/src/js/components/ContentView/ContentLoader.jsx2
-rw-r--r--web/src/js/components/ContentView/ContentViews.jsx6
-rw-r--r--web/src/js/ducks/ui/flow.js5
-rw-r--r--web/yarn.lock1394
38 files changed, 1830 insertions, 1088 deletions
diff --git a/mitmproxy/addons/core.py b/mitmproxy/addons/core.py
index 426c47ad..b0d8ee27 100644
--- a/mitmproxy/addons/core.py
+++ b/mitmproxy/addons/core.py
@@ -10,15 +10,17 @@ from mitmproxy.net.http import status_codes
class Core:
@command.command("set")
- def set(self, spec: str) -> None:
+ def set(self, *spec: str) -> None:
"""
Set an option of the form "key[=value]". When the value is omitted,
booleans are set to true, strings and integers are set to None (if
permitted), and sequences are emptied. Boolean values can be true,
- false or toggle.
+ false or toggle. If multiple specs are passed, they are joined
+ into one separated by spaces.
"""
+ strspec = " ".join(spec)
try:
- ctx.options.set(spec)
+ ctx.options.set(strspec)
except exceptions.OptionsError as e:
raise exceptions.CommandError(e) from e
diff --git a/mitmproxy/addons/onboardingapp/templates/index.html b/mitmproxy/addons/onboardingapp/templates/index.html
index c8d0f07a..fc6213ea 100644
--- a/mitmproxy/addons/onboardingapp/templates/index.html
+++ b/mitmproxy/addons/onboardingapp/templates/index.html
@@ -55,7 +55,7 @@ function changeTo(device) {
</script>
<center>
-<h2> Click to install the mitmproxy certificate: </h2>
+<h2> Click to install your mitmproxy certificate: </h2>
</center>
<div id="certbank" class="row">
<div class="col-md-3">
diff --git a/mitmproxy/addons/view.py b/mitmproxy/addons/view.py
index aa3e11ed..d4319468 100644
--- a/mitmproxy/addons/view.py
+++ b/mitmproxy/addons/view.py
@@ -389,6 +389,8 @@ class View(collections.Sequence):
self.sig_view_remove.send(self, flow=f)
del self._store[f.id]
self.sig_store_remove.send(self, flow=f)
+ if len(flows) > 1:
+ ctx.log.alert("Removed %s flows" % len(flows))
@command.command("view.resolve")
def resolve(self, spec: str) -> typing.Sequence[mitmproxy.flow.Flow]:
diff --git a/mitmproxy/command.py b/mitmproxy/command.py
index 82b8fae4..c9776bc3 100644
--- a/mitmproxy/command.py
+++ b/mitmproxy/command.py
@@ -59,7 +59,7 @@ class Command:
def paramnames(self) -> typing.Sequence[str]:
v = [typename(i, False) for i in self.paramtypes]
if self.has_positional:
- v[-1] = "*" + v[-1][1:-1]
+ v[-1] = "*" + v[-1]
return v
def retname(self) -> str:
@@ -74,7 +74,8 @@ class Command:
def call(self, args: typing.Sequence[str]):
"""
- Call the command with a set of arguments. At this point, all argumets are strings.
+ Call the command with a list of arguments. At this point, all
+ arguments are strings.
"""
if not self.has_positional and (len(self.paramtypes) != len(args)):
raise exceptions.CommandError("Usage: %s" % self.signature_help())
@@ -92,7 +93,11 @@ class Command:
pargs.append(parsearg(self.manager, args[i], self.paramtypes[i]))
if remainder:
- if typecheck.check_command_type(remainder, self.paramtypes[-1]):
+ chk = typecheck.check_command_type(
+ remainder,
+ typing.Sequence[self.paramtypes[-1]] # type: ignore
+ )
+ if chk:
pargs.extend(remainder)
else:
raise exceptions.CommandError("Invalid value type.")
diff --git a/mitmproxy/contrib/kaitaistruct/tls_client_hello.py b/mitmproxy/contrib/kaitaistruct/tls_client_hello.py
index 6aff9b14..10e5367f 100644
--- a/mitmproxy/contrib/kaitaistruct/tls_client_hello.py
+++ b/mitmproxy/contrib/kaitaistruct/tls_client_hello.py
@@ -73,7 +73,7 @@ class TlsClientHello(KaitaiStruct):
self.len = self._io.read_u2be()
self.cipher_suites = [None] * (self.len // 2)
for i in range(self.len // 2):
- self.cipher_suites[i] = self._root.CipherSuite(self._io, self, self._root)
+ self.cipher_suites[i] = self._io.read_u2be()
class CompressionMethods(KaitaiStruct):
def __init__(self, _io, _parent=None, _root=None):
@@ -111,13 +111,6 @@ class TlsClientHello(KaitaiStruct):
self.major = self._io.read_u1()
self.minor = self._io.read_u1()
- class CipherSuite(KaitaiStruct):
- def __init__(self, _io, _parent=None, _root=None):
- self._io = _io
- self._parent = _parent
- self._root = _root if _root else self
- self.cipher_suite = self._io.read_u2be()
-
class Protocol(KaitaiStruct):
def __init__(self, _io, _parent=None, _root=None):
self._io = _io
diff --git a/mitmproxy/contrib/tls_client_hello.ksy b/mitmproxy/contrib/tls_client_hello.ksy
index 5b6eb0fb..921c11b5 100644
--- a/mitmproxy/contrib/tls_client_hello.ksy
+++ b/mitmproxy/contrib/tls_client_hello.ksy
@@ -59,14 +59,9 @@ types:
type: u2
- id: cipher_suites
- type: cipher_suite
+ type: u2
repeat: expr
repeat-expr: len/2
-
- cipher_suite:
- seq:
- - id: cipher_suite
- type: u2
compression_methods:
seq:
diff --git a/mitmproxy/options.py b/mitmproxy/options.py
index db276a51..a3872679 100644
--- a/mitmproxy/options.py
+++ b/mitmproxy/options.py
@@ -394,7 +394,7 @@ class Options(optmanager.OptManager):
"Focus follows new flows."
)
self.add_option(
- "console_palette", str, "dark",
+ "console_palette", str, "solarized_dark",
"Color palette.",
choices=sorted(console_palettes),
)
diff --git a/mitmproxy/optmanager.py b/mitmproxy/optmanager.py
index ed1310aa..68c2f975 100644
--- a/mitmproxy/optmanager.py
+++ b/mitmproxy/optmanager.py
@@ -447,6 +447,8 @@ def parse(text):
raise exceptions.OptionsError("Could not parse options.")
if isinstance(data, str):
raise exceptions.OptionsError("Config error - no keys found.")
+ elif data is None:
+ return {}
return data
diff --git a/mitmproxy/proxy/protocol/tls.py b/mitmproxy/proxy/protocol/tls.py
index d42c7fdd..b7bc6b1c 100644
--- a/mitmproxy/proxy/protocol/tls.py
+++ b/mitmproxy/proxy/protocol/tls.py
@@ -539,8 +539,8 @@ class TlsLayer(base.Layer):
if not ciphers_server and self._client_tls:
ciphers_server = []
for id in self._client_hello.cipher_suites:
- if id.cipher_suite in CIPHER_ID_NAME_MAP.keys():
- ciphers_server.append(CIPHER_ID_NAME_MAP[id.cipher_suite])
+ if id in CIPHER_ID_NAME_MAP.keys():
+ ciphers_server.append(CIPHER_ID_NAME_MAP[id])
ciphers_server = ':'.join(ciphers_server)
self.server_conn.establish_ssl(
diff --git a/mitmproxy/tools/console/commands.py b/mitmproxy/tools/console/commands.py
index e4535314..20efcee3 100644
--- a/mitmproxy/tools/console/commands.py
+++ b/mitmproxy/tools/console/commands.py
@@ -6,16 +6,6 @@ from mitmproxy.tools.console import signals
HELP_HEIGHT = 5
-
-def fcol(s, width, attr):
- s = str(s)
- return (
- "fixed",
- width,
- urwid.Text((attr, s))
- )
-
-
command_focus_change = blinker.Signal()
diff --git a/mitmproxy/tools/console/consoleaddons.py b/mitmproxy/tools/console/consoleaddons.py
new file mode 100644
index 00000000..a65f0afe
--- /dev/null
+++ b/mitmproxy/tools/console/consoleaddons.py
@@ -0,0 +1,500 @@
+import typing
+
+from mitmproxy import ctx
+from mitmproxy import command
+from mitmproxy import exceptions
+from mitmproxy import flow
+from mitmproxy import contentviews
+from mitmproxy.utils import strutils
+
+from mitmproxy.tools.console import overlay
+from mitmproxy.tools.console import signals
+from mitmproxy.tools.console import keymap
+
+
+class Logger:
+ def log(self, evt):
+ signals.add_log(evt.msg, evt.level)
+ if evt.level == "alert":
+ signals.status_message.send(
+ message=str(evt.msg),
+ expire=2
+ )
+
+
+class UnsupportedLog:
+ """
+ A small addon to dump info on flow types we don't support yet.
+ """
+ def websocket_message(self, f):
+ message = f.messages[-1]
+ signals.add_log(f.message_info(message), "info")
+ signals.add_log(strutils.bytes_to_escaped_str(message.content), "debug")
+
+ def websocket_end(self, f):
+ signals.add_log("WebSocket connection closed by {}: {} {}, {}".format(
+ f.close_sender,
+ f.close_code,
+ f.close_message,
+ f.close_reason), "info")
+
+ def tcp_message(self, f):
+ message = f.messages[-1]
+ direction = "->" if message.from_client else "<-"
+ signals.add_log("{client_host}:{client_port} {direction} tcp {direction} {server_host}:{server_port}".format(
+ client_host=f.client_conn.address[0],
+ client_port=f.client_conn.address[1],
+ server_host=f.server_conn.address[0],
+ server_port=f.server_conn.address[1],
+ direction=direction,
+ ), "info")
+ signals.add_log(strutils.bytes_to_escaped_str(message.content), "debug")
+
+
+class ConsoleAddon:
+ """
+ An addon that exposes console-specific commands, and hooks into required
+ events.
+ """
+ def __init__(self, master):
+ self.master = master
+ self.started = False
+
+ @command.command("console.layout.options")
+ def layout_options(self) -> typing.Sequence[str]:
+ """
+ Returns the valid options for console layout. Use these by setting
+ the console_layout option.
+ """
+ return ["single", "vertical", "horizontal"]
+
+ @command.command("console.layout.cycle")
+ def layout_cycle(self) -> None:
+ """
+ Cycle through the console layout options.
+ """
+ opts = self.layout_options()
+ off = self.layout_options().index(ctx.options.console_layout)
+ ctx.options.update(
+ console_layout = opts[(off + 1) % len(opts)]
+ )
+
+ @command.command("console.panes.next")
+ def panes_next(self) -> None:
+ """
+ Go to the next layout pane.
+ """
+ self.master.window.switch()
+
+ @command.command("console.options.reset.focus")
+ def options_reset_current(self) -> None:
+ """
+ Reset the current option in the options editor.
+ """
+ fv = self.master.window.current("options")
+ if not fv:
+ raise exceptions.CommandError("Not viewing options.")
+ self.master.commands.call("options.reset.one %s" % fv.current_name())
+
+ @command.command("console.nav.start")
+ def nav_start(self) -> None:
+ """
+ Go to the start of a list or scrollable.
+ """
+ self.master.inject_key("m_start")
+
+ @command.command("console.nav.end")
+ def nav_end(self) -> None:
+ """
+ Go to the end of a list or scrollable.
+ """
+ self.master.inject_key("m_end")
+
+ @command.command("console.nav.next")
+ def nav_next(self) -> None:
+ """
+ Go to the next navigatable item.
+ """
+ self.master.inject_key("m_next")
+
+ @command.command("console.nav.select")
+ def nav_select(self) -> None:
+ """
+ Select a navigable item for viewing or editing.
+ """
+ self.master.inject_key("m_select")
+
+ @command.command("console.nav.up")
+ def nav_up(self) -> None:
+ """
+ Go up.
+ """
+ self.master.inject_key("up")
+
+ @command.command("console.nav.down")
+ def nav_down(self) -> None:
+ """
+ Go down.
+ """
+ self.master.inject_key("down")
+
+ @command.command("console.nav.pageup")
+ def nav_pageup(self) -> None:
+ """
+ Go up.
+ """
+ self.master.inject_key("page up")
+
+ @command.command("console.nav.pagedown")
+ def nav_pagedown(self) -> None:
+ """
+ Go down.
+ """
+ self.master.inject_key("page down")
+
+ @command.command("console.nav.left")
+ def nav_left(self) -> None:
+ """
+ Go left.
+ """
+ self.master.inject_key("left")
+
+ @command.command("console.nav.right")
+ def nav_right(self) -> None:
+ """
+ Go right.
+ """
+ self.master.inject_key("right")
+
+ @command.command("console.choose")
+ def console_choose(
+ self, prompt: str, choices: typing.Sequence[str], *cmd: str
+ ) -> None:
+ """
+ Prompt the user to choose from a specified list of strings, then
+ invoke another command with all occurances of {choice} replaced by
+ the choice the user made.
+ """
+ def callback(opt):
+ # We're now outside of the call context...
+ repl = " ".join(cmd)
+ repl = repl.replace("{choice}", opt)
+ try:
+ self.master.commands.call(repl)
+ except exceptions.CommandError as e:
+ signals.status_message.send(message=str(e))
+
+ self.master.overlay(
+ overlay.Chooser(self.master, prompt, choices, "", callback)
+ )
+
+ @command.command("console.choose.cmd")
+ def console_choose_cmd(
+ self, prompt: str, choicecmd: str, *cmd: str
+ ) -> None:
+ """
+ Prompt the user to choose from a list of strings returned by a
+ command, then invoke another command with all occurances of {choice}
+ replaced by the choice the user made.
+ """
+ choices = ctx.master.commands.call_args(choicecmd, [])
+
+ def callback(opt):
+ # We're now outside of the call context...
+ repl = " ".join(cmd)
+ repl = repl.replace("{choice}", opt)
+ try:
+ self.master.commands.call(repl)
+ except exceptions.CommandError as e:
+ signals.status_message.send(message=str(e))
+
+ self.master.overlay(
+ overlay.Chooser(self.master, prompt, choices, "", callback)
+ )
+
+ @command.command("console.command")
+ def console_command(self, *partial: str) -> None:
+ """
+ Prompt the user to edit a command with a (possilby empty) starting value.
+ """
+ signals.status_prompt_command.send(partial=" ".join(partial)) # type: ignore
+
+ @command.command("console.view.keybindings")
+ def view_keybindings(self) -> None:
+ """View the commands list."""
+ self.master.switch_view("keybindings")
+
+ @command.command("console.view.commands")
+ def view_commands(self) -> None:
+ """View the commands list."""
+ self.master.switch_view("commands")
+
+ @command.command("console.view.options")
+ def view_options(self) -> None:
+ """View the options editor."""
+ self.master.switch_view("options")
+
+ @command.command("console.view.eventlog")
+ def view_eventlog(self) -> None:
+ """View the options editor."""
+ self.master.switch_view("eventlog")
+
+ @command.command("console.view.help")
+ def view_help(self) -> None:
+ """View help."""
+ self.master.switch_view("help")
+
+ @command.command("console.view.flow")
+ def view_flow(self, flow: flow.Flow) -> None:
+ """View a flow."""
+ if hasattr(flow, "request"):
+ # FIME: Also set focus?
+ self.master.switch_view("flowview")
+
+ @command.command("console.exit")
+ def exit(self) -> None:
+ """Exit mitmproxy."""
+ self.master.shutdown()
+
+ @command.command("console.view.pop")
+ def view_pop(self) -> None:
+ """
+ Pop a view off the console stack. At the top level, this prompts the
+ user to exit mitmproxy.
+ """
+ signals.pop_view_state.send(self)
+
+ @command.command("console.bodyview")
+ def bodyview(self, f: flow.Flow, part: str) -> None:
+ """
+ Spawn an external viewer for a flow request or response body based
+ on the detected MIME type. We use the mailcap system to find the
+ correct viewier, and fall back to the programs in $PAGER or $EDITOR
+ if necessary.
+ """
+ fpart = getattr(f, part)
+ if not fpart:
+ raise exceptions.CommandError("Could not view part %s." % part)
+ t = fpart.headers.get("content-type")
+ content = fpart.get_content(strict=False)
+ if not content:
+ raise exceptions.CommandError("No content to view.")
+ self.master.spawn_external_viewer(content, t)
+
+ @command.command("console.edit.focus.options")
+ def edit_focus_options(self) -> typing.Sequence[str]:
+ return [
+ "cookies",
+ "form",
+ "path",
+ "method",
+ "query",
+ "reason",
+ "request-headers",
+ "response-headers",
+ "status_code",
+ "set-cookies",
+ "url",
+ ]
+
+ @command.command("console.edit.focus")
+ def edit_focus(self, part: str) -> None:
+ """
+ Edit the query of the current focus.
+ """
+ if part == "cookies":
+ self.master.switch_view("edit_focus_cookies")
+ elif part == "form":
+ self.master.switch_view("edit_focus_form")
+ elif part == "path":
+ self.master.switch_view("edit_focus_path")
+ elif part == "query":
+ self.master.switch_view("edit_focus_query")
+ elif part == "request-headers":
+ self.master.switch_view("edit_focus_request_headers")
+ elif part == "response-headers":
+ self.master.switch_view("edit_focus_response_headers")
+ elif part == "set-cookies":
+ self.master.switch_view("edit_focus_setcookies")
+ elif part in ["url", "method", "status_code", "reason"]:
+ self.master.commands.call(
+ "console.command flow.set @focus %s " % part
+ )
+
+ def _grideditor(self):
+ gewidget = self.master.window.current("grideditor")
+ if not gewidget:
+ raise exceptions.CommandError("Not in a grideditor.")
+ return gewidget.key_responder()
+
+ @command.command("console.grideditor.add")
+ def grideditor_add(self) -> None:
+ """
+ Add a row after the cursor.
+ """
+ self._grideditor().cmd_add()
+
+ @command.command("console.grideditor.insert")
+ def grideditor_insert(self) -> None:
+ """
+ Insert a row before the cursor.
+ """
+ self._grideditor().cmd_insert()
+
+ @command.command("console.grideditor.delete")
+ def grideditor_delete(self) -> None:
+ """
+ Delete row
+ """
+ self._grideditor().cmd_delete()
+
+ @command.command("console.grideditor.readfile")
+ def grideditor_readfile(self, path: str) -> None:
+ """
+ Read a file into the currrent cell.
+ """
+ self._grideditor().cmd_read_file(path)
+
+ @command.command("console.grideditor.readfile_escaped")
+ def grideditor_readfile_escaped(self, path: str) -> None:
+ """
+ Read a file containing a Python-style escaped stringinto the
+ currrent cell.
+ """
+ self._grideditor().cmd_read_file_escaped(path)
+
+ @command.command("console.grideditor.editor")
+ def grideditor_editor(self) -> None:
+ """
+ Spawn an external editor on the current cell.
+ """
+ self._grideditor().cmd_spawn_editor()
+
+ @command.command("console.flowview.mode.set")
+ def flowview_mode_set(self) -> None:
+ """
+ Set the display mode for the current flow view.
+ """
+ fv = self.master.window.current("flowview")
+ if not fv:
+ raise exceptions.CommandError("Not viewing a flow.")
+ idx = fv.body.tab_offset
+
+ def callback(opt):
+ try:
+ self.master.commands.call_args(
+ "view.setval",
+ ["@focus", "flowview_mode_%s" % idx, opt]
+ )
+ except exceptions.CommandError as e:
+ signals.status_message.send(message=str(e))
+
+ opts = [i.name.lower() for i in contentviews.views]
+ self.master.overlay(overlay.Chooser(self.master, "Mode", opts, "", callback))
+
+ @command.command("console.flowview.mode")
+ def flowview_mode(self) -> str:
+ """
+ Get the display mode for the current flow view.
+ """
+ fv = self.master.window.current_window("flowview")
+ if not fv:
+ raise exceptions.CommandError("Not viewing a flow.")
+ idx = fv.body.tab_offset
+ return self.master.commands.call_args(
+ "view.getval",
+ [
+ "@focus",
+ "flowview_mode_%s" % idx,
+ self.master.options.default_contentview,
+ ]
+ )
+
+ @command.command("console.eventlog.clear")
+ def eventlog_clear(self) -> None:
+ """
+ Clear the event log.
+ """
+ signals.sig_clear_log.send(self)
+
+ @command.command("console.key.contexts")
+ def key_contexts(self) -> typing.Sequence[str]:
+ """
+ The available contexts for key binding.
+ """
+ return list(sorted(keymap.Contexts))
+
+ @command.command("console.key.bind")
+ def key_bind(self, contexts: typing.Sequence[str], key: str, *command: str) -> None:
+ """
+ Bind a shortcut key.
+ """
+ try:
+ self.master.keymap.add(
+ key,
+ " ".join(command),
+ contexts,
+ ""
+ )
+ except ValueError as v:
+ raise exceptions.CommandError(v)
+
+ @command.command("console.key.unbind")
+ def key_unbind(self, contexts: typing.Sequence[str], key: str) -> None:
+ """
+ Un-bind a shortcut key.
+ """
+ try:
+ self.master.keymap.remove(key, contexts)
+ except ValueError as v:
+ raise exceptions.CommandError(v)
+
+ def _keyfocus(self):
+ kwidget = self.master.window.current("keybindings")
+ if not kwidget:
+ raise exceptions.CommandError("Not viewing key bindings.")
+ f = kwidget.focus()
+ if not f:
+ raise exceptions.CommandError("No key binding focused")
+ return f
+
+ @command.command("console.key.unbind.focus")
+ def key_unbind_focus(self) -> None:
+ """
+ Un-bind the shortcut key currently focused in the key binding viewer.
+ """
+ b = self._keyfocus()
+ try:
+ self.master.keymap.remove(b.key, b.contexts)
+ except ValueError as v:
+ raise exceptions.CommandError(v)
+
+ @command.command("console.key.execute.focus")
+ def key_execute_focus(self) -> None:
+ """
+ Execute the currently focused key binding.
+ """
+ b = self._keyfocus()
+ self.console_command(b.command)
+
+ @command.command("console.key.edit.focus")
+ def key_edit_focus(self) -> None:
+ """
+ Execute the currently focused key binding.
+ """
+ b = self._keyfocus()
+ self.console_command(
+ "console.key.bind",
+ ",".join(b.contexts),
+ b.key,
+ b.command,
+ )
+
+ def running(self):
+ self.started = True
+
+ def update(self, flows):
+ if not flows:
+ signals.update_settings.send(self)
+ for f in flows:
+ signals.flow_change.send(self, flow=f)
diff --git a/mitmproxy/tools/console/defaultkeys.py b/mitmproxy/tools/console/defaultkeys.py
index d5b868d0..105be2be 100644
--- a/mitmproxy/tools/console/defaultkeys.py
+++ b/mitmproxy/tools/console/defaultkeys.py
@@ -1,8 +1,9 @@
def map(km):
- km.add(":", "console.command ''", ["global"], "Command prompt")
+ km.add(":", "console.command ", ["global"], "Command prompt")
km.add("?", "console.view.help", ["global"], "View help")
km.add("C", "console.view.commands", ["global"], "View commands")
+ km.add("K", "console.view.keybindings", ["global"], "View key bindings")
km.add("O", "console.view.options", ["global"], "View options")
km.add("E", "console.view.eventlog", ["global"], "View event log")
km.add("Q", "console.exit", ["global"], "Exit immediately")
@@ -19,7 +20,7 @@ def map(km):
km.add("h", "console.nav.left", ["global"], "Left")
km.add("tab", "console.nav.next", ["global"], "Next")
km.add("enter", "console.nav.select", ["global"], "Select")
- km.add(" ", "console.nav.pagedown", ["global"], "Page down")
+ km.add("space", "console.nav.pagedown", ["global"], "Page down")
km.add("ctrl f", "console.nav.pagedown", ["global"], "Page down")
km.add("ctrl b", "console.nav.pageup", ["global"], "Page up")
@@ -36,8 +37,10 @@ def map(km):
km.add("D", "view.duplicate @focus", ["flowlist", "flowview"], "Duplicate flow")
km.add(
"e",
- "console.choose.cmd Format export.formats "
- "console.command export.file {choice} @focus ''",
+ """
+ console.choose.cmd Format export.formats
+ console.command export.file {choice} @focus ''
+ """,
["flowlist", "flowview"],
"Export this flow to file"
)
@@ -60,8 +63,10 @@ def map(km):
)
km.add(
"o",
- "console.choose.cmd Order view.order.options "
- "set console_order={choice}",
+ """
+ console.choose.cmd Order view.order.options
+ set console_order={choice}
+ """,
["flowlist"],
"Set flow list order"
)
@@ -83,8 +88,10 @@ def map(km):
km.add(
"e",
- "console.choose.cmd Part console.edit.focus.options "
- "console.edit.focus {choice}",
+ """
+ console.choose.cmd Part console.edit.focus.options
+ console.edit.focus {choice}
+ """,
["flowview"],
"Edit a flow component"
)
@@ -95,12 +102,14 @@ def map(km):
"Toggle viewing full contents on this flow",
)
km.add("w", "console.command save.file @focus ", ["flowview"], "Save flow to file")
- km.add(" ", "view.focus.next", ["flowview"], "Go to next flow")
+ km.add("space", "view.focus.next", ["flowview"], "Go to next flow")
km.add(
"v",
- "console.choose \"View Part\" request,response "
- "console.bodyview @focus {choice}",
+ """
+ console.choose "View Part" request,response
+ console.bodyview @focus {choice}
+ """,
["flowview"],
"View flow body in an external viewer"
)
@@ -108,8 +117,10 @@ def map(km):
km.add("m", "console.flowview.mode.set", ["flowview"], "Set flow view mode")
km.add(
"z",
- "console.choose \"Part\" request,response "
- "flow.encode.toggle @focus {choice}",
+ """
+ console.choose "Part" request,response
+ flow.encode.toggle @focus {choice}
+ """,
["flowview"],
"Encode/decode flow body"
)
@@ -117,7 +128,7 @@ def map(km):
km.add("L", "console.command options.load ", ["options"], "Load from file")
km.add("S", "console.command options.save ", ["options"], "Save to file")
km.add("D", "options.reset", ["options"], "Reset all options")
- km.add("d", "console.options.reset.current", ["options"], "Reset this option")
+ km.add("d", "console.options.reset.focus", ["options"], "Reset this option")
km.add("a", "console.grideditor.add", ["grideditor"], "Add a row after cursor")
km.add("A", "console.grideditor.insert", ["grideditor"], "Insert a row before cursor")
@@ -137,3 +148,31 @@ def map(km):
km.add("e", "console.grideditor.editor", ["grideditor"], "Edit in external editor")
km.add("z", "console.eventlog.clear", ["eventlog"], "Clear")
+
+ km.add(
+ "a",
+ """
+ console.choose.cmd "Context" console.key.contexts
+ console.command console.key.bind {choice}
+ """,
+ ["keybindings"],
+ "Add a key binding"
+ )
+ km.add(
+ "d",
+ "console.key.unbind.focus",
+ ["keybindings"],
+ "Unbind the currently focused key binding"
+ )
+ km.add(
+ "x",
+ "console.key.execute.focus",
+ ["keybindings"],
+ "Execute the currently focused key binding"
+ )
+ km.add(
+ "enter",
+ "console.key.edit.focus",
+ ["keybindings"],
+ "Edit the currently focused key binding"
+ )
diff --git a/mitmproxy/tools/console/flowlist.py b/mitmproxy/tools/console/flowlist.py
index f00ed9fa..852c5163 100644
--- a/mitmproxy/tools/console/flowlist.py
+++ b/mitmproxy/tools/console/flowlist.py
@@ -30,7 +30,7 @@ class FlowItem(urwid.WidgetWrap):
self.master.commands.call("console.view.flow @focus")
return True
- def keypress(self, xxx_todo_changeme, key):
+ def keypress(self, size, key):
return key
diff --git a/mitmproxy/tools/console/keybindings.py b/mitmproxy/tools/console/keybindings.py
new file mode 100644
index 00000000..45f5c33c
--- /dev/null
+++ b/mitmproxy/tools/console/keybindings.py
@@ -0,0 +1,159 @@
+import urwid
+import blinker
+import textwrap
+from mitmproxy.tools.console import layoutwidget
+from mitmproxy.tools.console import signals
+
+HELP_HEIGHT = 5
+
+
+keybinding_focus_change = blinker.Signal()
+
+
+class KeyItem(urwid.WidgetWrap):
+ def __init__(self, walker, binding, focused):
+ self.walker, self.binding, self.focused = walker, binding, focused
+ super().__init__(None)
+ self._w = self.get_widget()
+
+ def get_widget(self):
+ cmd = textwrap.dedent(self.binding.command).strip()
+ parts = [
+ (4, urwid.Text([("focus", ">> " if self.focused else " ")])),
+ (10, urwid.Text([("title", self.binding.key)])),
+ (12, urwid.Text([("highlight", "\n".join(self.binding.contexts))])),
+ urwid.Text([("text", cmd)]),
+ ]
+ return urwid.Columns(parts)
+
+ def get_edit_text(self):
+ return self._w[1].get_edit_text()
+
+ def selectable(self):
+ return True
+
+ def keypress(self, size, key):
+ return key
+
+
+class KeyListWalker(urwid.ListWalker):
+ def __init__(self, master):
+ self.master = master
+
+ self.index = 0
+ self.focusobj = None
+ self.bindings = list(master.keymap.list("all"))
+ self.set_focus(0)
+ signals.keybindings_change.connect(self.sig_modified)
+
+ def sig_modified(self, sender):
+ self.bindings = list(self.master.keymap.list("all"))
+ self.set_focus(min(self.index, len(self.bindings) - 1))
+ self._modified()
+
+ def get_edit_text(self):
+ return self.focus_obj.get_edit_text()
+
+ def _get(self, pos):
+ binding = self.bindings[pos]
+ return KeyItem(self, binding, pos == self.index)
+
+ def get_focus(self):
+ return self.focus_obj, self.index
+
+ def set_focus(self, index):
+ binding = self.bindings[index]
+ self.index = index
+ self.focus_obj = self._get(self.index)
+ keybinding_focus_change.send(binding.help or "")
+
+ def get_next(self, pos):
+ if pos >= len(self.bindings) - 1:
+ return None, None
+ pos = pos + 1
+ return self._get(pos), pos
+
+ def get_prev(self, pos):
+ pos = pos - 1
+ if pos < 0:
+ return None, None
+ return self._get(pos), pos
+
+
+class KeyList(urwid.ListBox):
+ def __init__(self, master):
+ self.master = master
+ self.walker = KeyListWalker(master)
+ super().__init__(self.walker)
+
+ def keypress(self, size, key):
+ if key == "m_select":
+ foc, idx = self.get_focus()
+ # Act here
+ elif key == "m_start":
+ self.set_focus(0)
+ self.walker._modified()
+ elif key == "m_end":
+ self.set_focus(len(self.walker.bindings) - 1)
+ self.walker._modified()
+ return super().keypress(size, key)
+
+
+class KeyHelp(urwid.Frame):
+ def __init__(self, master):
+ self.master = master
+ super().__init__(self.widget(""))
+ self.set_active(False)
+ keybinding_focus_change.connect(self.sig_mod)
+
+ def set_active(self, val):
+ h = urwid.Text("Key Binding Help")
+ style = "heading" if val else "heading_inactive"
+ self.header = urwid.AttrWrap(h, style)
+
+ def widget(self, txt):
+ cols, _ = self.master.ui.get_cols_rows()
+ return urwid.ListBox(
+ [urwid.Text(i) for i in textwrap.wrap(txt, cols)]
+ )
+
+ def sig_mod(self, txt):
+ self.set_body(self.widget(txt))
+
+
+class KeyBindings(urwid.Pile, layoutwidget.LayoutWidget):
+ title = "Key Bindings"
+ keyctx = "keybindings"
+
+ def __init__(self, master):
+ oh = KeyHelp(master)
+ super().__init__(
+ [
+ KeyList(master),
+ (HELP_HEIGHT, oh),
+ ]
+ )
+ self.master = master
+
+ def focus(self):
+ if self.focus_position != 0:
+ return None
+ f = self.widget_list[0]
+ return f.walker.get_focus()[0].binding
+
+ def keypress(self, size, key):
+ if key == "m_next":
+ self.focus_position = (
+ self.focus_position + 1
+ ) % len(self.widget_list)
+ self.widget_list[1].set_active(self.focus_position == 1)
+ key = None
+
+ # This is essentially a copypasta from urwid.Pile's keypress handler.
+ # So much for "closed for modification, but open for extension".
+ item_rows = None
+ if len(size) == 2:
+ item_rows = self.get_item_rows(size, focus = True)
+ i = self.widget_list.index(self.focus_item)
+ tsize = self.get_item_size(size, i, True, item_rows)
+ return self.focus_item.keypress(tsize, key)
diff --git a/mitmproxy/tools/console/keymap.py b/mitmproxy/tools/console/keymap.py
index b904f706..e406905d 100644
--- a/mitmproxy/tools/console/keymap.py
+++ b/mitmproxy/tools/console/keymap.py
@@ -1,9 +1,9 @@
import typing
-import collections
from mitmproxy.tools.console import commandeditor
+from mitmproxy.tools.console import signals
-SupportedContexts = {
+Contexts = {
"chooser",
"commands",
"eventlog",
@@ -12,59 +12,113 @@ SupportedContexts = {
"global",
"grideditor",
"help",
+ "keybindings",
"options",
}
-Binding = collections.namedtuple(
- "Binding",
- ["key", "command", "contexts", "help"]
-)
+class Binding:
+ def __init__(self, key, command, contexts, help):
+ self.key, self.command, self.contexts = key, command, sorted(contexts)
+ self.help = help
+
+ def keyspec(self):
+ """
+ Translate the key spec from a convenient user specification to one
+ Urwid understands.
+ """
+ return self.key.replace("space", " ")
+
+ def sortkey(self):
+ return self.key + ",".join(self.contexts)
class Keymap:
def __init__(self, master):
self.executor = commandeditor.CommandExecutor(master)
self.keys = {}
+ for c in Contexts:
+ self.keys[c] = {}
self.bindings = []
- def add(self, key: str, command: str, contexts: typing.Sequence[str], help="") -> None:
- """
- Add a key to the key map. If context is empty, it's considered to be
- a global binding.
- """
+ def _check_contexts(self, contexts):
if not contexts:
raise ValueError("Must specify at least one context.")
for c in contexts:
- if c not in SupportedContexts:
+ if c not in Contexts:
raise ValueError("Unsupported context: %s" % c)
- b = Binding(key=key, command=command, contexts=contexts, help=help)
- self.bindings.append(b)
- self.bind(b)
+ def add(
+ self,
+ key: str,
+ command: str,
+ contexts: typing.Sequence[str],
+ help=""
+ ) -> None:
+ """
+ Add a key to the key map.
+ """
+ self._check_contexts(contexts)
+
+ for b in self.bindings:
+ if b.key == key and b.command.strip() == command.strip():
+ b.contexts = sorted(list(set(b.contexts + contexts)))
+ if help:
+ b.help = help
+ self.bind(b)
+ break
+ else:
+ self.remove(key, contexts)
+ b = Binding(key=key, command=command, contexts=contexts, help=help)
+ self.bindings.append(b)
+ self.bind(b)
+ signals.keybindings_change.send(self)
- def bind(self, binding):
+ def remove(self, key: str, contexts: typing.Sequence[str]) -> None:
+ """
+ Remove a key from the key map.
+ """
+ self._check_contexts(contexts)
+ for c in contexts:
+ b = self.get(c, key)
+ if b:
+ self.unbind(b)
+ b.contexts = [x for x in b.contexts if x != c]
+ if b.contexts:
+ self.bindings.append(b)
+ self.bind(b)
+ signals.keybindings_change.send(self)
+
+ def bind(self, binding: Binding) -> None:
+ for c in binding.contexts:
+ self.keys[c][binding.keyspec()] = binding
+
+ def unbind(self, binding: Binding) -> None:
+ """
+ Unbind also removes the binding from the list.
+ """
for c in binding.contexts:
- d = self.keys.setdefault(c, {})
- d[binding.key] = binding.command
+ del self.keys[c][binding.keyspec()]
+ self.bindings = [b for b in self.bindings if b != binding]
- def get(self, context: str, key: str) -> typing.Optional[str]:
+ def get(self, context: str, key: str) -> typing.Optional[Binding]:
if context in self.keys:
return self.keys[context].get(key, None)
return None
def list(self, context: str) -> typing.Sequence[Binding]:
- b = [b for b in self.bindings if context in b.contexts]
- b.sort(key=lambda x: x.key)
- return b
+ b = [x for x in self.bindings if context in x.contexts or context == "all"]
+ single = [x for x in b if len(x.key.split()) == 1]
+ multi = [x for x in b if len(x.key.split()) != 1]
+ single.sort(key=lambda x: x.sortkey())
+ multi.sort(key=lambda x: x.sortkey())
+ return single + multi
def handle(self, context: str, key: str) -> typing.Optional[str]:
"""
Returns the key if it has not been handled, or None.
"""
- cmd = self.get(context, key)
- if not cmd:
- cmd = self.get("global", key)
- if cmd:
- return self.executor(cmd)
+ b = self.get(context, key) or self.get("global", key)
+ if b:
+ return self.executor(b.command)
return key
diff --git a/mitmproxy/tools/console/master.py b/mitmproxy/tools/console/master.py
index ce4e4d9d..cd29dba9 100644
--- a/mitmproxy/tools/console/master.py
+++ b/mitmproxy/tools/console/master.py
@@ -9,438 +9,21 @@ import subprocess
import sys
import tempfile
import traceback
-import typing
import urwid
-from mitmproxy import ctx
from mitmproxy import addons
-from mitmproxy import command
-from mitmproxy import exceptions
from mitmproxy import master
from mitmproxy import log
-from mitmproxy import flow
from mitmproxy.addons import intercept
from mitmproxy.addons import readfile
from mitmproxy.addons import view
+from mitmproxy.tools.console import consoleaddons
from mitmproxy.tools.console import defaultkeys
from mitmproxy.tools.console import keymap
-from mitmproxy.tools.console import overlay
from mitmproxy.tools.console import palettes
from mitmproxy.tools.console import signals
from mitmproxy.tools.console import window
-from mitmproxy import contentviews
-from mitmproxy.utils import strutils
-
-
-class Logger:
- def log(self, evt):
- signals.add_log(evt.msg, evt.level)
- if evt.level == "alert":
- signals.status_message.send(
- message=str(evt.msg),
- expire=2
- )
-
-
-class UnsupportedLog:
- """
- A small addon to dump info on flow types we don't support yet.
- """
- def websocket_message(self, f):
- message = f.messages[-1]
- signals.add_log(f.message_info(message), "info")
- signals.add_log(strutils.bytes_to_escaped_str(message.content), "debug")
-
- def websocket_end(self, f):
- signals.add_log("WebSocket connection closed by {}: {} {}, {}".format(
- f.close_sender,
- f.close_code,
- f.close_message,
- f.close_reason), "info")
-
- def tcp_message(self, f):
- message = f.messages[-1]
- direction = "->" if message.from_client else "<-"
- signals.add_log("{client_host}:{client_port} {direction} tcp {direction} {server_host}:{server_port}".format(
- client_host=f.client_conn.address[0],
- client_port=f.client_conn.address[1],
- server_host=f.server_conn.address[0],
- server_port=f.server_conn.address[1],
- direction=direction,
- ), "info")
- signals.add_log(strutils.bytes_to_escaped_str(message.content), "debug")
-
-
-class ConsoleAddon:
- """
- An addon that exposes console-specific commands, and hooks into required
- events.
- """
- def __init__(self, master):
- self.master = master
- self.started = False
-
- @command.command("console.layout.options")
- def layout_options(self) -> typing.Sequence[str]:
- """
- Returns the valid options for console layout. Use these by setting
- the console_layout option.
- """
- return ["single", "vertical", "horizontal"]
-
- @command.command("console.layout.cycle")
- def layout_cycle(self) -> None:
- """
- Cycle through the console layout options.
- """
- opts = self.layout_options()
- off = self.layout_options().index(ctx.options.console_layout)
- ctx.options.update(
- console_layout = opts[(off + 1) % len(opts)]
- )
-
- @command.command("console.panes.next")
- def panes_next(self) -> None:
- """
- Go to the next layout pane.
- """
- self.master.window.switch()
-
- @command.command("console.options.reset.current")
- def options_reset_current(self) -> None:
- """
- Reset the current option in the options editor.
- """
- fv = self.master.window.current("options")
- if not fv:
- raise exceptions.CommandError("Not viewing options.")
- self.master.commands.call("options.reset.one %s" % fv.current_name())
-
- @command.command("console.nav.start")
- def nav_start(self) -> None:
- """
- Go to the start of a list or scrollable.
- """
- self.master.inject_key("m_start")
-
- @command.command("console.nav.end")
- def nav_end(self) -> None:
- """
- Go to the end of a list or scrollable.
- """
- self.master.inject_key("m_end")
-
- @command.command("console.nav.next")
- def nav_next(self) -> None:
- """
- Go to the next navigatable item.
- """
- self.master.inject_key("m_next")
-
- @command.command("console.nav.select")
- def nav_select(self) -> None:
- """
- Select a navigable item for viewing or editing.
- """
- self.master.inject_key("m_select")
-
- @command.command("console.nav.up")
- def nav_up(self) -> None:
- """
- Go up.
- """
- self.master.inject_key("up")
-
- @command.command("console.nav.down")
- def nav_down(self) -> None:
- """
- Go down.
- """
- self.master.inject_key("down")
-
- @command.command("console.nav.pageup")
- def nav_pageup(self) -> None:
- """
- Go up.
- """
- self.master.inject_key("page up")
-
- @command.command("console.nav.pagedown")
- def nav_pagedown(self) -> None:
- """
- Go down.
- """
- self.master.inject_key("page down")
-
- @command.command("console.nav.left")
- def nav_left(self) -> None:
- """
- Go left.
- """
- self.master.inject_key("left")
-
- @command.command("console.nav.right")
- def nav_right(self) -> None:
- """
- Go right.
- """
- self.master.inject_key("right")
-
- @command.command("console.choose")
- def console_choose(
- self, prompt: str, choices: typing.Sequence[str], *cmd: typing.Sequence[str]
- ) -> None:
- """
- Prompt the user to choose from a specified list of strings, then
- invoke another command with all occurances of {choice} replaced by
- the choice the user made.
- """
- def callback(opt):
- # We're now outside of the call context...
- repl = " ".join(cmd)
- repl = repl.replace("{choice}", opt)
- try:
- self.master.commands.call(repl)
- except exceptions.CommandError as e:
- signals.status_message.send(message=str(e))
-
- self.master.overlay(
- overlay.Chooser(self.master, prompt, choices, "", callback)
- )
-
- @command.command("console.choose.cmd")
- def console_choose_cmd(
- self, prompt: str, choicecmd: str, *cmd: typing.Sequence[str]
- ) -> None:
- """
- Prompt the user to choose from a list of strings returned by a
- command, then invoke another command with all occurances of {choice}
- replaced by the choice the user made.
- """
- choices = ctx.master.commands.call_args(choicecmd, [])
-
- def callback(opt):
- # We're now outside of the call context...
- repl = " ".join(cmd)
- repl = repl.replace("{choice}", opt)
- try:
- self.master.commands.call(repl)
- except exceptions.CommandError as e:
- signals.status_message.send(message=str(e))
-
- self.master.overlay(
- overlay.Chooser(self.master, prompt, choices, "", callback)
- )
-
- @command.command("console.command")
- def console_command(self, *partial: typing.Sequence[str]) -> None:
- """
- Prompt the user to edit a command with a (possilby empty) starting value.
- """
- signals.status_prompt_command.send(partial=" ".join(partial) + " ") # type: ignore
-
- @command.command("console.view.commands")
- def view_commands(self) -> None:
- """View the commands list."""
- self.master.switch_view("commands")
-
- @command.command("console.view.options")
- def view_options(self) -> None:
- """View the options editor."""
- self.master.switch_view("options")
-
- @command.command("console.view.eventlog")
- def view_eventlog(self) -> None:
- """View the options editor."""
- self.master.switch_view("eventlog")
-
- @command.command("console.view.help")
- def view_help(self) -> None:
- """View help."""
- self.master.switch_view("help")
-
- @command.command("console.view.flow")
- def view_flow(self, flow: flow.Flow) -> None:
- """View a flow."""
- if hasattr(flow, "request"):
- # FIME: Also set focus?
- self.master.switch_view("flowview")
-
- @command.command("console.exit")
- def exit(self) -> None:
- """Exit mitmproxy."""
- raise urwid.ExitMainLoop
-
- @command.command("console.view.pop")
- def view_pop(self) -> None:
- """
- Pop a view off the console stack. At the top level, this prompts the
- user to exit mitmproxy.
- """
- signals.pop_view_state.send(self)
-
- @command.command("console.bodyview")
- def bodyview(self, f: flow.Flow, part: str) -> None:
- """
- Spawn an external viewer for a flow request or response body based
- on the detected MIME type. We use the mailcap system to find the
- correct viewier, and fall back to the programs in $PAGER or $EDITOR
- if necessary.
- """
- fpart = getattr(f, part)
- if not fpart:
- raise exceptions.CommandError("Could not view part %s." % part)
- t = fpart.headers.get("content-type")
- content = fpart.get_content(strict=False)
- if not content:
- raise exceptions.CommandError("No content to view.")
- self.master.spawn_external_viewer(content, t)
-
- @command.command("console.edit.focus.options")
- def edit_focus_options(self) -> typing.Sequence[str]:
- return [
- "cookies",
- "form",
- "path",
- "method",
- "query",
- "reason",
- "request-headers",
- "response-headers",
- "status_code",
- "set-cookies",
- "url",
- ]
-
- @command.command("console.edit.focus")
- def edit_focus(self, part: str) -> None:
- """
- Edit the query of the current focus.
- """
- if part == "cookies":
- self.master.switch_view("edit_focus_cookies")
- elif part == "form":
- self.master.switch_view("edit_focus_form")
- elif part == "path":
- self.master.switch_view("edit_focus_path")
- elif part == "query":
- self.master.switch_view("edit_focus_query")
- elif part == "request-headers":
- self.master.switch_view("edit_focus_request_headers")
- elif part == "response-headers":
- self.master.switch_view("edit_focus_response_headers")
- elif part == "set-cookies":
- self.master.switch_view("edit_focus_setcookies")
- elif part in ["url", "method", "status_code", "reason"]:
- self.master.commands.call(
- "console.command flow.set @focus %s " % part
- )
-
- def _grideditor(self):
- gewidget = self.master.window.current("grideditor")
- if not gewidget:
- raise exceptions.CommandError("Not in a grideditor.")
- return gewidget.key_responder()
-
- @command.command("console.grideditor.add")
- def grideditor_add(self) -> None:
- """
- Add a row after the cursor.
- """
- self._grideditor().cmd_add()
-
- @command.command("console.grideditor.insert")
- def grideditor_insert(self) -> None:
- """
- Insert a row before the cursor.
- """
- self._grideditor().cmd_insert()
-
- @command.command("console.grideditor.delete")
- def grideditor_delete(self) -> None:
- """
- Delete row
- """
- self._grideditor().cmd_delete()
-
- @command.command("console.grideditor.readfile")
- def grideditor_readfile(self, path: str) -> None:
- """
- Read a file into the currrent cell.
- """
- self._grideditor().cmd_read_file(path)
-
- @command.command("console.grideditor.readfile_escaped")
- def grideditor_readfile_escaped(self, path: str) -> None:
- """
- Read a file containing a Python-style escaped stringinto the
- currrent cell.
- """
- self._grideditor().cmd_read_file_escaped(path)
-
- @command.command("console.grideditor.editor")
- def grideditor_editor(self) -> None:
- """
- Spawn an external editor on the current cell.
- """
- self._grideditor().cmd_spawn_editor()
-
- @command.command("console.flowview.mode.set")
- def flowview_mode_set(self) -> None:
- """
- Set the display mode for the current flow view.
- """
- fv = self.master.window.current("flowview")
- if not fv:
- raise exceptions.CommandError("Not viewing a flow.")
- idx = fv.body.tab_offset
-
- def callback(opt):
- try:
- self.master.commands.call_args(
- "view.setval",
- ["@focus", "flowview_mode_%s" % idx, opt]
- )
- except exceptions.CommandError as e:
- signals.status_message.send(message=str(e))
-
- opts = [i.name.lower() for i in contentviews.views]
- self.master.overlay(overlay.Chooser(self.master, "Mode", opts, "", callback))
-
- @command.command("console.flowview.mode")
- def flowview_mode(self) -> str:
- """
- Get the display mode for the current flow view.
- """
- fv = self.master.window.current_window("flowview")
- if not fv:
- raise exceptions.CommandError("Not viewing a flow.")
- idx = fv.body.tab_offset
- return self.master.commands.call_args(
- "view.getval",
- [
- "@focus",
- "flowview_mode_%s" % idx,
- self.master.options.default_contentview,
- ]
- )
-
- @command.command("console.eventlog.clear")
- def eventlog_clear(self) -> None:
- """
- Clear the event log.
- """
- signals.sig_clear_log.send(self)
-
- def running(self):
- self.started = True
-
- def update(self, flows):
- if not flows:
- signals.update_settings.send(self)
- for f in flows:
- signals.flow_change.send(self, flow=f)
class ConsoleMaster(master.Master):
@@ -465,14 +48,14 @@ class ConsoleMaster(master.Master):
signals.call_in.connect(self.sig_call_in)
signals.sig_add_log.connect(self.sig_add_log)
- self.addons.add(Logger())
+ self.addons.add(consoleaddons.Logger())
self.addons.add(*addons.default_addons())
self.addons.add(
intercept.Intercept(),
self.view,
- UnsupportedLog(),
+ consoleaddons.UnsupportedLog(),
readfile.ReadFile(),
- ConsoleAddon(self),
+ consoleaddons.ConsoleAddon(self),
)
def sigint_handler(*args, **kwargs):
diff --git a/mitmproxy/tools/console/signals.py b/mitmproxy/tools/console/signals.py
index 49115a5d..5d39d96a 100644
--- a/mitmproxy/tools/console/signals.py
+++ b/mitmproxy/tools/console/signals.py
@@ -48,3 +48,6 @@ flowlist_change = blinker.Signal()
# Pop and push view state onto a stack
pop_view_state = blinker.Signal()
push_view_state = blinker.Signal()
+
+# Fired when the key bindings change
+keybindings_change = blinker.Signal()
diff --git a/mitmproxy/tools/console/window.py b/mitmproxy/tools/console/window.py
index 43e5cceb..6145b645 100644
--- a/mitmproxy/tools/console/window.py
+++ b/mitmproxy/tools/console/window.py
@@ -4,6 +4,7 @@ from mitmproxy.tools.console import statusbar
from mitmproxy.tools.console import flowlist
from mitmproxy.tools.console import flowview
from mitmproxy.tools.console import commands
+from mitmproxy.tools.console import keybindings
from mitmproxy.tools.console import options
from mitmproxy.tools.console import overlay
from mitmproxy.tools.console import help
@@ -29,6 +30,7 @@ class WindowStack:
flowlist = flowlist.FlowListBox(master),
flowview = flowview.FlowView(master),
commands = commands.Commands(master),
+ keybindings = keybindings.KeyBindings(master),
options = options.Options(master),
help = help.HelpView(master),
eventlog = eventlog.EventLog(master),
diff --git a/mitmproxy/websocket.py b/mitmproxy/websocket.py
index 2efa7ad1..30967a91 100644
--- a/mitmproxy/websocket.py
+++ b/mitmproxy/websocket.py
@@ -4,7 +4,7 @@ from typing import List, Optional
from mitmproxy import flow
from mitmproxy.net import websockets
from mitmproxy.types import serializable
-from mitmproxy.utils import strutils
+from mitmproxy.utils import strutils, human
class WebSocketMessage(serializable.Serializable):
@@ -94,8 +94,8 @@ class WebSocketFlow(flow.Flow):
def message_info(self, message: WebSocketMessage) -> str:
return "{client} {direction} WebSocket {type} message {direction} {server}{endpoint}".format(
type=message.type,
- client=repr(self.client_conn.address),
- server=repr(self.server_conn.address),
+ client=human.format_address(self.client_conn.address),
+ server=human.format_address(self.server_conn.address),
direction="->" if message.from_client else "<-",
endpoint=self.handshake_flow.request.path,
)
diff --git a/release/windows-store-experiment/AppxManifest.xml b/release/windows-store-experiment/AppxManifest.xml
index deddd051..5e687f00 100644
--- a/release/windows-store-experiment/AppxManifest.xml
+++ b/release/windows-store-experiment/AppxManifest.xml
@@ -7,7 +7,7 @@
<Properties>
<DisplayName>Mitmproxy</DisplayName>
<PublisherDisplayName>Maximilian Hils</PublisherDisplayName>
- <Logo>Assets\logo.150x150.png</Logo>
+ <Logo>Assets\logo.44x44.png</Logo>
</Properties>
<Resources>
<Resource Language="en-us" />
@@ -24,16 +24,10 @@
Square150x150Logo="Assets\logo.150x150.png" Square44x44Logo="Assets\logo.44x44.png"/>
<Extensions>
<uap3:Extension Executable="mitmweb.exe" Category="windows.appExecutionAlias" EntryPoint="Windows.FullTrustApplication">
- <uap3:AppExecutionAlias><desktop:ExecutionAlias Alias="mitmweb.exe" /><desktop:ExecutionAlias Alias="mitmproxy.exe" /></uap3:AppExecutionAlias>
- </uap3:Extension>
- </Extensions>
- </Application>
- <Application Id="mitmdump" Executable="mitmdump.exe" EntryPoint="Windows.FullTrustApplication">
- <uap3:VisualElements AppListEntry="none" DisplayName="Mitmdump" Description="mitmdump is the command-line companion to mitmproxy. It provides tcpdump-like functionality to let you view, record, and programmatically transform HTTP traffic." BackgroundColor="#333333"
- Square150x150Logo="Assets\logo.150x150.png" Square44x44Logo="Assets\logo.44x44.png"/>
- <Extensions>
- <uap3:Extension Executable="mitmdump.exe" Category="windows.appExecutionAlias" EntryPoint="Windows.FullTrustApplication">
- <uap3:AppExecutionAlias><desktop:ExecutionAlias Alias="mitmdump.exe" /></uap3:AppExecutionAlias>
+ <uap3:AppExecutionAlias>
+ <desktop:ExecutionAlias Alias="mitmweb.exe" />
+ <desktop:ExecutionAlias Alias="mitmproxy.exe" />
+ </uap3:AppExecutionAlias>
</uap3:Extension>
</Extensions>
</Application>
diff --git a/release/windows-store-experiment/Assets/logo.150x150.png b/release/windows-store-experiment/Assets/logo.150x150.png
index f602b9bb..6d79f0c6 100644
--- a/release/windows-store-experiment/Assets/logo.150x150.png
+++ b/release/windows-store-experiment/Assets/logo.150x150.png
Binary files differ
diff --git a/release/windows-store-experiment/Assets/logo.44x44.png b/release/windows-store-experiment/Assets/logo.44x44.png
index 32c131ea..f77cbb9b 100644
--- a/release/windows-store-experiment/Assets/logo.44x44.png
+++ b/release/windows-store-experiment/Assets/logo.44x44.png
Binary files differ
diff --git a/release/windows-store-experiment/Assets/logo.50x50.png b/release/windows-store-experiment/Assets/logo.50x50.png
new file mode 100644
index 00000000..96e13346
--- /dev/null
+++ b/release/windows-store-experiment/Assets/logo.50x50.png
Binary files differ
diff --git a/test/mitmproxy/addons/test_view.py b/test/mitmproxy/addons/test_view.py
index d5a3a456..40136f1f 100644
--- a/test/mitmproxy/addons/test_view.py
+++ b/test/mitmproxy/addons/test_view.py
@@ -262,6 +262,16 @@ def test_duplicate():
assert v.focus.index == 2
+def test_remove():
+ v = view.View()
+ with taddons.context():
+ f = [tflow.tflow(), tflow.tflow()]
+ v.add(f)
+ assert len(v) == 2
+ v.remove(f)
+ assert len(v) == 0
+
+
def test_setgetval():
v = view.View()
with taddons.context():
diff --git a/test/mitmproxy/proxy/protocol/test_http1.py b/test/mitmproxy/proxy/protocol/test_http1.py
index b642afb3..1eff8666 100644
--- a/test/mitmproxy/proxy/protocol/test_http1.py
+++ b/test/mitmproxy/proxy/protocol/test_http1.py
@@ -1,3 +1,7 @@
+from unittest import mock
+import pytest
+
+from mitmproxy import exceptions
from mitmproxy.test import tflow
from mitmproxy.net.http import http1
from mitmproxy.net.tcp import TCPClient
@@ -77,3 +81,36 @@ class TestHeadContentLength(tservers.HTTPProxyTest):
"""head:'%s/p/200:h"Content-Length"="42"'""" % self.server.urlbase
)
assert resp.headers["Content-Length"] == "42"
+
+
+class TestStreaming(tservers.HTTPProxyTest):
+
+ @pytest.mark.parametrize('streaming', [True, False])
+ def test_streaming(self, streaming):
+
+ class Stream:
+ def requestheaders(self, f):
+ f.request.stream = streaming
+
+ def responseheaders(self, f):
+ f.response.stream = streaming
+
+ def assert_write(self, v):
+ if streaming:
+ assert len(v) <= 4096
+ return self.o.write(v)
+
+ self.master.addons.add(Stream())
+ p = self.pathoc()
+ with p.connect():
+ with mock.patch("mitmproxy.net.tcp.Writer.write", side_effect=assert_write, autospec=True):
+ # response with 10000 bytes
+ r = p.request("post:'%s/p/200:b@10000'" % self.server.urlbase)
+ assert len(r.content) == 10000
+
+ if streaming:
+ with pytest.raises(exceptions.HttpReadDisconnect): # as the assertion in assert_write fails
+ # request with 10000 bytes
+ p.request("post:'%s/p/200':b@10000" % self.server.urlbase)
+ else:
+ assert p.request("post:'%s/p/200':b@10000" % self.server.urlbase)
diff --git a/test/mitmproxy/test_command.py b/test/mitmproxy/test_command.py
index 958328b2..87432163 100644
--- a/test/mitmproxy/test_command.py
+++ b/test/mitmproxy/test_command.py
@@ -22,7 +22,7 @@ class TAddon:
def empty(self) -> None:
pass
- def varargs(self, one: str, *var: typing.Sequence[str]) -> typing.Sequence[str]:
+ def varargs(self, one: str, *var: str) -> typing.Sequence[str]:
return list(var)
diff --git a/test/mitmproxy/test_optmanager.py b/test/mitmproxy/test_optmanager.py
index 37fe0e3a..0c400683 100644
--- a/test/mitmproxy/test_optmanager.py
+++ b/test/mitmproxy/test_optmanager.py
@@ -257,6 +257,10 @@ def test_serialize():
with pytest.raises(Exception, match="Config error"):
optmanager.load(o2, t)
+ t = "# a comment"
+ optmanager.load(o2, t)
+ assert optmanager.load(o2, "foobar: '123'") == {"foobar": "123"}
+
t = ""
optmanager.load(o2, t)
assert optmanager.load(o2, "foobar: '123'") == {"foobar": "123"}
diff --git a/test/mitmproxy/tools/console/test_keymap.py b/test/mitmproxy/tools/console/test_keymap.py
index bbca4ac9..00e64991 100644
--- a/test/mitmproxy/tools/console/test_keymap.py
+++ b/test/mitmproxy/tools/console/test_keymap.py
@@ -4,6 +4,11 @@ from unittest import mock
import pytest
+def test_binding():
+ b = keymap.Binding("space", "cmd", ["options"], "")
+ assert b.keyspec() == " "
+
+
def test_bind():
with taddons.context() as tctx:
km = keymap.Keymap(tctx.master)
@@ -30,3 +35,38 @@ def test_bind():
assert km.executor.called
assert len((km.list("global"))) == 1
+
+
+def test_join():
+ with taddons.context() as tctx:
+ km = keymap.Keymap(tctx.master)
+ km.add("key", "str", ["options"], "help1")
+ km.add("key", "str", ["commands"])
+ return
+ assert len(km.bindings) == 1
+ assert len(km.bindings[0].contexts) == 2
+ assert km.bindings[0].help == "help1"
+ km.add("key", "str", ["commands"], "help2")
+ assert len(km.bindings) == 1
+ assert len(km.bindings[0].contexts) == 2
+ assert km.bindings[0].help == "help2"
+
+ assert km.get("commands", "key")
+ km.unbind(km.bindings[0])
+ assert len(km.bindings) == 0
+ assert not km.get("commands", "key")
+
+
+def test_remove():
+ with taddons.context() as tctx:
+ km = keymap.Keymap(tctx.master)
+ km.add("key", "str", ["options", "commands"], "help1")
+ assert len(km.bindings) == 1
+ assert "options" in km.bindings[0].contexts
+
+ km.remove("key", ["options"])
+ assert len(km.bindings) == 1
+ assert "options" not in km.bindings[0].contexts
+
+ km.remove("key", ["commands"])
+ assert len(km.bindings) == 0
diff --git a/web/.eslintrc.yml b/web/.eslintrc.yml
index 60028c97..65740c91 100644
--- a/web/.eslintrc.yml
+++ b/web/.eslintrc.yml
@@ -1,3 +1,6 @@
{
- "parser": "babel-eslint"
+ "parser": "babel-eslint",
+ "parserOptions": {
+ "sourceType": "module",
+ }
} \ No newline at end of file
diff --git a/web/package.json b/web/package.json
index a4ef0f29..a42abf89 100644
--- a/web/package.json
+++ b/web/package.json
@@ -27,32 +27,32 @@
"classnames": "^2.2.5",
"lodash": "^4.17.4",
"mock-xmlhttprequest": "^1.1.0",
- "prop-types": "^15.5.0",
- "react": "^15.4.2",
- "react-codemirror": "^0.3.0",
+ "prop-types": "^15.5.10",
+ "react": "^15.5.4",
+ "react-codemirror": "^1.0.0",
"react-dom": "^15.4.2",
- "react-redux": "^5.0.2",
+ "react-redux": "^5.0.5",
"react-test-renderer": "^15.5.4",
"redux": "^3.6.0",
- "redux-logger": "^2.8.1",
+ "redux-logger": "^3.0.6",
"redux-mock-store": "^1.2.3",
"redux-thunk": "^2.2.0",
- "shallowequal": "^0.2.2"
+ "shallowequal": "^1.0.1"
},
"devDependencies": {
- "babel-core": "^6.23.1",
- "babel-eslint": "^7.1.1",
- "babel-jest": "^19.0.0",
- "babel-plugin-transform-class-properties": "^6.23.0",
+ "babel-core": "^6.25.0",
+ "babel-eslint": "^7.2.3",
+ "babel-jest": "^20.0.3",
+ "babel-plugin-transform-class-properties": "^6.24.1",
"babel-plugin-transform-object-rest-spread": "^6.23.0",
- "babel-preset-es2015": "^6.22.0",
- "babel-preset-react": "^6.23.0",
+ "babel-preset-es2015": "^6.24.1",
+ "babel-preset-react": "^6.24.1",
"babelify": "^7.3.0",
- "browserify": "^14.1.0",
+ "browserify": "^14.4.0",
"envify": "^4.0.0",
- "eslint": "^3.16.0",
+ "eslint": "^4.0.0",
"gulp": "^3.9.1",
- "gulp-clean-css": "^3.0.3",
+ "gulp-clean-css": "^3.4.1",
"gulp-eslint": "^3.0.1",
"gulp-less": "^3.3.0",
"gulp-livereload": "^3.8.1",
@@ -60,10 +60,10 @@
"gulp-peg": "^0.2.0",
"gulp-plumber": "^1.1.0",
"gulp-rename": "^1.2.2",
- "gulp-sourcemaps": "^2.4.1",
+ "gulp-sourcemaps": "^2.6.0",
"gulp-util": "^3.0.8",
- "jest": "^19.0.0",
- "react-addons-test-utils": "^15.4.2",
+ "jest": "^20.0.4",
+ "react-addons-test-utils": "^15.5.1",
"uglifyify": "^3.0.4",
"vinyl-buffer": "^1.0.0",
"vinyl-source-stream": "^1.1.0",
diff --git a/web/src/js/__tests__/components/FlowView/ToggleEditSpec.js b/web/src/js/__tests__/components/FlowView/ToggleEditSpec.js
index 4578fdc8..ec3a8462 100644
--- a/web/src/js/__tests__/components/FlowView/ToggleEditSpec.js
+++ b/web/src/js/__tests__/components/FlowView/ToggleEditSpec.js
@@ -6,6 +6,7 @@ import { Provider } from 'react-redux'
import { startEdit, stopEdit } from '../../../ducks/ui/flow'
import { TFlow, TStore } from '../../ducks/tutils'
+global.fetch = jest.fn()
let tflow = new TFlow()
describe('ToggleEdit Component', () => {
@@ -24,7 +25,7 @@ describe('ToggleEdit Component', () => {
it('should handle click on stopEdit', () => {
tree.children[0].props.onClick()
- expect(store.getActions()).toEqual([stopEdit(tflow, true)])
+ expect(fetch).toBeCalled()
})
it('should handle click on startEdit', () => {
diff --git a/web/src/js/__tests__/ducks/ui/flowSpec.js b/web/src/js/__tests__/ducks/ui/flowSpec.js
index cd6ffa2f..11ca021e 100644
--- a/web/src/js/__tests__/ducks/ui/flowSpec.js
+++ b/web/src/js/__tests__/ducks/ui/flowSpec.js
@@ -11,7 +11,7 @@ import reducer, {
displayLarge
} from '../../../ducks/ui/flow'
-import { select, updateFlow } from '../../../ducks/flows'
+import * as flowActions from '../../../ducks/flows'
describe('flow reducer', () => {
it('should return initial state', () => {
@@ -61,11 +61,11 @@ describe('flow reducer', () => {
})
it('should not change the contentview mode', () => {
- expect(reducer({contentView: 'foo'}, select(1)).contentView).toEqual('foo')
+ expect(reducer({contentView: 'foo'}, flowActions.select(1)).contentView).toEqual('foo')
})
it('should change the contentview mode to auto after editing when a new flow will be selected', () => {
- expect(reducer({contentView: 'foo', modifiedFlow : 'test_flow'}, select(1)).contentView).toEqual('Auto')
+ expect(reducer({contentView: 'foo', modifiedFlow : 'test_flow'}, flowActions.select(1)).contentView).toEqual('Auto')
})
it('should set update and merge the modifiedflow with the update values', () => {
@@ -84,7 +84,11 @@ describe('flow reducer', () => {
it('should stop editing when the selected flow is updated', () => {
let modifiedFlow = {id: 1}
let updatedFlow = {id: 1}
- expect(reducer({modifiedFlow}, stopEdit(updatedFlow, modifiedFlow)).modifiedFlow).toBeFalsy()
+ expect(reducer(
+ { modifiedFlow },
+ {type: flowActions.UPDATE, data: modifiedFlow}
+ ).modifiedFlow
+ ).toBeFalsy()
})
it('should set content view', () => {
diff --git a/web/src/js/app.jsx b/web/src/js/app.jsx
index a94d2ef6..76720124 100644
--- a/web/src/js/app.jsx
+++ b/web/src/js/app.jsx
@@ -9,13 +9,13 @@ import rootReducer from './ducks/index'
import { add as addLog } from './ducks/eventLog'
import useUrlState from './urlState'
import WebSocketBackend from './backends/websocket'
+import { logger } from 'redux-logger'
const middlewares = [thunk];
if (process.env.NODE_ENV !== 'production') {
- const createLogger = require('redux-logger');
- middlewares.push(createLogger());
+ middlewares.push(logger);
}
// logger must be last
diff --git a/web/src/js/components/ContentView.jsx b/web/src/js/components/ContentView.jsx
index a79bf9e5..cb4749c5 100644
--- a/web/src/js/components/ContentView.jsx
+++ b/web/src/js/components/ContentView.jsx
@@ -1,7 +1,7 @@
import React, { Component } from 'react'
import PropTypes from 'prop-types'
import { connect } from 'react-redux'
-import * as ContentViews from './ContentView/ContentViews'
+import { Edit, ViewServer, ViewImage } from './ContentView/ContentViews'
import * as MetaViews from './ContentView/MetaViews'
import ShowFullContentButton from './ContentView/ShowFullContentButton'
@@ -16,7 +16,7 @@ ContentView.propTypes = {
message: PropTypes.object.isRequired,
}
-ContentView.isContentTooLarge = msg => msg.contentLength > 1024 * 1024 * (ContentViews.ViewImage.matches(msg) ? 10 : 0.2)
+ContentView.isContentTooLarge = msg => msg.contentLength > 1024 * 1024 * (ViewImage.matches(msg) ? 10 : 0.2)
function ContentView(props) {
const { flow, message, contentView, isDisplayLarge, displayLarge, onContentChange, readonly } = props
@@ -33,10 +33,15 @@ function ContentView(props) {
return <MetaViews.ContentTooLarge {...props} onClick={displayLarge}/>
}
- const View = ContentViews[contentView] || ContentViews['ViewServer']
+ let view;
+ if(contentView === "Edit") {
+ view = <Edit flow={flow} message={message} onChange={onContentChange}/>
+ } else {
+ view = <ViewServer flow={flow} message={message} contentView={contentView}/>
+ }
return (
<div className="contentview">
- <View flow={flow} message={message} contentView={contentView} readonly={readonly} onChange={onContentChange}/>
+ {view}
<ShowFullContentButton/>
</div>
)
diff --git a/web/src/js/components/ContentView/ContentLoader.jsx b/web/src/js/components/ContentView/ContentLoader.jsx
index 69e4a988..44716e12 100644
--- a/web/src/js/components/ContentView/ContentLoader.jsx
+++ b/web/src/js/components/ContentView/ContentLoader.jsx
@@ -55,7 +55,7 @@ export default function withContentLoader(View) {
return this.setState({request: undefined, content: ""})
}
- let requestUrl = MessageUtils.getContentURL(props.flow, props.message, (View.name == 'ViewServer' ? props.contentView : undefined))
+ let requestUrl = MessageUtils.getContentURL(props.flow, props.message, props.contentView)
// We use XMLHttpRequest instead of fetch() because fetch() is not (yet) abortable.
let request = new XMLHttpRequest();
diff --git a/web/src/js/components/ContentView/ContentViews.jsx b/web/src/js/components/ContentView/ContentViews.jsx
index dfae937e..387c940a 100644
--- a/web/src/js/components/ContentView/ContentViews.jsx
+++ b/web/src/js/components/ContentView/ContentViews.jsx
@@ -2,7 +2,7 @@ import React, { Component } from 'react'
import PropTypes from 'prop-types'
import { connect } from 'react-redux'
import { setContentViewDescription, setContent } from '../../ducks/ui/flow'
-import ContentLoader from './ContentLoader'
+import withContentLoader from './ContentLoader'
import { MessageUtils } from '../../flow/utils'
import CodeEditor from './CodeEditor'
@@ -28,7 +28,7 @@ Edit.propTypes = {
function Edit({ content, onChange }) {
return <CodeEditor content={content} onChange={onChange}/>
}
-Edit = ContentLoader(Edit)
+Edit = withContentLoader(Edit)
export class PureViewServer extends Component {
static propTypes = {
@@ -94,6 +94,6 @@ const ViewServer = connect(
setContentViewDescription,
setContent
}
-)(ContentLoader(PureViewServer))
+)(withContentLoader(PureViewServer))
export { Edit, ViewServer, ViewImage }
diff --git a/web/src/js/ducks/ui/flow.js b/web/src/js/ducks/ui/flow.js
index 51ad4184..ea31db19 100644
--- a/web/src/js/ducks/ui/flow.js
+++ b/web/src/js/ducks/ui/flow.js
@@ -148,7 +148,6 @@ export function setContent(content){
return { type: SET_CONTENT, content }
}
-export function stopEdit(data, modifiedFlow) {
- let diff = getDiff(data, modifiedFlow)
- return {type: flowsActions.UPDATE, data, diff }
+export function stopEdit(flow, modifiedFlow) {
+ return flowsActions.update(flow, getDiff(flow, modifiedFlow))
}
diff --git a/web/yarn.lock b/web/yarn.lock
index 54baf85e..f841e38b 100644
--- a/web/yarn.lock
+++ b/web/yarn.lock
@@ -2,6 +2,23 @@
# yarn lockfile v1
+"@gulp-sourcemaps/identity-map@1.X":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/identity-map/-/identity-map-1.0.1.tgz#cfa23bc5840f9104ce32a65e74db7e7a974bbee1"
+ dependencies:
+ acorn "^5.0.3"
+ css "^2.2.1"
+ normalize-path "^2.1.1"
+ source-map "^0.5.6"
+ through2 "^2.0.3"
+
+"@gulp-sourcemaps/map-sources@1.X":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz#890ae7c5d8c877f6d384860215ace9d7ec945bda"
+ dependencies:
+ normalize-path "^2.0.1"
+ through2 "^2.0.3"
+
JSONStream@^1.0.3:
version "1.3.0"
resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.0.tgz#680ab9ac6572a8a1a207e0b38721db1c77b215e5"
@@ -48,14 +65,10 @@ acorn-jsx@^3.0.0:
dependencies:
acorn "^3.0.4"
-acorn@4.0.4:
+acorn@4.X, acorn@^4.0.4:
version "4.0.4"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.4.tgz#17a8d6a7a6c4ef538b814ec9abac2779293bf30a"
-acorn@4.X, acorn@^4.0.4:
- version "4.0.11"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.11.tgz#edcda3bd937e7556410d42ed5860f67399c794c0"
-
acorn@^1.0.3:
version "1.2.2"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-1.2.2.tgz#c8ce27de0acc76d896d2b1fad3df588d9e82f014"
@@ -68,6 +81,10 @@ acorn@^3.0.4, acorn@^3.1.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
+acorn@^5.0.1, acorn@^5.0.3:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d"
+
ajv-keywords@^1.0.0:
version "1.5.1"
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
@@ -95,11 +112,15 @@ ansi-escapes@^1.1.0, ansi-escapes@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
+ansi-escapes@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b"
+
ansi-regex@^0.2.0, ansi-regex@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9"
-ansi-regex@^2.0.0:
+ansi-regex@^2.0.0, ansi-regex@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
@@ -243,7 +264,7 @@ async-each@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
-async@^1.4.0, async@^1.4.2:
+async@^1.4.0:
version "1.5.2"
resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
@@ -281,20 +302,20 @@ babel-code-frame@^6.16.0, babel-code-frame@^6.22.0:
esutils "^2.0.2"
js-tokens "^3.0.0"
-babel-core@^6.0.0, babel-core@^6.0.14, babel-core@^6.23.0, babel-core@^6.23.1:
- version "6.23.1"
- resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.23.1.tgz#c143cb621bb2f621710c220c5d579d15b8a442df"
+babel-core@^6.0.0, babel-core@^6.0.14, babel-core@^6.24.1, babel-core@^6.25.0:
+ version "6.25.0"
+ resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.25.0.tgz#7dd42b0463c742e9d5296deb3ec67a9322dad729"
dependencies:
babel-code-frame "^6.22.0"
- babel-generator "^6.23.0"
- babel-helpers "^6.23.0"
+ babel-generator "^6.25.0"
+ babel-helpers "^6.24.1"
babel-messages "^6.23.0"
- babel-register "^6.23.0"
+ babel-register "^6.24.1"
babel-runtime "^6.22.0"
- babel-template "^6.23.0"
- babel-traverse "^6.23.1"
- babel-types "^6.23.0"
- babylon "^6.11.0"
+ babel-template "^6.25.0"
+ babel-traverse "^6.25.0"
+ babel-types "^6.25.0"
+ babylon "^6.17.2"
convert-source-map "^1.1.0"
debug "^2.1.1"
json5 "^0.5.0"
@@ -305,120 +326,118 @@ babel-core@^6.0.0, babel-core@^6.0.14, babel-core@^6.23.0, babel-core@^6.23.1:
slash "^1.0.0"
source-map "^0.5.0"
-babel-eslint@^7.1.1:
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.1.1.tgz#8a6a884f085aa7060af69cfc77341c2f99370fb2"
+babel-eslint@^7.2.3:
+ version "7.2.3"
+ resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.2.3.tgz#b2fe2d80126470f5c19442dc757253a897710827"
dependencies:
- babel-code-frame "^6.16.0"
- babel-traverse "^6.15.0"
- babel-types "^6.15.0"
- babylon "^6.13.0"
- lodash.pickby "^4.6.0"
+ babel-code-frame "^6.22.0"
+ babel-traverse "^6.23.1"
+ babel-types "^6.23.0"
+ babylon "^6.17.0"
-babel-generator@^6.18.0, babel-generator@^6.23.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.23.0.tgz#6b8edab956ef3116f79d8c84c5a3c05f32a74bc5"
+babel-generator@^6.18.0, babel-generator@^6.25.0:
+ version "6.25.0"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc"
dependencies:
babel-messages "^6.23.0"
babel-runtime "^6.22.0"
- babel-types "^6.23.0"
+ babel-types "^6.25.0"
detect-indent "^4.0.0"
jsesc "^1.3.0"
lodash "^4.2.0"
source-map "^0.5.0"
trim-right "^1.0.1"
-babel-helper-builder-react-jsx@^6.23.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.23.0.tgz#d53fc8c996e0bc56d0de0fc4cc55a7138395ea4b"
+babel-helper-builder-react-jsx@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.24.1.tgz#0ad7917e33c8d751e646daca4e77cc19377d2cbc"
dependencies:
babel-runtime "^6.22.0"
- babel-types "^6.23.0"
+ babel-types "^6.24.1"
esutils "^2.0.0"
- lodash "^4.2.0"
-babel-helper-call-delegate@^6.22.0:
- version "6.22.0"
- resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.22.0.tgz#119921b56120f17e9dae3f74b4f5cc7bcc1b37ef"
+babel-helper-call-delegate@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
dependencies:
- babel-helper-hoist-variables "^6.22.0"
+ babel-helper-hoist-variables "^6.24.1"
babel-runtime "^6.22.0"
- babel-traverse "^6.22.0"
- babel-types "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
-babel-helper-define-map@^6.23.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.23.0.tgz#1444f960c9691d69a2ced6a205315f8fd00804e7"
+babel-helper-define-map@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080"
dependencies:
- babel-helper-function-name "^6.23.0"
+ babel-helper-function-name "^6.24.1"
babel-runtime "^6.22.0"
- babel-types "^6.23.0"
+ babel-types "^6.24.1"
lodash "^4.2.0"
-babel-helper-function-name@^6.22.0, babel-helper-function-name@^6.23.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.23.0.tgz#25742d67175c8903dbe4b6cb9d9e1fcb8dcf23a6"
+babel-helper-function-name@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
dependencies:
- babel-helper-get-function-arity "^6.22.0"
+ babel-helper-get-function-arity "^6.24.1"
babel-runtime "^6.22.0"
- babel-template "^6.23.0"
- babel-traverse "^6.23.0"
- babel-types "^6.23.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
-babel-helper-get-function-arity@^6.22.0:
- version "6.22.0"
- resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.22.0.tgz#0beb464ad69dc7347410ac6ade9f03a50634f5ce"
+babel-helper-get-function-arity@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
dependencies:
babel-runtime "^6.22.0"
- babel-types "^6.22.0"
+ babel-types "^6.24.1"
-babel-helper-hoist-variables@^6.22.0:
- version "6.22.0"
- resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.22.0.tgz#3eacbf731d80705845dd2e9718f600cfb9b4ba72"
+babel-helper-hoist-variables@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
dependencies:
babel-runtime "^6.22.0"
- babel-types "^6.22.0"
+ babel-types "^6.24.1"
-babel-helper-optimise-call-expression@^6.23.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.23.0.tgz#f3ee7eed355b4282138b33d02b78369e470622f5"
+babel-helper-optimise-call-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
dependencies:
babel-runtime "^6.22.0"
- babel-types "^6.23.0"
+ babel-types "^6.24.1"
-babel-helper-regex@^6.22.0:
- version "6.22.0"
- resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.22.0.tgz#79f532be1647b1f0ee3474b5f5c3da58001d247d"
+babel-helper-regex@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8"
dependencies:
babel-runtime "^6.22.0"
- babel-types "^6.22.0"
+ babel-types "^6.24.1"
lodash "^4.2.0"
-babel-helper-replace-supers@^6.22.0, babel-helper-replace-supers@^6.23.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.23.0.tgz#eeaf8ad9b58ec4337ca94223bacdca1f8d9b4bfd"
+babel-helper-replace-supers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
dependencies:
- babel-helper-optimise-call-expression "^6.23.0"
+ babel-helper-optimise-call-expression "^6.24.1"
babel-messages "^6.23.0"
babel-runtime "^6.22.0"
- babel-template "^6.23.0"
- babel-traverse "^6.23.0"
- babel-types "^6.23.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
-babel-helpers@^6.23.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.23.0.tgz#4f8f2e092d0b6a8808a4bde79c27f1e2ecf0d992"
+babel-helpers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
dependencies:
babel-runtime "^6.22.0"
- babel-template "^6.23.0"
+ babel-template "^6.24.1"
-babel-jest@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-19.0.0.tgz#59323ced99a3a84d359da219ca881074ffc6ce3f"
+babel-jest@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-20.0.3.tgz#e4a03b13dc10389e140fc645d09ffc4ced301671"
dependencies:
babel-core "^6.0.0"
babel-plugin-istanbul "^4.0.0"
- babel-preset-jest "^19.0.0"
+ babel-preset-jest "^20.0.3"
babel-messages@^6.23.0:
version "6.23.0"
@@ -440,9 +459,9 @@ babel-plugin-istanbul@^4.0.0:
istanbul-lib-instrument "^1.4.2"
test-exclude "^4.0.0"
-babel-plugin-jest-hoist@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-19.0.0.tgz#4ae2a04ea612a6e73651f3fde52c178991304bea"
+babel-plugin-jest-hoist@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz#afedc853bd3f8dc3548ea671fbe69d03cc2c1767"
babel-plugin-syntax-class-properties@^6.8.0:
version "6.13.0"
@@ -460,14 +479,14 @@ babel-plugin-syntax-object-rest-spread@^6.8.0:
version "6.13.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
-babel-plugin-transform-class-properties@^6.23.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.23.0.tgz#187b747ee404399013563c993db038f34754ac3b"
+babel-plugin-transform-class-properties@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac"
dependencies:
- babel-helper-function-name "^6.23.0"
+ babel-helper-function-name "^6.24.1"
babel-plugin-syntax-class-properties "^6.8.0"
babel-runtime "^6.22.0"
- babel-template "^6.23.0"
+ babel-template "^6.24.1"
babel-plugin-transform-es2015-arrow-functions@^6.22.0:
version "6.22.0"
@@ -481,36 +500,36 @@ babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
dependencies:
babel-runtime "^6.22.0"
-babel-plugin-transform-es2015-block-scoping@^6.22.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.23.0.tgz#e48895cf0b375be148cd7c8879b422707a053b51"
+babel-plugin-transform-es2015-block-scoping@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576"
dependencies:
babel-runtime "^6.22.0"
- babel-template "^6.23.0"
- babel-traverse "^6.23.0"
- babel-types "^6.23.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
lodash "^4.2.0"
-babel-plugin-transform-es2015-classes@^6.22.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.23.0.tgz#49b53f326202a2fd1b3bbaa5e2edd8a4f78643c1"
+babel-plugin-transform-es2015-classes@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
dependencies:
- babel-helper-define-map "^6.23.0"
- babel-helper-function-name "^6.23.0"
- babel-helper-optimise-call-expression "^6.23.0"
- babel-helper-replace-supers "^6.23.0"
+ babel-helper-define-map "^6.24.1"
+ babel-helper-function-name "^6.24.1"
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-helper-replace-supers "^6.24.1"
babel-messages "^6.23.0"
babel-runtime "^6.22.0"
- babel-template "^6.23.0"
- babel-traverse "^6.23.0"
- babel-types "^6.23.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
-babel-plugin-transform-es2015-computed-properties@^6.22.0:
- version "6.22.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.22.0.tgz#7c383e9629bba4820c11b0425bdd6290f7f057e7"
+babel-plugin-transform-es2015-computed-properties@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
dependencies:
babel-runtime "^6.22.0"
- babel-template "^6.22.0"
+ babel-template "^6.24.1"
babel-plugin-transform-es2015-destructuring@^6.22.0:
version "6.23.0"
@@ -518,12 +537,12 @@ babel-plugin-transform-es2015-destructuring@^6.22.0:
dependencies:
babel-runtime "^6.22.0"
-babel-plugin-transform-es2015-duplicate-keys@^6.22.0:
- version "6.22.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.22.0.tgz#672397031c21610d72dd2bbb0ba9fb6277e1c36b"
+babel-plugin-transform-es2015-duplicate-keys@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
dependencies:
babel-runtime "^6.22.0"
- babel-types "^6.22.0"
+ babel-types "^6.24.1"
babel-plugin-transform-es2015-for-of@^6.22.0:
version "6.23.0"
@@ -531,13 +550,13 @@ babel-plugin-transform-es2015-for-of@^6.22.0:
dependencies:
babel-runtime "^6.22.0"
-babel-plugin-transform-es2015-function-name@^6.22.0:
- version "6.22.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.22.0.tgz#f5fcc8b09093f9a23c76ac3d9e392c3ec4b77104"
+babel-plugin-transform-es2015-function-name@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
dependencies:
- babel-helper-function-name "^6.22.0"
+ babel-helper-function-name "^6.24.1"
babel-runtime "^6.22.0"
- babel-types "^6.22.0"
+ babel-types "^6.24.1"
babel-plugin-transform-es2015-literals@^6.22.0:
version "6.22.0"
@@ -545,63 +564,63 @@ babel-plugin-transform-es2015-literals@^6.22.0:
dependencies:
babel-runtime "^6.22.0"
-babel-plugin-transform-es2015-modules-amd@^6.22.0:
- version "6.22.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.22.0.tgz#bf69cd34889a41c33d90dfb740e0091ccff52f21"
+babel-plugin-transform-es2015-modules-amd@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
dependencies:
- babel-plugin-transform-es2015-modules-commonjs "^6.22.0"
+ babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
babel-runtime "^6.22.0"
- babel-template "^6.22.0"
+ babel-template "^6.24.1"
-babel-plugin-transform-es2015-modules-commonjs@^6.22.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.23.0.tgz#cba7aa6379fb7ec99250e6d46de2973aaffa7b92"
+babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe"
dependencies:
- babel-plugin-transform-strict-mode "^6.22.0"
+ babel-plugin-transform-strict-mode "^6.24.1"
babel-runtime "^6.22.0"
- babel-template "^6.23.0"
- babel-types "^6.23.0"
+ babel-template "^6.24.1"
+ babel-types "^6.24.1"
-babel-plugin-transform-es2015-modules-systemjs@^6.22.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.23.0.tgz#ae3469227ffac39b0310d90fec73bfdc4f6317b0"
+babel-plugin-transform-es2015-modules-systemjs@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
dependencies:
- babel-helper-hoist-variables "^6.22.0"
+ babel-helper-hoist-variables "^6.24.1"
babel-runtime "^6.22.0"
- babel-template "^6.23.0"
+ babel-template "^6.24.1"
-babel-plugin-transform-es2015-modules-umd@^6.22.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.23.0.tgz#8d284ae2e19ed8fe21d2b1b26d6e7e0fcd94f0f1"
+babel-plugin-transform-es2015-modules-umd@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
dependencies:
- babel-plugin-transform-es2015-modules-amd "^6.22.0"
+ babel-plugin-transform-es2015-modules-amd "^6.24.1"
babel-runtime "^6.22.0"
- babel-template "^6.23.0"
+ babel-template "^6.24.1"
-babel-plugin-transform-es2015-object-super@^6.22.0:
- version "6.22.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.22.0.tgz#daa60e114a042ea769dd53fe528fc82311eb98fc"
+babel-plugin-transform-es2015-object-super@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
dependencies:
- babel-helper-replace-supers "^6.22.0"
+ babel-helper-replace-supers "^6.24.1"
babel-runtime "^6.22.0"
-babel-plugin-transform-es2015-parameters@^6.22.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.23.0.tgz#3a2aabb70c8af945d5ce386f1a4250625a83ae3b"
+babel-plugin-transform-es2015-parameters@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
dependencies:
- babel-helper-call-delegate "^6.22.0"
- babel-helper-get-function-arity "^6.22.0"
+ babel-helper-call-delegate "^6.24.1"
+ babel-helper-get-function-arity "^6.24.1"
babel-runtime "^6.22.0"
- babel-template "^6.23.0"
- babel-traverse "^6.23.0"
- babel-types "^6.23.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
-babel-plugin-transform-es2015-shorthand-properties@^6.22.0:
- version "6.22.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.22.0.tgz#8ba776e0affaa60bff21e921403b8a652a2ff723"
+babel-plugin-transform-es2015-shorthand-properties@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
dependencies:
babel-runtime "^6.22.0"
- babel-types "^6.22.0"
+ babel-types "^6.24.1"
babel-plugin-transform-es2015-spread@^6.22.0:
version "6.22.0"
@@ -609,13 +628,13 @@ babel-plugin-transform-es2015-spread@^6.22.0:
dependencies:
babel-runtime "^6.22.0"
-babel-plugin-transform-es2015-sticky-regex@^6.22.0:
- version "6.22.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.22.0.tgz#ab316829e866ee3f4b9eb96939757d19a5bc4593"
+babel-plugin-transform-es2015-sticky-regex@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
dependencies:
- babel-helper-regex "^6.22.0"
+ babel-helper-regex "^6.24.1"
babel-runtime "^6.22.0"
- babel-types "^6.22.0"
+ babel-types "^6.24.1"
babel-plugin-transform-es2015-template-literals@^6.22.0:
version "6.22.0"
@@ -629,11 +648,11 @@ babel-plugin-transform-es2015-typeof-symbol@^6.22.0:
dependencies:
babel-runtime "^6.22.0"
-babel-plugin-transform-es2015-unicode-regex@^6.22.0:
- version "6.22.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.22.0.tgz#8d9cc27e7ee1decfe65454fb986452a04a613d20"
+babel-plugin-transform-es2015-unicode-regex@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
dependencies:
- babel-helper-regex "^6.22.0"
+ babel-helper-regex "^6.24.1"
babel-runtime "^6.22.0"
regexpu-core "^2.0.0"
@@ -671,55 +690,55 @@ babel-plugin-transform-react-jsx-source@^6.22.0:
babel-plugin-syntax-jsx "^6.8.0"
babel-runtime "^6.22.0"
-babel-plugin-transform-react-jsx@^6.23.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.23.0.tgz#23e892f7f2e759678eb5e4446a8f8e94e81b3470"
+babel-plugin-transform-react-jsx@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3"
dependencies:
- babel-helper-builder-react-jsx "^6.23.0"
+ babel-helper-builder-react-jsx "^6.24.1"
babel-plugin-syntax-jsx "^6.8.0"
babel-runtime "^6.22.0"
-babel-plugin-transform-regenerator@^6.22.0:
- version "6.22.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.22.0.tgz#65740593a319c44522157538d690b84094617ea6"
+babel-plugin-transform-regenerator@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418"
dependencies:
- regenerator-transform "0.9.8"
+ regenerator-transform "0.9.11"
-babel-plugin-transform-strict-mode@^6.22.0:
- version "6.22.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.22.0.tgz#e008df01340fdc87e959da65991b7e05970c8c7c"
+babel-plugin-transform-strict-mode@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
dependencies:
babel-runtime "^6.22.0"
- babel-types "^6.22.0"
+ babel-types "^6.24.1"
-babel-preset-es2015@^6.22.0:
- version "6.22.0"
- resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.22.0.tgz#af5a98ecb35eb8af764ad8a5a05eb36dc4386835"
+babel-preset-es2015@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939"
dependencies:
babel-plugin-check-es2015-constants "^6.22.0"
babel-plugin-transform-es2015-arrow-functions "^6.22.0"
babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
- babel-plugin-transform-es2015-block-scoping "^6.22.0"
- babel-plugin-transform-es2015-classes "^6.22.0"
- babel-plugin-transform-es2015-computed-properties "^6.22.0"
+ babel-plugin-transform-es2015-block-scoping "^6.24.1"
+ babel-plugin-transform-es2015-classes "^6.24.1"
+ babel-plugin-transform-es2015-computed-properties "^6.24.1"
babel-plugin-transform-es2015-destructuring "^6.22.0"
- babel-plugin-transform-es2015-duplicate-keys "^6.22.0"
+ babel-plugin-transform-es2015-duplicate-keys "^6.24.1"
babel-plugin-transform-es2015-for-of "^6.22.0"
- babel-plugin-transform-es2015-function-name "^6.22.0"
+ babel-plugin-transform-es2015-function-name "^6.24.1"
babel-plugin-transform-es2015-literals "^6.22.0"
- babel-plugin-transform-es2015-modules-amd "^6.22.0"
- babel-plugin-transform-es2015-modules-commonjs "^6.22.0"
- babel-plugin-transform-es2015-modules-systemjs "^6.22.0"
- babel-plugin-transform-es2015-modules-umd "^6.22.0"
- babel-plugin-transform-es2015-object-super "^6.22.0"
- babel-plugin-transform-es2015-parameters "^6.22.0"
- babel-plugin-transform-es2015-shorthand-properties "^6.22.0"
+ babel-plugin-transform-es2015-modules-amd "^6.24.1"
+ babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+ babel-plugin-transform-es2015-modules-systemjs "^6.24.1"
+ babel-plugin-transform-es2015-modules-umd "^6.24.1"
+ babel-plugin-transform-es2015-object-super "^6.24.1"
+ babel-plugin-transform-es2015-parameters "^6.24.1"
+ babel-plugin-transform-es2015-shorthand-properties "^6.24.1"
babel-plugin-transform-es2015-spread "^6.22.0"
- babel-plugin-transform-es2015-sticky-regex "^6.22.0"
+ babel-plugin-transform-es2015-sticky-regex "^6.24.1"
babel-plugin-transform-es2015-template-literals "^6.22.0"
babel-plugin-transform-es2015-typeof-symbol "^6.22.0"
- babel-plugin-transform-es2015-unicode-regex "^6.22.0"
- babel-plugin-transform-regenerator "^6.22.0"
+ babel-plugin-transform-es2015-unicode-regex "^6.24.1"
+ babel-plugin-transform-regenerator "^6.24.1"
babel-preset-flow@^6.23.0:
version "6.23.0"
@@ -727,28 +746,28 @@ babel-preset-flow@^6.23.0:
dependencies:
babel-plugin-transform-flow-strip-types "^6.22.0"
-babel-preset-jest@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-19.0.0.tgz#22d67201d02324a195811288eb38294bb3cac396"
+babel-preset-jest@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz#cbacaadecb5d689ca1e1de1360ebfc66862c178a"
dependencies:
- babel-plugin-jest-hoist "^19.0.0"
+ babel-plugin-jest-hoist "^20.0.3"
-babel-preset-react@^6.23.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.23.0.tgz#eb7cee4de98a3f94502c28565332da9819455195"
+babel-preset-react@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380"
dependencies:
babel-plugin-syntax-jsx "^6.3.13"
babel-plugin-transform-react-display-name "^6.23.0"
- babel-plugin-transform-react-jsx "^6.23.0"
+ babel-plugin-transform-react-jsx "^6.24.1"
babel-plugin-transform-react-jsx-self "^6.22.0"
babel-plugin-transform-react-jsx-source "^6.22.0"
babel-preset-flow "^6.23.0"
-babel-register@^6.23.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.23.0.tgz#c9aa3d4cca94b51da34826c4a0f9e08145d74ff3"
+babel-register@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f"
dependencies:
- babel-core "^6.23.0"
+ babel-core "^6.24.1"
babel-runtime "^6.22.0"
core-js "^2.4.0"
home-or-tmp "^2.0.0"
@@ -763,33 +782,33 @@ babel-runtime@^6.18.0, babel-runtime@^6.22.0:
core-js "^2.4.0"
regenerator-runtime "^0.10.0"
-babel-template@^6.16.0, babel-template@^6.22.0, babel-template@^6.23.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.23.0.tgz#04d4f270adbb3aa704a8143ae26faa529238e638"
+babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.25.0:
+ version "6.25.0"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071"
dependencies:
babel-runtime "^6.22.0"
- babel-traverse "^6.23.0"
- babel-types "^6.23.0"
- babylon "^6.11.0"
+ babel-traverse "^6.25.0"
+ babel-types "^6.25.0"
+ babylon "^6.17.2"
lodash "^4.2.0"
-babel-traverse@^6.15.0, babel-traverse@^6.18.0, babel-traverse@^6.22.0, babel-traverse@^6.23.0, babel-traverse@^6.23.1:
- version "6.23.1"
- resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.23.1.tgz#d3cb59010ecd06a97d81310065f966b699e14f48"
+babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-traverse@^6.25.0:
+ version "6.25.0"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1"
dependencies:
babel-code-frame "^6.22.0"
babel-messages "^6.23.0"
babel-runtime "^6.22.0"
- babel-types "^6.23.0"
- babylon "^6.15.0"
+ babel-types "^6.25.0"
+ babylon "^6.17.2"
debug "^2.2.0"
globals "^9.0.0"
invariant "^2.2.0"
lodash "^4.2.0"
-babel-types@^6.15.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.22.0, babel-types@^6.23.0:
- version "6.23.0"
- resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.23.0.tgz#bb17179d7538bad38cd0c9e115d340f77e7e9acf"
+babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24.1, babel-types@^6.25.0:
+ version "6.25.0"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e"
dependencies:
babel-runtime "^6.22.0"
esutils "^2.0.2"
@@ -803,14 +822,18 @@ babelify@^7.3.0:
babel-core "^6.0.14"
object-assign "^4.0.0"
-babylon@^6.11.0, babylon@^6.13.0, babylon@^6.15.0:
- version "6.15.0"
- resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.15.0.tgz#ba65cfa1a80e1759b0e89fb562e27dccae70348e"
+babylon@^6.13.0, babylon@^6.17.0, babylon@^6.17.2:
+ version "6.17.3"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.3.tgz#1327d709950b558f204e5352587fd0290f8d8e48"
balanced-match@^0.4.1:
version "0.4.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
+balanced-match@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
base64-js@^1.0.2:
version "1.2.0"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1"
@@ -877,6 +900,13 @@ brace-expansion@^1.0.0:
balanced-match "^0.4.1"
concat-map "0.0.1"
+brace-expansion@^1.1.7:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292"
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
braces@^1.8.2:
version "1.8.5"
resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
@@ -956,9 +986,9 @@ browserify-zlib@~0.1.2:
dependencies:
pako "~0.2.0"
-browserify@^14.0.0, browserify@^14.1.0:
- version "14.1.0"
- resolved "https://registry.yarnpkg.com/browserify/-/browserify-14.1.0.tgz#0508cc1e7bf4c152312c2fa523e676c0b0b92311"
+browserify@^14.0.0, browserify@^14.4.0:
+ version "14.4.0"
+ resolved "https://registry.yarnpkg.com/browserify/-/browserify-14.4.0.tgz#089a3463af58d0e48d8cd4070b3f74654d5abca9"
dependencies:
JSONStream "^1.0.3"
assert "^1.4.0"
@@ -979,7 +1009,7 @@ browserify@^14.0.0, browserify@^14.1.0:
glob "^7.1.0"
has "^1.0.0"
htmlescape "^1.1.0"
- https-browserify "~0.0.0"
+ https-browserify "^1.0.0"
inherits "~2.0.1"
insert-module-globals "^7.0.0"
labeled-stream-splicer "^2.0.0"
@@ -997,7 +1027,7 @@ browserify@^14.0.0, browserify@^14.1.0:
shell-quote "^1.6.1"
stream-browserify "^2.0.0"
stream-http "^2.0.0"
- string_decoder "~0.10.0"
+ string_decoder "~1.0.0"
subarg "^1.0.0"
syntax-error "^1.1.1"
through2 "^2.0.0"
@@ -1158,9 +1188,9 @@ classnames@^2.2.5:
version "2.2.5"
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d"
-clean-css@^4.0.7:
- version "4.0.7"
- resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.0.7.tgz#d8fa8b4d87a125f38fa3d64afc59abfc68ba7790"
+clean-css@4.1.3:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.3.tgz#07cfe8980edb20d455ddc23aadcf1e04c6e509ce"
dependencies:
source-map "0.5.x"
@@ -1170,6 +1200,12 @@ cli-cursor@^1.0.1:
dependencies:
restore-cursor "^1.0.1"
+cli-cursor@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
+ dependencies:
+ restore-cursor "^2.0.0"
+
cli-width@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a"
@@ -1249,7 +1285,15 @@ concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
-concat-stream@^1.4.6, concat-stream@~1.5.0, concat-stream@~1.5.1:
+concat-stream@^1.4.6, concat-stream@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
+ dependencies:
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+concat-stream@~1.5.0, concat-stream@~1.5.1:
version "1.5.2"
resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266"
dependencies:
@@ -1283,7 +1327,7 @@ convert-source-map@1.X, convert-source-map@^1.1.0, convert-source-map@~1.1.0:
version "1.1.3"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860"
-convert-source-map@^1.2.0:
+convert-source-map@^1.2.0, convert-source-map@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.4.0.tgz#e3dad195bf61bfe13a7a3c73e9876ec14a0268f3"
@@ -1322,6 +1366,14 @@ create-hmac@^1.1.0, create-hmac@^1.1.2:
create-hash "^1.1.0"
inherits "^2.0.1"
+create-react-class@^15.5.1, create-react-class@^15.5.3:
+ version "15.5.3"
+ resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.5.3.tgz#fb0f7cae79339e9a179e194ef466efa3923820fe"
+ dependencies:
+ fbjs "^0.8.9"
+ loose-envify "^1.3.1"
+ object-assign "^4.1.1"
+
cryptiles@2.x.x:
version "2.0.5"
resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
@@ -1343,7 +1395,7 @@ crypto-browserify@^3.0.0:
public-encrypt "^4.0.0"
randombytes "^2.0.0"
-css@2.X:
+css@2.X, css@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/css/-/css-2.2.1.tgz#73a4c81de85db664d4ee674f7d47085e3b2d55dc"
dependencies:
@@ -1395,15 +1447,20 @@ dateformat@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17"
-debug-fabulous@0.0.X:
- version "0.0.4"
- resolved "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-0.0.4.tgz#fa071c5d87484685424807421ca4b16b0b1a0763"
+debug-fabulous@0.1.X:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-0.1.0.tgz#ad0ea07a5d519324fb55842a8f34ee59c7f8ff6c"
dependencies:
debug "2.X"
- lazy-debug-legacy "0.0.X"
object-assign "4.1.0"
-debug@2.X, debug@^2.1.0, debug@^2.1.1, debug@^2.2.0:
+debug@2.X, debug@^2.1.0, debug@^2.2.0, debug@^2.6.3, debug@^2.6.8:
+ version "2.6.8"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc"
+ dependencies:
+ ms "2.0.0"
+
+debug@^2.1.1:
version "2.6.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351"
dependencies:
@@ -1419,9 +1476,9 @@ decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
-deep-diff@0.3.4:
- version "0.3.4"
- resolved "https://registry.yarnpkg.com/deep-diff/-/deep-diff-0.3.4.tgz#aac5c39952236abe5f037a2349060ba01b00ae48"
+deep-diff@^0.3.5:
+ version "0.3.8"
+ resolved "https://registry.yarnpkg.com/deep-diff/-/deep-diff-0.3.8.tgz#c01de63efb0eec9798801d40c7e0dae25b582c84"
deep-extend@~0.4.0:
version "0.4.1"
@@ -1514,7 +1571,7 @@ detective@^4.0.0:
acorn "^3.1.0"
defined "^1.0.0"
-diff@^3.0.0:
+diff@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9"
@@ -1533,6 +1590,13 @@ doctrine@^1.2.2:
esutils "^2.0.2"
isarray "^1.0.0"
+doctrine@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63"
+ dependencies:
+ esutils "^2.0.2"
+ isarray "^1.0.0"
+
domain-browser@~1.1.0:
version "1.1.7"
resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
@@ -1679,7 +1743,14 @@ escope@^3.6.0:
esrecurse "^4.1.0"
estraverse "^4.1.1"
-eslint@^3.0.0, eslint@^3.16.0:
+eslint-scope@^3.7.1:
+ version "3.7.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
+ dependencies:
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+eslint@^3.0.0:
version "3.16.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.16.0.tgz#4a468ab93618a9eb6e3f1499038b38851f828630"
dependencies:
@@ -1718,11 +1789,48 @@ eslint@^3.0.0, eslint@^3.16.0:
text-table "~0.2.0"
user-home "^2.0.0"
-espree@^3.4.0:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.0.tgz#41656fa5628e042878025ef467e78f125cb86e1d"
+eslint@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.0.0.tgz#7277c01437fdf41dccd168d5aa0e49b75ca1f260"
dependencies:
- acorn "4.0.4"
+ babel-code-frame "^6.22.0"
+ chalk "^1.1.3"
+ concat-stream "^1.6.0"
+ debug "^2.6.8"
+ doctrine "^2.0.0"
+ eslint-scope "^3.7.1"
+ espree "^3.4.3"
+ esquery "^1.0.0"
+ estraverse "^4.2.0"
+ esutils "^2.0.2"
+ file-entry-cache "^2.0.0"
+ glob "^7.1.2"
+ globals "^9.17.0"
+ ignore "^3.3.3"
+ imurmurhash "^0.1.4"
+ inquirer "^3.0.6"
+ is-my-json-valid "^2.16.0"
+ is-resolvable "^1.0.0"
+ js-yaml "^3.8.4"
+ json-stable-stringify "^1.0.1"
+ levn "^0.3.0"
+ lodash "^4.17.4"
+ mkdirp "^0.5.1"
+ natural-compare "^1.4.0"
+ optionator "^0.8.2"
+ path-is-inside "^1.0.2"
+ pluralize "^4.0.0"
+ progress "^2.0.0"
+ require-uncached "^1.0.3"
+ strip-json-comments "~2.0.1"
+ table "^4.0.1"
+ text-table "~0.2.0"
+
+espree@^3.4.0, espree@^3.4.3:
+ version "3.4.3"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.3.tgz#2910b5ccd49ce893c2ffffaab4fd8b3a31b82374"
+ dependencies:
+ acorn "^5.0.1"
acorn-jsx "^3.0.0"
esprima@^2.7.1:
@@ -1733,6 +1841,12 @@ esprima@^3.1.1, esprima@~3.1.0:
version "3.1.3"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
+esquery@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa"
+ dependencies:
+ estraverse "^4.0.0"
+
esrecurse@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220"
@@ -1744,7 +1858,7 @@ estraverse@^1.9.1:
version "1.9.3"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44"
-estraverse@^4.1.1, estraverse@^4.2.0:
+estraverse@^4.0.0, estraverse@^4.1.1, estraverse@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
@@ -1821,6 +1935,14 @@ extend@^3.0.0, extend@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4"
+external-editor@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972"
+ dependencies:
+ iconv-lite "^0.4.17"
+ jschardet "^1.4.2"
+ tmp "^0.0.31"
+
extglob@^0.3.1:
version "0.3.2"
resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
@@ -1879,6 +2001,12 @@ figures@^1.3.5:
escape-string-regexp "^1.0.5"
object-assign "^4.1.0"
+figures@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
+ dependencies:
+ escape-string-regexp "^1.0.5"
+
file-entry-cache@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
@@ -2112,7 +2240,18 @@ glob@^4.3.1:
minimatch "^2.0.1"
once "^1.3.0"
-glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.0:
+glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@^7.1.0:
version "7.1.1"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
dependencies:
@@ -2147,9 +2286,9 @@ global-prefix@^0.1.4:
is-windows "^0.2.0"
which "^1.2.12"
-globals@^9.0.0, globals@^9.14.0:
- version "9.16.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-9.16.0.tgz#63e903658171ec2d9f51b1d31de5e2b8dc01fb80"
+globals@^9.0.0, globals@^9.14.0, globals@^9.17.0:
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
globby@^5.0.0:
version "5.0.0"
@@ -2176,7 +2315,7 @@ glogg@^1.0.0:
dependencies:
sparkles "^1.0.0"
-graceful-fs@4.X, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
+graceful-fs@4.X, graceful-fs@^4.1.11, graceful-fs@^4.1.2:
version "4.1.11"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
@@ -2198,14 +2337,14 @@ growly@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
-gulp-clean-css@^3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/gulp-clean-css/-/gulp-clean-css-3.0.3.tgz#dcd6767413d51a9de9e4bc47b8ae7e02b43b1c4a"
+gulp-clean-css@^3.4.1:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/gulp-clean-css/-/gulp-clean-css-3.4.1.tgz#b61a449ea056c038b8dcdc857041b2382b09b0d5"
dependencies:
- clean-css "^4.0.7"
- gulp-util "^3.0.8"
- through2 "^2.0.3"
- vinyl-sourcemaps-apply "^0.2.1"
+ clean-css "4.1.3"
+ gulp-util "3.0.8"
+ through2 "2.0.3"
+ vinyl-sourcemaps-apply "0.2.1"
gulp-eslint@^3.0.1:
version "3.0.1"
@@ -2266,35 +2405,24 @@ gulp-rename@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.2.2.tgz#3ad4428763f05e2764dec1c67d868db275687817"
-gulp-sourcemaps@^2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-2.4.1.tgz#8f65dc5c0d07b2fd5c88bc60ec7f13e56716bf74"
+gulp-sourcemaps@^2.6.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-2.6.0.tgz#7ccce899a8a3bfca1593a3348d0fbf41dd3f51e5"
dependencies:
+ "@gulp-sourcemaps/identity-map" "1.X"
+ "@gulp-sourcemaps/map-sources" "1.X"
acorn "4.X"
convert-source-map "1.X"
css "2.X"
- debug-fabulous "0.0.X"
+ debug-fabulous "0.1.X"
detect-newline "2.X"
graceful-fs "4.X"
source-map "0.X"
- strip-bom "3.X"
+ strip-bom-string "1.X"
through2 "2.X"
vinyl "1.X"
-gulp-util@^2.2.14:
- version "2.2.20"
- resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c"
- dependencies:
- chalk "^0.5.0"
- dateformat "^1.0.7-1.2.3"
- lodash._reinterpolate "^2.4.1"
- lodash.template "^2.4.1"
- minimist "^0.2.0"
- multipipe "^0.1.0"
- through2 "^0.5.0"
- vinyl "^0.2.1"
-
-gulp-util@^3, gulp-util@^3.0.0, gulp-util@^3.0.2, gulp-util@^3.0.6, gulp-util@^3.0.7, gulp-util@^3.0.8:
+gulp-util@3.0.8, gulp-util@^3, gulp-util@^3.0.0, gulp-util@^3.0.2, gulp-util@^3.0.6, gulp-util@^3.0.7, gulp-util@^3.0.8:
version "3.0.8"
resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f"
dependencies:
@@ -2317,6 +2445,19 @@ gulp-util@^3, gulp-util@^3.0.0, gulp-util@^3.0.2, gulp-util@^3.0.6, gulp-util@^3
through2 "^2.0.0"
vinyl "^0.5.0"
+gulp-util@^2.2.14:
+ version "2.2.20"
+ resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c"
+ dependencies:
+ chalk "^0.5.0"
+ dateformat "^1.0.7-1.2.3"
+ lodash._reinterpolate "^2.4.1"
+ lodash.template "^2.4.1"
+ minimist "^0.2.0"
+ multipipe "^0.1.0"
+ through2 "^0.5.0"
+ vinyl "^0.2.1"
+
gulp@^3.9.1:
version "3.9.1"
resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4"
@@ -2457,21 +2598,25 @@ http-signature@~1.1.0:
jsprim "^1.2.2"
sshpk "^1.7.0"
-https-browserify@~0.0.0:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82"
+https-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
-iconv-lite@0.4.13, iconv-lite@~0.4.13:
+iconv-lite@0.4.13:
version "0.4.13"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2"
+iconv-lite@^0.4.17, iconv-lite@~0.4.13:
+ version "0.4.17"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.17.tgz#4fdaa3b38acbc2c031b045d0edcdfe1ecab18c8d"
+
ieee754@^1.1.4:
version "1.1.8"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
-ignore@^3.2.0:
- version "3.2.4"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.4.tgz#4055e03596729a8fabe45a43c100ad5ed815c4e8"
+ignore@^3.2.0, ignore@^3.3.3:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d"
image-size@~0.5.0:
version "0.5.1"
@@ -2506,7 +2651,7 @@ inherits@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b"
-inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1:
+inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1:
version "2.0.3"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
@@ -2542,6 +2687,25 @@ inquirer@^0.12.0:
strip-ansi "^3.0.0"
through "^2.3.6"
+inquirer@^3.0.6:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.1.0.tgz#e05400d48b94937c2d3caa7038663ba9189aab01"
+ dependencies:
+ ansi-escapes "^2.0.0"
+ chalk "^1.0.0"
+ cli-cursor "^2.1.0"
+ cli-width "^2.0.0"
+ external-editor "^2.0.4"
+ figures "^2.0.0"
+ lodash "^4.3.0"
+ mute-stream "0.0.7"
+ run-async "^2.2.0"
+ rx-lite "^4.0.8"
+ rx-lite-aggregates "^4.0.8"
+ string-width "^2.0.0"
+ strip-ansi "^3.0.0"
+ through "^2.3.6"
+
insert-module-globals@^7.0.0:
version "7.0.1"
resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.0.1.tgz#c03bf4e01cb086d5b5e5ace8ad0afe7889d638c3"
@@ -2596,7 +2760,7 @@ is-builtin-module@^1.0.0:
dependencies:
builtin-modules "^1.0.0"
-is-ci@^1.0.9:
+is-ci@^1.0.10:
version "1.0.10"
resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e"
dependencies:
@@ -2642,9 +2806,9 @@ is-glob@^2.0.0, is-glob@^2.0.1:
dependencies:
is-extglob "^1.0.0"
-is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4:
- version "2.15.0"
- resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b"
+is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4, is-my-json-valid@^2.16.0:
+ version "2.16.0"
+ resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693"
dependencies:
generate-function "^2.0.0"
generate-object-property "^1.1.0"
@@ -2681,6 +2845,10 @@ is-primitive@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+is-promise@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
+
is-property@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
@@ -2752,33 +2920,37 @@ isstream@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
-istanbul-api@^1.1.0-alpha.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.1.tgz#d36e2f1560d1a43ce304c4ff7338182de61c8f73"
+istanbul-api@^1.1.1:
+ version "1.1.9"
+ resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.9.tgz#2827920d380d4286d857d57a2968a841db8a7ec8"
dependencies:
async "^2.1.4"
fileset "^2.0.2"
- istanbul-lib-coverage "^1.0.0"
- istanbul-lib-hook "^1.0.0"
- istanbul-lib-instrument "^1.3.0"
- istanbul-lib-report "^1.0.0-alpha.3"
- istanbul-lib-source-maps "^1.1.0"
- istanbul-reports "^1.0.0"
+ istanbul-lib-coverage "^1.1.1"
+ istanbul-lib-hook "^1.0.7"
+ istanbul-lib-instrument "^1.7.2"
+ istanbul-lib-report "^1.1.1"
+ istanbul-lib-source-maps "^1.2.1"
+ istanbul-reports "^1.1.1"
js-yaml "^3.7.0"
mkdirp "^0.5.1"
once "^1.4.0"
-istanbul-lib-coverage@^1.0.0, istanbul-lib-coverage@^1.0.0-alpha, istanbul-lib-coverage@^1.0.0-alpha.0:
+istanbul-lib-coverage@^1.0.0, istanbul-lib-coverage@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.1.tgz#f263efb519c051c5f1f3343034fc40e7b43ff212"
-istanbul-lib-hook@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.0.tgz#fc5367ee27f59268e8f060b0c7aaf051d9c425c5"
+istanbul-lib-coverage@^1.0.0-alpha.0, istanbul-lib-coverage@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da"
+
+istanbul-lib-hook@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz#dd6607f03076578fe7d6f2a630cf143b49bacddc"
dependencies:
append-transform "^0.4.0"
-istanbul-lib-instrument@^1.1.1, istanbul-lib-instrument@^1.3.0, istanbul-lib-instrument@^1.4.2:
+istanbul-lib-instrument@^1.4.2:
version "1.4.2"
resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.4.2.tgz#0e2fdfac93c1dabf2e31578637dc78a19089f43e"
dependencies:
@@ -2790,15 +2962,25 @@ istanbul-lib-instrument@^1.1.1, istanbul-lib-instrument@^1.3.0, istanbul-lib-ins
istanbul-lib-coverage "^1.0.0"
semver "^5.3.0"
-istanbul-lib-report@^1.0.0-alpha.3:
- version "1.0.0-alpha.3"
- resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.0.0-alpha.3.tgz#32d5f6ec7f33ca3a602209e278b2e6ff143498af"
+istanbul-lib-instrument@^1.7.2:
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.2.tgz#6014b03d3470fb77638d5802508c255c06312e56"
dependencies:
- async "^1.4.2"
- istanbul-lib-coverage "^1.0.0-alpha"
+ babel-generator "^6.18.0"
+ babel-template "^6.16.0"
+ babel-traverse "^6.18.0"
+ babel-types "^6.18.0"
+ babylon "^6.13.0"
+ istanbul-lib-coverage "^1.1.1"
+ semver "^5.3.0"
+
+istanbul-lib-report@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#f0e55f56655ffa34222080b7a0cd4760e1405fc9"
+ dependencies:
+ istanbul-lib-coverage "^1.1.1"
mkdirp "^0.5.1"
path-parse "^1.0.5"
- rimraf "^2.4.3"
supports-color "^3.1.2"
istanbul-lib-source-maps@^1.1.0:
@@ -2810,212 +2992,232 @@ istanbul-lib-source-maps@^1.1.0:
rimraf "^2.4.4"
source-map "^0.5.3"
-istanbul-reports@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.0.1.tgz#9a17176bc4a6cbebdae52b2f15961d52fa623fbc"
+istanbul-lib-source-maps@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz#a6fe1acba8ce08eebc638e572e294d267008aa0c"
+ dependencies:
+ debug "^2.6.3"
+ istanbul-lib-coverage "^1.1.1"
+ mkdirp "^0.5.1"
+ rimraf "^2.6.1"
+ source-map "^0.5.3"
+
+istanbul-reports@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.1.tgz#042be5c89e175bc3f86523caab29c014e77fee4e"
dependencies:
handlebars "^4.0.3"
-jest-changed-files@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-19.0.0.tgz#8c1a43a4ffccbcb8ae12e819104585adf2ed93a6"
+jest-changed-files@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-20.0.3.tgz#9394d5cc65c438406149bef1bf4d52b68e03e3f8"
-jest-cli@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-19.0.0.tgz#327398717a583bd5d5d97564eb3d762c514e97ff"
+jest-cli@^20.0.4:
+ version "20.0.4"
+ resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-20.0.4.tgz#e532b19d88ae5bc6c417e8b0593a6fe954b1dc93"
dependencies:
ansi-escapes "^1.4.0"
callsites "^2.0.0"
- chalk "^1.1.1"
- graceful-fs "^4.1.6"
- is-ci "^1.0.9"
- istanbul-api "^1.1.0-alpha.1"
- istanbul-lib-coverage "^1.0.0"
- istanbul-lib-instrument "^1.1.1"
- jest-changed-files "^19.0.0"
- jest-config "^19.0.0"
- jest-environment-jsdom "^19.0.0"
- jest-haste-map "^19.0.0"
- jest-jasmine2 "^19.0.0"
- jest-message-util "^19.0.0"
- jest-regex-util "^19.0.0"
- jest-resolve-dependencies "^19.0.0"
- jest-runtime "^19.0.0"
- jest-snapshot "^19.0.0"
- jest-util "^19.0.0"
+ chalk "^1.1.3"
+ graceful-fs "^4.1.11"
+ is-ci "^1.0.10"
+ istanbul-api "^1.1.1"
+ istanbul-lib-coverage "^1.0.1"
+ istanbul-lib-instrument "^1.4.2"
+ istanbul-lib-source-maps "^1.1.0"
+ jest-changed-files "^20.0.3"
+ jest-config "^20.0.4"
+ jest-docblock "^20.0.3"
+ jest-environment-jsdom "^20.0.3"
+ jest-haste-map "^20.0.4"
+ jest-jasmine2 "^20.0.4"
+ jest-message-util "^20.0.3"
+ jest-regex-util "^20.0.3"
+ jest-resolve-dependencies "^20.0.3"
+ jest-runtime "^20.0.4"
+ jest-snapshot "^20.0.3"
+ jest-util "^20.0.3"
micromatch "^2.3.11"
- node-notifier "^5.0.1"
+ node-notifier "^5.0.2"
+ pify "^2.3.0"
+ slash "^1.0.0"
string-length "^1.0.1"
throat "^3.0.0"
- which "^1.1.1"
+ which "^1.2.12"
worker-farm "^1.3.1"
- yargs "^6.3.0"
+ yargs "^7.0.2"
-jest-config@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-19.0.0.tgz#223db244d987afac1c99a955069d8fe89eea1457"
+jest-config@^20.0.4:
+ version "20.0.4"
+ resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-20.0.4.tgz#e37930ab2217c913605eff13e7bd763ec48faeea"
dependencies:
- chalk "^1.1.1"
- jest-environment-jsdom "^19.0.0"
- jest-environment-node "^19.0.0"
- jest-jasmine2 "^19.0.0"
- jest-regex-util "^19.0.0"
- jest-resolve "^19.0.0"
- jest-validate "^19.0.0"
- pretty-format "^19.0.0"
-
-jest-diff@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-19.0.0.tgz#d1563cfc56c8b60232988fbc05d4d16ed90f063c"
+ chalk "^1.1.3"
+ glob "^7.1.1"
+ jest-environment-jsdom "^20.0.3"
+ jest-environment-node "^20.0.3"
+ jest-jasmine2 "^20.0.4"
+ jest-matcher-utils "^20.0.3"
+ jest-regex-util "^20.0.3"
+ jest-resolve "^20.0.4"
+ jest-validate "^20.0.3"
+ pretty-format "^20.0.3"
+
+jest-diff@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-20.0.3.tgz#81f288fd9e675f0fb23c75f1c2b19445fe586617"
dependencies:
chalk "^1.1.3"
- diff "^3.0.0"
- jest-matcher-utils "^19.0.0"
- pretty-format "^19.0.0"
+ diff "^3.2.0"
+ jest-matcher-utils "^20.0.3"
+ pretty-format "^20.0.3"
-jest-environment-jsdom@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-19.0.0.tgz#c875ec276ed306c79ebad54bb5ab45b655ab9daf"
- dependencies:
- jest-mock "^19.0.0"
- jest-util "^19.0.0"
- jsdom "^9.11.0"
+jest-docblock@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-20.0.3.tgz#17bea984342cc33d83c50fbe1545ea0efaa44712"
-jest-environment-node@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-19.0.0.tgz#e7f0656dcb5fec6845fb6790a4c4ad1bdff09b70"
+jest-environment-jsdom@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz#048a8ac12ee225f7190417713834bb999787de99"
dependencies:
- jest-mock "^19.0.0"
- jest-util "^19.0.0"
+ jest-mock "^20.0.3"
+ jest-util "^20.0.3"
+ jsdom "^9.12.0"
-jest-file-exists@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/jest-file-exists/-/jest-file-exists-19.0.0.tgz#cca2e587a11ec92e24cfeab3f8a94d657f3fceb8"
+jest-environment-node@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-20.0.3.tgz#d488bc4612af2c246e986e8ae7671a099163d403"
+ dependencies:
+ jest-mock "^20.0.3"
+ jest-util "^20.0.3"
-jest-haste-map@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-19.0.0.tgz#adde00b62b1fe04432a104b3254fc5004514b55e"
+jest-haste-map@^20.0.4:
+ version "20.0.4"
+ resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-20.0.4.tgz#653eb55c889ce3c021f7b94693f20a4159badf03"
dependencies:
fb-watchman "^2.0.0"
- graceful-fs "^4.1.6"
+ graceful-fs "^4.1.11"
+ jest-docblock "^20.0.3"
micromatch "^2.3.11"
- sane "~1.5.0"
+ sane "~1.6.0"
worker-farm "^1.3.1"
-jest-jasmine2@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-19.0.0.tgz#0f82b06cddca20ae3c54e04940fb597866c0f667"
+jest-jasmine2@^20.0.4:
+ version "20.0.4"
+ resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz#fcc5b1411780d911d042902ef1859e852e60d5e1"
dependencies:
- graceful-fs "^4.1.6"
- jest-matcher-utils "^19.0.0"
- jest-matchers "^19.0.0"
- jest-message-util "^19.0.0"
- jest-snapshot "^19.0.0"
+ chalk "^1.1.3"
+ graceful-fs "^4.1.11"
+ jest-diff "^20.0.3"
+ jest-matcher-utils "^20.0.3"
+ jest-matchers "^20.0.3"
+ jest-message-util "^20.0.3"
+ jest-snapshot "^20.0.3"
+ once "^1.4.0"
+ p-map "^1.1.1"
-jest-matcher-utils@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-19.0.0.tgz#5ecd9b63565d2b001f61fbf7ec4c7f537964564d"
+jest-matcher-utils@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz#b3a6b8e37ca577803b0832a98b164f44b7815612"
dependencies:
chalk "^1.1.3"
- pretty-format "^19.0.0"
+ pretty-format "^20.0.3"
-jest-matchers@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-19.0.0.tgz#c74ecc6ebfec06f384767ba4d6fa4a42d6755754"
+jest-matchers@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-20.0.3.tgz#ca69db1c32db5a6f707fa5e0401abb55700dfd60"
dependencies:
- jest-diff "^19.0.0"
- jest-matcher-utils "^19.0.0"
- jest-message-util "^19.0.0"
- jest-regex-util "^19.0.0"
+ jest-diff "^20.0.3"
+ jest-matcher-utils "^20.0.3"
+ jest-message-util "^20.0.3"
+ jest-regex-util "^20.0.3"
-jest-message-util@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-19.0.0.tgz#721796b89c0e4d761606f9ba8cb828a3b6246416"
+jest-message-util@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-20.0.3.tgz#6aec2844306fcb0e6e74d5796c1006d96fdd831c"
dependencies:
- chalk "^1.1.1"
+ chalk "^1.1.3"
micromatch "^2.3.11"
+ slash "^1.0.0"
-jest-mock@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-19.0.0.tgz#67038641e9607ab2ce08ec4a8cb83aabbc899d01"
+jest-mock@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-20.0.3.tgz#8bc070e90414aa155c11a8d64c869a0d5c71da59"
-jest-regex-util@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-19.0.0.tgz#b7754587112aede1456510bb1f6afe74ef598691"
+jest-regex-util@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-20.0.3.tgz#85bbab5d133e44625b19faf8c6aa5122d085d762"
-jest-resolve-dependencies@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-19.0.0.tgz#a741ad1fa094140e64ecf2642a504f834ece22ee"
+jest-resolve-dependencies@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz#6e14a7b717af0f2cb3667c549de40af017b1723a"
dependencies:
- jest-file-exists "^19.0.0"
+ jest-regex-util "^20.0.3"
-jest-resolve@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-19.0.0.tgz#83e6166d58ad9e31c8503e54b215e30ca56cb5ae"
+jest-resolve@^20.0.4:
+ version "20.0.4"
+ resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-20.0.4.tgz#9448b3e8b6bafc15479444c6499045b7ffe597a5"
dependencies:
browser-resolve "^1.11.2"
- jest-haste-map "^19.0.0"
- resolve "^1.2.0"
+ is-builtin-module "^1.0.0"
+ resolve "^1.3.2"
-jest-runtime@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-19.0.0.tgz#66d06a3f5b52e86f31e4561afd62cc74cce9bc28"
+jest-runtime@^20.0.4:
+ version "20.0.4"
+ resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-20.0.4.tgz#a2c802219c4203f754df1404e490186169d124d8"
dependencies:
babel-core "^6.0.0"
- babel-jest "^19.0.0"
+ babel-jest "^20.0.3"
babel-plugin-istanbul "^4.0.0"
chalk "^1.1.3"
- graceful-fs "^4.1.6"
- jest-config "^19.0.0"
- jest-file-exists "^19.0.0"
- jest-haste-map "^19.0.0"
- jest-regex-util "^19.0.0"
- jest-resolve "^19.0.0"
- jest-util "^19.0.0"
+ convert-source-map "^1.4.0"
+ graceful-fs "^4.1.11"
+ jest-config "^20.0.4"
+ jest-haste-map "^20.0.4"
+ jest-regex-util "^20.0.3"
+ jest-resolve "^20.0.4"
+ jest-util "^20.0.3"
json-stable-stringify "^1.0.1"
micromatch "^2.3.11"
strip-bom "3.0.0"
- yargs "^6.3.0"
+ yargs "^7.0.2"
-jest-snapshot@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-19.0.0.tgz#1b6b2683a1132d7536e69c8e9753a8d3445bb8df"
+jest-snapshot@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-20.0.3.tgz#5b847e1adb1a4d90852a7f9f125086e187c76566"
dependencies:
chalk "^1.1.3"
- jest-diff "^19.0.0"
- jest-file-exists "^19.0.0"
- jest-matcher-utils "^19.0.0"
- jest-util "^19.0.0"
+ jest-diff "^20.0.3"
+ jest-matcher-utils "^20.0.3"
+ jest-util "^20.0.3"
natural-compare "^1.4.0"
- pretty-format "^19.0.0"
+ pretty-format "^20.0.3"
-jest-util@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-19.0.0.tgz#5d8b1b85b412537b1f9eb1e6599a9bdb10743cff"
+jest-util@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-20.0.3.tgz#0c07f7d80d82f4e5a67c6f8b9c3fe7f65cfd32ad"
dependencies:
- chalk "^1.1.1"
- graceful-fs "^4.1.6"
- jest-file-exists "^19.0.0"
- jest-message-util "^19.0.0"
- jest-mock "^19.0.0"
- jest-validate "^19.0.0"
- leven "^2.0.0"
+ chalk "^1.1.3"
+ graceful-fs "^4.1.11"
+ jest-message-util "^20.0.3"
+ jest-mock "^20.0.3"
+ jest-validate "^20.0.3"
+ leven "^2.1.0"
mkdirp "^0.5.1"
-jest-validate@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-19.0.0.tgz#8c6318a20ecfeaba0ba5378bfbb8277abded4173"
+jest-validate@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-20.0.3.tgz#d0cfd1de4f579f298484925c280f8f1d94ec3cab"
dependencies:
- chalk "^1.1.1"
- jest-matcher-utils "^19.0.0"
- leven "^2.0.0"
- pretty-format "^19.0.0"
+ chalk "^1.1.3"
+ jest-matcher-utils "^20.0.3"
+ leven "^2.1.0"
+ pretty-format "^20.0.3"
-jest@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/jest/-/jest-19.0.0.tgz#37680d4d8fb54dee7fe7b7c1c0a6203a2dbcbf23"
+jest@^20.0.4:
+ version "20.0.4"
+ resolved "https://registry.yarnpkg.com/jest/-/jest-20.0.4.tgz#3dd260c2989d6dad678b1e9cc4d91944f6d602ac"
dependencies:
- jest-cli "^19.0.0"
+ jest-cli "^20.0.4"
jodid25519@^1.0.0:
version "1.0.2"
@@ -3027,9 +3229,9 @@ js-tokens@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7"
-js-yaml@^3.5.1, js-yaml@^3.7.0:
- version "3.8.1"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.1.tgz#782ba50200be7b9e5a8537001b7804db3ad02628"
+js-yaml@^3.5.1, js-yaml@^3.7.0, js-yaml@^3.8.4:
+ version "3.8.4"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6"
dependencies:
argparse "^1.0.7"
esprima "^3.1.1"
@@ -3038,9 +3240,13 @@ jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
-jsdom@^9.11.0:
- version "9.11.0"
- resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.11.0.tgz#a95b0304e521a2ca5a63c6ea47bf7708a7a84591"
+jschardet@^1.4.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.4.2.tgz#2aa107f142af4121d145659d44f50830961e699a"
+
+jsdom@^9.12.0:
+ version "9.12.0"
+ resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4"
dependencies:
abab "^1.0.3"
acorn "^4.0.4"
@@ -3132,10 +3338,6 @@ lazy-cache@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
-lazy-debug-legacy@0.0.X:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/lazy-debug-legacy/-/lazy-debug-legacy-0.0.1.tgz#537716c0776e4cf79e3ed1b621f7658c2911b1b1"
-
lcid@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
@@ -3155,7 +3357,7 @@ lcid@^1.0.0:
request "^2.72.0"
source-map "^0.5.3"
-leven@^2.0.0:
+leven@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
@@ -3366,6 +3568,10 @@ lodash.isempty@^4.2.1:
version "4.4.0"
resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e"
+lodash.isequal@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
+
lodash.isobject@~2.4.1:
version "2.4.1"
resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5"
@@ -3380,7 +3586,7 @@ lodash.isstring@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
-lodash.keys@^3.0.0, lodash.keys@^3.1.2:
+lodash.keys@^3.0.0:
version "3.1.2"
resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
dependencies:
@@ -3416,10 +3622,6 @@ lodash.pick@^4.2.1:
version "4.4.0"
resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3"
-lodash.pickby@^4.6.0:
- version "4.6.0"
- resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff"
-
lodash.restparam@^3.0.0:
version "3.6.1"
resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
@@ -3499,7 +3701,7 @@ longest@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
-loose-envify@^1.0.0, loose-envify@^1.1.0:
+loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
dependencies:
@@ -3596,6 +3798,10 @@ mime@^1.2.11:
version "1.3.4"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53"
+mimic-fn@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18"
+
mini-lr@^0.1.8:
version "0.1.9"
resolved "https://registry.yarnpkg.com/mini-lr/-/mini-lr-0.1.9.tgz#02199d27347953d1fd1d6dbded4261f187b2d0f6"
@@ -3617,7 +3823,13 @@ minimatch@^2.0.1:
dependencies:
brace-expansion "^1.0.0"
-minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3:
+minimatch@^3.0.0, minimatch@^3.0.3, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimatch@^3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774"
dependencies:
@@ -3680,6 +3892,10 @@ ms@0.7.2:
version "0.7.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
multipipe@^0.1.0, multipipe@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b"
@@ -3690,6 +3906,10 @@ mute-stream@0.0.5:
version "0.0.5"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"
+mute-stream@0.0.7:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
+
nan@^2.3.0:
version "2.5.1"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.1.tgz#d5b01691253326a97a2bbee9e61c55d8d60351e2"
@@ -3713,7 +3933,7 @@ node-int64@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
-node-notifier@^5.0.1:
+node-notifier@^5.0.1, node-notifier@^5.0.2:
version "5.0.2"
resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.0.2.tgz#4438449fe69e321f941cef943986b0797032701b"
dependencies:
@@ -3757,9 +3977,11 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
semver "2 || 3 || 4 || 5"
validate-npm-package-license "^3.0.1"
-normalize-path@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a"
+normalize-path@^2.0.1, normalize-path@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ dependencies:
+ remove-trailing-separator "^1.0.1"
npmlog@^4.0.1:
version "4.0.2"
@@ -3790,7 +4012,7 @@ object-assign@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
-object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0:
+object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
@@ -3827,6 +4049,12 @@ onetime@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
+onetime@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
+ dependencies:
+ mimic-fn "^1.0.0"
+
optimist@^0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
@@ -3871,7 +4099,7 @@ os-locale@^1.4.0:
dependencies:
lcid "^1.0.0"
-os-tmpdir@^1.0.1:
+os-tmpdir@^1.0.1, os-tmpdir@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
@@ -3891,6 +4119,10 @@ p-locate@^2.0.0:
dependencies:
p-limit "^1.1.0"
+p-map@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.1.1.tgz#05f5e4ae97a068371bc2a5cc86bfbdbc19c4ae7a"
+
pako@~0.2.0:
version "0.2.9"
resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
@@ -3964,7 +4196,7 @@ path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
-path-is-inside@^1.0.1:
+path-is-inside@^1.0.1, path-is-inside@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
@@ -4010,7 +4242,7 @@ pegjs@^0.9.0:
version "0.9.0"
resolved "https://registry.yarnpkg.com/pegjs/-/pegjs-0.9.0.tgz#f6aefa2e3ce56169208e52179dfe41f89141a369"
-pify@^2.0.0:
+pify@^2.0.0, pify@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
@@ -4028,6 +4260,10 @@ pluralize@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45"
+pluralize@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-4.0.0.tgz#59b708c1c0190a2f692f1c7618c446b052fd1762"
+
prelude-ls@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
@@ -4036,10 +4272,11 @@ preserve@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
-pretty-format@^19.0.0:
- version "19.0.0"
- resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-19.0.0.tgz#56530d32acb98a3fa4851c4e2b9d37b420684c84"
+pretty-format@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-20.0.3.tgz#020e350a560a1fe1a98dc3beb6ccffb386de8b14"
dependencies:
+ ansi-regex "^2.1.1"
ansi-styles "^3.0.0"
pretty-hrtime@^1.0.0:
@@ -4062,17 +4299,22 @@ progress@^1.1.8:
version "1.1.8"
resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
+progress@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f"
+
promise@^7.1.1:
version "7.1.1"
resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf"
dependencies:
asap "~2.0.3"
-prop-types@^15.5.0, prop-types@~15.5.7:
- version "15.5.8"
- resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.8.tgz#6b7b2e141083be38c8595aa51fc55775c7199394"
+prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.7, prop-types@~15.5.7:
+ version "15.5.10"
+ resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.10.tgz#2797dfc3126182e3a95e3dfbb2e893ddd7456154"
dependencies:
fbjs "^0.8.9"
+ loose-envify "^1.3.1"
prr@~0.0.0:
version "0.0.0"
@@ -4144,20 +4386,23 @@ rc@~1.1.6:
minimist "^1.2.0"
strip-json-comments "~2.0.1"
-react-addons-test-utils@^15.4.2:
- version "15.4.2"
- resolved "https://registry.yarnpkg.com/react-addons-test-utils/-/react-addons-test-utils-15.4.2.tgz#93bcaa718fcae7360d42e8fb1c09756cc36302a2"
+react-addons-test-utils@^15.5.1:
+ version "15.5.1"
+ resolved "https://registry.yarnpkg.com/react-addons-test-utils/-/react-addons-test-utils-15.5.1.tgz#e0d258cda2a122ad0dff69f838260d0c3958f5f7"
dependencies:
fbjs "^0.8.4"
object-assign "^4.1.0"
-react-codemirror@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/react-codemirror/-/react-codemirror-0.3.0.tgz#cd6bd6ef458ec1e035cfd8b3fe7b30c8c7883c6c"
+react-codemirror@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/react-codemirror/-/react-codemirror-1.0.0.tgz#91467b53b1f5d80d916a2fd0b4c7adb85a9001ba"
dependencies:
classnames "^2.2.5"
codemirror "^5.18.2"
+ create-react-class "^15.5.1"
lodash.debounce "^4.0.8"
+ lodash.isequal "^4.5.0"
+ prop-types "^15.5.4"
react-dom@^15.4.2:
version "15.5.4"
@@ -4168,15 +4413,17 @@ react-dom@^15.4.2:
object-assign "^4.1.0"
prop-types "~15.5.7"
-react-redux@^5.0.2:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.0.2.tgz#3d9878f5f71c6fafcd45de1fbb162ea31f389814"
+react-redux@^5.0.5:
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.0.5.tgz#f8e8c7b239422576e52d6b7db06439469be9846a"
dependencies:
+ create-react-class "^15.5.3"
hoist-non-react-statics "^1.0.3"
invariant "^2.0.0"
lodash "^4.2.0"
lodash-es "^4.2.0"
loose-envify "^1.1.0"
+ prop-types "^15.5.10"
react-test-renderer@^15.5.4:
version "15.5.4"
@@ -4185,13 +4432,14 @@ react-test-renderer@^15.5.4:
fbjs "^0.8.9"
object-assign "^4.1.0"
-react@^15.4.2:
- version "15.4.2"
- resolved "https://registry.yarnpkg.com/react/-/react-15.4.2.tgz#41f7991b26185392ba9bae96c8889e7e018397ef"
+react@^15.5.4:
+ version "15.5.4"
+ resolved "https://registry.yarnpkg.com/react/-/react-15.5.4.tgz#fa83eb01506ab237cdc1c8c3b1cea8de012bf047"
dependencies:
- fbjs "^0.8.4"
+ fbjs "^0.8.9"
loose-envify "^1.1.0"
object-assign "^4.1.0"
+ prop-types "^15.5.7"
read-only-stream@^2.0.0:
version "2.0.0"
@@ -4223,7 +4471,7 @@ read-pkg@^1.0.0:
isarray "0.0.1"
string_decoder "~0.10.x"
-"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@^2.1.0, readable-stream@^2.1.5:
+"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@^2.1.0, readable-stream@^2.1.5, readable-stream@^2.2.2:
version "2.2.3"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.3.tgz#9cf49463985df016c8ae8813097a9293a9b33729"
dependencies:
@@ -4297,11 +4545,11 @@ redent@^1.0.0:
indent-string "^2.1.0"
strip-indent "^1.0.1"
-redux-logger@^2.8.1:
- version "2.8.1"
- resolved "https://registry.yarnpkg.com/redux-logger/-/redux-logger-2.8.1.tgz#c00e689ba00342f44858701d76b1d73fbade72bd"
+redux-logger@^3.0.6:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/redux-logger/-/redux-logger-3.0.6.tgz#f7555966f3098f3c88604c449cf0baf5778274bf"
dependencies:
- deep-diff "0.3.4"
+ deep-diff "^0.3.5"
redux-mock-store@^1.2.3:
version "1.2.3"
@@ -4328,9 +4576,9 @@ regenerator-runtime@^0.10.0:
version "0.10.3"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz#8c4367a904b51ea62a908ac310bf99ff90a82a3e"
-regenerator-transform@0.9.8:
- version "0.9.8"
- resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.8.tgz#0f88bb2bc03932ddb7b6b7312e68078f01026d6c"
+regenerator-transform@0.9.11:
+ version "0.9.11"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283"
dependencies:
babel-runtime "^6.18.0"
babel-types "^6.19.0"
@@ -4361,6 +4609,10 @@ regjsparser@^0.1.4:
dependencies:
jsesc "~0.5.0"
+remove-trailing-separator@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz#69b062d978727ad14dc6b56ba4ab772fd8d70511"
+
repeat-element@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
@@ -4412,7 +4664,7 @@ require-main-filename@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
-require-uncached@^1.0.2:
+require-uncached@^1.0.2, require-uncached@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
dependencies:
@@ -4438,10 +4690,16 @@ resolve@1.1.7:
version "1.1.7"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
-resolve@^1.1.3, resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.2.0:
+resolve@^1.1.3, resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7:
version "1.2.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.2.0.tgz#9589c3f2f6149d1417a40becc1663db6ec6bc26c"
+resolve@^1.3.2:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5"
+ dependencies:
+ path-parse "^1.0.5"
+
restore-cursor@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
@@ -4449,13 +4707,26 @@ restore-cursor@^1.0.1:
exit-hook "^1.0.0"
onetime "^1.0.0"
+restore-cursor@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
+ dependencies:
+ onetime "^2.0.0"
+ signal-exit "^3.0.2"
+
right-align@^0.1.1:
version "0.1.3"
resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
dependencies:
align-text "^0.1.1"
-rimraf@2, rimraf@^2.2.8, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@~2.5.1, rimraf@~2.5.4:
+rimraf@2, rimraf@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d"
+ dependencies:
+ glob "^7.0.5"
+
+rimraf@^2.2.8, rimraf@^2.4.4, rimraf@~2.5.1, rimraf@~2.5.4:
version "2.5.4"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04"
dependencies:
@@ -4471,13 +4742,33 @@ run-async@^0.1.0:
dependencies:
once "^1.3.0"
+run-async@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
+ dependencies:
+ is-promise "^2.1.0"
+
+rx-lite-aggregates@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be"
+ dependencies:
+ rx-lite "*"
+
+rx-lite@*, rx-lite@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
+
rx-lite@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102"
-sane@~1.5.0:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/sane/-/sane-1.5.0.tgz#a4adeae764d048621ecb27d5f9ecf513101939f3"
+safe-buffer@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7"
+
+sane@~1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/sane/-/sane-1.6.0.tgz#9610c452307a135d29c1fdfe2547034180c46775"
dependencies:
anymatch "^1.3.0"
exec-sh "^0.2.0"
@@ -4521,11 +4812,9 @@ sha.js@^2.3.6, sha.js@~2.4.4:
dependencies:
inherits "^2.0.1"
-shallowequal@^0.2.2:
- version "0.2.2"
- resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-0.2.2.tgz#1e32fd5bcab6ad688a4812cb0cc04efc75c7014e"
- dependencies:
- lodash.keys "^3.1.2"
+shallowequal@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.0.1.tgz#4349160418200bad3b82d723ded65f2354db2a23"
shasum@^1.0.0:
version "1.0.2"
@@ -4559,7 +4848,7 @@ sigmund@~1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
-signal-exit@^3.0.0:
+signal-exit@^3.0.0, signal-exit@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
@@ -4596,7 +4885,7 @@ source-map-url@~0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9"
-source-map@0.5.x, source-map@0.X, source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@~0.5.1, source-map@~0.5.3:
+source-map@0.5.x, source-map@0.X, source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3:
version "0.5.6"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
@@ -4727,10 +5016,16 @@ string-width@^2.0.0:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^3.0.0"
-string_decoder@~0.10.0, string_decoder@~0.10.x:
+string_decoder@~0.10.x:
version "0.10.31"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+string_decoder@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.2.tgz#b29e1f4e1125fa97a10382b8a533737b7491e179"
+ dependencies:
+ safe-buffer "~5.0.1"
+
stringstream@~0.0.4:
version "0.0.5"
resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
@@ -4747,7 +5042,11 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1:
dependencies:
ansi-regex "^2.0.0"
-strip-bom@3.0.0, strip-bom@3.X, strip-bom@^3.0.0:
+strip-bom-string@1.X:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92"
+
+strip-bom@3.0.0, strip-bom@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
@@ -4819,6 +5118,17 @@ table@^3.7.8:
slice-ansi "0.0.4"
string-width "^2.0.0"
+table@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/table/-/table-4.0.1.tgz#a8116c133fac2c61f4a420ab6cdf5c4d61f0e435"
+ dependencies:
+ ajv "^4.7.0"
+ ajv-keywords "^1.0.0"
+ chalk "^1.1.1"
+ lodash "^4.0.0"
+ slice-ansi "0.0.4"
+ string-width "^2.0.0"
+
tar-pack@~3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae"
@@ -4858,7 +5168,7 @@ throat@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/throat/-/throat-3.0.0.tgz#e7c64c867cbb3845f10877642f7b60055b8ec0d6"
-through2@2.X, through2@^2, through2@^2.0.0, through2@^2.0.3:
+through2@2.0.3, through2@2.X, through2@^2, through2@^2.0.0, through2@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
dependencies:
@@ -4906,6 +5216,12 @@ timers-browserify@^1.0.1:
dependencies:
process "~0.11.0"
+tmp@^0.0.31:
+ version "0.0.31"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7"
+ dependencies:
+ os-tmpdir "~1.0.1"
+
tmpl@1.0.x:
version "1.0.4"
resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
@@ -4965,7 +5281,7 @@ type-is@~1.6.10:
media-typer "0.3.0"
mime-types "~2.1.13"
-typedarray@~0.0.5:
+typedarray@^0.0.6, typedarray@~0.0.5:
version "0.0.6"
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
@@ -5097,7 +5413,7 @@ vinyl-source-stream@^1.1.0:
through2 "^0.6.1"
vinyl "^0.4.3"
-vinyl-sourcemaps-apply@^0.2.0, vinyl-sourcemaps-apply@^0.2.1:
+vinyl-sourcemaps-apply@0.2.1, vinyl-sourcemaps-apply@^0.2.0:
version "0.2.1"
resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705"
dependencies:
@@ -5203,7 +5519,7 @@ which-module@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
-which@^1.1.1, which@^1.2.12:
+which@^1.2.12:
version "1.2.12"
resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192"
dependencies:
@@ -5273,15 +5589,15 @@ y18n@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
-yargs-parser@^4.2.0:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c"
+yargs-parser@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a"
dependencies:
camelcase "^3.0.0"
-yargs@^6.3.0:
- version "6.6.0"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208"
+yargs@^7.0.2:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"
dependencies:
camelcase "^3.0.0"
cliui "^3.2.0"
@@ -5295,7 +5611,7 @@ yargs@^6.3.0:
string-width "^1.0.2"
which-module "^1.0.0"
y18n "^3.2.1"
- yargs-parser "^4.2.0"
+ yargs-parser "^5.0.0"
yargs@~3.10.0:
version "3.10.0"