Merge branch 'virtualscroll'

This commit is contained in:
An Phan 2017-01-14 21:42:23 +08:00
commit 184e63c54d
No known key found for this signature in database
GPG key ID: 05536BB4BCDC02A2
11 changed files with 533 additions and 559 deletions

54
composer.lock generated
View file

@ -4,8 +4,8 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
"hash": "f79521ac890ccb2cd8adb3e05124f2ca",
"content-hash": "2df0199a58da73ea5f5bdd18b128bd78",
"hash": "2765714b2784ee8330870d671e24d978",
"content-hash": "257f7945ff8c69813d8e4a1afda2a884",
"packages": [
{
"name": "aws/aws-sdk-php",
@ -1493,6 +1493,56 @@
],
"time": "2015-01-28 21:50:33"
},
{
"name": "predis/predis",
"version": "v1.1.1",
"source": {
"type": "git",
"url": "https://github.com/nrk/predis.git",
"reference": "f0210e38881631afeafb56ab43405a92cafd9fd1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nrk/predis/zipball/f0210e38881631afeafb56ab43405a92cafd9fd1",
"reference": "f0210e38881631afeafb56ab43405a92cafd9fd1",
"shasum": ""
},
"require": {
"php": ">=5.3.9"
},
"require-dev": {
"phpunit/phpunit": "~4.8"
},
"suggest": {
"ext-curl": "Allows access to Webdis when paired with phpiredis",
"ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol"
},
"type": "library",
"autoload": {
"psr-4": {
"Predis\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Daniele Alessandri",
"email": "suppakilla@gmail.com",
"homepage": "http://clorophilla.net"
}
],
"description": "Flexible and feature-complete Redis client for PHP and HHVM",
"homepage": "http://github.com/nrk/predis",
"keywords": [
"nosql",
"predis",
"redis"
],
"time": "2016-06-16 16:22:20"
},
{
"name": "psr/http-message",
"version": "1.0.1",

View file

@ -28,6 +28,8 @@
"select": "^1.0.6",
"slugify": "^1.0.2",
"vue": "^2.0.1",
"vue-virtual-scroller": "^0.5.0",
"vuequery": "^1.0.0",
"youtube-player": "^3.0.4"
},
"devDependencies": {

View file

@ -147,7 +147,7 @@ export default {
bottom: -20px;
filter: blur(20px);
opacity: .07;
z-index: 0;
z-index: 2;
overflow: hidden;
background-size: cover;
background-position: center;

View file

@ -3,14 +3,14 @@
class="song-item"
draggable="true"
:data-song-id="song.id"
@click="clicked($event)"
@click="clicked"
@dblclick.prevent="playRightAwayyyyyyy"
@dragstart="$parent.dragStart(song.id, $event)"
@dragleave="$parent.removeDroppableState($event)"
@dragover.prevent="$parent.allowDrop(song.id, $event)"
@drop.stop.prevent="$parent.handleDrop(song.id, $event)"
@contextmenu.prevent="$parent.openContextMenu(song.id, $event)"
:class="{ selected: selected, playing: playing }"
@dragstart="dragStart"
@dragleave="removeDroppableState"
@dragover.prevent="allowDrop"
@drop.stop.prevent="handleDrop"
@contextmenu.prevent="openContextMenu"
:class="{ selected: item.selected, playing: playing }"
>
<td class="track-number">{{ song.track || '' }}</td>
<td class="title">{{ song.title }}</td>
@ -27,22 +27,36 @@
<script>
import { playback } from '../../services'
import { queueStore } from '../../stores'
import $v from 'vuequery'
export default {
props: ['song'],
props: ['item'],
name: 'song-item',
data () {
return {
selected: false
parentSongList: null
}
},
computed: {
/**
* A shortcut to access the current vm's song (instead of this.item.song).
* @return {Object}
*/
song () {
return this.item.song
},
playing () {
return this.song.playbackState === 'playing' || this.song.playbackState === 'paused'
}
},
created () {
this.parentSongList = $v(this).closest('song-list').vm
},
methods: {
/**
* Play the song right away.
@ -72,23 +86,33 @@ export default {
}
},
clicked ($e) {
this.$emit('itemClicked', this.song.id, $e)
clicked (event) {
this.parentSongList.rowClicked(this, event)
},
select () {
this.selected = true
dragStart (event) {
this.parentSongList.dragStart(this, event)
},
deselect () {
this.selected = false
removeDroppableState (event) {
this.parentSongList.removeDroppableState(event)
},
/**
* Toggle the "selected" state of the current component.
* Add a "droppable" class and set the drop effect when other songs are dragged over the row.
*
* @param {Object} event The dragover event.
*/
toggleSelectedState () {
this.selected = !this.selected
allowDrop (event) {
this.parentSongList.allowDrop(event)
},
handleDrop (event) {
this.parentSongList.handleDrop(this, event)
},
openContextMenu (event) {
this.parentSongList.openContextMenu(this, event)
}
}
}
@ -100,6 +124,7 @@ export default {
.song-item {
border-bottom: 1px solid $color2ndBgr;
height: 35px;
html.no-touchevents &:hover {
background: rgba(255, 255, 255, .05);
@ -126,7 +151,7 @@ export default {
background-color: rgba(255, 255, 255, .08);
}
&.playing {
&.playing td {
color: $colorHighlight;
}
}

View file

@ -1,44 +0,0 @@
<template>
<thead>
<tr>
<th @click="sort('track')" class="track-number">#
<i class="fa fa-angle-down" v-show="sortKey === 'track' && order > 0"/>
<i class="fa fa-angle-up" v-show="sortKey === 'track' && order < 0"/>
</th>
<th @click="sort('title')" class="title">Title
<i class="fa fa-angle-down" v-show="sortKey === 'title' && order > 0"/>
<i class="fa fa-angle-up" v-show="sortKey === 'title' && order < 0"/>
</th>
<th @click="sort(['album.artist.name', 'album.name', 'track'])" class="artist">Artist
<i class="fa fa-angle-down" v-show="sortingByArtist && order > 0"/>
<i class="fa fa-angle-up" v-show="sortingByArtist && order < 0"/>
</th>
<th @click="sort(['album.name', 'track'])" class="album">Album
<i class="fa fa-angle-down" v-show="sortingByAlbum && order > 0"/>
<i class="fa fa-angle-up" v-show="sortingByAlbum && order < 0"/>
</th>
<th @click="sort('length')" class="time">Time
<i class="fa fa-angle-down" v-show="sortKey === 'length' && order > 0"/>
<i class="fa fa-angle-up" v-show="sortKey === 'length' && order < 0"/>
</th>
<th class="play"></th>
</tr>
</thead>
</template>
<script>
export default {
data () {
return {
sortKey: '',
order: 1
}
},
methods: {
sort (key) {
console.log(this.$parent.$parent)
}
}
}
</script>

View file

@ -1,150 +0,0 @@
<template>
<div class="virtual-scroller" @scroll="updateVisibleItems">
<div class="item-container" :style="itemContainerStyle">
<table class="items song-list-wrap">
<component class="item"
v-for="item in visibleItems"
:key="item.id"
:is="renderers[item[typeField]]"
:item="item" />
</table>
</div>
<iframe ref="resizeObserver" class="resize-observer" tabindex="-1"></iframe>
</div>
</template>
<script>
import { debounce } from 'lodash'
export default {
name: 'virtual-scroller',
props: {
items: {
type: Array,
required: true
},
renderers: {
required: true
},
itemHeight: {
type: [Number, String],
required: true
},
typeField: {
type: String,
default: 'type'
},
keyField: {
type: String,
default: 'id'
}
},
data () {
return {
visibleItems: [],
itemContainerStyle: null
}
},
watch: {
items () {
this.updateVisibleItems()
},
},
methods: {
updateVisibleItems: debounce(function () {
const l = this.items.length
const el = this.$el
const scroll = {
top: el.scrollTop,
bottom: el.scrollTop + el.clientHeight
}
this._startIndex = Math.floor(scroll.top / this.itemHeight)
this._endIndex = Math.ceil(scroll.bottom / this.itemHeight)
let startIndex = this._startIndex - 1
if (startIndex < 0) {
startIndex = 0
}
let endIndex = this._endIndex + 2
if (endIndex > l) {
endIndex = l
}
this.visibleItems = this.items.slice(startIndex, endIndex)
this.itemContainerStyle = {
height: l * this.itemHeight + 'px',
paddingTop: startIndex * this.itemHeight + 'px',
}
this.$forceUpdate()
}, 100),
scrollToItem (index) {
this.$el.scrollTop = index * this.itemHeight
},
addResizeHandlers () {
const iframe = this.$refs.resizeObserver
const w = iframe.contentWindow
// If the iframe is re-attached to the DOM, the resize listener is removed because the
// content is reloaded, so make sure to install the handler after the iframe is loaded.
iframe.addEventListener('load', this.refreshResizeHandlers)
if (w) {
w.addEventListener('resize', this.updateVisibleItems)
w.addEventListener('close', this.removeResizeHandlers)
}
},
removeResizeHandlers () {
const iframe = this.$refs.resizeObserver
const w = iframe.contentWindow
iframe.removeEventListener('load', this.refreshResizeHandlers)
if (w) {
w.removeEventListener('resize', this.updateVisibleItems)
w.removeEventListener('close', this.removeResizeHandlers)
}
},
refreshResizeHandlers () {
this.removeResizeHandlers()
this.addResizeHandlers()
// The iframe size might have changed while loading, which can also
// happen if the size has been changed while detached from the DOM.
this.updateVisibleItems()
},
},
mounted () {
this.updateVisibleItems()
this.addResizeHandlers()
}
}
</script>
<style scoped>
.virtual-scroller {
overflow-y: auto;
position: relative;
}
.item-container {
box-sizing: border-box;
}
.resize-observer {
position: absolute;
top: 0;
left: 0;
z-index: -1;
width: 100%;
height: 100%;
border: none;
background-color: transparent;
}
</style>

View file

@ -2,81 +2,79 @@
<div class="song-list-wrap main-scroll-wrap" :class="type"
ref="wrapper"
tabindex="1"
@scroll="scrolling"
@keydown.delete.prevent.stop="handleDelete"
@keydown.enter.prevent.stop="handleEnter"
@keydown.a.prevent="handleA"
>
<table v-show="items.length">
<table class="song-list-header">
<thead>
<tr>
<th @click="sort('track')" class="track-number">#
<i class="fa fa-angle-down" v-show="sortKey === 'track' && order > 0"/>
<i class="fa fa-angle-up" v-show="sortKey === 'track' && order < 0"/>
<th @click="sort('song.track')" class="track-number">#
<i class="fa fa-angle-down" v-show="sortKey === 'song.track' && order > 0"/>
<i class="fa fa-angle-up" v-show="sortKey === 'song.track' && order < 0"/>
</th>
<th @click="sort('title')" class="title">Title
<i class="fa fa-angle-down" v-show="sortKey === 'title' && order > 0"/>
<i class="fa fa-angle-up" v-show="sortKey === 'title' && order < 0"/>
<th @click="sort('song.title')" class="title">Title
<i class="fa fa-angle-down" v-show="sortKey === 'song.title' && order > 0"/>
<i class="fa fa-angle-up" v-show="sortKey === 'song.title' && order < 0"/>
</th>
<th @click="sort(['album.artist.name', 'album.name', 'track'])" class="artist">Artist
<th @click="sort(['song.album.artist.name', 'song.album.name', 'song.track'])" class="artist">Artist
<i class="fa fa-angle-down" v-show="sortingByArtist && order > 0"/>
<i class="fa fa-angle-up" v-show="sortingByArtist && order < 0"/>
</th>
<th @click="sort(['album.name', 'track'])" class="album">Album
<th @click="sort(['song.album.name', 'song.track'])" class="album">Album
<i class="fa fa-angle-down" v-show="sortingByAlbum && order > 0"/>
<i class="fa fa-angle-up" v-show="sortingByAlbum && order < 0"/>
</th>
<th @click="sort('length')" class="time">Time
<i class="fa fa-angle-down" v-show="sortKey === 'length' && order > 0"/>
<i class="fa fa-angle-up" v-show="sortKey === 'length' && order < 0"/>
<th @click="sort('song.length')" class="time">Time
<i class="fa fa-angle-down" v-show="sortKey === 'song.length' && order > 0"/>
<i class="fa fa-angle-up" v-show="sortKey === 'song.length' && order < 0"/>
</th>
<th class="play"></th>
</tr>
</thead>
<tbody>
<tr is="song-item"
v-for="item in displayedItems"
@itemClicked="itemClicked"
:song="item"
:key="item.id"
ref="rows"/>
</tbody>
</table>
<virtual-scroller
class="scroller"
content-tag="table"
:items="filteredItems"
item-height="35"
:renderers="renderers"
key-field="song"
/>
<song-menu ref="contextMenu" :songs="selectedSongs"/>
<to-top-button :showing="showBackToTop"/>
</div>
</template>
<script>
import { find, invokeMap, filter, map } from 'lodash'
import isMobile from 'ismobilejs'
import { each } from 'lodash'
import { filterBy, orderBy, limitBy, event, pluralize, $ } from '../../utils'
import { filterBy, orderBy, event, pluralize, $ } from '../../utils'
import { playlistStore, queueStore, songStore, favoriteStore } from '../../stores'
import { playback } from '../../services'
import router from '../../router'
import songItem from './song-item.vue'
import songMenu from './song-menu.vue'
import infiniteScroll from '../../mixins/infinite-scroll'
export default {
name: 'song-list',
props: ['items', 'type', 'playlist', 'sortable'],
mixins: [infiniteScroll],
components: { songItem, songMenu },
data () {
return {
renderers: Object.freeze({
song: songItem
}),
lastSelectedRow: null,
q: '', // The filter query
sortKey: '',
order: 1,
sortingByAlbum: false,
sortingByArtist: false,
selectedSongs: [],
mutatedItems: []
songRows: []
}
},
@ -89,13 +87,13 @@ export default {
this.sortKey = ''
}
this.mutatedItems = this.items
// Update the song count and duration status on parent.
this.$parent.updateMeta({
songCount: this.items.length,
totalLength: songStore.getLength(this.items, true)
})
this.generateSongRows()
},
selectedSongs (val) {
@ -104,19 +102,53 @@ export default {
},
computed: {
displayedItems () {
return limitBy(
filterBy(
this.mutatedItems,
this.q,
'title', 'album.name', 'artist.name'
),
this.numOfItems
filteredItems () {
return filterBy(
this.songRows,
this.q,
'song.title', 'song.album.name', 'song.artist.name'
)
},
/**
* Determine if the songs in the current list can be reordered by drag-and-dropping.
* @return {Boolean}
*/
allowSongReordering () {
return this.type === 'queue'
},
/**
* Songs that are currently selected (their rows are highlighted).
* @return {Array.<Object>}
*/
selectedSongs () {
return this.songRows.filter(row => row.selected).map(row => row.song)
}
},
methods: {
/**
* Generate an array of "song row" or "song wrapper" objects. Since song objects themselves are
* shared by all song lists, we can't use them directly to determine their selection status
* (selected/unselected). Therefore, for each song list, we maintain an array of "song row"
* objects, with each object contain the song itself, and the "selected" flag. In order to
* comply with virtual-scroller, a "type" attribute also presents.
*/
generateSongRows () {
// Since this method re-generates the song wrappers, we need to keep track of the
// selected songs manually.
const selectedSongIds = this.selectedSongs.map(song => song.id)
this.songRows = this.items.map(song => {
return {
song,
selected: selectedSongIds.indexOf(song.id) > -1,
type: 'song'
}
})
},
/**
* Handle sorting the song list.
*
@ -129,30 +161,28 @@ export default {
this.sortKey = key
this.order = 0 - this.order
this.sortingByAlbum = Array.isArray(this.sortKey) && this.sortKey[0] === 'album.name'
this.sortingByArtist = Array.isArray(this.sortKey) && this.sortKey[0] === 'album.artist.name'
this.mutatedItems = orderBy(this.items, this.sortKey, this.order)
this.sortingByAlbum = Array.isArray(this.sortKey) && this.sortKey[0] === 'song.album.name'
this.sortingByArtist = Array.isArray(this.sortKey) && this.sortKey[0] === 'song.album.artist.name'
this.songRows = orderBy(this.songRows, this.sortKey, this.order)
},
/**
* Execute the corresponding reaction(s) when the user presses Delete.
*/
handleDelete () {
const songs = this.selectedSongs
if (!songs.length) {
if (!this.selectedSongs.length) {
return
}
switch (this.type) {
case 'queue':
queueStore.unqueue(songs)
queueStore.unqueue(this.selectedSongs)
break
case 'favorites':
favoriteStore.unlike(songs)
favoriteStore.unlike(this.selectedSongs)
break
case 'playlist':
playlistStore.removeSongs(this.playlist, songs)
playlistStore.removeSongs(this.playlist, this.selectedSongs)
break
default:
break
@ -164,26 +194,23 @@ export default {
/**
* Execute the corresponding reaction(s) when the user presses Enter.
*
* @param {Object} e The keydown event.
* @param {Event} event The keydown event.
*/
handleEnter (e) {
const songs = this.selectedSongs
if (!songs.length) {
handleEnter (event) {
if (!this.selectedSongs.length) {
return
}
if (songs.length === 1) {
if (this.selectedSongs.length === 1) {
// Just play the song
playback.play(songs[0])
playback.play(this.selectedSongs[0])
return
}
switch (this.type) {
case 'queue':
// Play the first song selected if we're in Queue screen.
playback.play(songs[0])
playback.play(this.selectedSongs[0])
break
case 'favorites':
case 'playlist':
@ -200,119 +227,93 @@ export default {
// Also, if there's only one song selected, play it right away.
// --------------------------------------------------------------------
//
queueStore.queue(songs, false, e.shiftKey)
queueStore.queue(this.selectedSongs, false, event.shiftKey)
this.$nextTick(() => {
router.go('queue')
if (e.ctrlKey || e.metaKey || songs.length === 1) {
playback.play(songs[0])
if (event.ctrlKey || event.metaKey || this.selectedSongs.length === 1) {
playback.play(this.selectedSongs[0])
}
})
break
}
this.clearSelection()
},
/**
* Get the song-item component that's associated with a song ID.
*
* @param {String} id The song ID.
*
* @return {Object} The Vue compoenent
*/
getComponentBySongId (id) {
return find(this.$refs.rows, { song: { id }})
},
/**
* Capture A keydown event and select all if applicable.
*
* @param {Object} e The keydown event.
* @param {Event} event The keydown event.
*/
handleA (e) {
if (!e.metaKey && !e.ctrlKey) {
handleA (event) {
if (!event.metaKey && !event.ctrlKey) {
return
}
invokeMap(this.$refs.rows, 'select')
this.gatherSelected()
this.selectAllRows()
},
/**
* Gather all selected songs.
*
* @return {Array.<Object>} An array of Song objects
* Select all rows in the current list.
*/
gatherSelected () {
const selectedRows = filter(this.$refs.rows, { selected: true })
const ids = map(selectedRows, row => row.song.id)
this.selectedSongs = songStore.byIds(ids)
selectAllRows () {
each(this.songRows, row => {
row.selected = true
})
},
/**
* -----------------------------------------------------------
* The next four methods are to deal with selection.
*
* Credits: http://stackoverflow.com/a/17966381/794641 by andyb
* -----------------------------------------------------------
*/
/**
* Handle the click event on a row to perform selection.
*
* @param {String} songId
* @param {Object} e
* @param {VueComponent} rowVm
* @param {Event} e
*/
itemClicked (songId, e) {
const row = this.getComponentBySongId(songId)
rowClicked (rowVm, event) {
// If we're on a touch device, or if Ctrl/Cmd key is pressed, just toggle selection.
if (isMobile.any) {
this.toggleRow(row)
this.gatherSelected()
this.toggleRow(rowVm)
return
}
if (e.ctrlKey || e.metaKey) {
this.toggleRow(row)
if (event.ctrlKey || event.metaKey) {
this.toggleRow(rowVm)
}
if (e.button === 0) {
if (!e.ctrlKey && !e.metaKey && !e.shiftKey) {
if (event.button === 0) {
if (!(event.ctrlKey || event.metaKey || event.shiftKey)) {
this.clearSelection()
this.toggleRow(row)
this.toggleRow(rowVm)
}
if (e.shiftKey && this.lastSelectedRow && this.lastSelectedRow.$el) {
this.selectRowsBetweenIndexes([this.lastSelectedRow.$el.rowIndex, row.$el.rowIndex])
if (event.shiftKey && this.lastSelectedRow) {
this.selectRowsBetween(this.lastSelectedRow, rowVm)
}
}
this.gatherSelected()
},
/**
* Toggle select/unslect a row.
*
* @param {Object} row The song-item component
* @param {VueComponent} rowVm The song-item component
*/
toggleRow (row) {
row.toggleSelectedState()
this.lastSelectedRow = row
toggleRow (rowVm) {
rowVm.item.selected = !rowVm.item.selected
this.lastSelectedRow = rowVm
},
selectRowsBetweenIndexes (indexes) {
/**
* Select all rows between two rows.
*
* @param {VueComponent} firstRowVm The first row's component
* @param {VueComponent} secondRowVm The second row's component
*/
selectRowsBetween (firstRowVm, secondRowVm) {
const indexes = [this.songRows.indexOf(firstRowVm.item), this.songRows.indexOf(secondRowVm.item)]
indexes.sort((a, b) => a - b)
const rows = this.$refs.wrapper.querySelectorAll('tbody tr')
for (let i = indexes[0]; i <= indexes[1]; ++i) {
this.getComponentBySongId(rows[i - 1].getAttribute('data-song-id')).select()
this.songRows[i].selected = true
}
},
@ -320,8 +321,9 @@ export default {
* Clear the current selection on this song list.
*/
clearSelection () {
invokeMap(this.$refs.rows, 'deselect')
this.gatherSelected()
each(this.songRows, row => {
row.selected = false
})
},
/**
@ -329,42 +331,40 @@ export default {
* Even though the event is triggered on one row only, we'll collect other
* selected rows, if any, as well.
*
* @param {Object} e The event.
* @param {VueComponent} The row's Vue component
* @param {Event} event The event
*/
dragStart (songId, e) {
dragStart (rowVm, event) {
// If the user is dragging an unselected row, clear the current selection.
const currentRow = this.getComponentBySongId(songId)
if (!currentRow.selected) {
if (!rowVm.item.selected) {
this.clearSelection()
currentRow.select()
this.gatherSelected()
rowVm.item.selected = true
}
this.$nextTick(() => {
const songIds = map(this.selectedSongs, 'id')
e.dataTransfer.setData('application/x-koel.text+plain', songIds)
e.dataTransfer.effectAllowed = 'move'
const songIds = this.selectedSongs.map(song => song.id)
event.dataTransfer.setData('application/x-koel.text+plain', songIds)
event.dataTransfer.effectAllowed = 'move'
// Set a fancy drop image using our ghost element.
const ghost = document.getElementById('dragGhost')
ghost.innerText = `${pluralize(songIds.length, 'song')}`
e.dataTransfer.setDragImage(ghost, 0, 0)
event.dataTransfer.setDragImage(ghost, 0, 0)
})
},
/**
* Add a "droppable" class and set the drop effect when other songs are dragged over a row.
*
* @param {String} songId
* @param {Object} e The dragover event.
* @param {Event} event The dragover event.
*/
allowDrop (songId, e) {
if (this.type !== 'queue') {
allowDrop (event) {
if (!this.allowSongReordering) {
return
}
$.addClass(e.target.parentNode, 'droppable')
e.dataTransfer.dropEffect = 'move'
$.addClass(event.target.parentNode, 'droppable')
event.dataTransfer.dropEffect = 'move'
return false
},
@ -372,97 +372,59 @@ export default {
/**
* Perform reordering songs upon dropping if the current song list is of type Queue.
*
* @param {String} songId
* @param {Object} e
* @param {VueComponent} rowVm The row's Vue Component
* @param {Event} event
*/
handleDrop (songId, e) {
if (this.type !== 'queue') {
return this.removeDroppableState(e) && false
handleDrop (rowVm, event) {
if (
!this.allowSongReordering ||
!event.dataTransfer.getData('application/x-koel.text+plain') ||
!this.selectedSongs.length
) {
return this.removeDroppableState(event)
}
if (!e.dataTransfer.getData('application/x-koel.text+plain')) {
return this.removeDroppableState(e) && false
}
queueStore.move(this.selectedSongs, rowVm.song)
const songs = this.selectedSongs
if (!songs.length) {
return this.removeDroppableState(e) && false
}
queueStore.move(songs, songStore.byId(songId))
return this.removeDroppableState(e) && false
return this.removeDroppableState(event)
},
/**
* Remove the droppable state (and the styles) from a row.
*
* @param {Object} e
* @param {Event} event
*/
removeDroppableState (e) {
$.removeClass(e.target.parentNode, 'droppable')
removeDroppableState (event) {
$.removeClass(event.target.parentNode, 'droppable')
return false
},
openContextMenu (songId, e) {
/**
* Open the context menu.
*
* @param {VueComponent} rowVm The right-clicked row's component
* @param {Event} event
*/
openContextMenu (rowVm, event) {
// If the user is right-clicking an unselected row,
// clear the current selection and select it instead.
const currentRow = this.getComponentBySongId(songId)
if (!currentRow.selected) {
if (!rowVm.item.selected) {
this.clearSelection()
currentRow.select()
this.gatherSelected()
rowVm.item.selected = true
}
this.$nextTick(() => this.$refs.contextMenu.open(e.pageY, e.pageX))
this.$nextTick(() => this.$refs.contextMenu.open(event.pageY, event.pageX))
}
},
created () {
event.on({
/**
* Listen to song:played event to do some logic.
*
* @param {Object} song The current playing song.
*/
'song:played': song => {
// If the song is at the end of the current displayed items, load more.
if (this.type === 'queue' && this.items.indexOf(song) >= this.numOfItems) {
this.displayMore()
}
// Scroll the item into view if it's lost into oblivion.
if (this.type === 'queue') {
const row = this.$refs.wrapper.querySelector(`.song-item[data-song-id="${song.id}"]`)
if (!row) {
return
}
const wrapperRec = this.$refs.wrapper.getBoundingClientRect()
if (wrapperRec.top + wrapperRec.height < row.getBoundingClientRect().top) {
this.$refs.wrapper.scrollTop = this.$refs.wrapper.scrollTop + row.offsetTop
}
}
},
/**
* Listen to 'filter:changed' event to filter the current list.
*/
'filter:changed': q => {
this.q = q
},
/**
* Clears the current list's selection if the user has switched to another view.
*/
'main-content-view:load': () => this.clearSelection(),
/**
* Listen to 'song:selection-clear' (often broadcasted from the direct parent)
* to clear the selected songs.
*/
'song:selection-clear': () => this.clearSelection()
}
})
}
}
@ -474,6 +436,18 @@ export default {
.song-list-wrap {
position: relative;
padding: 8px 24px;
.song-list-header {
position: absolute;
top: 0;
left: 24px;
right: 24px;
padding: 0 24px;
background: #1b1b1b;
z-index: 1;
width: calc(100% - 48px);
}
table {
width: 100%;
@ -541,6 +515,26 @@ export default {
cursor: default;
}
.scroller {
overflow: auto;
position: absolute;
top: 35px;
left: 0;
bottom: 0;
right: 0;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
.item-container {
position: absolute;
left: 24px;
right: 24px;
}
.item {
margin-bottom: 0;
}
}
@media only screen and (max-width: 768px) {
table, tbody, tr {
@ -551,23 +545,38 @@ export default {
display: none;
}
.scroller {
top: 0;
bottom: 24px;
.item-container {
left: 12px;
right: 12px;
}
}
tr {
padding: 8px 32px 8px 4px;
position: relative;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
color: $color2ndText;
width: 100%;
}
td {
display: inline;
padding: 0;
vertical-align: bottom;
white-space: normal;
color: $colorMainText;
&.album, &.time, &.track-number {
display: none;
}
&.artist {
opacity: .5;
color: $color2ndText;
font-size: .9rem;
padding: 0 4px;
}

View file

@ -1,6 +1,7 @@
import Vue from 'vue'
import Raven from 'raven-js'
import RavenVue from 'raven-js/plugins/vue'
import { VirtualScroller } from 'vue-virtual-scroller'
import { event } from './utils'
import { http } from './services'
@ -10,6 +11,8 @@ Raven
.addPlugin(RavenVue, Vue)
.install()
Vue.component('virtual-scroller', VirtualScroller)
/**
* For Ancelot, the ancient cross of war
* for the holy town of Gods

View file

@ -208,13 +208,13 @@ export const playback = {
* The selected mode will be stored into local storage as well.
*/
changeRepeatMode () {
let idx = this.repeatModes.indexOf(preferences.repeatMode) + 1
let index = this.repeatModes.indexOf(preferences.repeatMode) + 1
if (idx >= this.repeatModes.length) {
idx = 0
if (index >= this.repeatModes.length) {
index = 0
}
preferences.repeatMode = this.repeatModes[idx]
preferences.repeatMode = this.repeatModes[index]
},
/**

View file

@ -15,9 +15,9 @@ export const youtube = {
const pageToken = song.youtube.nextPageToken || ''
return new Promise((resolve, reject) => {
http.get(`youtube/search/song/${song.id}?pageToken=${pageToken}`, response => {
song.youtube.nextPageToken = response.data.nextPageToken
song.youtube.items.push(...response.data.items)
http.get(`youtube/search/song/${song.id}?pageToken=${pageToken}`, ({ data }) => {
song.youtube.nextPageToken = data.nextPageToken
song.youtube.items.push(...data.items)
resolve()
}, error => reject(error))
})

345
yarn.lock
View file

@ -86,12 +86,12 @@ after@0.8.2:
resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
ajv-keywords@^1.0.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.2.0.tgz#676c4f087bfe1e8b12dca6fda2f3c74f417b099c"
version "1.5.0"
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.0.tgz#c11e6859eafff83e0dafc416929472eca946aa2c"
ajv@^4.7.0:
version "4.10.0"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.10.0.tgz#7ae6169180eb199192a8b9a19fd0f47fc9ac8764"
version "4.10.4"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.10.4.tgz#c0974dd00b3464984892d6010aa9c2c945933254"
dependencies:
co "^4.6.0"
json-stable-stringify "^1.0.1"
@ -225,6 +225,13 @@ array-unique@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
array.prototype.find@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.0.1.tgz#1557f888df6c57e4d1256f20852d687a25b51fde"
dependencies:
define-properties "^1.1.2"
es-abstract "^1.5.0"
arraybuffer.slice@0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca"
@ -238,8 +245,8 @@ asap@~2.0.3:
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f"
asn1.js@^4.0.0:
version "4.9.0"
resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.0.tgz#f71a1243f3e79d46d7b07d7fbf4824ee73af054a"
version "4.9.1"
resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40"
dependencies:
bn.js "^4.0.0"
inherits "^2.0.1"
@ -257,6 +264,12 @@ assert-plus@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
assert@^1.4.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
dependencies:
util "0.10.3"
assert@~1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/assert/-/assert-1.3.0.tgz#03939a622582a812cc202320a0b9a56c9b815849"
@ -324,14 +337,14 @@ autoprefixer-core@^5.0.0:
postcss "~4.1.12"
autoprefixer@^6.0.2, autoprefixer@^6.3.1:
version "6.5.4"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.5.4.tgz#1386eb6708ccff36aefff70adc694ecfd60af1b0"
version "6.6.1"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.6.1.tgz#11a4077abb4b313253ec2f6e1adb91ad84253519"
dependencies:
browserslist "~1.4.0"
caniuse-db "^1.0.30000597"
browserslist "~1.5.1"
caniuse-db "^1.0.30000604"
normalize-range "^0.1.2"
num2fraction "^1.2.2"
postcss "^5.2.6"
postcss "^5.2.8"
postcss-value-parser "^3.2.3"
aws-sign2@~0.6.0:
@ -1002,12 +1015,12 @@ browser-sync-ui@0.6.2:
weinre "^2.0.0-pre-I0Z7U9OV"
browser-sync@^2.7.10:
version "2.18.5"
resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.18.5.tgz#c04b10037289df5157a363d42100069d77e744e9"
version "2.18.6"
resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.18.6.tgz#7b303ea8905eaa20629e6c5d3e820c32ad96bb24"
dependencies:
browser-sync-client "2.4.4"
browser-sync-ui "0.6.2"
bs-recipes "1.3.2"
bs-recipes "1.3.4"
chokidar "1.6.1"
connect "3.5.0"
dev-ip "^1.0.1"
@ -1152,11 +1165,11 @@ browserify@^11.2.0:
xtend "^4.0.0"
browserify@^13.0.0:
version "13.1.1"
resolved "https://registry.yarnpkg.com/browserify/-/browserify-13.1.1.tgz#72a2310e2f706ed87db929cf0ee73a5e195d9bb0"
version "13.3.0"
resolved "https://registry.yarnpkg.com/browserify/-/browserify-13.3.0.tgz#b5a9c9020243f0c70e4675bec8223bc627e415ce"
dependencies:
JSONStream "^1.0.3"
assert "~1.3.0"
assert "^1.4.0"
browser-pack "^6.0.1"
browser-resolve "^1.11.0"
browserify-zlib "~0.1.2"
@ -1171,7 +1184,7 @@ browserify@^13.0.0:
domain-browser "~1.1.0"
duplexer2 "~0.1.2"
events "~1.1.0"
glob "^5.0.15"
glob "^7.1.0"
has "^1.0.0"
htmlescape "^1.1.0"
https-browserify "~0.0.0"
@ -1189,7 +1202,7 @@ browserify@^13.0.0:
readable-stream "^2.0.2"
resolve "^1.1.4"
shasum "^1.0.0"
shell-quote "^1.4.3"
shell-quote "^1.6.1"
stream-browserify "^2.0.0"
stream-http "^2.0.0"
string_decoder "~0.10.0"
@ -1203,11 +1216,11 @@ browserify@^13.0.0:
vm-browserify "~0.0.1"
xtend "^4.0.0"
browserslist@^1.0.0, browserslist@^1.0.1, browserslist@~1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.4.0.tgz#9cfdcf5384d9158f5b70da2aa00b30e8ff019049"
browserslist@^1.0.0, browserslist@^1.0.1, browserslist@~1.5.1:
version "1.5.2"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.5.2.tgz#1c82fde0ee8693e6d15c49b7bff209dc06298c56"
dependencies:
caniuse-db "^1.0.30000539"
caniuse-db "^1.0.30000604"
browserslist@~0.4.0:
version "0.4.0"
@ -1215,9 +1228,9 @@ browserslist@~0.4.0:
dependencies:
caniuse-db "^1.0.30000153"
bs-recipes@1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/bs-recipes/-/bs-recipes-1.3.2.tgz#aebff3bfc9dca4cab3c2938d91e43473cf41b6c1"
bs-recipes@1.3.4:
version "1.3.4"
resolved "https://registry.yarnpkg.com/bs-recipes/-/bs-recipes-1.3.4.tgz#0d2d4d48a718c8c044769fdc4f89592dc8b69585"
buble@^0.12.0:
version "0.12.5"
@ -1270,9 +1283,9 @@ builtin-status-codes@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-1.0.0.tgz#30637ee262978ac07174e16d7f82f0ad06e085ad"
builtin-status-codes@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-2.0.0.tgz#6f22003baacf003ccd287afe6872151fddc58579"
builtin-status-codes@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
builtins@0.0.7, builtins@~0.0.3:
version "0.0.7"
@ -1315,7 +1328,7 @@ camelcase@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
caniuse-api@^1.3.2:
caniuse-api@^1.3.2, caniuse-api@^1.5.2:
version "1.5.2"
resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.5.2.tgz#8f393c682f661c0a997b77bba6e826483fb3600e"
dependencies:
@ -1325,9 +1338,9 @@ caniuse-api@^1.3.2:
lodash.uniq "^4.3.0"
shelljs "^0.7.0"
caniuse-db@^1.0.30000153, caniuse-db@^1.0.30000214, caniuse-db@^1.0.30000346, caniuse-db@^1.0.30000539, caniuse-db@^1.0.30000597:
version "1.0.30000601"
resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000601.tgz#073c9d1c62edb399ecc783a7ab40698b5694d2fe"
caniuse-db@^1.0.30000153, caniuse-db@^1.0.30000214, caniuse-db@^1.0.30000346, caniuse-db@^1.0.30000604:
version "1.0.30000604"
resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000604.tgz#bc139270a777564d19c0aadcd832b491d093bda5"
capture-stack-trace@^1.0.0:
version "1.0.0"
@ -1831,8 +1844,8 @@ css@2.X:
urix "^0.1.0"
cssnano@^3.0.0, cssnano@^3.3.2:
version "3.9.1"
resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.9.1.tgz#41422bb5390d85a94ad4db03cc1a188bf68744fe"
version "3.10.0"
resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38"
dependencies:
autoprefixer "^6.3.1"
decamelize "^1.1.2"
@ -1906,12 +1919,9 @@ date-now@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
dateformat@^1.0.11:
version "1.0.12"
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9"
dependencies:
get-stdin "^4.0.1"
meow "^3.3.0"
dateformat@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17"
de-indent@^1.0.2:
version "1.0.2"
@ -1942,8 +1952,8 @@ debug@2.3.3:
ms "0.7.2"
debug@2.X, debug@^2.1.1, debug@^2.2.0:
version "2.4.5"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.4.5.tgz#34c7b12a1ca96674428f41fe92c49b4ce7cd0607"
version "2.6.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b"
dependencies:
ms "0.7.2"
@ -1975,6 +1985,13 @@ defaults@^1.0.0:
dependencies:
clone "^1.0.2"
define-properties@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
dependencies:
foreach "^2.0.5"
object-keys "^1.0.8"
defined@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
@ -2314,6 +2331,23 @@ error-ex@^1.2.0:
dependencies:
is-arrayish "^0.2.1"
es-abstract@^1.5.0:
version "1.6.1"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.6.1.tgz#bb8a2064120abcf928a086ea3d9043114285ec99"
dependencies:
es-to-primitive "^1.1.1"
function-bind "^1.1.0"
is-callable "^1.1.3"
is-regex "^1.0.3"
es-to-primitive@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
dependencies:
is-callable "^1.1.1"
is-date-object "^1.0.1"
is-symbol "^1.0.1"
es5-ext@^0.10.7, es5-ext@^0.10.8, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.7:
version "0.10.12"
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047"
@ -2417,9 +2451,10 @@ eslint-plugin-html@^1.5.2:
htmlparser2 "^3.8.2"
eslint-plugin-react@^6.2.0:
version "6.8.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.8.0.tgz#741ab5438a094532e5ce1bbb935d6832356f492d"
version "6.9.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.9.0.tgz#54c2e9906b76f9d10142030bdc34e9d6840a0bb2"
dependencies:
array.prototype.find "^2.0.1"
doctrine "^1.2.2"
jsx-ast-utils "^1.3.4"
@ -2431,8 +2466,8 @@ eslint-plugin-vue@^1.0.0:
eslint-plugin-react "^6.2.0"
eslint@^3.10.2:
version "3.12.2"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.12.2.tgz#6be5a9aa29658252abd7f91e9132bab1f26f3c34"
version "3.13.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.13.0.tgz#636925fd163c9babe2e8be7ae43caf518d469577"
dependencies:
babel-code-frame "^6.16.0"
chalk "^1.1.3"
@ -2464,7 +2499,7 @@ eslint@^3.10.2:
require-uncached "^1.0.2"
shelljs "^0.7.5"
strip-bom "^3.0.0"
strip-json-comments "~1.0.1"
strip-json-comments "~2.0.1"
table "^3.7.8"
text-table "~0.2.0"
user-home "^2.0.0"
@ -2613,15 +2648,15 @@ extsprintf@1.0.2:
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550"
fancy-log@^1.0.0, fancy-log@^1.1.0, fancy-log@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.2.0.tgz#d5a51b53e9ab22ca07d558f2b67ae55fdb5fcbd8"
version "1.3.0"
resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948"
dependencies:
chalk "^1.1.1"
time-stamp "^1.0.0"
fast-levenshtein@~2.0.4:
version "2.0.5"
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.5.tgz#bd33145744519ab1c36c3ee9f31f08e9079b67f2"
version "2.0.6"
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
figures@^1.3.5:
version "1.7.0"
@ -2799,8 +2834,8 @@ fs.realpath@^1.0.0:
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
fsevents@^1.0.0:
version "1.0.15"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.15.tgz#fa63f590f3c2ad91275e4972a6cea545fb0aae44"
version "1.0.17"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.17.tgz#8537f3f12272678765b4fd6528c0f1f66f8f4558"
dependencies:
nan "^2.3.0"
node-pre-gyp "^0.6.29"
@ -2822,7 +2857,7 @@ fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10:
mkdirp ">=0.5 0"
rimraf "2"
function-bind@^1.0.2:
function-bind@^1.0.2, function-bind@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771"
@ -2949,7 +2984,7 @@ glob@^4.0.5, glob@^4.3.1:
minimatch "^2.0.1"
once "^1.3.0"
glob@^5.0.14, glob@^5.0.15, glob@^5.0.3:
glob@^5.0.14, glob@^5.0.3:
version "5.0.15"
resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
dependencies:
@ -2959,7 +2994,7 @@ glob@^5.0.14, glob@^5.0.15, glob@^5.0.3:
once "^1.3.0"
path-is-absolute "^1.0.0"
glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@~7.1.1:
glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.0, glob@~7.1.1:
version "7.1.1"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
dependencies:
@ -3075,7 +3110,7 @@ got@^5.0.0:
unzip-response "^1.0.2"
url-parse-lax "^1.0.0"
graceful-fs@4.X, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
graceful-fs@4.X, 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"
@ -3247,8 +3282,8 @@ gulp-shell@^0.5.0:
through2 "^2.0.0"
gulp-sourcemaps@^1.5.2:
version "1.9.1"
resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.9.1.tgz#80ac2d3845d13e68dd962524d8a967a440b0b753"
version "1.9.3"
resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.9.3.tgz#df37ac54992b220a670dec1a04bf85bf7ae5efb5"
dependencies:
acorn "4.X"
convert-source-map "1.X"
@ -3275,14 +3310,14 @@ gulp-uglify@^1.5.1:
vinyl-sourcemaps-apply "^0.2.0"
gulp-util@*, gulp-util@^3.0, gulp-util@^3.0.0, gulp-util@^3.0.2, gulp-util@^3.0.6, gulp-util@^3.0.7:
version "3.0.7"
resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.7.tgz#78925c4b8f8b49005ac01a011c557e6218941cbb"
version "3.0.8"
resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f"
dependencies:
array-differ "^1.0.0"
array-uniq "^1.0.2"
beeper "^1.0.0"
chalk "^1.0.0"
dateformat "^1.0.11"
dateformat "^2.0.0"
fancy-log "^1.1.0"
gulplog "^1.0.0"
has-gulplog "^0.1.0"
@ -3510,8 +3545,8 @@ ignore@^3.2.0:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.0.tgz#8d88f03c3002a0ac52114db25d2c673b0bf1e435"
image-size@~0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.0.tgz#be7aed1c37b5ac3d9ba1d66a24b4c47ff8397651"
version "0.5.1"
resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.1.tgz#28eea8548a4b1443480ddddc1e083ae54652439f"
immutable@3.8.1, immutable@^3.7.6:
version "3.8.1"
@ -3697,6 +3732,14 @@ is-builtin-module@^1.0.0:
dependencies:
builtin-modules "^1.0.0"
is-callable@^1.1.1, is-callable@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
is-date-object@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
is-dotfile@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d"
@ -3817,6 +3860,10 @@ is-redirect@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
is-regex@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.3.tgz#0d55182bddf9f2fde278220aec3a75642c908637"
is-relative@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5"
@ -3843,6 +3890,10 @@ is-svg@^2.0.0:
dependencies:
html-comment-regex "^1.1.0"
is-symbol@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
is-typedarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
@ -4010,8 +4061,8 @@ jsonparse@^1.2.0:
resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.2.0.tgz#5c0c5685107160e72fe7489bddea0b44c2bc67bd"
jsonpointer@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.0.tgz#6661e161d2fc445f19f98430231343722e1fcbd5"
version "4.0.1"
resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
jsprim@^1.2.2:
version "1.3.1"
@ -4127,8 +4178,8 @@ lcid@^1.0.0:
invert-kv "^1.0.0"
"less@2.6.x || ^2.7.1":
version "2.7.1"
resolved "https://registry.yarnpkg.com/less/-/less-2.7.1.tgz#6cbfea22b3b830304e9a5fb371d54fa480c9d7cf"
version "2.7.2"
resolved "https://registry.yarnpkg.com/less/-/less-2.7.2.tgz#368d6cc73e1fb03981183280918743c5dcf9b3df"
optionalDependencies:
errno "^0.1.1"
graceful-fs "^4.1.2"
@ -4136,6 +4187,7 @@ lcid@^1.0.0:
mime "^1.2.11"
mkdirp "^0.5.0"
promise "^7.1.1"
request "^2.72.0"
source-map "^0.5.3"
levn@^0.3.0, levn@~0.3.0:
@ -4434,8 +4486,8 @@ lodash@^3.10.1:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
lodash@^4.0.0, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.6.1:
version "4.17.2"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42"
version "4.17.4"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
lodash@~1.0.1:
version "1.0.2"
@ -4523,7 +4575,7 @@ media-typer@0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
meow@^3.3.0, meow@^3.7.0:
meow@^3.7.0:
version "3.7.0"
resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
dependencies:
@ -4741,8 +4793,8 @@ mute-stream@0.0.6:
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db"
nan@^2.3.0, nan@^2.3.2:
version "2.4.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232"
version "2.5.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.0.tgz#aa8f1e34531d807e9e27755b234b4a6ec0c152a8"
natives@^1.1.0:
version "1.1.0"
@ -4775,8 +4827,8 @@ next-tick@^1.0.0:
resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
node-emoji@^1.4.1:
version "1.4.3"
resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.4.3.tgz#5272f70b823c4df6d7c39f84fd8203f35b3e5d36"
version "1.5.0"
resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.5.0.tgz#9a0d9fe03fd43afa357d6d8e439aa31e599959b7"
dependencies:
string.prototype.codepointat "^0.2.0"
@ -4950,7 +5002,7 @@ object-component@0.0.3:
version "0.0.3"
resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291"
object-keys@^1.0.4:
object-keys@^1.0.4, object-keys@^1.0.8:
version "1.0.11"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
@ -5390,8 +5442,8 @@ postcss-colormin@^2.1.8:
postcss-value-parser "^3.2.3"
postcss-convert-values@^2.3.4:
version "2.5.0"
resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.5.0.tgz#570aceb04b3061fb25f6f46bd0329e7ab6263c0b"
version "2.6.0"
resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.0.tgz#08c6d06130fe58a91a21ff50829e1aad6a3a1acc"
dependencies:
postcss "^5.0.11"
postcss-value-parser "^3.1.2"
@ -5523,10 +5575,12 @@ postcss-merge-longhand@^2.0.1:
postcss "^5.0.4"
postcss-merge-rules@^2.0.3:
version "2.0.11"
resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.0.11.tgz#c5d7c8de5056a7377aea0dff2fd83f92cafb9b8a"
version "2.1.0"
resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.0.tgz#24f28e70e3bdd9d4ffcc9d2814572ba7856df217"
dependencies:
caniuse-api "^1.5.2"
postcss "^5.0.4"
postcss-selector-parser "^2.2.2"
vendors "^1.0.0"
postcss-message-helpers@^2.0.0:
@ -5549,8 +5603,8 @@ postcss-minify-gradients@^1.0.1:
postcss-value-parser "^3.3.0"
postcss-minify-params@^1.0.4:
version "1.1.0"
resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.1.0.tgz#b6093472b5872a6deda47aa3b0b5b8b973547c50"
version "1.2.2"
resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3"
dependencies:
alphanum-sort "^1.0.1"
postcss "^5.0.2"
@ -5558,8 +5612,8 @@ postcss-minify-params@^1.0.4:
uniqs "^2.0.0"
postcss-minify-selectors@^2.0.4:
version "2.0.7"
resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.0.7.tgz#bfb9248fe14db33770f036572de6b4897c48d81c"
version "2.1.1"
resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf"
dependencies:
alphanum-sort "^1.0.2"
has "^1.0.1"
@ -5579,8 +5633,8 @@ postcss-normalize-charset@^1.1.0:
postcss "^5.0.5"
postcss-normalize-url@^3.0.7:
version "3.0.7"
resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.7.tgz#6bd90d0a4bc5a1df22c26ea65c53257dc3829f4e"
version "3.0.8"
resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222"
dependencies:
is-absolute-url "^2.0.0"
normalize-url "^1.4.0"
@ -5608,15 +5662,15 @@ postcss-pseudoelements@^3.0.0:
postcss "^5.0.4"
postcss-reduce-idents@^2.2.2:
version "2.3.1"
resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.3.1.tgz#024e8e219f52773313408573db9645ba62d2d2fe"
version "2.4.0"
resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3"
dependencies:
postcss "^5.0.4"
postcss-value-parser "^3.0.2"
postcss-reduce-initial@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.0.tgz#8f739b938289ef2e48936d7101783e4741ca9bbb"
version "1.0.1"
resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea"
dependencies:
postcss "^5.0.4"
@ -5656,7 +5710,7 @@ postcss-selector-parser@^1.1.4:
indexes-of "^1.0.1"
uniq "^1.0.1"
postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.0:
postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.0, postcss-selector-parser@^2.2.2:
version "2.2.2"
resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.2.tgz#3d70f5adda130da51c7c0c2fc023f56b1374fe08"
dependencies:
@ -5701,9 +5755,9 @@ postcss@^4.1.5, postcss@~4.1.12:
js-base64 "~2.1.8"
source-map "~0.4.2"
postcss@^5.0.0, postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.19, postcss@^5.0.2, postcss@^5.0.21, postcss@^5.0.3, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.8, postcss@^5.1.1, postcss@^5.2.0, postcss@^5.2.6:
version "5.2.6"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.6.tgz#a252cd67cd52585035f17e9ad12b35137a7bdd9e"
postcss@^5.0.0, postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.19, postcss@^5.0.2, postcss@^5.0.21, postcss@^5.0.3, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.8, postcss@^5.1.1, postcss@^5.2.0, postcss@^5.2.8:
version "5.2.9"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.9.tgz#282a644f92d4b871ade2d3ce8bd0ea46f18317b6"
dependencies:
chalk "^1.1.3"
js-base64 "^2.1.9"
@ -6075,7 +6129,7 @@ replace-ext@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
request@2, request@^2.55.0, request@^2.61.0, request@^2.74.0, request@^2.79.0:
request@2, request@^2.55.0, request@^2.61.0, request@^2.72.0, request@^2.74.0, request@^2.79.0:
version "2.79.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de"
dependencies:
@ -6356,7 +6410,7 @@ shasum@^1.0.0:
json-stable-stringify "~0.0.0"
sha.js "~2.4.4"
shell-quote@^1.4.2, shell-quote@^1.4.3:
shell-quote@^1.4.2, shell-quote@^1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
dependencies:
@ -6370,8 +6424,8 @@ shell-quote@~0.0.1:
resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-0.0.1.tgz#1a41196f3c0333c482323593d6886ecf153dd986"
shelljs@^0.7.0, shelljs@^0.7.5:
version "0.7.5"
resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.5.tgz#2eef7a50a21e1ccf37da00df767ec69e30ad0675"
version "0.7.6"
resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.6.tgz#379cccfb56b91c8601e4793356eb5382924de9ad"
dependencies:
glob "^7.0.0"
interpret "^1.0.0"
@ -6390,8 +6444,8 @@ signal-exit@^3.0.0:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
sinon@^1.17.2:
version "1.17.6"
resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.6.tgz#a43116db59577c8296356afee13fafc2332e58e1"
version "1.17.7"
resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.7.tgz#4542a4f49ba0c45c05eb2e9dd9d203e2b8efe0bf"
dependencies:
formatio "1.1.1"
lolex "1.3.2"
@ -6415,8 +6469,8 @@ slide@^1.1.5:
resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
slugify@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.0.2.tgz#dd8e70cdcff737c599d384020eb398596ecfd348"
version "1.1.0"
resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.1.0.tgz#7e5b0938d52b5efab1878247ef0f6a4f05db7ee0"
sntp@1.x.x:
version "1.0.9"
@ -6503,8 +6557,8 @@ snyk-try-require@^1.1.1, snyk-try-require@^1.2.0:
then-fs "^2.0.0"
snyk@^1.14.3:
version "1.22.1"
resolved "https://registry.yarnpkg.com/snyk/-/snyk-1.22.1.tgz#11cbac142bb506ed3e4951f388cfe49c8da5183f"
version "1.23.3"
resolved "https://registry.yarnpkg.com/snyk/-/snyk-1.23.3.tgz#2375b7aec424105febd8806180ea86fd59022681"
dependencies:
abbrev "^1.0.7"
ansi-escapes "^1.3.0"
@ -6621,8 +6675,8 @@ source-map-resolve@^0.3.0:
urix "~0.1.0"
source-map-support@^0.4.2:
version "0.4.6"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.6.tgz#32552aa64b458392a85eab3b0b5ee61527167aeb"
version "0.4.8"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.8.tgz#4871918d8a3af07289182e974e32844327b2e98b"
dependencies:
source-map "^0.5.3"
@ -6740,10 +6794,10 @@ stream-http@^1.2.0:
xtend "^4.0.0"
stream-http@^2.0.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.5.0.tgz#585eee513217ed98fe199817e7313b6f772a6802"
version "2.6.0"
resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.6.0.tgz#adf3309ced17624ebfb7ef13e6ac4cfe405a8b12"
dependencies:
builtin-status-codes "^2.0.0"
builtin-status-codes "^3.0.0"
inherits "^2.0.1"
readable-stream "^2.1.0"
to-arraybuffer "^1.0.0"
@ -6862,10 +6916,14 @@ strip-indent@^1.0.1:
dependencies:
get-stdin "^4.0.1"
strip-json-comments@~1.0.1, strip-json-comments@~1.0.4:
strip-json-comments@~1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91"
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"
subarg@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2"
@ -6971,8 +7029,8 @@ text-table@~0.2.0:
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
tfunk@^3.0.1:
version "3.0.2"
resolved "https://registry.yarnpkg.com/tfunk/-/tfunk-3.0.2.tgz#327ebc6176af2680c6cd0d6d22297c79d7f96efd"
version "3.1.0"
resolved "https://registry.yarnpkg.com/tfunk/-/tfunk-3.1.0.tgz#38e4414fc64977d87afdaa72facb6d29f82f7b5b"
dependencies:
chalk "^1.1.1"
object-path "^0.9.0"
@ -7030,8 +7088,8 @@ timed-out@^2.0.0:
resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-2.0.0.tgz#f38b0ae81d3747d628001f41dafc652ace671c0a"
timed-out@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.0.tgz#43b98b14bb712c9161c28f4dc1f3068d67a04ec2"
version "3.1.3"
resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217"
timers-browserify@^1.0.1:
version "1.4.2"
@ -7177,8 +7235,8 @@ uniq@^1.0.1:
resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
uniqid@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.0.tgz#33d9679f65022f48988a03fd24e7dcaf8f109eca"
version "4.1.1"
resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.1.tgz#89220ddf6b751ae52b5f72484863528596bb84c1"
dependencies:
macaddress "^0.2.8"
@ -7436,23 +7494,38 @@ vue-hot-reload-api@^1.3.2:
resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-1.3.3.tgz#54d22d83786a878493f639cc76bca7992a23be46"
vue-hot-reload-api@^2.0.1:
version "2.0.6"
resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.0.6.tgz#817d4bfb30f55428aa1012d029499e07f3147d21"
version "2.0.7"
resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.0.7.tgz#45bd46cfeee7fd22550b467a76fa0c4a0ceae51b"
vue-observe-visibility@^0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/vue-observe-visibility/-/vue-observe-visibility-0.1.3.tgz#c2f0fcb5c86d5ae244f53c7e28fa635a0db8ba36"
vue-resize@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/vue-resize/-/vue-resize-0.1.1.tgz#4b66cd2f0ccccb8f1c926089120358d141a6154b"
vue-template-compiler@^2.0.0-alpha.8:
version "2.1.6"
resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.1.6.tgz#f96f968652fc1e861bb0052f61993ba1fdc18ad3"
version "2.1.8"
resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.1.8.tgz#12dd1cc63793f59be580c694a61610cb9369d629"
dependencies:
de-indent "^1.0.2"
he "^1.1.0"
vue-template-es2015-compiler@^1.2.2:
version "1.4.0"
resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.4.0.tgz#7b88853ca4bf8d84ae54ab9e56771de271e60198"
version "1.5.0"
resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.5.0.tgz#e4f672ab1718a3abf9171a080daefac31be117e1"
vue@^2.0.1:
version "2.1.6"
resolved "https://registry.yarnpkg.com/vue/-/vue-2.1.6.tgz#2fc0024c07479ac6bc7d34a2cd5ef9ca5e90b143"
vue-virtual-scroller@^0.5.0:
version "0.5.1"
resolved "https://registry.yarnpkg.com/vue-virtual-scroller/-/vue-virtual-scroller-0.5.1.tgz#a978420643162ed57991be94c9cc8610af72f66e"
dependencies:
vue-observe-visibility "^0.1.3"
vue-resize "^0.1.0"
vue@^2.0.1, vue@^2.1.6:
version "2.1.8"
resolved "https://registry.yarnpkg.com/vue/-/vue-2.1.8.tgz#ae30aa86024fccf5535292ce414e7b4c221a1756"
vueify-insert-css@^1.0.0:
version "1.0.0"
@ -7477,6 +7550,12 @@ vueify@^9.1.0:
vue-template-compiler "^2.0.0-alpha.8"
vue-template-es2015-compiler "^1.2.2"
vuequery@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/vuequery/-/vuequery-1.0.0.tgz#e61317a83c0fb1a265114ff7969a9861a99298fc"
dependencies:
vue "^2.1.6"
watchify@^3.2.3:
version "3.8.0"
resolved "https://registry.yarnpkg.com/watchify/-/watchify-3.8.0.tgz#a5cacc3517ca1e637d7b0af745375cafb597d6bb"
@ -7508,8 +7587,8 @@ whatwg-encoding@^1.0.1:
iconv-lite "0.4.13"
whatwg-url@^4.1.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.1.1.tgz#567074923352de781e3500d64a86aa92a971b4a4"
version "4.2.0"
resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.2.0.tgz#abf1a3f5ff4bc2005b3f0c2119382631789d8e44"
dependencies:
tr46 "~0.0.3"
webidl-conversions "^3.0.0"
@ -7582,10 +7661,10 @@ wrappy@1:
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
write-file-atomic@^1.1.2:
version "1.2.0"
resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.2.0.tgz#14c66d4e4cb3ca0565c28cf3b7a6f3e4d5938fab"
version "1.3.1"
resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.1.tgz#7d45ba32316328dd1ec7d90f60ebc0d845bb759a"
dependencies:
graceful-fs "^4.1.2"
graceful-fs "^4.1.11"
imurmurhash "^0.1.4"
slide "^1.1.5"
@ -7644,8 +7723,8 @@ yargs-parser@^2.4.1:
lodash.assign "^4.0.6"
yargs-parser@^4.1.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.0.tgz#6ced869cd05a3dca6a1eaee38b68aeed4b0b4101"
version "4.2.1"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c"
dependencies:
camelcase "^3.0.0"