From 188854bdf09beae88f9c12b07b5af7ec23d8628f Mon Sep 17 00:00:00 2001 From: Drew Banin Date: Sun, 2 Aug 2020 14:14:09 -0400 Subject: [PATCH 1/5] refactor; add tests; support intersection --- package.json | 10 +- src/app/components/graph/graph-launcher.js | 6 +- src/app/services/graph.service.js | 13 +- src/app/services/node_selection_service.js | 322 +-- src/app/services/selector_graph.js | 57 + src/app/services/selector_graph.test.js | 143 ++ src/app/services/selector_integration.test.js | 428 ++++ src/app/services/selector_matcher.js | 165 ++ src/app/services/selector_matcher.test.js | 239 ++ src/app/services/selector_methods.js | 204 ++ src/app/services/selector_methods.test.js | 349 +++ yarn.lock | 2044 ++++++++++++++++- 12 files changed, 3632 insertions(+), 348 deletions(-) create mode 100644 src/app/services/selector_graph.js create mode 100644 src/app/services/selector_graph.test.js create mode 100644 src/app/services/selector_integration.test.js create mode 100644 src/app/services/selector_matcher.js create mode 100644 src/app/services/selector_matcher.test.js create mode 100644 src/app/services/selector_methods.js create mode 100644 src/app/services/selector_methods.test.js diff --git a/package.json b/package.json index f25d1606b..dab3365da 100644 --- a/package.json +++ b/package.json @@ -1,4 +1,9 @@ { + "scripts": { + "test": "jest", + "watch": "jest --watch", + "start": "webpack-dev-server --disable-host-check" + }, "devDependencies": { "angular": "^1.7.9", "angular-loader": "~1.5.0", @@ -25,6 +30,7 @@ "html-webpack-plugin": "^3.2.0", "html5-boilerplate": "^5.3.0", "inline-source": "^6.1.5", + "jest": "^26.2.2", "jquery": "~3.4.0", "md5": "^2.2.1", "ngtemplate-loader": "^2.0.1", @@ -40,10 +46,6 @@ "webpack-dev-server": "^3.1.11", "webpack-inline-svg-plugin": "^1.1.4" }, - "scripts": { - "test": "echo 'Error: no test specified' && exit 1", - "start": "webpack-dev-server" - }, "dependencies": { "prismjs": "^1.20.0" } diff --git a/src/app/components/graph/graph-launcher.js b/src/app/components/graph/graph-launcher.js index b3611828e..831755332 100644 --- a/src/app/components/graph/graph-launcher.js +++ b/src/app/components/graph/graph-launcher.js @@ -195,10 +195,10 @@ angular var clean_selector = selectorService.selection.clean; var dirty_selector = selectorService.selection.dirty; - var clean_nodes = selectorService.select_nodes(dag, all_nodes, clean_selector) - var dirty_nodes = selectorService.select_nodes(dag, all_nodes, dirty_selector) + var clean_nodes = selectorService.selectNodes(dag, all_nodes, clean_selector) + var dirty_nodes = selectorService.selectNodes(dag, all_nodes, dirty_selector) - var nodes_to_remove = _.difference(clean_nodes.nodes, dirty_nodes.nodes); + var nodes_to_remove = _.difference(clean_nodes.selected, dirty_nodes.selected); graph.markDirty(nodes_to_remove) diff --git a/src/app/services/graph.service.js b/src/app/services/graph.service.js index 528b3a66f..65c32c1a1 100644 --- a/src/app/services/graph.service.js +++ b/src/app/services/graph.service.js @@ -3,6 +3,7 @@ const $ = require('jquery'); const _ = require('underscore'); const graphlib = require('graphlib'); +const selectorGraph = require('./selector_graph'); angular .module('dbt') @@ -44,8 +45,8 @@ angular } var dag = service.graph.pristine.dag; - var parents = _.sortBy(selectorService.ancestors(dag, primary_node_id, 1)); - var children = _.sortBy(selectorService.descendents(dag, primary_node_id, 1)); + var parents = _.sortBy(selectorGraph.ancestorNodes(dag, primary_node_id, 1)); + var children = _.sortBy(selectorGraph.descendentNodes(dag, primary_node_id, 1)); var is_parent = _.partial(_.includes, parents); var is_child = _.partial(_.includes, children); @@ -394,10 +395,10 @@ angular // good: "+source:quickbooks.invoices+" var pristine = service.graph.pristine.nodes; - var selected = selectorService.select_nodes(dag, pristine, selected_spec); + var selected = selectorService.selectNodes(dag, pristine, selected_spec); var highlight_nodes = should_highlight ? selected.matched : []; - return setNodes(selected.nodes, highlight_nodes, classes); + return setNodes(selected.selected, highlight_nodes, classes); } service.hideGraph = function() { @@ -479,8 +480,8 @@ angular // get all edges that pass through this node var dag = service.graph.pristine.dag; - var parents = _.indexBy(selectorService.ancestors(dag, node_id)); - var children = _.indexBy(selectorService.descendents(dag, node_id)); + var parents = _.indexBy(selectorGraph.ancestorNodes(dag, node_id)); + var children = _.indexBy(selectorGraph.descendentNodes(dag, node_id)); parents[node_id] = node_id; children[node_id] = node_id; diff --git a/src/app/services/node_selection_service.js b/src/app/services/node_selection_service.js index 2e6b1c6f3..a69197eba 100644 --- a/src/app/services/node_selection_service.js +++ b/src/app/services/node_selection_service.js @@ -1,16 +1,7 @@ const $ = require('jquery'); const _ = require('underscore'); - -var SELECTOR_AT = '@' -var SELECTOR_PARENTS = '+' -var SELECTOR_CHILDREN = '+' -var SELECTOR_GLOB = '*' -var SELECTOR_TYPE = { - FQN: 'fqn:', - TAG: 'tag:', - SOURCE: 'source:' -} +const selectorMethods = require('./selector_methods'); angular .module('dbt') @@ -132,316 +123,9 @@ angular return service.selection.clean; } - // Returns all parents of all children of the node - function select_at(dag, node) { - var selected = [node]; - var children = _.union([node], descendents(dag, node)); - - _.each(children, function(child) { - var ancestor_nodes = ancestors(dag, child); - selected = _.union(selected, ancestor_nodes, [child]); - }); - - return selected; - } - - function ancestors(dag, node, max_hops, hop_index) { - if (!hop_index) hop_index = 1; - - var up = dag.predecessors(node); - // node is not in the dag - if (!up) { - return []; - } - - return up.concat(up.reduce(function(sum, u) { - if (hop_index >= max_hops && max_hops !== undefined) { - return sum - } - return sum.concat(ancestors(dag, u, max_hops, hop_index + 1)); - }, [])); - } - - function descendents(dag, node, max_hops, hop_index) { - if (!hop_index) hop_index = 1; - - var down = dag.successors(node); - if (!down) { - return []; - } - - return down.concat(down.reduce(function(sum, u) { - if (hop_index >= max_hops && max_hops !== undefined) { - return sum - } - return sum.concat(descendents(dag, u, max_hops, hop_index + 1)); - }, [])); - } - - - function split_specs(node_spec) { - return _.filter(_.uniq(node_spec.split(" ")), function(s) { - return s.length > 0; - }); - } - - function parse_spec(node_spec) { - var select_at = false; - var select_children = false; - var select_parents = false; - var index_start = 0; - var index_end = node_spec.length; - - // @+ is not a valid selector - one or the other is required - if (node_spec.startsWith(SELECTOR_AT)) { - select_at = true; - index_start = 1; - } else if (node_spec.startsWith(SELECTOR_PARENTS)) { - select_parents = true; - index_start = 1; - } - - if (node_spec.endsWith(SELECTOR_CHILDREN)) { - select_children = true; - index_end -= 1; - } - - var node_selector = node_spec.substring(index_start, index_end) - - var selector_type; - var selector_val; - if (node_selector.startsWith(SELECTOR_TYPE.TAG)) { - selector_type = SELECTOR_TYPE.TAG; - selector_val = node_selector.replace(selector_type, ''); - } else if (node_selector.startsWith(SELECTOR_TYPE.SOURCE)) { - selector_type = SELECTOR_TYPE.SOURCE; - selector_val = node_selector.replace(selector_type, ''); - } else { - selector_type = SELECTOR_TYPE.FQN; - selector_val = node_selector.replace(selector_type, '').split('.'); - } - - return { - select_at: select_at, - select_parents: select_parents, - select_children: select_children, - selector_type: selector_type, - selector_value: selector_val, - raw: node_spec - } - } - - function parse_specs(raw_include_specs, raw_exclude_specs, hops) { - var specs = []; - - var split_include_specs = split_specs(raw_include_specs); - var include_specs = _.map(split_include_specs, parse_spec); - - var split_exclude_specs = split_specs(raw_exclude_specs); - var exclude_specs = _.map(split_exclude_specs, parse_spec); - - return { - include: include_specs, - exclude: exclude_specs, - hops: hops - } - } - - function is_selected_node(real_node, node_selector) { - for (var i=0; i 0; - // TODO : This is a special case for data tests :/ - if (node.data.resource_type == 'test') { - var matched_untagged = _.includes(selected_spec.tags, null) && (node.data.tags.length == 1); - } else { - var matched_untagged = _.includes(selected_spec.tags, null) && (node.data.tags.length == 0); - } - var matched_types = _.includes(selected_spec.resource_types, node.data.resource_type); - - if (!matched_package || (!matched_tags && !matched_untagged) || !matched_types) { - nodes_to_prune.push(node.data.unique_id); - } - }) - - var nodes_to_return = _.difference(nodes_to_include, nodes_to_prune); - - return { - nodes: nodes_to_return, - matched: selected_nodes - } + service.selectNodes = function(dag, pristine, selectedSpec) { + return selectorMethods.selectNodes(dag, pristine, selectedSpec); } - service.parse_specs = parse_specs; - service.get_nodes_by_qualified_name = get_nodes_by_qualified_name; - service.select_nodes = select_nodes; - service.ancestors = ancestors; - service.descendents = descendents; - return service; }]); diff --git a/src/app/services/selector_graph.js b/src/app/services/selector_graph.js new file mode 100644 index 000000000..8531b39de --- /dev/null +++ b/src/app/services/selector_graph.js @@ -0,0 +1,57 @@ +const _ = require('underscore'); + +// Returns all parents of all children of the node +function selectAt(dag, node) { + var selected = [node]; + var children = _.union([node], descendentNodes(dag, node)); + + _.each(children, function(child) { + var ancestor_nodes = ancestorNodes(dag, child); + selected = _.union(selected, ancestor_nodes, [child]); + }); + + return selected; +} + +function ancestorNodes(dag, node, max_hops, hop_index) { + if (!hop_index) hop_index = 1; + + var up = dag.predecessors(node); + // node is not in the dag + if (!up) { + return []; + } + + var ancestors = up.concat(up.reduce(function(sum, u) { + if (hop_index >= max_hops && max_hops !== undefined) { + return sum + } + return sum.concat(ancestorNodes(dag, u, max_hops, hop_index + 1)); + }, [])); + + return _.uniq(ancestors); +} + +function descendentNodes(dag, node, max_hops, hop_index) { + if (!hop_index) hop_index = 1; + + var down = dag.successors(node); + if (!down) { + return []; + } + + var descendents = down.concat(down.reduce(function(sum, u) { + if (hop_index >= max_hops && max_hops !== undefined) { + return sum + } + return sum.concat(descendentNodes(dag, u, max_hops, hop_index + 1)); + }, [])); + + return _.uniq(descendents); +} + +module.exports = { + selectAt, + ancestorNodes, + descendentNodes, +} diff --git a/src/app/services/selector_graph.test.js b/src/app/services/selector_graph.test.js new file mode 100644 index 000000000..1ef9c26b3 --- /dev/null +++ b/src/app/services/selector_graph.test.js @@ -0,0 +1,143 @@ + +const graph = require("./selector_graph"); +const _ = require('underscore'); +const graphlib = require('graphlib'); + +var dag = new graphlib.Graph({directed: true}); + +/* + a ---> b -----\ + \ +--->d + \-------> c --/ + \ + +---> e + + f +*/ + +dag.setNode("a"); +dag.setNode("b"); +dag.setNode("c"); +dag.setNode("d"); +dag.setNode("e"); +dag.setNode("f"); + +dag.setEdge("a", "b"); +dag.setEdge("a", "c"); +dag.setEdge("b", "d"); +dag.setEdge("c", "d"); +dag.setEdge("c", "e"); + +test("Test node ancestors", () => { + expect( + graph.ancestorNodes(dag, 'd').sort() + ).toStrictEqual( + ['a', 'b', 'c'].sort() + ) + + expect( + graph.ancestorNodes(dag, 'b').sort() + ).toStrictEqual( + ['a'].sort() + ) + + expect( + graph.ancestorNodes(dag, 'a') + ).toStrictEqual( + [] + ) + + expect( + graph.ancestorNodes(dag, 'd', 1) + ).toStrictEqual( + ['b', 'c'] + ) + + expect( + graph.ancestorNodes(dag, 'b', 1) + ).toStrictEqual( + ['a'] + ) + + expect( + graph.ancestorNodes(dag, 'e', 1) + ).toStrictEqual( + ['c'] + ) + + expect( + graph.ancestorNodes(dag, 'e', 2).sort() + ).toStrictEqual( + ['a', 'c'] + ) +}) + +test("Test node descendents", () => { + expect( + graph.descendentNodes(dag, 'd') + ).toStrictEqual( + [] + ) + + expect( + graph.descendentNodes(dag, 'b').sort() + ).toStrictEqual( + ['d'] + ) + + expect( + graph.descendentNodes(dag, 'a').sort() + ).toStrictEqual( + ['b', 'c', 'd', 'e'] + ) + + expect( + graph.descendentNodes(dag, 'a', 1).sort() + ).toStrictEqual( + ['b', 'c'] + ) + + expect( + graph.descendentNodes(dag, 'c', 1).sort() + ).toStrictEqual( + ['d', 'e'] + ) +}) + +test("Test node at-selector", () => { + expect( + graph.selectAt(dag, 'c').sort() + ).toStrictEqual( + ['a', 'b', 'c', 'd', 'e'] + ) + + expect( + graph.selectAt(dag, 'b').sort() + ).toStrictEqual( + ['a', 'b', 'c', 'd'] + ) + + expect( + graph.selectAt(dag, 'a').sort() + ).toStrictEqual( + ['a', 'b', 'c', 'd', 'e'] + ) + + expect( + graph.selectAt(dag, 'd').sort() + ).toStrictEqual( + ['a', 'b', 'c', 'd'] + ) + + expect( + graph.selectAt(dag, 'e').sort() + ).toStrictEqual( + ['a', 'c', 'e'] + ) + + expect( + graph.selectAt(dag, 'f').sort() + ).toStrictEqual( + ['f'] + ) +}) diff --git a/src/app/services/selector_integration.test.js b/src/app/services/selector_integration.test.js new file mode 100644 index 000000000..f12f1ead5 --- /dev/null +++ b/src/app/services/selector_integration.test.js @@ -0,0 +1,428 @@ + +const matcher = require("./selector_matcher"); +const selectorMethods = require("./selector_methods"); + +const _ = require('underscore'); +const graphlib = require('graphlib'); + +var dag = new graphlib.Graph({directed: true}); + +/* + a ---> b -----\ + \ +--->d + \-------> c --/ + \ + +---> e + + f +*/ + +dag.setNode("a", { + resource_type: 'source', + package_name: 'my_package', + source_name: 'event', + unique_id: 'a', + name: 'a', + tags: ['pii'] +}); + +dag.setNode("b", { + resource_type: 'model', + package_name: 'my_package', + unique_id: 'b', + name: 'b', + fqn: ['my_package', 'b'], + tags: ['nightly'], +}); + +dag.setNode("c", { + resource_type: 'model', + package_name: 'my_package', + unique_id: 'c', + name: 'c', + fqn: ['my_package', 'dir', 'c'], + tags: ['nightly'], +}); + +dag.setNode("d", { + resource_type: 'test', + package_name: 'my_package', + unique_id: 'd', + name: 'd', + fqn: ['my_package', 'dir', 'd'], + tags: ['daily', 'nightly'], +}); + +dag.setNode("e", { + resource_type: 'model', + package_name: 'my_package', + unique_id: 'e', + name: 'e', + fqn: ['my_package', 'dir', 'e'], + tags: ['nightly'], +}); + +dag.setNode("f", { + resource_type: 'model', + package_name: 'other_package', + unique_id: 'f', + name: 'f', + fqn: ['other_package', 'dir', 'f'], + tags: ['imported'], +}); + + +dag.setEdge("a", "b"); +dag.setEdge("a", "c"); +dag.setEdge("b", "d"); +dag.setEdge("c", "d"); +dag.setEdge("c", "e"); + +var pristine_nodes = _.map(dag.nodes(), (node) => { + var data = dag.node(node); + return { + data: data + }; +}) + +var pristine_node_map = _.indexBy(pristine_nodes, (n) => n.data.unique_id) + +test("Test getting nodes from a spec (no nodes)", () => { + expect( + matcher.getNodesFromSpec( + dag, + pristine_nodes, + undefined, + { + select_at: false, + select_parents: false, + select_children: false, + selector_type: 'fqn', + selector_value: 'badselector', + raw: 'badselector' + } + ) + ).toStrictEqual({ + matched: [], + selected: [], + }) +}) + +test("Test getting nodes from a spec", () => { + var matched = matcher.getNodesFromSpec( + dag, + pristine_nodes, + undefined, + { + select_at: false, + select_parents: true, + select_children: true, + selector_type: 'fqn', + selector_value: 'c', + raw: '+c+' + } + ) + matched.selected = matched.selected.sort() + + expect(matched).toStrictEqual({ + matched: ['c'], + selected: ['a', 'c', 'd', 'e'], + }) +}) + +test("Test getting nodes from a spec at-selector", () => { + var matched = matcher.getNodesFromSpec( + dag, + pristine_nodes, + undefined, + { + select_at: true, + select_parents: false, + select_children: false, + selector_type: 'fqn', + selector_value: 'c', + raw: '@c' + } + ) + matched.selected = matched.selected.sort() + + expect(matched).toStrictEqual({ + matched: ['c'], + selected: ['a', 'b', 'c', 'd', 'e'], + }) +}) + +test("Test getting nodes by tag", () => { + var matched = matcher.getNodesFromSpec( + dag, + pristine_nodes, + undefined, + { + select_at: false, + select_parents: true, + select_children: false, + selector_type: 'tag', + selector_value: 'daily', + raw: '+tag:d' + } + ) + matched.selected = matched.selected.sort() + + expect(matched).toStrictEqual({ + matched: ['d'], + selected: ['a', 'b', 'c', 'd'], + }) +}) + +test("Test getting nodes by source", () => { + var matched = matcher.getNodesFromSpec( + dag, + pristine_nodes, + undefined, + { + select_at: false, + select_parents: true, + select_children: false, + selector_type: 'source', + selector_value: 'event', + raw: 'source:event' + } + ) + matched.selected = matched.selected.sort() + + expect(matched).toStrictEqual({ + matched: ['a'], + selected: ['a'], + }) +}) + +test("Test getting nodes by source with children", () => { + var matched = matcher.getNodesFromSpec( + dag, + pristine_nodes, + undefined, + { + select_at: false, + select_parents: true, + select_children: true, + selector_type: 'source', + selector_value: 'event', + raw: 'source:event+' + } + ) + matched.selected = matched.selected.sort() + + expect(matched).toStrictEqual({ + matched: ['a'], + selected: ['a', 'b', 'c', 'd', 'e'], + }) +}) + +test("Test getting nodes by source with table name", () => { + var matched = matcher.getNodesFromSpec( + dag, + pristine_nodes, + undefined, + { + select_at: false, + select_parents: true, + select_children: true, + selector_type: 'source', + selector_value: 'event.a', + raw: 'source:event.a+' + } + ) + matched.selected = matched.selected.sort() + + expect(matched).toStrictEqual({ + matched: ['a'], + selected: ['a', 'b', 'c', 'd', 'e'], + }) +}) + +test("Test getting nodes by tag with no edges", () => { + var matched = matcher.getNodesFromSpec( + dag, + pristine_nodes, + undefined, + { + select_at: false, + select_parents: true, + select_children: true, + selector_type: 'tag', + selector_value: 'imported', + raw: '+tag:imported+' + } + ) + matched.selected = matched.selected.sort() + + expect(matched).toStrictEqual({ + matched: ['f'], + selected: ['f'], + }) +}) + + +/* + * Test root-level selectNodes method + */ + +var all_resource_types = ['model', 'source', 'test']; +var all_packages = _.uniq(_.map(pristine_nodes, (n) => n.data.package_name)); +var all_tags = []; +_.each(pristine_nodes, (n) => { + all_tags = all_tags.concat(n.data.tags || []); +}) +all_tags = _.uniq(all_tags).concat([null]); + + +test("Test node selection - select all", () => { + var matched = selectorMethods.selectNodes( + dag, + pristine_node_map, + { + include: '', + exclude: '', + hops: undefined, + packages: all_packages, + tags: all_tags, + resource_types: all_resource_types, + } + ) + matched.selected = matched.selected.sort() + + expect(matched).toStrictEqual({ + matched: [], + selected: ['a', 'b', 'c', 'd', 'e', 'f'], + }) +}) + +test("Test node selection - select included", () => { + var matched = selectorMethods.selectNodes( + dag, + pristine_node_map, + { + include: 'c+', + exclude: '', + hops: undefined, + packages: all_packages, + tags: all_tags, + resource_types: all_resource_types, + } + ) + matched.selected = matched.selected.sort() + + expect(matched).toStrictEqual({ + matched: ['c'], + selected: ['c', 'd', 'e'], + }) +}) + +test("Test node selection - select included and excluded", () => { + var matched = selectorMethods.selectNodes( + dag, + pristine_node_map, + { + include: '@b', + exclude: '+c', + hops: undefined, + packages: all_packages, + tags: all_tags, + resource_types: all_resource_types, + } + ) + matched.selected = matched.selected.sort() + + expect(matched).toStrictEqual({ + matched: ['b'], + selected: ['b', 'd'], + }) +}) + +test("Test node selection - kitchen sink", () => { + var matched = selectorMethods.selectNodes( + dag, + pristine_node_map, + { + include: 'source:event.*+ f', + exclude: 'tag:daily,tag:nightly my_package.dir.e', + hops: undefined, + packages: all_packages, + tags: all_tags, + resource_types: all_resource_types, + } + ) + matched.matched = matched.matched.sort() + matched.selected = matched.selected.sort() + + expect(matched).toStrictEqual({ + matched: ['a', 'f'], + selected: ['a', 'b', 'c', 'f'], + }) +}) + +test("Test node selection - kitchen sink with package filters", () => { + var matched = selectorMethods.selectNodes( + dag, + pristine_node_map, + { + include: 'source:event.*+ f', + exclude: 'tag:daily,tag:nightly my_package.dir.e', + hops: undefined, + packages: ['other_package'], + tags: all_tags, + resource_types: all_resource_types, + } + ) + matched.matched = matched.matched.sort() + matched.selected = matched.selected.sort() + + expect(matched).toStrictEqual({ + matched: ['f'], + selected: ['f'], + }) +}) + +test("Test node selection - kitchen sink with tag filters", () => { + var matched = selectorMethods.selectNodes( + dag, + pristine_node_map, + { + include: 'source:event.*+ f', + exclude: 'tag:daily,tag:nightly my_package.dir.e', + hops: undefined, + packages: all_packages, + tags: ['pii'], + resource_types: all_resource_types, + } + ) + matched.matched = matched.matched.sort() + matched.selected = matched.selected.sort() + + expect(matched).toStrictEqual({ + matched: ['a'], + selected: ['a'], + }) +}) + +test("Test node selection - kitchen sink with resource filters", () => { + var matched = selectorMethods.selectNodes( + dag, + pristine_node_map, + { + include: 'source:event.*+ f', + exclude: 'tag:daily,tag:nightly my_package.dir.e', + hops: undefined, + packages: all_packages, + tags: all_tags, + resource_types: ['model'], + } + ) + matched.matched = matched.matched.sort() + matched.selected = matched.selected.sort() + + expect(matched).toStrictEqual({ + matched: ['f'], + selected: ['b', 'c', 'f'], + }) +}) diff --git a/src/app/services/selector_matcher.js b/src/app/services/selector_matcher.js new file mode 100644 index 000000000..72a5b3fa7 --- /dev/null +++ b/src/app/services/selector_matcher.js @@ -0,0 +1,165 @@ + +const _ = require('underscore'); +const selectorGraph = require('./selector_graph'); + +var SELECTOR_GLOB = '*' +var SELECTOR_TYPE = { + FQN: 'fqn', + TAG: 'tag', + SOURCE: 'source' +} + +function isFQNMatch(node_fqn, node_selector) { + for (var i=0; i { + expect( + matcher.isFQNMatch( + ['my_package', 'dir', 'model'], + ['my_package', '*'] + ) + ).toStrictEqual(true) +}) + +test("Test FQN Matching all parts", () => { + expect( + matcher.isFQNMatch( + ['my_package', 'dir', 'model'], + ['my_package', 'dir', 'model'] + ) + ).toStrictEqual(true) +}) + +test("Test FQN Matching bare package", () => { + expect( + matcher.isFQNMatch( + ['my_package', 'dir', 'model'], + ['my_package'] + ) + ).toStrictEqual(true) +}) + +test("Test FQN Matching bare path", () => { + expect( + matcher.isFQNMatch( + ['my_package', 'dir', 'model'], + ['my_package', 'dir'] + ) + ).toStrictEqual(true) +}) + +test("Test FQN Matching bare path glob", () => { + expect( + matcher.isFQNMatch( + ['my_package', 'dir', 'model'], + ['my_package', 'dir', '*'] + ) + ).toStrictEqual(true) +}) + +test("Test FQN Matching glob all", () => { + expect( + matcher.isFQNMatch( + ['my_package', 'dir', 'model'], + ['*'] + ) + ).toStrictEqual(true) +}) + +test("Test FQN Matching direct model name", () => { + expect( + matcher.isFQNMatch( + ['my_package', 'dir', 'model'], + ['model'] + ) + ).toStrictEqual(true) +}) + +test("Test FQN Matching non match package", () => { + expect( + matcher.isFQNMatch( + ['my_package', 'dir', 'model'], + ['other_package'] + ) + ).toStrictEqual(false) +}) + +test("Test FQN Matching non match path", () => { + expect( + matcher.isFQNMatch( + ['my_package', 'dir', 'model'], + ['my_package', 'other_dir'] + ) + ).toStrictEqual(false) +}) + +test("Test getting nodes by FQN", () => { + function matchByFQN(selector) { + var nodes = matcher.getNodesByFQN(elements, selector) + return _.map(nodes, (node) => node.id); + } + + expect( + matchByFQN('dir.model') + ).toStrictEqual( + [1] + ) + + expect( + matchByFQN('dir.*') + ).toStrictEqual( + [1, 2, 3] + ) + + expect( + matchByFQN('model') + ).toStrictEqual( + [1] + ) + + expect( + matchByFQN('other_package') + ).toStrictEqual( + [3] + ) + + expect( + matchByFQN('other_package.*') + ).toStrictEqual( + [3] + ) + + expect( + matchByFQN('*') + ).toStrictEqual( + [1, 2, 3] + ) +}) + +test("Test getting nodes by Tag", () => { + function matchByTag(selector) { + var nodes = matcher.getNodesByTag(elements, selector) + return _.map(nodes, (node) => node.id); + } + + expect( + matchByTag('nightly') + ).toStrictEqual( + [3] + ) + + expect( + matchByTag('daily') + ).toStrictEqual( + [1, 2, 3] + ) +}) + +test("Test getting nodes by Source", () => { + function matchBySource(selector) { + var nodes = matcher.getNodesBySource(elements, selector) + return _.map(nodes, (node) => node.id); + } + + expect( + matchBySource('events') + ).toStrictEqual( + [4, 5] + ) + + expect( + matchBySource('events.my_event') + ).toStrictEqual( + [4] + ) + + expect( + matchBySource('badsource') + ).toStrictEqual( + [] + ) + + expect( + matchBySource('*') + ).toStrictEqual( + [4, 5, 6] + ) + + expect( + matchBySource('events.*') + ).toStrictEqual( + [4, 5] + ) +}) + diff --git a/src/app/services/selector_methods.js b/src/app/services/selector_methods.js new file mode 100644 index 000000000..77afda5ee --- /dev/null +++ b/src/app/services/selector_methods.js @@ -0,0 +1,204 @@ + +const _ = require('underscore'); +const selectorMatcher = require('./selector_matcher') + +var SELECTOR_AT = '@' +var SELECTOR_PARENTS = '+' +var SELECTOR_CHILDREN = '+' + +var DELIM_UNION = ' '; +var DELIM_INTERSECTION = ','; + + +function splitSpecs(node_spec, delim) { + if (!delim) { + delim = DELIM_UNION; + } + + return _.filter(_.uniq(node_spec.split(delim)), function(s) { + return s.length > 0; + }); +} + +function parseSpec(node_spec) { + var select_at = false; + var select_children = false; + var select_parents = false; + var index_start = 0; + var index_end = node_spec.length; + + // @+ is not a valid selector - one or the other is required + if (node_spec.startsWith(SELECTOR_AT)) { + select_at = true; + index_start = 1; + } else if (node_spec.startsWith(SELECTOR_PARENTS)) { + select_parents = true; + index_start = 1; + } + + if (node_spec.endsWith(SELECTOR_CHILDREN)) { + select_children = true; + index_end -= 1; + } + + // TODO : we're going to need to catch this one + if (select_children && select_at) { + throw new Error('Selector is invalid'); + } + + var node_selector = node_spec.substring(index_start, index_end) + + var selector_type; + var selector_val; + + if (node_selector.indexOf(':') != -1) { + [selector_type, selector_val] = node_selector.split(':', 2); + } else { + selector_type = 'fqn'; + selector_val = node_selector; + } + + return { + select_at: select_at, + select_parents: select_parents, + select_children: select_children, + selector_type: selector_type, + selector_value: selector_val, + raw: node_spec + } +} + + +function parseSpecs(selectorString) { + var union = splitSpecs(selectorString, DELIM_UNION); + + var to_union = _.map(union, function(spec) { + var intersects = splitSpecs(spec, DELIM_INTERSECTION); + if (intersects.length > 1) { + return { + method: 'intersect', + selectors: _.map(intersects, parseSpec) + } + } else { + return { + method: 'none', + selectors: _.map([spec], parseSpec) + } + } + }) + + return to_union +} + +function buildSpec(raw_include_specs, raw_exclude_specs, hops) { + var include_specs = parseSpecs(raw_include_specs); + var exclude_specs = parseSpecs(raw_exclude_specs); + + return { + include: include_specs, + exclude: exclude_specs, + hops: hops + } +} + +function applySpec(selectorString, getMatchingNodes) { + var selectorSets = parseSpecs(selectorString); + + // nodes that were explicitly matched + var matched_nodes = null; + // nodes that are tagging along via graph extenders (+, @) + var selected_nodes = null; + + _.each(selectorSets, function(selectorList) { + var setMethod = (selectorList.method == 'intersect') ? _.intersection : _.union + + _.each(selectorList.selectors, function(selector) { + var nodes = getMatchingNodes(selector); + if (matched_nodes === null) { + matched_nodes = nodes.matched; + selected_nodes = nodes.selected; + } else { + matched_nodes = setMethod(matched_nodes, nodes.matched); + selected_nodes = setMethod(selected_nodes, nodes.selected); + } + }); + }); + + return { + matched: matched_nodes || [], + selected: selected_nodes || [] + } +} + +function selectNodes(dag, pristine, selected_spec) { + + var include = selected_spec.include; + var exclude = selected_spec.exclude; + + var getter = _.partial( + selectorMatcher.getNodesFromSpec, + dag, + pristine, + selected_spec.hops + ) + + var pristine_nodes = _.values(pristine); + var included; + + // if no selection, include all nodes + if (selected_spec.include.trim().length == 0) { + included = {selected: dag.nodes(), matched: []} + } else { + included = applySpec(selected_spec.include, getter); + } + + var excluded = applySpec(selected_spec.exclude, getter); + + // add to selection / matches + var nodes_to_include = included.selected; + var matched_nodes = included.matched; + + // subtract from selection / matches + nodes_to_include = _.difference(nodes_to_include, excluded.selected); + matched_nodes = _.difference(matched_nodes, excluded.matched); + + // prune nodes by resource type / package name + var nodes_to_prune = []; + _.each(nodes_to_include, function(node_id) { + var node = pristine[node_id]; + + if (!node.data.tags) { + node.data.tags = []; + } + + var matched_package = _.includes(selected_spec.packages, node.data.package_name); + var matched_tags = _.intersection(selected_spec.tags, node.data.tags).length > 0; + // TODO : This is a special case for data tests :/ + if (node.data.resource_type == 'test') { + var matched_untagged = _.includes(selected_spec.tags, null) && (node.data.tags.length == 1); + } else { + var matched_untagged = _.includes(selected_spec.tags, null) && (node.data.tags.length == 0); + } + var matched_types = _.includes(selected_spec.resource_types, node.data.resource_type); + + if (!matched_package || (!matched_tags && !matched_untagged) || !matched_types) { + nodes_to_prune.push(node.data.unique_id); + } + }) + + return { + selected: _.difference(nodes_to_include, nodes_to_prune), + matched: _.difference(matched_nodes, nodes_to_prune) + } + +} + +module.exports = { + splitSpecs, + parseSpec, + parseSpecs, + buildSpec, + applySpec, + + selectNodes, +} diff --git a/src/app/services/selector_methods.test.js b/src/app/services/selector_methods.test.js new file mode 100644 index 000000000..5533125c8 --- /dev/null +++ b/src/app/services/selector_methods.test.js @@ -0,0 +1,349 @@ + +const selectors = require("./selector_methods"); + +test("Test splitting specs", () => { + expect( + selectors.splitSpecs('a b c') + ).toStrictEqual( + ['a', 'b', 'c'] + ); + + expect( + selectors.splitSpecs('a b ') + ).toStrictEqual( + ['a', 'b'] + ); + + expect( + selectors.splitSpecs('a c') + ).toStrictEqual( + ['a', 'c'] + ); + + expect( + selectors.splitSpecs(' b c') + ).toStrictEqual( + ['b', 'c'] + ); +}); + +test("Test splitting specs (intersection)", () => { + expect( + selectors.splitSpecs('a,b c') + ).toStrictEqual( + ['a,b', 'c'] + ); + + expect( + selectors.splitSpecs('a, b ') + ).toStrictEqual( + ['a,', 'b'] + ); +}); + +test("Test parsing specs (fqn)", () => { + expect( + selectors.parseSpec('a') + ).toStrictEqual({ + select_at: false, + select_children: false, + select_parents: false, + selector_type: 'fqn', + selector_value: 'a', + raw: 'a', + }); +}) + +test("Test parsing specs (fqn with parents and children)", () => { + expect( + selectors.parseSpec('+a+') + ).toStrictEqual({ + select_at: false, + select_children: true, + select_parents: true, + selector_type: 'fqn', + selector_value: 'a', + raw: '+a+', + }); +}) + +test("Test parsing specs (at-syntax)", () => { + expect( + selectors.parseSpec('@a') + ).toStrictEqual({ + select_at: true, + select_children: false, + select_parents: false, + selector_type: 'fqn', + selector_value: 'a', + raw: '@a', + }); +}) + +test("Test parsing specs (explicit fqn)", () => { + expect( + selectors.parseSpec('@fqn:a') + ).toStrictEqual({ + select_at: true, + select_children: false, + select_parents: false, + selector_type: 'fqn', + selector_value: 'a', + raw: '@fqn:a', + }); +}) + +test("Test parsing specs (explicit tag)", () => { + expect( + selectors.parseSpec('@tag:a') + ).toStrictEqual({ + select_at: true, + select_children: false, + select_parents: false, + selector_type: 'tag', + selector_value: 'a', + raw: '@tag:a', + }); +}) + +test("Test parsing specs (explicit source)", () => { + expect( + selectors.parseSpec('source:a+') + ).toStrictEqual({ + select_at: false, + select_children: true, + select_parents: false, + selector_type: 'source', + selector_value: 'a', + raw: 'source:a+', + }); +}) + +test("Test parsing specs (explicit source.table)", () => { + expect( + selectors.parseSpec('source:a.b+') + ).toStrictEqual({ + select_at: false, + select_children: true, + select_parents: false, + selector_type: 'source', + selector_value: 'a.b', + raw: 'source:a.b+', + }); +}) + +test("Test parsing specs (scoped fqn)", () => { + expect( + selectors.parseSpec('a.b.c+') + ).toStrictEqual({ + select_at: false, + select_children: true, + select_parents: false, + selector_type: 'fqn', + selector_value: 'a.b.c', + raw: 'a.b.c+', + }); +}) + +test("Test set based selectors", () => { + expect( + selectors.parseSpecs('a,b c') + ).toStrictEqual([ + { + method: 'intersect', + selectors: [ + { + select_at: false, + select_children: false, + select_parents: false, + selector_type: 'fqn', + selector_value: 'a', + raw: 'a', + }, + { + select_at: false, + select_children: false, + select_parents: false, + selector_type: 'fqn', + selector_value: 'b', + raw: 'b', + } + ] + }, + { + method: 'none', + selectors: [ + { + select_at: false, + select_children: false, + select_parents: false, + selector_type: 'fqn', + selector_value: 'c', + raw: 'c', + } + ] + }, + ]); +}) + +test("Test set based selectors (complicated)", () => { + expect( + selectors.parseSpecs('tag:a,source:b.c mypackage fqn:a.b.c,tag:mytag+') + ).toStrictEqual([ + { + method: 'intersect', + selectors: [ + { + select_at: false, + select_parents: false, + select_children: false, + selector_type: 'tag', + selector_value: 'a', + raw: 'tag:a' + }, + { + select_at: false, + select_parents: false, + select_children: false, + selector_type: 'source', + selector_value: 'b.c', + raw: 'source:b.c' + }, + ] + }, + { + method: 'none', + selectors: [ + { + select_at: false, + select_parents: false, + select_children: false, + selector_type: 'fqn', + selector_value: 'mypackage', + raw: 'mypackage' + }, + ] + }, + { + method: 'intersect', + selectors: [ + { + select_at: false, + select_parents: false, + select_children: false, + selector_type: 'fqn', + selector_value: 'a.b.c', + raw: 'fqn:a.b.c' + }, + { + select_at: false, + select_parents: false, + select_children: true, + selector_type: 'tag', + selector_value: 'mytag', + raw: 'tag:mytag+' + }, + ] + }, + ]); +}) + +test("Test parsing invalid spec", () => { + expect(() => { + selectors.parseSpec('@a+') + }).toThrow(); +}) + + +test("Test applying selector specs", () => { + var lookup = { + a: {matched: [1], selected: [1]}, + b: {matched: [2], selected: [2]}, + c: {matched: [3], selected: [3]}, + } + + expect( + selectors.applySpec('a b c', (el) => lookup[el.raw]) + ).toStrictEqual({ + matched: [1,2,3], + selected: [1,2,3], + }) +}) + +test("Test applying selector specs with intersection", () => { + var lookup = { + a: {matched: [1,2], selected: [1,2]}, + b: {matched: [2,3], selected: [2,3]}, + c: {matched: [3], selected: [3]} + } + + expect( + selectors.applySpec('a,b c', (el) => lookup[el.raw]) + ).toStrictEqual({ + matched: [2, 3], + selected: [2, 3] + }) +}) + +test("Test parsing specs", () => { + expect( + selectors.buildSpec( + "a,tag:b+ c", + "d", + 1 + ) + ).toStrictEqual({ + include: [ + { + method: 'intersect', + selectors: [ + { + select_at: false, + select_parents: false, + select_children: false, + selector_type: 'fqn', + selector_value: 'a', + raw: 'a' + }, + { + select_at: false, + select_parents: false, + select_children: true, + selector_type: 'tag', + selector_value: 'b', + raw: 'tag:b+' + } + ] + }, + { + method: 'none', + selectors: [ + { + select_at: false, + select_parents: false, + select_children: false, + selector_type: 'fqn', + selector_value: 'c', + raw: 'c' + }, + ] + } + ], + exclude: [ + { + method: 'none', + selectors: [ + { + select_at: false, + select_parents: false, + select_children: false, + selector_type: 'fqn', + selector_value: 'd', + raw: 'd' + }, + ] + } + ], + hops: 1 + }) +}) diff --git a/yarn.lock b/yarn.lock index c265ba7d1..031d3af91 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,510 @@ # yarn lockfile v1 +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/core@^7.1.0", "@babel/core@^7.7.5": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.0.tgz#73b9c33f1658506887f767c26dae07798b30df76" + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.11.0" + "@babel/helper-module-transforms" "^7.11.0" + "@babel/helpers" "^7.10.4" + "@babel/parser" "^7.11.0" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.11.0" + "@babel/types" "^7.11.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.0.tgz#4b90c78d8c12825024568cbe83ee6c9af193585c" + dependencies: + "@babel/types" "^7.11.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" + dependencies: + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-get-function-arity@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-member-expression-to-functions@^7.10.4": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" + dependencies: + "@babel/types" "^7.11.0" + +"@babel/helper-module-imports@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-module-transforms@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-replace-supers" "^7.10.4" + "@babel/helper-simple-access" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/template" "^7.10.4" + "@babel/types" "^7.11.0" + lodash "^4.17.19" + +"@babel/helper-optimise-call-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + +"@babel/helper-replace-supers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" + dependencies: + "@babel/helper-member-expression-to-functions" "^7.10.4" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-simple-access@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" + dependencies: + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-split-export-declaration@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" + dependencies: + "@babel/types" "^7.11.0" + +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + +"@babel/helpers@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" + dependencies: + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.0.tgz#a9d7e11aead25d3b422d17b2c6502c8dddef6a5d" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c" + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/template@^7.10.4", "@babel/template@^7.3.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.0.tgz#9b996ce1b98f53f7c3e4175115605d56ed07dd24" + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.11.0" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/parser" "^7.11.0" + "@babel/types" "^7.11.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + +"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.0.tgz#2ae6bf1ba9ae8c3c43824e5861269871b206e90d" + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" + +"@jest/console@^26.2.0": + version "26.2.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.2.0.tgz#d18f2659b90930e7ec3925fb7209f1ba2cf463f0" + dependencies: + "@jest/types" "^26.2.0" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^26.2.0" + jest-util "^26.2.0" + slash "^3.0.0" + +"@jest/core@^26.2.2": + version "26.2.2" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.2.2.tgz#63de01ffce967618003dd7a0164b05c8041b81a9" + dependencies: + "@jest/console" "^26.2.0" + "@jest/reporters" "^26.2.2" + "@jest/test-result" "^26.2.0" + "@jest/transform" "^26.2.2" + "@jest/types" "^26.2.0" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-changed-files "^26.2.0" + jest-config "^26.2.2" + jest-haste-map "^26.2.2" + jest-message-util "^26.2.0" + jest-regex-util "^26.0.0" + jest-resolve "^26.2.2" + jest-resolve-dependencies "^26.2.2" + jest-runner "^26.2.2" + jest-runtime "^26.2.2" + jest-snapshot "^26.2.2" + jest-util "^26.2.0" + jest-validate "^26.2.0" + jest-watcher "^26.2.0" + micromatch "^4.0.2" + p-each-series "^2.1.0" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^26.2.0": + version "26.2.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.2.0.tgz#f6faee1630fcc2fad208953164bccb31dbe0e45f" + dependencies: + "@jest/fake-timers" "^26.2.0" + "@jest/types" "^26.2.0" + "@types/node" "*" + jest-mock "^26.2.0" + +"@jest/fake-timers@^26.2.0": + version "26.2.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.2.0.tgz#b485c57dc4c74d61406a339807a9af4bac74b75a" + dependencies: + "@jest/types" "^26.2.0" + "@sinonjs/fake-timers" "^6.0.1" + "@types/node" "*" + jest-message-util "^26.2.0" + jest-mock "^26.2.0" + jest-util "^26.2.0" + +"@jest/globals@^26.2.0": + version "26.2.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.2.0.tgz#ad78f1104f250c1a4bf5184a2ba51facc59b23f6" + dependencies: + "@jest/environment" "^26.2.0" + "@jest/types" "^26.2.0" + expect "^26.2.0" + +"@jest/reporters@^26.2.2": + version "26.2.2" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.2.2.tgz#5a8632ab410f4fc57782bc05dcf115e91818e869" + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^26.2.0" + "@jest/test-result" "^26.2.0" + "@jest/transform" "^26.2.2" + "@jest/types" "^26.2.0" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.4" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^4.0.3" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.2" + jest-haste-map "^26.2.2" + jest-resolve "^26.2.2" + jest-util "^26.2.0" + jest-worker "^26.2.1" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^4.0.1" + terminal-link "^2.0.0" + v8-to-istanbul "^4.1.3" + optionalDependencies: + node-notifier "^7.0.0" + +"@jest/source-map@^26.1.0": + version "26.1.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.1.0.tgz#a6a020d00e7d9478f4b690167c5e8b77e63adb26" + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.4" + source-map "^0.6.0" + +"@jest/test-result@^26.2.0": + version "26.2.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.2.0.tgz#51c9b165c8851cfcf7a3466019114785e154f76b" + dependencies: + "@jest/console" "^26.2.0" + "@jest/types" "^26.2.0" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^26.2.2": + version "26.2.2" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.2.2.tgz#5e8091f2e6c61fdf242af566cb820a4eadc6c4af" + dependencies: + "@jest/test-result" "^26.2.0" + graceful-fs "^4.2.4" + jest-haste-map "^26.2.2" + jest-runner "^26.2.2" + jest-runtime "^26.2.2" + +"@jest/transform@^26.2.2": + version "26.2.2" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.2.2.tgz#86c005c8d5d749ac54d8df53ea58675fffe7a97e" + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^26.2.0" + babel-plugin-istanbul "^6.0.0" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.4" + jest-haste-map "^26.2.2" + jest-regex-util "^26.0.0" + jest-util "^26.2.0" + micromatch "^4.0.2" + pirates "^4.0.1" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/types@^26.2.0": + version "26.2.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.2.0.tgz#b28ca1fb517a4eb48c0addea7fcd9edc4ab45721" + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + +"@sinonjs/commons@^1.7.0": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.1.tgz#e7df00f98a203324f6dc7cc606cad9d4a8ab2217" + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": + version "7.1.9" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d" + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.1" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.0.13" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.13.tgz#1874914be974a492e1b4cb00585cabb274e8ba18" + dependencies: + "@babel/types" "^7.3.0" + +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + +"@types/graceful-fs@^4.1.2": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.3.tgz#039af35fe26bec35003e8d86d2ee9c586354348f" + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^1.1.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + "@types/node@*": version "10.5.2" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.5.2.tgz#f19f05314d5421fe37e74153254201a7bf00a707" +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + +"@types/prettier@^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.0.2.tgz#5bb52ee68d0f8efa9cc0099920e56be6cc4e37f3" + +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + +"@types/yargs-parser@*": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" + +"@types/yargs@^15.0.0": + version "15.0.5" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.5.tgz#947e9a6561483bdee9adffc983e91a6902af8b79" + dependencies: + "@types/yargs-parser" "*" + "@uirouter/core@5.0.19": version "5.0.19" resolved "https://registry.yarnpkg.com/@uirouter/core/-/core-5.0.19.tgz#fe2888190393a8c92584c354e65ab8322c1b0db4" @@ -146,6 +646,10 @@ "@webassemblyjs/wast-parser" "1.5.13" long "^3.2.0" +abab@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.4.tgz#6dfa57b417ca06d21b2478f0e638302f99c2405c" + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -163,10 +667,25 @@ acorn-dynamic-import@^3.0.0: dependencies: acorn "^5.0.0" +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + acorn@^5.0.0, acorn@^5.6.2: version "5.7.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" +acorn@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" + ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -200,6 +719,15 @@ ajv@^6.1.0: json-schema-traverse "^0.4.1" uri-js "^4.2.1" +ajv@^6.12.3: + version "6.12.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" @@ -236,6 +764,12 @@ ansi-escapes@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" +ansi-escapes@^4.2.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + dependencies: + type-fest "^0.11.0" + ansi-html@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" @@ -248,6 +782,10 @@ ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -258,6 +796,13 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -265,6 +810,13 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" +anymatch@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -386,6 +938,10 @@ aws4@^1.2.1, aws4@^1.6.0: version "1.7.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" +aws4@^1.8.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2" + babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -514,6 +1070,19 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" +babel-jest@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.2.2.tgz#70f618f2d7016ed71b232241199308985462f812" + dependencies: + "@jest/transform" "^26.2.2" + "@jest/types" "^26.2.0" + "@types/babel__core" "^7.1.7" + babel-plugin-istanbul "^6.0.0" + babel-preset-jest "^26.2.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + slash "^3.0.0" + babel-loader@^7.1.5: version "7.1.5" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz#e3ee0cd7394aa557e013b02d3e492bfd07aa6d68" @@ -534,6 +1103,25 @@ babel-plugin-check-es2015-constants@^6.22.0: dependencies: babel-runtime "^6.22.0" +babel-plugin-istanbul@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^4.0.0" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.2.0.tgz#bdd0011df0d3d513e5e95f76bd53b51147aca2dd" + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + babel-plugin-syntax-flow@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" @@ -758,6 +1346,22 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" +babel-preset-current-node-syntax@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz#b4b547acddbf963cba555ba9f9cbbb70bfd044da" + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + babel-preset-es2015@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" @@ -793,6 +1397,13 @@ babel-preset-flow@^6.23.0: dependencies: babel-plugin-transform-flow-strip-types "^6.22.0" +babel-preset-jest@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.2.0.tgz#f198201a4e543a43eb40bc481e19736e095fd3e0" + dependencies: + babel-plugin-jest-hoist "^26.2.0" + babel-preset-current-node-syntax "^0.1.2" + babel-preset-react@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" @@ -982,10 +1593,20 @@ braces@^2.3.0, braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + dependencies: + fill-range "^7.0.1" + brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" @@ -1038,6 +1659,12 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + dependencies: + node-int64 "^0.4.0" + buffer-from@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" @@ -1102,6 +1729,10 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + camel-case@3.0.x: version "3.0.0" resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" @@ -1128,6 +1759,20 @@ camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + +camelcase@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + dependencies: + rsvp "^4.8.4" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -1150,6 +1795,17 @@ chalk@^2.0.0, chalk@^2.3.2, chalk@^2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + chardet@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.5.0.tgz#fe3ac73c00c3d865ffcc02a0682e2c20b6a06029" @@ -1198,6 +1854,10 @@ chrome-trace-event@^1.0.0: dependencies: tslib "^1.9.0" +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -1254,6 +1914,14 @@ cliui@^4.0.0: strip-ansi "^4.0.0" wrap-ansi "^2.0.0" +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + clone-deep@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713" @@ -1277,6 +1945,10 @@ code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -1290,10 +1962,20 @@ color-convert@^1.9.0: dependencies: color-name "1.1.1" +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + dependencies: + color-name "~1.1.4" + color-name@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" @@ -1304,6 +1986,12 @@ combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + dependencies: + delayed-stream "~1.0.0" + commander@2.16.x, commander@~2.16.0: version "2.16.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" @@ -1381,6 +2069,12 @@ content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + dependencies: + safe-buffer "~5.1.1" + convert-source-map@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" @@ -1473,6 +2167,14 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^7.0.0: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + crypt@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" @@ -1578,6 +2280,20 @@ csso@^3.5.0, csso@~3.5.0: dependencies: css-tree "1.0.0-alpha.29" +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + +cssstyle@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + dependencies: + cssom "~0.3.6" + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -1622,6 +2338,14 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" @@ -1638,13 +2362,13 @@ debug@^3.1.0, debug@^3.2.5: dependencies: ms "^2.1.1" -debug@^4.1.0: +debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" dependencies: ms "^2.1.1" -decamelize@^1.1.1, decamelize@^1.1.2: +decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1654,6 +2378,10 @@ decamelize@^2.0.0: dependencies: xregexp "4.0.0" +decimal.js@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.0.tgz#39466113a9e036111d02f82489b5fd6b0b5ed231" + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -1666,10 +2394,18 @@ deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + deepmerge@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.1.1.tgz#e862b4e45ea0555072bf51e7fd0d9845170ae768" +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + default-gateway@^2.6.0: version "2.7.2" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f" @@ -1755,10 +2491,18 @@ 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@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + detect-node@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" +diff-sequences@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.0.0.tgz#0760059a5c287637b842bd7085311db7060e88a6" + diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -1809,6 +2553,12 @@ domelementtype@~1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + dependencies: + webidl-conversions "^5.0.0" + domhandler@2.1: version "2.1.0" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594" @@ -1872,6 +2622,14 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" +emittery@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.1.tgz#c02375a927a40948c0345cc903072597f5270451" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" @@ -1904,7 +2662,7 @@ errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" -error-ex@^1.2.0: +error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" dependencies: @@ -1943,6 +2701,21 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + +escodegen@^1.14.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + eslint-scope@^3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" @@ -1954,6 +2727,10 @@ esprima@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" +esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + esprima@~3.1.0: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" @@ -1968,6 +2745,10 @@ estraverse@^4.1.0, estraverse@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" +estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -1997,6 +2778,10 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" +exec-sh@^0.3.2: + version "0.3.4" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" + execa@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" @@ -2033,6 +2818,24 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.3.tgz#0a34dabbad6d66100bd6f2c576c8669403f317f2" + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -2045,6 +2848,17 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" +expect@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-26.2.0.tgz#0140dd9cc7376d7833852e9cda88c05414f1efba" + dependencies: + "@jest/types" "^26.2.0" + ansi-styles "^4.0.0" + jest-get-type "^26.0.0" + jest-matcher-utils "^26.2.0" + jest-message-util "^26.2.0" + jest-regex-util "^26.0.0" + express@^4.16.2: version "4.16.3" resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" @@ -2093,7 +2907,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: +extend@^3.0.0, extend@~3.0.0, extend@~3.0.1, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -2134,10 +2948,18 @@ fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + fastparse@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" @@ -2154,6 +2976,12 @@ faye-websocket@~0.11.1: dependencies: websocket-driver ">=0.5.1" +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + dependencies: + bser "2.1.1" + figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -2176,6 +3004,12 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + dependencies: + to-regex-range "^5.0.1" + finalhandler@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" @@ -2215,6 +3049,13 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + flush-write-stream@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" @@ -2266,6 +3107,14 @@ form-data@~2.1.1: combined-stream "^1.0.5" mime-types "^2.1.12" +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + formidable@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.1.tgz#70fb7ca0290ee6ff961090415f4b3df3d2082659" @@ -2317,6 +3166,10 @@ fsevents@^1.2.2: nan "^2.9.2" node-pre-gyp "^0.10.0" +fsevents@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + fstream@^1.0.0, fstream@^1.0.2: version "1.0.12" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" @@ -2349,10 +3202,22 @@ gaze@^1.0.0: dependencies: globule "^1.0.0" +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + get-caller-file@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" @@ -2367,6 +3232,12 @@ get-stream@^4.0.0: dependencies: pump "^3.0.0" +get-stream@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + dependencies: + pump "^3.0.0" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -2405,7 +3276,7 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.3: +glob@^7.1.1, glob@^7.1.3, glob@^7.1.4: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" dependencies: @@ -2420,6 +3291,10 @@ global-modules-path@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.1.0.tgz#923ec524e8726bb0c1a4ed4b8e21e1ff80c88bbb" +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -2452,12 +3327,20 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2: version "4.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" +graceful-fs@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + graphlib@^1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-1.0.7.tgz#0cab2df0ffe6abe070b2625bfa1edb6ec967b8b1" dependencies: lodash "^3.10.0" +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + handle-thing@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" @@ -2484,6 +3367,13 @@ har-validator@~5.0.3: ajv "^5.1.0" har-schema "^2.0.0" +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -2494,6 +3384,10 @@ has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -2594,10 +3488,20 @@ hpack.js@^2.1.6: readable-stream "^2.0.1" wbuf "^1.1.0" +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + dependencies: + whatwg-encoding "^1.0.5" + html-entities@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + html-loader@^0.5.5: version "0.5.5" resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-0.5.5.tgz#6356dbeb0c49756d8ebd5ca327f16ff06ab5faea" @@ -2737,10 +3641,20 @@ https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + iconv-lite@0.4.19: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + dependencies: + safer-buffer ">= 2.1.2 < 3" + iconv-lite@^0.4.22, iconv-lite@^0.4.4: version "0.4.23" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" @@ -2785,6 +3699,13 @@ import-local@^2.0.0: pkg-dir "^3.0.0" resolve-cwd "^2.0.0" +import-local@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -2931,6 +3852,12 @@ is-callable@^1.1.1, is-callable@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + dependencies: + ci-info "^2.0.0" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -2963,6 +3890,10 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" +is-docker@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b" + 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" @@ -2993,6 +3924,14 @@ is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -3011,6 +3950,10 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + 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" @@ -3033,6 +3976,10 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-potential-custom-element-name@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" + is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" @@ -3047,11 +3994,15 @@ is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + is-symbol@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" -is-typedarray@~1.0.0: +is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -3067,6 +4018,12 @@ is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + dependencies: + is-docker "^2.0.0" + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -3093,6 +4050,384 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" +istanbul-lib-coverage@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + +istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + dependencies: + "@babel/core" "^7.7.5" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.2.0.tgz#b4946201defe0c919a2f3d601e9f98cb21dacc15" + dependencies: + "@jest/types" "^26.2.0" + execa "^4.0.0" + throat "^5.0.0" + +jest-cli@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.2.2.tgz#4c273e5474baafac1eb15fd25aaafb4703f5ffbc" + dependencies: + "@jest/core" "^26.2.2" + "@jest/test-result" "^26.2.0" + "@jest/types" "^26.2.0" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + import-local "^3.0.2" + is-ci "^2.0.0" + jest-config "^26.2.2" + jest-util "^26.2.0" + jest-validate "^26.2.0" + prompts "^2.0.1" + yargs "^15.3.1" + +jest-config@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.2.2.tgz#f3ebc7e2bc3f49de8ed3f8007152f345bb111917" + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^26.2.2" + "@jest/types" "^26.2.0" + babel-jest "^26.2.2" + chalk "^4.0.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.4" + jest-environment-jsdom "^26.2.0" + jest-environment-node "^26.2.0" + jest-get-type "^26.0.0" + jest-jasmine2 "^26.2.2" + jest-regex-util "^26.0.0" + jest-resolve "^26.2.2" + jest-util "^26.2.0" + jest-validate "^26.2.0" + micromatch "^4.0.2" + pretty-format "^26.2.0" + +jest-diff@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.2.0.tgz#dee62c771adbb23ae585f3f1bd289a6e8ef4f298" + dependencies: + chalk "^4.0.0" + diff-sequences "^26.0.0" + jest-get-type "^26.0.0" + pretty-format "^26.2.0" + +jest-docblock@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" + dependencies: + detect-newline "^3.0.0" + +jest-each@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.2.0.tgz#aec8efa01d072d7982c900e74940863385fa884e" + dependencies: + "@jest/types" "^26.2.0" + chalk "^4.0.0" + jest-get-type "^26.0.0" + jest-util "^26.2.0" + pretty-format "^26.2.0" + +jest-environment-jsdom@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.2.0.tgz#6443a6f3569297dcaa4371dddf93acaf167302dc" + dependencies: + "@jest/environment" "^26.2.0" + "@jest/fake-timers" "^26.2.0" + "@jest/types" "^26.2.0" + "@types/node" "*" + jest-mock "^26.2.0" + jest-util "^26.2.0" + jsdom "^16.2.2" + +jest-environment-node@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.2.0.tgz#fee89e06bdd4bed3f75ee2978d73ede9bb57a681" + dependencies: + "@jest/environment" "^26.2.0" + "@jest/fake-timers" "^26.2.0" + "@jest/types" "^26.2.0" + "@types/node" "*" + jest-mock "^26.2.0" + jest-util "^26.2.0" + +jest-get-type@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.0.0.tgz#381e986a718998dbfafcd5ec05934be538db4039" + +jest-haste-map@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.2.2.tgz#6d4267b1903854bfdf6a871419f35a82f03ae71e" + dependencies: + "@jest/types" "^26.2.0" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + jest-regex-util "^26.0.0" + jest-serializer "^26.2.0" + jest-util "^26.2.0" + jest-worker "^26.2.1" + micromatch "^4.0.2" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.1.2" + +jest-jasmine2@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.2.2.tgz#d82b1721fac2b153a4f8b3f0c95e81e702812de2" + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^26.2.0" + "@jest/source-map" "^26.1.0" + "@jest/test-result" "^26.2.0" + "@jest/types" "^26.2.0" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + expect "^26.2.0" + is-generator-fn "^2.0.0" + jest-each "^26.2.0" + jest-matcher-utils "^26.2.0" + jest-message-util "^26.2.0" + jest-runtime "^26.2.2" + jest-snapshot "^26.2.2" + jest-util "^26.2.0" + pretty-format "^26.2.0" + throat "^5.0.0" + +jest-leak-detector@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.2.0.tgz#073ee6d8db7a9af043e7ce99d8eea17a4fb0cc50" + dependencies: + jest-get-type "^26.0.0" + pretty-format "^26.2.0" + +jest-matcher-utils@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.2.0.tgz#b107af98c2b8c557ffd46c1adf06f794aa52d622" + dependencies: + chalk "^4.0.0" + jest-diff "^26.2.0" + jest-get-type "^26.0.0" + pretty-format "^26.2.0" + +jest-message-util@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.2.0.tgz#757fbc1323992297092bb9016a71a2eb12fd22ea" + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/types" "^26.2.0" + "@types/stack-utils" "^1.0.1" + chalk "^4.0.0" + graceful-fs "^4.2.4" + micromatch "^4.0.2" + slash "^3.0.0" + stack-utils "^2.0.2" + +jest-mock@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.2.0.tgz#a1b3303ab38c34aa1dbbc16ab57cdc1a59ed50d1" + dependencies: + "@jest/types" "^26.2.0" + "@types/node" "*" + +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + +jest-regex-util@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" + +jest-resolve-dependencies@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.2.2.tgz#2ad3cd9281730e9a5c487cd846984c5324e47929" + dependencies: + "@jest/types" "^26.2.0" + jest-regex-util "^26.0.0" + jest-snapshot "^26.2.2" + +jest-resolve@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.2.2.tgz#324a20a516148d61bffa0058ed0c77c510ecfd3e" + dependencies: + "@jest/types" "^26.2.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + jest-pnp-resolver "^1.2.2" + jest-util "^26.2.0" + read-pkg-up "^7.0.1" + resolve "^1.17.0" + slash "^3.0.0" + +jest-runner@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.2.2.tgz#6d03d057886e9c782e10b2cf37443f902fe0e39e" + dependencies: + "@jest/console" "^26.2.0" + "@jest/environment" "^26.2.0" + "@jest/test-result" "^26.2.0" + "@jest/types" "^26.2.0" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.7.1" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-config "^26.2.2" + jest-docblock "^26.0.0" + jest-haste-map "^26.2.2" + jest-leak-detector "^26.2.0" + jest-message-util "^26.2.0" + jest-resolve "^26.2.2" + jest-runtime "^26.2.2" + jest-util "^26.2.0" + jest-worker "^26.2.1" + source-map-support "^0.5.6" + throat "^5.0.0" + +jest-runtime@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.2.2.tgz#2480ff79320680a643031dd21998d7c63d83ab68" + dependencies: + "@jest/console" "^26.2.0" + "@jest/environment" "^26.2.0" + "@jest/fake-timers" "^26.2.0" + "@jest/globals" "^26.2.0" + "@jest/source-map" "^26.1.0" + "@jest/test-result" "^26.2.0" + "@jest/transform" "^26.2.2" + "@jest/types" "^26.2.0" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.4" + jest-config "^26.2.2" + jest-haste-map "^26.2.2" + jest-message-util "^26.2.0" + jest-mock "^26.2.0" + jest-regex-util "^26.0.0" + jest-resolve "^26.2.2" + jest-snapshot "^26.2.2" + jest-util "^26.2.0" + jest-validate "^26.2.0" + slash "^3.0.0" + strip-bom "^4.0.0" + yargs "^15.3.1" + +jest-serializer@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.2.0.tgz#92dcae5666322410f4bf50211dd749274959ddac" + dependencies: + "@types/node" "*" + graceful-fs "^4.2.4" + +jest-snapshot@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.2.2.tgz#9d2eda083a4a1017b157e351868749bd63211799" + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^26.2.0" + "@types/prettier" "^2.0.0" + chalk "^4.0.0" + expect "^26.2.0" + graceful-fs "^4.2.4" + jest-diff "^26.2.0" + jest-get-type "^26.0.0" + jest-haste-map "^26.2.2" + jest-matcher-utils "^26.2.0" + jest-message-util "^26.2.0" + jest-resolve "^26.2.2" + natural-compare "^1.4.0" + pretty-format "^26.2.0" + semver "^7.3.2" + +jest-util@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.2.0.tgz#0597d2a27c559340957609f106c408c17c1d88ac" + dependencies: + "@jest/types" "^26.2.0" + "@types/node" "*" + chalk "^4.0.0" + graceful-fs "^4.2.4" + is-ci "^2.0.0" + micromatch "^4.0.2" + +jest-validate@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.2.0.tgz#97fedf3e7984b7608854cbf925b9ca6ebcbdb78a" + dependencies: + "@jest/types" "^26.2.0" + camelcase "^6.0.0" + chalk "^4.0.0" + jest-get-type "^26.0.0" + leven "^3.1.0" + pretty-format "^26.2.0" + +jest-watcher@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.2.0.tgz#45bdf2fecadd19c0a501f3b071a474dca636825b" + dependencies: + "@jest/test-result" "^26.2.0" + "@jest/types" "^26.2.0" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^26.2.0" + string-length "^4.0.1" + +jest-worker@^26.2.1: + version "26.2.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.2.1.tgz#5d630ab93f666b53f911615bc13e662b382bd513" + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest@^26.2.2: + version "26.2.2" + resolved "https://registry.yarnpkg.com/jest/-/jest-26.2.2.tgz#a022303887b145147204c5f66e6a5c832333c7e7" + dependencies: + "@jest/core" "^26.2.2" + import-local "^3.0.2" + jest-cli "^26.2.2" + jquery@~3.4.0: version "3.4.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2" @@ -3105,6 +4440,17 @@ js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + +js-yaml@^3.13.1: + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" @@ -3116,6 +4462,37 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" +jsdom@^16.2.2: + version "16.3.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.3.0.tgz#75690b7dac36c67be49c336dcd7219bbbed0810c" + dependencies: + abab "^2.0.3" + acorn "^7.1.1" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.2.0" + data-urls "^2.0.0" + decimal.js "^10.2.0" + domexception "^2.0.1" + escodegen "^1.14.1" + html-encoding-sniffer "^2.0.1" + is-potential-custom-element-name "^1.0.0" + nwsapi "^2.2.0" + parse5 "5.1.1" + request "^2.88.2" + request-promise-native "^1.0.8" + saxes "^5.0.0" + symbol-tree "^3.2.4" + tough-cookie "^3.0.1" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + ws "^7.2.3" + xml-name-validator "^3.0.0" + jsesc@^0.5.0, jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" @@ -3124,7 +4501,11 @@ jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" -json-parse-better-errors@^1.0.2: +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -3158,6 +4539,12 @@ json5@^0.5.0, json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" +json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + dependencies: + minimist "^1.2.5" + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" @@ -3195,6 +4582,10 @@ 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" +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -3207,6 +4598,21 @@ lcid@^2.0.0: dependencies: invert-kv "^2.0.0" +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -3249,8 +4655,14 @@ locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + dependencies: + p-locate "^4.1.0" lodash.assign@^4.2.0: version "4.2.0" @@ -3272,6 +4684,10 @@ lodash.mergewith@^4.6.0: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + lodash.tail@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" @@ -3284,6 +4700,10 @@ lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, l version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" +lodash@^4.17.19: + version "4.17.19" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" + loglevel@^1.4.1: version "1.6.1" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" @@ -3326,6 +4746,18 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + dependencies: + semver "^6.0.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" + mamacro@^0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" @@ -3417,6 +4849,10 @@ 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@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + methods@^1.1.1, methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -3439,6 +4875,13 @@ micromatch@^3.1.4, micromatch@^3.1.8, micromatch@^3.1.9: snapdragon "^0.8.1" to-regex "^3.0.2" +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -3446,6 +4889,10 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" +mime-db@1.44.0: + version "1.44.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" + "mime-db@>= 1.34.0 < 2": version "1.34.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.34.0.tgz#452d0ecff5c30346a6dc1e64b1eaee0d3719ff9a" @@ -3470,6 +4917,12 @@ mime-types@^2.1.18: dependencies: mime-db "~1.35.0" +mime-types@~2.1.19: + version "2.1.27" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + dependencies: + mime-db "1.44.0" + mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" @@ -3486,7 +4939,7 @@ mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" -mimic-fn@^2.0.0: +mimic-fn@^2.0.0, mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -3508,6 +4961,10 @@ minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" +minimist@^1.1.1, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -3614,6 +5071,10 @@ nanomatch@^1.2.9: 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" + needle@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" @@ -3668,6 +5129,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@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" @@ -3696,6 +5161,21 @@ node-libs-browser@^2.0.0: util "^0.10.3" vm-browserify "0.0.4" +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + +node-notifier@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-7.0.2.tgz#3a70b1b70aca5e919d0b1b022530697466d9c675" + dependencies: + growly "^1.3.0" + is-wsl "^2.2.0" + semver "^7.3.2" + shellwords "^0.1.1" + uuid "^8.2.0" + which "^2.0.2" + node-pre-gyp@^0.10.0: version "0.10.2" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.2.tgz#e8945c20ef6795a20aac2b44f036eb13cf5146e3" @@ -3757,12 +5237,25 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" dependencies: remove-trailing-separator "^1.0.1" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + npm-bundled@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" @@ -3780,6 +5273,12 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + dependencies: + path-key "^3.0.0" + "npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" @@ -3799,10 +5298,18 @@ 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" +nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + 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" +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -3873,12 +5380,29 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" +onetime@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.1.tgz#5c8016847b0d67fcedb7eef254751cfcdc7e9418" + dependencies: + mimic-fn "^2.1.0" + opn@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" dependencies: is-wsl "^1.1.0" +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + original@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" @@ -3930,6 +5454,10 @@ p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" +p-each-series@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.1.0.tgz#961c8dd3f195ea96c747e636b262b800a6b1af48" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -3950,6 +5478,12 @@ p-limit@^2.0.0: dependencies: p-try "^2.0.0" +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + dependencies: + p-try "^2.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -3962,6 +5496,12 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + dependencies: + p-limit "^2.2.0" + p-map@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" @@ -4008,6 +5548,19 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" +parse-json@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.1.tgz#7cfe35c1ccd641bce3981467e6c2ece61b3b3878" + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + lines-and-columns "^1.1.6" + +parse5@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + parse5@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" @@ -4044,6 +5597,10 @@ path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -4056,6 +5613,14 @@ path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -4086,6 +5651,10 @@ performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" +picomatch@^2.0.4, picomatch@^2.0.5: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -4104,6 +5673,12 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + dependencies: + node-modules-regexp "^1.0.0" + pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" @@ -4116,6 +5691,12 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + dependencies: + find-up "^4.0.0" + portfinder@^1.0.9: version "1.0.13" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" @@ -4167,6 +5748,10 @@ postcss@^6.0.1, postcss@^6.0.23: source-map "^0.6.1" supports-color "^5.4.0" +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + pretty-error@^2.0.2: version "2.1.1" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" @@ -4174,6 +5759,15 @@ pretty-error@^2.0.2: renderkid "^2.0.1" utila "~0.4" +pretty-format@^26.2.0: + version "26.2.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.2.0.tgz#83ecc8d7de676ff224225055e72bd64821cec4f1" + dependencies: + "@jest/types" "^26.2.0" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" + prism-themes@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/prism-themes/-/prism-themes-1.4.0.tgz#2f93a33450532577c7962928655d7b4305fa843d" @@ -4200,6 +5794,13 @@ promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" +prompts@^2.0.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068" + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.4" + proxy-addr@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341" @@ -4215,6 +5816,10 @@ pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + public-encrypt@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" @@ -4255,7 +5860,7 @@ 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: +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -4267,7 +5872,7 @@ qs@6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" -qs@^6.5.1, qs@~6.5.1: +qs@^6.5.1, qs@~6.5.1, qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" @@ -4322,6 +5927,10 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +react-is@^16.12.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" @@ -4329,6 +5938,14 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -4337,6 +5954,15 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" @@ -4472,6 +6098,20 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + dependencies: + lodash "^4.17.19" + +request-promise-native@^1.0.8: + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + dependencies: + request-promise-core "1.1.4" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + request@2.87.0: version "2.87.0" resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" @@ -4524,6 +6164,31 @@ request@2.87.0: tunnel-agent "^0.6.0" uuid "^3.0.0" +request@^2.88.2: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -4532,6 +6197,10 @@ require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -4542,14 +6211,30 @@ resolve-cwd@^2.0.0: dependencies: resolve-from "^3.0.0" +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + dependencies: + resolve-from "^5.0.0" + resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" +resolve@^1.10.0, resolve@^1.17.0, resolve@^1.3.2: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + dependencies: + path-parse "^1.0.6" + restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -4567,6 +6252,12 @@ rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: dependencies: glob "^7.1.3" +rimraf@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + dependencies: + glob "^7.1.3" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -4574,6 +6265,10 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" @@ -4614,6 +6309,20 @@ safe-regex@^1.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + sass-graph@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" @@ -4637,6 +6346,12 @@ sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" +saxes@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + dependencies: + xmlchars "^2.2.0" + schema-utils@^0.4.4, schema-utils@^0.4.5: version "0.4.5" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" @@ -4673,10 +6388,18 @@ selfsigned@^1.9.1: dependencies: node-forge "0.7.5" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + +semver@^7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -4783,18 +6506,40 @@ shebang-command@^1.2.0: dependencies: shebang-regex "^1.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + dependencies: + shebang-regex "^3.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" +sisteransi@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -4866,11 +6611,18 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" +source-map-support@^0.5.6: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" -source-map@0.5.x, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0: +source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.0: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -4880,10 +6632,14 @@ source-map@^0.4.2: dependencies: amdefine ">=0.0.4" -source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" +source-map@^0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + spdx-correct@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" @@ -4962,6 +6718,12 @@ stable@~0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" +stack-utils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.2.tgz#5cf48b4557becb4638d0bc4f21d23f5d19586593" + dependencies: + escape-string-regexp "^2.0.0" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -4983,6 +6745,10 @@ stdout-stream@^1.4.0: dependencies: readable-stream "^2.0.1" +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + stream-browserify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" @@ -5011,6 +6777,13 @@ stream-shift@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" +string-length@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1" + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -5026,6 +6799,14 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + string_decoder@^1.0.0, string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -5058,16 +6839,30 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + dependencies: + ansi-regex "^5.0.0" + 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@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" @@ -5110,6 +6905,19 @@ supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0: dependencies: has-flag "^3.0.0" +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47" + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + svg-url-loader@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/svg-url-loader/-/svg-url-loader-2.3.2.tgz#dd86b26c19fe3b914f04ea10ef39594eade04464" @@ -5136,6 +6944,10 @@ svgo@^1.0.3, svgo@~1.0.5: unquote "~1.1.1" util.promisify "~1.0.0" +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + tapable@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" @@ -5160,6 +6972,25 @@ tar@^4: safe-buffer "^5.1.2" yallist "^3.0.2" +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +throat@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" + through2@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" @@ -5191,6 +7022,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-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -5199,6 +7034,10 @@ to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -5212,6 +7051,12 @@ to-regex-range@^2.1.0: is-number "^3.0.0" repeat-string "^1.6.1" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + dependencies: + is-number "^7.0.0" + to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" @@ -5225,12 +7070,33 @@ toposort@^1.0.0: version "1.0.7" resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" +tough-cookie@^2.3.3, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" + dependencies: + ip-regex "^2.1.0" + psl "^1.1.28" + punycode "^2.1.1" + tough-cookie@~2.3.0, 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" +tr46@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" + dependencies: + punycode "^2.1.1" + trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -5263,6 +7129,28 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + type-is@~1.6.15, type-is@~1.6.16: version "1.6.16" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" @@ -5270,6 +7158,12 @@ type-is@~1.6.15, type-is@~1.6.16: media-typer "0.3.0" mime-types "~2.1.18" +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + dependencies: + is-typedarray "^1.0.0" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -5356,7 +7250,7 @@ upper-case@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" -uri-js@^4.2.1: +uri-js@^4.2.1, uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" dependencies: @@ -5429,10 +7323,22 @@ uuid@^3.3.2: version "3.3.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" +uuid@^8.2.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.0.tgz#ab738085ca22dc9a8c92725e459b1d507df5d6ea" + v8-compile-cache@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz#526492e35fc616864284700b7043e01baee09f0a" +v8-to-istanbul@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz#b97936f21c0e2d9996d4985e5c5156e9d4e49cd6" + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + validate-npm-package-license@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" @@ -5458,6 +7364,24 @@ vm-browserify@0.0.4: dependencies: indexof "0.0.1" +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + dependencies: + xml-name-validator "^3.0.0" + +walker@^1.0.7, 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" + watchpack@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" @@ -5472,6 +7396,14 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + webpack-cli@^3.0.8: version "3.0.8" resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.0.8.tgz#90eddcf04a4bfc31aa8c0edc4c76785bc4f1ccd9" @@ -5591,6 +7523,24 @@ websocket-extensions@>=0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + +whatwg-url@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.1.0.tgz#c628acdcf45b82274ce7281ee31dd3c839791771" + dependencies: + lodash.sortby "^4.7.0" + tr46 "^2.0.2" + webidl-conversions "^5.0.0" + which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" @@ -5605,12 +7555,22 @@ which@1, which@^1.2.9: dependencies: isexe "^2.0.0" +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + dependencies: + isexe "^2.0.0" + wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" dependencies: string-width "^1.0.2 || 2" +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + worker-farm@^1.5.2: version "1.6.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" @@ -5624,10 +7584,39 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^7.2.3: + version "7.3.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" + +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" + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + xregexp@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" @@ -5658,6 +7647,13 @@ yargs-parser@^10.1.0: dependencies: camelcase "^4.1.0" +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" @@ -5704,6 +7700,22 @@ yargs@^11.1.0: y18n "^3.2.1" yargs-parser "^9.0.2" +yargs@^15.3.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + yargs@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" From eff8e6c59c2f8c26e08da07701ef2a1791c7d8ce Mon Sep 17 00:00:00 2001 From: Drew Banin Date: Sun, 2 Aug 2020 16:30:28 -0400 Subject: [PATCH 2/5] support depth modifiers and new node selectors --- Makefile | 3 + src/app/services/selector_graph.js | 12 +- src/app/services/selector_integration.test.js | 16 +++ src/app/services/selector_matcher.js | 126 ++++++++++++++++-- src/app/services/selector_methods.js | 89 ++++++++----- src/app/services/selector_methods.test.js | 75 +++++++++-- 6 files changed, 260 insertions(+), 61 deletions(-) diff --git a/Makefile b/Makefile index 8de13f524..5c2f1eebf 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,9 @@ dev: DBT_DOCS_ENV=development npm start +watch: + npm run-script watch + dist: clean DBT_DOCS_ENV=production webpack rm -rf dist/fonts dist/main.js dist/main.js.map diff --git a/src/app/services/selector_graph.js b/src/app/services/selector_graph.js index 8531b39de..c66736a31 100644 --- a/src/app/services/selector_graph.js +++ b/src/app/services/selector_graph.js @@ -1,5 +1,9 @@ const _ = require('underscore'); +function _isDefined(value) { + return !_.isNull(value) && !_.isUndefined(value); +} + // Returns all parents of all children of the node function selectAt(dag, node) { var selected = [node]; @@ -18,12 +22,12 @@ function ancestorNodes(dag, node, max_hops, hop_index) { var up = dag.predecessors(node); // node is not in the dag - if (!up) { + if (!up || max_hops == 0) { return []; } var ancestors = up.concat(up.reduce(function(sum, u) { - if (hop_index >= max_hops && max_hops !== undefined) { + if (hop_index >= max_hops && _isDefined(max_hops)) { return sum } return sum.concat(ancestorNodes(dag, u, max_hops, hop_index + 1)); @@ -36,12 +40,12 @@ function descendentNodes(dag, node, max_hops, hop_index) { if (!hop_index) hop_index = 1; var down = dag.successors(node); - if (!down) { + if (!down || max_hops == 0) { return []; } var descendents = down.concat(down.reduce(function(sum, u) { - if (hop_index >= max_hops && max_hops !== undefined) { + if (hop_index >= max_hops && _isDefined(max_hops)) { return sum } return sum.concat(descendentNodes(dag, u, max_hops, hop_index + 1)); diff --git a/src/app/services/selector_integration.test.js b/src/app/services/selector_integration.test.js index f12f1ead5..5b483be8e 100644 --- a/src/app/services/selector_integration.test.js +++ b/src/app/services/selector_integration.test.js @@ -96,6 +96,8 @@ test("Test getting nodes from a spec (no nodes)", () => { { select_at: false, select_parents: false, + parents_depth: null, + children_depth: null, select_children: false, selector_type: 'fqn', selector_value: 'badselector', @@ -116,6 +118,8 @@ test("Test getting nodes from a spec", () => { { select_at: false, select_parents: true, + parents_depth: null, + children_depth: null, select_children: true, selector_type: 'fqn', selector_value: 'c', @@ -138,6 +142,8 @@ test("Test getting nodes from a spec at-selector", () => { { select_at: true, select_parents: false, + parents_depth: null, + children_depth: null, select_children: false, selector_type: 'fqn', selector_value: 'c', @@ -160,6 +166,8 @@ test("Test getting nodes by tag", () => { { select_at: false, select_parents: true, + parents_depth: null, + children_depth: null, select_children: false, selector_type: 'tag', selector_value: 'daily', @@ -182,6 +190,8 @@ test("Test getting nodes by source", () => { { select_at: false, select_parents: true, + parents_depth: null, + children_depth: null, select_children: false, selector_type: 'source', selector_value: 'event', @@ -204,6 +214,8 @@ test("Test getting nodes by source with children", () => { { select_at: false, select_parents: true, + parents_depth: null, + children_depth: null, select_children: true, selector_type: 'source', selector_value: 'event', @@ -226,6 +238,8 @@ test("Test getting nodes by source with table name", () => { { select_at: false, select_parents: true, + parents_depth: null, + children_depth: null, select_children: true, selector_type: 'source', selector_value: 'event.a', @@ -248,6 +262,8 @@ test("Test getting nodes by tag with no edges", () => { { select_at: false, select_parents: true, + parents_depth: null, + children_depth: null, select_children: true, selector_type: 'tag', selector_value: 'imported', diff --git a/src/app/services/selector_matcher.js b/src/app/services/selector_matcher.js index 72a5b3fa7..7e686e469 100644 --- a/src/app/services/selector_matcher.js +++ b/src/app/services/selector_matcher.js @@ -4,11 +4,29 @@ const selectorGraph = require('./selector_graph'); var SELECTOR_GLOB = '*' var SELECTOR_TYPE = { + IMPLICIT: 'implicit', FQN: 'fqn', TAG: 'tag', - SOURCE: 'source' + SOURCE: 'source', + PATH: 'path', + PACKAGE: 'package', + CONFIG: 'config', + TEST_NAME: 'test_name', + TEST_TYPE: 'test_type', } +var NODE_MATCHERS = {} +NODE_MATCHERS[SELECTOR_TYPE.IMPLICIT] = getNodesByImplicitSelection; +NODE_MATCHERS[SELECTOR_TYPE.FQN] = getNodesByFQN; +NODE_MATCHERS[SELECTOR_TYPE.TAG] = getNodesByTag; +NODE_MATCHERS[SELECTOR_TYPE.SOURCE] = getNodesBySource; +NODE_MATCHERS[SELECTOR_TYPE.PATH] = getNodesByPath; +NODE_MATCHERS[SELECTOR_TYPE.PACKAGE] = getNodesByPackage; +NODE_MATCHERS[SELECTOR_TYPE.CONFIG] = getNodesByConfig; +NODE_MATCHERS[SELECTOR_TYPE.TEST_NAME] = getNodesByTestName; +NODE_MATCHERS[SELECTOR_TYPE.TEST_TYPE] = getNodesByTestType; + + function isFQNMatch(node_fqn, node_selector) { for (var i=0; i elements[id].data); +} + function getNodesByTag(elements, tag) { var nodes = []; _.each(elements, function(node_obj) { @@ -73,6 +127,65 @@ function getNodesByTag(elements, tag) { return nodes; } +function getNodesByPackage(elements, package_name) { + var nodes = []; + _.each(elements, function(node_obj) { + if (node_obj.data.package_name == package_name) { + nodes.push(node_obj.data); + } + }); + return nodes; +} + +/* + * Test cases: + * - config.incremental_strategy:delete+insert + * - config.unique_key:abc + * - config.severity:error + * - config.schema:analytics_utils + * - config.materialized:incremental + * - config.alias:some_alias + */ +function getNodesByConfig(elements, config) { + var nodes = []; + _.each(elements, function(node_obj) { + var node = node_obj.data; + + if (node.config[config.config] == config.value) { + nodes.push(node); + } + }); + return nodes; +} + +function getNodesByTestName(elements, test_name) { + var nodes = []; + _.each(elements, function(node_obj) { + var node = node_obj.data; + + if (node.test_metadata && node.test_metadata.name == test_name) { + nodes.push(node); + } + }); + return nodes; +} + +function getNodesByTestType(elements, test_type) { + var nodes = []; + _.each(elements, function(node_obj) { + var node = node_obj.data; + + if (node.resource_type != 'test') { + return false; + } else if (_.includes(node.tags, 'schema') && test_type == 'schema') { + nodes.push(node); + } else if (_.includes(node.tags, 'data') && test_type == 'data') { + nodes.push(node); + } + }); + return nodes; +} + function getNodesBySource(elements, source) { var nodes = []; _.each(elements, function(node_obj) { @@ -107,13 +220,8 @@ function getNodesBySource(elements, source) { return nodes; } -function getNodesFromSpec(dag, pristine_nodes, hops, selector) { - var matchers = {} - matchers[SELECTOR_TYPE.FQN] = getNodesByFQN; - matchers[SELECTOR_TYPE.TAG] = getNodesByTag; - matchers[SELECTOR_TYPE.SOURCE] = getNodesBySource; - - const matcher = matchers[selector.selector_type]; +function getNodesFromSpec(dag, pristine_nodes, maxHops, selector) { + const matcher = NODE_MATCHERS[selector.selector_type]; if (!matcher) { console.log("Node matcher for selector", selector.selector_type, "is invalid"); return { @@ -139,10 +247,12 @@ function getNodesFromSpec(dag, pristine_nodes, hops, selector) { } if (selector.select_parents) { + var hops = maxHops || selector.parents_depth; upstream = selectorGraph.ancestorNodes(dag, selected_node, hops); } if (selector.select_children) { + var hops = maxHops || selector.children_depth; downstream = selectorGraph.descendentNodes(dag, selected_node, hops) } diff --git a/src/app/services/selector_methods.js b/src/app/services/selector_methods.js index 77afda5ee..249b66f98 100644 --- a/src/app/services/selector_methods.js +++ b/src/app/services/selector_methods.js @@ -21,51 +21,68 @@ function splitSpecs(node_spec, delim) { } function parseSpec(node_spec) { - var select_at = false; - var select_children = false; - var select_parents = false; - var index_start = 0; - var index_end = node_spec.length; - - // @+ is not a valid selector - one or the other is required - if (node_spec.startsWith(SELECTOR_AT)) { - select_at = true; - index_start = 1; - } else if (node_spec.startsWith(SELECTOR_PARENTS)) { - select_parents = true; - index_start = 1; + var spec = { + raw: node_spec, + select_at: false, + select_children: false, + children_depth: null, + select_parents: false, + parents_depth: null, } - if (node_spec.endsWith(SELECTOR_CHILDREN)) { - select_children = true; - index_end -= 1; - } + var selector_regex = new RegExp('' + + /^/.source + + /(?(\@))?/.source + + /(?((?(\d*))\+))?/.source + + /((?([\w.]+)):)?/.source + + /(?(.*?))/.source + + /(?(\+(?(\d*))))?/.source + + /$/.source + ); - // TODO : we're going to need to catch this one - if (select_children && select_at) { - throw new Error('Selector is invalid'); - } + const parsed = selector_regex.exec(node_spec).groups; - var node_selector = node_spec.substring(index_start, index_end) + spec.select_at = parsed.childs_parents == '@'; + spec.select_parents = !!parsed.parents; + spec.select_children = !!parsed.children; - var selector_type; - var selector_val; + if (parsed.parents_depth) { + spec.parents_depth = parseInt(parsed.parents_depth); + } - if (node_selector.indexOf(':') != -1) { - [selector_type, selector_val] = node_selector.split(':', 2); - } else { - selector_type = 'fqn'; - selector_val = node_selector; + if (parsed.children_depth) { + spec.children_depth = parseInt(parsed.children_depth); } - return { - select_at: select_at, - select_parents: select_parents, - select_children: select_children, - selector_type: selector_type, - selector_value: selector_val, - raw: node_spec + var selector_method = parsed.method; + var selector_value = parsed.value; + + // TODO : We should probably make select_at and select_parents/select_children + // mutually exclusive. It would be nice if this could raise and show an error + // message in the UI if a user inputs an invalid selector definition.... + + if (!selector_method) { + // Support unspecified selector type, eg: --models my_model + // The implicit selector matches FQN + Path on the CLI + selector_method = 'implicit'; + } else if (selector_method.indexOf('.') != -1) { + // Support config.materialized:table ==> { + // selector_type: config + // selector_value: { + // config: materialized, + // value: table + // } + [selector_method, selector_modifier] = selector_method.split('.', 2); + selector_value = { + config: selector_modifier, + value: selector_value + } } + + spec.selector_type = selector_method; + spec.selector_value = selector_value; + + return spec } diff --git a/src/app/services/selector_methods.test.js b/src/app/services/selector_methods.test.js index 5533125c8..885593d24 100644 --- a/src/app/services/selector_methods.test.js +++ b/src/app/services/selector_methods.test.js @@ -48,7 +48,9 @@ test("Test parsing specs (fqn)", () => { select_at: false, select_children: false, select_parents: false, - selector_type: 'fqn', + parents_depth: null, + children_depth: null, + selector_type: 'implicit', selector_value: 'a', raw: 'a', }); @@ -61,7 +63,9 @@ test("Test parsing specs (fqn with parents and children)", () => { select_at: false, select_children: true, select_parents: true, - selector_type: 'fqn', + parents_depth: null, + children_depth: null, + selector_type: 'implicit', selector_value: 'a', raw: '+a+', }); @@ -74,7 +78,9 @@ test("Test parsing specs (at-syntax)", () => { select_at: true, select_children: false, select_parents: false, - selector_type: 'fqn', + parents_depth: null, + children_depth: null, + selector_type: 'implicit', selector_value: 'a', raw: '@a', }); @@ -87,6 +93,8 @@ test("Test parsing specs (explicit fqn)", () => { select_at: true, select_children: false, select_parents: false, + parents_depth: null, + children_depth: null, selector_type: 'fqn', selector_value: 'a', raw: '@fqn:a', @@ -100,6 +108,8 @@ test("Test parsing specs (explicit tag)", () => { select_at: true, select_children: false, select_parents: false, + parents_depth: null, + children_depth: null, selector_type: 'tag', selector_value: 'a', raw: '@tag:a', @@ -113,6 +123,8 @@ test("Test parsing specs (explicit source)", () => { select_at: false, select_children: true, select_parents: false, + parents_depth: null, + children_depth: null, selector_type: 'source', selector_value: 'a', raw: 'source:a+', @@ -126,6 +138,8 @@ test("Test parsing specs (explicit source.table)", () => { select_at: false, select_children: true, select_parents: false, + parents_depth: null, + children_depth: null, selector_type: 'source', selector_value: 'a.b', raw: 'source:a.b+', @@ -139,7 +153,9 @@ test("Test parsing specs (scoped fqn)", () => { select_at: false, select_children: true, select_parents: false, - selector_type: 'fqn', + parents_depth: null, + children_depth: null, + selector_type: 'implicit', selector_value: 'a.b.c', raw: 'a.b.c+', }); @@ -156,7 +172,9 @@ test("Test set based selectors", () => { select_at: false, select_children: false, select_parents: false, - selector_type: 'fqn', + parents_depth: null, + children_depth: null, + selector_type: 'implicit', selector_value: 'a', raw: 'a', }, @@ -164,7 +182,9 @@ test("Test set based selectors", () => { select_at: false, select_children: false, select_parents: false, - selector_type: 'fqn', + parents_depth: null, + children_depth: null, + selector_type: 'implicit', selector_value: 'b', raw: 'b', } @@ -177,7 +197,9 @@ test("Test set based selectors", () => { select_at: false, select_children: false, select_parents: false, - selector_type: 'fqn', + parents_depth: null, + children_depth: null, + selector_type: 'implicit', selector_value: 'c', raw: 'c', } @@ -196,6 +218,8 @@ test("Test set based selectors (complicated)", () => { { select_at: false, select_parents: false, + parents_depth: null, + children_depth: null, select_children: false, selector_type: 'tag', selector_value: 'a', @@ -204,6 +228,8 @@ test("Test set based selectors (complicated)", () => { { select_at: false, select_parents: false, + parents_depth: null, + children_depth: null, select_children: false, selector_type: 'source', selector_value: 'b.c', @@ -217,8 +243,10 @@ test("Test set based selectors (complicated)", () => { { select_at: false, select_parents: false, + parents_depth: null, + children_depth: null, select_children: false, - selector_type: 'fqn', + selector_type: 'implicit', selector_value: 'mypackage', raw: 'mypackage' }, @@ -230,6 +258,8 @@ test("Test set based selectors (complicated)", () => { { select_at: false, select_parents: false, + parents_depth: null, + children_depth: null, select_children: false, selector_type: 'fqn', selector_value: 'a.b.c', @@ -238,6 +268,8 @@ test("Test set based selectors (complicated)", () => { { select_at: false, select_parents: false, + parents_depth: null, + children_depth: null, select_children: true, selector_type: 'tag', selector_value: 'mytag', @@ -249,9 +281,18 @@ test("Test set based selectors (complicated)", () => { }) test("Test parsing invalid spec", () => { - expect(() => { + expect( selectors.parseSpec('@a+') - }).toThrow(); + ).toStrictEqual({ + children_depth: null, + parents_depth: null, + raw: "@a+", + select_at: true, + select_children: true, + select_parents: false, + selector_type: 'implicit', + selector_value: 'a' + }) }) @@ -300,14 +341,18 @@ test("Test parsing specs", () => { { select_at: false, select_parents: false, + parents_depth: null, + children_depth: null, select_children: false, - selector_type: 'fqn', + selector_type: 'implicit', selector_value: 'a', raw: 'a' }, { select_at: false, select_parents: false, + parents_depth: null, + children_depth: null, select_children: true, selector_type: 'tag', selector_value: 'b', @@ -321,8 +366,10 @@ test("Test parsing specs", () => { { select_at: false, select_parents: false, + parents_depth: null, + children_depth: null, select_children: false, - selector_type: 'fqn', + selector_type: 'implicit', selector_value: 'c', raw: 'c' }, @@ -336,8 +383,10 @@ test("Test parsing specs", () => { { select_at: false, select_parents: false, + parents_depth: null, + children_depth: null, select_children: false, - selector_type: 'fqn', + selector_type: 'implicit', selector_value: 'd', raw: 'd' }, From e5c8e014ef4736a08537a103ce813447051bd974 Mon Sep 17 00:00:00 2001 From: Drew Banin Date: Sun, 2 Aug 2020 17:45:26 -0400 Subject: [PATCH 3/5] add lots of tests --- src/app/components/code_block/code_block.html | 3 +- src/app/components/graph/graph-launcher.html | 2 +- src/app/services/selector_integration.test.js | 48 +++++ src/app/services/selector_matcher.js | 19 +- src/app/services/selector_matcher.test.js | 202 ++++++++++++++++++ src/app/services/selector_methods.test.js | 20 +- 6 files changed, 271 insertions(+), 23 deletions(-) diff --git a/src/app/components/code_block/code_block.html b/src/app/components/code_block/code_block.html index 9b3cc04bb..fd7f7c575 100644 --- a/src/app/components/code_block/code_block.html +++ b/src/app/components/code_block/code_block.html @@ -14,7 +14,8 @@
Code
-
+
diff --git a/src/app/components/graph/graph-launcher.html b/src/app/components/graph/graph-launcher.html index 4b45f04a0..5a3b991a7 100644 --- a/src/app/components/graph/graph-launcher.html +++ b/src/app/components/graph/graph-launcher.html @@ -192,7 +192,7 @@
class="field-input form-control input-dark" ng-model="selectorService.selection.dirty.include" placeholder="..." /> -
--models
+
--select