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) diff --git a/.gitignore b/.gitignore index 61109252..d37a1c62 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ node_modules/ .vscode/ build/ +coverage/ +.nyc_output/ package-lock.json 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 diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..234bb328 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,33 @@ +# 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] + +## [0.5.2] - 2019-10-27 + +### Added + +- Instanbul CLI to generate test coverage reports. +- Create CHANGELOG, CONTRIBUTING and PR template. + +### 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. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..1e69e528 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,35 @@ +# 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. + +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! 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 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) diff --git a/package.json b/package.json index d964e0e9..7993d2a5 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.2", "dependencies": { "@types/lodash": "^4.14.121", "axios": "^0.18.1", @@ -19,8 +19,22 @@ "scripts": { "start": "ts-node src/start.ts", "build": "rimraf build && tsc && webpack", - "lint": "tslint -c tslint.json 'src/**/*.ts'", - "test": "mocha -r ts-node/register test/*.test.ts" + "lint": "tslint -c tslint.json 'src/**/*.ts' '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": { @@ -40,6 +54,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/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, 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/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/common/matching-attributes.test.ts b/test/common/matching-attributes.test.ts index 37a535e1..168c68ea 100644 --- a/test/common/matching-attributes.test.ts +++ b/test/common/matching-attributes.test.ts @@ -13,230 +13,243 @@ import { CursorBasedPage, PrivateUser, PublicUser, + ArtistSimplified, Category, RecommendationSeed, } from '../../src/lib/models'; -import { AlbumMock } from '../mocks/albums/album.mock'; -import { ArtistMock } from '../mocks/artists/artist.mock'; -import { TrackMock } from '../mocks/artists/artist-top-tracks.mock'; +import _ from 'lodash'; -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 checkMatchingTrackAttributes = ( - response: Track, - mock: TrackMock -) => { +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: 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 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 = ( 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 = ( response: CurrentlyPlaying, mock: any ) => { - if (response.context) + 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); + } + if (response.item) { + checkMatchingTrackAttributes(response.item, mock.item); + } + 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] + ) + ); }; 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); }; 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( 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; 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, }) 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); 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"