From 8e9b021aa09f2b1460977bdd52fff14ea2bc1607 Mon Sep 17 00:00:00 2001 From: Phan An Date: Sun, 21 Jan 2018 00:27:56 +0100 Subject: [PATCH] Use vue-test-helpers --- package.json | 3 +- .../tests/components/auth/login-form.spec.js | 2 +- .../main-wrapper/extra/album-info.spec.js | 2 +- .../main-wrapper/extra/artist-info.spec.js | 2 +- .../main-wrapper/extra/index.spec.js | 6 +- .../main-wrapper/extra/youtube.spec.js | 2 +- .../components/main-wrapper/index.spec.js | 5 +- .../main-wrapper/main-content/album.spec.js | 7 +- .../main-wrapper/main-content/artist.spec.js | 7 +- .../main-content/favorites.spec.js | 5 +- .../main-content/playlist.spec.js | 8 +- .../main-wrapper/main-content/profile.spec.js | 10 +- .../main-wrapper/main-content/queue.spec.js | 10 +- .../main-content/settings.spec.js | 4 +- .../main-wrapper/main-content/songs.spec.js | 2 +- .../main-wrapper/main-content/users.spec.js | 8 +- .../main-wrapper/sidebar/index.spec.js | 17 +- .../sidebar/playlist-item.spec.js | 8 +- .../main-wrapper/sidebar/playlists.spec.js | 4 - .../components/modals/add-user-form.spec.js | 8 +- .../components/modals/edit-songs-form.spec.js | 36 +- .../components/modals/edit-user-form.spec.js | 17 +- .../components/shared/add-to-menu.spec.js | 28 +- .../components/shared/album-item.spec.js | 12 +- .../components/shared/artist-item.spec.js | 12 +- .../components/shared/home-song-item.spec.js | 15 +- .../tests/components/shared/overlay.spec.js | 18 +- .../tests/components/shared/song-item.spec.js | 10 +- .../shared/song-list-controls-toggler.spec.js | 8 +- .../shared/song-list-controls.spec.js | 32 +- .../tests/components/shared/song-list.spec.js | 20 +- .../tests/components/shared/song-menu.spec.js | 25 +- .../components/shared/to-top-button.spec.js | 3 +- .../components/shared/track-list-item.spec.js | 2 +- .../tests/components/shared/user-item.spec.js | 14 +- .../shared/view-mode-switch.spec.js | 6 +- .../side-header/search-form.spec.js | 6 +- .../components/site-footer/volume.spec.js | 15 +- resources/assets/js/tests/setup.js | 5 +- yarn.lock | 566 +++++++++++++++++- 40 files changed, 726 insertions(+), 244 deletions(-) diff --git a/package.json b/package.json index 40a11020..dbae4886 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "youtube-player": "^3.0.4" }, "devDependencies": { + "@vue/test-utils": "^1.0.0-beta.10", "autoprefixer": "^6.7.2", "babel-core": "^6.26.0", "babel-eslint": "^7.2.3", @@ -87,7 +88,7 @@ "sinon-test": "^2.1.2", "vue-loader": "^13.0.5", "vue-template-compiler": "^2.5.0", - "vue-test-utils": "^1.0.0-beta.7", + "vue-test-helpers": "^1.0.9", "webpack": "^3.6.0", "webpack-node-externals": "^1.6.0" }, diff --git a/resources/assets/js/tests/components/auth/login-form.spec.js b/resources/assets/js/tests/components/auth/login-form.spec.js index 8dbc5d10..4e2849d7 100644 --- a/resources/assets/js/tests/components/auth/login-form.spec.js +++ b/resources/assets/js/tests/components/auth/login-form.spec.js @@ -9,7 +9,7 @@ describe('components/auth/login-form', () => { it('triggers login when form is submitted', () => { const wrapper = shallow(LoginForm) const loginStub = sinon.stub(userStore, 'login') - wrapper.find('form').trigger('submit') + wrapper.submit('form') loginStub.calledWith(wrapper.vm.email, wrapper.vm.password).should.be.true loginStub.restore() }) diff --git a/resources/assets/js/tests/components/main-wrapper/extra/album-info.spec.js b/resources/assets/js/tests/components/main-wrapper/extra/album-info.spec.js index f2dd4874..504a0c9f 100644 --- a/resources/assets/js/tests/components/main-wrapper/extra/album-info.spec.js +++ b/resources/assets/js/tests/components/main-wrapper/extra/album-info.spec.js @@ -29,7 +29,7 @@ describe('components/main-wrapper/extra/album-info', () => { const wrapper = shallow(AlbumInfo, { propsData: { album } }) - wrapper.find('.wiki button.more').trigger('click') + wrapper.click('.wiki button.more') wrapper.html().should.contain(album.info.wiki.full) }) diff --git a/resources/assets/js/tests/components/main-wrapper/extra/artist-info.spec.js b/resources/assets/js/tests/components/main-wrapper/extra/artist-info.spec.js index a4816d67..7e952e8a 100644 --- a/resources/assets/js/tests/components/main-wrapper/extra/artist-info.spec.js +++ b/resources/assets/js/tests/components/main-wrapper/extra/artist-info.spec.js @@ -28,7 +28,7 @@ describe('components/main-wrapper/extra/artist-info', () => { const wrapper = shallow(ArtistInfo, { propsData: { artist } }) - wrapper.find('.bio button.more').trigger('click') + wrapper.click('.bio button.more') wrapper.html().should.contain(artist.info.bio.full) }) diff --git a/resources/assets/js/tests/components/main-wrapper/extra/index.spec.js b/resources/assets/js/tests/components/main-wrapper/extra/index.spec.js index d9e08963..2a8e8c56 100644 --- a/resources/assets/js/tests/components/main-wrapper/extra/index.spec.js +++ b/resources/assets/js/tests/components/main-wrapper/extra/index.spec.js @@ -19,14 +19,14 @@ describe('components/main-wrapper/extra/index', () => { sharedState: { useYouTube: true } }) wrapper.findAll('.header .youtube').should.have.lengthOf(1) - wrapper.contains(YouTube).should.be.true + wrapper.has(YouTube).should.be.true }) it('switches pane properly', () => { const wrapper = shallow(ExtraSidebar) expect(wrapper.find('.header .active').is('.lyrics')).toBe(true) ;['.artist', '.album', '.lyrics'].forEach(selector => { - wrapper.find(`.header ${selector}`).trigger('click') + wrapper.click(`.header ${selector}`) wrapper.find('.header .active').is(selector).should.be.true }) }) @@ -39,7 +39,7 @@ describe('components/main-wrapper/extra/index', () => { } }) ;[ArtistInfo, AlbumInfo, Lyrics, YouTube].forEach(component => { - wrapper.contains(component).should.be.true + wrapper.has(component).should.be.true }) }) diff --git a/resources/assets/js/tests/components/main-wrapper/extra/youtube.spec.js b/resources/assets/js/tests/components/main-wrapper/extra/youtube.spec.js index 0a3e24a1..0fc33a0a 100644 --- a/resources/assets/js/tests/components/main-wrapper/extra/youtube.spec.js +++ b/resources/assets/js/tests/components/main-wrapper/extra/youtube.spec.js @@ -21,7 +21,7 @@ describe('components/main-wrapper/extra/youtube', () => { it('loads more videos on demand', () => { const stub = sinon.stub(youtubeService, 'searchVideosRelatedToSong') - wrapper.find('button.more').trigger('click') + wrapper.click('button.more') stub.calledWith(song).should.be.true stub.restore() }) diff --git a/resources/assets/js/tests/components/main-wrapper/index.spec.js b/resources/assets/js/tests/components/main-wrapper/index.spec.js index f2e3b7b1..d235d658 100644 --- a/resources/assets/js/tests/components/main-wrapper/index.spec.js +++ b/resources/assets/js/tests/components/main-wrapper/index.spec.js @@ -5,9 +5,6 @@ import Extra from '@/components/main-wrapper/extra/index.vue' describe('component/main-wrapper/index', () => { it('renders properly', () => { - const wrapper = mount(Component) - wrapper.contains(Sidebar).should.be.true - wrapper.contains(MainContent).should.be.true - wrapper.contains(Extra).should.be.true + mount(Component).hasAll(Sidebar, MainContent, Extra).should.be.true }) }) diff --git a/resources/assets/js/tests/components/main-wrapper/main-content/album.spec.js b/resources/assets/js/tests/components/main-wrapper/main-content/album.spec.js index 4f054d0c..c782be90 100644 --- a/resources/assets/js/tests/components/main-wrapper/main-content/album.spec.js +++ b/resources/assets/js/tests/components/main-wrapper/main-content/album.spec.js @@ -14,8 +14,7 @@ describe('components/main-wrapper/main-content/album', () => { const html = wrapper.html() html.should.contain(album.name) html.should.contain(album.artist.name) - wrapper.contains(SongList).should.be.true - wrapper.contains(SongListControls).should.be.true + wrapper.hasAll(SongList, SongListControls).should.be.true }) }) @@ -28,7 +27,7 @@ describe('components/main-wrapper/main-content/album', () => { } }) const stub = sinon.stub(albumInfoService, 'fetch') - wrapper.find('a.info').trigger('click') + wrapper.click('a.info') stub.calledWith(album).should.be.true stub.restore() }) @@ -42,7 +41,7 @@ describe('components/main-wrapper/main-content/album', () => { } }) const downloadStub = sinon.stub(download, 'fromAlbum') - wrapper.find('a.download').trigger('click') + wrapper.click('a.download') downloadStub.calledWith(album).should.be.true downloadStub.restore() }) diff --git a/resources/assets/js/tests/components/main-wrapper/main-content/artist.spec.js b/resources/assets/js/tests/components/main-wrapper/main-content/artist.spec.js index 273ba089..d1214b8a 100644 --- a/resources/assets/js/tests/components/main-wrapper/main-content/artist.spec.js +++ b/resources/assets/js/tests/components/main-wrapper/main-content/artist.spec.js @@ -30,8 +30,7 @@ describe('components/main-wrapper/main-content/artist', () => { const html = wrapper.html() html.should.contain(artist.name) html.should.contain('1 album') - wrapper.contains(SongList).should.be.true - wrapper.contains(SongListControls).should.be.true + wrapper.hasAll(SongList, SongListControls).should.be.true }) }) @@ -42,7 +41,7 @@ describe('components/main-wrapper/main-content/artist', () => { sharedState: { useLastfm: true } }}) const stub = sinon.stub(artistInfoService, 'fetch') - wrapper.find('a.info').trigger('click') + wrapper.click('a.info') stub.calledWith(artist).should.be.true stub.restore() }) @@ -53,7 +52,7 @@ describe('components/main-wrapper/main-content/artist', () => { sharedState: { allowDownload: true } }}) const downloadStub = sinon.stub(download, 'fromArtist') - wrapper.find('a.download').trigger('click') + wrapper.click('a.download') downloadStub.calledWith(artist).should.be.true downloadStub.restore() }) diff --git a/resources/assets/js/tests/components/main-wrapper/main-content/favorites.spec.js b/resources/assets/js/tests/components/main-wrapper/main-content/favorites.spec.js index bb2a7de3..080eeb02 100644 --- a/resources/assets/js/tests/components/main-wrapper/main-content/favorites.spec.js +++ b/resources/assets/js/tests/components/main-wrapper/main-content/favorites.spec.js @@ -11,8 +11,7 @@ describe('components/main-wrapper/main-content/favorites', () => { songs: factory('song', 5) } }}) - wrapper.contains(SongList).should.be.true - wrapper.contains(SongListControls).should.be.true + wrapper.hasAll(SongList, SongListControls).should.be.true wrapper.findAll('div.none').should.have.lengthOf(0) }) @@ -31,7 +30,7 @@ describe('components/main-wrapper/main-content/favorites', () => { songs: factory('song', 5) }, sharedState: { allowDownload: true } - }}).find('a.download').trigger('click') + }}).click('a.download') downloadStub.called.should.be.true downloadStub.restore() }) diff --git a/resources/assets/js/tests/components/main-wrapper/main-content/playlist.spec.js b/resources/assets/js/tests/components/main-wrapper/main-content/playlist.spec.js index ab44e011..c428aefb 100644 --- a/resources/assets/js/tests/components/main-wrapper/main-content/playlist.spec.js +++ b/resources/assets/js/tests/components/main-wrapper/main-content/playlist.spec.js @@ -9,7 +9,7 @@ describe('components/main-wrapper/main-content/playlist', () => { const playlist = factory('playlist', { populated: true }) const wrapper = shallow(Component, { data: { playlist }}) wrapper.find('h1.heading').html().should.contain(playlist.name) - wrapper.contains(SongList).should.be.true + wrapper.has(SongList).should.be.true }) it('fetch and populate playlist content on demand', () => { @@ -27,7 +27,7 @@ describe('components/main-wrapper/main-content/playlist', () => { populated: true, songs: [] }) - }}).contains('div.none').should.be.true + }}).has('div.none').should.be.true }) it('confirms deleting if the playlist is not empty', () => { @@ -38,7 +38,7 @@ describe('components/main-wrapper/main-content/playlist', () => { }) wrapper.setData({ playlist }) const confirmStub = sinon.stub(alerts, 'confirm') - wrapper.find('.btn-delete-playlist').trigger('click') + wrapper.click('.btn-delete-playlist') confirmStub.calledWith('Are you sure? This is a one-way street!', wrapper.vm.del).should.be.true confirmStub.restore() }) @@ -52,7 +52,7 @@ describe('components/main-wrapper/main-content/playlist', () => { wrapper.setData({ playlist }) const confirmStub = sinon.stub(alerts, 'confirm') const deleteStub = sinon.stub(playlistStore, 'delete') - wrapper.find('.btn-delete-playlist').trigger('click') + wrapper.click('.btn-delete-playlist') confirmStub.called.should.be.false deleteStub.calledWith(playlist).should.be.true confirmStub.restore() diff --git a/resources/assets/js/tests/components/main-wrapper/main-content/profile.spec.js b/resources/assets/js/tests/components/main-wrapper/main-content/profile.spec.js index 80499c67..76524783 100644 --- a/resources/assets/js/tests/components/main-wrapper/main-content/profile.spec.js +++ b/resources/assets/js/tests/components/main-wrapper/main-content/profile.spec.js @@ -8,7 +8,7 @@ describe('components/main-wrapper/main-content/user', () => { }) it('displays a form to update profile', () => { - shallow(Profile).contains('form').should.be.true + shallow(Profile).has('form').should.be.true }) it('validates password confirmation', () => { @@ -17,12 +17,12 @@ describe('components/main-wrapper/main-content/user', () => { confirmPwd: 'bar' }}) const updateProfileStub = sinon.stub(userStore, 'updateProfile') - wrapper.find('form').trigger('submit') + wrapper.submit('form') updateProfileStub.called.should.be.false wrapper.setData({ confirmPwd: 'foo' }) - wrapper.find('form').trigger('submit') + wrapper.submit('form') updateProfileStub.called.should.be.true updateProfileStub.restore() }) @@ -30,7 +30,7 @@ describe('components/main-wrapper/main-content/user', () => { it('updates profile with password fields left empty', () => { const wrapper = shallow(Profile) const updateProfileStub = sinon.stub(userStore, 'updateProfile') - wrapper.find('form').trigger('submit') + wrapper.submit('form') updateProfileStub.called.should.be.true updateProfileStub.restore() }) @@ -40,7 +40,7 @@ describe('components/main-wrapper/main-content/user', () => { const savePrefsStub = sinon.spy(preferenceStore, 'save') wrapper.setData({ prefs: preferenceStore.state }) ;['notify', 'confirmClosing', 'transcodeOnMobile'].forEach(key => { - wrapper.find(`input[name=${key}]`).trigger('click') + wrapper.submit(`input[name=${key}]`) savePrefsStub.called.should.be.true }) savePrefsStub.restore() diff --git a/resources/assets/js/tests/components/main-wrapper/main-content/queue.spec.js b/resources/assets/js/tests/components/main-wrapper/main-content/queue.spec.js index 41d4f69b..527eec38 100644 --- a/resources/assets/js/tests/components/main-wrapper/main-content/queue.spec.js +++ b/resources/assets/js/tests/components/main-wrapper/main-content/queue.spec.js @@ -10,7 +10,7 @@ describe('components/main-wrapper/main-content/queue', () => { state: { songs: factory('song', 10) } }}) wrapper.find('h1.heading').text().should.contain('Current Queue') - wrapper.contains(SongList).should.be.true + wrapper.has(SongList).should.be.true }) it('prompts to shuffle all songs if there are songs and current queue is empty', () => { @@ -26,7 +26,7 @@ describe('components/main-wrapper/main-content/queue', () => { state: { songs: [] } - }}).contains('a.start').should.be.false + }}).has('a.start').should.be.false }) it('shuffles all songs in the queue if any', () => { @@ -34,7 +34,7 @@ describe('components/main-wrapper/main-content/queue', () => { const songs = factory('song', 10) mount(Component, { data: { state: { songs } - }}).find('button.btn-shuffle-all').trigger('click') + }}).click('button.btn-shuffle-all') stub.calledWith(songs).should.be.true stub.restore() }) @@ -46,7 +46,7 @@ describe('components/main-wrapper/main-content/queue', () => { state: { songs: [] } - }}).find('button.btn-shuffle-all').trigger('click') + }}).click('button.btn-shuffle-all') stub.calledWith(songStore.all).should.be.true stub.restore() }) @@ -57,7 +57,7 @@ describe('components/main-wrapper/main-content/queue', () => { wrapper.setData({ state: { songs: factory('song', 10) } }) - wrapper.find('button.btn-clear-queue').trigger('click') + wrapper.click('button.btn-clear-queue') stub.called.should.be.true stub.restore() }) diff --git a/resources/assets/js/tests/components/main-wrapper/main-content/settings.spec.js b/resources/assets/js/tests/components/main-wrapper/main-content/settings.spec.js index 48f6c801..5658fd02 100644 --- a/resources/assets/js/tests/components/main-wrapper/main-content/settings.spec.js +++ b/resources/assets/js/tests/components/main-wrapper/main-content/settings.spec.js @@ -18,7 +18,7 @@ describe('components/main-wrapper/main-content/settings', () => { it('warns if changing a non-empty media path', () => { sharedStore.state.originalMediaPath = '/bar' const stub = sinon.stub(alerts, 'confirm') - shallow(Component).find('form').trigger('submit') + shallow(Component).submit('form') stub.called.should.be.true stub.restore() }) @@ -27,7 +27,7 @@ describe('components/main-wrapper/main-content/settings', () => { sharedStore.state.originalMediaPath = '' const confirmStub = sinon.stub(alerts, 'confirm') const updateStub = sinon.stub(settingStore, 'update') - shallow(Component).find('form').trigger('submit') + shallow(Component).submit('form') confirmStub.called.should.be.false updateStub.called.should.be.true confirmStub.restore() diff --git a/resources/assets/js/tests/components/main-wrapper/main-content/songs.spec.js b/resources/assets/js/tests/components/main-wrapper/main-content/songs.spec.js index a3969005..29c23a1f 100644 --- a/resources/assets/js/tests/components/main-wrapper/main-content/songs.spec.js +++ b/resources/assets/js/tests/components/main-wrapper/main-content/songs.spec.js @@ -8,6 +8,6 @@ describe('components/main-wrapper/main-content/settings', () => { songStore.all = factory('song', 10) const wrapper = shallow(Component) wrapper.find('h1.heading').text().should.contain('All Songs') - wrapper.contains(SongList).should.be.true + wrapper.has(SongList).should.be.true }) }) diff --git a/resources/assets/js/tests/components/main-wrapper/main-content/users.spec.js b/resources/assets/js/tests/components/main-wrapper/main-content/users.spec.js index 89c73e12..b454b908 100644 --- a/resources/assets/js/tests/components/main-wrapper/main-content/users.spec.js +++ b/resources/assets/js/tests/components/main-wrapper/main-content/users.spec.js @@ -15,8 +15,8 @@ describe('components/main-wrapper/main-content/users', () => { userStore.all = factory('user', 10) const wrapper = mount(Component) const openStub = sinon.stub(wrapper.vm.$refs.addUserForm, 'open') - wrapper.contains(AddUserForm).should.be.true - wrapper.find('.btn-add').trigger('click') + wrapper.has(AddUserForm).should.be.true + wrapper.click('.btn-add') openStub.called.should.be.true openStub.restore() }) @@ -25,8 +25,8 @@ describe('components/main-wrapper/main-content/users', () => { userStore.all = factory('user', 10) const wrapper = mount(Component) const editStub = sinon.stub(wrapper.vm.$refs.editUserForm, 'open') - wrapper.contains(EditUserForm).should.be.true - wrapper.findAll('.btn-edit').at(0).trigger('click') + wrapper.has(EditUserForm).should.be.true + wrapper.click('.btn-edit') editStub.calledWith(userStore.all[0]).should.be.true editStub.restore() }) diff --git a/resources/assets/js/tests/components/main-wrapper/sidebar/index.spec.js b/resources/assets/js/tests/components/main-wrapper/sidebar/index.spec.js index c6dbe36a..aaec82bd 100644 --- a/resources/assets/js/tests/components/main-wrapper/sidebar/index.spec.js +++ b/resources/assets/js/tests/components/main-wrapper/sidebar/index.spec.js @@ -5,16 +5,15 @@ import factory from '@/tests/factory' describe('compoponents/main-wrapper/sidebar/index', () => { it('renders properly', () => { - const wrapper = shallow(Component) - ;['home', 'queue', 'songs', 'albums', 'artists'].forEach(item => { - wrapper.contains(`.menu a.${item}`).should.be.true - }) - wrapper.contains(Playlists).should.be.true + shallow(Component).hasAll( + Playlists, + ...(['home', 'queue', 'songs', 'albums', 'artists'].map(item => `.menu a.${item}`)) + ).should.be.true }) it('displays YouTube menu item if using YouTube', () => { sharedStore.state.useYouTube = true - shallow(Component).contains('a.youtube').should.be.true + shallow(Component).has('a.youtube').should.be.true }) it('displays management menu items for admin', () => { @@ -23,9 +22,7 @@ describe('compoponents/main-wrapper/sidebar/index', () => { current: factory('user', { is_admin: true }) } }}) - ;['settings', 'users'].forEach(item => { - wrapper.contains(`.menu a.${item}`).should.be.true - }) + wrapper.hasAll('.menu a.settings', '.menu a.users').should.be.true }) it('displays new version info', () => { @@ -36,7 +33,7 @@ describe('compoponents/main-wrapper/sidebar/index', () => { current: factory('user', { is_admin: true }) } }}) - wrapper.contains('a.new-ver').should.be.true + wrapper.has('a.new-ver').should.be.true wrapper.find('a.new-ver').text().should.contain('Koel version v0.0.1 is available!') }) }) diff --git a/resources/assets/js/tests/components/main-wrapper/sidebar/playlist-item.spec.js b/resources/assets/js/tests/components/main-wrapper/sidebar/playlist-item.spec.js index ecd6a93f..caadd90b 100644 --- a/resources/assets/js/tests/components/main-wrapper/sidebar/playlist-item.spec.js +++ b/resources/assets/js/tests/components/main-wrapper/sidebar/playlist-item.spec.js @@ -33,8 +33,8 @@ describe('component/main-wrapper/sidebar/playlist-item', () => { const wrapper = shallow(Component, { propsData: { playlist } }) - wrapper.find('li.playlist').trigger('dblclick') - wrapper.find('input[type=text]').trigger('blur') + wrapper.dblclick('li.playlist') + wrapper.blur('input[type=text]') updateStub.calledWith(playlist).should.be.true }) @@ -45,7 +45,7 @@ describe('component/main-wrapper/sidebar/playlist-item', () => { type: 'favorites' } }) - wrapper.find('li.favorites').trigger('dblclick') - wrapper.contains('input[type=text]').should.be.false + wrapper.dblclick('li.favorites') + wrapper.has('input[type=text]').should.be.false }) }) diff --git a/resources/assets/js/tests/components/main-wrapper/sidebar/playlists.spec.js b/resources/assets/js/tests/components/main-wrapper/sidebar/playlists.spec.js index 5e4c1652..cd2d9d81 100644 --- a/resources/assets/js/tests/components/main-wrapper/sidebar/playlists.spec.js +++ b/resources/assets/js/tests/components/main-wrapper/sidebar/playlists.spec.js @@ -11,8 +11,4 @@ describe('compopents/main-wrapper/main-content/sidebar/playlist', () => { }}) wrapper.findAll(PlaylistItem).should.have.lengthOf(6) // favorites + 5 playlists }) - - it('adds a new playlist', () => { - const wrapper = mount(Component) - }) }) diff --git a/resources/assets/js/tests/components/modals/add-user-form.spec.js b/resources/assets/js/tests/components/modals/add-user-form.spec.js index c9bf658f..9b5449b0 100644 --- a/resources/assets/js/tests/components/modals/add-user-form.spec.js +++ b/resources/assets/js/tests/components/modals/add-user-form.spec.js @@ -6,7 +6,7 @@ describe('components/modals/add-user-form', () => { it('opens', async done => { const wrapper = shallow(Component) await wrapper.vm.open() - wrapper.contains('form.user-add').should.be.true + wrapper.has('form.user-add').should.be.true done() }) @@ -16,7 +16,7 @@ describe('components/modals/add-user-form', () => { const wrapper = shallow(Component) await wrapper.vm.open() wrapper.setData({ newUser }) - wrapper.find('form.user-add').trigger('submit') + wrapper.submit('form.user-add') storeStub.calledWith(newUser.name, newUser.email, newUser.password).should.be.true storeStub.restore() done() @@ -25,9 +25,9 @@ describe('components/modals/add-user-form', () => { it('cancels', async done => { const wrapper = shallow(Component) await wrapper.vm.open() - wrapper.contains('form.user-add').should.be.true + wrapper.has('form.user-add').should.be.true await wrapper.vm.cancel() - wrapper.contains('form.user-add').should.be.false + wrapper.has('form.user-add').should.be.false done() }) }) diff --git a/resources/assets/js/tests/components/modals/edit-songs-form.spec.js b/resources/assets/js/tests/components/modals/edit-songs-form.spec.js index fac63559..6c170f08 100644 --- a/resources/assets/js/tests/components/modals/edit-songs-form.spec.js +++ b/resources/assets/js/tests/components/modals/edit-songs-form.spec.js @@ -18,7 +18,7 @@ describe('components/modals/edit-songs-form', () => { it('opens', async done => { const wrapper = shallow(Component) await wrapper.vm.open(factory('song', 3)) - wrapper.contains('form').should.be.true + wrapper.has('form').should.be.true done() }) @@ -32,13 +32,13 @@ describe('components/modals/edit-songs-form', () => { metaHtml.should.contain(song.album.name) metaHtml.should.contain(song.artist.name) - wrapper.find('input[name=title]').element.value.should.equal(song.title) - wrapper.find('input[name=album]').element.value.should.equal(song.album.name) - wrapper.find('input[name=artist]').element.value.should.equal(song.artist.name) - wrapper.find('input[name=track]').element.value.should.equal(song.track.toString()) + wrapper.find('input[name=title]').value.should.equal(song.title) + wrapper.find('input[name=album]').value.should.equal(song.album.name) + wrapper.find('input[name=artist]').value.should.equal(song.artist.name) + wrapper.find('input[name=track]').value.should.equal(song.track.toString()) - wrapper.find('.tabs .tab-lyrics').trigger('click') - wrapper.find('textarea[name=lyrics]').element.value.should.equal(song.lyrics) + wrapper.click('.tabs .tab-lyrics') + wrapper.find('textarea[name=lyrics]').value.should.equal(song.lyrics) done() }) @@ -52,9 +52,9 @@ describe('components/modals/edit-songs-form', () => { metaHtml.should.contain('Mixed Artists') metaHtml.should.contain('Mixed Albums') - wrapper.find('input[name=artist]').element.value.should.be.empty - wrapper.find('input[name=album]').element.value.should.be.empty - wrapper.contains('.tabs .tab-lyrics').should.be.false + wrapper.find('input[name=artist]').value.should.be.empty + wrapper.find('input[name=album]').value.should.be.empty + wrapper.has('.tabs .tab-lyrics').should.be.false done() }) @@ -73,9 +73,9 @@ describe('components/modals/edit-songs-form', () => { metaHtml.should.contain(artist.name) metaHtml.should.contain('Mixed Albums') - wrapper.find('input[name=artist]').element.value.should.equal(artist.name) - wrapper.find('input[name=album]').element.value.should.be.empty - wrapper.contains('.tabs .tab-lyrics').should.be.false + wrapper.find('input[name=artist]').value.should.equal(artist.name) + wrapper.find('input[name=album]').value.should.be.empty + wrapper.has('.tabs .tab-lyrics').should.be.false done() }) @@ -96,9 +96,9 @@ describe('components/modals/edit-songs-form', () => { metaHtml.should.contain(album.name) metaHtml.should.contain(album.artist.name) - wrapper.find('input[name=artist]').element.value.should.equal(album.artist.name) - wrapper.find('input[name=album]').element.value.should.equal(album.name) - wrapper.contains('.tabs .tab-lyrics').should.be.false + wrapper.find('input[name=artist]').value.should.equal(album.artist.name) + wrapper.find('input[name=album]').value.should.equal(album.name) + wrapper.has('.tabs .tab-lyrics').should.be.false done() }) @@ -110,7 +110,7 @@ describe('components/modals/edit-songs-form', () => { const formData = { foo: 'bar' } await wrapper.vm.open(songs) wrapper.setData({ formData }) - wrapper.find('form').trigger('submit') + wrapper.submit('form') updateStub.calledWith(songs, formData).should.be.true done() @@ -120,7 +120,7 @@ describe('components/modals/edit-songs-form', () => { const wrapper = shallow(Component) await wrapper.vm.open(factory('song', 3)) await wrapper.vm.close() - wrapper.contains('form').should.be.false + wrapper.has('form').should.be.false done() }) }) diff --git a/resources/assets/js/tests/components/modals/edit-user-form.spec.js b/resources/assets/js/tests/components/modals/edit-user-form.spec.js index 4ab0a06c..f63227df 100644 --- a/resources/assets/js/tests/components/modals/edit-user-form.spec.js +++ b/resources/assets/js/tests/components/modals/edit-user-form.spec.js @@ -7,10 +7,9 @@ describe('components/modals/edit-user-form', () => { const user = factory('user') const wrapper = shallow(Component) await wrapper.vm.open(user) - wrapper.contains('form.user-edit').should.be.true - wrapper.find('input[name=name]').element.value.should.equal(user.name) - wrapper.find('input[name=email]').element.value.should.equal(user.email) - + wrapper.has('form.user-edit').should.be.true + wrapper.find('input[name=name]').value.should.equal(user.name) + wrapper.find('input[name=email]').value.should.equal(user.email) done() }) @@ -19,10 +18,9 @@ describe('components/modals/edit-user-form', () => { const updateStub = sinon.stub(userStore, 'update') const wrapper = shallow(Component) await wrapper.vm.open(user) - wrapper.find('form').trigger('submit') + wrapper.submit('form') updateStub.calledWith(user, user.name, user.email, user.password).should.be.true updateStub.restore() - done() }) @@ -31,12 +29,11 @@ describe('components/modals/edit-user-form', () => { const updateStub = sinon.stub(userStore, 'update') const wrapper = shallow(Component) await wrapper.vm.open(user) - wrapper.contains('form.user-edit').should.be.true - wrapper.find('.btn-cancel').trigger('click') - wrapper.contains('form.user-edit').should.be.false + wrapper.has('form.user-edit').should.be.true + wrapper.click('.btn-cancel') + wrapper.has('form.user-edit').should.be.false updateStub.called.should.be.false updateStub.restore() - done() }) }) diff --git a/resources/assets/js/tests/components/shared/add-to-menu.spec.js b/resources/assets/js/tests/components/shared/add-to-menu.spec.js index daf58cac..ea1ae4e7 100644 --- a/resources/assets/js/tests/components/shared/add-to-menu.spec.js +++ b/resources/assets/js/tests/components/shared/add-to-menu.spec.js @@ -25,39 +25,33 @@ describe('components/shared/add-to-menu', () => { playlistStore.all = factory('playlist', 10) const wrapper = initComponent() wrapper.html().should.contain('Add 5 songs to') - wrapper.contains('li.after-current').should.be.true - wrapper.contains('li.bottom-queue').should.be.true - wrapper.contains('li.top-queue').should.be.true - wrapper.contains('li.favorites').should.be.true + wrapper.hasAll('li.after-current', 'li.bottom-queue', 'li.top-queue', 'li.favorites', 'form.form-new-playlist').should.be.true wrapper.findAll('li.playlist').should.have.lengthOf(10) - wrapper.contains('form.form-new-playlist').should.be.true }) it('supports different configurations', () => { // add to queue let wrapper = initComponent({ queue: false }) - wrapper.contains('li.after-current').should.be.false - wrapper.contains('li.bottom-queue').should.be.false - wrapper.contains('li.top-queue').should.be.false + wrapper.hasNone('li.after-current', 'li.bottom-queue', 'li.top-queue').should.be.true // add to favorites wrapper = initComponent({ favorites: false }) - wrapper.contains('li.favorites').should.be.false + wrapper.has('li.favorites').should.be.false // add to playlists wrapper = initComponent({ playlists: false }) - wrapper.contains('li.playlist').should.be.false + wrapper.has('li.playlist').should.be.false // add to a new playlist wrapper = initComponent({ newPlaylist: false }) - wrapper.contains('form.form-new-playlist').should.be.false + wrapper.has('form.form-new-playlist').should.be.false }) it('queue songs after current', () => { const wrapper = initComponent() const queueStub = sinon.stub(queueStore, 'queueAfterCurrent') const closeStub = sinon.stub(wrapper.vm, 'close') - wrapper.find('li.after-current').trigger('click') + wrapper.click('li.after-current') queueStub.calledWith(songs).should.be.true closeStub.called.should.be.true queueStub.restore() @@ -68,7 +62,7 @@ describe('components/shared/add-to-menu', () => { const wrapper = initComponent() const queueStub = sinon.stub(queueStore, 'queue') const closeStub = sinon.stub(wrapper.vm, 'close') - wrapper.find('li.bottom-queue').trigger('click') + wrapper.click('li.bottom-queue') queueStub.calledWith(songs).should.be.true closeStub.called.should.be.true queueStub.restore() @@ -79,7 +73,7 @@ describe('components/shared/add-to-menu', () => { const wrapper = initComponent() const queueStub = sinon.stub(queueStore, 'queue') const closeStub = sinon.stub(wrapper.vm, 'close') - wrapper.find('li.top-queue').trigger('click') + wrapper.click('li.top-queue') queueStub.calledWith(songs, false, true).should.be.true closeStub.called.should.be.true queueStub.restore() @@ -90,7 +84,7 @@ describe('components/shared/add-to-menu', () => { const wrapper = initComponent() const likeStub = sinon.stub(favoriteStore, 'like') const closeStub = sinon.stub(wrapper.vm, 'close') - wrapper.find('li.favorites').trigger('click') + wrapper.click('li.favorites') likeStub.calledWith(songs).should.be.true closeStub.called.should.be.true likeStub.restore() @@ -103,7 +97,7 @@ describe('components/shared/add-to-menu', () => { const wrapper = initComponent() const addSongsStub = sinon.stub(playlistStore, 'addSongs') const closeStub = sinon.stub(wrapper.vm, 'close') - wrapper.findAll('li.playlist').at(1).trigger('click') + wrapper.findAll('li.playlist').at(1).click() addSongsStub.calledWith(playlists[1], songs).should.be.true closeStub.called.should.be.true addSongsStub.restore() @@ -119,7 +113,7 @@ describe('components/shared/add-to-menu', () => { const wrapper = initComponent() const closeStub = sinon.stub(wrapper.vm, 'close') wrapper.setData({ newPlaylistName: 'Foo' }) - await wrapper.find('form.form-new-playlist').trigger('submit') + await wrapper.submit('form.form-new-playlist') storeStub.calledWith('Foo', songs).should.be.true closeStub.restore() done() diff --git a/resources/assets/js/tests/components/shared/album-item.spec.js b/resources/assets/js/tests/components/shared/album-item.spec.js index 74fab3e0..f684ad1d 100644 --- a/resources/assets/js/tests/components/shared/album-item.spec.js +++ b/resources/assets/js/tests/components/shared/album-item.spec.js @@ -14,7 +14,7 @@ describe('components/shared/album-item', () => { it('renders properly', () => { const wrapper = shallow(Component, { propsData: { album }}) - wrapper.contains('span.cover').should.be.true + wrapper.has('span.cover').should.be.true const html = wrapper.html() html.should.contain(album.name) html.should.contain('10 songs') @@ -22,7 +22,7 @@ describe('components/shared/album-item', () => { it('plays if clicked', () => { const playStub = sinon.stub(playback, 'playAllInAlbum') - shallow(Component, { propsData: { album }}).find('.control-play').trigger('click') + shallow(Component, { propsData: { album }}).click('.control-play') playStub.calledWith(album, false).should.be.true playStub.restore() }) @@ -30,16 +30,16 @@ describe('components/shared/album-item', () => { it('queues if ctrl/meta clicked', () => { const queueStub = sinon.stub(queueStore, 'queue') const wrapper = shallow(Component, { propsData: { album }}) - wrapper.find('.control-play').trigger('click', { metaKey: true }) + wrapper.click('.control-play', { metaKey: true }) queueStub.called.should.be.true - wrapper.find('.control-play').trigger('click', { ctrlKey: true }) + wrapper.click('.control-play', { ctrlKey: true }) queueStub.called.should.be.true queueStub.restore() }) it('shuffles', () => { const playStub = sinon.stub(playback, 'playAllInAlbum') - shallow(Component, { propsData: { album }}).find('.shuffle-album').trigger('click') + shallow(Component, { propsData: { album }}).click('.shuffle-album') playStub.calledWith(album, true).should.be.true playStub.restore() }) @@ -47,7 +47,7 @@ describe('components/shared/album-item', () => { it('downloads', () => { sharedStore.state = { allowDownload: true } const downloadStub = sinon.stub(download, 'fromAlbum') - shallow(Component, { propsData: { album }}).find('.download-album').trigger('click') + shallow(Component, { propsData: { album }}).click('.download-album') downloadStub.calledWith(album).should.be.true downloadStub.restore() }) diff --git a/resources/assets/js/tests/components/shared/artist-item.spec.js b/resources/assets/js/tests/components/shared/artist-item.spec.js index bd0edc4e..ac7c7021 100644 --- a/resources/assets/js/tests/components/shared/artist-item.spec.js +++ b/resources/assets/js/tests/components/shared/artist-item.spec.js @@ -16,7 +16,7 @@ describe('components/shared/artist-item', () => { it('renders properly', () => { const wrapper = shallow(Component, { propsData: { artist }}) - wrapper.contains('span.cover').should.be.true + wrapper.has('span.cover').should.be.true const html = wrapper.html() html.should.contain('4 albums') html.should.contain('16 songs') @@ -25,7 +25,7 @@ describe('components/shared/artist-item', () => { it('plays if clicked', () => { const playStub = sinon.stub(playback, 'playAllByArtist') - shallow(Component, { propsData: { artist }}).find('.control-play').trigger('click') + shallow(Component, { propsData: { artist }}).click('.control-play') playStub.calledWith(artist, false).should.be.true playStub.restore() }) @@ -33,16 +33,16 @@ describe('components/shared/artist-item', () => { it('queues if ctrl/meta clicked', () => { const queueStub = sinon.stub(queueStore, 'queue') const wrapper = shallow(Component, { propsData: { artist }}) - wrapper.find('.control-play').trigger('click', { metaKey: true }) + wrapper.click('.control-play', { metaKey: true }) queueStub.called.should.be.true - wrapper.find('.control-play').trigger('click', { ctrlKey: true }) + wrapper.click('.control-play', { ctrlKey: true }) queueStub.called.should.be.true queueStub.restore() }) it('shuffles', () => { const playStub = sinon.stub(playback, 'playAllByArtist') - shallow(Component, { propsData: { artist }}).find('.shuffle-artist').trigger('click') + shallow(Component, { propsData: { artist }}).click('.shuffle-artist') playStub.calledWith(artist, true).should.be.true playStub.restore() }) @@ -50,7 +50,7 @@ describe('components/shared/artist-item', () => { it('downloads', () => { sharedStore.state = { allowDownload: true } const downloadStub = sinon.stub(download, 'fromArtist') - shallow(Component, { propsData: { artist }}).find('.download-artist').trigger('click') + shallow(Component, { propsData: { artist }}).click('.download-artist') downloadStub.calledWith(artist).should.be.true downloadStub.restore() }) diff --git a/resources/assets/js/tests/components/shared/home-song-item.spec.js b/resources/assets/js/tests/components/shared/home-song-item.spec.js index fc2bb750..62a27667 100644 --- a/resources/assets/js/tests/components/shared/home-song-item.spec.js +++ b/resources/assets/js/tests/components/shared/home-song-item.spec.js @@ -19,17 +19,16 @@ describe('components/shared/home-song-item', () => { it('renders properly', () => { const wrapper = shallow(Component, { propsData }) - wrapper.contains('span.cover').should.be.true - wrapper.contains('span.details').should.be.true + wrapper.hasAll('span.cover', 'span.details').should.be.true wrapper.html().should.contain('Foo Fighter') - wrapper.html().should.contains('10 plays') + wrapper.html().should.contain('10 plays') }) it('queues and plays if not queued', () => { const containsStub = sinon.stub(queueStore, 'contains').callsFake(() => false) const queueStub = sinon.stub(queueStore, 'queueAfterCurrent') const playStub = sinon.stub(playback, 'play') - shallow(Component, { propsData }).find('.song-item-home').trigger('dblclick') + shallow(Component, { propsData }).dblclick('.song-item-home') containsStub.calledWith(song).should.be.true queueStub.calledWith(song).should.be.true playStub.calledWith(song).should.be.true @@ -43,7 +42,7 @@ describe('components/shared/home-song-item', () => { const containsStub = sinon.stub(queueStore, 'contains').callsFake(() => true) const queueStub = sinon.stub(queueStore, 'queueAfterCurrent') const playStub = sinon.stub(playback, 'play') - shallow(Component, { propsData }).find('.song-item-home').trigger('dblclick') + shallow(Component, { propsData }).dblclick('.song-item-home') containsStub.calledWith(song).should.be.true queueStub.called.should.be.false playStub.calledWith(song).should.be.true @@ -59,13 +58,13 @@ describe('components/shared/home-song-item', () => { const resumeStub = sinon.stub(playback, 'resume') const pauseStub = sinon.stub(playback, 'pause') - wrapper.find('.cover .control').trigger('click') + wrapper.click('.cover .control') playStub.called.should.be.true song.playbackState = 'paused' - wrapper.find('.cover .control').trigger('click') + wrapper.click('.cover .control') resumeStub.called.should.be.true song.playbackState = 'playing' - wrapper.find('.cover .control').trigger('click') + wrapper.click('.cover .control') pauseStub.called.should.be.true playStub.restore() diff --git a/resources/assets/js/tests/components/shared/overlay.spec.js b/resources/assets/js/tests/components/shared/overlay.spec.js index b442ce80..519b7601 100644 --- a/resources/assets/js/tests/components/shared/overlay.spec.js +++ b/resources/assets/js/tests/components/shared/overlay.spec.js @@ -5,8 +5,8 @@ describe('components/shared/overlay', () => { it('shows with default options', async done => { const wrapper = mount(Component) await wrapper.vm.show() - wrapper.contains(SoundBar).should.be.true - wrapper.contains('button.btn-dismiss').should.be.false + wrapper.has(SoundBar).should.be.true + wrapper.has('button.btn-dismiss').should.be.false done() }) @@ -17,8 +17,8 @@ describe('components/shared/overlay', () => { type: 'warning', message: 'Foo' }) - wrapper.contains(SoundBar).should.be.false - wrapper.contains('button.btn-dismiss').should.be.true + wrapper.has(SoundBar).should.be.false + wrapper.has('button.btn-dismiss').should.be.true wrapper.find('span.message').html().should.contain('Foo') done() }) @@ -26,18 +26,18 @@ describe('components/shared/overlay', () => { it('hides', async done => { const wrapper = mount(Component) await wrapper.vm.show() - wrapper.contains('.display').should.be.true + wrapper.has('.display').should.be.true await wrapper.vm.hide() - wrapper.contains('.display').should.be.false + wrapper.has('.display').should.be.false done() }) it('dismisses', async done => { const wrapper = mount(Component) await wrapper.vm.show({ dismissable: true }) - wrapper.contains('.display').should.be.true - wrapper.find('button.btn-dismiss').trigger('click') - wrapper.contains('.display').should.be.false + wrapper.has('.display').should.be.true + wrapper.click('button.btn-dismiss') + wrapper.has('.display').should.be.false done() }) }) diff --git a/resources/assets/js/tests/components/shared/song-item.spec.js b/resources/assets/js/tests/components/shared/song-item.spec.js index 3470ddd1..9281f603 100644 --- a/resources/assets/js/tests/components/shared/song-item.spec.js +++ b/resources/assets/js/tests/components/shared/song-item.spec.js @@ -38,7 +38,7 @@ describe('components/shared/song-item', () => { const queueStub = sinon.stub(queueStore, 'queueAfterCurrent') const playStub = sinon.stub(playback, 'play') const wrapper = shallow(Component, { propsData: { item }}) - wrapper.find('tr').trigger('dblclick') + wrapper.dblclick('tr') containsStub.calledWith(song).should.be.true queueStub.calledWith(song).should.be.true playStub.calledWith(song).should.be.true @@ -53,7 +53,7 @@ describe('components/shared/song-item', () => { const queueStub = sinon.stub(queueStore, 'queueAfterCurrent') const playStub = sinon.stub(playback, 'play') const wrapper = shallow(Component, { propsData: { item }}) - wrapper.find('tr').trigger('dblclick') + wrapper.dblclick('tr') containsStub.calledWith(song).should.be.true queueStub.calledWith(song).should.be.false playStub.calledWith(song).should.be.true @@ -69,15 +69,15 @@ describe('components/shared/song-item', () => { const pauseStub = sinon.stub(playback, 'pause') const playControl = shallow(Component, { propsData: { item }}).find('.play') - playControl.trigger('click') + playControl.click() playStub.called.should.be.true song.playbackState = 'playing' - playControl.trigger('click') + playControl.click() pauseStub.called.should.be.true song.playbackState = 'paused' - playControl.trigger('click') + playControl.click() resumeStub.called.should.be.true playStub.restore() diff --git a/resources/assets/js/tests/components/shared/song-list-controls-toggler.spec.js b/resources/assets/js/tests/components/shared/song-list-controls-toggler.spec.js index 7f3c6c75..6c328caa 100644 --- a/resources/assets/js/tests/components/shared/song-list-controls-toggler.spec.js +++ b/resources/assets/js/tests/components/shared/song-list-controls-toggler.spec.js @@ -9,16 +9,16 @@ describe('components/shared/song-list-controls-toggler', () => { it('renders properly', () => { shallow(Component, { propsData: { showingControls: true - }}).contains('.toggler.fa-angle-up').should.be.true + }}).has('.toggler.fa-angle-up').should.be.true shallow(Component, { propsData: { showingControls: false - }}).contains('.toggler.fa-angle-up').should.be.false + }}).has('.toggler.fa-angle-up').should.be.false }) it('emits event', () => { const wrapper = shallow(Component) - wrapper.find('.song-list-controls-toggler').trigger('click') - wrapper.emitted().toggleControls.should.be.ok + wrapper.click('.song-list-controls-toggler') + wrapper.hasEmitted('toggleControls').should.be.true }) }) diff --git a/resources/assets/js/tests/components/shared/song-list-controls.spec.js b/resources/assets/js/tests/components/shared/song-list-controls.spec.js index f5fa9047..23bd0350 100644 --- a/resources/assets/js/tests/components/shared/song-list-controls.spec.js +++ b/resources/assets/js/tests/components/shared/song-list-controls.spec.js @@ -3,54 +3,44 @@ import factory from '@/tests/factory' describe('components/shared/song-list-controls', () => { it('allows shuffling all if less than 2 songs are selected', () => { - let wrapper = shallow(Component, { propsData: { + shallow(Component, { propsData: { selectedSongs: [] - }}) - wrapper.find('.btn-shuffle-all').trigger('click') - wrapper.emitted().shuffleAll.should.be.ok + }}).click('.btn-shuffle-all').hasEmitted('shuffleAll').should.be.true - wrapper = shallow(Component, { propsData: { + shallow(Component, { propsData: { selectedSongs: [factory('song')] - }}) - wrapper.find('.btn-shuffle-all').trigger('click') - wrapper.emitted().shuffleAll.should.be.ok + }}).click('.btn-shuffle-all').hasEmitted('shuffleAll').should.be.true }) it('allows shuffling selected if more than 1 song are selected', () => { - const wrapper = shallow(Component, { propsData: { + shallow(Component, { propsData: { selectedSongs: factory('song', 3) - }}) - wrapper.find('.btn-shuffle-selected').trigger('click') - wrapper.emitted().shuffleSelected.should.be.ok + }}).click('.btn-shuffle-selected').hasEmitted('shuffleSelected').should.be.true }) it('displays the "Add To" menu', () => { shallow(Component, { propsData: { selectedSongs: factory('song', 3) - }}).contains('.btn-add-to').should.be.true + }}).has('.btn-add-to').should.be.true }) it('allows clearing queue', () => { - const wrapper = shallow(Component, { + shallow(Component, { data: { fullConfig: { clearQueue: true } } - }) - wrapper.find('.btn-clear-queue').trigger('click') - wrapper.emitted().clearQueue.should.be.ok + }).click('.btn-clear-queue').hasEmitted('clearQueue').should.be.true }) it('allows deleting current playlist', () => { - const wrapper = shallow(Component, { + shallow(Component, { data: { fullConfig: { deletePlaylist: true } } - }) - wrapper.find('.btn-delete-playlist').trigger('click') - wrapper.emitted().deletePlaylist.should.be.ok + }).click('.btn-delete-playlist').hasEmitted('deletePlaylist').should.be.true }) }) diff --git a/resources/assets/js/tests/components/shared/song-list.spec.js b/resources/assets/js/tests/components/shared/song-list.spec.js index be5d042f..af2c151b 100644 --- a/resources/assets/js/tests/components/shared/song-list.spec.js +++ b/resources/assets/js/tests/components/shared/song-list.spec.js @@ -51,7 +51,7 @@ describe('components/shared/song-list', () => { '.time': 'song.length' } for (let selector in provider) { - wrapper.find(`.song-list-header ${selector}`).trigger('click') + wrapper.click(`.song-list-header ${selector}`) sortStub.calledWith(provider[selector]).should.be.true } }) @@ -63,42 +63,42 @@ describe('components/shared/song-list', () => { }}) // track number - wrapper.find('.song-list-header .track-number').trigger('click') + wrapper.click('.song-list-header .track-number') for (let i = 1, j = wrapper.vm.songRows.length; i < j; ++i) { (wrapper.vm.songRows[i].song.track >= wrapper.vm.songRows[i - 1].song.track).should.be.true } // second sort should be descending - wrapper.find('.song-list-header .track-number').trigger('click') + wrapper.click('.song-list-header .track-number') for (let i = 1, j = wrapper.vm.songRows.length; i < j; ++i) { (wrapper.vm.songRows[i].song.track <= wrapper.vm.songRows[i - 1].song.track).should.be.true } - // track number - wrapper.find('.song-list-header .title').trigger('click') + // title + wrapper.click('.song-list-header .title') for (let i = 1, j = wrapper.vm.songRows.length; i < j; ++i) { (wrapper.vm.songRows[i].song.title >= wrapper.vm.songRows[i - 1].song.title).should.be.true } - wrapper.find('.song-list-header .title').trigger('click') + wrapper.click('.song-list-header .title') for (let i = 1, j = wrapper.vm.songRows.length; i < j; ++i) { (wrapper.vm.songRows[i].song.title <= wrapper.vm.songRows[i - 1].song.title).should.be.true } // artist - wrapper.find('.song-list-header .artist').trigger('click') + wrapper.click('.song-list-header .artist') for (let i = 1, j = wrapper.vm.songRows.length; i < j; ++i) { (wrapper.vm.songRows[i].song.album.artist.name >= wrapper.vm.songRows[i - 1].song.album.artist.name).should.be.true } - wrapper.find('.song-list-header .artist').trigger('click') + wrapper.click('.song-list-header .artist') for (let i = 1, j = wrapper.vm.songRows.length; i < j; ++i) { (wrapper.vm.songRows[i].song.album.artist.name <= wrapper.vm.songRows[i - 1].song.album.artist.name).should.be.true } // album - wrapper.find('.song-list-header .album').trigger('click') + wrapper.click('.song-list-header .album') for (let i = 1, j = wrapper.vm.songRows.length; i < j; ++i) { (wrapper.vm.songRows[i].song.album.name >= wrapper.vm.songRows[i - 1].song.album.name).should.be.true } - wrapper.find('.song-list-header .album').trigger('click') + wrapper.click('.song-list-header .album') for (let i = 1, j = wrapper.vm.songRows.length; i < j; ++i) { (wrapper.vm.songRows[i].song.album.name <= wrapper.vm.songRows[i - 1].song.album.name).should.be.true } diff --git a/resources/assets/js/tests/components/shared/song-menu.spec.js b/resources/assets/js/tests/components/shared/song-menu.spec.js index c8f22d0f..19b154e6 100644 --- a/resources/assets/js/tests/components/shared/song-menu.spec.js +++ b/resources/assets/js/tests/components/shared/song-menu.spec.js @@ -12,7 +12,6 @@ describe('components/shared/song-menu', () => { }) it('renders properly', () => { - const wrapper = shallow(Component, { propsData: { songs }}) const selectors = [ '.playback', '.go-to-album', @@ -22,9 +21,7 @@ describe('components/shared/song-menu', () => { '.top-queue', '.favorite' ] - selectors.forEach(selector => { - wrapper.contains(selector).should.be.true - }) + shallow(Component, { propsData: { songs }}).hasAll(...selectors).should.be.true }) it('plays and pauses', () => { @@ -32,33 +29,29 @@ describe('components/shared/song-menu', () => { }) it('queues songs after current', () => { - const wrapper = shallow(Component, { propsData: { songs }}) const queueStub = sinon.stub(queueStore, 'queueAfterCurrent') - wrapper.find('.after-current').trigger('click') + shallow(Component, { propsData: { songs }}).click('.after-current') queueStub.calledWith(songs).should.be.true queueStub.restore() }) it('queues songs to bottom', () => { - const wrapper = shallow(Component, { propsData: { songs }}) const queueStub = sinon.stub(queueStore, 'queue') - wrapper.find('.bottom-queue').trigger('click') + shallow(Component, { propsData: { songs }}).click('.bottom-queue') queueStub.calledWith(songs).should.be.true queueStub.restore() }) it('queues songs to top', () => { - const wrapper = shallow(Component, { propsData: { songs }}) const queueStub = sinon.stub(queueStore, 'queue') - wrapper.find('.top-queue').trigger('click') + shallow(Component, { propsData: { songs }}).click('.top-queue') queueStub.calledWith(songs, false, true).should.be.true queueStub.restore() }) it('adds songs to favorite', () => { - const wrapper = shallow(Component, { propsData: { songs }}) const likeStub = sinon.stub(favoriteStore, 'like') - wrapper.find('.favorite').trigger('click') + shallow(Component, { propsData: { songs }}).click('.favorite') likeStub.calledWith(songs).should.be.true likeStub.restore() }) @@ -71,7 +64,7 @@ describe('components/shared/song-menu', () => { playlistStore.all.forEach(playlist => { html.should.contain(playlist.name) }) - wrapper.find('.playlist').trigger('click') + wrapper.click('.playlist') addStub.calledWith(playlistStore.all[0], songs).should.be.true addStub.restore() }) @@ -80,7 +73,7 @@ describe('components/shared/song-menu', () => { const emitStub = sinon.stub(event, 'emit') userStore.current.is_admin = true const wrapper = shallow(Component, { propsData: { songs }}) - wrapper.find('.open-edit-form').trigger('click') + wrapper.click('.open-edit-form') emitStub.calledWith('songs:edit', songs).should.be.true emitStub.restore() }) @@ -89,7 +82,7 @@ describe('components/shared/song-menu', () => { const downloadStub = sinon.stub(download, 'fromSongs') sharedStore.state.allowDownload = true const wrapper = shallow(Component, { propsData: { songs }}) - wrapper.find('.download').trigger('click') + wrapper.click('.download') downloadStub.calledWith(songs).should.be.true downloadStub.restore() }) @@ -103,7 +96,7 @@ describe('components/shared/song-menu', () => { copyable: true } }) - wrapper.find('.copy-url').trigger('click') + wrapper.click('.copy-url') getUrlStub.calledWith(song).should.be.true }) }) diff --git a/resources/assets/js/tests/components/shared/to-top-button.spec.js b/resources/assets/js/tests/components/shared/to-top-button.spec.js index 69c4b3c5..dde3ccb6 100644 --- a/resources/assets/js/tests/components/shared/to-top-button.spec.js +++ b/resources/assets/js/tests/components/shared/to-top-button.spec.js @@ -4,8 +4,7 @@ import { $ } from '@/utils' describe('components/shared/to-top-button', () => { it('scrolls to top', () => { const scrollToStub = sinon.stub($, 'scrollTo') - const wrapper = shallow(Component) - wrapper.find('button').trigger('click') + shallow(Component).click('button') scrollToStub.called.should.be.true scrollToStub.restore() }) diff --git a/resources/assets/js/tests/components/shared/track-list-item.spec.js b/resources/assets/js/tests/components/shared/track-list-item.spec.js index abdca3b4..61ac3c6e 100644 --- a/resources/assets/js/tests/components/shared/track-list-item.spec.js +++ b/resources/assets/js/tests/components/shared/track-list-item.spec.js @@ -52,7 +52,7 @@ describe('componnents/shared/track-list-item', () => { track, album, index: 1 - }}).find('li').trigger('click') + }}).click('li') containsStub.calledWith(song).should.be.true queueStub.calledWith(song).should.be.true diff --git a/resources/assets/js/tests/components/shared/user-item.spec.js b/resources/assets/js/tests/components/shared/user-item.spec.js index 6573cfb1..d1dbc116 100644 --- a/resources/assets/js/tests/components/shared/user-item.spec.js +++ b/resources/assets/js/tests/components/shared/user-item.spec.js @@ -22,34 +22,34 @@ describe('components/shared/user-item', () => { html.should.contain(user.avatar) html.should.contain(user.name) wrapper.find('.btn-edit').text().should.equal('Edit') - wrapper.contains('.btn-delete').should.be.true + wrapper.has('.btn-delete').should.be.true }) it('has different behaviors if current user', () => { userStore.current.id = user.id const wrapper = shallow(Component, { propsData: { user }}) - wrapper.contains('.btn-delete').should.be.false + wrapper.has('.btn-delete').should.be.false wrapper.find('.btn-edit').text().should.equal('Update Profile') }) it('redirects to update profile if attempt to edit current user', () => { const goStub = sinon.stub(router, 'go') userStore.current.id = user.id - shallow(Component, { propsData: { user }}).find('.btn-edit').trigger('click') + shallow(Component, { propsData: { user }}).click('.btn-edit') goStub.calledWith('profile').should.be.true goStub.restore() }) it('edits user', () => { - const wrapper = shallow(Component, { propsData: { user }}) - wrapper.find('.btn-edit').trigger('click') - wrapper.emitted().editUser[0].should.eql([user]) + shallow(Component, { propsData: { + user + }}).click('.btn-edit').hasEmitted('editUser', user).should.be.true }) it('triggers deleting user', () => { const confirmStub = sinon.stub(alerts, 'confirm') const wrapper = shallow(Component, { propsData: { user }}) - wrapper.find('.btn-delete').trigger('click') + wrapper.click('.btn-delete') confirmStub.calledWith( `You’re about to unperson ${user.name}. Are you sure?`, wrapper.vm.doDelete diff --git a/resources/assets/js/tests/components/shared/view-mode-switch.spec.js b/resources/assets/js/tests/components/shared/view-mode-switch.spec.js index 2098b9e9..18e98813 100644 --- a/resources/assets/js/tests/components/shared/view-mode-switch.spec.js +++ b/resources/assets/js/tests/components/shared/view-mode-switch.spec.js @@ -6,9 +6,7 @@ describe('components/shared/view-mode-switch', () => { mode: 'list', for: 'albums' }}) - wrapper.find('a.thumbnails').trigger('click') - wrapper.emitted().viewModeChanged[0].should.eql(['thumbnails']) - wrapper.find('a.list').trigger('click') - wrapper.emitted().viewModeChanged[1].should.eql(['list']) + wrapper.click('a.thumbnails').hasEmitted('viewModeChanged', 'thumbnails').should.be.true + wrapper.click('a.list').hasEmitted('viewModeChanged', 'list').should.be.true }) }) diff --git a/resources/assets/js/tests/components/side-header/search-form.spec.js b/resources/assets/js/tests/components/side-header/search-form.spec.js index 6467f6dc..e2e16dc5 100644 --- a/resources/assets/js/tests/components/side-header/search-form.spec.js +++ b/resources/assets/js/tests/components/side-header/search-form.spec.js @@ -3,15 +3,13 @@ import { event } from '@/utils' describe('components/site-header/search-form', () => { it('renders properly', () => { - shallow(Component).contains('[type=search]').should.be.true + shallow(Component).has('[type=search]').should.be.true }) it('emits an event to filter', async done => { const emitStub = sinon.stub(event, 'emit') const wrapper = shallow(Component) - const input = wrapper.find('[type=search]') - input.element.value = 'foo' - input.trigger('input') + wrapper.find('[type=search]').setValue('foo').input() setTimeout(() => { emitStub.calledWith('filter:changed', 'foo').should.be.true emitStub.restore() diff --git a/resources/assets/js/tests/components/site-footer/volume.spec.js b/resources/assets/js/tests/components/site-footer/volume.spec.js index 89b445ff..6e3481cc 100644 --- a/resources/assets/js/tests/components/site-footer/volume.spec.js +++ b/resources/assets/js/tests/components/site-footer/volume.spec.js @@ -4,13 +4,12 @@ import { playback, socket } from '@/services' describe('components/site-footer/volume', () => { it('renders properly', () => { const wrapper = shallow(Component) - wrapper.contains('i.mute').should.be.true - wrapper.contains('#volumeRange').should.be.true + wrapper.hasAll('i.mute', '#volumeRange').should.be.true }) it('mutes', () => { const muteStub = sinon.stub(playback, 'mute') - shallow(Component).find('i.mute').trigger('click') + shallow(Component).click('i.mute') muteStub.called.should.be.true muteStub.restore() }) @@ -19,25 +18,21 @@ describe('components/site-footer/volume', () => { const unmuteStub = sinon.stub(playback, 'unmute') shallow(Component, { data: { muted: true - }}).find('i.unmute').trigger('click') + }}).click('i.unmute') unmuteStub.called.should.be.true unmuteStub.restore() }) it('sets the volume', () => { const setVolumeStub = sinon.stub(playback, 'setVolume') - const input = shallow(Component).find('#volumeRange') - input.element.value = 4.2 - input.trigger('input') + shallow(Component).find('#volumeRange').setValue(4.2).input() setVolumeStub.calledWith(4.2).should.be.true setVolumeStub.restore() }) it('broadcasts the volume value', () => { const broadcastStub = sinon.stub(socket, 'broadcast') - const input = shallow(Component).find('#volumeRange') - input.element.value = 4.2 - input.trigger('change') + shallow(Component).find('#volumeRange').setValue(4.2).change() broadcastStub.calledWith('volume:changed', 4.2).should.be.true broadcastStub.restore() }) diff --git a/resources/assets/js/tests/setup.js b/resources/assets/js/tests/setup.js index a3eedd47..639dfb78 100644 --- a/resources/assets/js/tests/setup.js +++ b/resources/assets/js/tests/setup.js @@ -6,12 +6,11 @@ require('babel-polyfill') require('chai').should() +require('vue-test-helpers')() + // make common utils available globally as well global.Vue = require('vue') global.expect = require('expect') global.sinon = require('sinon') global._ = require('lodash') -const testUtils = require('vue-test-utils') -global.shallow = testUtils.shallow -global.mount = testUtils.mount window.__UNIT_TESTING__ = true diff --git a/yarn.lock b/yarn.lock index 10c94691..83ba0ef1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6,6 +6,12 @@ version "8.0.57" resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.57.tgz#e5d8b4dc112763e35cfc51988f4f38da3c486d99" +"@vue/test-utils@^1.0.0-beta.10": + version "1.0.0-beta.10" + resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-1.0.0-beta.10.tgz#898881a8cac1c6bf9b1443fd0d7c81cb1fb4a87f" + dependencies: + lodash "^4.17.4" + abab@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" @@ -112,10 +118,20 @@ amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" -ansi-escapes@^1.1.0, ansi-escapes@^1.3.0: +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + dependencies: + string-width "^2.0.0" + +ansi-escapes@^1.0.0, ansi-escapes@^1.1.0, ansi-escapes@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" +ansi-escapes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" + ansi-html@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" @@ -146,6 +162,10 @@ ansicolors@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" +any-observable@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.2.0.tgz#c67870058003579009083f54ac0abafb5c33d242" + anymatch@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" @@ -1125,6 +1145,18 @@ boxen@^0.3.1: string-width "^1.0.1" widest-line "^1.0.0" +boxen@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + brace-expansion@^1.0.0, brace-expansion@^1.1.7: version "1.1.8" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" @@ -1330,6 +1362,14 @@ camelcase-keys@^2.0.0: camelcase "^2.0.0" map-obj "^1.0.0" +camelcase-keys@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" + dependencies: + camelcase "^4.1.0" + map-obj "^2.0.0" + quick-lru "^1.0.0" + camelcase@^1.0.2, camelcase@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" @@ -1342,7 +1382,7 @@ camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" -camelcase@^4.1.0: +camelcase@^4.0.0, camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" @@ -1402,7 +1442,7 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.1: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" dependencies: @@ -1418,6 +1458,10 @@ chalk@^2.1.0: escape-string-regexp "^1.0.5" supports-color "^4.0.0" +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + charenc@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" @@ -1471,18 +1515,39 @@ clean-css@^3.1.9: commander "2.8.x" source-map "0.4.x" -cli-cursor@^1.0.1: +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + +cli-cursor@^1.0.1, cli-cursor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" dependencies: restore-cursor "^1.0.1" +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + +cli-spinners@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" + cli-table@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" dependencies: colors "1.0.3" +cli-truncate@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" + dependencies: + slice-ansi "0.0.4" + string-width "^1.0.1" + cli-usage@^0.1.1: version "0.1.4" resolved "https://registry.yarnpkg.com/cli-usage/-/cli-usage-0.1.4.tgz#7c01e0dc706c234b39c933838c8e20b2175776e2" @@ -1705,6 +1770,17 @@ configstore@^2.0.0: write-file-atomic "^1.1.2" xdg-basedir "^2.0.0" +configstore@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + connect-history-api-fallback@^1.1.0, connect-history-api-fallback@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz#e51d17f8f0ef0db90a64fdb47de3051556e9f169" @@ -1818,7 +1894,7 @@ create-ecdh@^4.0.0: bn.js "^4.1.0" elliptic "^6.0.0" -create-error-class@^3.0.1: +create-error-class@^3.0.0, create-error-class@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" dependencies: @@ -1904,6 +1980,10 @@ crypto-browserify@^3.11.0: public-encrypt "^4.0.0" randombytes "^2.0.0" +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + css-color-names@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" @@ -2029,6 +2109,10 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +date-fns@^1.27.2: + version "1.29.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" + date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" @@ -2077,7 +2161,14 @@ debug@^3.1.0: dependencies: ms "2.0.0" -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: +decamelize-keys@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -2265,12 +2356,22 @@ dot-prop@^3.0.0: dependencies: is-obj "^1.0.0" +dot-prop@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + dependencies: + is-obj "^1.0.0" + duplexer2@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" dependencies: readable-stream "^2.0.2" +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + duplexify@^3.2.0: version "3.5.1" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.1.tgz#4e1516be68838bc90a49994f0b39a6e5960befcd" @@ -2316,6 +2417,10 @@ electron-to-chromium@^1.2.7: version "1.3.24" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.24.tgz#9b7b88bb05ceb9fa016a177833cc2dde388f21b6" +elegant-spinner@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" + elliptic@^6.0.0: version "6.4.0" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" @@ -2404,7 +2509,7 @@ errno@^0.1.1, errno@^0.1.3: dependencies: prr "~0.0.0" -error-ex@^1.2.0: +error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" dependencies: @@ -2684,6 +2789,18 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + exit-hook@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" @@ -2759,6 +2876,14 @@ extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" +external-editor@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" @@ -2818,13 +2943,19 @@ faye-websocket@~0.11.0: dependencies: websocket-driver ">=0.5.1" -figures@^1.3.5: +figures@^1.3.5, figures@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" dependencies: escape-string-regexp "^1.0.5" object-assign "^4.1.0" +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + file-entry-cache@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" @@ -3161,6 +3292,12 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + dependencies: + ini "^1.3.4" + globals@^9.14.0, globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -3235,6 +3372,22 @@ got@^5.0.0: unzip-response "^1.0.2" url-parse-lax "^1.0.0" +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -3321,6 +3474,10 @@ has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" +has-yarn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-1.0.0.tgz#89e25db604b725c8f5976fff0addc921b828a5a7" + has@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" @@ -3535,7 +3692,7 @@ iconv-lite@0.4.13: version "0.4.13" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" -iconv-lite@0.4.19, iconv-lite@^0.4.4: +iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@^0.4.4: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" @@ -3565,6 +3722,10 @@ immutable@3.8.1, immutable@^3.7.6: version "3.8.1" resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.1.tgz#200807f11ab0f72710ea485542de088075f68cd2" +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -3579,6 +3740,10 @@ indent-string@^2.1.0: dependencies: repeating "^2.0.0" +indent-string@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" @@ -3646,6 +3811,25 @@ inquirer@^0.12.0: strip-ansi "^3.0.0" through "^2.3.6" +inquirer@^3.0.6, inquirer@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + internal-ip@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c" @@ -3768,6 +3952,13 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + is-my-json-valid@^2.10.0: version "2.16.1" resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz#5a846777e2c2620d1e69104e5d3a03b1f6088f11" @@ -3819,7 +4010,7 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" -is-plain-obj@^1.0.0: +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -4092,6 +4283,10 @@ json-loader@^0.5.4: version "0.5.7" resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" +json-parse-better-errors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz#50183cd1b2d25275de069e9e71b467ac9eab973a" + json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" @@ -4234,6 +4429,12 @@ latest-version@^2.0.0: dependencies: package-json "^2.0.0" +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + dependencies: + package-json "^4.0.0" + lazy-cache@^0.2.3: version "0.2.7" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" @@ -4282,6 +4483,61 @@ limiter@^1.0.5: version "1.1.2" resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.2.tgz#229d8055891c8b11af9e0ee5200e8e09bb3dcbeb" +listr-input@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/listr-input/-/listr-input-0.1.2.tgz#628b68f47dc8809bce24a782be8520a723cfb611" + dependencies: + inquirer "^3.3.0" + rxjs "^5.5.2" + through "^2.3.8" + +listr-silent-renderer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" + +listr-update-renderer@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.2.0.tgz#ca80e1779b4e70266807e8eed1ad6abe398550f9" + dependencies: + chalk "^1.1.3" + cli-truncate "^0.2.1" + elegant-spinner "^1.0.1" + figures "^1.7.0" + indent-string "^3.0.0" + log-symbols "^1.0.2" + log-update "^1.0.2" + strip-ansi "^3.0.1" + +listr-verbose-renderer@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35" + dependencies: + chalk "^1.1.3" + cli-cursor "^1.0.2" + date-fns "^1.27.2" + figures "^1.7.0" + +listr@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/listr/-/listr-0.12.0.tgz#6bce2c0f5603fa49580ea17cd6a00cc0e5fa451a" + dependencies: + chalk "^1.1.3" + cli-truncate "^0.2.1" + figures "^1.7.0" + indent-string "^2.1.0" + is-promise "^2.1.0" + is-stream "^1.1.0" + listr-silent-renderer "^1.1.1" + listr-update-renderer "^0.2.0" + listr-verbose-renderer "^0.4.0" + log-symbols "^1.0.2" + log-update "^1.0.2" + ora "^0.2.3" + p-map "^1.1.1" + rxjs "^5.0.0-beta.11" + stream-to-observable "^0.1.0" + strip-ansi "^3.0.1" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -4301,6 +4557,15 @@ load-json-file@^2.0.0: pify "^2.0.0" strip-bom "^3.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" + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + load-script@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/load-script/-/load-script-1.0.0.tgz#0491939e0bee5643ee494a7e3da3d2bac70c6ca4" @@ -4502,6 +4767,25 @@ lodash@^4, lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.16.2, lodash version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" +log-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + dependencies: + chalk "^1.0.0" + +log-symbols@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.1.0.tgz#f35fa60e278832b538dc4dddcbb478a45d3e3be6" + dependencies: + chalk "^2.0.1" + +log-update@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1" + dependencies: + ansi-escapes "^1.0.0" + cli-cursor "^1.0.2" + loglevel@^1.4.1: version "1.5.0" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.5.0.tgz#3863984a2c326b986fbb965f378758a6dc8a4324" @@ -4570,6 +4854,10 @@ map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" +map-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" + marked-terminal@^1.6.2: version "1.7.0" resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-1.7.0.tgz#c8c460881c772c7604b64367007ee5f77f125904" @@ -4645,6 +4933,20 @@ meow@^3.3.0, meow@^3.7.0: redent "^1.0.0" trim-newlines "^1.0.0" +meow@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-4.0.0.tgz#fd5855dd008db5b92c552082db1c307cba20b29d" + dependencies: + camelcase-keys "^4.0.0" + decamelize-keys "^1.0.0" + loud-rejection "^1.0.0" + minimist "^1.1.3" + minimist-options "^3.0.1" + normalize-package-data "^2.3.4" + read-pkg-up "^3.0.0" + redent "^2.0.0" + trim-newlines "^2.0.0" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -4741,6 +5043,13 @@ minimatch@3.0.2: dependencies: brace-expansion "^1.0.0" +minimist-options@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -4845,6 +5154,10 @@ mute-stream@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + nan@^2.3.0, nan@^2.3.2: version "2.7.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" @@ -5065,6 +5378,29 @@ nouislider@^9.1.0: version "9.2.0" resolved "https://registry.yarnpkg.com/nouislider/-/nouislider-9.2.0.tgz#e87c507de2b0b4d075038b5a42547c7dbbebaf69" +np@^2.18.3: + version "2.18.3" + resolved "https://registry.yarnpkg.com/np/-/np-2.18.3.tgz#00dfa459edd29ec8ea65e7e99ad973870a61b0cc" + dependencies: + any-observable "^0.2.0" + chalk "^2.3.0" + del "^3.0.0" + execa "^0.8.0" + has-yarn "^1.0.0" + inquirer "^3.0.6" + listr "^0.12.0" + listr-input "^0.1.1" + log-symbols "^2.1.0" + meow "^4.0.0" + p-tap "^1.0.0" + p-timeout "^2.0.1" + read-pkg-up "^3.0.0" + rxjs "5.4.3" + semver "^5.2.0" + split "^1.0.0" + stream-to-observable "^0.2.0" + update-notifier "^2.1.0" + npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -5199,6 +5535,12 @@ onetime@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + open@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc" @@ -5242,6 +5584,15 @@ options@>=0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" +ora@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4" + dependencies: + chalk "^1.1.1" + cli-cursor "^1.0.2" + cli-spinners "^0.1.2" + object-assign "^4.0.1" + original@>=0.0.5: version "1.0.0" resolved "https://registry.yarnpkg.com/original/-/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b" @@ -5277,7 +5628,7 @@ os-name@^1.0.3: osx-release "^1.0.0" win-release "^1.0.0" -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -5312,6 +5663,16 @@ p-map@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" +p-tap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-tap/-/p-tap-1.0.0.tgz#dc4fa086135e8688226f6e7dccea67d8322d08df" + +p-timeout@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" + dependencies: + p-finally "^1.0.0" + package-json@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/package-json/-/package-json-1.2.0.tgz#c8ecac094227cdf76a316874ed05e27cc939a0e0" @@ -5328,6 +5689,15 @@ package-json@^2.0.0: registry-url "^3.0.3" semver "^5.1.0" +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + pako@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" @@ -5363,6 +5733,13 @@ parse-json@^2.1.0, parse-json@^2.2.0: dependencies: error-ex "^1.2.0" +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + parse5@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" @@ -5445,6 +5822,12 @@ path-type@^2.0.0: dependencies: pify "^2.0.0" +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + dependencies: + pify "^3.0.0" + path@^0.12.7: version "0.12.7" resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" @@ -5945,6 +6328,10 @@ querystringify@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-1.0.0.tgz#6286242112c5b712fa654e526652bf6a13ff05cb" +quick-lru@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" + randomatic@^1.1.3: version "1.1.7" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" @@ -6005,6 +6392,13 @@ read-pkg-up@^2.0.0: find-up "^2.0.0" read-pkg "^2.0.0" +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" + read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -6021,6 +6415,14 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.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" + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2, readable-stream@^2.2.6, readable-stream@^2.2.9: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" @@ -6072,6 +6474,13 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" +redent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" + dependencies: + indent-string "^3.0.0" + strip-indent "^2.0.0" + redeyed@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-1.0.1.tgz#e96c193b40c0816b00aec842698e61185e55498a" @@ -6321,6 +6730,13 @@ restore-cursor@^1.0.1: exit-hook "^1.0.0" onetime "^1.0.0" +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + rework-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" @@ -6363,6 +6779,16 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + rx-lite@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" @@ -6371,6 +6797,18 @@ rx@4.1.0, rx@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" +rxjs@5.4.3: + version "5.4.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.4.3.tgz#0758cddee6033d68e0fd53676f0f3596ce3d483f" + dependencies: + symbol-observable "^1.0.1" + +rxjs@^5.0.0-beta.11, rxjs@^5.5.2: + version "5.5.6" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.6.tgz#e31fb96d6fd2ff1fd84bcea8ae9c02d007179c02" + dependencies: + symbol-observable "1.0.1" + safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -6448,6 +6886,10 @@ semver-diff@^2.0.0: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" +semver@^5.2.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -6948,6 +7390,12 @@ spdy@^3.4.1: select-hose "^2.0.0" spdy-transport "^2.0.18" +split@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" + dependencies: + through "2" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -7012,6 +7460,16 @@ stream-throttle@^0.1.3: commander "^2.2.0" limiter "^1.0.5" +stream-to-observable@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.1.0.tgz#45bf1d9f2d7dc09bed81f1c307c430e68b84cffe" + +stream-to-observable@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.2.0.tgz#59d6ea393d87c2c0ddac10aa0d561bc6ba6f0e10" + dependencies: + any-observable "^0.2.0" + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" @@ -7030,7 +7488,7 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0: +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" dependencies: @@ -7083,6 +7541,10 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" +strip-indent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -7125,6 +7587,14 @@ svgo@^0.7.0: sax "~1.2.1" whet.extend "~0.9.9" +symbol-observable@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" + +symbol-observable@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.1.0.tgz#5c68fd8d54115d9dfb72a84720549222e8db9b32" + symbol-tree@^3.2.1: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" @@ -7172,6 +7642,12 @@ tempfile@^1.1.1: os-tmpdir "^1.0.0" uuid "^2.0.1" +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + dependencies: + execa "^0.7.0" + test-exclude@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.1.tgz#4d84964b0966b0087ecc334a2ce002d3d9341e26" @@ -7203,7 +7679,7 @@ then-fs@^2.0.0: dependencies: promise ">=3.2 <8" -through@^2.3.6, through@~2.3.6: +through@2, through@^2.3.6, through@^2.3.8, through@~2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -7223,12 +7699,22 @@ timed-out@^3.0.0: version "3.1.3" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217" +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + timers-browserify@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.4.tgz#96ca53f4b794a5e7c0e1bd7cc88a372298fa01e6" dependencies: setimmediate "^1.0.4" +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + dependencies: + os-tmpdir "~1.0.2" + to-array@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" @@ -7269,6 +7755,10 @@ trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" +trim-newlines@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" + trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" @@ -7374,6 +7864,12 @@ uniqs@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + dependencies: + crypto-random-string "^1.0.0" + universalify@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" @@ -7386,6 +7882,10 @@ unzip-response@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + update-notifier@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-0.5.0.tgz#07b5dc2066b3627ab3b4f530130f7eddda07a4cc" @@ -7409,6 +7909,20 @@ update-notifier@^0.6.0: latest-version "^2.0.0" semver-diff "^2.0.0" +update-notifier@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.3.0.tgz#4e8827a6bb915140ab093559d7014e3ebb837451" + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + upper-case@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" @@ -7583,11 +8097,11 @@ vue-template-es2015-compiler@^1.2.2, vue-template-es2015-compiler@^1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.5.3.tgz#22787de4e37ebd9339b74223bc467d1adee30545" -vue-test-utils@^1.0.0-beta.7: - version "1.0.0-beta.7" - resolved "https://registry.yarnpkg.com/vue-test-utils/-/vue-test-utils-1.0.0-beta.7.tgz#d53a07b3a9aaa93b58ddec496e0796f19ee5cfd8" +vue-test-helpers@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/vue-test-helpers/-/vue-test-helpers-1.0.9.tgz#8e61e4635fe4f085f3eafbffb256e827fae199ac" dependencies: - lodash "^4.17.4" + np "^2.18.3" vue-virtual-scroller@^0.5.0: version "0.5.5" @@ -7812,6 +8326,12 @@ widest-line@^1.0.0: dependencies: string-width "^1.0.1" +widest-line@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.0.tgz#0142a4e8a243f8882c0233aa0e0281aa76152273" + dependencies: + string-width "^2.1.1" + win-release@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/win-release/-/win-release-1.1.1.tgz#5fa55e02be7ca934edfc12665632e849b72e5209" @@ -7861,6 +8381,14 @@ write-file-atomic@^1.1.2, write-file-atomic@^1.1.4: imurmurhash "^0.1.4" slide "^1.1.5" +write-file-atomic@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" @@ -7884,6 +8412,10 @@ xdg-basedir@^2.0.0: dependencies: os-homedir "^1.0.0" +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + xml-char-classes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/xml-char-classes/-/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d"