Add Sound implementation

environments/review-docs-renov-b1i8ag/deployments/15025
wvffle 2022-10-18 21:48:47 +00:00 zatwierdzone przez Georg Krause
rodzic 7b17c46987
commit e47dbc5ab5
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 2970D504B2183D22
13 zmienionych plików z 593 dodań i 442 usunięć

Wyświetl plik

@ -22,9 +22,9 @@
"@sentry/tracing": "7.17.2",
"@sentry/vue": "7.17.2",
"@vue/runtime-core": "3.2.41",
"@vueuse/core": "9.1.1",
"@vueuse/integrations": "9.1.1",
"@vueuse/router": "9.1.1",
"@vueuse/core": "9.3.0",
"@vueuse/integrations": "9.3.0",
"@vueuse/router": "9.3.0",
"axios": "0.27.2",
"axios-auth-refresh": "3.3.4",
"diff": "5.1.0",
@ -36,13 +36,13 @@
"lodash-es": "4.17.21",
"moment": "2.29.4",
"qs": "6.11.0",
"sass": "1.54.9",
"showdown": "2.1.0",
"standardized-audio-context": "^25.3.32",
"standardized-audio-context": "25.3.32",
"text-clipper": "2.2.0",
"transliteration": "2.3.5",
"universal-cookie": "4.0.4",
"vue": "3.2.41",
"vue": "3.2.40",
"vue-gettext": "2.1.12",
"vue-router": "4.1.6",
"vue-upload-component": "3.1.2",
@ -74,24 +74,25 @@
"@vue/test-utils": "2.2.1",
"@vue/tsconfig": "0.1.3",
"easygettext": "2.17.0",
"eslint": "8.23.1",
"eslint": "8.24.0",
"eslint-config-standard": "17.0.0",
"eslint-plugin-html": "7.1.0",
"eslint-plugin-import": "2.26.0",
"eslint-plugin-n": "15.2.5",
"eslint-plugin-n": "15.3.0",
"eslint-plugin-node": "11.1.0",
"eslint-plugin-promise": "6.0.1",
"eslint-plugin-vue": "9.4.0",
"eslint-plugin-vue": "9.6.0",
"jsdom": "20.0.1",
"moxios": "0.4.0",
"sass": "1.55.0",
"sinon": "14.0.1",
"typescript": "4.8.4",
"utility-types": "3.10.0",
"vite": "3.0.9",
"vite-plugin-pwa": "0.12.4",
"vite": "3.1.6",
"vite-plugin-pwa": "0.13.1",
"vite-plugin-vue-inspector": "1.1.3",
"vitest": "0.22.1",
"vue-tsc": "0.40.13",
"vitest": "0.24.0",
"vue-tsc": "1.0.0",
"workbox-core": "6.5.4",
"workbox-precaching": "6.5.4",
"workbox-routing": "6.5.4",

Wyświetl plik

@ -0,0 +1,5 @@
import { registerSoundImplementation } from '~/api/player'
window.funkwhale = {
registerSoundImplementation
}

Wyświetl plik

@ -0,0 +1,113 @@
import type { IAudioContext, IAudioNode } from 'standardized-audio-context'
import { createAudioSource } from '~/composables/audio/audio-api'
import { reactive, ref, type Ref } from 'vue'
import { createEventHook, refDefault, type EventHookOn } from '@vueuse/shared'
import { useEventListener } from '@vueuse/core'
export interface SoundSource {
uuid: string
mimetype: string
url: string
}
export interface Sound {
preload(): void | Promise<void>
dispose(): void
readonly audioNode: IAudioNode<IAudioContext>
readonly isLoaded: Ref<boolean>
readonly currentTime: number
readonly duration: number
readonly buffered: number
play(): void | Promise<void>
pause(): void | Promise<void>
seekTo(seconds: number): void | Promise<void>
seekBy(seconds: number): void | Promise<void>
onSoundEnd: EventHookOn<Sound>
}
export const soundImplementations = reactive(new Set<Constructor<Sound>>())
export const registerSoundImplementation = <T extends Constructor<Sound>>(implementation: T) => {
soundImplementations.add(implementation)
return implementation
}
// Default Sound implementation
@registerSoundImplementation
export class HTMLSound implements Sound {
#audio = new Audio()
#soundEndEventHook = createEventHook<HTMLSound>()
readonly isLoaded = ref(false)
audioNode = createAudioSource(this.#audio)
onSoundEnd: EventHookOn<HTMLSound>
constructor (sources: SoundSource[]) {
// TODO: Quality picker
this.#audio.src = sources[0].url
this.#audio.preload = 'auto'
useEventListener(this.#audio, 'ended', () => this.#soundEndEventHook.trigger(this))
useEventListener(this.#audio, 'loadeddata', () => {
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/readyState
this.isLoaded.value = this.#audio.readyState >= 2
})
this.onSoundEnd = this.#soundEndEventHook.on
}
preload () {
this.#audio.load()
}
dispose () {
this.audioNode.disconnect()
}
async play () {
this.#audio.play()
}
async pause () {
this.#audio.pause()
}
async seekTo (seconds: number) {
this.#audio.currentTime = seconds
}
async seekBy (seconds: number) {
this.#audio.currentTime += seconds
}
get duration () {
const { duration } = this.#audio
return isNaN(duration) ? 0 : duration
}
get buffered () {
// https://developer.mozilla.org/en-US/docs/Web/Guide/Audio_and_video_delivery/buffering_seeking_time_ranges#creating_our_own_buffering_feedback
if (this.duration > 0) {
const { length } = this.#audio.buffered
for (let i = 0; i < length; i++) {
if (this.#audio.buffered.start(length - 1 - i) < this.#audio.currentTime) {
return this.#audio.buffered.end(length - 1 - i)
}
}
}
return 0
}
get currentTime () {
return this.#audio.currentTime
}
}
export const soundImplementation = refDefault(ref<Constructor<Sound>>(), HTMLSound)

Wyświetl plik

@ -1,13 +1,29 @@
<script setup lang="ts">
import { initializeFirstTrack, isPlaying, _seekEnd } from '~/composables/audio/player'
import {
LoopingMode,
initializeFirstTrack,
isPlaying,
mute,
volume,
toggleLooping,
looping,
seekBy,
seekTo,
currentTime,
duration,
progress,
bufferProgress,
loading as isLoadingAudio
} from '~/composables/audio/player'
import { useMouse, useWindowSize } from '@vueuse/core'
import { useGettext } from 'vue3-gettext'
import { computed, ref } from 'vue'
import { useStore } from '~/store'
import onKeyboardShortcut from '~/composables/onKeyboardShortcut'
import usePlayer from '~/composables/audio/usePlayer'
import useQueue from '~/composables/audio/useQueue'
import time from '~/utils/time'
import TrackFavoriteIcon from '~/components/favorites/TrackFavoriteIcon.vue'
import TrackPlaylistIcon from '~/components/playlists/TrackPlaylistIcon.vue'
@ -33,40 +49,23 @@ const {
next
} = useQueue()
const {
playing,
loading: isLoadingAudio,
looping,
currentTime,
progress,
durationFormatted,
currentTimeFormatted,
bufferProgress,
duration,
toggleMute,
seek,
togglePlayback,
resume,
pause
} = usePlayer()
// Key binds
onKeyboardShortcut('e', toggleMobilePlayer)
onKeyboardShortcut('p', togglePlayback)
onKeyboardShortcut('p', () => { isPlaying.value = !isPlaying.value })
onKeyboardShortcut('s', shuffle)
onKeyboardShortcut('q', () => store.dispatch('queue/clean'))
onKeyboardShortcut('m', () => toggleMute)
onKeyboardShortcut('l', () => store.commit('player/toggleLooping'))
onKeyboardShortcut('m', mute)
onKeyboardShortcut('l', toggleLooping)
onKeyboardShortcut('f', () => store.dispatch('favorites/toggle', currentTrack.value?.id))
onKeyboardShortcut('escape', () => store.commit('ui/queueFocused', null))
onKeyboardShortcut(['shift', 'up'], () => store.commit('player/incrementVolume', 0.1), true)
onKeyboardShortcut(['shift', 'down'], () => store.commit('player/incrementVolume', -0.1), true)
onKeyboardShortcut(['shift', 'up'], () => (volume.value += 0.1), true)
onKeyboardShortcut(['shift', 'down'], () => (volume.value -= 0.1), true)
onKeyboardShortcut('right', () => seek(5), true)
onKeyboardShortcut(['shift', 'right'], () => seek(30), true)
onKeyboardShortcut('left', () => seek(-5), true)
onKeyboardShortcut(['shift', 'left'], () => seek(-30), true)
onKeyboardShortcut('right', () => seekBy(5), true)
onKeyboardShortcut(['shift', 'right'], () => seekBy(30), true)
onKeyboardShortcut('left', () => seekBy(-5), true)
onKeyboardShortcut(['shift', 'left'], () => seekBy(-30), true)
onKeyboardShortcut(['ctrl', 'shift', 'left'], previous, true)
onKeyboardShortcut(['ctrl', 'shift', 'right'], next, true)
@ -80,9 +79,6 @@ const labels = computed(() => ({
unmute: $pgettext('Sidebar/Player/Icon.Tooltip/Verb', 'Unmute'),
mute: $pgettext('Sidebar/Player/Icon.Tooltip/Verb', 'Mute'),
expandQueue: $pgettext('Sidebar/Player/Icon.Tooltip/Verb', 'Expand queue'),
loopingDisabled: $pgettext('Sidebar/Player/Icon.Tooltip', 'Looping disabled. Click to switch to single-track looping.'),
loopingSingle: $pgettext('Sidebar/Player/Icon.Tooltip', 'Looping on a single track. Click to switch to whole queue looping.'),
loopingWhole: $pgettext('Sidebar/Player/Icon.Tooltip', 'Looping on whole queue. Click to disable looping.'),
shuffle: $pgettext('Sidebar/Player/Icon.Tooltip/Verb', 'Shuffle your queue'),
clear: $pgettext('Sidebar/Player/Icon.Tooltip/Verb', 'Clear your queue'),
addArtistContentFilter: $pgettext('Sidebar/Player/Icon.Tooltip/Verb', 'Hide content from this artist…')
@ -95,15 +91,24 @@ const switchTab = () => {
const progressBar = ref()
const touchProgress = (event: MouseEvent) => {
const time = ((event.clientX - ((event.target as Element).closest('.progress')?.getBoundingClientRect().left ?? 0)) / progressBar.value.offsetWidth) * duration.value
currentTime.value = time
seekTo(time)
}
const { x } = useMouse()
const { width: screenWidth } = useWindowSize()
const { x } = useMouse({ type: 'client' })
const { width: screenWidth } = useWindowSize({ includeScrollbar: false })
initializeFirstTrack()
onKeyboardShortcut('w', () => { isPlaying.value = !isPlaying.value })
onKeyboardShortcut('9', () => { _seekEnd() })
const loopingTitle = computed(() => {
const mode = looping.value
return mode === LoopingMode.None
? $pgettext('Sidebar/Player/Icon.Tooltip', 'Looping disabled. Click to switch to single-track looping.')
: mode === LoopingMode.LoopTrack
? $pgettext('Sidebar/Player/Icon.Tooltip', 'Looping on a single track. Click to switch to whole queue looping.')
: $pgettext('Sidebar/Player/Icon.Tooltip', 'Looping on whole queue. Click to disable looping.')
})
const currentTimeFormatted = computed(() => time.parse(Math.round(currentTime.value)))
</script>
<template>
@ -136,7 +141,7 @@ onKeyboardShortcut('9', () => { _seekEnd() })
/>
<div
class="position bar"
:style="{ 'transform': `translateX(calc(${progress}% - 100%)` }"
:style="{ 'transform': `translateX(${progress - 100}%)` }"
/>
<div
class="seek bar"
@ -264,11 +269,11 @@ onKeyboardShortcut('9', () => { _seekEnd() })
<i :class="['ui', 'large', {'disabled': !hasPrevious}, 'backward step', 'icon']" />
</button>
<button
v-if="!playing"
v-if="!isPlaying"
:title="labels.play"
:aria-label="labels.play"
class="circular button control"
@click.prevent.stop="resume"
@click.prevent.stop="isPlaying = true"
>
<i :class="['ui', 'big', 'play', {'disabled': !currentTrack}, 'icon']" />
</button>
@ -277,7 +282,7 @@ onKeyboardShortcut('9', () => { _seekEnd() })
:title="labels.pause"
:aria-label="labels.pause"
class="circular button control"
@click.prevent.stop="pause"
@click.prevent.stop="isPlaying = false"
>
<i :class="['ui', 'big', 'pause', {'disabled': !currentTrack}, 'icon']" />
</button>
@ -297,12 +302,12 @@ onKeyboardShortcut('9', () => { _seekEnd() })
<template v-if="!isLoadingAudio">
<span
class="start"
@click.stop.prevent="currentTime = 0"
@click.stop.prevent="seekTo(0)"
>
{{ currentTimeFormatted }}
</span>
|
<span class="total">{{ durationFormatted }}</span>
<span class="total">{{ time.parse(Math.round(duration)) }}</span>
</template>
</div>
</div>
@ -310,43 +315,24 @@ onKeyboardShortcut('9', () => { _seekEnd() })
<div class="group">
<volume-control class="expandable" />
<button
v-if="looping === 0"
class="circular control button"
:title="labels.loopingDisabled"
:aria-label="labels.loopingDisabled"
:class="{ looping: looping !== LoopingMode.None }"
:title="loopingTitle"
:aria-label="loopingTitle"
:disabled="!currentTrack"
@click.prevent.stop="$store.commit('player/looping', 1)"
@click.prevent.stop="toggleLooping"
>
<i :class="['ui', {'disabled': !currentTrack}, 'step', 'repeat', 'icon']" />
</button>
<button
v-if="looping === 1"
:title="labels.loopingSingle"
:aria-label="labels.loopingSingle"
:disabled="!currentTrack"
class="looping circular control button"
@click.prevent.stop="$store.commit('player/looping', 2)"
>
<i
class="repeat icon"
>
<span class="ui circular tiny vibrant label">1</span>
</i>
</button>
<button
v-if="looping === 2"
class="looping circular control button"
:title="labels.loopingWhole"
:aria-label="labels.loopingWhole"
:disabled="!currentTrack"
@click.prevent.stop="$store.commit('player/looping', 0)"
>
<i
class="repeat icon"
>
<span class="ui circular tiny vibrant label">&infin;</span>
<i class="repeat icon">
<span
v-if="looping !== LoopingMode.None"
class="ui circular tiny vibrant label"
>
<template v-if="looping === LoopingMode.LoopTrack">1</template>
<template v-else-if="looping === LoopingMode.LoopQueue">&infin;</template>
</span>
</i>
</button>
<button
class="circular control button"
:disabled="queueIsEmpty || null"

Wyświetl plik

@ -1,11 +1,11 @@
import type { IAudioContext, IMediaElementAudioSourceNode } from 'standardized-audio-context'
import type { IAudioContext, IAudioNode } from 'standardized-audio-context'
import { AudioContext } from 'standardized-audio-context'
import { useEventListener } from '@vueuse/core'
// Audio nodes
const AUDIO_CONTEXT = new AudioContext()
const GAIN_NODE = AUDIO_CONTEXT.createGain()
export const AUDIO_CONTEXT = new AudioContext()
export const GAIN_NODE = AUDIO_CONTEXT.createGain()
// Unlock AudioContext automatically
const UNLOCK_EVENTS = ['touchstart', 'touchend', 'mousedown', 'keydown']
@ -18,14 +18,17 @@ for (const event of UNLOCK_EVENTS) {
// Connect Gain Node
GAIN_NODE.connect(AUDIO_CONTEXT.destination)
GAIN_NODE.gain.value = 1
export const setGain = (value: number) => {
GAIN_NODE.gain.value = Math.max(0, Math.min(value, 1))
}
// TODO (wvffle): Create equalizer filters
const equalizerFilters = [
GAIN_NODE
]
export const connectAudioSource = (sourceNode: IMediaElementAudioSourceNode<IAudioContext>) => {
export const connectAudioSource = (sourceNode: IAudioNode<IAudioContext>) => {
for (const filter of equalizerFilters) {
sourceNode.connect(filter)
}

Wyświetl plik

@ -1,23 +1,24 @@
import { getCurrentSound, createTrack } from '~/composables/audio/tracks'
import { tryOnMounted } from '@vueuse/core'
import { ref, watch } from 'vue'
import { currentSound, createTrack } from '~/composables/audio/tracks'
import { tryOnMounted, useIntervalFn, useRafFn, useStorage } from '@vueuse/core'
import { computed, ref, watch, watchEffect, type Ref } from 'vue'
import useQueue from '~/composables/audio/useQueue'
import { setGain } from './audio-api'
const { currentIndex } = useQueue()
export const isPlaying = ref(false)
watch(isPlaying, (playing) => {
const sound = getCurrentSound()
const sound = currentSound.value
if (!sound) return
if (playing) {
sound.audio.play()
sound.play()
return
}
sound.audio.pause()
sound.pause()
})
// Create first track when we initalize the page
@ -25,9 +26,109 @@ export const initializeFirstTrack = () => tryOnMounted(() => {
createTrack(currentIndex.value)
})
export const _seekEnd = () => {
const sound = getCurrentSound()
// Volume
const lastVolume = useStorage('player:last-volume', 0.7)
export const volume: Ref<number> = useStorage('player:volume', 0.7)
watch(volume, (to, from) => setGain(to))
export const mute = () => {
if (volume.value > 0) {
lastVolume.value = volume.value
volume.value = 0
return
}
if (lastVolume.value === 0) {
volume.value = 0.7
return
}
volume.value = lastVolume.value
}
// Looping
export enum LoopingMode {
None,
LoopTrack,
LoopQueue
}
const MODE_MAX = 1 + Math.max(...Object.values(LoopingMode).filter(mode => typeof mode === 'number') as number[])
export const looping: Ref<number> = useStorage('player:looping', LoopingMode.None)
export const toggleLooping = () => {
looping.value += 1
looping.value %= MODE_MAX
}
// Duration
export const duration = ref(0)
watchEffect(() => {
if (currentSound.value?.isLoaded.value) {
duration.value = currentSound.value?.duration ?? 0
return
}
duration.value = 0
})
// Current time
export const currentTime = ref(0)
useIntervalFn(() => {
const sound = currentSound.value
if (!sound) {
currentTime.value = 0
return
}
currentTime.value = sound.currentTime
}, 1000)
// Seeking
export const seekBy = async (seconds: number) => {
const sound = currentSound.value
if (!sound) return
sound.audio.currentTime = sound.audio.duration - 3
await sound.seekBy(seconds)
currentTime.value = sound.currentTime
}
export const seekTo = async (seconds: number) => {
const sound = currentSound.value
if (!sound) return
await sound.seekTo(seconds)
currentTime.value = sound.currentTime
}
// Buffer progress
export const bufferProgress = ref(0)
useIntervalFn(() => {
const sound = currentSound.value
if (!sound) {
bufferProgress.value = 0
return
}
bufferProgress.value = sound.buffered / sound.duration * 100
}, 1000)
// Progress
export const progress = ref(0)
useRafFn(() => {
const sound = currentSound.value
if (!sound) {
progress.value = 0
return
}
progress.value = sound.currentTime / sound.duration * 100
})
// Loading
export const loading = computed(() => {
const sound = currentSound.value
if (!sound) return false
return !sound.isLoaded.value
})

Wyświetl plik

@ -1,26 +1,24 @@
import type { IAudioContext, IMediaElementAudioSourceNode } from 'standardized-audio-context'
import type { Sound, SoundSource } from '~/api/player'
import type { Track, Upload } from '~/types'
import { connectAudioSource, createAudioSource } from '~/composables/audio/audio-api'
import { connectAudioSource } from '~/composables/audio/audio-api'
import { isPlaying } from '~/composables/audio/player'
import { soundImplementation } from '~/api/player'
import { computed, shallowReactive } from 'vue'
import useQueue from '~/composables/audio/useQueue'
import { useEventListener } from '@vueuse/core'
import store from '~/store'
import axios from 'axios'
export interface SoundSource {
uuid: string
mimetype: string
url: string
}
const createOnEndHandler = (sound: Sound) => () => {
console.log('TRACK ENDED, PLAYING NEXT')
createTrack(currentIndex.value + 1)
export interface Sound {
audio: HTMLAudioElement
sources: SoundSource[]
sourceNode: IMediaElementAudioSourceNode<IAudioContext>
// NOTE: We push it to the end of the job queue
setTimeout(() => {
store.dispatch('queue/next')
}, 0)
}
const ALLOWED_PLAY_TYPES: (CanPlayTypeResult | undefined)[] = ['maybe', 'probably']
@ -29,7 +27,7 @@ const AUDIO_ELEMENT = document.createElement('audio')
const { tracks, currentIndex } = useQueue()
const soundPromises = new Map<number, Promise<Sound>>()
const soundCache = new Map<number, Sound>()
const soundCache = shallowReactive(new Map<number, Sound>())
const getUploadSources = (uploads: Upload[]): SoundSource[] => {
const sources = uploads
@ -78,12 +76,10 @@ export const createSound = async (track: Track): Promise<Sound> => {
const createSoundPromise = async () => {
const sources = await getTrackSources(track)
const audio = new Audio()
audio.src = sources[0].url
const SoundImplementation = soundImplementation.value
const sound = new SoundImplementation(sources)
sound.onSoundEnd(createOnEndHandler(sound))
const sourceNode = createAudioSource(audio)
const sound = { audio, sources, sourceNode }
soundCache.set(track.id, sound)
soundPromises.delete(track.id)
return sound
@ -101,33 +97,27 @@ export const createTrack = async (index: number) => {
const track = tracks.value[index]
if (!soundPromises.has(track.id) && !soundCache.has(track.id)) {
// TODO (wvffle): Resolve race condition
// TODO (wvffle): Resolve race condition - is it still here after adding soundPromises?
console.log('NO TRACK IN CACHE, CREATING')
}
const sound = await createSound(track)
console.log('CONNECTING NODE')
const stop = useEventListener(sound.audio, 'ended', () => {
createTrack(currentIndex.value + 1)
store.dispatch('queue/next')
stop()
})
sound.sourceNode.disconnect()
connectAudioSource(sound.sourceNode)
sound.audioNode.disconnect()
connectAudioSource(sound.audioNode)
if (isPlaying.value) {
sound.audio.play()
await sound.play()
}
// NOTE: Preload next track
if (index + 1 < tracks.value.length) {
createSound(tracks.value[index + 1])
.then(sound => sound.audio.load())
if (index === currentIndex.value && index + 1 < tracks.value.length) {
setTimeout(async () => {
const sound = await createSound(tracks.value[index + 1])
await sound.preload()
}, 100)
}
}
export const getCurrentSound = () => {
return soundCache.get(tracks.value[currentIndex.value]?.id ?? -1)
}
export const currentSound = computed(() => soundCache.get(tracks.value[currentIndex.value]?.id ?? -1))

Wyświetl plik

@ -89,7 +89,6 @@ watchEffect(() => Howler.volume(toLinearVolumeScale(volume.value)))
const mute = () => store.dispatch('player/mute')
const unmute = () => store.dispatch('player/unmute')
const toggleMute = () => store.dispatch('player/toggleMute')
// Time and duration
const duration = computed(() => store.state.player.duration)
@ -245,7 +244,6 @@ export default () => {
volume,
mute,
unmute,
toggleMute,
duration,
currentTime,

Wyświetl plik

@ -1,11 +1,15 @@
import type { InitModule } from '~/types'
import router from '~/router'
import store, { key } from '~/store'
import router from '~/router'
import { createApp, defineAsyncComponent, h } from 'vue'
import useLogger from '~/composables/useLogger'
import useTheme from '~/composables/useTheme'
import '~/api'
// NOTE: Set the theme as fast as possible
useTheme()

12
front/src/shims-funkwhale.d.ts vendored 100644
Wyświetl plik

@ -0,0 +1,12 @@
export declare global {
interface Window {
funkwhale: {
registerSoundImplementation: (implementation: SoundImplementation) => void
}
}
type Constructor<T> = {
new(...args: any[]): T;
readonly prototype: T;
}
}

Wyświetl plik

@ -136,14 +136,6 @@ const store: Module<State, RootState> = {
pausePlayback ({ commit }) {
commit('playing', false)
},
toggleMute ({ commit, state }) {
if (state.volume > 0) {
commit('tempVolume', state.volume)
commit('volume', 0)
} else {
commit('volume', state.tempVolume)
}
},
trackListened ({ rootState }, track) {
if (!rootState.auth.authenticated) {
return

Wyświetl plik

@ -4,6 +4,7 @@
"baseUrl": ".",
"sourceMap": true,
"noUnusedLocals": true,
"experimentalDecorators": true,
"typeRoots": ["node_modules/@types"],
"types": [
"vitest/globals",

Wyświetl plik

@ -898,7 +898,7 @@
"@babel/types" "^7.4.4"
esutils "^2.0.2"
"@babel/runtime@^7.11.2", "@babel/runtime@^7.19.4", "@babel/runtime@^7.8.4":
"@babel/runtime@^7.11.2", "@babel/runtime@^7.19.0", "@babel/runtime@^7.19.4", "@babel/runtime@^7.8.4":
version "7.20.0"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.0.tgz#824a9ef325ffde6f78056059db3168c08785e24a"
integrity sha512-NDYdls71fTXoU8TZHfbBWg7DiZfNzClcKui/+kyi6ppD2L1qnWW3VV6CjtaBXSUGGhiTWJ6ereOIkUvenif66Q==
@ -949,11 +949,6 @@
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.12.tgz#e548b10a5e55b9e10537a049ebf0bc72c453b769"
integrity sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA==
"@esbuild/linux-loong64@0.14.54":
version "0.14.54"
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028"
integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==
"@esbuild/linux-loong64@0.15.12":
version "0.15.12"
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.12.tgz#475b33a2631a3d8ca8aa95ee127f9a61d95bf9c1"
@ -974,7 +969,7 @@
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
"@humanwhocodes/config-array@^0.10.4":
"@humanwhocodes/config-array@^0.10.5":
version "0.10.7"
resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz#6d53769fd0c222767e6452e8ebda825c22e9f0dc"
integrity sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==
@ -1621,48 +1616,58 @@
c8 "^7.12.0"
vitest "0.24.3"
"@volar/code-gen@0.40.13":
version "0.40.13"
resolved "https://registry.yarnpkg.com/@volar/code-gen/-/code-gen-0.40.13.tgz#cd69a67b11462b93d79ea2139f9f1e0a76e15111"
integrity sha512-4gShBWuMce868OVvgyA1cU5WxHbjfEme18Tw6uVMfweZCF5fB2KECG0iPrA9D54vHk3FeHarODNwgIaaFfUBlA==
"@volar/language-core@1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-1.0.0.tgz#57fea42d061793f39f7231ed41f2533cf9ce2d5b"
integrity sha512-gUeIyRmPD9dtCAADK+ZCr0n4n1lbwsGJ+ulQn//phfD+p9B1E9B4o2WRoeOOAkcqXZTEFmCxtg+S6Pa0pwUVHA==
dependencies:
"@volar/source-map" "0.40.13"
"@volar/source-map" "1.0.0"
"@vue/reactivity" "^3.2.38"
muggle-string "^0.1.0"
"@volar/source-map@0.40.13":
version "0.40.13"
resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-0.40.13.tgz#9acbc47614bbd8fa710d233d10fff1b18cb78a80"
integrity sha512-dbdkAB2Nxb0wLjAY5O64o3ywVWlAGONnBIoKAkXSf6qkGZM+nJxcizsoiI66K+RHQG0XqlyvjDizfnTxr+6PWg==
"@volar/source-map@1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-1.0.0.tgz#963d281d4e4bcba32592bc77b2b1f1f4c0b8ea43"
integrity sha512-EyIauGZmii2d4FicOw9eUnjq5nX/lqxKoPDPAZSGfkYOI/zfhhRydjLWR/BTbtPEV+Pqu6p5QjV3ts2/jQtKPw==
dependencies:
"@vue/reactivity" "3.2.38"
muggle-string "^0.1.0"
"@volar/typescript-faster@0.40.13":
version "0.40.13"
resolved "https://registry.yarnpkg.com/@volar/typescript-faster/-/typescript-faster-0.40.13.tgz#5d9600333cc250ad53e8604ff6a2a32e4acfbc86"
integrity sha512-uy+TlcFkKoNlKEnxA4x5acxdxLyVDIXGSc8cYDNXpPKjBKXrQaetzCzlO3kVBqu1VLMxKNGJMTKn35mo+ILQmw==
"@volar/typescript-faster@1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@volar/typescript-faster/-/typescript-faster-1.0.0.tgz#5ab4315148baec2feb5eb4a1efabb8b79de1c5b0"
integrity sha512-QsKMB2bEfWMKaPKW5HDmvBsusIgGx0WG1U30EaHwpnME25XZSJh1a5BZh9uUQcZteLkjtEfAmCI2PkfDgz1zew==
dependencies:
semver "^7.3.7"
"@volar/vue-language-core@0.40.13":
version "0.40.13"
resolved "https://registry.yarnpkg.com/@volar/vue-language-core/-/vue-language-core-0.40.13.tgz#13a79c29ef63d66a40afd1b29166404703b240c4"
integrity sha512-QkCb8msi2KUitTdM6Y4kAb7/ZlEvuLcbBFOC2PLBlFuoZwyxvSP7c/dBGmKGtJlEvMX0LdCyrg5V2aBYxD38/Q==
"@volar/typescript@1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-1.0.0.tgz#281567d955285cdddd9bd8f396e88acdb7d7ac03"
integrity sha512-0BsNJnN/VuQ3WQ3RmdJo7Xf8pwT0JCV0xdtgH9okEMeuXBLPZjg7tKwDHT3TY8ord1mVk0tjNnzyQJAhaQ8t0w==
dependencies:
"@volar/code-gen" "0.40.13"
"@volar/source-map" "0.40.13"
"@vue/compiler-core" "^3.2.38"
"@volar/language-core" "1.0.0"
"@volar/typescript-faster" "1.0.0"
"@volar/vue-language-core@1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@volar/vue-language-core/-/vue-language-core-1.0.0.tgz#fae737411063c55d83169581c6882e93bb50629c"
integrity sha512-BYJvROEGNMDxTbyT7j9B9i8VDeLzEwDijNy2WactsK4mhruYRp911BwI9UNia4dD6RgMhyIShExRNoCwtCNMtw==
dependencies:
"@volar/language-core" "1.0.0"
"@volar/source-map" "1.0.0"
"@vue/compiler-dom" "^3.2.38"
"@vue/compiler-sfc" "^3.2.38"
"@vue/reactivity" "^3.2.38"
"@vue/shared" "^3.2.38"
minimatch "^5.1.0"
vue-template-compiler "^2.7.10"
"@volar/vue-typescript@0.40.13":
version "0.40.13"
resolved "https://registry.yarnpkg.com/@volar/vue-typescript/-/vue-typescript-0.40.13.tgz#50fe8e0965f4e14596eca57550b5ca13388c244c"
integrity sha512-o7bNztwjs8JmbQjVkrnbZUOfm7q4B8ZYssETISN1tRaBdun6cfNqgpkvDYd+VUBh1O4CdksvN+5BUNnwAz4oCQ==
"@volar/vue-typescript@1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@volar/vue-typescript/-/vue-typescript-1.0.0.tgz#322bc9b354d08a92bd51e64a42594aa3f97e62ba"
integrity sha512-W9qU96gdApnEgHZf6i9BKQVDJqreYKVsXDRdJPtJEeykSwi6an0LYwgkpCfDjW3pyeVYSYAxVegYE8rSo9k4IA==
dependencies:
"@volar/code-gen" "0.40.13"
"@volar/typescript-faster" "0.40.13"
"@volar/vue-language-core" "0.40.13"
"@volar/typescript" "1.0.0"
"@volar/vue-language-core" "1.0.0"
"@vue/babel-helper-vue-transform-on@^1.0.2":
version "1.0.2"
@ -1684,7 +1689,17 @@
html-tags "^3.1.0"
svg-tags "^1.0.0"
"@vue/compiler-core@3.2.41", "@vue/compiler-core@^3.2.38":
"@vue/compiler-core@3.2.40":
version "3.2.40"
resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.40.tgz#c785501f09536748121e937fb87605bbb1ada8e5"
integrity sha512-2Dc3Stk0J/VyQ4OUr2yEC53kU28614lZS+bnrCbFSAIftBJ40g/2yQzf4mPBiFuqguMB7hyHaujdgZAQ67kZYA==
dependencies:
"@babel/parser" "^7.16.4"
"@vue/shared" "3.2.40"
estree-walker "^2.0.2"
source-map "^0.6.1"
"@vue/compiler-core@3.2.41":
version "3.2.41"
resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.41.tgz#fb5b25f23817400f44377d878a0cdead808453ef"
integrity sha512-oA4mH6SA78DT+96/nsi4p9DX97PHcNROxs51lYk7gb9Z4BPKQ3Mh+BLn6CQZBw857Iuhu28BfMSRHAlPvD4vlw==
@ -1694,6 +1709,14 @@
estree-walker "^2.0.2"
source-map "^0.6.1"
"@vue/compiler-dom@3.2.40":
version "3.2.40"
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.40.tgz#c225418773774db536174d30d3f25ba42a33e7e4"
integrity sha512-OZCNyYVC2LQJy4H7h0o28rtk+4v+HMQygRTpmibGoG9wZyomQiS5otU7qo3Wlq5UfHDw2RFwxb9BJgKjVpjrQw==
dependencies:
"@vue/compiler-core" "3.2.40"
"@vue/shared" "3.2.40"
"@vue/compiler-dom@3.2.41", "@vue/compiler-dom@^3.2.31", "@vue/compiler-dom@^3.2.38":
version "3.2.41"
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.41.tgz#dc63dcd3ce8ca8a8721f14009d498a7a54380299"
@ -1702,6 +1725,22 @@
"@vue/compiler-core" "3.2.41"
"@vue/shared" "3.2.41"
"@vue/compiler-sfc@3.2.40":
version "3.2.40"
resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.40.tgz#61823283efc84d25d9d2989458f305d32a2ed141"
integrity sha512-tzqwniIN1fu1PDHC3CpqY/dPCfN/RN1thpBC+g69kJcrl7mbGiHKNwbA6kJ3XKKy8R6JLKqcpVugqN4HkeBFFg==
dependencies:
"@babel/parser" "^7.16.4"
"@vue/compiler-core" "3.2.40"
"@vue/compiler-dom" "3.2.40"
"@vue/compiler-ssr" "3.2.40"
"@vue/reactivity-transform" "3.2.40"
"@vue/shared" "3.2.40"
estree-walker "^2.0.2"
magic-string "^0.25.7"
postcss "^8.1.10"
source-map "^0.6.1"
"@vue/compiler-sfc@3.2.41", "@vue/compiler-sfc@^3.0.0", "@vue/compiler-sfc@^3.2.38":
version "3.2.41"
resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.41.tgz#238fb8c48318408c856748f4116aff8cc1dc2a73"
@ -1718,6 +1757,14 @@
postcss "^8.1.10"
source-map "^0.6.1"
"@vue/compiler-ssr@3.2.40":
version "3.2.40"
resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.40.tgz#67df95a096c63e9ec4b50b84cc6f05816793629c"
integrity sha512-80cQcgasKjrPPuKcxwuCx7feq+wC6oFl5YaKSee9pV3DNq+6fmCVwEEC3vvkf/E2aI76rIJSOYHsWSEIxK74oQ==
dependencies:
"@vue/compiler-dom" "3.2.40"
"@vue/shared" "3.2.40"
"@vue/compiler-ssr@3.2.41":
version "3.2.41"
resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.41.tgz#344f564d68584b33367731c04ffc949784611fcb"
@ -1752,6 +1799,17 @@
"@typescript-eslint/parser" "^5.0.0"
vue-eslint-parser "^9.0.0"
"@vue/reactivity-transform@3.2.40":
version "3.2.40"
resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.40.tgz#dc24b9074b26f0d9dd2034c6349f5bb2a51c86ac"
integrity sha512-HQUCVwEaacq6fGEsg2NUuGKIhUveMCjOk8jGHqLXPI2w6zFoPrlQhwWEaINTv5kkZDXKEnCijAp+4gNEHG03yw==
dependencies:
"@babel/parser" "^7.16.4"
"@vue/compiler-core" "3.2.40"
"@vue/shared" "3.2.40"
estree-walker "^2.0.2"
magic-string "^0.25.7"
"@vue/reactivity-transform@3.2.41":
version "3.2.41"
resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.41.tgz#9ff938877600c97f646e09ac1959b5150fb11a0c"
@ -1763,12 +1821,12 @@
estree-walker "^2.0.2"
magic-string "^0.25.7"
"@vue/reactivity@3.2.38":
version "3.2.38"
resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.38.tgz#d576fdcea98eefb96a1f1ad456e289263e87292e"
integrity sha512-6L4myYcH9HG2M25co7/BSo0skKFHpAN8PhkNPM4xRVkyGl1K5M3Jx4rp5bsYhvYze2K4+l+pioN4e6ZwFLUVtw==
"@vue/reactivity@3.2.40":
version "3.2.40"
resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.40.tgz#ae65496f5b364e4e481c426f391568ed7d133cca"
integrity sha512-N9qgGLlZmtUBMHF9xDT4EkD9RdXde1Xbveb+niWMXuHVWQP5BzgRmE3SFyUBBcyayG4y1lhoz+lphGRRxxK4RA==
dependencies:
"@vue/shared" "3.2.38"
"@vue/shared" "3.2.40"
"@vue/reactivity@3.2.41", "@vue/reactivity@^3.2.38":
version "3.2.41"
@ -1777,6 +1835,14 @@
dependencies:
"@vue/shared" "3.2.41"
"@vue/runtime-core@3.2.40":
version "3.2.40"
resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.40.tgz#e814358bf1b0ff6d4a6b4f8f62d9f341964fb275"
integrity sha512-U1+rWf0H8xK8aBUZhnrN97yoZfHbjgw/bGUzfgKPJl69/mXDuSg8CbdBYBn6VVQdR947vWneQBFzdhasyzMUKg==
dependencies:
"@vue/reactivity" "3.2.40"
"@vue/shared" "3.2.40"
"@vue/runtime-core@3.2.41":
version "3.2.41"
resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.41.tgz#775bfc00b3fadbaddab77138f23322aee3517a76"
@ -1785,27 +1851,27 @@
"@vue/reactivity" "3.2.41"
"@vue/shared" "3.2.41"
"@vue/runtime-dom@3.2.41":
version "3.2.41"
resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.41.tgz#cdf86be7410f7b15c29632a96ce879e5b4c9ab92"
integrity sha512-U7zYuR1NVIP8BL6jmOqmapRAHovEFp7CSw4pR2FacqewXNGqZaRfHoNLQsqQvVQ8yuZNZtxSZy0FFyC70YXPpA==
"@vue/runtime-dom@3.2.40":
version "3.2.40"
resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.40.tgz#975119feac5ab703aa9bbbf37c9cc966602c8eab"
integrity sha512-AO2HMQ+0s2+MCec8hXAhxMgWhFhOPJ/CyRXnmTJ6XIOnJFLrH5Iq3TNwvVcODGR295jy77I6dWPj+wvFoSYaww==
dependencies:
"@vue/runtime-core" "3.2.41"
"@vue/shared" "3.2.41"
"@vue/runtime-core" "3.2.40"
"@vue/shared" "3.2.40"
csstype "^2.6.8"
"@vue/server-renderer@3.2.41":
version "3.2.41"
resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.41.tgz#ca64552c05878f94e8d191ac439141c06c0fb2ad"
integrity sha512-7YHLkfJdTlsZTV0ae5sPwl9Gn/EGr2hrlbcS/8naXm2CDpnKUwC68i1wGlrYAfIgYWL7vUZwk2GkYLQH5CvFig==
"@vue/server-renderer@3.2.40":
version "3.2.40"
resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.40.tgz#55eaac31f7105c3907e1895129bf4efb6b0ce393"
integrity sha512-gtUcpRwrXOJPJ4qyBpU3EyxQa4EkV8I4f8VrDePcGCPe4O/hd0BPS7v9OgjIQob6Ap8VDz9G+mGTKazE45/95w==
dependencies:
"@vue/compiler-ssr" "3.2.41"
"@vue/shared" "3.2.41"
"@vue/compiler-ssr" "3.2.40"
"@vue/shared" "3.2.40"
"@vue/shared@3.2.38":
version "3.2.38"
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.38.tgz#e823f0cb2e85b6bf43430c0d6811b1441c300f3c"
integrity sha512-dTyhTIRmGXBjxJE+skC8tTWCGLCVc4wQgRRLt8+O9p5ewBAjoBwtCAkLPrtToSr1xltoe3st21Pv953aOZ7alg==
"@vue/shared@3.2.40":
version "3.2.40"
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.40.tgz#e57799da2a930b975321981fcee3d1e90ed257ae"
integrity sha512-0PLQ6RUtZM0vO3teRfzGi4ltLUO5aO+kLgwh4Um3THSR03rpQWLTuRCkuO5A41ITzwdWeKdPHtSARuPkoo5pCQ==
"@vue/shared@3.2.41", "@vue/shared@^3.2.38":
version "3.2.41"
@ -1822,42 +1888,42 @@
resolved "https://registry.yarnpkg.com/@vue/tsconfig/-/tsconfig-0.1.3.tgz#4a61dbd29783d01ddab504276dcf0c2b6988654f"
integrity sha512-kQVsh8yyWPvHpb8gIc9l/HIDiiVUy1amynLNpCy8p+FoCiZXCo6fQos5/097MmnNZc9AtseDsCrfkhqCrJ8Olg==
"@vueuse/core@9.1.1":
version "9.1.1"
resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-9.1.1.tgz#a5c09c33ccee58cfd53bc3ec2d5a0d304155529e"
integrity sha512-QfuaNWRDMQcCUwXylCyYhPC3ScS9Tiiz4J0chdwr3vOemBwRToSywq8MP+ZegKYFnbETzRY8G/5zC+ca30wrRQ==
"@vueuse/core@9.3.0":
version "9.3.0"
resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-9.3.0.tgz#74d855bd19cb5eadd2edb30c871918fac881e8b8"
integrity sha512-64Rna8IQDWpdrJxgitDg7yv1yTp41ZmvV8zlLEylK4QQLWAhz1OFGZDPZ8bU4lwcGgbEJ2sGi2jrdNh4LttUSQ==
dependencies:
"@types/web-bluetooth" "^0.0.15"
"@vueuse/metadata" "9.1.1"
"@vueuse/shared" "9.1.1"
"@vueuse/metadata" "9.3.0"
"@vueuse/shared" "9.3.0"
vue-demi "*"
"@vueuse/integrations@9.1.1":
version "9.1.1"
resolved "https://registry.yarnpkg.com/@vueuse/integrations/-/integrations-9.1.1.tgz#2397f6e53a33ef984c7a3625fc2cc14daa780a87"
integrity sha512-RVRio67rogVIV8e1Uov93JuxrE7UXhRm2B1pzdTAd+/oBxo4E3WaoXo/naI3kW1quvlOUv+g1/6goyGQoIGSow==
"@vueuse/integrations@9.3.0":
version "9.3.0"
resolved "https://registry.yarnpkg.com/@vueuse/integrations/-/integrations-9.3.0.tgz#d08f0b96335746242e0a979d58964f374eed303a"
integrity sha512-KkJpC97VioZUpSw7rvgnqoLgTztLlLLGdYp6WQKn69cJiItsJVSRZrmI+X9YVxPBzuLvRymYZfp0RMyISVFHTw==
dependencies:
"@vueuse/core" "9.1.1"
"@vueuse/shared" "9.1.1"
"@vueuse/core" "9.3.0"
"@vueuse/shared" "9.3.0"
vue-demi "*"
"@vueuse/metadata@9.1.1":
version "9.1.1"
resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-9.1.1.tgz#b3fe4b97e62096f7566cd8eb107c503998b2c9a6"
integrity sha512-XZ2KtSW+85LLHB/IdGILPAtbIVHasPsAW7aqz3BRMzJdAQWRiM/FGa1OKBwLbXtUw/AmjKYFlZJo7eOFIBXRog==
"@vueuse/metadata@9.3.0":
version "9.3.0"
resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-9.3.0.tgz#c107fe77a577e1f221536cd1b291039c0c7c4bce"
integrity sha512-GnnfjbzIPJIh9ngL9s9oGU1+Hx/h5/KFqTfJykzh/1xjaHkedV9g0MASpdmPZIP+ynNhKAcEfA6g5i8KXwtoMA==
"@vueuse/router@9.1.1":
version "9.1.1"
resolved "https://registry.yarnpkg.com/@vueuse/router/-/router-9.1.1.tgz#356946b97e2499d96d8e9b5cfced5f778edd63c9"
integrity sha512-1HE09QYoHEUF2vWJqGEV1GgoFy6ti7gxzahiN9o/GJpyWM11koQd03BhP4RjVbUx3ua2wTYNSmaCKvLJGCnNGg==
"@vueuse/router@9.3.0":
version "9.3.0"
resolved "https://registry.yarnpkg.com/@vueuse/router/-/router-9.3.0.tgz#731b2e88718f8ca13202e527864686a122ccc68f"
integrity sha512-UFN2MFciprH21oYsAgNHeDJ4Bd86HpRm9gximSN8j6h4fc2aa62fvfhprfHqdTxYAcgcGkMwcc9TO75jOvr8gg==
dependencies:
"@vueuse/shared" "9.1.1"
"@vueuse/shared" "9.3.0"
vue-demi "*"
"@vueuse/shared@9.1.1":
version "9.1.1"
resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-9.1.1.tgz#811f47629e281a19013ae6dcdf11ed3e1e91e023"
integrity sha512-c+IfcOYmHiHqoEa3ED1Tbpue5GHmoUmTp8PtO4YbczthtY155Rt6DmWhjxMLXBF1Bcidagxljmp/7xtAzEHXLw==
"@vueuse/shared@9.3.0":
version "9.3.0"
resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-9.3.0.tgz#40fc138ba4e379c894075830aa2e15404aaa8a5b"
integrity sha512-caGUWLY0DpPC6l31KxeUy6vPVNA0yKxx81jFYLoMpyP6cF84FG5Dkf69DfSUqL57wX8JcUkJDMnQaQIZPWFEQQ==
dependencies:
vue-demi "*"
@ -2049,7 +2115,7 @@ at-least-node@^1.0.0:
resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
automation-events@^4.0.22:
automation-events@^4.0.21:
version "4.0.22"
resolved "https://registry.yarnpkg.com/automation-events/-/automation-events-4.0.22.tgz#eaaea55ea0edbbd20f54053cce5c686f56736866"
integrity sha512-npbme6c94VOnW8pvns60ioIi1+9lUZEMC6feTJoAkINnKSEHda5dKwMRmzoh4Y8zjQVXMUNcO6LcQkH4SXyvWA==
@ -2495,6 +2561,11 @@ data-urls@^3.0.2:
whatwg-mimetype "^3.0.0"
whatwg-url "^11.0.0"
de-indent@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==
debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4:
version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
@ -2718,151 +2789,76 @@ es-to-primitive@^1.2.1:
is-date-object "^1.0.1"
is-symbol "^1.0.2"
esbuild-android-64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be"
integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==
esbuild-android-64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.12.tgz#5e8151d5f0a748c71a7fbea8cee844ccf008e6fc"
integrity sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==
esbuild-android-arm64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771"
integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==
esbuild-android-arm64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.12.tgz#5ee72a6baa444bc96ffcb472a3ba4aba2cc80666"
integrity sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==
esbuild-darwin-64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25"
integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==
esbuild-darwin-64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.12.tgz#70047007e093fa1b3ba7ef86f9b3fa63db51fe25"
integrity sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q==
esbuild-darwin-arm64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73"
integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==
esbuild-darwin-arm64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.12.tgz#41c951f23d9a70539bcca552bae6e5196696ae04"
integrity sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw==
esbuild-freebsd-64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d"
integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==
esbuild-freebsd-64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.12.tgz#a761b5afd12bbedb7d56c612e9cfa4d2711f33f0"
integrity sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw==
esbuild-freebsd-arm64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48"
integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==
esbuild-freebsd-arm64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.12.tgz#6b0839d4d58deabc6cbd96276eb8cbf94f7f335e"
integrity sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g==
esbuild-linux-32@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5"
integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==
esbuild-linux-32@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.12.tgz#bd50bfe22514d434d97d5150977496e2631345b4"
integrity sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA==
esbuild-linux-64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652"
integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==
esbuild-linux-64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.12.tgz#074bb2b194bf658245f8490f29c01ffcdfa8c931"
integrity sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA==
esbuild-linux-arm64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b"
integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==
esbuild-linux-arm64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.12.tgz#3bf789c4396dc032875a122988efd6f3733f28f5"
integrity sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ==
esbuild-linux-arm@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59"
integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==
esbuild-linux-arm@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.12.tgz#b91b5a8d470053f6c2c9c8a5e67ec10a71fe4a67"
integrity sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A==
esbuild-linux-mips64le@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34"
integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==
esbuild-linux-mips64le@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.12.tgz#2fb54099ada3c950a7536dfcba46172c61e580e2"
integrity sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A==
esbuild-linux-ppc64le@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e"
integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==
esbuild-linux-ppc64le@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.12.tgz#9e3b8c09825fb27886249dfb3142a750df29a1b7"
integrity sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg==
esbuild-linux-riscv64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8"
integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==
esbuild-linux-riscv64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.12.tgz#923d0f5b6e12ee0d1fe116b08e4ae4478fe40693"
integrity sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA==
esbuild-linux-s390x@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6"
integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==
esbuild-linux-s390x@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.12.tgz#3b1620220482b96266a0c6d9d471d451a1eab86f"
integrity sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww==
esbuild-netbsd-64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81"
integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==
esbuild-netbsd-64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.12.tgz#276730f80da646859b1af5a740e7802d8cd73e42"
@ -2875,11 +2871,6 @@ esbuild-node-loader@^0.6.5:
dependencies:
esbuild ">=0.13.12"
esbuild-openbsd-64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b"
integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==
esbuild-openbsd-64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.12.tgz#bd0eea1dd2ca0722ed489d88c26714034429f8ae"
@ -2890,41 +2881,21 @@ esbuild-register@^3.3.2:
resolved "https://registry.yarnpkg.com/esbuild-register/-/esbuild-register-3.3.3.tgz#5bd80025c80caf77e6484ced5cc77233b1d39688"
integrity sha512-eFHOkutgIMJY5gc8LUp/7c+LLlDqzNi9T6AwCZ2WKKl3HmT+5ef3ZRyPPxDOynInML0fgaC50yszPKfPnjC0NQ==
esbuild-sunos-64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da"
integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==
esbuild-sunos-64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.12.tgz#5e56bf9eef3b2d92360d6d29dcde7722acbecc9e"
integrity sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg==
esbuild-windows-32@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31"
integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==
esbuild-windows-32@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.12.tgz#a4f1a301c1a2fa7701fcd4b91ef9d2620cf293d0"
integrity sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw==
esbuild-windows-64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4"
integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==
esbuild-windows-64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.12.tgz#bc2b467541744d653be4fe64eaa9b0dbbf8e07f6"
integrity sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA==
esbuild-windows-arm64@0.14.54:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982"
integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==
esbuild-windows-arm64@0.15.12:
version "0.15.12"
resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.12.tgz#9a7266404334a86be800957eaee9aef94c3df328"
@ -2958,33 +2929,6 @@ esbuild@>=0.13.0, esbuild@>=0.13.12, esbuild@^0.15.9:
esbuild-windows-64 "0.15.12"
esbuild-windows-arm64 "0.15.12"
esbuild@^0.14.47:
version "0.14.54"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2"
integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==
optionalDependencies:
"@esbuild/linux-loong64" "0.14.54"
esbuild-android-64 "0.14.54"
esbuild-android-arm64 "0.14.54"
esbuild-darwin-64 "0.14.54"
esbuild-darwin-arm64 "0.14.54"
esbuild-freebsd-64 "0.14.54"
esbuild-freebsd-arm64 "0.14.54"
esbuild-linux-32 "0.14.54"
esbuild-linux-64 "0.14.54"
esbuild-linux-arm "0.14.54"
esbuild-linux-arm64 "0.14.54"
esbuild-linux-mips64le "0.14.54"
esbuild-linux-ppc64le "0.14.54"
esbuild-linux-riscv64 "0.14.54"
esbuild-linux-s390x "0.14.54"
esbuild-netbsd-64 "0.14.54"
esbuild-openbsd-64 "0.14.54"
esbuild-sunos-64 "0.14.54"
esbuild-windows-32 "0.14.54"
esbuild-windows-64 "0.14.54"
esbuild-windows-arm64 "0.14.54"
escalade@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
@ -3082,21 +3026,7 @@ eslint-plugin-import@2.26.0, eslint-plugin-import@^2.26.0:
resolve "^1.22.0"
tsconfig-paths "^3.14.1"
eslint-plugin-n@15.2.5:
version "15.2.5"
resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-15.2.5.tgz#aa7ff8d45bb8bf2df8ea3b7d3774ae570cb794b8"
integrity sha512-8+BYsqiyZfpu6NXmdLOXVUfk8IocpCjpd8nMRRH0A9ulrcemhb2VI9RSJMEy5udx++A/YcVPD11zT8hpFq368g==
dependencies:
builtins "^5.0.1"
eslint-plugin-es "^4.1.0"
eslint-utils "^3.0.0"
ignore "^5.1.1"
is-core-module "^2.10.0"
minimatch "^3.1.2"
resolve "^1.22.1"
semver "^7.3.7"
eslint-plugin-n@^15.2.4:
eslint-plugin-n@15.3.0, eslint-plugin-n@^15.2.4:
version "15.3.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-15.3.0.tgz#3e1ad236a17dce7ecc0760621c46cc251ef99560"
integrity sha512-IyzPnEWHypCWasDpxeJnim60jhlumbmq0pubL6IOcnk8u2y53s5QfT8JnXy7skjHJ44yWHRb11PLtDHuu1kg/Q==
@ -3132,10 +3062,10 @@ eslint-plugin-promise@^6.0.0:
resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816"
integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==
eslint-plugin-vue@9.4.0:
version "9.4.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.4.0.tgz#31c2d9002b5bb437b351a5feffdf37c4397e5cb9"
integrity sha512-Nzz2QIJ8FG+rtJaqT/7/ru5ie2XgT9KCudkbN0y3uFYhQ41nuHEaboLAiqwMcK006hZPQv/rVMRhUIwEGhIvfQ==
eslint-plugin-vue@9.6.0:
version "9.6.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.6.0.tgz#5d1825b93d54595b1ba97106843e1d28cf3bb291"
integrity sha512-zzySkJgVbFCylnG2+9MDF7N+2Rjze2y0bF8GyUNpFOnT8mCMfqqtLDJkHBuYu9N/psW1A6DVbQhPkP92E+qakA==
dependencies:
eslint-utils "^3.0.0"
natural-compare "^1.4.0"
@ -3190,13 +3120,13 @@ eslint-visitor-keys@^3.3.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
eslint@8.23.1:
version "8.23.1"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.23.1.tgz#cfd7b3f7fdd07db8d16b4ac0516a29c8d8dca5dc"
integrity sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg==
eslint@8.24.0:
version "8.24.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.24.0.tgz#489516c927a5da11b3979dbfb2679394523383c8"
integrity sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==
dependencies:
"@eslint/eslintrc" "^1.3.2"
"@humanwhocodes/config-array" "^0.10.4"
"@humanwhocodes/config-array" "^0.10.5"
"@humanwhocodes/gitignore-to-minimatch" "^1.0.2"
"@humanwhocodes/module-importer" "^1.0.1"
ajv "^6.10.0"
@ -3622,6 +3552,11 @@ has@^1.0.3:
dependencies:
function-bind "^1.1.1"
he@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
howler@2.2.3:
version "2.2.3"
resolved "https://registry.yarnpkg.com/howler/-/howler-2.2.3.tgz#a2eff9b08b586798e7a2ee17a602a90df28715da"
@ -4228,7 +4163,7 @@ minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2:
dependencies:
brace-expansion "^1.1.7"
minimatch@^5.0.1:
minimatch@^5.0.1, minimatch@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7"
integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==
@ -4270,6 +4205,11 @@ ms@^2.1.1:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
muggle-string@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/muggle-string/-/muggle-string-0.1.0.tgz#1fda8a281c8b27bb8b70466dbc9f27586a8baa6c"
integrity sha512-Tr1knR3d2mKvvWthlk7202rywKbiOm4rVFLsfAaSIhJ6dt9o47W4S+JMtWhd/PW9Wrdew2/S2fSvhz3E2gkfEg==
nanoid@^3.3.4:
version "3.3.4"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
@ -4811,20 +4751,20 @@ rollup-plugin-terser@^7.0.0:
serialize-javascript "^4.0.0"
terser "^5.0.0"
"rollup@>=2.75.6 <2.77.0 || ~2.77.0":
version "2.77.3"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.77.3.tgz#8f00418d3a2740036e15deb653bed1a90ee0cc12"
integrity sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==
optionalDependencies:
fsevents "~2.3.2"
rollup@^2.43.1, rollup@^2.75.7, rollup@^2.79.1:
rollup@^2.43.1, rollup@^2.79.0, rollup@^2.79.1:
version "2.79.1"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7"
integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==
optionalDependencies:
fsevents "~2.3.2"
rollup@~2.78.0:
version "2.78.1"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.78.1.tgz#52fe3934d9c83cb4f7c4cb5fb75d88591be8648f"
integrity sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==
optionalDependencies:
fsevents "~2.3.2"
run-parallel@^1.1.9:
version "1.2.0"
resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
@ -4851,10 +4791,10 @@ safe-regex-test@^1.0.0:
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
sass@1.54.9:
version "1.54.9"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.54.9.tgz#b05f14ed572869218d1a76961de60cd647221762"
integrity sha512-xb1hjASzEH+0L0WI9oFjqhRi51t/gagWnxLiwUNMltA0Ab6jIDkAacgKiGYKM9Jhy109osM7woEEai6SXeJo5Q==
sass@1.55.0:
version "1.55.0"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.55.0.tgz#0c4d3c293cfe8f8a2e8d3b666e1cf1bff8065d1c"
integrity sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==
dependencies:
chokidar ">=3.0.0 <4.0.0"
immutable "^4.0.0"
@ -4981,13 +4921,13 @@ sourcemap-codec@^1.4.8:
resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
standardized-audio-context@^25.3.32:
version "25.3.33"
resolved "https://registry.yarnpkg.com/standardized-audio-context/-/standardized-audio-context-25.3.33.tgz#8108ee2520097d1b359badbf6b573f0fab41d14c"
integrity sha512-9BzVo8NDemOMENPKiwdE65uJJ6ae00jmafT2ZzZ0j+1WVhYZXfmykDgcP4h8eRAPC7r+mFedJfbdr7DMANJRkw==
standardized-audio-context@25.3.32:
version "25.3.32"
resolved "https://registry.yarnpkg.com/standardized-audio-context/-/standardized-audio-context-25.3.32.tgz#01f09f64b53f81e07dae9c5534a08a7d832e83c0"
integrity sha512-TtnRZGzHaTowIrEPo7w7WK74TrrY885NpplFpD79h85YuUAUBrUGifHlh8GK11oyZHfwDtCV29yFPfIHWotrXg==
dependencies:
"@babel/runtime" "^7.19.4"
automation-events "^4.0.22"
"@babel/runtime" "^7.19.0"
automation-events "^4.0.21"
tslib "^2.4.0"
string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
@ -5147,16 +5087,11 @@ text-table@^0.2.0:
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
tinybench@^2.3.0:
tinybench@^2.2.1, tinybench@^2.3.0:
version "2.3.1"
resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.3.1.tgz#14f64e6b77d7ef0b1f6ab850c7a808c6760b414d"
integrity sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==
tinypool@^0.2.4:
version "0.2.4"
resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.2.4.tgz#4d2598c4689d1a2ce267ddf3360a9c6b3925a20c"
integrity sha512-Vs3rhkUH6Qq1t5bqtb816oT+HeJTXfwt2cbPH17sWHIYKTotQIFPk3tf2fgqRrVyMDVOc1EnPgzIxfIulXVzwQ==
tinypool@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.3.0.tgz#c405d8b743509fc28ea4ca358433190be654f819"
@ -5386,17 +5321,17 @@ v8-to-istanbul@^9.0.0:
"@types/istanbul-lib-coverage" "^2.0.1"
convert-source-map "^1.6.0"
vite-plugin-pwa@0.12.4:
version "0.12.4"
resolved "https://registry.yarnpkg.com/vite-plugin-pwa/-/vite-plugin-pwa-0.12.4.tgz#9e921518a0a340e4e6ae287a2cf345c4ca56f92d"
integrity sha512-ONHS2OcMMWdOOIPG8JBet2BTssZC1FSjY34f9t5byM3H6RKgu5qbv6p809OlfYkg8bFi58oEhNDxDB5UE4vkfQ==
vite-plugin-pwa@0.13.1:
version "0.13.1"
resolved "https://registry.yarnpkg.com/vite-plugin-pwa/-/vite-plugin-pwa-0.13.1.tgz#345133f947d4fc8252a1fd96f2fcb0e17c4201ae"
integrity sha512-NR3dIa+o2hzlzo4lF4Gu0cYvoMjSw2DdRc6Epw1yjmCqWaGuN86WK9JqZie4arNlE1ZuWT3CLiMdiX5wcmmUmg==
dependencies:
debug "^4.3.4"
fast-glob "^3.2.11"
pretty-bytes "^6.0.0"
rollup "^2.75.7"
workbox-build "^6.5.3"
workbox-window "^6.5.3"
rollup "^2.79.0"
workbox-build "^6.5.4"
workbox-window "^6.5.4"
vite-plugin-vue-inspector@1.1.3:
version "1.1.3"
@ -5414,19 +5349,19 @@ vite-plugin-vue-inspector@1.1.3:
magic-string "^0.26.1"
shell-quote "^1.7.3"
vite@3.0.9:
version "3.0.9"
resolved "https://registry.yarnpkg.com/vite/-/vite-3.0.9.tgz#45fac22c2a5290a970f23d66c1aef56a04be8a30"
integrity sha512-waYABTM+G6DBTCpYAxvevpG50UOlZuynR0ckTK5PawNVt7ebX6X7wNXHaGIO6wYYFXSM7/WcuFuO2QzhBB6aMw==
vite@3.1.6:
version "3.1.6"
resolved "https://registry.yarnpkg.com/vite/-/vite-3.1.6.tgz#4c6db3000326342c918204a42a130fb3ffed2414"
integrity sha512-qMXIwnehvvcK5XfJiXQUiTxoYAEMKhM+jqCY6ZSTKFBKu1hJnAKEzP3AOcnTerI0cMZYAaJ4wpW1wiXLMDt4mA==
dependencies:
esbuild "^0.14.47"
esbuild "^0.15.9"
postcss "^8.4.16"
resolve "^1.22.1"
rollup ">=2.75.6 <2.77.0 || ~2.77.0"
rollup "~2.78.0"
optionalDependencies:
fsevents "~2.3.2"
"vite@^2.9.12 || ^3.0.0-0", vite@^3.0.0:
vite@^3.0.0:
version "3.2.1"
resolved "https://registry.yarnpkg.com/vite/-/vite-3.2.1.tgz#dc1f54568300a7acdd89c8611e2719c21f1334f4"
integrity sha512-ADtMkfHuWq4tskJsri2n2FZkORO8ZyhI+zIz7zTrDAgDEtct1jdxOg3YsZBfHhKjmMoWLOSCr+64qrEDGo/DbQ==
@ -5438,10 +5373,10 @@ vite@3.0.9:
optionalDependencies:
fsevents "~2.3.2"
vitest@0.22.1:
version "0.22.1"
resolved "https://registry.yarnpkg.com/vitest/-/vitest-0.22.1.tgz#3122e6024bf782ee9aca53034017af7adb009c32"
integrity sha512-+x28YTnSLth4KbXg7MCzoDAzPJlJex7YgiZbUh6YLp0/4PqVZ7q7/zyfdL0OaPtKTpNiQFPpMC8Y2MSzk8F7dw==
vitest@0.24.0:
version "0.24.0"
resolved "https://registry.yarnpkg.com/vitest/-/vitest-0.24.0.tgz#61555b7b56e07f04a1692352de7d4803de0f5c88"
integrity sha512-k5j3FPTor+MJx2x0pDW2gtVk+s9VC6nSHT3SoqOIk9Je5fFpPgict+Xy2eAVXUogvSixs45Ya1oZk+oK93BO0w==
dependencies:
"@types/chai" "^4.3.3"
"@types/chai-subset" "^1.3.3"
@ -5449,9 +5384,11 @@ vitest@0.22.1:
chai "^4.3.6"
debug "^4.3.4"
local-pkg "^0.4.2"
tinypool "^0.2.4"
strip-literal "^0.4.2"
tinybench "^2.2.1"
tinypool "^0.3.0"
tinyspy "^1.0.2"
vite "^2.9.12 || ^3.0.0-0"
vite "^3.0.0"
vitest@0.24.3:
version "0.24.3"
@ -5525,13 +5462,21 @@ vue-router@4.1.6:
dependencies:
"@vue/devtools-api" "^6.4.5"
vue-tsc@0.40.13:
version "0.40.13"
resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-0.40.13.tgz#0a193014f7cadb47459cf0809ce3953b74a1348c"
integrity sha512-xzuN3g5PnKfJcNrLv4+mAjteMd5wLm5fRhW0034OfNJZY4WhB07vhngea/XeGn7wNYt16r7syonzvW/54dcNiA==
vue-template-compiler@^2.7.10:
version "2.7.13"
resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.7.13.tgz#1520a5aa6d1af51dd0622824e79814f6e8cb7058"
integrity sha512-jYM6TClwDS9YqP48gYrtAtaOhRKkbYmbzE+Q51gX5YDr777n7tNI/IZk4QV4l/PjQPNh/FVa/E92sh/RqKMrog==
dependencies:
"@volar/vue-language-core" "0.40.13"
"@volar/vue-typescript" "0.40.13"
de-indent "^1.0.2"
he "^1.2.0"
vue-tsc@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-1.0.0.tgz#adb844b08f55e962c43f33e453f8185090ac7570"
integrity sha512-QtQunVlF8SLs75s9FTCOOLXx6Fb5ccN6r3xDT4rUzznPzP6xfRC/iWhrJImEBRz74fhqXWPUMfujcmibnwYyXw==
dependencies:
"@volar/vue-language-core" "1.0.0"
"@volar/vue-typescript" "1.0.0"
vue-upload-component@3.1.2:
version "3.1.2"
@ -5569,16 +5514,16 @@ vue3-lazyload@0.3.6:
dependencies:
vue-demi "^0.12.5"
vue@3.2.41:
version "3.2.41"
resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.41.tgz#ed452b8a0f7f2b962f055c8955139c28b1c06806"
integrity sha512-uuuvnrDXEeZ9VUPljgHkqB5IaVO8SxhPpqF2eWOukVrBnRBx2THPSGQBnVRt0GrIG1gvCmFXMGbd7FqcT1ixNQ==
vue@3.2.40:
version "3.2.40"
resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.40.tgz#23f387f6f9b3a0767938db6751e4fb5900f0ee34"
integrity sha512-1mGHulzUbl2Nk3pfvI5aXYYyJUs1nm4kyvuz38u4xlQkLUn1i2R7nDbI4TufECmY8v1qNBHYy62bCaM+3cHP2A==
dependencies:
"@vue/compiler-dom" "3.2.41"
"@vue/compiler-sfc" "3.2.41"
"@vue/runtime-dom" "3.2.41"
"@vue/server-renderer" "3.2.41"
"@vue/shared" "3.2.41"
"@vue/compiler-dom" "3.2.40"
"@vue/compiler-sfc" "3.2.40"
"@vue/runtime-dom" "3.2.40"
"@vue/server-renderer" "3.2.40"
"@vue/shared" "3.2.40"
vuedraggable@4.1.0:
version "4.1.0"
@ -5701,7 +5646,7 @@ workbox-broadcast-update@6.5.4:
dependencies:
workbox-core "6.5.4"
workbox-build@^6.5.3:
workbox-build@^6.5.4:
version "6.5.4"
resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.5.4.tgz#7d06d31eb28a878817e1c991c05c5b93409f0389"
integrity sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA==
@ -5836,7 +5781,7 @@ workbox-sw@6.5.4:
resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.5.4.tgz#d93e9c67924dd153a61367a4656ff4d2ae2ed736"
integrity sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA==
workbox-window@6.5.4, workbox-window@^6.5.3:
workbox-window@6.5.4, workbox-window@^6.5.4:
version "6.5.4"
resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.5.4.tgz#d991bc0a94dff3c2dbb6b84558cff155ca878e91"
integrity sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug==