From 4f837baa690860c0424a6635d2c94117126f83f3 Mon Sep 17 00:00:00 2001 From: JRobsonJr Date: Wed, 2 Oct 2019 21:45:15 -0300 Subject: [PATCH 01/21] Update version in package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d964e0e9..c7c0c455 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "Robson Junior (https://github.com/JRobsonJr)" ], "license": "MIT", - "version": "0.3.0", + "version": "0.5.1", "dependencies": { "@types/lodash": "^4.14.121", "axios": "^0.18.1", From 4532877eaeaa622e35b46341fe3f05df76c393a8 Mon Sep 17 00:00:00 2001 From: JRobsonJr Date: Fri, 4 Oct 2019 23:50:52 -0300 Subject: [PATCH 02/21] Encapsulate simple attribute checking in a function --- test/common/matching-attributes.test.ts | 234 +++++++++++++----------- 1 file changed, 125 insertions(+), 109 deletions(-) diff --git a/test/common/matching-attributes.test.ts b/test/common/matching-attributes.test.ts index b3afbf23..e9c33242 100644 --- a/test/common/matching-attributes.test.ts +++ b/test/common/matching-attributes.test.ts @@ -11,106 +11,106 @@ import { CursorBasedPage, PrivateUser, PublicUser, + ArtistSimplified, } from '../../src/lib/models'; +import _ from 'lodash'; + import { AlbumMock } from '../mocks/albums/album.mock'; import { ArtistMock } from '../mocks/artists/artist.mock'; import { TrackMock } from '../mocks/artists/artist-top-tracks.mock'; -export const checkMatchingAlbumAttributes = ( - response: Album, - mock: AlbumMock +export const checkMatchingArtistSimplifiedAttributes = ( + response: ArtistSimplified, + mock: any ) => { - expect(response.albumType).to.be.equal(mock.album_type); - expect(response.artists).to.have.lengthOf(mock.artists.length); - expect(response.availableMarkets).to.be.eql(mock.available_markets); - expect(response.copyrights).to.be.eql(mock.copyrights); - expect(response.externalIds).to.be.eql(mock.external_ids); - expect(response.externalUrls).to.be.eql(mock.external_urls); - expect(response.genres).to.be.eql(mock.genres); - expect(response.href).to.be.equal(mock.href); - expect(response.id).to.be.equal(mock.id); - expect(response.images).to.be.eql(mock.images); - expect(response.label).to.be.equal(mock.label); - expect(response.name).to.be.equal(mock.name); - expect(response.popularity).to.be.equal(mock.popularity); - expect(response.releaseDate).to.be.equal(mock.release_date); - expect(response.releaseDatePrecision).to.be.equal( - mock.release_date_precision - ); - expect(response.totalTracks).to.be.equal(mock.total_tracks); - expect(response.tracks.total).to.be.equal(mock.tracks.total); - expect(response.type).to.be.equal(mock.type); - expect(response.uri).to.be.equal(mock.uri); + const attributes = ['externalUrls', 'href', 'id', 'name', 'type', 'uri']; + checkMatchingObjectAttributes(response, mock, attributes); +}; + +export const checkMatchingAlbumAttributes = (response: Album, mock: any) => { + const attributes = [ + 'copyrights', + 'externalIds', + 'genres', + 'label', + 'popularity', + 'totalTracks', + ]; + checkMatchingObjectAttributes(response, mock, attributes); + checkMatchingAlbumSimplifiedAttributes(response, mock); }; export const checkMatchingAlbumSimplifiedAttributes = ( response: AlbumSimplified, mock: any ) => { - expect(response.albumType).to.be.equal(mock.album_type); - expect(response.artists).to.have.lengthOf(mock.artists.length); - expect(response.externalUrls).to.be.eql(mock.external_urls); - expect(response.href).to.be.equal(mock.href); - expect(response.id).to.be.equal(mock.id); - expect(response.images).to.be.eql(mock.images); - expect(response.name).to.be.equal(mock.name); - expect(response.releaseDate).to.be.equal(mock.release_date); - expect(response.releaseDatePrecision).to.be.equal( - mock.release_date_precision - ); - expect(response.type).to.be.equal(mock.type); - expect(response.uri).to.be.equal(mock.uri); + const attributes = [ + 'albumType', + 'availableMarkets', + 'externalUrls', + 'href', + 'id', + 'images', + 'name', + 'releaseDate', + 'releaseDatePrecision', + 'type', + 'uri', + ]; + checkMatchingObjectAttributes(response, mock, attributes); + checkMatchingArtistArrays(response.artists, mock.artists); }; -export const checkMatchingArtistAttributes = ( - response: Artist, - mock: ArtistMock -) => { - expect(response.externalUrls).to.be.eql(mock.external_urls); - expect(response.followers).to.be.eql(mock.followers); - expect(response.genres).to.be.eql(mock.genres); - expect(response.href).to.be.equal(mock.href); - expect(response.id).to.be.equal(mock.id); - expect(response.images).to.be.eql(mock.images); - expect(response.name).to.be.equal(mock.name); - expect(response.popularity).to.be.equal(mock.popularity); - expect(response.type).to.be.equal(mock.type); - expect(response.uri).to.be.equal(mock.uri); +export const checkMatchingArtistAttributes = (response: Artist, mock: any) => { + const attributes = [ + 'externalUrls', + 'followers', + 'genres', + 'href', + 'id', + 'images', + 'name', + 'popularity', + 'type', + 'uri', + ]; + checkMatchingObjectAttributes(response, mock, attributes); }; -export const checkMatchingTrackAttributes = ( - response: Track, - mock: TrackMock -) => { +export const checkMatchingTrackAttributes = (response: Track, mock: any) => { + const attributes = [ + 'availableMarkets', + 'discNumber', + 'durationMs', + 'explicit', + 'externalIds', + 'externalUrls', + 'href', + 'id', + 'isPlayable', + 'linkedFrom', + 'restrictions', + 'name', + 'popularity', + 'previewUrl', + 'trackNumber', + 'type', + 'uri', + 'isLocal', + ]; + checkMatchingObjectAttributes(response, mock, attributes); checkMatchingAlbumSimplifiedAttributes(response.album, mock.album); - expect(response.artists).to.have.lengthOf(mock.artists.length); - expect(response.discNumber).to.be.equal(mock.disc_number); - expect(response.durationMs).to.be.equal(mock.duration_ms); - expect(response.explicit).to.be.equal(mock.explicit); - expect(response.externalIds).to.be.eql(mock.external_ids); - expect(response.externalUrls).to.be.eql(mock.external_urls); - expect(response.href).to.be.equal(mock.href); - expect(response.id).to.be.equal(mock.id); - expect(response.isLocal).to.be.equal(mock.is_local); - expect(response.isPlayable).to.be.equal(mock.is_playable); - expect(response.name).to.be.equal(mock.name); - expect(response.popularity).to.be.equal(mock.popularity); - expect(response.previewUrl).to.be.equal(mock.preview_url); - expect(response.trackNumber).to.be.equal(mock.track_number); - expect(response.type).to.be.equal(mock.type); - expect(response.uri).to.be.equal(mock.uri); + checkMatchingArtistArrays(response.artists, mock.artists); }; export const checkMatchingPagingObjectAttributes = ( response: Page, mock: any ) => { - expect(response.href).to.be.equal(mock.href); + const attributes = ['href', 'limit', 'offset', 'total']; + checkMatchingObjectAttributes(response, mock, attributes); expect(response.items).to.have.lengthOf(mock.items.length); - expect(response.limit).to.be.equal(mock.limit); - expect(response.offset).to.be.equal(mock.offset); - expect(response.total).to.be.equal(mock.total); }; export const checkMatchingCurrentlyPlayingAttributes = ( @@ -119,65 +119,81 @@ export const checkMatchingCurrentlyPlayingAttributes = ( ) => { if (response.context) checkMatchingContextAttributes(response.context, mock.context); - expect(response.currentlyPlayingType).to.be.equal( - mock.currently_playing_type - ); - expect(response.isPlaying).to.be.equal(mock.is_playing); if (response.item) checkMatchingTrackAttributes(response.item, mock.item); - expect(response.progressMs).to.be.equal(mock.progress_ms); - expect(response.timestamp).to.be.equal(mock.timestamp); + const attributes = [ + 'currentlyPlayingType', + 'isPlaying', + 'progressMs', + 'timestamp', + ]; + checkMatchingObjectAttributes(response, mock, attributes); }; export const checkMatchingContextAttributes = ( response: Context, mock: any ) => { - expect(response.externalUrls).to.be.eql(mock.external_urls); - expect(response.href).to.be.equal(mock.href); - expect(response.type).to.be.equal(mock.type); - expect(response.uri).to.be.equal(mock.uri); + const attributes = ['externalUrls', 'href', 'type', 'uri']; + checkMatchingObjectAttributes(response, mock, attributes); }; export const checkMatchingCursorBasedPageAttributes = ( response: CursorBasedPage, mock: any ) => { - expect(response.cursors).to.be.eql(mock.cursors); - expect(response.href).to.be.equal(mock.href); + const attributes = ['cursors', 'href', 'limit', 'total']; + checkMatchingObjectAttributes(response, mock, attributes); expect(response.items).to.have.lengthOf(mock.items.length); - expect(response.limit).to.be.equal(mock.limit); expect(response.next).to.be.equal(mock.next.split('?')[1]); - expect(response.total).to.be.equal(mock.total); }; export const checkMatchingPrivateUserAttributes = ( response: PrivateUser, mock: any ) => { - expect(response.birthdate).to.be.equal(mock.birthdate); - expect(response.country).to.be.equal(mock.country); - expect(response.displayName).to.be.equal(mock.display_name); - expect(response.email).to.be.equal(mock.email); - expect(response.externalUrls).to.be.eql(mock.external_urls); - expect(response.followers).to.be.eql(mock.followers); - expect(response.href).to.be.equal(mock.href); - expect(response.id).to.be.equal(mock.id); - expect(response.images).to.be.eql(mock.images); - expect(response.product).to.be.equal(mock.product); - expect(response.type).to.be.equal(mock.type); - expect(response.uri).to.be.equal(mock.uri); + const attributes = ['birthdate', 'country', 'email', 'product']; + checkMatchingPublicUserAttributes(response, mock); + checkMatchingObjectAttributes(response, mock, attributes); }; export const checkMatchingPublicUserAttributes = ( response: PublicUser, mock: any ) => { - expect(response.displayName).to.be.equal(mock.display_name); - expect(response.externalUrls).to.be.eql(mock.external_urls); - expect(response.followers).to.be.eql(mock.followers); - expect(response.href).to.be.equal(mock.href); - expect(response.id).to.be.equal(mock.id); - expect(response.images).to.be.eql(mock.images); - expect(response.type).to.be.equal(mock.type); - expect(response.uri).to.be.equal(mock.uri); + const attributes = [ + 'displayName', + 'externalUrls', + 'followers', + 'href', + 'id', + 'images', + 'type', + 'uri', + ]; + checkMatchingObjectAttributes(response, mock, attributes); +}; + +const checkMatchingObjectAttributes = ( + response: any, + mock: any, + attributes: string[] +) => { + for (const responseKey of attributes) { + const mockKey = _.snakeCase(responseKey); + expect(response) + .to.have.property(responseKey) + .that.is.eql(mock[mockKey]); + } +}; + +const checkMatchingArtistArrays = ( + responseArtists: ArtistSimplified[], + mockArtists: any[] +) => { + responseArtists.forEach((responseArtist, index) => + checkMatchingArtistSimplifiedAttributes( + responseArtist, + mockArtists[index] + ) + ); }; From 9eb87bf6c1cafb639260248887a1b4569f583e7e Mon Sep 17 00:00:00 2001 From: JRobsonJr Date: Fri, 4 Oct 2019 23:51:20 -0300 Subject: [PATCH 03/21] Remove mock types --- test/common/matching-attributes.test.ts | 4 ---- test/mocks/albums/album.mock.ts | 2 -- test/mocks/artists/artist-top-tracks.mock.ts | 2 -- test/mocks/artists/artist.mock.ts | 2 -- 4 files changed, 10 deletions(-) diff --git a/test/common/matching-attributes.test.ts b/test/common/matching-attributes.test.ts index e9c33242..3f6f5644 100644 --- a/test/common/matching-attributes.test.ts +++ b/test/common/matching-attributes.test.ts @@ -16,10 +16,6 @@ import { import _ from 'lodash'; -import { AlbumMock } from '../mocks/albums/album.mock'; -import { ArtistMock } from '../mocks/artists/artist.mock'; -import { TrackMock } from '../mocks/artists/artist-top-tracks.mock'; - export const checkMatchingArtistSimplifiedAttributes = ( response: ArtistSimplified, mock: any diff --git a/test/mocks/albums/album.mock.ts b/test/mocks/albums/album.mock.ts index b85eef12..b5e256ad 100644 --- a/test/mocks/albums/album.mock.ts +++ b/test/mocks/albums/album.mock.ts @@ -939,5 +939,3 @@ export const albumMock = { type: 'album', uri: 'spotify:album:2iv4eCuGKJYsso1mDR48dt', }; - -export type AlbumMock = typeof albumMock; diff --git a/test/mocks/artists/artist-top-tracks.mock.ts b/test/mocks/artists/artist-top-tracks.mock.ts index e7afb961..795f148a 100644 --- a/test/mocks/artists/artist-top-tracks.mock.ts +++ b/test/mocks/artists/artist-top-tracks.mock.ts @@ -884,5 +884,3 @@ export const artistTopTracksMock = { }, ], }; - -export type TrackMock = typeof artistTopTracksMock.tracks[0]; diff --git a/test/mocks/artists/artist.mock.ts b/test/mocks/artists/artist.mock.ts index fc93f7b6..e987429b 100644 --- a/test/mocks/artists/artist.mock.ts +++ b/test/mocks/artists/artist.mock.ts @@ -34,5 +34,3 @@ export const artistMock = { type: 'artist', uri: 'spotify:artist:1WgXqy2Dd70QQOU7Ay074N', }; - -export type ArtistMock = typeof artistMock; From cd88bde2372e5d513e94eb4aad93906843b868f0 Mon Sep 17 00:00:00 2001 From: JRobsonJr Date: Sat, 5 Oct 2019 00:04:15 -0300 Subject: [PATCH 04/21] Update lint script to consider test folder --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c7c0c455..534bc4a2 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "scripts": { "start": "ts-node src/start.ts", "build": "rimraf build && tsc && webpack", - "lint": "tslint -c tslint.json 'src/**/*.ts'", + "lint": "tslint -c tslint.json 'src/**/*.ts' 'test/**/*.ts'", "test": "mocha -r ts-node/register test/*.test.ts" }, "husky": { From d257570f47de3ef0b81945742d3e799e8559960e Mon Sep 17 00:00:00 2001 From: JRobsonJr Date: Sat, 5 Oct 2019 00:06:09 -0300 Subject: [PATCH 05/21] Fix lint errors --- test/albums.test.ts | 6 +++--- test/artists.test.ts | 18 +++++++----------- test/common/matching-attributes.test.ts | 7 +++++-- test/tracks.test.ts | 2 +- 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/test/albums.test.ts b/test/albums.test.ts index 48713427..2bdf6618 100644 --- a/test/albums.test.ts +++ b/test/albums.test.ts @@ -1,7 +1,7 @@ import { expect } from 'chai'; import nock from 'nock'; -import { albumMock, AlbumMock } from './mocks/albums/album.mock'; +import { albumMock } from './mocks/albums/album.mock'; import { severalAlbumsMock } from './mocks/albums/several-albums.mock'; import { albumTracksMock } from './mocks/albums/album-tracks.mock'; import { @@ -53,9 +53,9 @@ describe('Album requests', () => { '3dB0bCgmpEgCSr3aU1bOtv', ]); - for (let i = 0; i < severalAlbumsResponse.length; i++) { + for (let i = 0; i < severalAlbumsResponse.length; i += 1) { const albumResponse: Album = severalAlbumsResponse[i]; - const albumMock: AlbumMock = severalAlbumsMock.albums[i]; + const albumMock: any = severalAlbumsMock.albums[i]; checkMatchingAlbumAttributes(albumResponse, albumMock); } }); diff --git a/test/artists.test.ts b/test/artists.test.ts index 768dd108..1c2cba48 100644 --- a/test/artists.test.ts +++ b/test/artists.test.ts @@ -1,13 +1,10 @@ import nock from 'nock'; -import { artistMock, ArtistMock } from './mocks/artists/artist.mock'; +import { artistMock } from './mocks/artists/artist.mock'; import { severalArtistsMock } from './mocks/artists/several-artists.mock'; import { artistAlbumsMock } from './mocks/artists/artist-albums.mock'; import { artistRelatedArtistsMock } from './mocks/artists/artist-related-artists.mock'; -import { - artistTopTracksMock, - TrackMock, -} from './mocks/artists/artist-top-tracks.mock'; +import { artistTopTracksMock } from './mocks/artists/artist-top-tracks.mock'; import { checkMatchingArtistAttributes, checkMatchingPagingObjectAttributes, @@ -59,7 +56,7 @@ describe('Artist requests', () => { '1WgXqy2Dd70QQOU7Ay074N', ]); - for (let i = 0; i < severalArtistsResponse.length; i++) { + for (let i = 0; i < severalArtistsResponse.length; i += 1) { const artistResponse = severalArtistsResponse[i]; const artistMock = severalArtistsMock.artists[i]; checkMatchingArtistAttributes(artistResponse, artistMock); @@ -99,10 +96,9 @@ describe('Artist requests', () => { '1WgXqy2Dd70QQOU7Ay074N' ); - for (let i = 0; i < artistRelatedArtistsResponse.length; i++) { + for (let i = 0; i < artistRelatedArtistsResponse.length; i += 1) { const artistResponse: Artist = artistRelatedArtistsResponse[i]; - const artistMock: ArtistMock = - artistRelatedArtistsMock.artists[i]; + const artistMock: any = artistRelatedArtistsMock.artists[i]; checkMatchingArtistAttributes(artistResponse, artistMock); } }); @@ -122,9 +118,9 @@ describe('Artist requests', () => { 'BR' ); - for (let i = 0; i < artistTopTracksResponse.length; i++) { + for (let i = 0; i < artistTopTracksResponse.length; i += 1) { const topTrackResponse: Track = artistTopTracksResponse[i]; - const topTrackMock: TrackMock = artistTopTracksMock.tracks[i]; + const topTrackMock = artistTopTracksMock.tracks[i]; checkMatchingTrackAttributes(topTrackResponse, topTrackMock); } }); diff --git a/test/common/matching-attributes.test.ts b/test/common/matching-attributes.test.ts index 3f6f5644..6ee3f226 100644 --- a/test/common/matching-attributes.test.ts +++ b/test/common/matching-attributes.test.ts @@ -113,9 +113,12 @@ export const checkMatchingCurrentlyPlayingAttributes = ( response: CurrentlyPlaying, mock: any ) => { - if (response.context) + if (response.context) { checkMatchingContextAttributes(response.context, mock.context); - if (response.item) checkMatchingTrackAttributes(response.item, mock.item); + } + if (response.item) { + checkMatchingTrackAttributes(response.item, mock.item); + } const attributes = [ 'currentlyPlayingType', 'isPlaying', diff --git a/test/tracks.test.ts b/test/tracks.test.ts index 45497036..d1fdfd62 100644 --- a/test/tracks.test.ts +++ b/test/tracks.test.ts @@ -41,7 +41,7 @@ describe('Track requests', () => { it('response should match all tracks attributes', async () => { const tracksResponse = await getSeveralTracks(tracks, params); - for (let i = 0; i < tracksResponse.length; i++) { + for (let i = 0; i < tracksResponse.length; i += 1) { const trackResponse = tracksResponse[i]; const trackMock = severalTracksMock.tracks[i]; checkMatchingTrackAttributes(trackResponse, trackMock); From 181a8c4e4e95ed0b39fb0f181b5357b4d1bccab9 Mon Sep 17 00:00:00 2001 From: JRobsonJr Date: Sat, 5 Oct 2019 21:45:22 -0300 Subject: [PATCH 06/21] Add Istanbul CLI --- package.json | 1 + yarn.lock | 607 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 601 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 534bc4a2..30c65616 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "husky": "^1.1.2", "mocha": "^5.2.0", "nock": "^10.0.2", + "nyc": "^14.1.1", "prettier": "^1.14.3", "pretty-quick": "^1.8.0", "rimraf": "^2.6.2", diff --git a/yarn.lock b/yarn.lock index 0ee36088..9592ebe0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,93 @@ # yarn lockfile v1 +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" + integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/generator@^7.4.0", "@babel/generator@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.2.tgz#dac8a3c2df118334c2a29ff3446da1636a8f8c03" + integrity sha512-j8iHaIW4gGPnViaIHI7e9t/Hl8qLjERI6DcV9kEpAIDJsAOrcnXqRS7t+QbhL76pwbtqP+QCQLL0z1CyVmtjjQ== + dependencies: + "@babel/types" "^7.6.0" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" + integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/highlight@^7.0.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" + integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.4.3", "@babel/parser@^7.6.0", "@babel/parser@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.2.tgz#205e9c95e16ba3b8b96090677a67c9d6075b70a1" + integrity sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg== + +"@babel/template@^7.1.0", "@babel/template@^7.4.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" + integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.6.0" + "@babel/types" "^7.6.0" + +"@babel/traverse@^7.4.3": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.2.tgz#b0e2bfd401d339ce0e6c05690206d1e11502ce2c" + integrity sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.6.2" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.6.2" + "@babel/types" "^7.6.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/types@^7.0.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.6.0": + version "7.6.1" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.1.tgz#53abf3308add3ac2a2884d539151c57c4b3ac648" + integrity sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + "@fimbul/bifrost@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@fimbul/bifrost/-/bifrost-0.11.0.tgz#83cacc21464198b12e3cc1c2204ae6c6d7afd158" @@ -243,12 +330,17 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= -ansi-styles@^3.2.1: +ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -263,11 +355,23 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" +append-transform@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" + integrity sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw== + dependencies: + default-require-extensions "^2.0.0" + aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= + are-we-there-yet@~1.1.2: version "1.1.5" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" @@ -560,11 +664,26 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +caching-transform@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-3.0.2.tgz#601d46b91eca87687a281e71cef99791b0efca70" + integrity sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w== + dependencies: + hasha "^3.0.0" + make-dir "^2.0.0" + package-hash "^3.0.0" + write-file-atomic "^2.4.2" + camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + chai@^4.1.2, chai@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" @@ -588,6 +707,15 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/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" + chalk@^2.3.0, chalk@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" @@ -666,6 +794,15 @@ cliui@^4.0.0: strip-ansi "^4.0.0" wrap-ansi "^2.0.0" +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" @@ -706,6 +843,11 @@ commander@~2.13.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== +commander@~2.20.0: + version "2.20.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.1.tgz#3863ce3ca92d0831dcf2a102f5fb4b5926afd0f9" + integrity sha512-cCuLsMhJeWQ/ZpsFTbE765kvVfoeSddc4nU3up4fV+fDBcfUXnbITJ+JzhkdjzOqhURjZgujxaioam4RM9yGUg== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -748,6 +890,13 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= +convert-source-map@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" + copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" @@ -779,6 +928,17 @@ cosmiconfig@^5.0.6: js-yaml "^3.9.0" parse-json "^4.0.0" +cp-file@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-6.2.0.tgz#40d5ea4a1def2a9acdd07ba5c0b0246ef73dc10d" + integrity sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA== + dependencies: + graceful-fs "^4.1.2" + make-dir "^2.0.0" + nested-error-stacks "^2.0.0" + pify "^4.0.1" + safe-buffer "^5.0.1" + create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" @@ -810,6 +970,14 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" +cross-spawn@^4: + version "4.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" + integrity sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE= + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -878,6 +1046,18 @@ debug@^4.1.0: dependencies: ms "^2.1.1" +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== + dependencies: + ms "^2.1.1" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + decamelize@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" @@ -907,6 +1087,13 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +default-require-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" + integrity sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc= + dependencies: + strip-bom "^3.0.0" + define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" @@ -997,6 +1184,11 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" @@ -1032,6 +1224,11 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +es6-error@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -1195,6 +1392,15 @@ find-cache-dir@^1.0.0: make-dir "^1.0.0" pkg-dir "^2.0.0" +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -1229,6 +1435,14 @@ for-in@^1.0.2: resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= +foreground-child@^1.5.6: + version "1.5.6" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" + integrity sha1-T9ca0t/elnibmApcCilZN8svXOk= + dependencies: + cross-spawn "^4" + signal-exit "^3.0.0" + fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -1293,6 +1507,11 @@ get-caller-file@^1.0.1, get-caller-file@^1.0.2: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-func-name@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" @@ -1345,21 +1564,54 @@ glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.3: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-modules-path@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.0.tgz#b0e2bac6beac39745f7db5c59d26a36a0b94f7dc" integrity sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag== +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + graceful-fs@^4.1.11, graceful-fs@^4.1.2: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== +graceful-fs@^4.1.15: + version "4.2.2" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02" + integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== + growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== +handlebars@^4.1.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.4.2.tgz#8810a9821a9d6d52cb2f57d326d6ce7c3dfe741d" + integrity sha512-cIv17+GhL8pHHnRJzGu2wwcthL5sb8uDKBHvZ2Dtu5s1YNt0ljbzKbamnc+gr69y7bzwQiBdr5+hOpRd5pnOdg== + dependencies: + neo-async "^2.6.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -1424,6 +1676,13 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hasha@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-3.0.0.tgz#52a32fab8569d41ca69a61ff1a214f8eb7c8bd39" + integrity sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk= + dependencies: + is-stream "^1.0.1" + he@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" @@ -1693,7 +1952,7 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-stream@^1.1.0: +is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -1730,12 +1989,69 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +istanbul-lib-coverage@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" + integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== + +istanbul-lib-hook@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz#c95695f383d4f8f60df1f04252a9550e15b5b133" + integrity sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA== + dependencies: + append-transform "^1.0.0" + +istanbul-lib-instrument@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" + integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== + dependencies: + "@babel/generator" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + istanbul-lib-coverage "^2.0.5" + semver "^6.0.0" + +istanbul-lib-report@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" + integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== + dependencies: + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + supports-color "^6.1.0" + +istanbul-lib-source-maps@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" + integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + rimraf "^2.6.3" + source-map "^0.6.1" + +istanbul-reports@^2.2.4: + version "2.2.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.6.tgz#7b4f2660d82b29303a8fe6091f8ca4bf058da1af" + integrity sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA== + dependencies: + handlebars "^4.1.2" + js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@^3.7.0, js-yaml@^3.9.0: +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1, js-yaml@^3.7.0, js-yaml@^3.9.0: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -1743,6 +2059,11 @@ js-yaml@^3.7.0, js-yaml@^3.9.0: argparse "^1.0.7" esprima "^4.0.0" +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -1794,6 +2115,16 @@ lcid@^2.0.0: dependencies: invert-kv "^2.0.0" +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + loader-runner@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.1.tgz#026f12fe7c3115992896ac02ba022ba92971b979" @@ -1829,6 +2160,11 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= +lodash.flattendeep@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= + lodash@^4.17.13, lodash@^4.17.5: version "4.17.13" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.13.tgz#0bdc3a6adc873d2f4e0c4bac285df91b64fc7b93" @@ -1849,6 +2185,14 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + make-error@^1.1.1: version "1.3.5" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" @@ -1899,6 +2243,13 @@ memory-fs@^0.4.0, memory-fs@~0.4.1: errno "^0.1.3" readable-stream "^2.0.1" +merge-source-map@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== + dependencies: + source-map "^0.6.1" + micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -1958,6 +2309,11 @@ minimist@^1.2.0: resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + minipass@^2.2.1, minipass@^2.3.4: version "2.3.5" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" @@ -2084,6 +2440,16 @@ neo-async@^2.5.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== +neo-async@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +nested-error-stacks@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz#0fbdcf3e13fe4994781280524f8b96b0cdff9c61" + integrity sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug== + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -2209,6 +2575,37 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= +nyc@^14.1.1: + version "14.1.1" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-14.1.1.tgz#151d64a6a9f9f5908a1b73233931e4a0a3075eeb" + integrity sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw== + dependencies: + archy "^1.0.0" + caching-transform "^3.0.2" + convert-source-map "^1.6.0" + cp-file "^6.2.0" + find-cache-dir "^2.1.0" + find-up "^3.0.0" + foreground-child "^1.5.6" + glob "^7.1.3" + istanbul-lib-coverage "^2.0.5" + istanbul-lib-hook "^2.0.7" + istanbul-lib-instrument "^3.3.0" + istanbul-lib-report "^2.0.8" + istanbul-lib-source-maps "^3.0.6" + istanbul-reports "^2.2.4" + js-yaml "^3.13.1" + make-dir "^2.1.0" + merge-source-map "^1.1.0" + resolve-from "^4.0.0" + rimraf "^2.6.3" + signal-exit "^3.0.2" + spawn-wrap "^1.4.2" + test-exclude "^5.2.3" + uuid "^3.3.2" + yargs "^13.2.2" + yargs-parser "^13.0.0" + object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -2244,12 +2641,20 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= -os-homedir@^1.0.0: +os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= @@ -2329,6 +2734,16 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== +package-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-3.0.0.tgz#50183f2d36c9e3e528ea0a8605dff57ce976f88e" + integrity sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA== + dependencies: + graceful-fs "^4.1.15" + hasha "^3.0.0" + lodash.flattendeep "^4.4.0" + release-zalgo "^1.0.0" + pako@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" @@ -2397,6 +2812,13 @@ path-parse@^1.0.5: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + pathval@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" @@ -2418,6 +2840,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.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" @@ -2574,6 +3001,23 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + read-pkg@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" @@ -2618,6 +3062,13 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +release-zalgo@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" + integrity sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA= + dependencies: + es6-error "^4.0.1" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -2643,6 +3094,11 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" @@ -2655,6 +3111,11 @@ resolve-from@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" integrity sha1-six699nWiBvItuZTM17rywoYh0g= +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -2679,6 +3140,13 @@ rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: dependencies: glob "^7.0.5" +rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -2739,6 +3207,16 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== +semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + serialize-javascript@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" @@ -2794,7 +3272,7 @@ shebang-regex@^1.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -signal-exit@^3.0.0: +signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= @@ -2863,7 +3341,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.6: +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= @@ -2873,6 +3351,18 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +spawn-wrap@^1.4.2: + version "1.4.3" + resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.4.3.tgz#81b7670e170cca247d80bf5faf0cfb713bdcf848" + integrity sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw== + dependencies: + foreground-child "^1.5.6" + mkdirp "^0.5.0" + os-homedir "^1.0.1" + rimraf "^2.6.2" + signal-exit "^3.0.2" + which "^1.3.0" + spdx-correct@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e" @@ -2975,6 +3465,15 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + string_decoder@^1.0.0, string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -2996,6 +3495,18 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.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" @@ -3025,6 +3536,13 @@ supports-color@^5.3.0, supports-color@^5.5.0: dependencies: has-flag "^3.0.0" +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + tapable@^1.0.0, tapable@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.0.tgz#0d076a172e3d9ba088fd2272b2668fb8d194b78c" @@ -3043,6 +3561,16 @@ tar@^4: safe-buffer "^5.1.2" yallist "^3.0.2" +test-exclude@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" + integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^2.0.0" + through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -3063,6 +3591,11 @@ 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@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -3218,6 +3751,14 @@ uglify-es@^3.3.4: commander "~2.13.0" source-map "~0.6.1" +uglify-js@^3.1.4: + version "3.6.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5" + integrity sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg== + dependencies: + commander "~2.20.0" + source-map "~0.6.1" + uglifyjs-webpack-plugin@^1.2.4: version "1.3.0" resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de" @@ -3313,6 +3854,11 @@ util@^0.10.3: dependencies: inherits "2.0.3" +uuid@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" + integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== + v8-compile-cache@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c" @@ -3401,7 +3947,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.9: +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== @@ -3415,6 +3961,11 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + worker-farm@^1.5.2: version "1.6.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" @@ -3430,11 +3981,29 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +write-file-atomic@^2.4.2: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + xregexp@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" @@ -3467,6 +4036,14 @@ yargs-parser@^10.1.0: dependencies: camelcase "^4.1.0" +yargs-parser@^13.0.0, yargs-parser@^13.1.1: + version "13.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs@^12.0.2: version "12.0.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" @@ -3485,6 +4062,22 @@ yargs@^12.0.2: y18n "^3.2.1 || ^4.0.0" yargs-parser "^10.1.0" +yargs@^13.2.2: + version "13.3.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" + integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.1" + yn@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" From 574231323a886e1d9cc8e3461abea073771bd786 Mon Sep 17 00:00:00 2001 From: JRobsonJr Date: Sat, 5 Oct 2019 21:46:28 -0300 Subject: [PATCH 07/21] Add Istanbul-related folders to .gitignore --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 528267e2..a080973f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ node_modules/ .vscode/ -build/ \ No newline at end of file +build/ +coverage/ +.nyc_output/ \ No newline at end of file From d7659d1605d38d68b5f2568cbda332270e4ac749 Mon Sep 17 00:00:00 2001 From: JRobsonJr Date: Sat, 5 Oct 2019 21:46:51 -0300 Subject: [PATCH 08/21] Configure Istanbul to run with TypeScript --- package.json | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 30c65616..26b939bc 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,21 @@ "start": "ts-node src/start.ts", "build": "rimraf build && tsc && webpack", "lint": "tslint -c tslint.json 'src/**/*.ts' 'test/**/*.ts'", - "test": "mocha -r ts-node/register test/*.test.ts" + "test": "mocha -r ts-node/register test/*.test.ts", + "test-with-coverage": "nyc --reporter=html mocha -r ts-node/register test/*.test.ts" + }, + "nyc": { + "extension": [ + ".ts", + ".tsx" + ], + "exclude": [ + "**/*.d.ts" + ], + "reporter": [ + "html" + ], + "all": true }, "husky": { "hooks": { From 644d8adf1c6bc7f997ce109582632796c98c2fbf Mon Sep 17 00:00:00 2001 From: JRobsonJr Date: Sat, 5 Oct 2019 22:01:59 -0300 Subject: [PATCH 09/21] Add Istanbul-related and test folders to .gitignore --- .npmignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.npmignore b/.npmignore index 5c14c660..b4abd623 100644 --- a/.npmignore +++ b/.npmignore @@ -1,5 +1,8 @@ .vscode/ src/ +coverage/ +.nyc_output/ +test/ .prettierrc .prettierignore webpack.config.js From 8b1baf1494464834bc562cab22b0846a315e7274 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Renan?= Date: Fri, 25 Oct 2019 11:12:10 -0300 Subject: [PATCH 10/21] Fix problem with start/resume user playback --- src/lib/player.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/player.ts b/src/lib/player.ts index 2fbb912e..3fcada1b 100644 --- a/src/lib/player.ts +++ b/src/lib/player.ts @@ -110,7 +110,7 @@ export const startUserPlayback = async (params?: { positionMs?: number; }) => { const queryParams = propertiesToSnakeCase(_.pick(params, 'deviceId')); - const bodyParams = propertiesToSnakeCase(_.omit(params, 'deviceId')); + const bodyParams = propertiesToSnakeCase(_.omit(params, 'deviceId'), true); const response = await getAxiosSpotifyInstance().put( '/me/player/play', bodyParams, From 3a8b7ec678248dadc5e9bbb8e264cbd252a867f0 Mon Sep 17 00:00:00 2001 From: JRobsonJr Date: Sun, 27 Oct 2019 12:12:39 -0300 Subject: [PATCH 11/21] Create a changelog --- CHANGELOG.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..be4bf98f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,30 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +### Added + +- Instanbul CLI to generate test coverage reports. + +### Changed + +- Simplify tests for checking matching attributes between API responses and the objects generated from custom classes. +- Consider tests when linting. + +### Fixed + +- Fix a bug with the start/resume user playback request. + +## [0.5.1] - 2019-10-02 + +### Fixed + +- Fix a pagination bug when subsequent API calls are made. + +### Security + +- Update the versions of several dependencies. From 12e44b871ab42b0eac31043341cd351e4e7f725c Mon Sep 17 00:00:00 2001 From: JRobsonJr Date: Sun, 27 Oct 2019 19:55:31 -0300 Subject: [PATCH 12/21] Create PR template --- .github/pull_request_template.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..146f8c3c --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,11 @@ +# Description + + + +## Type of change + +Please, add an X to each checkbox that applies to the changes made in this PR. + +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) From 2ae247769b79735e91adf1afa73b1dbc35b27473 Mon Sep 17 00:00:00 2001 From: JRobsonJr Date: Sun, 27 Oct 2019 19:58:35 -0300 Subject: [PATCH 13/21] Update year in LICENSE --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index d21b8af7..8731e8f7 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2018 calluswhatyouwant +Copyright (c) 2019 calluswhatyouwant Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From d0678a2eeaebb206203dcecb6086b8c19b218461 Mon Sep 17 00:00:00 2001 From: JRobsonJr Date: Sun, 27 Oct 2019 20:08:01 -0300 Subject: [PATCH 14/21] Create CONTRIBUTING file --- CONTRIBUTING.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..8484aff0 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,31 @@ +# Contributing to spotify-web-sdk + +So apparently you want to contribute with our project or you stumbled upon this file at random. Welcome, anyway! + +Before anything else, please note that we have a [Code of Conduct](.github/CODE_OF_CONDUCT.md), which we expect to be strictly respected. + +## Tests + +Our tests are currently written with [nock](https://github.com/nock/nock) + [Chai](https://www.chaijs.com/) + [Mocha](https://mochajs.org/). All tests are placed under the `test` folder, and there is (or should be) one `name.test.ts` file for each `name.ts` file under the root of `src/lib`. + +Our current implementation of tests uses nock for mocking HTTP request responses, so the tests work similarly. Reading one of them might be the best way to understand how the process works. + +In the future, edge cases and other strategies should be considered to build a stronger test environment. + +## Documentation + +This project is still lacking a lot documentation-wise; we rely on the [Spotify Web API documentation](https://developer.spotify.com/documentation/web-api/), but we think it's important to bring it closer to the code in the near future. + +## Implementation + +Currently, we're successfully covering all possible endpoints in the Spotify Web API! However, we can certainly improve our code further! + +## Styleguide + +We use `tslint` to check if everything is tidy around here; because of `prettier`, which is run every time before a commit is completed, you shouldn't have to worry a lot about our styles. However, we encourage you to always write the best code you can! + +Our continuous integration setup runs `tslint` and it'll break if there are remaining errors. Run `yarn lint` to check for errors and fix them before you send a PR! + +## Creating a PR + +We have a simple PR template that should appear once you create a PR. Try to be the most descriptive you can when creating your PR so that we have an easier and more complete overview of what you've made. Thank you for contributing to our project! From 36315cabd75a2f06bfd4333395154da26ba4ef05 Mon Sep 17 00:00:00 2001 From: JRobsonJr Date: Sun, 27 Oct 2019 20:08:33 -0300 Subject: [PATCH 15/21] Update README.md with the link to our CONTRIBUTING --- README.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index cd3d1adb..a930c68b 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,12 @@ Even though I'm not certain you thought that right now, here's how to get starte ## Installation +Using Yarn: + +```sh +yarn add spotify-web-sdk +``` + Using NPM: ```sh @@ -93,13 +99,11 @@ Please, note that we have a [Code of Conduct](.github/CODE_OF_CONDUCT.md), which ### Suggest a new feature or report a bug -Check our [issue templates](.github/ISSUE_TEMPLATE). +If you notice any other bugs or you have any ideas to improve our SDK, feel free to create an issue. We'll be more than happy to discuss it! Check our [issue templates](.github/ISSUE_TEMPLATE). ### Do it yourself -We're working on a CONTRIBUTING file and PR template. -In the meantime, you can already create PRs, especially to help us create the requests that are still missing and test the ones we have implemented. -Check [#21](/issues/21) for a list of GET endpoints we haven't got covered yet. +Check out our [CONTRIBUTING](./CONTRIBUTING.md) file! ### Maintainers @@ -113,4 +117,4 @@ Made with [hall-of-fame](https://github.com/sourcerer-io/hall-of-fame). ## License -MIT +[MIT](./LICENSE) From e594df224d9a2320b557f9e09563d09b9ff882b9 Mon Sep 17 00:00:00 2001 From: JRobsonJr Date: Sun, 27 Oct 2019 20:13:25 -0300 Subject: [PATCH 16/21] Update CONTRIBUTING with branch information --- CONTRIBUTING.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8484aff0..1e69e528 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -28,4 +28,8 @@ Our continuous integration setup runs `tslint` and it'll break if there are rema ## Creating a PR -We have a simple PR template that should appear once you create a PR. Try to be the most descriptive you can when creating your PR so that we have an easier and more complete overview of what you've made. Thank you for contributing to our project! +We have a simple PR template that should appear once you create a PR. Try to be the most descriptive you can when creating your PR so that we have an easier and more complete overview of what you've made. + +Be aware that all PRs should be made to the most recent version branch (currently, `v0.5.x`). Only the repository maintainers can send PRs straight to the `master` branch, as it reflects on the most recent version published to npm. + +Thank you for contributing to our project! From 5013bd8d2f5cf324028d9d4e73e4c158ef83842e Mon Sep 17 00:00:00 2001 From: JRobsonJr Date: Sun, 27 Oct 2019 22:34:28 -0300 Subject: [PATCH 17/21] Fix failing test --- test/player.test.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/player.test.ts b/test/player.test.ts index bdb015a9..0b33332a 100644 --- a/test/player.test.ts +++ b/test/player.test.ts @@ -135,8 +135,10 @@ describe('Player requests', () => { nock('https://api.spotify.com/v1') .put('/me/player/play', { context_uri: 'spotify:album:1Je1IMUlBXcx1Fz0WE7oPT', - uris: - 'spotify:track:4iV5W9uYEdYUVa79Axb7Rh,spotify:track:1301WleyT98MSxVHPZCA6M', + uris: [ + 'spotify:track:4iV5W9uYEdYUVa79Axb7Rh', + 'spotify:track:1301WleyT98MSxVHPZCA6M', + ], offset: { position: 5 }, position_ms: 1234, }) From af784135d5c84397de5ee3bd188082aeeca51ef7 Mon Sep 17 00:00:00 2001 From: JRobsonJr Date: Sun, 27 Oct 2019 22:46:30 -0300 Subject: [PATCH 18/21] Update matching attributes tests with the generic function --- test/common/matching-attributes.test.ts | 54 ++++++++++++------------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/test/common/matching-attributes.test.ts b/test/common/matching-attributes.test.ts index e6285d85..168c68ea 100644 --- a/test/common/matching-attributes.test.ts +++ b/test/common/matching-attributes.test.ts @@ -108,23 +108,26 @@ export const checkMatchingTrackSimplifiedAttributes = ( response: TrackSimplified, mock: any ) => { - expect(response.artists).to.have.lengthOf(mock.artists.length); - expect(response.availableMarkets).to.be.eql(mock.available_markets); - expect(response.discNumber).to.be.equal(mock.disc_number); - expect(response.durationMs).to.be.equal(mock.duration_ms); - expect(response.explicit).to.be.equal(mock.explicit); - expect(response.externalUrls).to.be.eql(mock.external_urls); - expect(response.href).to.be.equal(mock.href); - expect(response.id).to.be.equal(mock.id); - expect(response.isPlayable).to.be.equal(mock.is_playable); - expect(response.linkedFrom).to.be.eql(mock.linked_from); - expect(response.restrictions).to.be.eql(mock.restrictions); - expect(response.name).to.be.equal(mock.name); - expect(response.previewUrl).to.be.equal(mock.preview_url); - expect(response.trackNumber).to.be.equal(mock.track_number); - expect(response.type).to.be.equal(mock.type); - expect(response.uri).to.be.equal(mock.uri); - expect(response.isLocal).to.be.equal(mock.is_local); + const attributes = [ + 'availableMarkets', + 'discNumber', + 'durationMs', + 'explicit', + 'externalUrls', + 'href', + 'id', + 'isPlayable', + 'linkedFrom', + 'restrictions', + 'name', + 'previewUrl', + 'trackNumber', + 'type', + 'uri', + 'isLocal', + ]; + checkMatchingObjectAttributes(response, mock, attributes); + checkMatchingArtistArrays(response.artists, mock.artists); }; export const checkMatchingPagingObjectAttributes = ( @@ -228,30 +231,25 @@ export const checkMatchingCategoryAttributes = ( response: Category, mock: any ) => { - expect(response.href).to.be.equal(mock.href); - expect(response.icons).to.be.eql(mock.icons); - expect(response.id).to.be.equal(mock.id); - expect(response.name).to.be.equal(mock.name); + const attributes = ['href', 'icons', 'id', 'name']; + checkMatchingObjectAttributes(response, mock, attributes); }; export const checkMatchingRecommendationSeedAttributes = ( response: RecommendationSeed, mock: any ) => { + const attributes = ['href', 'id', 'type']; + checkMatchingObjectAttributes(response, mock, attributes); expect(response.initialPoolSize).to.be.equal(mock.initialPoolSize); expect(response.afterFilteringSize).to.be.equal(mock.afterFilteringSize); expect(response.afterRelinkingSize).to.be.equal(mock.afterRelinkingSize); - expect(response.href).to.be.equal(mock.href); - expect(response.id).to.be.equal(mock.id); - expect(response.type).to.be.equal(mock.type); }; export const checkMatchingPlaylistAttributes = ( response: Category, mock: any ) => { - expect(response.href).to.be.equal(mock.href); - expect(response.icons).to.be.eql(mock.icons); - expect(response.id).to.be.equal(mock.id); - expect(response.name).to.be.equal(mock.name); + const attributes = ['href', 'icons', 'id', 'name']; + checkMatchingObjectAttributes(response, mock, attributes); }; From f6f731839043cf75495e62071e088841772e44e1 Mon Sep 17 00:00:00 2001 From: JRobsonJr Date: Sun, 27 Oct 2019 22:48:24 -0300 Subject: [PATCH 19/21] Update to v0.5.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 26b939bc..7993d2a5 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "Robson Junior (https://github.com/JRobsonJr)" ], "license": "MIT", - "version": "0.5.1", + "version": "0.5.2", "dependencies": { "@types/lodash": "^4.14.121", "axios": "^0.18.1", From b6a0d549af6489e5cc416b632b91ae3ae3b5ca98 Mon Sep 17 00:00:00 2001 From: JRobsonJr Date: Sun, 27 Oct 2019 22:50:52 -0300 Subject: [PATCH 20/21] Update CHANGELOG with changes from v0.5.2 --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index be4bf98f..234bb328 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,9 +6,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +## [0.5.2] - 2019-10-27 + ### Added - Instanbul CLI to generate test coverage reports. +- Create CHANGELOG, CONTRIBUTING and PR template. ### Changed From 918bee02d380a93f33b746e20276a7732f20cf0a Mon Sep 17 00:00:00 2001 From: JRobsonJr Date: Sun, 27 Oct 2019 23:50:30 -0300 Subject: [PATCH 21/21] Fix lint errors --- test/browse.test.ts | 4 ++-- test/follow.test.ts | 2 +- test/library.test.ts | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/test/browse.test.ts b/test/browse.test.ts index e9e17f9d..7b1438b7 100644 --- a/test/browse.test.ts +++ b/test/browse.test.ts @@ -141,7 +141,7 @@ describe('Browse requests', () => { it('response should match all tracks attributes', async () => { const recommendationsResponse = await getRecommendations(params); - for (let i = 0; i < recommendationsResponse.tracks.length; i++) { + for (let i = 0; i < recommendationsResponse.tracks.length; i += 1) { const trackResponse = recommendationsResponse.tracks[i]; const trackMock = recommendationsMock.tracks[i]; checkMatchingTrackSimplifiedAttributes( @@ -153,7 +153,7 @@ describe('Browse requests', () => { it('response should match all seeds attributes', async () => { const recommendationsResponse = await getRecommendations(params); - for (let i = 0; i < recommendationsResponse.seeds.length; i++) { + for (let i = 0; i < recommendationsResponse.seeds.length; i += 1) { const seedResponse = recommendationsResponse.seeds[i]; const seedMock = recommendationsMock.seeds[i]; checkMatchingRecommendationSeedAttributes( diff --git a/test/follow.test.ts b/test/follow.test.ts index 8a63d46f..754a8e6a 100644 --- a/test/follow.test.ts +++ b/test/follow.test.ts @@ -65,7 +65,7 @@ describe('Follow requests', () => { const followedArtistsResponse = await getFollowedArtists({ limit: 20, }); - for (let i = 0; i < followedArtistsResponse.length; i++) { + for (let i = 0; i < followedArtistsResponse.length; i += 1) { const artistResponse = followedArtistsResponse[i]; const artistMock = followedArtistsMock.artists.items[i]; checkMatchingArtistAttributes(artistResponse, artistMock); diff --git a/test/library.test.ts b/test/library.test.ts index 9218f6fa..e1b26fe2 100644 --- a/test/library.test.ts +++ b/test/library.test.ts @@ -78,7 +78,7 @@ describe('Library requests', () => { it('response should match all album attributes', async () => { const savedAlbumsResponse = await getCurrentUserSavedAlbums(); - for (let i = 0; i < savedAlbumsResponse.items.length; i++) { + for (let i = 0; i < savedAlbumsResponse.items.length; i += 1) { const albumResponse: SavedAlbum = savedAlbumsResponse.items[i]; const albumMock = savedAlbumsMock.items[i].album; checkMatchingAlbumAttributes(albumResponse.album, albumMock); @@ -87,7 +87,7 @@ describe('Library requests', () => { it('response should match custom attributes', async () => { const savedAlbumsResponse = await getCurrentUserSavedAlbums(); - for (let i = 0; i < savedAlbumsResponse.items.length; i++) { + for (let i = 0; i < savedAlbumsResponse.items.length; i += 1) { const albumResponse: SavedAlbum = savedAlbumsResponse.items[i]; const savedAlbumMock = savedAlbumsMock.items[i]; expect(albumResponse.addedAt).to.be.equal( @@ -114,7 +114,7 @@ describe('Library requests', () => { it('response should match all track attributes', async () => { const savedTracksResponse = await getCurrentUserSavedTracks(); - for (let i = 0; i < savedTracksResponse.items.length; i++) { + for (let i = 0; i < savedTracksResponse.items.length; i += 1) { const trackResponse: SavedTrack = savedTracksResponse.items[i]; const trackMock = savedTracksMock.items[i].track; checkMatchingTrackAttributes(trackResponse.track, trackMock); @@ -123,7 +123,7 @@ describe('Library requests', () => { it('response should match custom attributes', async () => { const savedTracksResponse = await getCurrentUserSavedTracks(); - for (let i = 0; i < savedTracksResponse.items.length; i++) { + for (let i = 0; i < savedTracksResponse.items.length; i += 1) { const trackResponse: SavedTrack = savedTracksResponse.items[i]; const savedTrackMock = savedTracksMock.items[i]; expect(trackResponse.addedAt).to.be.equal(