diff --git a/README.md b/README.md index cd20786..745788b 100644 --- a/README.md +++ b/README.md @@ -9,37 +9,38 @@ * Responsive, accessible, composable, and customizable image gallery component * Maintains the original aspect ratio of your photos -* Creates a masonry style layout -* Uses actual image elements, optionally pass in srcSet and sizes attributes +* Creates a masonry or justified grid * Supports row or column direction layout -* Supports passing in a custom image component for implementation of things like image selection, favorites, captions, or whatever your little heart desires! +* Provides an image renderer for custom implementation of things like image selection, favorites, captions, etc. * SSR app compatible ## Preview - -## Installation +| Row | Column | +| ------------- |:-------------:| +| | | + -To install: +## Installation ``` yarn add react-photo-gallery ``` -## Documentation and Examples +## API Documentation [http://neptunian.github.io/react-photo-gallery/](http://neptunian.github.io/react-photo-gallery/) -## Direct CodeSandbox Links with Examples and Use Cases +## CodeSandbox Demos with Example Use Cases * [Basic Row Layout](https://codesandbox.io/s/9yx911wl9y) * [Basic Column Layout](https://codesandbox.io/s/r09k1xj614) * [With Lightbox](https://codesandbox.io/s/5vn3lvz2n4) -* [Custom Dynamic Columns](https://codesandbox.io/s/ll7ym48027) -* [Selection using custom ImageComponent](https://codesandbox.io/s/o7o241q09) +* [Dynamic Columns Using columns prop](https://codesandbox.io/s/ll7ym48027) +* [Selection using custom renderImage](https://codesandbox.io/s/o7o241q09) * [Sortable with drag and drop](https://codesandbox.io/s/8y7n1r9y5j) -To build some examples locally, run: +To build some examples locally, git clone and run: ``` yarn install @@ -49,7 +50,7 @@ yarn start Then open [`localhost:8000`](http://localhost:8000) in a browser. -## Use +## Minimal Setup Example ```jsx @@ -70,40 +71,12 @@ const photos = [ ``` -### Gallery properties - -Property | Type | Default | Description -:-----------------------|:--------------|:--------------|:-------------------------------- -photos | array | undefined | required; array of objects -columns | number or function | undefined | optional; number of photos per row or a function which receives the container width and should return the desired number of photos per row; defaults to Gallery's breakpoint choosing -onClick | function | undefined | optional; do something when the user clicks a photo; receives arguments event and an object containing the index, photo obj originally sent and the next and previous photos in the gallery if they exist -margin | number | 2 | optional; number of margin pixels around each entire image -direction | string | 'row' | optional; `column` or `row` based layout -ImageComponent | function | default component | optional; use a different image component than the default provided to display your photo - -### Photos array item properties (passed into Gallery's photos property) - -Property | Type | Default | Description -:-----------------------|:--------------|:--------------|:-------------------------------- -src | string | undefined | required; the img src attribute value of the image -srcSet | array or string | undefined | optional; srcSet attribute of the image -sizes | array or string | undefined | optional; sizes attribute of the image -width | number | undefined | required; original width of the gallery image (only used for calculating aspect ratio) -height | number | undefined | required; original height of the gallery image (only used for calculating aspect ratio) -alt | string | undefined | optional; alt text of the gallery image -key | string | src | optional; key to be used on component - -### ImageComponent props - -If you're passing a function component to ImageComponent you will receive back these props: - - -Property | Type | Value -:-----------------------|:--------------|:-------------- -margin | string | optional; margin prop optionally passed into Gallery by user -index | number | required; the index of the photo within the Gallery -photo | object | required; the individual object passed into Gallery's `photos` array prop, with all the same props except recalculated height and width -direction | string | optional; direction passed into Gallery -top | number | required if direction is 'column'; top position of this image, only passed if direction prop was 'column' -left | number | required if direction is 'column'; left position of this image, only passed if direction prop was 'column' -onClick | function | optional; the onClick function optionally passsed into Gallery by user +## How It Works + +### Row Layout +This layout uses an algorithm adapted from the Knuth and Plass line breaking algorithm. It uses a graph to calculate the single best layout where each photo to break on is represented by a node and each edge is represented by a row. The cost of the edge is determined by the user provided `targetRowHeight` vs the row height calculated if it were to break on this node/photo. What you end up with is a layout with rows that are similar in height and photos that are not being stretched or shrunken abnormally as is what happens in a naive implementation. This solves the issue of panoramas shrinking rows or having stragglers or stretched images at the last row, instead creating a justified grid. To make sure it's speedy the graph is being built as the shortest path is being calculated so the entire adjacency list is not calculated ahead of time. You can control how many neighboring nodes that Dijkistra's algorithm will search when it's visiting a node by adjusting the `limitNodeSearch` property, but it's recommended you use the default algorithm. See documentation for recommendations. + +Inspired by [this blog article](http://blog.vjeux.com/2014/image/google-plus-layout-find-best-breaks.html) and this [Google Photos blog article](https://medium.com/google-design/google-photos-45b714dfbed1) (under 2. Justified Gallery). + +### Column Layout +Goes through each column looking for the best place to insert the next photo by finding the shortest column. Not recommended for panorama aspect ratios. \ No newline at end of file diff --git a/__test__/Gallery.test.js b/__test__/Gallery.test.js index 809ca80..b70d580 100644 --- a/__test__/Gallery.test.js +++ b/__test__/Gallery.test.js @@ -52,7 +52,7 @@ describe('Gallery', () => { it('renders correctly with a column function', () => { const columns = jest.fn(_ => 3); wrapper = mount( - + ); wrapper.setState({containerWidth: 1139}) expect(columns).toBeCalledWith(1139); diff --git a/__test__/__snapshots__/Gallery.test.js.snap b/__test__/__snapshots__/Gallery.test.js.snap index f0f17c0..314ce68 100644 --- a/__test__/__snapshots__/Gallery.test.js.snap +++ b/__test__/__snapshots__/Gallery.test.js.snap @@ -9,7 +9,7 @@ exports[`Gallery renders correctly 1`] = ` Array [ Object { "alt": "DSC02427", - "height": 1065, + "height": 246.92982456140348, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -23,11 +23,11 @@ exports[`Gallery renders correctly 1`] = ` "https://farm6.staticflickr.com/5638/20770219315_0443da777d_h.jpg 1600w", ], "title": "DSC02427", - "width": 1600, + "width": 370.4, }, Object { "alt": "bleik sólsetur", - "height": 1065, + "height": 246.92982456140348, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -41,11 +41,11 @@ exports[`Gallery renders correctly 1`] = ` "https://farm6.staticflickr.com/5825/20149281203_16cdbb86d5_h.jpg 1600w", ], "title": "bleik sólsetur", - "width": 1600, + "width": 370.4, }, Object { "alt": "DSC02393", - "height": 1023, + "height": 246.92982456140348, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -59,11 +59,11 @@ exports[`Gallery renders correctly 1`] = ` "https://farm1.staticflickr.com/760/20147663824_bb6ffff6e6_h.jpg 1600w", ], "title": "DSC02393", - "width": 1600, + "width": 385.2, }, Object { "alt": "DSC01594", - "height": 1065, + "height": 244.5887445887446, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -77,11 +77,11 @@ exports[`Gallery renders correctly 1`] = ` "https://farm6.staticflickr.com/5609/15605220721_af9706fda6_h.jpg 1600w", ], "title": "DSC01594", - "width": 1600, + "width": 366.9, }, Object { "alt": "DSC01590", - "height": 513, + "height": 244.5887445887446, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -95,11 +95,11 @@ exports[`Gallery renders correctly 1`] = ` "https://farm4.staticflickr.com/3944/14987740533_559154cfd8_h.jpg 1600w", ], "title": "DSC01590", - "width": 1600, + "width": 763.1, }, Object { "alt": "DSC01570", - "height": 1065, + "height": 379.19463087248323, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -113,11 +113,11 @@ exports[`Gallery renders correctly 1`] = ` "https://farm6.staticflickr.com/5612/15584207196_51d672b3e2_h.jpg 1600w", ], "title": "DSC01570", - "width": 1600, + "width": 568.8, }, Object { "alt": "DSC01566", - "height": 1083, + "height": 379.19463087248323, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -131,10 +131,11 @@ exports[`Gallery renders correctly 1`] = ` "https://farm4.staticflickr.com/3948/15421251759_0091d2645c_h.jpg 1600w", ], "title": "DSC01566", - "width": 1600, + "width": 561.2, }, ] } + targetRowHeight={300} >
- DSC02427 - - +
bleik sólsetur - - +
DSC02393 - - +
DSC01594 - - +
DSC01590 - - +
DSC01570 - - +
DSC01566 - +
@@ -561,7 +401,7 @@ exports[`Gallery renders correctly after click 1`] = ` Array [ Object { "alt": "DSC02427", - "height": 1065, + "height": 246.92982456140348, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -575,11 +415,11 @@ exports[`Gallery renders correctly after click 1`] = ` "https://farm6.staticflickr.com/5638/20770219315_0443da777d_h.jpg 1600w", ], "title": "DSC02427", - "width": 1600, + "width": 370.4, }, Object { "alt": "bleik sólsetur", - "height": 1065, + "height": 246.92982456140348, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -593,11 +433,11 @@ exports[`Gallery renders correctly after click 1`] = ` "https://farm6.staticflickr.com/5825/20149281203_16cdbb86d5_h.jpg 1600w", ], "title": "bleik sólsetur", - "width": 1600, + "width": 370.4, }, Object { "alt": "DSC02393", - "height": 1023, + "height": 246.92982456140348, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -611,11 +451,11 @@ exports[`Gallery renders correctly after click 1`] = ` "https://farm1.staticflickr.com/760/20147663824_bb6ffff6e6_h.jpg 1600w", ], "title": "DSC02393", - "width": 1600, + "width": 385.2, }, Object { "alt": "DSC01594", - "height": 1065, + "height": 244.5887445887446, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -629,11 +469,11 @@ exports[`Gallery renders correctly after click 1`] = ` "https://farm6.staticflickr.com/5609/15605220721_af9706fda6_h.jpg 1600w", ], "title": "DSC01594", - "width": 1600, + "width": 366.9, }, Object { "alt": "DSC01590", - "height": 513, + "height": 244.5887445887446, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -647,11 +487,11 @@ exports[`Gallery renders correctly after click 1`] = ` "https://farm4.staticflickr.com/3944/14987740533_559154cfd8_h.jpg 1600w", ], "title": "DSC01590", - "width": 1600, + "width": 763.1, }, Object { "alt": "DSC01570", - "height": 1065, + "height": 379.19463087248323, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -665,11 +505,11 @@ exports[`Gallery renders correctly after click 1`] = ` "https://farm6.staticflickr.com/5612/15584207196_51d672b3e2_h.jpg 1600w", ], "title": "DSC01570", - "width": 1600, + "width": 568.8, }, Object { "alt": "DSC01566", - "height": 1083, + "height": 379.19463087248323, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -683,10 +523,11 @@ exports[`Gallery renders correctly after click 1`] = ` "https://farm4.staticflickr.com/3948/15421251759_0091d2645c_h.jpg 1600w", ], "title": "DSC01566", - "width": 1600, + "width": 561.2, }, ] } + targetRowHeight={300} >
- DSC02427 - - +
bleik sólsetur - - +
DSC02393 - - +
DSC01594 - - +
DSC01590 - - +
DSC01570 - - +
DSC01566 - +
@@ -1114,7 +794,7 @@ exports[`Gallery renders correctly if there are more columns than photos 1`] = ` Array [ Object { "alt": "DSC02427", - "height": 1065, + "height": 246.92982456140348, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -1128,11 +808,11 @@ exports[`Gallery renders correctly if there are more columns than photos 1`] = ` "https://farm6.staticflickr.com/5638/20770219315_0443da777d_h.jpg 1600w", ], "title": "DSC02427", - "width": 1600, + "width": 370.4, }, Object { "alt": "bleik sólsetur", - "height": 1065, + "height": 246.92982456140348, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -1146,11 +826,11 @@ exports[`Gallery renders correctly if there are more columns than photos 1`] = ` "https://farm6.staticflickr.com/5825/20149281203_16cdbb86d5_h.jpg 1600w", ], "title": "bleik sólsetur", - "width": 1600, + "width": 370.4, }, Object { "alt": "DSC02393", - "height": 1023, + "height": 246.92982456140348, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -1164,11 +844,11 @@ exports[`Gallery renders correctly if there are more columns than photos 1`] = ` "https://farm1.staticflickr.com/760/20147663824_bb6ffff6e6_h.jpg 1600w", ], "title": "DSC02393", - "width": 1600, + "width": 385.2, }, Object { "alt": "DSC01594", - "height": 1065, + "height": 244.5887445887446, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -1182,11 +862,11 @@ exports[`Gallery renders correctly if there are more columns than photos 1`] = ` "https://farm6.staticflickr.com/5609/15605220721_af9706fda6_h.jpg 1600w", ], "title": "DSC01594", - "width": 1600, + "width": 366.9, }, Object { "alt": "DSC01590", - "height": 513, + "height": 244.5887445887446, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -1200,11 +880,11 @@ exports[`Gallery renders correctly if there are more columns than photos 1`] = ` "https://farm4.staticflickr.com/3944/14987740533_559154cfd8_h.jpg 1600w", ], "title": "DSC01590", - "width": 1600, + "width": 763.1, }, Object { "alt": "DSC01570", - "height": 1065, + "height": 379.19463087248323, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -1218,11 +898,11 @@ exports[`Gallery renders correctly if there are more columns than photos 1`] = ` "https://farm6.staticflickr.com/5612/15584207196_51d672b3e2_h.jpg 1600w", ], "title": "DSC01570", - "width": 1600, + "width": 568.8, }, Object { "alt": "DSC01566", - "height": 1083, + "height": 379.19463087248323, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -1236,10 +916,11 @@ exports[`Gallery renders correctly if there are more columns than photos 1`] = ` "https://farm4.staticflickr.com/3948/15421251759_0091d2645c_h.jpg 1600w", ], "title": "DSC01566", - "width": 1600, + "width": 561.2, }, ] } + targetRowHeight={300} >
- DSC02427 - - +
bleik sólsetur - - +
DSC02393 - - +
DSC01594 - - +
DSC01590 - - +
DSC01570 - - +
DSC01566 - +
@@ -1674,14 +1194,14 @@ exports[`Gallery renders correctly with a column function 1`] = ` ], } } - direction="row" + direction="column" margin={2} onClick={[Function]} photos={ Array [ Object { "alt": "DSC02427", - "height": 1065, + "height": 246.92982456140348, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -1695,11 +1215,11 @@ exports[`Gallery renders correctly with a column function 1`] = ` "https://farm6.staticflickr.com/5638/20770219315_0443da777d_h.jpg 1600w", ], "title": "DSC02427", - "width": 1600, + "width": 370.4, }, Object { "alt": "bleik sólsetur", - "height": 1065, + "height": 246.92982456140348, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -1713,11 +1233,11 @@ exports[`Gallery renders correctly with a column function 1`] = ` "https://farm6.staticflickr.com/5825/20149281203_16cdbb86d5_h.jpg 1600w", ], "title": "bleik sólsetur", - "width": 1600, + "width": 370.4, }, Object { "alt": "DSC02393", - "height": 1023, + "height": 246.92982456140348, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -1731,11 +1251,11 @@ exports[`Gallery renders correctly with a column function 1`] = ` "https://farm1.staticflickr.com/760/20147663824_bb6ffff6e6_h.jpg 1600w", ], "title": "DSC02393", - "width": 1600, + "width": 385.2, }, Object { "alt": "DSC01594", - "height": 1065, + "height": 244.5887445887446, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -1749,11 +1269,11 @@ exports[`Gallery renders correctly with a column function 1`] = ` "https://farm6.staticflickr.com/5609/15605220721_af9706fda6_h.jpg 1600w", ], "title": "DSC01594", - "width": 1600, + "width": 366.9, }, Object { "alt": "DSC01590", - "height": 513, + "height": 244.5887445887446, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -1767,11 +1287,11 @@ exports[`Gallery renders correctly with a column function 1`] = ` "https://farm4.staticflickr.com/3944/14987740533_559154cfd8_h.jpg 1600w", ], "title": "DSC01590", - "width": 1600, + "width": 763.1, }, Object { "alt": "DSC01570", - "height": 1065, + "height": 379.19463087248323, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -1785,11 +1305,11 @@ exports[`Gallery renders correctly with a column function 1`] = ` "https://farm6.staticflickr.com/5612/15584207196_51d672b3e2_h.jpg 1600w", ], "title": "DSC01570", - "width": 1600, + "width": 568.8, }, Object { "alt": "DSC01566", - "height": 1083, + "height": 379.19463087248323, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -1803,10 +1323,11 @@ exports[`Gallery renders correctly with a column function 1`] = ` "https://farm4.staticflickr.com/3948/15421251759_0091d2645c_h.jpg 1600w", ], "title": "DSC01566", - "width": 1600, + "width": 561.2, }, ] } + targetRowHeight={300} >
- DSC02427 - - +
bleik sólsetur - - +
DSC02393 - - +
DSC01594 - - +
DSC01590 - - +
DSC01570 - - +
DSC01566 - +
@@ -2233,7 +1613,7 @@ exports[`Gallery renders correctly with direction set to column 1`] = ` Array [ Object { "alt": "DSC02427", - "height": 1065, + "height": 246.92982456140348, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -2247,11 +1627,11 @@ exports[`Gallery renders correctly with direction set to column 1`] = ` "https://farm6.staticflickr.com/5638/20770219315_0443da777d_h.jpg 1600w", ], "title": "DSC02427", - "width": 1600, + "width": 370.4, }, Object { "alt": "bleik sólsetur", - "height": 1065, + "height": 246.92982456140348, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -2265,11 +1645,11 @@ exports[`Gallery renders correctly with direction set to column 1`] = ` "https://farm6.staticflickr.com/5825/20149281203_16cdbb86d5_h.jpg 1600w", ], "title": "bleik sólsetur", - "width": 1600, + "width": 370.4, }, Object { "alt": "DSC02393", - "height": 1023, + "height": 246.92982456140348, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -2283,11 +1663,11 @@ exports[`Gallery renders correctly with direction set to column 1`] = ` "https://farm1.staticflickr.com/760/20147663824_bb6ffff6e6_h.jpg 1600w", ], "title": "DSC02393", - "width": 1600, + "width": 385.2, }, Object { "alt": "DSC01594", - "height": 1065, + "height": 244.5887445887446, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -2301,11 +1681,11 @@ exports[`Gallery renders correctly with direction set to column 1`] = ` "https://farm6.staticflickr.com/5609/15605220721_af9706fda6_h.jpg 1600w", ], "title": "DSC01594", - "width": 1600, + "width": 366.9, }, Object { "alt": "DSC01590", - "height": 513, + "height": 244.5887445887446, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -2319,11 +1699,11 @@ exports[`Gallery renders correctly with direction set to column 1`] = ` "https://farm4.staticflickr.com/3944/14987740533_559154cfd8_h.jpg 1600w", ], "title": "DSC01590", - "width": 1600, + "width": 763.1, }, Object { "alt": "DSC01570", - "height": 1065, + "height": 379.19463087248323, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -2337,11 +1717,11 @@ exports[`Gallery renders correctly with direction set to column 1`] = ` "https://farm6.staticflickr.com/5612/15584207196_51d672b3e2_h.jpg 1600w", ], "title": "DSC01570", - "width": 1600, + "width": 568.8, }, Object { "alt": "DSC01566", - "height": 1083, + "height": 379.19463087248323, "sizes": Array [ "(min-width: 480px) 50vw", "(min-width: 1024px) 33.3vw", @@ -2355,10 +1735,11 @@ exports[`Gallery renders correctly with direction set to column 1`] = ` "https://farm4.staticflickr.com/3948/15421251759_0091d2645c_h.jpg 1600w", ], "title": "DSC01566", - "width": 1600, + "width": 561.2, }, ] } + targetRowHeight={300} >
- DSC02427 - - +
bleik sólsetur - - +
DSC02393 - - +
DSC01594 - - +
DSC01590 - - +
DSC01570 - - +
DSC01566 - +
diff --git a/__test__/utils.test.js b/__test__/utils.test.js index 0c292cb..40888f7 100644 --- a/__test__/utils.test.js +++ b/__test__/utils.test.js @@ -1,7 +1,10 @@ -import { ratio } from '../src/utils'; -import { round } from '../src/utils'; +import { ratio } from '../src/utils/ratio'; +import { round } from '../src/utils/round'; + +/* import { computeSizes } from '../src/utils'; import photos from './test-photo-data'; +*/ describe('the round function', () => { it('100.12345 to two places', () => expect(round(100.12345,2)).toBe(100.12)); @@ -15,6 +18,7 @@ describe('the ratio function', () => { it('width of 1 and height of 1', () => expect(ratio({width:1,height:1})).toBe(1)); }); +/* describe('the computeSizes function called with 7 images and 3 columns', () => { const width = 1138; const columns = 3; @@ -39,3 +43,4 @@ describe('the computeSizes function called with 7 images and 3 columns', () => { it('7th image width', () => expect(newPhotos[6].width).toBe(314.3)); it('7th image height', () => expect(newPhotos[6].height).toBe(212.4)); }); +*/ diff --git a/docs/README.md b/docs/README.md index dbac855..a4f443b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -12,37 +12,38 @@ description: A repsonsive image gallery component for React * Responsive, accessible, composable, and customizable image gallery component * Maintains the original aspect ratio of your photos -* Creates a "masonry" style layout -* Uses actual image elements, optionally pass in srcSet and sizes attributes +* Creates a masonry or justified grid * Supports row or column direction layout -* Supports passing in a custom image component for implementation of things like image selection, favorites, captions, or whatever your little heart desires! +* Provides an image renderer for custom implementation of things like image selection, favorites, captions, etc. * SSR app compatible ## Preview - -## Installation +| Row | Column | +| ------------- |:-------------:| +| | | + -To install: +## Installation ``` yarn add react-photo-gallery ``` -## Documentation and Examples +## API Documentation [http://neptunian.github.io/react-photo-gallery/](http://neptunian.github.io/react-photo-gallery/) -## Direct CodeSandbox Links with Examples and Use Cases +## CodeSandbox Demos with Example Use Cases * [Basic Row Layout](https://codesandbox.io/s/9yx911wl9y) * [Basic Column Layout](https://codesandbox.io/s/r09k1xj614) * [With Lightbox](https://codesandbox.io/s/5vn3lvz2n4) -* [Custom Dynamic Columns](https://codesandbox.io/s/ll7ym48027) -* [Selection using custom ImageComponent](https://codesandbox.io/s/o7o241q09) +* [Dynamic Columns Using columns prop](https://codesandbox.io/s/ll7ym48027) +* [Selection using custom renderImage](https://codesandbox.io/s/o7o241q09) * [Sortable with drag and drop](https://codesandbox.io/s/8y7n1r9y5j) -To build some examples locally, run: +To build some examples locally, git clone and run: ``` yarn install @@ -52,7 +53,7 @@ yarn start Then open [`localhost:8000`](http://localhost:8000) in a browser. -## Use +## Minimal Setup Example ```jsx @@ -73,40 +74,12 @@ const photos = [ ``` -### Gallery properties - -Property | Type | Default | Description -:-----------------------|:--------------|:--------------|:-------------------------------- -photos | array | undefined | required; array of objects -columns | number or function | undefined | optional; number of photos per row or a function which receives the container width and should return the desired number of photos per row; defaults to Gallery's breakpoint choosing -onClick | function | undefined | optional; do something when the user clicks a photo; receives arguments event and an object containing the index, photo obj originally sent and the next and previous photos in the gallery if they exist -margin | number | 2 | optional; number of margin pixels around each entire image -direction | string | 'row' | optional; `column` or `row` based layout -ImageComponent | function | default component | optional; use a different image component than the default provided to display your photo - -### Photos array item properties (passed into Gallery's photos property) - -Property | Type | Default | Description -:-----------------------|:--------------|:--------------|:-------------------------------- -src | string | undefined | required; the img src attribute value of the image -srcSet | array or string | undefined | optional; srcSet attribute of the image -sizes | array or string | undefined | optional; sizes attribute of the image -width | number | undefined | required; original width of the gallery image (only used for calculating aspect ratio) -height | number | undefined | required; original height of the gallery image (only used for calculating aspect ratio) -alt | string | undefined | optional; alt text of the gallery image -key | string | src | optional; key to be used on component - -### ImageComponent props - -If you're passing a function component to ImageComponent you will receive back these props: - - -Property | Type | Value -:-----------------------|:--------------|:-------------- -margin | string | optional; margin prop optionally passed into Gallery by user -index | number | required; the index of the photo within the Gallery -photo | object | required; the individual object passed into Gallery's `photos` array prop, with all the same props except recalculated height and width -direction | string | optional; direction passed into Gallery -top | number | required if direction is 'column'; top position of this image, only passed if direction prop was 'column' -left | number | required if direction is 'column'; left position of this image, only passed if direction prop was 'column' -onClick | function | optional; the onClick function optionally passsed into Gallery by user +## How It Works + +### Row Layout +This layout uses an algorithm adapted from the Knuth and Plass line breaking algorithm. It uses a graph to calculate the single best layout where each photo to break on is represented by a node and each edge is represented by a row. The cost of the edge is determined by the user provided `targetRowHeight` vs the row height calculated if it were to break on this node/photo. What you end up with is a layout with rows that are similar in height and photos that are not being stretched or shrunken abnormally as is what happens in a naive implementation. This solves the issue of panoramas shrinking rows or having stragglers or stretched images at the last row, instead creating a justified grid. To make sure it's speedy the graph is being built as the shortest path is being calculated so the entire adjacency list is not calculated ahead of time. You can control how many neighboring nodes that Dijkistra's algorithm will search when it's visiting a node by adjusting the `limitNodeSearch` property, but it's recommended you use the default algorithm. See documentation for recommendations. + +Inspired by [this blog article](http://blog.vjeux.com/2014/image/google-plus-layout-find-best-breaks.html) and this [Google Photos blog article](https://medium.com/google-design/google-photos-45b714dfbed1) (under 2. Justified Gallery). + +### Column Layout +Goes through each column looking for the best place to insert the next photo by finding the shortest column. Not recommended for panorama aspect ratios. \ No newline at end of file diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 2bf1dbf..734daaf 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -1,6 +1,7 @@ # Summary * [Read Me](README.md) +* [API](api.md) * Examples * [Basic (Rows)](examples/basic-rows.md) * [Basic (Columns)](examples/basic-columns.md) diff --git a/docs/api.md b/docs/api.md new file mode 100644 index 0000000..8cddf35 --- /dev/null +++ b/docs/api.md @@ -0,0 +1,40 @@ +# Gallery properties + +See the Typescript def file (index.d.ts) for more detailed information until I update this. + +Property | Type | Default | Description +:-----------------------|:--------------|:--------------|:-------------------------------- +photos | array | undefined | An array of Photos objects. See below. +columns | number or function | undefined | Optional. The number of columns in a column layout (direction=column). Will use Gallery's breakpoint choosing if undefined. +targetRowHeight | number or (containerWidth) => number | undefined | Optional. The algorithm will do its best to have rows close to this value. The smaller the number, the shorter the row, the more photos will be in a row. +limitNodeSearch | number or (containerWidth) => number | undefined | Optional. Ignored if `direction=column`. Limit how many neighboring nodes to search for when visiting a node to find the best node or photo to break on. The Gallery decides this for you by default, using an algorithm that determines the probably average photo per row by looking at `targetRowHeight` and `containerWidth` and then adding 8. If it isn't limited the gallery would take too long to calculate and it would be looking at nodes that it would not make sense to break on, making unnecessary calculations. For example if we are currently visiting photo #2 we do not need to check if photo #200 is a good place to break because it is likely we will never have that many photos in a row. The smaller the number, the faster your gallery will calculate. Images per row cannot exceed this amount, so its one way of limiting that, but then it will not be able to search ahead for better fits. Use `targetRowHeight` as a way of adjusting the amount of photos if you want more/less photos per row. If you find your graph is slow, you can make this number smaller. If you pass in a function you will receive the `containerWidth` as a parameter. If your `containerWidth` is small and you only want 1 or 2 photos per row, it makes sense to make this number smaller at these breakpoints to speed things up. It is recommended you use the default setting unless you understage its usage. +onClick | function | undefined | Optional. Do something when the user clicks a photo. Receives arguments event and an object containing the index, Photos obj originally sent and the next and previous photos in the gallery if they exist +margin | number | 2 | optional; number of margin pixels around each entire image +direction | string | 'row' | optional; `column` or `row` based layout +renderImage | function | default component | optional; use a different image component than the default provided to display your photo + +### Photos array item properties (passed into Gallery's photos property) + +Property | Type | Default | Description +:-----------------------|:--------------|:--------------|:-------------------------------- +src | string | undefined | the img src attribute value of the image +srcSet | array or string | undefined | optional; srcSet attribute of the image +sizes | array or string | undefined | optional; sizes attribute of the image +width | number | undefined | required; width of the gallery image (only used for calculating aspect ratio) +height | number | undefined | required; height of the gallery image (only used for calculating aspect ratio) +alt | string | undefined | optional; alt text of the gallery image +key | string | src | optional; key to be used on component + +### renderImage props + +renderImage will be called with an object containing these props: + +Property | Type | Value +:-----------------------|:--------------|:-------------- +margin | string | optional; margin prop optionally passed into Gallery by user +index | number | required; the index of the photo within the Gallery +photo | object | required; the individual object passed into Gallery's `photos` array prop, with all the same props except recalculated height and width +direction | string | optional; direction passed into Gallery +top | number | required if direction is 'column'; top position of this image, only passed if direction prop was 'column' +left | number | required if direction is 'column'; left position of this image, only passed if direction prop was 'column' +onClick | function | optional; the onClick function optionally passsed into Gallery by user diff --git a/examples/src/ExampleCustomComponentSelection.js b/examples/src/ExampleCustomComponentSelection.js index 2f386b5..266713a 100644 --- a/examples/src/ExampleCustomComponentSelection.js +++ b/examples/src/ExampleCustomComponentSelection.js @@ -1,6 +1,6 @@ import React from 'react'; import Gallery from 'react-photo-gallery'; -import SelectedImage from './SelectedImage'; +import renderSelectImage from './SelectedImage'; class ExampleCustomComponentSelection extends React.Component { constructor(props) { @@ -24,7 +24,7 @@ class ExampleCustomComponentSelection extends React.Component {

Using the ImageComponent prop

Pass in a custom image component to create any visual representation such as selection

- +
); } diff --git a/examples/src/ExampleDynamicColumns.js b/examples/src/ExampleDynamicColumns.js index ad43764..13f697e 100644 --- a/examples/src/ExampleDynamicColumns.js +++ b/examples/src/ExampleDynamicColumns.js @@ -9,11 +9,11 @@ function columns(containerWidth) { return columns; } -const ExampleDynamicColumns = ({photos, title, direction}) => { +const ExampleDynamicColumns = ({photos, title}) => { return (

{title}

- +
); } diff --git a/examples/src/SelectedImage.js b/examples/src/SelectedImage.js index 48d60df..1fdd0ab 100644 --- a/examples/src/SelectedImage.js +++ b/examples/src/SelectedImage.js @@ -15,7 +15,7 @@ const cont = { position: 'relative' } -const SelectedImage = ({ index, onClick, photo, margin, direction, top, left}) => { +const renderSelectImage = ({ index, onClick, photo, margin, direction, top, left}) => { //calculate x,y scale const sx = (100 - ((30 / photo.width) * 100)) / 100; const sy = (100 - ((30 / photo.height) * 100)) / 100; @@ -37,4 +37,4 @@ const SelectedImage = ({ index, onClick, photo, margin, direction, top, left}) = ) }; -export default SelectedImage; +export default renderSelectImage; diff --git a/examples/src/app.js b/examples/src/app.js index 51ba604..08ca628 100644 --- a/examples/src/app.js +++ b/examples/src/app.js @@ -20,10 +20,10 @@ class App extends React.Component { const urlParams = { api_key: '455b5e2fa6b951f9b9ab58a86d5e1f8a', - photoset_id: '72157689142425023', + photoset_id: '72157708141247864', user_id: '146659101@N08', format: 'json', - per_page: '40', + per_page: '120', extras: 'url_m,url_c,url_l,url_h,url_o', }; @@ -63,11 +63,11 @@ class App extends React.Component { const width = this.state.width; return (
- - - - - + + + + +
); diff --git a/index.d.ts b/index.d.ts index 4e785a2..b822120 100644 --- a/index.d.ts +++ b/index.d.ts @@ -34,7 +34,7 @@ export type PhotoProps = { key?: string } & CustomPhotoProps -export type ImageComponentClickHandler = ( +export type renderImageClickHandler = ( event: React.MouseEvent, photo: object & { index: number @@ -42,9 +42,9 @@ export type ImageComponentClickHandler = ( ) => void /** - * If you're passing a function component to ImageComponent you will receive back these props: + * If you're passing a function component to renderImage you will receive back these props: */ -export interface ImageComponentProps { +export interface RenderImageProps { /** * margin prop optionally passed into Gallery by user */ @@ -59,7 +59,7 @@ export interface ImageComponentProps { */ photo: PhotoProps - onClick: ImageComponentClickHandler | null + onClick: renderImageClickHandler | null direction: 'row' | 'column' top?: number left?: number @@ -78,10 +78,24 @@ export type PhotoClickHandler = ( export interface GalleryProps { photos: Array> /** - * number of photos per row or a function which receives the container width - * and should return the desired number of photos per row; defaults to Gallery's breakpoint choosing + * applies to column layouts only (direction=column) + * number of columns or a function which receives the container width + * and should return the desired number of columns; defaults to Gallery's breakpoint choosing */ columns?: number | ((containerWidth: number) => number) + /** + * applies to row layouts only (direction=row) + * the ideal height of each row or a function which receives the container width + * and should return the desired ideal height for each row; defaults to 300px + */ + targetRowHeight?: number | ((containerWidth: number) => number) + /** + * applies to row layouts only (direction=row) + * the maximum amount of neighboring nodes to measure per current node visiting + * don't change unless you understand the algorithm, see docs + * defaults to a couple breakpoints + */ + limitNodeSearch?: number | ((containerWidth: number) => number) /** * do something when the user clicks a photo; * receives arguments event and an object containing the index, @@ -98,7 +112,7 @@ export interface GalleryProps { */ direction?: string - ImageComponent?: React.ComponentType> + renderImage?: React.ComponentType> } export type GalleryI< diff --git a/package.json b/package.json index 36ab08a..656a487 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,12 @@ { "name": "react-photo-gallery", - "version": "6.3.2", + "version": "7.0.0", "description": "Responsive Justified React Image Gallery Component", "main": "dist/react-photo-gallery.umd.js", "module": "dist/react-photo-gallery.esm.js", "files": [ - "/dist", "index.d.ts" + "/dist", + "index.d.ts" ], "author": "Sandra Gonzales", "license": "MIT", @@ -28,9 +29,9 @@ "@babel/preset-env": "^7.0.0", "@babel/preset-react": "^7.0.0", "babel-eslint": "^9.0.0", - "babel-jest": "^23.6.0", + "babel-jest": "^24.7.1", "babel-loader": "^8.0.0", - "coveralls": "^3.0.0", + "coveralls": "^3.0.3", "cross-env": "^5.0.5", "enzyme": "^3.8.0", "enzyme-adapter-react-16": "^1.1.0", @@ -39,14 +40,14 @@ "eslint-config-prettier": "^2.3.0", "eslint-plugin-prettier": "^2.2.0", "eslint-plugin-react": "^7.3.0", - "jest": "24.0.0-alpha.9", - "jest-cli": "24.0.0-alpha.9", + "jest": "^24.7.1", + "jest-cli": "^24.7.1", "jsonp": "^0.2.1", "nps": "^5.7.1", "nps-utils": "^1.4.0", "prettier": "^1.6.1", - "react": "16.8.3", - "react-dom": "16.8.3", + "react": "^16.8.6", + "react-dom": "^16.8.6", "react-images": "^0.5.18", "react-test-renderer": "^16.1.1", "rollup": "^1.0.0", @@ -57,8 +58,8 @@ "webpack-dev-server": "^3.1.14" }, "peerDependencies": { - "react": "^16.0.0", - "react-dom": "^16.0.0" + "react": "^16.8.0", + "react-dom": "^16.8.0" }, "scripts": { "build": "nps build", diff --git a/src/Gallery.js b/src/Gallery.js index 89d3c36..890399b 100644 --- a/src/Gallery.js +++ b/src/Gallery.js @@ -2,7 +2,9 @@ import React from 'react'; import PropTypes from 'prop-types'; import ResizeObserver from 'resize-observer-polyfill'; import Photo, { photoPropType } from './Photo'; -import { computeSizes, computeSizesColumns } from './utils'; +import { computeColumnLayout } from './layouts/columns'; +import { computeRowLayout } from './layouts/justified'; +import { findIdealNodeSearch } from './utils/findIdealNodeSearch'; class Gallery extends React.Component { state = { @@ -38,55 +40,62 @@ class Gallery extends React.Component { }; render() { - const containerWidth = this.state.containerWidth; + const { containerWidth } = this.state; // no containerWidth until after first render with refs, skip calculations and render nothing if (!containerWidth) return
(this._gallery = c)}> 
; - const { ImageComponent = Photo } = this.props; // subtract 1 pixel because the browser may round up a pixel - const { margin, onClick, direction } = this.props; - let { columns } = this.props; - - // allow parent to calculate columns from containerWidth - if (typeof columns === 'function') { - columns = columns(containerWidth); - } - - // set default breakpoints if user doesn't specify columns prop - if (columns === undefined) { - columns = 1; - if (containerWidth >= 500) columns = 2; - if (containerWidth >= 900) columns = 3; - if (containerWidth >= 1500) columns = 4; - } - const photos = this.props.photos; + const { margin, onClick, direction, photos } = this.props; const width = containerWidth - 1; let galleryStyle, thumbs; if (direction === 'row') { + let { limitNodeSearch, targetRowHeight } = this.props; + // allow user to calculate limitNodeSearch from containerWidth + if (typeof limitNodeSearch === 'function') { + limitNodeSearch = limitNodeSearch(containerWidth); + } + if (typeof targetRowHeight === 'function') { + targetRowHeight = targetRowHeight(containerWidth); + } + // set how many neighboring nodes the graph will visit + if (limitNodeSearch === undefined) { + limitNodeSearch = 1; + if (containerWidth >= 450) { + limitNodeSearch = findIdealNodeSearch({ containerWidth, targetRowHeight }); + } + } + galleryStyle = { display: 'flex', flexWrap: 'wrap', flexDirection: 'row' }; - thumbs = computeSizes({ width, columns, margin, photos }); + thumbs = computeRowLayout({ containerWidth: width, limitNodeSearch, targetRowHeight, margin, photos }); } if (direction === 'column') { + let { columns } = this.props; + // allow user to calculate columns from containerWidth + if (typeof columns === 'function') { + columns = columns(containerWidth); + } + // set default breakpoints if user doesn't specify columns prop + if (columns === undefined) { + columns = 1; + if (containerWidth >= 500) columns = 2; + if (containerWidth >= 900) columns = 3; + if (containerWidth >= 1500) columns = 4; + } galleryStyle = { position: 'relative' }; - thumbs = computeSizesColumns({ width, columns, margin, photos }); + thumbs = computeColumnLayout({ containerWidth: width, columns, margin, photos }); galleryStyle.height = thumbs[thumbs.length - 1].containerHeight; } + + const { renderImage = Photo } = this.props; return (
(this._gallery = c)} style={galleryStyle}> {thumbs.map((photo, index) => { - const { left, top, containerHeight, ...rest } = photo; + const { left, top, key, containerHeight, ...rest } = photo; return ( - +
+ {renderImage({ index, onClick, photo: rest, margin, direction, top, left })} +
); })}
@@ -100,13 +109,16 @@ Gallery.propTypes = { direction: PropTypes.string, onClick: PropTypes.func, columns: PropTypes.oneOfType([PropTypes.func, PropTypes.number]), + targetRowHeight: PropTypes.oneOfType([PropTypes.func, PropTypes.number]), + limitNodeSearch: PropTypes.oneOfType([PropTypes.func, PropTypes.number]), margin: PropTypes.number, - ImageComponent: PropTypes.func, + renderImage: PropTypes.func, }; Gallery.defaultProps = { margin: 2, direction: 'row', + targetRowHeight: 300, }; - +export { Photo }; export default Gallery; diff --git a/src/Photo.js b/src/Photo.js index 4da57f1..d5d3539 100644 --- a/src/Photo.js +++ b/src/Photo.js @@ -4,7 +4,7 @@ import PropTypes from 'prop-types'; const imgWithClick = { cursor: 'pointer' }; const Photo = ({ index, onClick, photo, margin, direction, top, left }) => { - const imgStyle = { margin: margin }; + const imgStyle = { margin: margin, display: 'block' }; if (direction === 'column') { imgStyle.position = 'absolute'; imgStyle.left = left; @@ -25,6 +25,7 @@ const Photo = ({ index, onClick, photo, margin, direction, top, left }) => { }; export const photoPropType = PropTypes.shape({ + key: PropTypes.string, src: PropTypes.string.isRequired, width: PropTypes.number.isRequired, height: PropTypes.number.isRequired, diff --git a/src/layouts/columns.js b/src/layouts/columns.js new file mode 100644 index 0000000..dc81380 --- /dev/null +++ b/src/layouts/columns.js @@ -0,0 +1,49 @@ +import { round } from '../utils/round'; + +// compute sizes for column directed layouts +export const computeColumnLayout = ({ photos, columns, containerWidth, margin }) => { + // calculate each colWidth based on total width and column amount + let colWidth = (containerWidth - margin * 2 * columns) / columns; + + // map through each photo to assign adjusted height and width based on colWidth + const photosWithSizes = photos.map(photo => { + const newHeight = photo.height / photo.width * colWidth; + return { + ...photo, + width: round(colWidth, 1), + height: round(newHeight, 1), + }; + }); + + // store all possible left positions + // and current top positions for each column + const colLeftPositions = []; + const colCurrTopPositions = []; + for (var i = 0; i < columns; i++) { + colLeftPositions[i] = round(i * (colWidth + margin * 2), 1); + colCurrTopPositions[i] = 0; + } + + // map through each photo, then reduce thru each "column" + // find column with the smallest height and assign to photo's 'top' + // update that column's height with this photo's height + const photosPositioned = photosWithSizes.map(photo => { + const smallestCol = colCurrTopPositions.reduce((acc, item, i) => { + acc = item < colCurrTopPositions[acc] ? i : acc; + return acc; + }, 0); + + photo.top = colCurrTopPositions[smallestCol]; + photo.left = colLeftPositions[smallestCol]; + colCurrTopPositions[smallestCol] = colCurrTopPositions[smallestCol] + photo.height + margin * 2; + + // store the tallest col to use for gallery height because of abs positioned elements + const tallestCol = colCurrTopPositions.reduce((acc, item, i) => { + acc = item > colCurrTopPositions[acc] ? i : acc; + return acc; + }, 0); + photo.containerHeight = colCurrTopPositions[tallestCol]; + return photo; + }); + return photosPositioned; +}; diff --git a/src/layouts/justified.js b/src/layouts/justified.js new file mode 100644 index 0000000..e6615c4 --- /dev/null +++ b/src/layouts/justified.js @@ -0,0 +1,49 @@ +import { ratio } from '../utils/ratio'; +import { round } from '../utils/round'; +import { findShortestPath } from '../utils/dijkstra'; + +// compute sizes by creating a graph with rows as edges and photo to break on as nodes +// to calculate the single best layout using Dijkstra's findShortestPat + +// get the height for a set of photos in a potential row +const getCommonHeight = (row, containerWidth, margin) => { + const rowWidth = containerWidth - row.length * (margin * 2); + const totalAspectRatio = row.reduce((acc, photo) => acc + ratio(photo), 0); + return rowWidth / totalAspectRatio; +}; + +// calculate the cost of breaking at this node (edge weight) +const cost = (photos, i, j, width, targetHeight, margin) => { + const row = photos.slice(i, j); + const commonHeight = getCommonHeight(row, width, margin); + return Math.pow(Math.abs(commonHeight - targetHeight), 2); +}; + +// return function that gets the neighboring nodes of node and returns costs +const makeGetNeighbors = (targetHeight, containerWidth, photos, limitNodeSearch, margin) => start => { + const results = {}; + start = +start; + results[+start] = 0; + for (let i = start + 1; i < photos.length + 1; ++i) { + if (i - start > limitNodeSearch) break; + results[i.toString()] = cost(photos, start, i, containerWidth, targetHeight, margin); + } + return results; +}; + +export const computeRowLayout = ({ containerWidth, limitNodeSearch, targetRowHeight, margin, photos }) => { + // const t = +new Date(); + const getNeighbors = makeGetNeighbors(targetRowHeight, containerWidth, photos, limitNodeSearch, margin); + let path = findShortestPath(getNeighbors, '0', photos.length); + path = path.map(node => +node); + // console.log(`time to find the shortest path: ${(+new Date() - t)} ms`); + for (let i = 1; i < path.length; ++i) { + const row = photos.slice(path[i - 1], path[i]); + const height = getCommonHeight(row, containerWidth, margin); + for (let j = path[i - 1]; j < path[i]; ++j) { + photos[j].width = round(height * ratio(photos[j]), 1); + photos[j].height = height; + } + } + return photos; +}; diff --git a/src/utils.js b/src/utils.js deleted file mode 100644 index d03e92b..0000000 --- a/src/utils.js +++ /dev/null @@ -1,105 +0,0 @@ -export function round(value, decimals) { - if (!decimals) decimals = 0; - return Number(Math.round(value + 'e' + decimals) + 'e-' + decimals); -} - -// return two decimal places rounded number -export function ratio({ width, height }) { - return round(width / height, 2); -} - -// takes the Gallery's photos array, width of the container, -// margin between photos Gallery prop, and columns Gallery prop. -// calculates, sizes based on columns and returns the photos array -// with new height/width props in each object -export function computeSizes({ photos, columns, width, margin }) { - if (!width) { - return []; - } - // divide photos over rows, max cells based on `columns` - // effectively resulting in [[0, 1, 2], [3, 4, 5], [6, 7]] - const rows = photos.reduce((acc, cell, idx) => { - const row = Math.floor(idx / columns); - acc[row] = acc[row] ? [...acc[row], cell] : [cell]; // eslint-disable-line no-param-reassign - return acc; - }, []); - // calculate total ratio of each row, and adjust each cell height and width - // accordingly. - let ratios = []; - const rowsWithSizes = rows.map((row, rowIndex) => { - const totalRatio = row.reduce((result, photo) => result + ratio(photo), 0); - const rowWidth = width - row.length * (margin * 2); - - // save total ratio of each row - if (rowIndex !== rows.length - 1) ratios.push(totalRatio); - - // assign height - // 3 scenarios... - // if its a regular row where row.length === columns - // rowWidth / totalRatio - // if columns > row.length - // if !lastRow - // use the average aspect ratio of previous rows - // else (all photos are on a single row) - // ... - const height = - row.length === columns - ? rowWidth / totalRatio - : photos.length < columns - ? rowWidth / totalRatio * (row.length / columns) - : rowWidth / (ratios.reduce((acc, item) => acc + item, 0) / (rows.length - 1)); - - return row.map(photo => ({ - ...photo, - height: round(height, 1), - width: round(height * ratio(photo), 1), - })); - }); - return rowsWithSizes.reduce((acc, row) => [...acc, ...row], []); -} -export function computeSizesColumns({ photos, columns, width, margin }) { - // calculate each colWidth based on total width and column amount - let colWidth = (width - margin * 2 * columns) / columns; - - // map through each photo to assign adjusted height and width based on colWidth - const photosWithSizes = photos.map(photo => { - const newHeight = photo.height / photo.width * colWidth; - return { - ...photo, - width: round(colWidth, 1), - height: round(newHeight, 1), - }; - }); - - // store all possible left positions - // and current top positions for each column - const colLeftPositions = []; - const colCurrTopPositions = []; - for (var i = 0; i < columns; i++) { - colLeftPositions[i] = round(i * (colWidth + margin * 2), 1); - colCurrTopPositions[i] = 0; - } - - // map through each photo, then reduce thru each "column" - // find column with the smallest height and assign to photo's 'top' - // update that column's height with this photo's height - const photosPositioned = photosWithSizes.map(photo => { - const smallestCol = colCurrTopPositions.reduce((acc, item, i) => { - acc = item < colCurrTopPositions[acc] ? i : acc; - return acc; - }, 0); - - photo.top = colCurrTopPositions[smallestCol]; - photo.left = colLeftPositions[smallestCol]; - colCurrTopPositions[smallestCol] = colCurrTopPositions[smallestCol] + photo.height + margin * 2; - - // store the tallest col to use for gallery height because of abs positioned elements - const tallestCol = colCurrTopPositions.reduce((acc, item, i) => { - acc = item > colCurrTopPositions[acc] ? i : acc; - return acc; - }, 0); - photo.containerHeight = colCurrTopPositions[tallestCol]; - return photo; - }); - return photosPositioned; -} diff --git a/src/utils/binary-heap.js b/src/utils/binary-heap.js new file mode 100644 index 0000000..0ca5f6c --- /dev/null +++ b/src/utils/binary-heap.js @@ -0,0 +1,123 @@ +/* +Copyright 2007-2013 Marijn Haverbeke frin "Eloquent Javascript, 1st Edition" + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +export function BinaryHeap(scoreFunction) { + this.content = []; + this.scoreFunction = scoreFunction; +} + +BinaryHeap.prototype = { + push: function(element) { + // Add the new element to the end of the array. + this.content.push(element); + // Allow it to bubble up. + this.bubbleUp(this.content.length - 1); + }, + + pop: function() { + // Store the first element so we can return it later. + var result = this.content[0]; + // Get the element at the end of the array. + var end = this.content.pop(); + // If there are any elements left, put the end element at the + // start, and let it sink down. + if (this.content.length > 0) { + this.content[0] = end; + this.sinkDown(0); + } + return result; + }, + + remove: function(node) { + var length = this.content.length; + // To remove a value, we must search through the array to find + // it. + for (var i = 0; i < length; i++) { + if (this.content[i] != node) continue; + // When it is found, the process seen in 'pop' is repeated + // to fill up the hole. + var end = this.content.pop(); + // If the element we popped was the one we needed to remove, + // we're done. + if (i == length - 1) break; + // Otherwise, we replace the removed element with the popped + // one, and allow it to float up or sink down as appropriate. + this.content[i] = end; + this.bubbleUp(i); + this.sinkDown(i); + break; + } + }, + + size: function() { + return this.content.length; + }, + + bubbleUp: function(n) { + // Fetch the element that has to be moved. + var element = this.content[n], + score = this.scoreFunction(element); + // When at 0, an element can not go up any further. + while (n > 0) { + // Compute the parent element's index, and fetch it. + var parentN = Math.floor((n + 1) / 2) - 1, + parent = this.content[parentN]; + // If the parent has a lesser score, things are in order and we + // are done. + if (score >= this.scoreFunction(parent)) break; + + // Otherwise, swap the parent with the current element and + // continue. + this.content[parentN] = element; + this.content[n] = parent; + n = parentN; + } + }, + + sinkDown: function(n) { + // Look up the target element and its score. + var length = this.content.length, + element = this.content[n], + elemScore = this.scoreFunction(element); + + while (true) { + // Compute the indices of the child elements. + var child2N = (n + 1) * 2, + child1N = child2N - 1; + // This is used to store the new position of the element, + // if any. + var swap = null; + // If the first child exists (is inside the array)... + if (child1N < length) { + // Look it up and compute its score. + var child1 = this.content[child1N], + child1Score = this.scoreFunction(child1); + // If the score is less than our element's, we need to swap. + if (child1Score < elemScore) swap = child1N; + } + // Do the same checks for the other child. + if (child2N < length) { + var child2 = this.content[child2N], + child2Score = this.scoreFunction(child2); + if (child2Score < (swap == null ? elemScore : child1Score)) swap = child2N; + } + + // No need to swap further, we are done. + if (swap == null) break; + + // Otherwise, swap and continue. + this.content[n] = this.content[swap]; + this.content[swap] = element; + n = swap; + } + }, +}; + +export default BinaryHeap; diff --git a/src/utils/dijkstra.js b/src/utils/dijkstra.js new file mode 100644 index 0000000..ec7030b --- /dev/null +++ b/src/utils/dijkstra.js @@ -0,0 +1,74 @@ +import { BinaryHeap } from './binary-heap'; + +const buildPrecedentsMap = (graph, startNode, endNode) => { + // store the previous vertex of the shortest path of arrival + const precedentsMap = {}; + + // store nodes already visited + const visited = {}; + + // store/update only the shortest edge weights measured + // the purpose of this is object is constant time lookup vs. binary heap lookup O(n) + const storedShortestPaths = {}; + storedShortestPaths[startNode] = 0; + + // priority queue of ALL nodes and storedShortestPaths + // don't bother to delete them because it's faster to look at visited? + const pQueue = new BinaryHeap(function(n) { + return n.weight; + }); + pQueue.push({ id: startNode, weight: 0 }); + + while (pQueue.size()) { + // pop node with shortest total weight from start node + const shortestNode = pQueue.pop(); + const shortestNodeId = shortestNode.id; + + // if already visited, continue + if (visited[shortestNodeId]) continue; + + // visit neighboring nodes + const neighboringNodes = graph(shortestNodeId) || {}; + visited[shortestNodeId] = 1; + + // meet the neighbors, looking for shorter paths + for (let neighbor in neighboringNodes) { + // weight of path from startNode to this neighbor + const newTotalWeight = shortestNode.weight + neighboringNodes[neighbor]; + + // if this is the first time meeting the neighbor OR if the new total weight from + // start node to this neighbor node is greater than the old weight path, update it, + // and update precedent node + if (typeof storedShortestPaths[neighbor] === 'undefined' || storedShortestPaths[neighbor] > newTotalWeight) { + storedShortestPaths[neighbor] = newTotalWeight; + pQueue.push({ id: neighbor, weight: newTotalWeight }); + precedentsMap[neighbor] = shortestNodeId; + } + } + } + + if (typeof storedShortestPaths[endNode] === 'undefined') { + throw new Error(`There is no path from ${startNode} to ${endNode}`); + } + + return precedentsMap; +}; + +// build the route from precedent node vertices +const getPathFromPrecedentsMap = (precedentsMap, endNode) => { + const nodes = []; + let n = endNode; + let precedent; + while (n) { + nodes.push(n); + precedent = precedentsMap[n]; + n = precedentsMap[n]; + } + return nodes.reverse(); +}; + +// build the precedentsMap and find the shortest path from it +export const findShortestPath = (graph, startNode, endNode) => { + const precedentsMap = buildPrecedentsMap(graph, startNode, endNode); + return getPathFromPrecedentsMap(precedentsMap, endNode); +}; diff --git a/src/utils/findIdealNodeSearch.js b/src/utils/findIdealNodeSearch.js new file mode 100644 index 0000000..430d4c9 --- /dev/null +++ b/src/utils/findIdealNodeSearch.js @@ -0,0 +1,9 @@ +import { round } from './round'; + +// guesstimate how many neighboring nodes should be searched based on +// the aspect ratio of the container with images having an avg AR of 1.5 +// as the minimum amount of photos per row, plus some nodes +export const findIdealNodeSearch = ({ targetRowHeight, containerWidth }) => { + const rowAR = containerWidth / targetRowHeight; + return round(rowAR / 1.5) + 8; +}; diff --git a/src/utils/ratio.js b/src/utils/ratio.js new file mode 100644 index 0000000..64e6545 --- /dev/null +++ b/src/utils/ratio.js @@ -0,0 +1,4 @@ +import { round } from './round'; + +// return two decimal places rounded number +export const ratio = ({ width, height }) => round(width / height, 2); diff --git a/src/utils/round.js b/src/utils/round.js new file mode 100644 index 0000000..ab649cc --- /dev/null +++ b/src/utils/round.js @@ -0,0 +1,4 @@ +export const round = (value, decimals) => { + if (!decimals) decimals = 0; + return Number(Math.round(value + 'e' + decimals) + 'e-' + decimals); +}; diff --git a/yarn.lock b/yarn.lock index 6b5d2b0..639f503 100644 --- a/yarn.lock +++ b/yarn.lock @@ -254,6 +254,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.2.3.tgz#32f5df65744b70888d17872ec106b02434ba1489" integrity sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA== +"@babel/parser@^7.1.0": + version "7.4.3" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.4.3.tgz#eb3ac80f64aa101c907d4ce5406360fe75b7895b" + integrity sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ== + "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" @@ -677,16 +682,225 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" +"@babel/types@^7.3.0": + version "7.4.0" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz#670724f77d24cce6cc7d8cf64599d511d164894c" + integrity sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA== + dependencies: + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" + +"@cnakazawa/watch@^1.0.3": + version "1.0.3" + resolved "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" + integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@jest/console@^24.7.1": + version "24.7.1" + resolved "https://registry.npmjs.org/@jest/console/-/console-24.7.1.tgz#32a9e42535a97aedfe037e725bd67e954b459545" + integrity sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg== + dependencies: + "@jest/source-map" "^24.3.0" + chalk "^2.0.1" + slash "^2.0.0" + +"@jest/core@^24.7.1": + version "24.7.1" + resolved "https://registry.npmjs.org/@jest/core/-/core-24.7.1.tgz#6707f50db238d0c5988860680e2e414df0032024" + integrity sha512-ivlZ8HX/FOASfHcb5DJpSPFps8ydfUYzLZfgFFqjkLijYysnIEOieg72YRhO4ZUB32xu40hsSMmaw+IGYeKONA== + dependencies: + "@jest/console" "^24.7.1" + "@jest/reporters" "^24.7.1" + "@jest/test-result" "^24.7.1" + "@jest/transform" "^24.7.1" + "@jest/types" "^24.7.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-changed-files "^24.7.0" + jest-config "^24.7.1" + jest-haste-map "^24.7.1" + jest-message-util "^24.7.1" + jest-regex-util "^24.3.0" + jest-resolve-dependencies "^24.7.1" + jest-runner "^24.7.1" + jest-runtime "^24.7.1" + jest-snapshot "^24.7.1" + jest-util "^24.7.1" + jest-validate "^24.7.0" + jest-watcher "^24.7.1" + micromatch "^3.1.10" + p-each-series "^1.0.0" + pirates "^4.0.1" + realpath-native "^1.1.0" + rimraf "^2.5.4" + strip-ansi "^5.0.0" + +"@jest/environment@^24.7.1": + version "24.7.1" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-24.7.1.tgz#9b9196bc737561f67ac07817d4c5ece772e33135" + integrity sha512-wmcTTYc4/KqA+U5h1zQd5FXXynfa7VGP2NfF+c6QeGJ7c+2nStgh65RQWNX62SC716dTtqheTRrZl0j+54oGHw== + dependencies: + "@jest/fake-timers" "^24.7.1" + "@jest/transform" "^24.7.1" + "@jest/types" "^24.7.0" + jest-mock "^24.7.0" + +"@jest/fake-timers@^24.7.1": + version "24.7.1" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.7.1.tgz#56e5d09bdec09ee81050eaff2794b26c71d19db2" + integrity sha512-4vSQJDKfR2jScOe12L9282uiwuwQv9Lk7mgrCSZHA9evB9efB/qx8i0KJxsAKtp8fgJYBJdYY7ZU6u3F4/pyjA== + dependencies: + "@jest/types" "^24.7.0" + jest-message-util "^24.7.1" + jest-mock "^24.7.0" + +"@jest/reporters@^24.7.1": + version "24.7.1" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-24.7.1.tgz#38ac0b096cd691bbbe3051ddc25988d42e37773a" + integrity sha512-bO+WYNwHLNhrjB9EbPL4kX/mCCG4ZhhfWmO3m4FSpbgr7N83MFejayz30kKjgqr7smLyeaRFCBQMbXpUgnhAJw== + dependencies: + "@jest/environment" "^24.7.1" + "@jest/test-result" "^24.7.1" + "@jest/transform" "^24.7.1" + "@jest/types" "^24.7.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + istanbul-api "^2.1.1" + istanbul-lib-coverage "^2.0.2" + istanbul-lib-instrument "^3.0.1" + istanbul-lib-source-maps "^3.0.1" + jest-haste-map "^24.7.1" + jest-resolve "^24.7.1" + jest-runtime "^24.7.1" + jest-util "^24.7.1" + jest-worker "^24.6.0" + node-notifier "^5.2.1" + slash "^2.0.0" + source-map "^0.6.0" + string-length "^2.0.0" + +"@jest/source-map@^24.3.0": + version "24.3.0" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-24.3.0.tgz#563be3aa4d224caf65ff77edc95cd1ca4da67f28" + integrity sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + +"@jest/test-result@^24.7.1": + version "24.7.1" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-24.7.1.tgz#19eacdb29a114300aed24db651e5d975f08b6bbe" + integrity sha512-3U7wITxstdEc2HMfBX7Yx3JZgiNBubwDqQMh+BXmZXHa3G13YWF3p6cK+5g0hGkN3iufg/vGPl3hLxQXD74Npg== + dependencies: + "@jest/console" "^24.7.1" + "@jest/types" "^24.7.0" + "@types/istanbul-lib-coverage" "^2.0.0" + +"@jest/test-sequencer@^24.7.1": + version "24.7.1" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.7.1.tgz#9c18e428e1ad945fa74f6233a9d35745ca0e63e0" + integrity sha512-84HQkCpVZI/G1zq53gHJvSmhUer4aMYp9tTaffW28Ih5OxfCg8hGr3nTSbL1OhVDRrFZwvF+/R9gY6JRkDUpUA== + dependencies: + "@jest/test-result" "^24.7.1" + jest-haste-map "^24.7.1" + jest-runner "^24.7.1" + jest-runtime "^24.7.1" + +"@jest/transform@^24.7.1": + version "24.7.1" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-24.7.1.tgz#872318f125bcfab2de11f53b465ab1aa780789c2" + integrity sha512-EsOUqP9ULuJ66IkZQhI5LufCHlTbi7hrcllRMUEV/tOgqBVQi93+9qEvkX0n8mYpVXQ8VjwmICeRgg58mrtIEw== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.7.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.15" + jest-haste-map "^24.7.1" + jest-regex-util "^24.3.0" + jest-util "^24.7.1" + micromatch "^3.1.10" + realpath-native "^1.1.0" + slash "^2.0.0" + source-map "^0.6.1" + write-file-atomic "2.4.1" + +"@jest/types@^24.7.0": + version "24.7.0" + resolved "https://registry.npmjs.org/@jest/types/-/types-24.7.0.tgz#c4ec8d1828cdf23234d9b4ee31f5482a3f04f48b" + integrity sha512-ipJUa2rFWiKoBqMKP63Myb6h9+iT3FHRTF2M8OR6irxWzItisa8i4dcSg14IbvmXUnBlHBlUQPYUHWyX3UPpYA== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/yargs" "^12.0.9" + +"@types/babel__core@^7.1.0": + version "7.1.1" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.1.tgz#ce9a9e5d92b7031421e1d0d74ae59f572ba48be6" + integrity sha512-+hjBtgcFPYyCTo0A15+nxrCVJL7aC6Acg87TXd5OW3QhHswdrOLoles+ldL2Uk8q++7yIfl4tURtztccdeeyOw== + 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.0.2" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.0.2.tgz#d2112a6b21fad600d7674274293c85dce0cb47fc" + integrity sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.0.2" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" + integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.0.6" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.6.tgz#328dd1a8fc4cfe3c8458be9477b219ea158fd7b2" + integrity sha512-XYVgHF2sQ0YblLRMLNPB3CkFMewzFmlDsH/TneZFHUXDlABQgh88uOxuez7ZcXxayLFrqLwtDH1t+FmlFwNZxw== + dependencies: + "@babel/types" "^7.3.0" + "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== +"@types/istanbul-lib-coverage@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.0.tgz#1eb8c033e98cf4e1a4cedcaf8bcafe8cb7591e85" + integrity sha512-eAtOAFZefEnfJiRFQBGw1eYqa5GTLCZ1y86N0XSI/D6EB+E8z6VPV/UL7Gi5UEclFqoQk+6NRqEDsfmDLXn8sg== + "@types/node@*": version "10.12.10" resolved "https://registry.npmjs.org/@types/node/-/node-10.12.10.tgz#4fa76e6598b7de3f0cb6ec3abacc4f59e5b3a2ce" integrity sha512-8xZEYckCbUVgK8Eg7lf5Iy4COKJ5uXlnIOnePN0WUwSQggy9tolM+tDJf7wMOnT/JT/W9xDYIaYggt3mRV2O5w== +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + +"@types/yargs@^12.0.2", "@types/yargs@^12.0.9": + version "12.0.12" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz#45dd1d0638e8c8f153e87d296907659296873916" + integrity sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw== + "@webassemblyjs/ast@1.7.11": version "1.7.11" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" @@ -941,16 +1155,6 @@ ajv@^4.7.0: co "^4.6.0" json-stable-stringify "^1.0.1" -ajv@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.3.0.tgz#4414ff74a50879c208ee5fdc826e32c303549eda" - integrity sha1-RBT/dKUIecII7l/cgm4ywwNUnto= - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - ajv@^5.2.0: version "5.2.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.2.2.tgz#47c68d69e86f5d953103b0074a9430dc63da5e39" @@ -1230,7 +1434,7 @@ async@^1.5.2: resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= -async@^2.5.0, async@^2.6.1: +async@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== @@ -1252,17 +1456,12 @@ aws-sign2@~0.7.0: resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= -aws4@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" - integrity sha1-g+9cqGCysy5KDe7e6MdxudtXRx4= - aws4@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== -babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: +babel-code-frame@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= @@ -1283,35 +1482,18 @@ babel-eslint@^9.0.0: eslint-scope "3.7.1" eslint-visitor-keys "^1.0.0" -babel-generator@^6.18.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-jest@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.6.0.tgz#a644232366557a2240a0c083da6b25786185a2f1" - integrity sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew== - dependencies: - babel-plugin-istanbul "^4.1.6" - babel-preset-jest "^23.2.0" - -babel-jest@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.0.0-alpha.9.tgz#6d762595205cd2797ebe23ddcbb4d9e4f1d39c3d" - integrity sha512-2moHmRsL6z/GqsqlymntF9NiZAglJF+C0dbTwGl9U4OsOyr56lNvGZOO2v3EzD0KKRAJJkPgxjwlDXm/AkBFQQ== +babel-jest@^24.7.1: + version "24.7.1" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-24.7.1.tgz#73902c9ff15a7dfbdc9994b0b17fcefd96042178" + integrity sha512-GPnLqfk8Mtt0i4OemjWkChi73A3ALs4w2/QbG64uAj8b5mmwzxc7jbJVRZt8NJkxi6FopVHog9S3xX6UJKb2qg== dependencies: + "@jest/transform" "^24.7.1" + "@jest/types" "^24.7.0" + "@types/babel__core" "^7.1.0" babel-plugin-istanbul "^5.1.0" - babel-preset-jest "^24.0.0-alpha.9" + babel-preset-jest "^24.6.0" + chalk "^2.4.2" + slash "^2.0.0" babel-loader@^8.0.0: version "8.0.4" @@ -1323,23 +1505,6 @@ babel-loader@^8.0.0: mkdirp "^0.5.1" util.promisify "^1.0.0" -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-istanbul@^4.1.6: - version "4.1.6" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" - integrity sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ== - dependencies: - babel-plugin-syntax-object-rest-spread "^6.13.0" - find-up "^2.1.0" - istanbul-lib-instrument "^1.10.1" - test-exclude "^4.2.1" - babel-plugin-istanbul@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.0.tgz#6892f529eff65a3e2d33d87dc5888ffa2ecd4a30" @@ -1349,38 +1514,22 @@ babel-plugin-istanbul@^5.1.0: istanbul-lib-instrument "^3.0.0" test-exclude "^5.0.0" -babel-plugin-jest-hoist@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167" - integrity sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc= - -babel-plugin-jest-hoist@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.0.0-alpha.9.tgz#6946864ebfbacf173fc3e5471cd2179613862f64" - integrity sha512-cI94H2VKm9cg6kr8cvk3XWyvUMAT7oaLh9DIUl0ydQvGZ54epAIvTT0spALI1JqNsaWynLO0ReidniqEnaFFwg== - -babel-plugin-syntax-object-rest-spread@^6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= - -babel-preset-jest@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46" - integrity sha1-jsegOhOPABoaj7HoETZSvxpV2kY= +babel-plugin-jest-hoist@^24.6.0: + version "24.6.0" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz#f7f7f7ad150ee96d7a5e8e2c5da8319579e78019" + integrity sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w== dependencies: - babel-plugin-jest-hoist "^23.2.0" - babel-plugin-syntax-object-rest-spread "^6.13.0" + "@types/babel__traverse" "^7.0.6" -babel-preset-jest@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.0.0-alpha.9.tgz#65b72edebadb92878c84849c8bfdad3ffa5235a0" - integrity sha512-/klyveUbCSOAnwYtflB45vJM4EpeDMLpgUAo3SS/GO9Jq2D04/0esO+Qtkef4sLn79u8qi6Gao4lZXZ4vB5FyQ== +babel-preset-jest@^24.6.0: + version "24.6.0" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz#66f06136eefce87797539c0d63f1769cc3915984" + integrity sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw== dependencies: "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - babel-plugin-jest-hoist "^24.0.0-alpha.9" + babel-plugin-jest-hoist "^24.6.0" -babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: +babel-runtime@^6.18.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= @@ -1388,47 +1537,6 @@ babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: core-js "^2.4.0" regenerator-runtime "^0.11.0" -babel-template@^6.16.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.18.0, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.18.0, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== - balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -1517,20 +1625,6 @@ boolbase@~1.0.0: resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= -boom@4.x.x: - version "4.3.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" - integrity sha1-T4owBctKfjiJ90kDD9JbluAdLjE= - dependencies: - hoek "4.x.x" - -boom@5.x.x: - version "5.2.0" - resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" - integrity sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw== - dependencies: - hoek "4.x.x" - bowser@^1.0.0: version "1.8.1" resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.8.1.tgz#49785777e7302febadb1a5b71d9a646520ed310d" @@ -1752,10 +1846,10 @@ callsites@^0.2.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase-keys@^2.0.0: version "2.1.0" @@ -1785,12 +1879,12 @@ caniuse-lite@^1.0.30000921: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000925.tgz#f1a3b9aae2a83071b1eccfa39959d72440409b08" integrity sha512-zcYupoUxtW46rOikuDF7vfL9N1Qe9ZuUBTz3n3q8fFsoJIs/h9UN6Vg/0QpjsmvImXw9mVc3g+ZBfqvUz/iALA== -capture-exit@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" - integrity sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28= +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== dependencies: - rsvp "^3.3.3" + rsvp "^4.8.4" caseless@~0.12.0: version "0.12.0" @@ -1837,6 +1931,15 @@ chalk@^2.1.0: escape-string-regexp "^1.0.5" supports-color "^4.0.0" +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + cheerio@^1.0.0-rc.2: version "1.0.0-rc.2" resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" @@ -1905,10 +2008,10 @@ chrome-trace-event@^1.0.0: dependencies: tslib "^1.9.0" -ci-info@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -1998,7 +2101,7 @@ colors@0.5.x: resolved "http://registry.npmjs.org/colors/-/colors-0.5.1.tgz#7d0023eaeb154e8ee9fce75dcb923d0ed1667774" integrity sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q= -combined-stream@^1.0.5, combined-stream@^1.0.6, combined-stream@~1.0.5, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== @@ -2166,16 +2269,17 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -coveralls@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.0.tgz#22ef730330538080d29b8c151dc9146afde88a99" - integrity sha512-ZppXR9y5PraUOrf/DzHJY6gzNUhXYE3b9D43xEXs4QYZ7/Oe0Gy0CS+IPKWFfvQFXB3RG9QduaQUFehzSpGAFw== +coveralls@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/coveralls/-/coveralls-3.0.3.tgz#83b1c64aea1c6afa69beaf50b55ac1bc4d13e2b8" + integrity sha512-viNfeGlda2zJr8Gj1zqXpDMRjw9uM54p7wzZdvLRyOgnAfCe974Dq4veZkjJdxQXbmdppu6flEajFYseHYaUhg== dependencies: - js-yaml "^3.6.1" + growl "~> 1.10.0" + js-yaml "^3.11.0" lcov-parse "^0.0.10" - log-driver "^1.2.5" + log-driver "^1.2.7" minimist "^1.2.0" - request "^2.79.0" + request "^2.86.0" cp-file@^3.1.0: version "3.2.0" @@ -2276,13 +2380,6 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cryptiles@3.x.x: - version "3.1.2" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" - integrity sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4= - dependencies: - boom "5.x.x" - crypto-browserify@^3.11.0: version "3.11.1" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.1.tgz#948945efc6757a400d6e5e5af47194d10064279f" @@ -2385,7 +2482,7 @@ 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" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -2526,13 +2623,6 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= - dependencies: - repeating "^2.0.0" - detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" @@ -2548,10 +2638,10 @@ detect-node@^2.0.4: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== -diff@^3.2.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +diff-sequences@^24.3.0: + version "24.3.0" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.3.0.tgz#0f20e8a1df1abddaf4d9c226680952e64118b975" + integrity sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw== diffie-hellman@^5.0.0: version "5.0.2" @@ -3044,12 +3134,10 @@ evp_bytestokey@^1.0.0: md5.js "^1.3.4" safe-buffer "^5.1.1" -exec-sh@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36" - integrity sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw== - dependencies: - merge "^1.2.0" +exec-sh@^0.3.2: + version "0.3.2" + resolved "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" + integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg== execa@^0.10.0: version "0.10.0" @@ -3127,17 +3215,17 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" -expect@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/expect/-/expect-24.0.0-alpha.9.tgz#ca10124a337637f7ba97d4023d8404958f14d35c" - integrity sha512-JDQtJ/t3djuUcENlfMvMfPwjsbYbEC2WQbvfjhD3U18dlDsgPMzCMI9zi/6FVuUtrYRV+QUwvHR3jQ5umvOe0Q== +expect@^24.7.1: + version "24.7.1" + resolved "https://registry.npmjs.org/expect/-/expect-24.7.1.tgz#d91defbab4e627470a152feaf35b3c31aa1c7c14" + integrity sha512-mGfvMTPduksV3xoI0xur56pQsg2vJjNf5+a+bXOjqCkiCBbmCayrBbHS/75y9K430cfqyocPr2ZjiNiRx4SRKw== dependencies: + "@jest/types" "^24.7.0" ansi-styles "^3.2.0" - jest-diff "^24.0.0-alpha.9" - jest-get-type "^24.0.0-alpha.9" - jest-matcher-utils "^24.0.0-alpha.9" - jest-message-util "^24.0.0-alpha.9" - jest-regex-util "^24.0.0-alpha.9" + jest-get-type "^24.3.0" + jest-matcher-utils "^24.7.0" + jest-message-util "^24.7.1" + jest-regex-util "^24.3.0" express@^4.16.2: version "4.16.3" @@ -3190,11 +3278,6 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@~3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" - integrity sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ= - extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -3433,15 +3516,6 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@~2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" - integrity sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8= - dependencies: - asynckit "^0.4.0" - 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" @@ -3508,7 +3582,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.1.2, fsevents@^1.2.2, fsevents@^1.2.3: +fsevents@^1.1.2, fsevents@^1.2.2: version "1.2.4" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg== @@ -3516,6 +3590,14 @@ fsevents@^1.1.2, fsevents@^1.2.2, fsevents@^1.2.3: nan "^2.9.2" node-pre-gyp "^0.10.0" +fsevents@^1.2.7: + version "1.2.8" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-1.2.8.tgz#57ea5320f762cd4696e5e8e87120eccc8b11cacf" + integrity sha512-tPvHgPGB7m40CZ68xqFGkKuzN+RnpGmSV+hgeKxhRpbxdqKXUFJGC3yonBOLzQBcJyGpdZFDfCsdOC2KFsXzeA== + dependencies: + nan "^2.12.1" + node-pre-gyp "^0.12.0" + function-bind@^1.0.2, function-bind@^1.1.0, function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -3656,7 +3738,7 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" integrity sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg== -globals@^9.17.0, globals@^9.18.0: +globals@^9.17.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== @@ -3701,6 +3783,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== +"growl@~> 1.10.0": + version "1.10.5" + resolved "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -3711,12 +3798,12 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== -handlebars@^4.0.11: - version "4.0.12" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" - integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA== +handlebars@^4.1.0: + version "4.1.2" + resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" + integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== dependencies: - async "^2.5.0" + neo-async "^2.6.0" optimist "^0.6.1" source-map "^0.6.1" optionalDependencies: @@ -3727,14 +3814,6 @@ har-schema@^2.0.0: resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= -har-validator@~5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" - integrity sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0= - dependencies: - ajv "^5.1.0" - har-schema "^2.0.0" - har-validator@~5.1.0: version "5.1.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" @@ -3843,16 +3922,6 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.0" -hawk@~6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" - integrity sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ== - dependencies: - boom "4.x.x" - cryptiles "3.x.x" - hoek "4.x.x" - sntp "2.x.x" - hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -3862,11 +3931,6 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoek@4.x.x: - version "4.2.0" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" - integrity sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ== - hosted-git-info@^2.1.4: version "2.7.1" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" @@ -4178,12 +4242,12 @@ is-callable@^1.1.3, is-callable@^1.1.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== -is-ci@^1.0.10: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" - integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== dependencies: - ci-info "^1.5.0" + ci-info "^2.0.0" is-data-descriptor@^0.1.4: version "0.1.4" @@ -4275,10 +4339,10 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= -is-generator-fn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" - integrity sha1-lp1J4bszKfa7fwkIm+JleLLd1Go= +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" @@ -4476,54 +4540,42 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul-api@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-2.0.6.tgz#cd7b33ee678f6c01531d05f5e567ebbcd25f8ecc" - integrity sha512-8W5oeAGWXhtTJjAyVfvavOLVyZCTNCKsyF6GON/INKlBdO7uJ/bv3qnPj5M6ERKzmMCJS1kntnjjGuJ86fn3rQ== +istanbul-api@^2.1.1: + version "2.1.5" + resolved "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.5.tgz#697b95ec69856c278aacafc0f86ee7392338d5b5" + integrity sha512-meYk1BwDp59Pfse1TvPrkKYgVqAufbdBLEVoqvu/hLLKSaQ054ZTksbNepyc223tMnWdm6AdK2URIJJRqdP87g== dependencies: async "^2.6.1" compare-versions "^3.2.1" fileset "^2.0.3" - istanbul-lib-coverage "^2.0.1" - istanbul-lib-hook "^2.0.1" - istanbul-lib-instrument "^3.0.0" - istanbul-lib-report "^2.0.2" - istanbul-lib-source-maps "^2.0.1" - istanbul-reports "^2.0.1" - js-yaml "^3.12.0" - make-dir "^1.3.0" + istanbul-lib-coverage "^2.0.4" + istanbul-lib-hook "^2.0.6" + istanbul-lib-instrument "^3.2.0" + istanbul-lib-report "^2.0.7" + istanbul-lib-source-maps "^3.0.5" + istanbul-reports "^2.2.3" + js-yaml "^3.13.0" + make-dir "^2.1.0" + minimatch "^3.0.4" once "^1.4.0" -istanbul-lib-coverage@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" - integrity sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ== - istanbul-lib-coverage@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#2aee0e073ad8c5f6a0b00e0dfbf52b4667472eda" integrity sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA== -istanbul-lib-hook@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.1.tgz#918a57b75a0f951d552a08487ca1fa5336433d72" - integrity sha512-ufiZoiJ8CxY577JJWEeFuxXZoMqiKpq/RqZtOAYuQLvlkbJWscq9n3gc4xrCGH9n4pW0qnTxOz1oyMmVtk8E1w== +istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#927a354005d99dd43a24607bb8b33fd4e9aca1ad" + integrity sha512-LXTBICkMARVgo579kWDm8SqfB6nvSDKNqIOBEjmJRnL04JvoMHCYGWaMddQnseJYtkEuEvO/sIcOxPLk9gERug== + +istanbul-lib-hook@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.6.tgz#5baa6067860a38290aef038b389068b225b01b7d" + integrity sha512-829DKONApZ7UCiPXcOYWSgkFXa4+vNYoNOt3F+4uDJLKL1OotAoVwvThoEj1i8jmOj7odbYcR3rnaHu+QroaXg== dependencies: append-transform "^1.0.0" -istanbul-lib-instrument@^1.10.1: - version "1.10.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca" - integrity sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A== - dependencies: - babel-generator "^6.18.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - babylon "^6.18.0" - istanbul-lib-coverage "^1.2.1" - semver "^5.3.0" - istanbul-lib-instrument@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.0.tgz#b5f066b2a161f75788be17a9d556f40a0cf2afc9" @@ -4537,358 +4589,402 @@ istanbul-lib-instrument@^3.0.0: istanbul-lib-coverage "^2.0.1" semver "^5.5.0" -istanbul-lib-report@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.2.tgz#430a2598519113e1da7af274ba861bd42dd97535" - integrity sha512-rJ8uR3peeIrwAxoDEbK4dJ7cqqtxBisZKCuwkMtMv0xYzaAnsAi3AHrHPAAtNXzG/bcCgZZ3OJVqm1DTi9ap2Q== +istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.2.0.tgz#c549208da8a793f6622257a2da83e0ea96ae6a93" + integrity sha512-06IM3xShbNW4NgZv5AP4QH0oHqf1/ivFo8eFys0ZjPXHGldHJQWb3riYOKXqmOqfxXBfxu4B+g/iuhOPZH0RJg== dependencies: - istanbul-lib-coverage "^2.0.1" - make-dir "^1.3.0" - supports-color "^5.4.0" + "@babel/generator" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + istanbul-lib-coverage "^2.0.4" + semver "^6.0.0" -istanbul-lib-source-maps@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-2.0.1.tgz#ce8b45131d8293fdeaa732f4faf1852d13d0a97e" - integrity sha512-30l40ySg+gvBLcxTrLzR4Z2XTRj3HgRCA/p2rnbs/3OiTaoj054gAbuP5DcLOtwqmy4XW8qXBHzrmP2/bQ9i3A== +istanbul-lib-report@^2.0.7: + version "2.0.7" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.7.tgz#370d80d433c4dbc7f58de63618f49599c74bd954" + integrity sha512-wLH6beJBFbRBLiTlMOBxmb85cnVM1Vyl36N48e4e/aTKSM3WbOx7zbVIH1SQ537fhhsPbX0/C5JB4qsmyRXXyA== dependencies: - debug "^3.1.0" - istanbul-lib-coverage "^2.0.1" - make-dir "^1.3.0" + istanbul-lib-coverage "^2.0.4" + make-dir "^2.1.0" + supports-color "^6.0.0" + +istanbul-lib-source-maps@^3.0.1, istanbul-lib-source-maps@^3.0.5: + version "3.0.5" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.5.tgz#1d9ee9d94d2633f15611ee7aae28f9cac6d1aeb9" + integrity sha512-eDhZ7r6r1d1zQPVZehLc3D0K14vRba/eBYkz3rw16DLOrrTzve9RmnkcwrrkWVgO1FL3EK5knujVe5S8QHE9xw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^2.0.4" + make-dir "^2.1.0" rimraf "^2.6.2" source-map "^0.6.1" -istanbul-reports@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.0.1.tgz#fb8d6ea850701a3984350b977a969e9a556116a7" - integrity sha512-CT0QgMBJqs6NJLF678ZHcquUAZIoBIUNzdJrRJfpkI9OnzG6MkUfHxbJC3ln981dMswC7/B1mfX3LNkhgJxsuw== +istanbul-reports@^2.2.3: + version "2.2.3" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.3.tgz#14e0d00ecbfa9387757999cf36599b88e9f2176e" + integrity sha512-T6EbPuc8Cb620LWAYyZ4D8SSn06dY9i1+IgUX2lTH8gbwflMc9Obd33zHTyNX653ybjpamAHS9toKS3E6cGhTw== dependencies: - handlebars "^4.0.11" + handlebars "^4.1.0" -jest-changed-files@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.0.0-alpha.9.tgz#4b7f66e767dbb50251663ea96c9292182324289f" - integrity sha512-VhpGYzJvxBFBXb7vHygUbHN/ve2vlgQN7ayPa2etKbxf7F4CJAkLzQRkt8y7PUnhP/oFXq7Kd0OFx7YJxMmbLQ== +jest-changed-files@^24.7.0: + version "24.7.0" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.7.0.tgz#39d723a11b16ed7b373ac83adc76a69464b0c4fa" + integrity sha512-33BgewurnwSfJrW7T5/ZAXGE44o7swLslwh8aUckzq2e17/2Os1V0QU506ZNik3hjs8MgnEMKNkcud442NCDTw== dependencies: + "@jest/types" "^24.7.0" execa "^1.0.0" throat "^4.0.0" -jest-cli@24.0.0-alpha.9, jest-cli@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.0.0-alpha.9.tgz#934a7cade797067601c0efee20b92e349d9ad9c3" - integrity sha512-rZepajKnLqUHMdxyiWBYQQLFWJAGvvo5eJ3N1tLzmztMXlcfGysTHj2ncJIoyIFzo9RQYzGijbiURmH+QC0HYw== +jest-cli@^24.7.1: + version "24.7.1" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-24.7.1.tgz#6093a539073b6f4953145abeeb9709cd621044f1" + integrity sha512-32OBoSCVPzcTslGFl6yVCMzB2SqX3IrWwZCY5mZYkb0D2WsogmU3eV2o8z7+gRQa4o4sZPX/k7GU+II7CxM6WQ== dependencies: - ansi-escapes "^3.0.0" + "@jest/core" "^24.7.1" + "@jest/test-result" "^24.7.1" + "@jest/types" "^24.7.0" chalk "^2.0.1" exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.1.11" import-local "^2.0.0" - is-ci "^1.0.10" - istanbul-api "^2.0.6" - istanbul-lib-coverage "^2.0.1" - istanbul-lib-instrument "^3.0.0" - istanbul-lib-source-maps "^2.0.1" - jest-changed-files "^24.0.0-alpha.9" - jest-config "^24.0.0-alpha.9" - jest-environment-jsdom "^24.0.0-alpha.9" - jest-get-type "^24.0.0-alpha.9" - jest-haste-map "^24.0.0-alpha.9" - jest-message-util "^24.0.0-alpha.9" - jest-regex-util "^24.0.0-alpha.9" - jest-resolve-dependencies "^24.0.0-alpha.9" - jest-runner "^24.0.0-alpha.9" - jest-runtime "^24.0.0-alpha.9" - jest-snapshot "^24.0.0-alpha.9" - jest-util "^24.0.0-alpha.9" - jest-validate "^24.0.0-alpha.9" - jest-watcher "^24.0.0-alpha.9" - jest-worker "^24.0.0-alpha.9" - micromatch "^2.3.11" - node-notifier "^5.2.1" - prompts "^1.1.0" - realpath-native "^1.0.0" - rimraf "^2.5.4" - slash "^2.0.0" - string-length "^2.0.0" - strip-ansi "^5.0.0" - which "^1.2.12" + is-ci "^2.0.0" + jest-config "^24.7.1" + jest-util "^24.7.1" + jest-validate "^24.7.0" + prompts "^2.0.1" + realpath-native "^1.1.0" yargs "^12.0.2" -jest-config@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.0.0-alpha.9.tgz#21ff1d5e5d6e384de1ea442f62ceba790b64c9ea" - integrity sha512-QlMS58wSwAawv5Kvw4Tof+6ERvwFqk38cnJqDwJX1jdGtq/hy/m09RPTy7s+lq9Sq4LlVOhqSvv/E4RWpCLE7w== +jest-config@^24.7.1: + version "24.7.1" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-24.7.1.tgz#6c1dd4db82a89710a3cf66bdba97827c9a1cf052" + integrity sha512-8FlJNLI+X+MU37j7j8RE4DnJkvAghXmBWdArVzypW6WxfGuxiL/CCkzBg0gHtXhD2rxla3IMOSUAHylSKYJ83g== dependencies: "@babel/core" "^7.1.0" - babel-jest "^24.0.0-alpha.9" + "@jest/test-sequencer" "^24.7.1" + "@jest/types" "^24.7.0" + babel-jest "^24.7.1" chalk "^2.0.1" glob "^7.1.1" - jest-environment-jsdom "^24.0.0-alpha.9" - jest-environment-node "^24.0.0-alpha.9" - jest-get-type "^24.0.0-alpha.9" - jest-jasmine2 "^24.0.0-alpha.9" - jest-regex-util "^24.0.0-alpha.9" - jest-resolve "^24.0.0-alpha.9" - jest-util "^24.0.0-alpha.9" - jest-validate "^24.0.0-alpha.9" - micromatch "^2.3.11" - pretty-format "^24.0.0-alpha.9" - -jest-diff@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.0.0-alpha.9.tgz#d462764589b1863b8c72c0146e13d994f427a67b" - integrity sha512-0kOUzLTOEEsgc491HnTceiJomoI2rJOFhpMoyLYZUMRvKYtD2sMm5riceN//BcEZhJYAjflfTjJVRh/HPpWFCg== + jest-environment-jsdom "^24.7.1" + jest-environment-node "^24.7.1" + jest-get-type "^24.3.0" + jest-jasmine2 "^24.7.1" + jest-regex-util "^24.3.0" + jest-resolve "^24.7.1" + jest-util "^24.7.1" + jest-validate "^24.7.0" + micromatch "^3.1.10" + pretty-format "^24.7.0" + realpath-native "^1.1.0" + +jest-diff@^24.7.0: + version "24.7.0" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-24.7.0.tgz#5d862899be46249754806f66e5729c07fcb3580f" + integrity sha512-ULQZ5B1lWpH70O4xsANC4tf4Ko6RrpwhE3PtG6ERjMg1TiYTC2Wp4IntJVGro6a8HG9luYHhhmF4grF0Pltckg== dependencies: chalk "^2.0.1" - diff "^3.2.0" - jest-get-type "^24.0.0-alpha.9" - pretty-format "^24.0.0-alpha.9" + diff-sequences "^24.3.0" + jest-get-type "^24.3.0" + pretty-format "^24.7.0" jest-docblock@^20.0.1: version "20.0.3" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-20.0.3.tgz#17bea984342cc33d83c50fbe1545ea0efaa44712" integrity sha1-F76phDQswz2DxQ++FUXqDvqkRxI= -jest-docblock@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.0.0-alpha.9.tgz#b7539fef9db284970c744144a951881378009bb8" - integrity sha512-t69zAVYLmm01Nn6cpJVhRgqnubZ3hn4RhNc5gMwMoabcXIqUxEfjSHyCov7GRd9hgVG4DR6LvTIq9ryU+M/HCA== +jest-docblock@^24.3.0: + version "24.3.0" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.3.0.tgz#b9c32dac70f72e4464520d2ba4aec02ab14db5dd" + integrity sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg== dependencies: detect-newline "^2.1.0" -jest-each@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.0.0-alpha.9.tgz#148656b772181184e53c6f69d61a2e56400d4204" - integrity sha512-H5ayxzcswddKzM72eku66cvVUgK38wW4rggnTvcmrAqPCxX5nZ0C3zku3sCIUMSJsIKZ38Tvov8XT6v3x4TvSA== +jest-each@^24.7.1: + version "24.7.1" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-24.7.1.tgz#fcc7dda4147c28430ad9fb6dc7211cd17ab54e74" + integrity sha512-4fsS8fEfLa3lfnI1Jw6NxjhyRTgfpuOVTeUZZFyVYqeTa4hPhr2YkToUhouuLTrL2eMGOfpbdMyRx0GQ/VooKA== dependencies: + "@jest/types" "^24.7.0" chalk "^2.0.1" - jest-util "^24.0.0-alpha.9" - pretty-format "^24.0.0-alpha.9" - -jest-environment-jsdom@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.0.0-alpha.9.tgz#cc950a801f18dd21929a301f15a4269bdc252780" - integrity sha512-sQJ5Y006VAF60gFowCUil3gAnxgClGtUaPIEic8L5hFeRQqg+z+C64chCphwdDgKKq0dbRtianDNk0FoT3Jeyg== - dependencies: - jest-mock "^24.0.0-alpha.9" - jest-util "^24.0.0-alpha.9" + jest-get-type "^24.3.0" + jest-util "^24.7.1" + pretty-format "^24.7.0" + +jest-environment-jsdom@^24.7.1: + version "24.7.1" + resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.7.1.tgz#a40e004b4458ebeb8a98082df135fd501b9fbbd6" + integrity sha512-Gnhb+RqE2JuQGb3kJsLF8vfqjt3PHKSstq4Xc8ic+ax7QKo4Z0RWGucU3YV+DwKR3T9SYc+3YCUQEJs8r7+Jxg== + dependencies: + "@jest/environment" "^24.7.1" + "@jest/fake-timers" "^24.7.1" + "@jest/types" "^24.7.0" + jest-mock "^24.7.0" + jest-util "^24.7.1" jsdom "^11.5.1" -jest-environment-node@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.0.0-alpha.9.tgz#f4f41148fd27c7fa0c5c792fd9dcf09417fc3ee2" - integrity sha512-IRZLyaBfqkiALhxMVE3JtH8H+SMMo1bnwAhRroQoWWwcLzUt5mVmABKtOTGkPqZySfzgoJjBXog9tgPgua8grA== +jest-environment-node@^24.7.1: + version "24.7.1" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.7.1.tgz#fa2c047a31522a48038d26ee4f7c8fd9c1ecfe12" + integrity sha512-GJJQt1p9/C6aj6yNZMvovZuxTUd+BEJprETdvTKSb4kHcw4mFj8777USQV0FJoJ4V3djpOwA5eWyPwfq//PFBA== dependencies: - jest-mock "^24.0.0-alpha.9" - jest-util "^24.0.0-alpha.9" + "@jest/environment" "^24.7.1" + "@jest/fake-timers" "^24.7.1" + "@jest/types" "^24.7.0" + jest-mock "^24.7.0" + jest-util "^24.7.1" -jest-get-type@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.0.0-alpha.9.tgz#aee664bb66c44c9842186b3325e9194963f95c1a" - integrity sha512-v1SLtB48VGxgjvZzwbNSz3xG651GRS1yUubCthy/jQPyovPIpIamN1z9JbOhJ88a5UkjRJ8rWmkIbgBYylDHHQ== +jest-get-type@^24.3.0: + version "24.3.0" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.3.0.tgz#582cfd1a4f91b5cdad1d43d2932f816d543c65da" + integrity sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow== -jest-haste-map@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.0.0-alpha.9.tgz#8ee0c20d72e41630cdbcdfbb88cafbda738eb0f7" - integrity sha512-TAwS1WNUtI/L5voYcFLL8/YBkwf/4V1K1gGon5ueO1oSTAY3ZXcOMBjph1Ej5fy4VrnU8RQa/FjBCsSHYr/ckQ== +jest-haste-map@^24.7.1: + version "24.7.1" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.7.1.tgz#772e215cd84080d4bbcb759cfb668ad649a21471" + integrity sha512-g0tWkzjpHD2qa03mTKhlydbmmYiA2KdcJe762SbfFo/7NIMgBWAA0XqQlApPwkWOF7Cxoi/gUqL0i6DIoLpMBw== dependencies: + "@jest/types" "^24.7.0" + anymatch "^2.0.0" fb-watchman "^2.0.0" - graceful-fs "^4.1.11" + graceful-fs "^4.1.15" invariant "^2.2.4" - jest-serializer "^24.0.0-alpha.9" - jest-worker "^24.0.0-alpha.9" - micromatch "^2.3.11" - sane "^3.0.0" + jest-serializer "^24.4.0" + jest-util "^24.7.1" + jest-worker "^24.6.0" + micromatch "^3.1.10" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^1.2.7" -jest-jasmine2@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.0.0-alpha.9.tgz#c9b5a4a273d2eb2ebaff9ae7289e9243021a4a69" - integrity sha512-a75xo1nXWdHGORzb9v2VBkfYvuBTdyk5c9gT68OD/AdQc3dX7nkt35YxTvp7v+pKO99AW/sl5TEP0yOARTqmSg== +jest-jasmine2@^24.7.1: + version "24.7.1" + resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.7.1.tgz#01398686dabe46553716303993f3be62e5d9d818" + integrity sha512-Y/9AOJDV1XS44wNwCaThq4Pw3gBPiOv/s6NcbOAkVRRUEPu+36L2xoPsqQXsDrxoBerqeyslpn2TpCI8Zr6J2w== dependencies: "@babel/traverse" "^7.1.0" + "@jest/environment" "^24.7.1" + "@jest/test-result" "^24.7.1" + "@jest/types" "^24.7.0" chalk "^2.0.1" co "^4.6.0" - expect "^24.0.0-alpha.9" - is-generator-fn "^1.0.0" - jest-diff "^24.0.0-alpha.9" - jest-each "^24.0.0-alpha.9" - jest-matcher-utils "^24.0.0-alpha.9" - jest-message-util "^24.0.0-alpha.9" - jest-snapshot "^24.0.0-alpha.9" - jest-util "^24.0.0-alpha.9" - pretty-format "^24.0.0-alpha.9" - -jest-leak-detector@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.0.0-alpha.9.tgz#02f6dc2d54d1f694524f1cf2bc0291109ab30e38" - integrity sha512-1IvLErlcj3YmGjVXmaUFXQNdKXoP922kAiX3Yu7cWqd0TyUhXbv/ZBufmach+FF5WmoF2eb7o3jpzZj+EdDRyw== - dependencies: - pretty-format "^24.0.0-alpha.9" - -jest-matcher-utils@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.0.0-alpha.9.tgz#a397f900b42c5c730361a6c05bcdbf94ab977295" - integrity sha512-tIYYa9ZlhYxsK7PLi39aJBvJBjyLdmYmVjeIemoWs6aadZFaqzVrbcTxBCQL/Uu+3OWWOnZoqHI1MYA7OkjCWQ== + expect "^24.7.1" + is-generator-fn "^2.0.0" + jest-each "^24.7.1" + jest-matcher-utils "^24.7.0" + jest-message-util "^24.7.1" + jest-runtime "^24.7.1" + jest-snapshot "^24.7.1" + jest-util "^24.7.1" + pretty-format "^24.7.0" + throat "^4.0.0" + +jest-leak-detector@^24.7.0: + version "24.7.0" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.7.0.tgz#323ff93ed69be12e898f5b040952f08a94288ff9" + integrity sha512-zV0qHKZGXtmPVVzT99CVEcHE9XDf+8LwiE0Ob7jjezERiGVljmqKFWpV2IkG+rkFIEUHFEkMiICu7wnoPM/RoQ== + dependencies: + pretty-format "^24.7.0" + +jest-matcher-utils@^24.7.0: + version "24.7.0" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.7.0.tgz#bbee1ff37bc8b2e4afcaabc91617c1526af4bcd4" + integrity sha512-158ieSgk3LNXeUhbVJYRXyTPSCqNgVXOp/GT7O94mYd3pk/8+odKTyR1JLtNOQSPzNi8NFYVONtvSWA/e1RDXg== dependencies: chalk "^2.0.1" - jest-get-type "^24.0.0-alpha.9" - pretty-format "^24.0.0-alpha.9" + jest-diff "^24.7.0" + jest-get-type "^24.3.0" + pretty-format "^24.7.0" -jest-message-util@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.0.0-alpha.9.tgz#a535e219d2972b0a9eaabab3d3316fc206b636ac" - integrity sha512-hFrzpy4MRw+dHS7aUkkes7s2sQ0DFbaJEkCB4bSY5yS2ltdoAxiaNOn4NKS+hdW0Qug7nrs+SlvNrSCsiGwGtg== +jest-message-util@^24.7.1: + version "24.7.1" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.7.1.tgz#f1dc3a6c195647096a99d0f1dadbc447ae547018" + integrity sha512-dk0gqVtyqezCHbcbk60CdIf+8UHgD+lmRHifeH3JRcnAqh4nEyPytSc9/L1+cQyxC+ceaeP696N4ATe7L+omcg== dependencies: "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.7.1" + "@jest/types" "^24.7.0" + "@types/stack-utils" "^1.0.1" chalk "^2.0.1" - micromatch "^2.3.11" + micromatch "^3.1.10" slash "^2.0.0" stack-utils "^1.0.1" -jest-mock@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.0.0-alpha.9.tgz#11dc75ccced1d3f763f7fbd9c664746732cca881" - integrity sha512-PFzv3xvJyDWvtIGnamJKfapQaajEceQ+WNpW+IZUTQsOajuNGYkYWd/vfpr+ggIEXI3VghccKGlBGD3W3qr3gg== +jest-mock@^24.7.0: + version "24.7.0" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-24.7.0.tgz#e49ce7262c12d7f5897b0d8af77f6db8e538023b" + integrity sha512-6taW4B4WUcEiT2V9BbOmwyGuwuAFT2G8yghF7nyNW1/2gq5+6aTqSPcS9lS6ArvEkX55vbPAS/Jarx5LSm4Fng== + dependencies: + "@jest/types" "^24.7.0" -jest-regex-util@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.0.0-alpha.9.tgz#ec4713342a9bbed2509df6b8d8aa24e759673d9d" - integrity sha512-wpahI7oMEBsOWUw/MgWrFHv6C0etsgiZgkt4GXFINfBKXrgchRJ8ObFtI9XmKsfad43fPH/Gji0ZKxHRId47bA== +jest-pnp-resolver@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" + integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== -jest-resolve-dependencies@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.0.0-alpha.9.tgz#fb6055ba1f625ea456abb6e20c0b7f6bf54983d2" - integrity sha512-Y4jK7b1J6CPu+J3HE1fH+oG7GTOnYAhU21B7ahaDIYFu9K1CKLMIFWHUGYCmB4lQDU154DVVu7jBykgUctvVGA== +jest-regex-util@^24.3.0: + version "24.3.0" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz#d5a65f60be1ae3e310d5214a0307581995227b36" + integrity sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg== + +jest-resolve-dependencies@^24.7.1: + version "24.7.1" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.7.1.tgz#cf93bbef26999488a96a2b2012f9fe7375aa378f" + integrity sha512-2Eyh5LJB2liNzfk4eo7bD1ZyBbqEJIyyrFtZG555cSWW9xVHxII2NuOkSl1yUYTAYCAmM2f2aIT5A7HzNmubyg== dependencies: - jest-regex-util "^24.0.0-alpha.9" - jest-snapshot "^24.0.0-alpha.9" + "@jest/types" "^24.7.0" + jest-regex-util "^24.3.0" + jest-snapshot "^24.7.1" -jest-resolve@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.0.0-alpha.9.tgz#57ca564aee9d55f32ec56bbb34684912b8264daa" - integrity sha512-W2Seyd9LZLJyEDFeq6FXtmW3Hf3t7ZM4i0/u7GoQTpz0BltNlATcc0+SmFJuhuR+CFpKBTbf5doU7aPHrL+sMw== +jest-resolve@^24.7.1: + version "24.7.1" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.7.1.tgz#e4150198299298380a75a9fd55043fa3b9b17fde" + integrity sha512-Bgrc+/UUZpGJ4323sQyj85hV9d+ANyPNu6XfRDUcyFNX1QrZpSoM0kE4Mb2vZMAYTJZsBFzYe8X1UaOkOELSbw== dependencies: + "@jest/types" "^24.7.0" browser-resolve "^1.11.3" chalk "^2.0.1" - realpath-native "^1.0.0" - -jest-runner@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.0.0-alpha.9.tgz#76c0837a3be4d354ffedbbd5770625ed6ebb89d2" - integrity sha512-ETQhr98p5qQeunMPsyeCLnTfqbnShz5DHO2Y+vORcDkPra37a3BlQb6+1f6H6DtIFHZ61aS2OgeIxcGYUMb8vw== - dependencies: + jest-pnp-resolver "^1.2.1" + realpath-native "^1.1.0" + +jest-runner@^24.7.1: + version "24.7.1" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-24.7.1.tgz#41c8a02a06aa23ea82d8bffd69d7fa98d32f85bf" + integrity sha512-aNFc9liWU/xt+G9pobdKZ4qTeG/wnJrJna3VqunziDNsWT3EBpmxXZRBMKCsNMyfy+A/XHiV+tsMLufdsNdgCw== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.7.1" + "@jest/test-result" "^24.7.1" + "@jest/types" "^24.7.0" + chalk "^2.4.2" exit "^0.1.2" - graceful-fs "^4.1.11" - jest-config "^24.0.0-alpha.9" - jest-docblock "^24.0.0-alpha.9" - jest-haste-map "^24.0.0-alpha.9" - jest-jasmine2 "^24.0.0-alpha.9" - jest-leak-detector "^24.0.0-alpha.9" - jest-message-util "^24.0.0-alpha.9" - jest-runtime "^24.0.0-alpha.9" - jest-util "^24.0.0-alpha.9" - jest-worker "^24.0.0-alpha.9" + graceful-fs "^4.1.15" + jest-config "^24.7.1" + jest-docblock "^24.3.0" + jest-haste-map "^24.7.1" + jest-jasmine2 "^24.7.1" + jest-leak-detector "^24.7.0" + jest-message-util "^24.7.1" + jest-resolve "^24.7.1" + jest-runtime "^24.7.1" + jest-util "^24.7.1" + jest-worker "^24.6.0" source-map-support "^0.5.6" throat "^4.0.0" -jest-runtime@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.0.0-alpha.9.tgz#7480adf3a6fa74128a14ccc29dbf15a84afc1db0" - integrity sha512-xCmRBhIkp9ZMyco53LSPGILBVHOeYy/TX/ZcdiqSOX1DXo7ka3+6+/Z0vAHF+pvjOrErrBxVBdxqzHwNa2by2g== - dependencies: - "@babel/core" "^7.1.0" - babel-plugin-istanbul "^5.1.0" +jest-runtime@^24.7.1: + version "24.7.1" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.7.1.tgz#2ffd70b22dd03a5988c0ab9465c85cdf5d25c597" + integrity sha512-0VAbyBy7tll3R+82IPJpf6QZkokzXPIS71aDeqh+WzPRXRCNz6StQ45otFariPdJ4FmXpDiArdhZrzNAC3sj6A== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.7.1" + "@jest/source-map" "^24.3.0" + "@jest/transform" "^24.7.1" + "@jest/types" "^24.7.0" + "@types/yargs" "^12.0.2" chalk "^2.0.1" - convert-source-map "^1.4.0" exit "^0.1.2" - fast-json-stable-stringify "^2.0.0" glob "^7.1.3" - graceful-fs "^4.1.11" - jest-config "^24.0.0-alpha.9" - jest-haste-map "^24.0.0-alpha.9" - jest-message-util "^24.0.0-alpha.9" - jest-regex-util "^24.0.0-alpha.9" - jest-resolve "^24.0.0-alpha.9" - jest-snapshot "^24.0.0-alpha.9" - jest-util "^24.0.0-alpha.9" - jest-validate "^24.0.0-alpha.9" - micromatch "^2.3.11" - realpath-native "^1.0.0" + graceful-fs "^4.1.15" + jest-config "^24.7.1" + jest-haste-map "^24.7.1" + jest-message-util "^24.7.1" + jest-mock "^24.7.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.7.1" + jest-snapshot "^24.7.1" + jest-util "^24.7.1" + jest-validate "^24.7.0" + realpath-native "^1.1.0" slash "^2.0.0" - strip-bom "3.0.0" - write-file-atomic "^2.1.0" + strip-bom "^3.0.0" yargs "^12.0.2" -jest-serializer@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.0.0-alpha.9.tgz#ac1da43c39d20f2bdc59991a2b616fd744eaa765" - integrity sha512-6iq/N5XXbgAlSQEwVX/2VyNVVLbG2R7xV/4RvLZ6XDNujWdjWW6KgcjtzwQMpN/TPdg7IT8xyZaGYJuFWdakyA== +jest-serializer@^24.4.0: + version "24.4.0" + resolved "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.4.0.tgz#f70c5918c8ea9235ccb1276d232e459080588db3" + integrity sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q== -jest-snapshot@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.0.0-alpha.9.tgz#d43610638afa0c9511e6812e8100dfdc5d006fb1" - integrity sha512-nd21ez7zV9Eq3gbr0F24eX6+ss35w/79H3XD3iCd6u5qnPUYq1C8jcBK6dNV1cJ59IqI4d6tfCFzVjCeVG2GsQ== +jest-snapshot@^24.7.1: + version "24.7.1" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.7.1.tgz#bd5a35f74aedff070975e9e9c90024f082099568" + integrity sha512-8Xk5O4p+JsZZn4RCNUS3pxA+ORKpEKepE+a5ejIKrId9CwrVN0NY+vkqEkXqlstA5NMBkNahXkR/4qEBy0t5yA== dependencies: "@babel/types" "^7.0.0" + "@jest/types" "^24.7.0" chalk "^2.0.1" - jest-diff "^24.0.0-alpha.9" - jest-matcher-utils "^24.0.0-alpha.9" - jest-message-util "^24.0.0-alpha.9" - jest-resolve "^24.0.0-alpha.9" + expect "^24.7.1" + jest-diff "^24.7.0" + jest-matcher-utils "^24.7.0" + jest-message-util "^24.7.1" + jest-resolve "^24.7.1" mkdirp "^0.5.1" natural-compare "^1.4.0" - pretty-format "^24.0.0-alpha.9" + pretty-format "^24.7.0" semver "^5.5.0" -jest-util@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.0.0-alpha.9.tgz#094bf556c659e57185b003937ab13c9b72dbf0bd" - integrity sha512-VqDaEM9nTZLmogAKLFHULK4K+0O9I9TLzeBnOObC0mJ1qJJo5sh2TxdGWdBozwQKbryNFpuZcrDYbA9/oe2x3A== - dependencies: - callsites "^2.0.0" +jest-util@^24.7.1: + version "24.7.1" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-24.7.1.tgz#b4043df57b32a23be27c75a2763d8faf242038ff" + integrity sha512-/KilOue2n2rZ5AnEBYoxOXkeTu6vi7cjgQ8MXEkih0oeAXT6JkS3fr7/j8+engCjciOU1Nq5loMSKe0A1oeX0A== + dependencies: + "@jest/console" "^24.7.1" + "@jest/fake-timers" "^24.7.1" + "@jest/source-map" "^24.3.0" + "@jest/test-result" "^24.7.1" + "@jest/types" "^24.7.0" + callsites "^3.0.0" chalk "^2.0.1" - graceful-fs "^4.1.11" - is-ci "^1.0.10" - jest-message-util "^24.0.0-alpha.9" + graceful-fs "^4.1.15" + is-ci "^2.0.0" mkdirp "^0.5.1" slash "^2.0.0" source-map "^0.6.0" -jest-validate@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.0.0-alpha.9.tgz#aa0f50e2d3d9136b1d89e38dc95ad0a83490c7a9" - integrity sha512-Q1iwWNUNyvOtVwj7QzyHNCTENBC+5YmFYt5zwpBlpF9vNMXqku3OxqrTzG5jT890VkHTZ0QGTJl3IXydjMEEkA== +jest-validate@^24.7.0: + version "24.7.0" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-24.7.0.tgz#70007076f338528ee1b1c8a8258b1b0bb982508d" + integrity sha512-cgai/gts9B2chz1rqVdmLhzYxQbgQurh1PEQSvSgPZ8KGa1AqXsqC45W5wKEwzxKrWqypuQrQxnF4+G9VejJJA== dependencies: + "@jest/types" "^24.7.0" camelcase "^5.0.0" chalk "^2.0.1" - jest-get-type "^24.0.0-alpha.9" + jest-get-type "^24.3.0" leven "^2.1.0" - pretty-format "^24.0.0-alpha.9" + pretty-format "^24.7.0" -jest-watcher@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.0.0-alpha.9.tgz#ef2beffc9e9c01a47d5396df572aff70a1e8ed11" - integrity sha512-6BsEPvFir8b3gAmZeFm8WOpSxOhj99A++tVTSPh5/C8S7FlQJYbto4gnk5PO0dePhv5yyVuahvI9y0ZhCt8glQ== +jest-watcher@^24.7.1: + version "24.7.1" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.7.1.tgz#e161363d7f3f4e1ef3d389b7b3a0aad247b673f5" + integrity sha512-Wd6TepHLRHVKLNPacEsBwlp9raeBIO+01xrN24Dek4ggTS8HHnOzYSFnvp+6MtkkJ3KfMzy220KTi95e2rRkrw== dependencies: + "@jest/test-result" "^24.7.1" + "@jest/types" "^24.7.0" + "@types/yargs" "^12.0.9" ansi-escapes "^3.0.0" chalk "^2.0.1" + jest-util "^24.7.1" string-length "^2.0.0" -jest-worker@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.0.0-alpha.9.tgz#2d8a35687744461b5aa8ed553dc4d5a5da2ceab8" - integrity sha512-6lveyea6qbLdlQy+H+hn4IcEVgdqlI++KZU0tOdLeCliJ7myj7sDAO3fCVAcuMW9yxekIwrYclj472mP3wQdcQ== +jest-worker@^24.6.0: + version "24.6.0" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz#7f81ceae34b7cde0c9827a6980c35b7cdc0161b3" + integrity sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ== dependencies: merge-stream "^1.0.1" - supports-color "^5.5.0" + supports-color "^6.1.0" -jest@24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/jest/-/jest-24.0.0-alpha.9.tgz#4226156080b801a54e7b9ef2cda2676162a5e721" - integrity sha512-IaErEt81wKQalaBGdRN++aMquO3Nr2UIMMQ9pdZirhrCTToZlI6moNoJzLZdAo/iubMdJVf4f7eQnn2N87JkSg== +jest@^24.7.1: + version "24.7.1" + resolved "https://registry.npmjs.org/jest/-/jest-24.7.1.tgz#0d94331cf510c75893ee32f87d7321d5bf8f2501" + integrity sha512-AbvRar5r++izmqo5gdbAjTeA6uNRGoNRuj5vHB0OnDXo2DXWZJVuaObiGgtlvhKb+cWy2oYbQSfxv7Q7GjnAtA== dependencies: import-local "^2.0.0" - jest-cli "^24.0.0-alpha.9" + jest-cli "^24.7.1" js-levenshtein@^1.1.3: version "1.1.4" @@ -4905,15 +5001,15 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@^3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" - integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== +js-yaml@^3.11.0, js-yaml@^3.13.0: + version "3.13.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== dependencies: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^3.6.1, js-yaml@^3.9.0: +js-yaml@^3.9.0: version "3.10.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" integrity sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA== @@ -4971,11 +5067,6 @@ jsdom@^11.5.1: ws "^5.2.0" xml-name-validator "^3.0.0" -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= - jsesc@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" @@ -5093,10 +5184,10 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== -kleur@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.1.tgz#4f5b313f5fa315432a400f19a24db78d451ede62" - integrity sha512-P3kRv+B+Ra070ng2VKQqW4qW7gd/v3iD8sy/zOdcYRsfiD+QBokQNOps/AfP6Hr48cBhIIBFWckB9aO+IZhrWg== +kleur@^3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== lcid@^1.0.0: version "1.0.0" @@ -5226,7 +5317,7 @@ lodash@^4.0.0, lodash@^4.3.0, lodash@^4.5.1: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" integrity sha1-eCA6TRwyiuHYbcpkYONptX9AVa4= -lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.4: +lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.4: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -5236,10 +5327,10 @@ lodash@^4.17.10, lodash@^4.17.5: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== -log-driver@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.5.tgz#7ae4ec257302fd790d557cb10c97100d857b0056" - integrity sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY= +log-driver@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" + integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg== loglevel@^1.4.1: version "1.5.1" @@ -5283,12 +5374,13 @@ make-dir@^1.0.0: dependencies: pify "^2.3.0" -make-dir@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== dependencies: - pify "^3.0.0" + pify "^4.0.1" + semver "^5.6.0" makeerror@1.0.x: version "1.0.11" @@ -5401,11 +5493,6 @@ merge-stream@^1.0.1: dependencies: readable-stream "^2.0.1" -merge@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" - integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== - methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -5430,7 +5517,7 @@ micromatch@^2.3.11: parse-glob "^3.0.4" regex-cache "^0.4.2" -micromatch@^3.1.4, micromatch@^3.1.8, micromatch@^3.1.9: +micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8, micromatch@^3.1.9: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -5643,6 +5730,11 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= +nan@^2.12.1: + version "2.13.2" + resolved "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" + integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== + nan@^2.9.2: version "2.10.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" @@ -5696,6 +5788,15 @@ needle@^2.2.0: iconv-lite "^0.4.4" sax "^1.2.4" +needle@^2.2.1: + version "2.3.0" + resolved "https://registry.npmjs.org/needle/-/needle-2.3.0.tgz#ce3fea21197267bacb310705a7bbe24f2a3a3492" + integrity sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg== + dependencies: + debug "^4.1.0" + iconv-lite "^0.4.4" + sax "^1.2.4" + negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" @@ -5706,6 +5807,11 @@ neo-async@^2.5.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" integrity sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA== +neo-async@^2.6.0: + version "2.6.0" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" + integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== + nested-error-stacks@^1.0.0, nested-error-stacks@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz#19f619591519f096769a5ba9a86e6eeec823c3cf" @@ -5757,6 +5863,11 @@ 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.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + node-notifier@^5.2.1: version "5.3.0" resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.3.0.tgz#c77a4a7b84038733d5fb351aafd8a268bfe19a01" @@ -5783,6 +5894,22 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + node-releases@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.3.tgz#aad9ce0dcb98129c753f772c0aa01360fb90fbd2" @@ -5904,11 +6031,6 @@ nwsapi@^2.0.7: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.9.tgz#77ac0cdfdcad52b6a1151a84e73254edc33ed016" integrity sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ== -oauth-sign@~0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= - oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" @@ -6147,6 +6269,13 @@ p-defer@^1.0.0: resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= +p-each-series@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= + dependencies: + p-reduce "^1.0.0" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -6190,6 +6319,11 @@ p-map@^1.1.1: resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" @@ -6375,6 +6509,11 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" @@ -6387,6 +6526,13 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + 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" @@ -6448,13 +6594,15 @@ prettier@^1.6.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.6.1.tgz#850f411a3116226193e32ea5acfc21c0f9a76d7d" integrity sha512-f85qBoQiqiFM/sCmJaN4Lagj9bqMcv38vCftqp4GfVessAqq3Ns6g+3gd8UXReStLLE/DGEdwiZXoFKxphKqwg== -pretty-format@^24.0.0-alpha.9: - version "24.0.0-alpha.9" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.0.0-alpha.9.tgz#d01a940d5c9a8bd38315f2dd3dc971df8547b172" - integrity sha512-FQTU33XZI4pRHb6JlLrgLEHyAA4sVWneyc8IbLq9s+VSpUEg3kEvOl5GutMbsP/lFVxXbWBkyhvGZKl3YWi6yA== +pretty-format@^24.7.0: + version "24.7.0" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-24.7.0.tgz#d23106bc2edcd776079c2daa5da02bcb12ed0c10" + integrity sha512-apen5cjf/U4dj7tHetpC7UEFCvtAgnNZnBDkfPv3fokzIqyOJckAG9OlAPC1BlFALnqT/lGB2tl9EJjlK6eCsA== dependencies: + "@jest/types" "^24.7.0" ansi-regex "^4.0.0" ansi-styles "^3.2.0" + react-is "^16.8.4" private@^0.1.6: version "0.1.7" @@ -6486,15 +6634,15 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= -prompts@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-1.2.1.tgz#7fd4116a458d6a62761e3ccb1432d7bbd8b2cb29" - integrity sha512-GE33SMMVO1ISfnq3i6cE+WYK/tLxRWtZiRkl5vdg0KR0owOCPFOsq8BuFajFbW7b2bMHb8krXaQHOpZyUEuvmA== +prompts@^2.0.1: + version "2.0.4" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.0.4.tgz#179f9d4db3128b9933aa35f93a800d8fce76a682" + integrity sha512-HTzM3UWp/99A0gk51gAegwo1QRYA7xjcZufMNe33rCclFszUYAuHe1fIN/3ZmiHeGPkUsNaRyQm1hHOfM0PKxA== dependencies: - kleur "^3.0.0" + kleur "^3.0.2" sisteransi "^1.0.0" -prop-types@^15.5.10, prop-types@^15.6.0, prop-types@~15.6.2: +prop-types@^15.5.10, prop-types@^15.6.0: version "15.6.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" integrity sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ== @@ -6502,7 +6650,7 @@ prop-types@^15.5.10, prop-types@^15.6.0, prop-types@~15.6.2: loose-envify "^1.3.1" object-assign "^4.1.1" -prop-types@^15.6.2: +prop-types@^15.6.2, prop-types@~15.7.2: version "15.7.2" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -6597,7 +6745,7 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@6.5.1, qs@~6.5.1: +qs@6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" integrity sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A== @@ -6673,7 +6821,7 @@ raw-body@2.3.2: iconv-lite "0.4.19" unpipe "1.0.0" -rc@^1.1.7: +rc@^1.1.7, rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -6683,15 +6831,15 @@ rc@^1.1.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-dom@16.8.3: - version "16.8.3" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-16.8.3.tgz#ae236029e66210783ac81999d3015dfc475b9c32" - integrity sha512-ttMem9yJL4/lpItZAQ2NTFAbV7frotHk5DZEHXUOws2rMmrsvh1Na7ThGT0dTzUIl6pqTOi5tYREfL8AEna3lA== +react-dom@^16.8.6: + version "16.8.6" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-16.8.6.tgz#71d6303f631e8b0097f56165ef608f051ff6e10f" + integrity sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" - scheduler "^0.13.3" + scheduler "^0.13.6" react-images@^0.5.18: version "0.5.18" @@ -6713,6 +6861,11 @@ react-is@^16.8.1: resolved "https://registry.npmjs.org/react-is/-/react-is-16.8.3.tgz#4ad8b029c2a718fc0cfc746c8d4e1b7221e5387d" integrity sha512-Y4rC1ZJmsxxkkPuMLwvKvlL1Zfpbcu+Bf4ZigkHup3v9EfdYhAlWAaVyA19olXq2o2mGn0w+dFKvk3pVVlYcIA== +react-is@^16.8.4: + version "16.8.6" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" + integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== + react-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" @@ -6751,15 +6904,15 @@ react-transition-group@2: prop-types "^15.6.2" react-lifecycles-compat "^3.0.4" -react@16.8.3: - version "16.8.3" - resolved "https://registry.npmjs.org/react/-/react-16.8.3.tgz#c6f988a2ce895375de216edcfaedd6b9a76451d9" - integrity sha512-3UoSIsEq8yTJuSu0luO1QQWYbgGEILm+eJl2QN/VLDi7hL+EN18M3q3oVZwmVzzBJ3DkM7RMdRwBmZZ+b4IzSA== +react@^16.8.6: + version "16.8.6" + resolved "https://registry.npmjs.org/react/-/react-16.8.6.tgz#ad6c3a9614fd3a4e9ef51117f54d888da01f2bbe" + integrity sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" - scheduler "^0.13.3" + scheduler "^0.13.6" read-pkg-up@^1.0.1: version "1.0.1" @@ -6862,10 +7015,10 @@ readline-sync@^1.4.7: resolved "https://registry.yarnpkg.com/readline-sync/-/readline-sync-1.4.7.tgz#001bfdd4c06110c3c084c63bf7c6a56022213f30" integrity sha1-ABv91MBhEMPAhMY798alYCIhPzA= -realpath-native@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.2.tgz#cd51ce089b513b45cf9b1516c82989b51ccc6560" - integrity sha512-+S3zTvVt9yTntFrBpm7TQmQ3tzpCrnA1a/y+3cUHAc9ZR6aIjG0WNLR+Rj79QpJktY+VeW/TQtFlQ1bzsehI8g== +realpath-native@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== dependencies: util.promisify "^1.0.0" @@ -6978,35 +7131,7 @@ request-promise-native@^1.0.5: stealthy-require "^1.1.0" tough-cookie ">=2.3.3" -request@^2.79.0: - version "2.83.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" - integrity sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.6.0" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" - forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" - hawk "~6.0.2" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" - performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - stringstream "~0.0.5" - tough-cookie "~2.3.3" - tunnel-agent "^0.6.0" - uuid "^3.1.0" - -request@^2.87.0: +request@^2.86.0, request@^2.87.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== @@ -7179,10 +7304,10 @@ rst-selector-parser@^2.2.3: lodash.flattendeep "^4.4.0" nearley "^2.7.10" -rsvp@^3.3.3: - version "3.6.2" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" - integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== +rsvp@^4.8.4: + version "4.8.4" + resolved "https://registry.npmjs.org/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" + integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA== run-async@^2.2.0: version "2.3.0" @@ -7237,22 +7362,20 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sane@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-3.1.0.tgz#995193b7dc1445ef1fe41ddfca2faf9f111854c6" - integrity sha512-G5GClRRxT1cELXfdAq7UKtUsv8q/ZC5k8lQGmjEm4HcAl3HzBy68iglyNCmw4+0tiXPCBZntslHlRhbnsSws+Q== +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== dependencies: + "@cnakazawa/watch" "^1.0.3" anymatch "^2.0.0" - capture-exit "^1.2.0" - exec-sh "^0.2.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" - watch "~0.18.0" - optionalDependencies: - fsevents "^1.2.3" sax@^1.2.4: version "1.2.4" @@ -7267,10 +7390,10 @@ scheduler@^0.11.2: loose-envify "^1.1.0" object-assign "^4.1.1" -scheduler@^0.13.3: - version "0.13.3" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.13.3.tgz#bed3c5850f62ea9c716a4d781f9daeb9b2a58896" - integrity sha512-UxN5QRYWtpR1egNWzJcVLk8jlegxAugswQc984lD3kU7NuobsO37/sRfbpTdBjtnD5TBNFA2Q2oLV5+UmPSmEQ== +scheduler@^0.13.6: + version "0.13.6" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz#466a4ec332467b31a91b9bf74e5347072e4cd889" + integrity sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -7309,6 +7432,11 @@ selfsigned@^1.9.1: resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== +semver@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz#05e359ee571e5ad7ed641a6eec1e547ba52dea65" + integrity sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ== + send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" @@ -7475,13 +7603,6 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -sntp@2.x.x: - version "2.1.0" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" - integrity sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg== - dependencies: - hoek "4.x.x" - sockjs-client@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.3.0.tgz#12fc9d6cb663da5739d3dc5fb6e8687da95cb177" @@ -7531,7 +7652,7 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: +source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -7769,11 +7890,6 @@ string_decoder@~1.0.3: dependencies: safe-buffer "~5.1.0" -stringstream@~0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" - integrity sha1-TkhM1N5aC7vuGORjB3EKioFiGHg= - strip-ansi@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" @@ -7802,11 +7918,6 @@ strip-ansi@^5.0.0: dependencies: ansi-regex "^4.0.0" -strip-bom@3.0.0, strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -7814,6 +7925,11 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -7862,13 +7978,20 @@ supports-color@^5.1.0, supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^5.4.0, supports-color@^5.5.0: +supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" +supports-color@^6.0.0, supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + symbol-tree@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" @@ -7944,17 +8067,6 @@ terser@^3.8.1: source-map "~0.6.1" source-map-support "~0.5.6" -test-exclude@^4.2.1: - version "4.2.3" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20" - integrity sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA== - dependencies: - arrify "^1.0.1" - micromatch "^2.3.11" - object-assign "^4.1.0" - read-pkg-up "^1.0.1" - require-main-filename "^1.0.1" - test-exclude@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.0.0.tgz#cdce7cece785e0e829cd5c2b27baf18bc583cfb7" @@ -8017,11 +8129,6 @@ to-arraybuffer@^1.0.0: resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= -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" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= - 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" @@ -8060,13 +8167,6 @@ tough-cookie@>=2.3.3, tough-cookie@^2.3.4: psl "^1.1.28" punycode "^2.1.1" -tough-cookie@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" - integrity sha1-C2GKVWW23qkL80JdBNVe3EdadWE= - dependencies: - punycode "^1.4.1" - tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" @@ -8312,11 +8412,6 @@ uuid@^3.0.1: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA== -uuid@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" - integrity sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g== - uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" @@ -8363,21 +8458,13 @@ w3c-hr-time@^1.0.1: dependencies: browser-process-hrtime "^0.1.2" -walker@~1.0.5: +walker@^1.0.7, walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= dependencies: makeerror "1.0.x" -watch@~0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" - integrity sha1-KAlUdsbffJDJYxOJkMClQj60uYY= - dependencies: - exec-sh "^0.2.0" - minimist "^1.2.0" - watchpack@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" @@ -8569,7 +8656,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.12, which@^1.2.9, which@^1.3.0: +which@^1.2.9, which@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -8613,10 +8700,10 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" - integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA== +write-file-atomic@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" + integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4"