diff --git a/packages/xod-tabtest/.gitignore b/packages/xod-tabtest/.gitignore new file mode 100644 index 00000000..d5100a5d --- /dev/null +++ b/packages/xod-tabtest/.gitignore @@ -0,0 +1,8 @@ +.DS_Store +.merlin +.bsb.lock +npm-debug.log +/lib/bs/ +/node_modules/ +node_modules +*.bs.js diff --git a/packages/xod-tabtest/README.md b/packages/xod-tabtest/README.md new file mode 100644 index 00000000..61982792 --- /dev/null +++ b/packages/xod-tabtest/README.md @@ -0,0 +1,23 @@ + +# xod-tabtest + +The package implements tabular test features for XOD patches. A patch may +include a `patch.test.tsv` spreadsheet file which defines several “input and +expected output” lines. + +Using that data the package can generate a C++ test suite based on +[Catch2](https://github.com/catchorg/catch2/) framework which can be compiled +then with a regular GCC and run. + +The package does not depend on any Node.js functionality, so may be consumed +from browser IDE, desktop IDE, or CLI. + +## File structure + +* `src/Tabtest_Js.re` defines public API for JavaScript consumers. +* `src/*.rei` define public API for ReasonML consumers. +* `src/XodYYY/*.re` are bindings to other packages implemented in JS. + They should eventually move elsewhere. +* `src/Holes/*.re` provide some basic functional programming helpers + that are (yet) missing in the standard + [Belt](https://bucklescript.github.io/bucklescript/api/Belt.html) library. diff --git a/packages/xod-tabtest/bsconfig.json b/packages/xod-tabtest/bsconfig.json new file mode 100644 index 00000000..e23d6f7e --- /dev/null +++ b/packages/xod-tabtest/bsconfig.json @@ -0,0 +1,28 @@ +// This is the configuration file used by BuckleScript's build system bsb. Its documentation lives here: http://bucklescript.github.io/bucklescript/docson/#build-schema.json +// BuckleScript comes with its own parser for bsconfig.json, which is normal JSON, with the extra support of comments and trailing commas. +{ + "name": "xod-tabtest", + "version": "0.19.2", + "sources": [ + { + "dir" : "src", + "subdirs" : true + }, + { + "dir" : "test", + "type" : "dev" + } + ], + "package-specs": { + "module": "commonjs" + }, + "suffix": ".bs.js", + "bs-dependencies": [ + ], + "bs-dev-dependencies": ["@glennsl/bs-jest"], + "warnings": { + "error" : "+101" + }, + "namespace": true, + "refmt": 3 +} diff --git a/packages/xod-tabtest/cpp/Arduino.cpp b/packages/xod-tabtest/cpp/Arduino.cpp new file mode 100644 index 00000000..4ed19149 --- /dev/null +++ b/packages/xod-tabtest/cpp/Arduino.cpp @@ -0,0 +1,10 @@ + +#include "Arduino.h" + +uint32_t millis() { + return 0; +} + +void delay(uint32_t) { + // no-op +} diff --git a/packages/xod-tabtest/cpp/Arduino.h b/packages/xod-tabtest/cpp/Arduino.h new file mode 100644 index 00000000..832b01e6 --- /dev/null +++ b/packages/xod-tabtest/cpp/Arduino.h @@ -0,0 +1,17 @@ + +#ifndef ARDUINO_H +#define ARDUINO_H + +#include // for size_t +#include // for uint32_t, etc +#include // for strlen +#include // for fcvt +#include + +void setup(); +void loop(); + +uint32_t millis(); +void delay(uint32_t); + +#endif diff --git a/packages/xod-tabtest/cpp/Makefile b/packages/xod-tabtest/cpp/Makefile new file mode 100644 index 00000000..feee772f --- /dev/null +++ b/packages/xod-tabtest/cpp/Makefile @@ -0,0 +1,19 @@ + +SRC:=$(wildcard *.cpp) +OBJ:=$(SRC:.cpp=.o) $(FRAMEWORK_SRC:.cpp=.o) + +CXX:=g++ +CXX_FLAGS:=-std=c++11 -I. + +%.o: %.cpp + $(CXX) $(CXX_FLAGS) -o $@ -c $< + +runTest: $(OBJ) + $(CXX) -o $@ $^ + +.PHONY: all +all: runTest + +.PHONY: test +test: runTest + ./runTest diff --git a/packages/xod-tabtest/cpp/main.cpp b/packages/xod-tabtest/cpp/main.cpp new file mode 100644 index 00000000..32217ad0 --- /dev/null +++ b/packages/xod-tabtest/cpp/main.cpp @@ -0,0 +1,3 @@ + +#define CATCH_CONFIG_MAIN +#include "catch.hpp" diff --git a/packages/xod-tabtest/package.json b/packages/xod-tabtest/package.json new file mode 100644 index 00000000..e374e465 --- /dev/null +++ b/packages/xod-tabtest/package.json @@ -0,0 +1,22 @@ +{ + "name": "xod-tabtest", + "version": "0.19.2", + "scripts": { + "refmt": "find src/ test/ -name '*.re*' -exec refmt --in-place {} +", + "build": "bsb -make-world", + "test": "jest" + }, + "keywords": [ + "BuckleScript" + ], + "author": "XOD", + "license": "AGPL-3.0", + "main": "lib/js/src/Tabtest_Js.bs.js", + "devDependencies": { + "@glennsl/bs-jest": "^0.4.2", + "bs-platform": "^2.2.3" + }, + "jest": { + "testMatch": ["**/lib/js/test/**/*_jest.bs.js"] + } +} diff --git a/packages/xod-tabtest/src/Holes/Holes.re b/packages/xod-tabtest/src/Holes/Holes.re new file mode 100644 index 00000000..dda65aa7 --- /dev/null +++ b/packages/xod-tabtest/src/Holes/Holes.re @@ -0,0 +1,5 @@ +module String = Holes_String; + +module Result = Holes_Result; + +module Map = Holes_Map; diff --git a/packages/xod-tabtest/src/Holes/Holes_Map.re b/packages/xod-tabtest/src/Holes/Holes_Map.re new file mode 100644 index 00000000..fcb52505 --- /dev/null +++ b/packages/xod-tabtest/src/Holes/Holes_Map.re @@ -0,0 +1 @@ +module String = Holes_Map_String; diff --git a/packages/xod-tabtest/src/Holes/Holes_Map_String.re b/packages/xod-tabtest/src/Holes/Holes_Map_String.re new file mode 100644 index 00000000..8851cdde --- /dev/null +++ b/packages/xod-tabtest/src/Holes/Holes_Map_String.re @@ -0,0 +1,20 @@ +open Belt; + +type k = Map.String.key; + +type t('v) = Map.String.t('v); + +let mapKeys = (xs, fn) => + Map.String.toArray(xs) + |. Array.map(((k, v)) => (fn(k), v)) + |. Map.String.fromArray; + +let keepMapWithKey = (xs: t('v), fn: (k, 'v) => option('v2)) : t('v2) => + Map.String.toArray(xs) + |. Array.keepMap(((k, v)) => fn(k, v) |. Option.map(v2 => (k, v2))) + |. Map.String.fromArray; + +let keepMap = (xs: t('v), fn: 'v => option('v2)) : t('v2) => + keepMapWithKey(xs, (_, v) => fn(v)); + +let innerJoin = (xs, ys) => keepMap(xs, v => ys |. Map.String.get(v)); diff --git a/packages/xod-tabtest/src/Holes/Holes_Map_String.rei b/packages/xod-tabtest/src/Holes/Holes_Map_String.rei new file mode 100644 index 00000000..57718118 --- /dev/null +++ b/packages/xod-tabtest/src/Holes/Holes_Map_String.rei @@ -0,0 +1,25 @@ +/** Missing functionality for Belt.String.Map */ +open Belt; + +type k = Map.String.key; + +type t('v) = Map.String.t('v); + +/** Performs value mapping throwing away the values for which the + mapping function returns None */ +let keepMap: (t('v), 'v => option('v2)) => t('v2); + +/** The same as `keepMap` but also provides a key of the current item to the mapping functions */ +let keepMapWithKey: (t('v), (k, 'v) => option('v2)) => t('v2); + +/** Changes keys preserving the associated data. + + If multiple keys map to the same value, one + of them will be overriden and thus effectively discarded. Which one is not defined. + However, it is OK to map a key X to Y and Y to X, they will swap correctly. */ +let mapKeys: (t('a), k => k) => t('a); + +/** Performs SQL-alike join between two maps. Each value of the first map transitively + mapped to a value defined by the second map lookup. If a key/value is missing from + either side, the pair will not appear in the result */ +let innerJoin: (t(k), t('v)) => t('v); diff --git a/packages/xod-tabtest/src/Holes/Holes_Result.re b/packages/xod-tabtest/src/Holes/Holes_Result.re new file mode 100644 index 00000000..3388b06e --- /dev/null +++ b/packages/xod-tabtest/src/Holes/Holes_Result.re @@ -0,0 +1,59 @@ +type t('good, 'bad) = Js.Result.t('good, 'bad); + +let map = (res: t('goodA, 'bad), fn: 'goodA => 'goodB) : t('goodB, 'bad) => + switch (res) { + | Ok(good) => Ok(fn(good)) + | Error(bad) => Error(bad) + }; + +let flatMap = + (res: t('goodA, 'bad), fn: 'goodA => t('goodB, 'bad)) + : t('goodB, 'bad) => + switch (res |. map(fn)) { + | Ok(Ok(good)) => Ok(good) + | Ok(Error(bad)) => Error(bad) + | Error(bad) => Error(bad) + }; + +let liftM2 = + ( + fn: ('goodA, 'goodB) => t('goodR, 'bad), + a: t('goodA, 'bad), + b: t('goodB, 'bad), + ) + : t('goodR, 'bad) => + switch (a, b) { + | (Ok(goodA), Ok(goodB)) => fn(goodA, goodB) + | (Error(bad), _) + | (_, Error(bad)) => Error(bad) + }; + +let liftM3 = + ( + fn: ('goodA, 'goodB, 'goodC) => t('goodR, 'bad), + a: t('goodA, 'bad), + b: t('goodB, 'bad), + c: t('goodC, 'bad), + ) + : t('goodR, 'bad) => + switch (a, b, c) { + | (Ok(goodA), Ok(goodB), Ok(goodC)) => fn(goodA, goodB, goodC) + | (Error(bad), _, _) + | (_, Error(bad), _) + | (_, _, Error(bad)) => Error(bad) + }; + +let lift2 = + (fn: ('goodA, 'goodB) => 'goodR, a: t('goodA, 'bad), b: t('goodB, 'bad)) + : t('goodR, 'bad) => + liftM2((goodA, goodB) => Ok(fn(goodA, goodB)), a, b); + +let lift3 = + ( + fn: ('goodA, 'goodB, 'goodC) => 'goodR, + a: t('goodA, 'bad), + b: t('goodB, 'bad), + c: t('goodC, 'bad), + ) + : t('goodR, 'bad) => + liftM3((goodA, goodB, goodC) => Ok(fn(goodA, goodB, goodC)), a, b, c); diff --git a/packages/xod-tabtest/src/Holes/Holes_Result.rei b/packages/xod-tabtest/src/Holes/Holes_Result.rei new file mode 100644 index 00000000..74224110 --- /dev/null +++ b/packages/xod-tabtest/src/Holes/Holes_Result.rei @@ -0,0 +1,50 @@ +/** Missing functionality for the Result type */ +/* Local alias */ +type t('good, 'bad) = + Js.Result.t('good, 'bad); + +/** Monadic map over the result. Given a mapping function which operates + over regular values (x -> y), lift it up to map from Ok(x) to Ok(y). + Error passes through as is. + + In another universe might have a name `lift1`. */ +let map: (t('goodA, 'bad), 'goodA => 'goodB) => t('goodB, 'bad); + +/** Monadic flat map (aka bind and chain) over the result. Given a + mapping function x -> result(y), lift it to map from Ok(x) to Ok(y) + in the common case and return Error if the original arg was error + already or the function has mapped to another Error. + + In another universe might have a name `liftM1`. */ +let flatMap: + (t('goodA, 'bad), 'goodA => t('goodB, 'bad)) => t('goodB, 'bad); + +/** Lifts a function over regular argument types to work with monadic arguments. + Like `map`, but for more arguments. */ +let lift2: + (('goodA, 'goodB) => 'goodR, t('goodA, 'bad), t('goodB, 'bad)) => + t('goodR, 'bad); + +let lift3: + ( + ('goodA, 'goodB, 'goodC) => 'goodR, + t('goodA, 'bad), + t('goodB, 'bad), + t('goodC, 'bad) + ) => + t('goodR, 'bad); + +/** Lifts a function mapping regular arguments to a result monad to work with + monadic arguments. Like `flatMap`, but for more arguments. */ +let liftM2: + (('goodA, 'goodB) => t('goodR, 'bad), t('goodA, 'bad), t('goodB, 'bad)) => + t('goodR, 'bad); + +let liftM3: + ( + ('goodA, 'goodB, 'goodC) => t('goodR, 'bad), + t('goodA, 'bad), + t('goodB, 'bad), + t('goodC, 'bad) + ) => + t('goodR, 'bad); diff --git a/packages/xod-tabtest/src/Holes/Holes_String.re b/packages/xod-tabtest/src/Holes/Holes_String.re new file mode 100644 index 00000000..07a8e7a8 --- /dev/null +++ b/packages/xod-tabtest/src/Holes/Holes_String.re @@ -0,0 +1,20 @@ +open Belt; + +type t = string; + +let join = (xs, delimiter) => { + let reduce = (xs, delimiter) => + List.reduce(xs, ("", ""), ((acc, delimiter'), s) => + (acc ++ delimiter' ++ s, delimiter) + ); + let (str, _) = reduce(xs, delimiter); + str; +}; + +let joinLines = join(_, "\n"); + +let indent = (str, n) => + Js.String.replaceByRe([%bs.re "/^/gm"], Js.String.repeat(n, " "), str); + +let reverse = str => + Js.String.split("", str) |. Array.reverse |. List.fromArray |. join(""); diff --git a/packages/xod-tabtest/src/Holes/Holes_String.rei b/packages/xod-tabtest/src/Holes/Holes_String.rei new file mode 100644 index 00000000..3485bb7c --- /dev/null +++ b/packages/xod-tabtest/src/Holes/Holes_String.rei @@ -0,0 +1,16 @@ +/** Functions for strings manipulation */ +type t = string; + +/** Joins multiple strings together placing a delimiter between each pair. */ +let join: (list(t), t) => t; + +/** Joins multiple strings with . In other words, joins multiple lines into + a single multiline string. */ +let joinLines: list(t) => t; + +/** Indents all lines in a multiline string with a specified number of + spaces. */ +let indent: (t, int) => t; + +/** Writes the string backward */ +let reverse: t => t; diff --git a/packages/xod-tabtest/src/TabData.re b/packages/xod-tabtest/src/TabData.re new file mode 100644 index 00000000..599f105d --- /dev/null +++ b/packages/xod-tabtest/src/TabData.re @@ -0,0 +1,73 @@ +open Belt; + +module Re = Js.Re; + +module Value = { + type t = + | Empty + | NaN + | Number(float) + | Boolean(bool) + | String(string) + | Invalid(string); + let numberRegex = [%re {|/^[+-]?(?=.)*\d*(?:\.\d+)?$/|}]; + let stringRegex = [%re {|/^".*"$/|}]; + let unquote = str => + str + |> Js.String.replaceByRe([%re "/^\"/"], "") + |> Js.String.replaceByRe([%re "/\"$/"], ""); + let parse = str => + switch (str) { + | "" => Empty + | "true" => Boolean(true) + | "false" => Boolean(false) + | "NaN" => NaN + | numString when Re.test(numString, numberRegex) => + Number(Js.Float.fromString(numString)) + | quotedString when Re.test(quotedString, stringRegex) => + String(unquote(quotedString)) + | x => Invalid(x) + }; +}; + +module Record = { + type t = Map.String.t(Value.t); + let fromPairs = (pairs: list((string, Value.t))) : t => + pairs |. List.toArray |. Map.String.fromArray; + let get = (t, column) => + Map.String.get(t, column) + |. Option.flatMap(value => + switch (value) { + | Value.Empty => None + | x => Some(x) + } + ); +}; + +type t = list(Record.t); + +let map = List.map; + +let tabSplit = x => + Js.String.split("\t", x) |. List.fromArray |. List.map(Js.String.trim); + +let parse = (tsvSource: string) : t => + tsvSource + |> Js.String.split("\n") + |> List.fromArray + |> ( + lines => + switch (List.head(lines)) { + | None => [] + | Some(firstLine) => + let header = tabSplit(firstLine); + let lineToRecord = (line: string) : Record.t => + tabSplit(line) + |. List.map(Value.parse) + |. List.zip(header, _) + |. Record.fromPairs; + List.tailExn(lines) + |. List.keep(x => x != "") + |. List.map(lineToRecord); + } + ); diff --git a/packages/xod-tabtest/src/TabData.rei b/packages/xod-tabtest/src/TabData.rei new file mode 100644 index 00000000..432b5daf --- /dev/null +++ b/packages/xod-tabtest/src/TabData.rei @@ -0,0 +1,39 @@ +/** Tabular test data parsing facilities. The tabular data is basically a TSV + file, but stricter: + + - Header line is required + - Data is strongly typed, so strings must be enquoted + + Empty lines are allowed and ignored. + */ +open Belt; + +/** Corresponds to a single cell in the TSV */ +module Value: { + type t = + | Empty + | NaN + | Number(float) + | Boolean(bool) + | String(string) + | Invalid(string); +}; + +/** Corresponds to a single data line in the TSV */ +module Record: { + type t = Map.String.t(Value.t); + let get: (t, string) => option(Value.t); +}; + +/** Corresponds to the whole TSV */ +type t = list(Record.t); + +/** Maps all records in data like regular lists do */ +let map: (t, Record.t => 'v) => List.t('v); + +/** Parses a plain source (as read from file) into tabular data. + + Note, the parsing always succeeds leaving `Value.Invalid` for + the cells which failed to parse. It’s up to a consumer to handle + the data errors. */ +let parse: string => t; diff --git a/packages/xod-tabtest/src/Tabtest.re b/packages/xod-tabtest/src/Tabtest.re new file mode 100644 index 00000000..dcf0ba86 --- /dev/null +++ b/packages/xod-tabtest/src/Tabtest.re @@ -0,0 +1,283 @@ +open Belt; + +/* Filename -> Content */ +type t = Map.String.t(string); + +/* A probe is a node used later to inject values into a node under test. + Kind of terminal, but for tests. + + A probe stores reference to its target pin. That pin’s label is guaranted + to be normalized. */ +module Probe = { + type t = { + node: Node.t, + targetPin: Pin.t, + }; + /* Trivial accessors */ + let getNode = (probe: t) => probe.node; + let getTargetPin = (probe: t) => probe.targetPin; + /* Returns full patch path for the probe of a given type. The probe patch + nodes are stocked up in the `workspace` inside the package */ + let patchPath = (tp: Pin.dataType, dir: Pin.direction) : string => + "xod/tabtest/" + ++ ( + switch (dir) { + | Input => "inject-" + | Output => "capture-" + } + ) + ++ ( + switch (tp) { + | Pulse => "pulse" + | Boolean => "boolean" + | Number => "number" + | String => "string" + } + ); + /* Creates a new probe node matching the type of pin provided */ + let create = pin => { + node: Node.create(patchPath(Pin.getType(pin), Pin.getDirection(pin))), + targetPin: pin, + }; + /* Returns a key of the only pin (conventionally labeled "VAL") for a + probe node. */ + let getPinKeyExn = (probe, project) => { + let node = getNode(probe); + let pt = Node.getType(node); + let patch = + switch (Project.getPatchByNode(project, node)) { + | Some(patch') => patch' + | None => Js.Exn.raiseError("Probe has unexpected type " ++ pt) + }; + let pin = + Patch.findPinByLabel(patch, "VAL", ~normalize=true, ~direction=None); + switch (pin) { + | Some(pin) => Pin.getKey(pin) + | None => + Js.Exn.raiseError( + "Expected all probes to have the only pin labeled 'VAL'. " + ++ pt + ++ " violates the rule", + ) + }; + }; +}; + +/* Utilities to operate over lists of probes */ +module Probes = { + type t = list(Probe.t); + let map = List.map; + let keepToPinDirection = (probes, dir) => + List.keep(probes, probe => + probe |. Probe.getTargetPin |. Pin.getDirection == dir + ); + let keepInjecting = keepToPinDirection(_, Input); + let keepCapturing = keepToPinDirection(_, Output); +}; + +/* TODO: smarter errors */ +let newError = (message: string) : Js.Exn.t => + try (Js.Exn.raiseError(message)) { + | Js.Exn.Error(e) => e + }; + +/* Test bench is a patch containing a central node under test and + a set of probes connected to each of its pins. */ +module Bench = { + type t = { + patch: Patch.t, + probes: Probes.t, + /* Maps pin labels of the node under test to probe node IDs */ + probeMap: Map.String.t(Node.id), + }; + /* Creates a new bench for the project provided with the specified + node instance to test. The bench patch is *not* associated to the + project automatically. */ + let create = (project, patchUnderTest) : t => { + /* nut = node under test */ + let nut = Node.create(Patch.getPath(patchUnderTest)); + let nutId = Node.getId(nut); + let draftBench: t = { + patch: Patch.create() |. Patch.assocNode(nut), + probes: [], + probeMap: Map.String.empty, + }; + Patch.listPins(patchUnderTest) + |. Pin.normalizeLabels + /* For each pin of a node under test, create a new probe node + and link its `VAL` to that pin. */ + |. List.map(Probe.create) + |. List.reduce( + draftBench, + (bench, probe) => { + let probeNode = Probe.getNode(probe); + let probeId = Node.getId(probeNode); + let probePK = Probe.getPinKeyExn(probe, project); + let targPin = Probe.getTargetPin(probe); + let targPK = Pin.getKey(targPin); + let link = + switch (Pin.getDirection(targPin)) { + | Input => + Link.create( + ~fromPin=probePK, + ~fromNode=probeId, + ~toPin=targPK, + ~toNode=nutId, + ) + | Output => + Link.create( + ~fromPin=targPK, + ~fromNode=nutId, + ~toPin=probePK, + ~toNode=probeId, + ) + }; + { + patch: + bench.patch + |. Patch.assocNode(probeNode) + |. Patch.assocLinkExn(link), + probes: [probe, ...bench.probes], + probeMap: + bench.probeMap + |. Map.String.set(Pin.getLabel(targPin), probeId), + }; + }, + ); /* reduce */ + }; +}; + +/* A pico-framework to generate properly formatted C++ code. + Knows nothing about tabular tests, i.e., purpose-neutral. */ +module Cpp = { + type code = string; + let source = children => Holes.String.joinLines(children); + let indented = children => + children |. Holes.String.joinLines |. Holes.String.indent(4); + let enquote = x => {j|"$x"|j}; + let block = children => + ["{", indented(children), "}"] |. Holes.String.joinLines; + let catch2TestCase = (name, children) => + "TEST_CASE(" ++ enquote(name) ++ ") " ++ block(children); + let requireEqual = (actual, expected) => {j|REQUIRE($actual == $expected);|j}; +}; + +/* A test case corresponds to TEST_CASE in Catch2 and a single TSV tabtest in XOD. */ +module TestCase = { + /* Formats a tabular value to a valid C++ literal or expression */ + let valueToLiteral = (value: TabData.Value.t) : string => + switch (value) { + | Boolean(true) => "true" + | Boolean(false) => "false" + | NaN => "NAN" + | String(x) => Cpp.enquote(x) + | x => {j|$x|j} + }; + /* Generates a block of code corresponding to a single TSV line check. + Contains setup, evaluation, and assertion validation. It might + be wrapped into Catch2 SECTION, the purpose is the same. */ + let generateSection = (record, probes) : Cpp.code => { + let injectionStatements = + probes + |. Probes.keepInjecting + |. Probes.map(probe => { + let name = probe |. Probe.getTargetPin |. Pin.getLabel; + switch (record |. TabData.Record.get(name)) { + | Some(value) => {j|INJECT(probe_$name, $value);|j} + | None => {j|// No changes for $name|j} + }; + }); + let assertionsStatements = + probes + |. Probes.keepCapturing + |. Probes.map(probe => { + let name = probe |. Probe.getTargetPin |. Pin.getLabel; + switch (record |. Map.String.get(name)) { + | Some(value) => + Cpp.requireEqual( + {j|probe_$name.state.lastValue|j}, + valueToLiteral(value), + ) + | None => {j|// no expectation for $name|j} + }; + }); + Cpp.( + source([ + "", + source(injectionStatements), + "loop();", + source(assertionsStatements), + ]) + ); + }; + /* Generates a complete C++ source file with the test case for given data. + @param name a free-form string to use as Catch2 TEST_CASE name + @param tabData \m/ + @param idMap a map from tested pin labels (FOO, IN1, OUT etc) to + IDs of corresponding probes in C++ code (0, 1, 2, etc) + @param probes \m/ + */ + let generate = + ( + name: string, + tabData: TabData.t, + idMap: Map.String.t(string), + probes: Probes.t, + ) + : Cpp.code => { + let nodeAliases = + idMap + |. Map.String.toList + |. List.map(((name, id)) => {j|auto& probe_$name = xod::node_$id;|j}); + let sections = + tabData |. TabData.map(record => generateSection(record, probes)); + Cpp.( + source([ + "#include \"catch.hpp\"", + "", + source(nodeAliases), + "", + "#define INJECT(probe, value) { \\", + " (probe).output_VAL = (value); \\", + " (probe).isNodeDirty = true; \\", + " }", + "", + catch2TestCase(name, ["setup();", source(sections)]), + ]) + ); + }; +}; + +let generateSuite = (project, patchPathToTest) : XResult.t(t) => { + let patchUnderTestOpt = Project.getPatchByPath(project, patchPathToTest); + let tsvOpt = patchUnderTestOpt |. Option.flatMap(Patch.getTabtestContent); + switch (patchUnderTestOpt, tsvOpt) { + | (None, _) => + Error( + newError({j|Patch $patchPathToTest does not exist in the project|j}), + ) + | (_, None) => + Error( + newError( + {j|Patch $patchPathToTest has no tabular test data attached|j}, + ), + ) + | (Some(patchUnderTest), Some(tsv)) => + let bench = Bench.create(project, patchUnderTest); + let probes = bench.probes; + let benchPatchPath = "@/tabtest-bench"; + let tabData = TabData.parse(tsv); + let sketchFooter = "\n\n#include \"test.inl\"\n"; + Project.assocPatch(project, benchPatchPath, bench.patch) + |. Holes.Result.flatMap(Transpiler.transpile(_, benchPatchPath)) + |. Holes.Result.map(program => { + let idMap = + Holes.Map.String.innerJoin(bench.probeMap, program.nodeIdMap); + let testCase = + TestCase.generate(patchPathToTest, tabData, idMap, probes); + Map.String.empty + |. Map.String.set("sketch.cpp", program.code ++ sketchFooter) + |. Map.String.set("test.inl", testCase); + }); + }; +}; diff --git a/packages/xod-tabtest/src/Tabtest.rei b/packages/xod-tabtest/src/Tabtest.rei new file mode 100644 index 00000000..97aff8ed --- /dev/null +++ b/packages/xod-tabtest/src/Tabtest.rei @@ -0,0 +1,10 @@ +open Belt; + +/** 'Filename -> Content' map of all C++ files comprising the test suite. + The catch.hpp and Arduino.* stubs are omitted here and should be + additionally added by a consumer or made available with a -Include path + g++ switch. */ +type t = Map.String.t(string); + +/** Returns a test suite for the given patch of a project */ +let generateSuite: (Project.t, Patch.path) => XResult.t(t); diff --git a/packages/xod-tabtest/src/Tabtest_Js.re b/packages/xod-tabtest/src/Tabtest_Js.re new file mode 100644 index 00000000..724fa570 --- /dev/null +++ b/packages/xod-tabtest/src/Tabtest_Js.re @@ -0,0 +1,6 @@ +open Belt; + +let generateSuite = (project, patchPath) => + Tabtest.generateSuite(project, patchPath) + |. Holes.Result.map(files => files |. Map.String.toList |. Js.Dict.fromList) + |. Either.fromResult; diff --git a/packages/xod-tabtest/src/XodFS/Loader.re b/packages/xod-tabtest/src/XodFS/Loader.re new file mode 100644 index 00000000..08741a9d --- /dev/null +++ b/packages/xod-tabtest/src/XodFS/Loader.re @@ -0,0 +1,10 @@ +open Belt; + +module FFI = { + [@bs.module "xod-fs"] + external loadProject : (array(string), string) => Js.Promise.t(Project.t) = + "loadProject"; +}; + +let loadProject = (workspaces, patchPath) => + FFI.loadProject(List.toArray(workspaces), patchPath); diff --git a/packages/xod-tabtest/src/XodFS/Loader.rei b/packages/xod-tabtest/src/XodFS/Loader.rei new file mode 100644 index 00000000..ab246891 --- /dev/null +++ b/packages/xod-tabtest/src/XodFS/Loader.rei @@ -0,0 +1,4 @@ +/** + Loads a project from the given list of workspaces and a path to the project + */ +let loadProject: (list(string), string) => Js.Promise.t(Project.t); diff --git a/packages/xod-tabtest/src/XodFuncTools/Either.re b/packages/xod-tabtest/src/XodFuncTools/Either.re new file mode 100644 index 00000000..b2dd7725 --- /dev/null +++ b/packages/xod-tabtest/src/XodFuncTools/Either.re @@ -0,0 +1,21 @@ +type t('left, 'right) = Js.Types.obj_val; + +[@bs.module "xod-func-tools"] +external foldEither : ('left => 'a, 'right => 'a, t('left, 'right)) => 'a = + ""; + +[@bs.module "xod-func-tools"] +external eitherLeft : 'left => t('left, 'right) = ""; + +[@bs.module "xod-func-tools"] +external eitherRight : 'right => t('left, 'right) = ""; + +let toResult = either => + either + |> foldEither(left => Js.Result.Error(left), right => Js.Result.Ok(right)); + +let fromResult = result => + switch (result) { + | Js.Result.Error(left) => eitherLeft(left) + | Js.Result.Ok(right) => eitherRight(right) + }; diff --git a/packages/xod-tabtest/src/XodFuncTools/Either.rei b/packages/xod-tabtest/src/XodFuncTools/Either.rei new file mode 100644 index 00000000..a018c1a5 --- /dev/null +++ b/packages/xod-tabtest/src/XodFuncTools/Either.rei @@ -0,0 +1,7 @@ +/** A type represented by Either from ramda-fantasy in JS. Used only for + interoping between Reason and JS. */ +type t('left, 'right); + +let toResult: t('left, 'right) => Js.Result.t('right, 'left); + +let fromResult: Js.Result.t('right, 'left) => t('left, 'right); diff --git a/packages/xod-tabtest/src/XodFuncTools/Maybe.re b/packages/xod-tabtest/src/XodFuncTools/Maybe.re new file mode 100644 index 00000000..d6ef62e8 --- /dev/null +++ b/packages/xod-tabtest/src/XodFuncTools/Maybe.re @@ -0,0 +1,7 @@ +type t('a) = Js.Types.obj_val; + +[@bs.module "xod-func-tools"] +external foldMaybe : ('b, 'a => 'b, t('a)) => 'b = ""; + +let toOption = maybe => + maybe |> foldMaybe(None, justValue => Some(justValue)); diff --git a/packages/xod-tabtest/src/XodFuncTools/Maybe.rei b/packages/xod-tabtest/src/XodFuncTools/Maybe.rei new file mode 100644 index 00000000..c734574b --- /dev/null +++ b/packages/xod-tabtest/src/XodFuncTools/Maybe.rei @@ -0,0 +1,5 @@ +/** A type represented by Maybe from ramda-fantasy in JS. Used only for + interoping between Reason and JS. */ +type t('a) = Js.Types.obj_val; + +let toOption: t('a) => option('a); diff --git a/packages/xod-tabtest/src/XodFuncTools/XResult.re b/packages/xod-tabtest/src/XodFuncTools/XResult.re new file mode 100644 index 00000000..cc0011c6 --- /dev/null +++ b/packages/xod-tabtest/src/XodFuncTools/XResult.re @@ -0,0 +1,3 @@ +/** A type for a pattern widely-used in XOD where the result is + either OK or a JS Error */ +type t('good) = Js.Result.t('good, Js.Exn.t); diff --git a/packages/xod-tabtest/src/XodProject/Attachment.re b/packages/xod-tabtest/src/XodProject/Attachment.re new file mode 100644 index 00000000..02b41bdd --- /dev/null +++ b/packages/xod-tabtest/src/XodProject/Attachment.re @@ -0,0 +1,10 @@ +type t; + +[@bs.module "xod-project"] +external getFilename : t => string = "getAttachmentFilename"; + +[@bs.module "xod-project"] +external getContent : t => string = "getAttachmentContent"; + +[@bs.module "xod-project"] +external getEncoding : t => string = "getAttachmentEncoding"; diff --git a/packages/xod-tabtest/src/XodProject/Attachment.rei b/packages/xod-tabtest/src/XodProject/Attachment.rei new file mode 100644 index 00000000..178ec054 --- /dev/null +++ b/packages/xod-tabtest/src/XodProject/Attachment.rei @@ -0,0 +1,7 @@ +type t; + +let getFilename: t => string; + +let getContent: t => string; + +let getEncoding: t => string; diff --git a/packages/xod-tabtest/src/XodProject/Link.re b/packages/xod-tabtest/src/XodProject/Link.re new file mode 100644 index 00000000..1bf4a546 --- /dev/null +++ b/packages/xod-tabtest/src/XodProject/Link.re @@ -0,0 +1,7 @@ +type t = Js.Types.obj_val; + +[@bs.module "xod-project"] +external create : + (~toPin: Pin.key, ~toNode: Node.id, ~fromPin: Pin.key, ~fromNode: Node.id) => + t = + "createLink"; diff --git a/packages/xod-tabtest/src/XodProject/Link.rei b/packages/xod-tabtest/src/XodProject/Link.rei new file mode 100644 index 00000000..fb255242 --- /dev/null +++ b/packages/xod-tabtest/src/XodProject/Link.rei @@ -0,0 +1,5 @@ +type t; + +let create: + (~toPin: Pin.key, ~toNode: Node.id, ~fromPin: Pin.key, ~fromNode: Node.id) => + t; diff --git a/packages/xod-tabtest/src/XodProject/Node.re b/packages/xod-tabtest/src/XodProject/Node.re new file mode 100644 index 00000000..99f32f31 --- /dev/null +++ b/packages/xod-tabtest/src/XodProject/Node.re @@ -0,0 +1,20 @@ +type t = Js.Types.obj_val; + +type id = string; + +type position = { + . + "x": int, + "y": int, +}; + +let origin = {"x": 0, "y": 0}; + +[@bs.module "xod-project"] +external _create : (position, PatchPath.t) => t = "createNode"; + +let create = patchPath => _create(origin, patchPath); + +[@bs.module "xod-project"] external getId : t => id = "getNodeId"; + +[@bs.module "xod-project"] external getType : t => PatchPath.t = "getNodeType"; diff --git a/packages/xod-tabtest/src/XodProject/Node.rei b/packages/xod-tabtest/src/XodProject/Node.rei new file mode 100644 index 00000000..42023094 --- /dev/null +++ b/packages/xod-tabtest/src/XodProject/Node.rei @@ -0,0 +1,9 @@ +type t; + +type id = string; + +let create: PatchPath.t => t; + +let getId: t => id; + +let getType: t => PatchPath.t; diff --git a/packages/xod-tabtest/src/XodProject/Patch.re b/packages/xod-tabtest/src/XodProject/Patch.re new file mode 100644 index 00000000..379404b8 --- /dev/null +++ b/packages/xod-tabtest/src/XodProject/Patch.re @@ -0,0 +1,71 @@ +open Belt; + +type t = Js.Types.obj_val; + +type path = PatchPath.t; + +[@bs.module "xod-project"] external create : unit => t = "createPatch"; + +[@bs.module "xod-project"] external getPath : t => path = "getPatchPath"; + +[@bs.module "xod-project"] +external _assocNode : (Node.t, t) => t = "assocNode"; + +let assocNode = (patch, node) => _assocNode(node, patch); + +[@bs.module "xod-project"] +external _assocLink : (Link.t, t) => Either.t(Js.Exn.t, t) = "assocLink"; + +let assocLink = (patch, link) => _assocLink(link, patch) |> Either.toResult; + +let assocLinkExn = (link, patch) => + switch (assocLink(link, patch)) { + | Ok(patch') => patch' + | Error(err) => + /* TODO: use a rerise mechanism */ + Js.Exn.raiseError(err |> Js.Exn.message |. Option.getWithDefault("")) + }; + +[@bs.module "xod-project"] +external _listPins : t => array(Pin.t) = "listPins"; + +let listPins = patch => _listPins(patch) |. List.fromArray; + +let listInputPins = patch => + patch |. listPins |. List.keep(pin => Pin.getDirection(pin) == Pin.Input); + +let listOutputPins = patch => + patch |. listPins |. List.keep(pin => Pin.getDirection(pin) == Pin.Output); + +/* TODO: is it defined anywhere already? */ +let identity = a => a; + +let findPinByLabel = (patch, label, ~normalize, ~direction) : option(Pin.t) => + listPins(patch) + |. (normalize ? Pin.normalizeLabels : identity) + |. List.keep(pin => Pin.getLabel(pin) == label) + |. ( + pins => + switch (direction) { + | None => pins + | Some(dir) => List.keep(pins, pin => Pin.getDirection(pin) == dir) + } + ) + |. ( + pins => + switch (pins) { + | [onlyPin] => Some(onlyPin) + | _ => None + } + ); + +[@bs.module "xod-project"] +external _getAttachments : t => array(Attachment.t) = "getPatchAttachments"; + +let getAttachments = t => _getAttachments(t) |. List.fromArray; + +let getTabtestContent = t => + getAttachments(t) + |. List.keep(att => Attachment.getFilename(att) == "patch.test.tsv") + |. List.head + |. Option.map(Attachment.getContent); diff --git a/packages/xod-tabtest/src/XodProject/Patch.rei b/packages/xod-tabtest/src/XodProject/Patch.rei new file mode 100644 index 00000000..c26b3a79 --- /dev/null +++ b/packages/xod-tabtest/src/XodProject/Patch.rei @@ -0,0 +1,27 @@ +type t; + +type path = PatchPath.t; + +let create: unit => t; + +let getPath: t => path; + +let assocNode: (t, Node.t) => t; + +let assocLink: (t, Link.t) => XResult.t(t); + +let assocLinkExn: (t, Link.t) => t; + +let listPins: t => list(Pin.t); + +let listInputPins: t => list(Pin.t); + +let listOutputPins: t => list(Pin.t); + +let findPinByLabel: + (t, string, ~normalize: bool, ~direction: option(Pin.direction)) => + option(Pin.t); + +let getAttachments: t => list(Attachment.t); + +let getTabtestContent: t => option(string); diff --git a/packages/xod-tabtest/src/XodProject/PatchPath.rei b/packages/xod-tabtest/src/XodProject/PatchPath.rei new file mode 100644 index 00000000..da30854a --- /dev/null +++ b/packages/xod-tabtest/src/XodProject/PatchPath.rei @@ -0,0 +1 @@ +type t = string; diff --git a/packages/xod-tabtest/src/XodProject/Pin.re b/packages/xod-tabtest/src/XodProject/Pin.re new file mode 100644 index 00000000..5fdb6243 --- /dev/null +++ b/packages/xod-tabtest/src/XodProject/Pin.re @@ -0,0 +1,61 @@ +open Belt; + +type key = string; + +type t = { + . + "key": key, + "direction": string, + "label": string, + "_type": string, + "defaultValue": string, + "order": int, + "description": string, + "isBindable": bool, +}; + +type dataType = + | Pulse + | Boolean + | Number + | String; + +type direction = + | Input + | Output; + +let getDirection = (pin: t) : direction => { + let dir = pin##direction; + switch (dir) { + | "input" => Input + | "output" => Output + | _ => + Js.Exn.raiseTypeError( + {j|Pin direction should be "input" or "output", got "$dir"|j}, + ) + }; +}; + +[@bs.module "xod-project"] +external _normalizeLabels : array(t) => array(t) = "normalizePinLabels"; + +let normalizeLabels = pins => + pins |. List.toArray |. _normalizeLabels |. List.fromArray; + +let getKey = pin => pin##key; + +let getType = (pin: t) : dataType => { + let tp = pin##_type; + switch (tp) { + | "pulse" => Pulse + | "boolean" => Boolean + | "number" => Number + | "string" => String + | _ => + Js.Exn.raiseTypeError( + {j|Pin type should be "pulse", "boolean", "number", etc, got "$tp"|j}, + ) + }; +}; + +let getLabel = pin => pin##label; diff --git a/packages/xod-tabtest/src/XodProject/Pin.rei b/packages/xod-tabtest/src/XodProject/Pin.rei new file mode 100644 index 00000000..ee9d6311 --- /dev/null +++ b/packages/xod-tabtest/src/XodProject/Pin.rei @@ -0,0 +1,23 @@ +type t; + +type key = string; + +type direction = + | Input + | Output; + +type dataType = + | Pulse + | Boolean + | Number + | String; + +let getDirection: t => direction; + +let normalizeLabels: list(t) => list(t); + +let getType: t => dataType; + +let getKey: t => key; + +let getLabel: t => string; diff --git a/packages/xod-tabtest/src/XodProject/Project.re b/packages/xod-tabtest/src/XodProject/Project.re new file mode 100644 index 00000000..1acf9399 --- /dev/null +++ b/packages/xod-tabtest/src/XodProject/Project.re @@ -0,0 +1,18 @@ +type t = Js.Types.obj_val; + +[@bs.module "xod-project"] +external _assocPatch : (PatchPath.t, Patch.t, t) => Either.t(Js.Exn.t, t) = + "assocPatch"; + +let assocPatch = (project, path, patch) => + _assocPatch(path, patch, project) |. Either.toResult; + +[@bs.module "xod-project"] +external _getPatchByPath : (PatchPath.t, t) => Maybe.t(Patch.t) = + "getPatchByPath"; + +let getPatchByPath = (project, path) => + _getPatchByPath(path, project) |. Maybe.toOption; + +let getPatchByNode = (project, node) => + getPatchByPath(project, Node.getType(node)); diff --git a/packages/xod-tabtest/src/XodProject/Project.rei b/packages/xod-tabtest/src/XodProject/Project.rei new file mode 100644 index 00000000..0e3caaa3 --- /dev/null +++ b/packages/xod-tabtest/src/XodProject/Project.rei @@ -0,0 +1,7 @@ +type t; + +let assocPatch: (t, PatchPath.t, Patch.t) => XResult.t(t); + +let getPatchByPath: (t, PatchPath.t) => option(Patch.t); + +let getPatchByNode: (t, Node.t) => option(Patch.t); diff --git a/packages/xod-tabtest/src/XodTranspiler/Transpiler.re b/packages/xod-tabtest/src/XodTranspiler/Transpiler.re new file mode 100644 index 00000000..c840f7b0 --- /dev/null +++ b/packages/xod-tabtest/src/XodTranspiler/Transpiler.re @@ -0,0 +1,32 @@ +open Belt; + +module TProject = { + type t; +}; + +type program = { + code: string, + nodeIdMap: Map.String.t(string), +}; + +[@bs.module "xod-arduino"] +external _transformProject : + (Project.t, string) => Either.t(Js.Exn.t, TProject.t) = + "transformProject"; + +[@bs.module "xod-arduino"] +external _transpile : TProject.t => string = "transpile"; + +[@bs.module "xod-arduino"] +external _getNodeIdsMap : TProject.t => Js.Dict.t(string) = "getNodeIdsMap"; + +let transpile = (project, patchPath) : XResult.t(program) => + _transformProject(project, patchPath) + |. Either.toResult + |. Holes.Result.map(tProject => + { + code: _transpile(tProject), + nodeIdMap: + _getNodeIdsMap(tProject) |> Js.Dict.entries |> Map.String.fromArray, + } + ); diff --git a/packages/xod-tabtest/src/XodTranspiler/Transpiler.rei b/packages/xod-tabtest/src/XodTranspiler/Transpiler.rei new file mode 100644 index 00000000..8e60b5ab --- /dev/null +++ b/packages/xod-tabtest/src/XodTranspiler/Transpiler.rei @@ -0,0 +1,8 @@ +open Belt; + +type program = { + code: string, + nodeIdMap: Map.String.t(string), +}; + +let transpile: (Project.t, PatchPath.t) => XResult.t(program); diff --git a/packages/xod-tabtest/test/Holes_Map_String_jest.re b/packages/xod-tabtest/test/Holes_Map_String_jest.re new file mode 100644 index 00000000..a584b291 --- /dev/null +++ b/packages/xod-tabtest/test/Holes_Map_String_jest.re @@ -0,0 +1,78 @@ +open Belt; + +open Jest; + +open Expect; + +let formatMap = m => { + let s = Map.String.toArray(m); + {j|$s|j}; +}; + +let toEqualMap = (ym, expectation) => { + let xm = + switch (expectation) { + | `Just(xm) => xm + | _ => Js.Exn.raiseError("toEqualMap supports only plain `expect`ations") + }; + Map.String.eq(xm, ym, (==)) ? + pass : + fail( + "Maps differ\n" + ++ "Expected: " + ++ formatMap(ym) + ++ "\nActual: " + ++ formatMap(xm), + ); +}; + +describe("Key mapping", () => { + test("changes keys, preserves data", () => { + let inMap = + Map.String.empty + |. Map.String.set("one", 1) + |. Map.String.set("two", 2) + |. Map.String.set("three", 3); + let outMap = inMap |. Holes.Map.String.mapKeys(Js.String.toUpperCase); + let expectedMap = + Map.String.empty + |. Map.String.set("ONE", 1) + |. Map.String.set("TWO", 2) + |. Map.String.set("THREE", 3); + expect(outMap) |> toEqualMap(expectedMap); + }); + test("supports swaps", () => { + let inMap = + Map.String.empty + |. Map.String.set("foo", "was foo") + |. Map.String.set("oof", "was oof"); + let outMap = inMap |. Holes.Map.String.mapKeys(Holes.String.reverse); + let expectedMap = + Map.String.empty + |. Map.String.set("oof", "was foo") + |. Map.String.set("foo", "was oof"); + expect(outMap) |> toEqualMap(expectedMap); + }); +}); + +describe("Inner join", () => + test("applies transitive associations", () => { + let left = + Map.String.empty + |. Map.String.set("quad", "four") + |. Map.String.set("hexa", "six") + |. Map.String.set("octo", "eight"); + let right = + Map.String.empty + |. Map.String.set("four", 4) + |. Map.String.set("six", 6) + |. Map.String.set("eight", 8); + let outMap = Holes.Map.String.innerJoin(left, right); + let expectedMap = + Map.String.empty + |. Map.String.set("quad", 4) + |. Map.String.set("hexa", 6) + |. Map.String.set("octo", 8); + expect(outMap) |> toEqualMap(expectedMap); + }) +); diff --git a/packages/xod-tabtest/test/Holes_String_jest.re b/packages/xod-tabtest/test/Holes_String_jest.re new file mode 100644 index 00000000..ac749945 --- /dev/null +++ b/packages/xod-tabtest/test/Holes_String_jest.re @@ -0,0 +1,37 @@ +open Jest; + +open Expect; + +open Holes.String; + +describe("join", () => { + test("returns empty for empty", () => + expect([] |. join(", ")) |> toEqual("") + ); + test("returns identity for a single string", () => + expect(["Hello"] |. join(", ")) |> toEqual("Hello") + ); + test("inserts delimiter between pairs", () => + expect(["Hello", "wonderful", "world"] |. join(", ")) + |> toEqual("Hello, wonderful, world") + ); +}); + +describe("indent", () => { + test("indents empty", () => + expect("" |. indent(2)) |> toEqual(" ") + ); + test("indents at line breaks", () => + expect("foo();\nbar();" |. indent(2)) + |> toEqual(" foo();\n" ++ " bar();") + ); +}); + +describe("reverse", () => { + test("returns empty for empty", () => + expect(reverse("")) |> toEqual("") + ); + test("indeed reverses", () => + expect(reverse("Hello")) |> toEqual("olleH") + ); +}); diff --git a/packages/xod-tabtest/test/TabData_jest.re b/packages/xod-tabtest/test/TabData_jest.re new file mode 100644 index 00000000..ee106c64 --- /dev/null +++ b/packages/xod-tabtest/test/TabData_jest.re @@ -0,0 +1,66 @@ +open Belt; + +open Jest; + +open Expect; + +open TabData.Value; + +describe("TSV parser", () => { + test("parses empty tsv into empty data", () => + expect(TabData.parse("")) |> toEqual([]) + ); + test("parses header-only tsv into empty data", () => + expect(TabData.parse("foo\tBAR\tBaz")) |> toEqual([]) + ); + test("parses header and a line into a single record", () => { + let tsv = "foo\tBAR\tBaz\n" ++ "111\t222\t333\n"; + let expected: TabData.t = [ + Map.String.empty + |. Map.String.set("foo", Number(111.0)) + |. Map.String.set("BAR", Number(222.0)) + |. Map.String.set("Baz", Number(333.0)), + ]; + expect(TabData.parse(tsv)) |> toEqual(expected); + }); + test("ignores empty lines", () => { + let tsv = "foo\tBAR\tBaz\n" ++ "\n\n" ++ "111\t222\t333\n" ++ "\n\n"; + let expected: TabData.t = [ + Map.String.empty + |. Map.String.set("foo", Number(111.0)) + |. Map.String.set("BAR", Number(222.0)) + |. Map.String.set("Baz", Number(333.0)), + ]; + expect(TabData.parse(tsv)) |> toEqual(expected); + }); + test("matches data to header by shortest sequence", () => { + let tsv = "foo\tBAR\tBaz\n" ++ "111\t222\n" ++ "111\t222\t333\t444\n"; + let expected: TabData.t = [ + Map.String.empty + |. Map.String.set("foo", Number(111.0)) + |. Map.String.set("BAR", Number(222.0)), + Map.String.empty + |. Map.String.set("foo", Number(111.0)) + |. Map.String.set("BAR", Number(222.0)) + |. Map.String.set("Baz", Number(333.0)), + ]; + expect(TabData.parse(tsv)) |> toEqual(expected); + }); + test("recognizes types", () => { + let tsv = + "Number\tBoolean\tString\n" + ++ "+.5\ttrue\t\"Hello\"\n" + ++ "1.3\tfalse\t\"Some \"quoted\" string\""; + let expected: TabData.t = [ + Map.String.empty + |. Map.String.set("Number", Number(0.5)) + |. Map.String.set("Boolean", Boolean(true)) + |. Map.String.set("String", String("Hello")), + Map.String.empty + |. Map.String.set("Number", Number(1.3)) + |. Map.String.set("Boolean", Boolean(false)) + |. Map.String.set("String", String({|Some "quoted" string|})), + ]; + expect(TabData.parse(tsv)) |> toEqual(expected); + }); +}); diff --git a/packages/xod-tabtest/workspace/.xodworkspace b/packages/xod-tabtest/workspace/.xodworkspace new file mode 100644 index 00000000..e69de29b diff --git a/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-boolean/patch.cpp b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-boolean/patch.cpp new file mode 100644 index 00000000..feda1718 --- /dev/null +++ b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-boolean/patch.cpp @@ -0,0 +1,9 @@ +struct State { + bool lastValue; +}; + +{{ GENERATED_CODE }} + +void evaluate(Context ctx) { + getState(ctx)->lastValue = getValue(ctx); +} diff --git a/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-boolean/patch.xodp b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-boolean/patch.xodp new file mode 100644 index 00000000..2f476ec7 --- /dev/null +++ b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-boolean/patch.xodp @@ -0,0 +1,22 @@ +{ + "description": "Capturing probe for tabular test framework", + "nodes": [ + { + "id": "B1iYZOzoZ", + "position": { + "x": 34, + "y": 102 + }, + "type": "xod/patch-nodes/not-implemented-in-xod" + }, + { + "id": "HkXK-dGob", + "label": "VAL", + "position": { + "x": 34, + "y": 0 + }, + "type": "xod/patch-nodes/input-boolean" + } + ] +} diff --git a/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-number/patch.cpp b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-number/patch.cpp new file mode 100644 index 00000000..861dfe4a --- /dev/null +++ b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-number/patch.cpp @@ -0,0 +1,9 @@ +struct State { + Number lastValue; +}; + +{{ GENERATED_CODE }} + +void evaluate(Context ctx) { + getState(ctx)->lastValue = getValue(ctx); +} diff --git a/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-number/patch.xodp b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-number/patch.xodp new file mode 100644 index 00000000..2caf7bcd --- /dev/null +++ b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-number/patch.xodp @@ -0,0 +1,22 @@ +{ + "description": "Capturing probe for tabular test framework", + "nodes": [ + { + "id": "B1iYZOzoZ", + "position": { + "x": 34, + "y": 102 + }, + "type": "xod/patch-nodes/not-implemented-in-xod" + }, + { + "id": "HkXK-dGob", + "label": "VAL", + "position": { + "x": 34, + "y": 0 + }, + "type": "xod/patch-nodes/input-number" + } + ] +} diff --git a/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-pulse/patch.cpp b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-pulse/patch.cpp new file mode 100644 index 00000000..1046896f --- /dev/null +++ b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-pulse/patch.cpp @@ -0,0 +1,7 @@ +struct State { +}; + +{{ GENERATED_CODE }} + +void evaluate(Context ctx) { +} diff --git a/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-pulse/patch.xodp b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-pulse/patch.xodp new file mode 100644 index 00000000..2caf7bcd --- /dev/null +++ b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-pulse/patch.xodp @@ -0,0 +1,22 @@ +{ + "description": "Capturing probe for tabular test framework", + "nodes": [ + { + "id": "B1iYZOzoZ", + "position": { + "x": 34, + "y": 102 + }, + "type": "xod/patch-nodes/not-implemented-in-xod" + }, + { + "id": "HkXK-dGob", + "label": "VAL", + "position": { + "x": 34, + "y": 0 + }, + "type": "xod/patch-nodes/input-number" + } + ] +} diff --git a/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-string/patch.cpp b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-string/patch.cpp new file mode 100644 index 00000000..36df4802 --- /dev/null +++ b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-string/patch.cpp @@ -0,0 +1,9 @@ +struct State { + XString lastValue; +}; + +{{ GENERATED_CODE }} + +void evaluate(Context ctx) { + getState(ctx)->lastValue = getValue(ctx); +} diff --git a/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-string/patch.xodp b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-string/patch.xodp new file mode 100644 index 00000000..2caf7bcd --- /dev/null +++ b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-string/patch.xodp @@ -0,0 +1,22 @@ +{ + "description": "Capturing probe for tabular test framework", + "nodes": [ + { + "id": "B1iYZOzoZ", + "position": { + "x": 34, + "y": 102 + }, + "type": "xod/patch-nodes/not-implemented-in-xod" + }, + { + "id": "HkXK-dGob", + "label": "VAL", + "position": { + "x": 34, + "y": 0 + }, + "type": "xod/patch-nodes/input-number" + } + ] +} diff --git a/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-boolean/patch.cpp b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-boolean/patch.cpp new file mode 100644 index 00000000..8d6dc1f2 --- /dev/null +++ b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-boolean/patch.cpp @@ -0,0 +1,8 @@ +struct State { +}; + +{{ GENERATED_CODE }} + +void evaluate(Context ctx) { + emitValue(ctx, getValue(ctx)); +} diff --git a/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-boolean/patch.xodp b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-boolean/patch.xodp new file mode 100644 index 00000000..12aac75e --- /dev/null +++ b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-boolean/patch.xodp @@ -0,0 +1,21 @@ +{ + "nodes": [ + { + "id": "VAL", + "label": "VAL", + "position": { + "x": 0, + "y": 300 + }, + "type": "xod/patch-nodes/output-boolean" + }, + { + "id": "noNativeImpl", + "position": { + "x": 100, + "y": 100 + }, + "type": "xod/patch-nodes/not-implemented-in-xod" + } + ] +} diff --git a/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-number/patch.cpp b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-number/patch.cpp new file mode 100644 index 00000000..76ac39cf --- /dev/null +++ b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-number/patch.cpp @@ -0,0 +1,7 @@ +struct State {}; + +{{ GENERATED_CODE }} + +void evaluate(Context ctx) { + emitValue(ctx, getValue(ctx)); +} diff --git a/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-number/patch.xodp b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-number/patch.xodp new file mode 100644 index 00000000..f3d2cb2d --- /dev/null +++ b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-number/patch.xodp @@ -0,0 +1,24 @@ +{ + "nodes": [ + { + "boundValues": { + "__in__": "" + }, + "id": "B1x2RV3eZ", + "label": "VAL", + "position": { + "x": 10, + "y": 120 + }, + "type": "xod/patch-nodes/output-number" + }, + { + "id": "H1PnRN2lW", + "position": { + "x": 10, + "y": 16 + }, + "type": "xod/patch-nodes/not-implemented-in-xod" + } + ] +} diff --git a/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-pulse/patch.cpp b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-pulse/patch.cpp new file mode 100644 index 00000000..76ac39cf --- /dev/null +++ b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-pulse/patch.cpp @@ -0,0 +1,7 @@ +struct State {}; + +{{ GENERATED_CODE }} + +void evaluate(Context ctx) { + emitValue(ctx, getValue(ctx)); +} diff --git a/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-pulse/patch.xodp b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-pulse/patch.xodp new file mode 100644 index 00000000..d51c3d65 --- /dev/null +++ b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-pulse/patch.xodp @@ -0,0 +1,21 @@ +{ + "nodes": [ + { + "id": "B1x2RV3eZ", + "label": "VAL", + "position": { + "x": 10, + "y": 120 + }, + "type": "xod/patch-nodes/output-pulse" + }, + { + "id": "H1PnRN2lW", + "position": { + "x": 10, + "y": 16 + }, + "type": "xod/patch-nodes/not-implemented-in-xod" + } + ] +} diff --git a/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-string/patch.cpp b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-string/patch.cpp new file mode 100644 index 00000000..76ac39cf --- /dev/null +++ b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-string/patch.cpp @@ -0,0 +1,7 @@ +struct State {}; + +{{ GENERATED_CODE }} + +void evaluate(Context ctx) { + emitValue(ctx, getValue(ctx)); +} diff --git a/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-string/patch.xodp b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-string/patch.xodp new file mode 100644 index 00000000..3368cc80 --- /dev/null +++ b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-string/patch.xodp @@ -0,0 +1,24 @@ +{ + "nodes": [ + { + "boundValues": { + "__in__": "" + }, + "id": "B1x2RV3eZ", + "label": "VAL", + "position": { + "x": 10, + "y": 120 + }, + "type": "xod/patch-nodes/output-string" + }, + { + "id": "H1PnRN2lW", + "position": { + "x": 10, + "y": 16 + }, + "type": "xod/patch-nodes/not-implemented-in-xod" + } + ] +} diff --git a/packages/xod-tabtest/workspace/__lib__/xod/tabtest/project.xod b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/project.xod new file mode 100644 index 00000000..02f62641 --- /dev/null +++ b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/project.xod @@ -0,0 +1,9 @@ +{ + "authors": [ + "XOD" + ], + "description": "Utility nodes for table tests", + "license": "AGPL-3.0", + "name": "tabtest", + "version": "1.0.0" +} diff --git a/yarn.lock b/yarn.lock index a0c64ad9..212fdf4e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -34,6 +34,12 @@ esutils "^2.0.2" js-tokens "^3.0.0" +"@babel/code-frame@^7.0.0-beta.35": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" + dependencies: + "@babel/highlight" "7.0.0-beta.44" + "@babel/helper-function-name@7.0.0-beta.36": version "7.0.0-beta.36" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.36.tgz#366e3bc35147721b69009f803907c4d53212e88d" @@ -48,6 +54,14 @@ dependencies: "@babel/types" "7.0.0-beta.36" +"@babel/highlight@7.0.0-beta.44": + version "7.0.0-beta.44" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + "@babel/template@7.0.0-beta.36": version "7.0.0-beta.36" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.36.tgz#02e903de5d68bd7899bce3c5b5447e59529abb00" @@ -78,6 +92,12 @@ lodash "^4.2.0" to-fast-properties "^2.0.0" +"@glennsl/bs-jest@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@glennsl/bs-jest/-/bs-jest-0.4.2.tgz#c8bd899aca0feae5927f4778cbdeb4c46bb2eef9" + dependencies: + jest "^22.0.4" + "@google-cloud/common@^0.13.0": version "0.13.5" resolved "https://registry.yarnpkg.com/@google-cloud/common/-/common-0.13.5.tgz#b90599f29ce957b366adea8d7c0c3f3593d981ca" @@ -314,6 +334,10 @@ JSONStream@^1.0.3, JSONStream@^1.0.4: jsonparse "^1.2.0" through ">=2.2.7 <3" +abab@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -335,6 +359,12 @@ acorn-dynamic-import@^2.0.0: dependencies: acorn "^4.0.3" +acorn-globals@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" + dependencies: + acorn "^5.0.0" + acorn-jsx@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" @@ -357,6 +387,10 @@ acorn@^5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.2.tgz#911cb53e036807cf0fa778dc5d370fbd864246d7" +acorn@^5.3.0: + version "5.5.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" + add-dom-event-listener@1.x: version "1.0.2" resolved "https://registry.yarnpkg.com/add-dom-event-listener/-/add-dom-event-listener-1.0.2.tgz#8faed2c41008721cf111da1d30d995b85be42bed" @@ -488,6 +522,12 @@ ansi-styles@^3.1.0: dependencies: color-convert "^1.9.0" +ansi-styles@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + dependencies: + color-convert "^1.9.0" + anymatch@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" @@ -495,6 +535,13 @@ anymatch@^1.3.0: micromatch "^2.1.5" normalize-path "^2.0.0" +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + app-package-builder@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/app-package-builder/-/app-package-builder-1.0.3.tgz#39eeb95d3e67c9e0444c20bbcec6f3ea03ce2033" @@ -506,6 +553,12 @@ app-package-builder@1.0.3: int64-buffer "^0.1.9" js-yaml "^3.10.0" +append-transform@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + dependencies: + default-require-extensions "^1.0.0" + aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -565,7 +618,7 @@ arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" -arr-flatten@^1.0.1, arr-flatten@^1.0.3: +arr-flatten@^1.0.1, arr-flatten@^1.0.3, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" @@ -577,6 +630,10 @@ array-differ@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + array-filter@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" @@ -706,10 +763,18 @@ assertion-error@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + ast-types@0.10.1: version "0.10.1" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.10.1.tgz#f52fca9715579a14f841d67d7f8d25432ab6a3dd" +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" @@ -821,7 +886,7 @@ babel-code-frame@^6.11.0, babel-code-frame@^6.16.0, babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.0.14, babel-core@^6.16.0, babel-core@^6.17.0, babel-core@^6.26.0: +babel-core@^6.0.0, babel-core@^6.0.14, babel-core@^6.16.0, babel-core@^6.17.0, babel-core@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" dependencies: @@ -869,6 +934,19 @@ babel-generator@6.25.0: source-map "^0.5.0" trim-right "^1.0.1" +babel-generator@^6.18.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + babel-generator@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" @@ -1036,6 +1114,13 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" +babel-jest@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-22.4.3.tgz#4b7a0b6041691bbd422ab49b3b73654a49a6627a" + dependencies: + babel-plugin-istanbul "^4.1.5" + babel-preset-jest "^22.4.3" + babel-loader@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.2.tgz#f6cbe122710f1aa2af4d881c6d5b54358ca24126" @@ -1070,6 +1155,18 @@ babel-plugin-inline-import@^2.0.4: dependencies: require-resolve "0.0.2" +babel-plugin-istanbul@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz#6760cdd977f411d3e175bb064f2bc327d99b2b6e" + dependencies: + find-up "^2.1.0" + istanbul-lib-instrument "^1.7.5" + test-exclude "^4.1.1" + +babel-plugin-jest-hoist@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.3.tgz#7d8bcccadc2667f96a0dcc6afe1891875ee6c14a" + babel-plugin-minify-builtins@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.2.0.tgz#317f824b0907210b6348671bb040ca072e2e0c82" @@ -1191,7 +1288,7 @@ babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" -babel-plugin-syntax-object-rest-spread@^6.8.0: +babel-plugin-syntax-object-rest-spread@^6.13.0, 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" @@ -1681,6 +1778,13 @@ babel-preset-flow@^6.23.0: dependencies: babel-plugin-transform-flow-strip-types "^6.22.0" +babel-preset-jest@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-22.4.3.tgz#e92eef9813b7026ab4ca675799f37419b5a44156" + dependencies: + babel-plugin-jest-hoist "^22.4.3" + babel-plugin-syntax-object-rest-spread "^6.13.0" + babel-preset-minify@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/babel-preset-minify/-/babel-preset-minify-0.2.0.tgz#006566552d9b83834472273f306c0131062a0acc" @@ -1810,7 +1914,7 @@ babel-runtime@~6.23.0: core-js "^2.4.0" regenerator-runtime "^0.10.0" -babel-template@^6.24.1, babel-template@^6.26.0, babel-template@^6.3.0: +babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0, babel-template@^6.3.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" dependencies: @@ -1820,7 +1924,7 @@ babel-template@^6.24.1, babel-template@^6.26.0, babel-template@^6.3.0: babylon "^6.18.0" lodash "^4.17.4" -babel-traverse@^6.16.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: +babel-traverse@^6.16.0, babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" dependencies: @@ -1834,7 +1938,7 @@ babel-traverse@^6.16.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: invariant "^2.2.2" lodash "^4.17.4" -babel-types@^6.16.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.25.0, babel-types@^6.26.0: +babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.25.0, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" dependencies: @@ -2062,6 +2166,23 @@ braces@^2.2.2: split-string "^2.1.0" to-regex "^3.0.1" +braces@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.1.tgz#7086c913b4e5a08dbe37ac0ee6a2500c4ba691bb" + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + define-property "^1.0.0" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + kind-of "^6.0.2" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + brcast@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/brcast/-/brcast-3.0.1.tgz#6256a8349b20de9eed44257a9b24d71493cd48dd" @@ -2070,7 +2191,11 @@ brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" -browser-resolve@^1.7.0: +browser-process-hrtime@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" + +browser-resolve@^1.11.2, browser-resolve@^1.7.0: version "1.11.2" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" dependencies: @@ -2159,6 +2284,16 @@ browserslist@^2.10.0: caniuse-lite "^1.0.30000780" electron-to-chromium "^1.3.28" +bs-platform@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/bs-platform/-/bs-platform-2.2.3.tgz#d905ae10a5f3621e6a739041dfa0b58483a2174f" + +bser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + dependencies: + node-int64 "^0.4.0" + btoa@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.1.2.tgz#3e40b81663f81d2dd6596a4cb714a8dc16cfabe0" @@ -2332,6 +2467,10 @@ callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" @@ -2595,6 +2734,14 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" +cliui@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.0.0.tgz#743d4650e05f36d1ed2575b59638d87322bfbbcc" + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + clone-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" @@ -2774,6 +2921,10 @@ compare-version@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" +compare-versions@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.1.0.tgz#43310256a5c555aaed4193c04d8f154cf9c6efd5" + component-classes@^1.2.5: version "1.2.6" resolved "https://registry.yarnpkg.com/component-classes/-/component-classes-1.2.6.tgz#c642394c3618a4d8b0b8919efccbbd930e5cd691" @@ -3029,6 +3180,10 @@ convert-source-map@^1.1.1, convert-source-map@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" +convert-source-map@^1.4.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -3338,6 +3493,16 @@ csso@~2.3.1: clap "^1.0.9" source-map "^0.5.3" +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + +"cssstyle@>= 0.2.37 < 0.3.0": + version "0.2.37" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + dependencies: + cssom "0.3.x" + cuint@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" @@ -3374,6 +3539,14 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-urls@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f" + dependencies: + abab "^1.0.4" + whatwg-mimetype "^2.0.0" + whatwg-url "^6.4.0" + date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" @@ -3439,6 +3612,12 @@ deepmerge@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.3.2.tgz#1663691629d4dbfe364fa12a2a4f0aa86aa3a050" +default-require-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + dependencies: + strip-bom "^2.0.0" + defaults@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" @@ -3464,6 +3643,13 @@ define-property@^1.0.0: dependencies: is-descriptor "^1.0.0" +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + defined@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" @@ -3534,6 +3720,14 @@ detect-indent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + detect-node@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" @@ -3565,6 +3759,10 @@ diff@^1.3.2: version "1.4.0" resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" +diff@^3.2.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + diffie-hellman@^5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" @@ -3753,6 +3951,12 @@ domain-browser@^1.1.1: version "1.1.7" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" +domexception@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + dependencies: + webidl-conversions "^4.0.2" + dot-prop@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" @@ -4240,6 +4444,17 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" +escodegen@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2" + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + escope@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" @@ -4415,6 +4630,10 @@ esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + esprima@^4.0.0, esprima@~4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" @@ -4472,6 +4691,12 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" +exec-sh@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" + dependencies: + merge "^1.1.3" + execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -4504,6 +4729,10 @@ exit-hook@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" @@ -4534,6 +4763,17 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" +expect@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/expect/-/expect-22.4.3.tgz#d5a29d0a0e1fb2153557caef2674d4547e914674" + dependencies: + ansi-styles "^3.2.0" + jest-diff "^22.4.3" + jest-get-type "^22.4.3" + jest-matcher-utils "^22.4.3" + jest-message-util "^22.4.3" + jest-regex-util "^22.4.3" + exports-loader@^0.6.3: version "0.6.4" resolved "https://registry.yarnpkg.com/exports-loader/-/exports-loader-0.6.4.tgz#d70fc6121975b35fc12830cf52754be2740fc886" @@ -4595,6 +4835,13 @@ extend-shallow@^2.0.1: dependencies: is-extendable "^0.1.0" +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" @@ -4626,6 +4873,19 @@ extglob@^2.0.2: snapdragon "^0.8.1" to-regex "^3.0.1" +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + extract-zip@^1.0.3, extract-zip@^1.6.5: version "1.6.5" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.5.tgz#99a06735b6ea20ea9b705d779acffcc87cff0440" @@ -4679,6 +4939,12 @@ faye-websocket@~0.11.0: dependencies: websocket-driver ">=0.5.1" +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + dependencies: + bser "^2.0.0" + fbjs@^0.8.1, fbjs@^0.8.12, fbjs@^0.8.16, fbjs@^0.8.9: version "0.8.16" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" @@ -4735,6 +5001,13 @@ filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" +fileset@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + dependencies: + glob "^7.0.3" + minimatch "^3.0.3" + fill-range@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" @@ -4984,6 +5257,13 @@ fsevents@^1.0.0: nan "^2.3.0" node-pre-gyp "^0.6.36" +fsevents@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.39" + fsp@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/fsp/-/fsp-0.1.2.tgz#40e2f33da9eeb4fa453b610c90075d9f1a52836b" @@ -5271,7 +5551,7 @@ glob@^6.0.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@~7.1.1: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: @@ -5417,6 +5697,10 @@ growl@1.9.2: version "1.9.2" resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + gtoken@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-1.2.2.tgz#172776a1a9d96ac09fc22a00f5be83cee6de8820" @@ -5450,7 +5734,7 @@ handlebars@^4.0.2: optionalDependencies: uglify-js "^2.6" -handlebars@^4.0.6: +handlebars@^4.0.3, handlebars@^4.0.6: version "4.0.11" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" dependencies: @@ -5708,6 +5992,12 @@ html-element-attributes@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/html-element-attributes/-/html-element-attributes-1.3.0.tgz#f06ebdfce22de979db82020265cac541fb17d4fc" +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + dependencies: + whatwg-encoding "^1.0.1" + html-entities@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" @@ -5841,6 +6131,13 @@ import-local@^0.1.1: pkg-dir "^2.0.0" resolve-cwd "^2.0.0" +import-local@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" + dependencies: + pkg-dir "^2.0.0" + resolve-cwd "^2.0.0" + imports-loader@^0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/imports-loader/-/imports-loader-0.7.1.tgz#f204b5f34702a32c1db7d48d89d5e867a0441253" @@ -6007,6 +6304,12 @@ is-accessor-descriptor@^0.1.6: dependencies: kind-of "^3.0.2" +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + dependencies: + kind-of "^6.0.0" + is-alphabetical@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.1.tgz#c77079cc91d4efac775be1034bf2d243f95e6f08" @@ -6062,6 +6365,12 @@ is-data-descriptor@^0.1.4: dependencies: kind-of "^3.0.2" +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + dependencies: + kind-of "^6.0.0" + is-date-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" @@ -6086,6 +6395,14 @@ is-descriptor@^1.0.0: is-data-descriptor "^0.1.4" kind-of "^5.0.0" +is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + is-directory@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" @@ -6112,6 +6429,12 @@ is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + dependencies: + is-plain-object "^2.0.4" + is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" @@ -6140,6 +6463,10 @@ is-function@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" +is-generator-fn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" + is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" @@ -6203,6 +6530,10 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" @@ -6213,6 +6544,12 @@ is-odd@^1.0.0: dependencies: is-number "^3.0.0" +is-odd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" + dependencies: + is-number "^4.0.0" + is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" @@ -6345,6 +6682,10 @@ is-windows@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.1.tgz#310db70f742d259a16a369202b51af84233310d9" +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + is-word-character@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.1.tgz#5a03fa1ea91ace8a6eb0c7cd770eb86d65c8befb" @@ -6400,10 +6741,343 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" +istanbul-api@^1.1.14: + version "1.3.1" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.1.tgz#4c3b05d18c0016d1022e079b98dc82c40f488954" + dependencies: + async "^2.1.4" + compare-versions "^3.1.0" + fileset "^2.0.2" + istanbul-lib-coverage "^1.2.0" + istanbul-lib-hook "^1.2.0" + istanbul-lib-instrument "^1.10.1" + istanbul-lib-report "^1.1.4" + istanbul-lib-source-maps "^1.2.4" + istanbul-reports "^1.3.0" + js-yaml "^3.7.0" + mkdirp "^0.5.1" + once "^1.4.0" + +istanbul-lib-coverage@^1.1.1, istanbul-lib-coverage@^1.1.2, istanbul-lib-coverage@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz#f7d8f2e42b97e37fe796114cb0f9d68b5e3a4341" + +istanbul-lib-hook@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz#ae556fd5a41a6e8efa0b1002b1e416dfeaf9816c" + dependencies: + append-transform "^0.4.0" + +istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.7.5, istanbul-lib-instrument@^1.8.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz#724b4b6caceba8692d3f1f9d0727e279c401af7b" + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.18.0" + istanbul-lib-coverage "^1.2.0" + semver "^5.3.0" + +istanbul-lib-report@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz#e886cdf505c4ebbd8e099e4396a90d0a28e2acb5" + dependencies: + istanbul-lib-coverage "^1.2.0" + mkdirp "^0.5.1" + path-parse "^1.0.5" + supports-color "^3.1.2" + +istanbul-lib-source-maps@^1.2.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz#20fb54b14e14b3fb6edb6aca3571fd2143db44e6" + dependencies: + debug "^3.1.0" + istanbul-lib-coverage "^1.1.2" + mkdirp "^0.5.1" + rimraf "^2.6.1" + source-map "^0.5.3" + +istanbul-lib-source-maps@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz#cc7ccad61629f4efff8e2f78adb8c522c9976ec7" + dependencies: + debug "^3.1.0" + istanbul-lib-coverage "^1.2.0" + mkdirp "^0.5.1" + rimraf "^2.6.1" + source-map "^0.5.3" + +istanbul-reports@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.3.0.tgz#2f322e81e1d9520767597dca3c20a0cce89a3554" + dependencies: + handlebars "^4.0.3" + +jest-changed-files@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-22.4.3.tgz#8882181e022c38bd46a2e4d18d44d19d90a90fb2" + dependencies: + throat "^4.0.0" + +jest-cli@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-22.4.3.tgz#bf16c4a5fb7edc3fa5b9bb7819e34139e88a72c7" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.1.11" + import-local "^1.0.0" + is-ci "^1.0.10" + istanbul-api "^1.1.14" + istanbul-lib-coverage "^1.1.1" + istanbul-lib-instrument "^1.8.0" + istanbul-lib-source-maps "^1.2.1" + jest-changed-files "^22.4.3" + jest-config "^22.4.3" + jest-environment-jsdom "^22.4.3" + jest-get-type "^22.4.3" + jest-haste-map "^22.4.3" + jest-message-util "^22.4.3" + jest-regex-util "^22.4.3" + jest-resolve-dependencies "^22.4.3" + jest-runner "^22.4.3" + jest-runtime "^22.4.3" + jest-snapshot "^22.4.3" + jest-util "^22.4.3" + jest-validate "^22.4.3" + jest-worker "^22.4.3" + micromatch "^2.3.11" + node-notifier "^5.2.1" + realpath-native "^1.0.0" + rimraf "^2.5.4" + slash "^1.0.0" + string-length "^2.0.0" + strip-ansi "^4.0.0" + which "^1.2.12" + yargs "^10.0.3" + +jest-config@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.4.3.tgz#0e9d57db267839ea31309119b41dc2fa31b76403" + dependencies: + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^22.4.3" + jest-environment-node "^22.4.3" + jest-get-type "^22.4.3" + jest-jasmine2 "^22.4.3" + jest-regex-util "^22.4.3" + jest-resolve "^22.4.3" + jest-util "^22.4.3" + jest-validate "^22.4.3" + pretty-format "^22.4.3" + +jest-diff@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-22.4.3.tgz#e18cc3feff0aeef159d02310f2686d4065378030" + dependencies: + chalk "^2.0.1" + diff "^3.2.0" + jest-get-type "^22.4.3" + pretty-format "^22.4.3" + jest-docblock@^21.0.0: version "21.2.0" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414" +jest-docblock@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-22.4.3.tgz#50886f132b42b280c903c592373bb6e93bb68b19" + dependencies: + detect-newline "^2.1.0" + +jest-environment-jsdom@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz#d67daa4155e33516aecdd35afd82d4abf0fa8a1e" + dependencies: + jest-mock "^22.4.3" + jest-util "^22.4.3" + jsdom "^11.5.1" + +jest-environment-node@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.4.3.tgz#54c4eaa374c83dd52a9da8759be14ebe1d0b9129" + dependencies: + jest-mock "^22.4.3" + jest-util "^22.4.3" + +jest-get-type@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" + +jest-haste-map@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-22.4.3.tgz#25842fa2ba350200767ac27f658d58b9d5c2e20b" + dependencies: + fb-watchman "^2.0.0" + graceful-fs "^4.1.11" + jest-docblock "^22.4.3" + jest-serializer "^22.4.3" + jest-worker "^22.4.3" + micromatch "^2.3.11" + sane "^2.0.0" + +jest-jasmine2@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.4.3.tgz#4daf64cd14c793da9db34a7c7b8dcfe52a745965" + dependencies: + chalk "^2.0.1" + co "^4.6.0" + expect "^22.4.3" + graceful-fs "^4.1.11" + is-generator-fn "^1.0.0" + jest-diff "^22.4.3" + jest-matcher-utils "^22.4.3" + jest-message-util "^22.4.3" + jest-snapshot "^22.4.3" + jest-util "^22.4.3" + source-map-support "^0.5.0" + +jest-leak-detector@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz#2b7b263103afae8c52b6b91241a2de40117e5b35" + dependencies: + pretty-format "^22.4.3" + +jest-matcher-utils@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz#4632fe428ebc73ebc194d3c7b65d37b161f710ff" + dependencies: + chalk "^2.0.1" + jest-get-type "^22.4.3" + pretty-format "^22.4.3" + +jest-message-util@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.4.3.tgz#cf3d38aafe4befddbfc455e57d65d5239e399eb7" + dependencies: + "@babel/code-frame" "^7.0.0-beta.35" + chalk "^2.0.1" + micromatch "^2.3.11" + slash "^1.0.0" + stack-utils "^1.0.1" + +jest-mock@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.4.3.tgz#f63ba2f07a1511772cdc7979733397df770aabc7" + +jest-regex-util@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-22.4.3.tgz#a826eb191cdf22502198c5401a1fc04de9cef5af" + +jest-resolve-dependencies@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz#e2256a5a846732dc3969cb72f3c9ad7725a8195e" + dependencies: + jest-regex-util "^22.4.3" + +jest-resolve@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.4.3.tgz#0ce9d438c8438229aa9b916968ec6b05c1abb4ea" + dependencies: + browser-resolve "^1.11.2" + chalk "^2.0.1" + +jest-runner@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-22.4.3.tgz#298ddd6a22b992c64401b4667702b325e50610c3" + dependencies: + exit "^0.1.2" + jest-config "^22.4.3" + jest-docblock "^22.4.3" + jest-haste-map "^22.4.3" + jest-jasmine2 "^22.4.3" + jest-leak-detector "^22.4.3" + jest-message-util "^22.4.3" + jest-runtime "^22.4.3" + jest-util "^22.4.3" + jest-worker "^22.4.3" + throat "^4.0.0" + +jest-runtime@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-22.4.3.tgz#b69926c34b851b920f666c93e86ba2912087e3d0" + dependencies: + babel-core "^6.0.0" + babel-jest "^22.4.3" + babel-plugin-istanbul "^4.1.5" + chalk "^2.0.1" + convert-source-map "^1.4.0" + exit "^0.1.2" + graceful-fs "^4.1.11" + jest-config "^22.4.3" + jest-haste-map "^22.4.3" + jest-regex-util "^22.4.3" + jest-resolve "^22.4.3" + jest-util "^22.4.3" + jest-validate "^22.4.3" + json-stable-stringify "^1.0.1" + micromatch "^2.3.11" + realpath-native "^1.0.0" + slash "^1.0.0" + strip-bom "3.0.0" + write-file-atomic "^2.1.0" + yargs "^10.0.3" + +jest-serializer@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-22.4.3.tgz#a679b81a7f111e4766235f4f0c46d230ee0f7436" + +jest-snapshot@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.4.3.tgz#b5c9b42846ffb9faccb76b841315ba67887362d2" + dependencies: + chalk "^2.0.1" + jest-diff "^22.4.3" + jest-matcher-utils "^22.4.3" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^22.4.3" + +jest-util@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.4.3.tgz#c70fec8eec487c37b10b0809dc064a7ecf6aafac" + dependencies: + callsites "^2.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.11" + is-ci "^1.0.10" + jest-message-util "^22.4.3" + mkdirp "^0.5.1" + source-map "^0.6.0" + +jest-validate@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.4.3.tgz#0780954a5a7daaeec8d3c10834b9280865976b30" + dependencies: + chalk "^2.0.1" + jest-config "^22.4.3" + jest-get-type "^22.4.3" + leven "^2.1.0" + pretty-format "^22.4.3" + +jest-worker@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-22.4.3.tgz#5c421417cba1c0abf64bf56bd5fb7968d79dd40b" + dependencies: + merge-stream "^1.0.1" + +jest@^22.0.4: + version "22.4.3" + resolved "https://registry.yarnpkg.com/jest/-/jest-22.4.3.tgz#2261f4b117dc46d9a4a1a673d2150958dee92f16" + dependencies: + import-local "^1.0.0" + jest-cli "^22.4.3" + js-base64@^2.1.8, js-base64@^2.1.9: version "2.3.2" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.3.2.tgz#a79a923666372b580f8e27f51845c6f7e8fbfbaf" @@ -6419,6 +7093,13 @@ js-yaml@^3.10.0, js-yaml@^3.4.3, js-yaml@^3.5.1, js-yaml@^3.8.1, js-yaml@^3.8.4: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^3.7.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@~3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" @@ -6434,6 +7115,37 @@ jschardet@^1.4.2: version "1.5.1" resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.5.1.tgz#c519f629f86b3a5bedba58a88d311309eec097f9" +jsdom@^11.5.1: + version "11.7.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.7.0.tgz#8b45b657dae90d6d2d3a5f5d1126bb7102d0a172" + dependencies: + abab "^1.0.4" + acorn "^5.3.0" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle ">= 0.2.37 < 0.3.0" + data-urls "^1.0.0" + domexception "^1.0.0" + escodegen "^1.9.0" + html-encoding-sniffer "^1.0.2" + left-pad "^1.2.0" + nwmatcher "^1.4.3" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.83.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.3" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.0" + ws "^4.0.0" + xml-name-validator "^3.0.0" + jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" @@ -6574,6 +7286,10 @@ kind-of@^5.0.0, kind-of@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.0.2.tgz#f57bec933d9a2209ffa96c5c08343607b7035fda" +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" @@ -6616,6 +7332,10 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" +left-pad@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.2.0.tgz#d30a73c6b8201d8f7d8e7956ba9616087a68e0ee" + lerna@2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/lerna/-/lerna-2.8.0.tgz#309a816fca5c73ea38f9f20e314a836e99b54cf0" @@ -6660,6 +7380,10 @@ lerna@2.8.0: write-pkg "^3.1.0" yargs "^8.0.2" +leven@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -6998,6 +7722,12 @@ make-dir@^1.0.0: dependencies: pify "^2.3.0" +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + dependencies: + tmpl "1.0.x" + map-cache@^0.2.0, map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -7144,12 +7874,16 @@ merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" -merge-stream@^1.0.0: +merge-stream@^1.0.0, merge-stream@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" dependencies: readable-stream "^2.0.1" +merge@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + methmeth@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/methmeth/-/methmeth-1.1.0.tgz#e80a26618e52f5c4222861bb748510bd10e29089" @@ -7194,6 +7928,24 @@ micromatch@^3.0.0, micromatch@^3.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +micromatch@^3.1.4, micromatch@^3.1.8: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -7271,7 +8023,7 @@ minimist@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de" -minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -7446,6 +8198,23 @@ nanomatch@^1.2.1: snapdragon "^0.8.1" to-regex "^3.0.1" +nanomatch@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-odd "^2.0.0" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -7511,6 +8280,10 @@ node-gyp@^3.3.1: tar "^2.0.0" which "1" +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + node-libs-browser@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-1.1.1.tgz#2a38243abedd7dffcd07a97c9aca5668975a6fea" @@ -7571,6 +8344,15 @@ node-noop@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/node-noop/-/node-noop-1.0.0.tgz#47a3e7d80cffaa6458364bd22ed85cab3307be79" +node-notifier@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" + dependencies: + growly "^1.3.0" + semver "^5.4.1" + shellwords "^0.1.1" + which "^1.3.0" + node-pre-gyp@^0.6.32, node-pre-gyp@^0.6.36: version "0.6.38" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.38.tgz#e92a20f83416415bb4086f6d1fb78b3da73d113d" @@ -7586,6 +8368,22 @@ node-pre-gyp@^0.6.32, node-pre-gyp@^0.6.36: tar "^2.2.1" tar-pack "^3.4.0" +node-pre-gyp@^0.6.39: + version "0.6.39" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" + dependencies: + detect-libc "^1.0.2" + hawk "3.1.3" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + node-sass@^4.7.2: version "4.7.2" resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.7.2.tgz#9366778ba1469eb01438a9e8592f4262bcb6794e" @@ -7651,7 +8449,7 @@ normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package- semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.0, normalize-path@^2.0.1: +normalize-path@^2.0.0, 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: @@ -7709,6 +8507,10 @@ number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" +nwmatcher@^1.4.3: + version "1.4.4" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" + oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" @@ -7836,7 +8638,7 @@ optimist@>=0.3.4, optimist@^0.6.1, optimist@~0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -optionator@^0.8.2: +optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" dependencies: @@ -8032,6 +8834,10 @@ parse-url@^1.3.0: is-ssh "^1.3.0" protocols "^1.4.0" +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" @@ -8190,6 +8996,10 @@ pluralize@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + podda@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/podda/-/podda-1.2.2.tgz#15b0edbd334ade145813343f5ecf9c10a71cf500" @@ -8541,6 +9351,13 @@ pretty-bytes@^1.0.2: get-stdin "^4.0.1" meow "^3.1.0" +pretty-format@^22.4.3: + version "22.4.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.4.3.tgz#f873d780839a9c02e9664c8a082e9ee79eaac16f" + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + private@^0.1.6, private@^0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" @@ -8674,6 +9491,10 @@ punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" +punycode@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" + pupa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/pupa/-/pupa-1.0.0.tgz#9a9568a5af7e657b8462a6e9d5328743560ceff6" @@ -9260,6 +10081,12 @@ readline2@^1.0.1: is-fullwidth-code-point "^1.0.0" mute-stream "0.0.5" +realpath-native@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.0.tgz#7885721a83b43bd5327609f0ddecb2482305fdf0" + dependencies: + util.promisify "^1.0.0" + recast@^0.12.6: version "0.12.9" resolved "https://registry.yarnpkg.com/recast/-/recast-0.12.9.tgz#e8e52bdb9691af462ccbd7c15d5a5113647a15f1" @@ -9376,6 +10203,13 @@ regex-not@^1.0.0: dependencies: extend-shallow "^2.0.1" +regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + regexpu-core@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" @@ -9525,6 +10359,20 @@ replace-ext@1.0.0, replace-ext@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" +request-promise-core@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" + dependencies: + lodash "^4.13.1" + +request-promise-native@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" + dependencies: + request-promise-core "1.1.1" + stealthy-require "^1.1.0" + tough-cookie ">=2.3.3" + request@2, request@^2.45.0, request@^2.72.0, request@^2.74.0, request@^2.79.0, request@^2.81.0, request@^2.83.0: version "2.83.0" resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" @@ -9779,6 +10627,12 @@ safe-json-parse@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + dependencies: + ret "~0.1.10" + sanctuary-def@^0.14.0: version "0.14.0" resolved "https://registry.yarnpkg.com/sanctuary-def/-/sanctuary-def-0.14.0.tgz#cebbec591f5a9b211b34b4b942999d6534010fa8" @@ -9800,6 +10654,20 @@ sanctuary-type-identifiers@2.0.x, sanctuary-type-identifiers@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/sanctuary-type-identifiers/-/sanctuary-type-identifiers-2.0.1.tgz#fc524cf6dd92cebfcbb0dd9509eff193159a20ed" +sane@^2.0.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.0.tgz#6359cd676f5efd9988b264d8ce3b827dd6b27bec" + dependencies: + anymatch "^2.0.0" + exec-sh "^0.2.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.18.0" + optionalDependencies: + fsevents "^1.1.1" + sanitize-filename@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.1.tgz#612da1c96473fa02dccda92dcd5b4ab164a6772a" @@ -10044,6 +10912,10 @@ shelljs@^0.7.5, shelljs@^0.7.7, shelljs@^0.7.8: interpret "^1.0.0" rechoir "^0.6.2" +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + shortid@^2.2.6, shortid@^2.2.8: version "2.2.8" resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.8.tgz#033b117d6a2e975804f6f0969dbe7d3d0b355131" @@ -10287,6 +11159,12 @@ split-string@^3.0.1: dependencies: extend-shallow "^2.0.1" +split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + dependencies: + extend-shallow "^3.0.0" + split2@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" @@ -10323,6 +11201,10 @@ ssri@^5.0.0: dependencies: safe-buffer "^5.1.0" +stack-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" + stat-mode@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" @@ -10348,6 +11230,10 @@ stdout-stream@^1.4.0: dependencies: readable-stream "^2.0.1" +stealthy-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + stream-array@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/stream-array/-/stream-array-1.1.2.tgz#9e5f7345f2137c30ee3b498b9114e80b52bb7eb5" @@ -10403,6 +11289,13 @@ string-format-obj@^1.0.0, string-format-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/string-format-obj/-/string-format-obj-1.1.0.tgz#7635610b1ef397013e8478be98a170e04983d068" +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + string-template@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" @@ -10415,7 +11308,7 @@ string-width@^1.0.0, string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0, string-width@^2.1.0: +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" dependencies: @@ -10480,16 +11373,16 @@ strip-bom-stream@^1.0.0: first-chunk-stream "^1.0.0" strip-bom "^2.0.0" +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" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" dependencies: is-utf8 "^0.2.0" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -10561,7 +11454,7 @@ supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" -supports-color@^3.2.3, supports-color@~3.2.3: +supports-color@^3.1.2, supports-color@^3.2.3, supports-color@~3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" dependencies: @@ -10624,6 +11517,10 @@ symbol-observable@^1.0.3, symbol-observable@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" +symbol-tree@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + table@^3.7.8: version "3.8.3" resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" @@ -10730,6 +11627,16 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" +test-exclude@^4.1.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.1.tgz#dfa222f03480bca69207ca728b37d74b45f724fa" + dependencies: + arrify "^1.0.1" + micromatch "^3.1.8" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + text-extensions@^1.0.0: version "1.7.0" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.7.0.tgz#faaaba2625ed746d568a23e4d0aacd9bf08a8b39" @@ -10738,6 +11645,10 @@ text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + throttle-debounce@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-1.0.1.tgz#dad0fe130f9daf3719fdea33dc36a8e6ba7f30b5" @@ -10826,6 +11737,10 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + to-absolute-glob@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f" @@ -10865,12 +11780,33 @@ to-regex@^3.0.1: extend-shallow "^2.0.1" regex-not "^1.0.0" +to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +tough-cookie@>=2.3.3, tough-cookie@^2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" + dependencies: + punycode "^1.4.1" + tough-cookie@~2.3.0, tough-cookie@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" dependencies: punycode "^1.4.1" +tr46@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + dependencies: + punycode "^2.1.0" + trim-lines@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-1.1.0.tgz#9926d03ede13ba18f7d42222631fb04c79ff26fe" @@ -11259,6 +12195,13 @@ util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" +util.promisify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + util@0.10.3, util@^0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" @@ -11408,16 +12351,35 @@ vm-browserify@0.0.4: dependencies: indexof "0.0.1" +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + dependencies: + browser-process-hrtime "^0.1.2" + walkdir@^0.0.11: version "0.0.11" resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.0.11.tgz#a16d025eb931bd03b52f308caed0f40fcebe9532" +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + dependencies: + makeerror "1.0.x" + warning@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" dependencies: loose-envify "^1.0.0" +watch@~0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" + dependencies: + exec-sh "^0.2.0" + minimist "^1.2.0" + watchpack@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.4.0.tgz#4a1472bcbb952bd0a9bb4036801f954dfb39faac" @@ -11469,6 +12431,10 @@ webdriverio@^4.8.0: wdio-dot-reporter "~0.0.8" wgxpath "~1.0.0" +webidl-conversions@^4.0.1, webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + webpack-dev-middleware@^1.11.0, webpack-dev-middleware@^1.12.2: version "1.12.2" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz#f8fc1120ce3b4fc5680ceecb43d777966b21105e" @@ -11575,10 +12541,28 @@ wgxpath@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wgxpath/-/wgxpath-1.0.0.tgz#eef8a4b9d558cc495ad3a9a2b751597ecd9af690" +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" + dependencies: + iconv-lite "0.4.19" + whatwg-fetch@2.0.3, whatwg-fetch@>=0.10.0: version "2.0.3" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" +whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" + +whatwg-url@^6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.0.tgz#08fdf2b9e872783a7a1f6216260a1d66cc722e08" + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.0" + webidl-conversions "^4.0.1" + when@>=3.6.2: version "3.7.8" resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82" @@ -11595,7 +12579,7 @@ which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" -which@1, which@^1.2.14, which@^1.2.9: +which@1, which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" dependencies: @@ -11661,7 +12645,7 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" -write-file-atomic@^2.0.0, write-file-atomic@^2.3.0: +write-file-atomic@^2.0.0, write-file-atomic@^2.1.0, write-file-atomic@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" dependencies: @@ -11709,6 +12693,13 @@ ws@^3.1.0: safe-buffer "~5.1.0" ultron "~1.1.0" +ws@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289" + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + x-is-function@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/x-is-function/-/x-is-function-1.0.4.tgz#5d294dc3d268cbdd062580e0c5df77a391d1fa1e" @@ -11727,6 +12718,10 @@ xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + xmlbuilder@8.2.2: version "8.2.2" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773" @@ -11775,6 +12770,29 @@ yargs-parser@^7.0.0: dependencies: camelcase "^4.1.0" +yargs-parser@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" + dependencies: + camelcase "^4.1.0" + +yargs@^10.0.3: + version "10.1.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^8.1.0" + yargs@^6.0.1, yargs@^6.6.0: version "6.6.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208"