diff --git a/.prettierrc b/.prettierrc index ab07ced..a8cf444 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,6 +1,7 @@ { "printWidth": 120, "trailingComma": "none", - "singleQuote": true, - "tabWidth": 4 + "singleQuote": false, + "tabWidth": 4, + "semi": true } \ No newline at end of file diff --git a/README.md b/README.md index 7357eb1..7929f14 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,8 @@ Complete framework to facilitate music commands using **[discord.js](https://dis [![versionBadge](https://img.shields.io/npm/v/discord-player?style=for-the-badge)](https://npmjs.com/discord-player) [![discordBadge](https://img.shields.io/discord/558328638911545423?style=for-the-badge&color=7289da)](https://androz2091.fr/discord) +> V5 WIP + ## Installation ### Install **[discord-player](https://npmjs.com/package/discord-player)** diff --git a/package.json b/package.json index 7e94075..4a97273 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "discord-player", - "version": "4.0.5", + "version": "5.0.0-dev", "description": "Complete framework to facilitate music commands using discord.js", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -8,7 +8,7 @@ "lib/" ], "scripts": { - "test": "yarn build && cd test && node index.js", + "test": "cd test && ts-node index.ts", "build": "tsc", "format": "prettier --write \"src/**/*.ts\"", "lint": "tslint -p tsconfig.json", @@ -50,11 +50,13 @@ }, "homepage": "https://github.com/Androz2091/discord-player#readme", "dependencies": { - "discord-ytdl-core": "^5.0.2", - "soundcloud-scraper": "^4.0.3", - "spotify-url-info": "^2.2.0", - "youtube-sr": "^4.0.4", - "ytdl-core": "^4.5.0" + "@discordjs/voice": "^0.3.1", + "discord-ytdl-core": "^5.0.3", + "soundcloud-scraper": "^5.0.0", + "spotify-url-info": "^2.2.3", + "tiny-typed-emitter": "^2.0.3", + "youtube-sr": "^4.1.4", + "ytdl-core": "^4.8.2" }, "devDependencies": { "@babel/cli": "^7.13.16", @@ -65,12 +67,18 @@ "@discordjs/opus": "^0.5.0", "@types/node": "^14.14.41", "@types/ws": "^7.4.1", - "discord.js": "^12.5.3", + "discord-api-types": "^0.18.1", + "discord.js": "^13.0.0-dev.f5f3f772865ee98bbb44df938e0e71f9f8865c10", "discord.js-docgen": "discordjs/docgen#ts-patch", "jsdoc-babel": "^0.5.0", "prettier": "^2.2.1", + "ts-node": "^10.0.0", "tslint": "^6.1.3", "tslint-config-prettier": "^1.18.0", + "typescipt": "^1.0.0", "typescript": "^4.2.3" + }, + "optionalDependencies": { + "sodium": "^3.0.2" } } diff --git a/src/Player.ts b/src/Player.ts index a46af6e..642cbe8 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -1,1466 +1,34 @@ -import { EventEmitter } from 'events'; -import { Client, Collection, Snowflake, Collector, Message, VoiceChannel, VoiceState } from 'discord.js'; -import { - LyricsData, - PlayerOptions as PlayerOptionsType, - PlayerProgressbarOptions, - PlayerStats, - QueueFilters -} from './types/types'; -import Util from './utils/Util'; -import AudioFilters from './utils/AudioFilters'; -import { Queue } from './Structures/Queue'; -import { Track } from './Structures/Track'; -import { PlayerErrorEventCodes, PlayerEvents, PlayerOptions } from './utils/Constants'; -import PlayerError from './utils/PlayerError'; -import ytdl from 'discord-ytdl-core'; -import { ExtractorModel } from './Structures/ExtractorModel'; -import os from 'os'; +import { Client, Collection, Guild, Snowflake } from "discord.js"; +import { TypedEmitter as EventEmitter } from "tiny-typed-emitter"; +import { Queue } from "./Structures/Queue"; +import { VoiceUtils } from "./VoiceInterface/VoiceUtils"; +import { PlayerOptions } from "./types/types"; -// @ts-ignore -import spotify from 'spotify-url-info'; -// @ts-ignore -import { Client as SoundCloudClient } from 'soundcloud-scraper'; -import YouTube from 'youtube-sr'; +class DiscordPlayer extends EventEmitter { + public readonly client: Client; + public readonly queues = new Collection(); + public readonly voiceUtils = new VoiceUtils(); -const SoundCloud = new SoundCloudClient(); - -/** - * The Player class - * @extends {EventEmitter} - */ -export class Player extends EventEmitter { - public client: Client; - public options: PlayerOptionsType; - public filters: typeof AudioFilters; - - /** - * The collection of queues in this player - * @type {DiscordCollection} - */ - public queues = new Collection(); - private _resultsCollectors = new Collection>(); - private _cooldownsTimeout = new Collection(); - - /** - * The extractor model collection - * @type {DiscordCollection} - */ - public Extractors = new Collection(); - - /** - * Creates new Player instance - * @param {DiscordClient} client The discord.js client - * @param {PlayerOptions} options Player options - */ - constructor(client: Client, options?: PlayerOptionsType) { + constructor(client: Client) { super(); - - /** - * The discord client that instantiated this player - * @name Player#client - * @type {DiscordClient} - * @readonly - */ - Object.defineProperty(this, 'client', { - value: client, - enumerable: false - }); - - /** - * The player options - * @type {PlayerOptions} - */ - this.options = Object.assign({}, PlayerOptions, options ?? {}); - - // check FFmpeg - void Util.alertFFmpeg(); - - /** - * Audio filters - * @type {Object} - */ - this.filters = AudioFilters; - - this.client.on('voiceStateUpdate', (o, n) => void this._handleVoiceStateUpdate(o, n)); - - // auto detect @discord-player/extractor - if (!this.options.disableAutoRegister) { - let nv: any; - if ((nv = Util.require('@discord-player/extractor'))) { - ['Attachment', 'Facebook', 'Reverbnation', 'Vimeo'].forEach((ext) => void this.use(ext, nv[ext])); - } - } + this.client = client; } - static get AudioFilters(): typeof AudioFilters { - return AudioFilters; - } - - /** - * Define custom extractor in this player - * @param {String} extractorName The extractor name - * @param {any} extractor The extractor itself - * @returns {Player} - */ - use(extractorName: string, extractor: any): Player { - if (!extractorName) throw new PlayerError('Missing extractor name!', 'PlayerExtractorError'); - - const methods = ['validate', 'getInfo']; - - for (const method of methods) { - if (typeof extractor[method] !== 'function') - throw new PlayerError('Invalid extractor supplied!', 'PlayerExtractorError'); - } - - this.Extractors.set(extractorName, new ExtractorModel(extractorName, extractor)); - - return this; - } - - /** - * Remove existing extractor from this player - * @param {String} extractorName The extractor name - * @returns {Boolean} - */ - unuse(extractorName: string): boolean { - if (!extractorName) throw new PlayerError('Missing extractor name!', 'PlayerExtractorError'); - - return this.Extractors.delete(extractorName); - } - - private _searchTracks(message: Message, query: string, firstResult?: boolean): Promise { - return new Promise(async (resolve) => { - let tracks: Track[] = []; - const queryType = Util.getQueryType(query); - - switch (queryType) { - case 'soundcloud_track': - { - const data = await SoundCloud.getSongInfo(query).catch(() => {}); - if (data) { - const track = new Track(this, { - title: data.title, - url: data.url, - duration: Util.buildTimeCode(Util.parseMS(data.duration / 1000)), - description: data.description, - thumbnail: data.thumbnail, - views: data.playCount, - author: data.author.name, - requestedBy: message.author, - fromPlaylist: false, - source: 'soundcloud', - engine: data - }); - - tracks.push(track); - } - } - break; - case 'spotify_song': - { - const matchSpotifyURL = query.match( - /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:track\/|\?uri=spotify:track:)((\w|-){22})/ - ); - if (matchSpotifyURL) { - const spotifyData = await spotify.getPreview(query).catch(() => {}); - if (spotifyData) { - tracks = await Util.ytSearch(`${spotifyData.artist} - ${spotifyData.title}`, { - user: message.author, - player: this, - limit: 1 - }); - } - } - } - break; - - // todo: make spotify playlist/album load faster - case 'spotify_album': - case 'spotify_playlist': { - this.emit(PlayerEvents.PLAYLIST_PARSE_START, null, message); - const playlist = await spotify.getData(query); - if (!playlist) return void this.emit(PlayerEvents.NO_RESULTS, message, query); - - // tslint:disable:no-shadowed-variable - const tracks = []; - - for (const item of playlist.tracks.items) { - const sq = - queryType === 'spotify_album' - ? `${item.artists[0].name} - ${item.name}` - : `${item.track.artists[0].name} - ${item.name}`; - const data = await Util.ytSearch(sq, { - limit: 1, - player: this, - user: message.author, - pl: true - }); - - if (data[0]) tracks.push(data[0]); - } - - if (!tracks.length) return void this.emit(PlayerEvents.NO_RESULTS, message, query); - - const pl = { - ...playlist, - tracks, - duration: tracks.reduce((a, c) => a + c.durationMS, 0), - thumbnail: playlist.images[0]?.url ?? tracks[0].thumbnail - }; - - this.emit(PlayerEvents.PLAYLIST_PARSE_END, pl, message); - - if (this.isPlaying(message)) { - const queue = this._addTracksToQueue(message, tracks); - this.emit(PlayerEvents.PLAYLIST_ADD, message, queue, pl); - } else { - const track = tracks.shift(); - const queue = (await this._createQueue(message, track).catch( - (e) => void this.emit(PlayerEvents.ERROR, e, message) - )) as Queue; - this.emit(PlayerEvents.TRACK_START, message, queue.tracks[0], queue); - this._addTracksToQueue(message, tracks); - } - - return; - } - case 'youtube_playlist': { - this.emit(PlayerEvents.PLAYLIST_PARSE_START, null, message); - const playlist = await YouTube.getPlaylist(query); - if (!playlist) return void this.emit(PlayerEvents.NO_RESULTS, message, query); - - // @ts-ignore - playlist.videos = playlist.videos.map( - (data) => - new Track(this, { - title: data.title, - url: data.url, - duration: Util.buildTimeCode(Util.parseMS(data.duration)), - description: data.description, - thumbnail: data.thumbnail?.displayThumbnailURL(), - views: data.views, - author: data.channel.name, - requestedBy: message.author, - fromPlaylist: true, - source: 'youtube' - }) - ); - - // @ts-ignore - playlist.duration = playlist.videos.reduce((a, c) => a + c.durationMS, 0); - - // @ts-ignore - playlist.thumbnail = playlist.thumbnail?.url ?? playlist.videos[0].thumbnail; - - // @ts-ignore - playlist.requestedBy = message.author; - - this.emit(PlayerEvents.PLAYLIST_PARSE_END, playlist, message); - - // @ts-ignore - const tracks = playlist.videos as Track[]; - - if (this.isPlaying(message)) { - const queue = this._addTracksToQueue(message, tracks); - this.emit(PlayerEvents.PLAYLIST_ADD, message, queue, playlist); - } else { - const track = tracks.shift(); - const queue = (await this._createQueue(message, track).catch( - (e) => void this.emit(PlayerEvents.ERROR, e, message) - )) as Queue; - this.emit(PlayerEvents.TRACK_START, message, queue.tracks[0], queue); - this._addTracksToQueue(message, tracks); - } - - return; - } - case 'soundcloud_playlist': { - this.emit(PlayerEvents.PLAYLIST_PARSE_START, null, message); - - const data = await SoundCloud.getPlaylist(query).catch(() => {}); - if (!data) return void this.emit(PlayerEvents.NO_RESULTS, message, query); - - const res = { - id: data.id, - title: data.title, - tracks: [] as Track[], - author: data.author, - duration: 0, - thumbnail: data.thumbnail, - requestedBy: message.author - }; - - for (const song of data.tracks) { - const r = new Track(this, { - title: song.title, - url: song.url, - duration: Util.buildTimeCode(Util.parseMS(song.duration / 1000)), - description: song.description, - thumbnail: song.thumbnail ?? 'https://soundcloud.com/pwa-icon-192.png', - views: song.playCount ?? 0, - author: song.author ?? data.author, - requestedBy: message.author, - fromPlaylist: true, - source: 'soundcloud', - engine: song - }); - - res.tracks.push(r); - } - - if (!res.tracks.length) - return this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.PARSE_ERROR, message); - res.duration = res.tracks.reduce((a, c) => a + c.durationMS, 0); - - this.emit(PlayerEvents.PLAYLIST_PARSE_END, res, message); - - if (this.isPlaying(message)) { - const queue = this._addTracksToQueue(message, res.tracks); - this.emit(PlayerEvents.PLAYLIST_ADD, message, queue, res); - } else { - const track = res.tracks.shift(); - const queue = (await this._createQueue(message, track).catch( - (e) => void this.emit(PlayerEvents.ERROR, e, message) - )) as Queue; - this.emit(PlayerEvents.TRACK_START, message, queue.tracks[0], queue); - this._addTracksToQueue(message, res.tracks); - } - - return; - } - default: - tracks = await Util.ytSearch(query, { user: message.author, player: this }); - } - - if (tracks.length < 1) return void this.emit(PlayerEvents.NO_RESULTS, message, query); - if (firstResult || tracks.length === 1) return resolve(tracks[0]); - - const collectorString = `${message.author.id}-${message.channel.id}`; - const currentCollector = this._resultsCollectors.get(collectorString); - if (currentCollector) currentCollector.stop(); - - const collector = message.channel.createMessageCollector((m) => m.author.id === message.author.id, { - time: 60000 - }); - - this._resultsCollectors.set(collectorString, collector); - - this.emit(PlayerEvents.SEARCH_RESULTS, message, query, tracks, collector); - - collector.on('collect', ({ content }) => { - if (content === 'cancel') { - collector.stop(); - return this.emit(PlayerEvents.SEARCH_CANCEL, message, query, tracks); - } - - if (!isNaN(content) && parseInt(content) >= 1 && parseInt(content) <= tracks.length) { - const index = parseInt(content, 10); - const track = tracks[index - 1]; - collector.stop(); - resolve(track); - } else { - this.emit(PlayerEvents.SEARCH_INVALID_RESPONSE, message, query, tracks, content, collector); - } - }); - - collector.on('end', (_, reason) => { - if (reason === 'time') { - this.emit(PlayerEvents.SEARCH_CANCEL, message, query, tracks); - } - }); - }); - } - - /** - * Play a song - * @param {DiscordMessage} message The discord.js message object - * @param {string|Track} query Search query, can be `Player.Track` instance - * @param {Boolean} [firstResult] If it should play the first result - * @example await player.play(message, "never gonna give you up", true) - * @returns {Promise} - */ - async play(message: Message, query: string | Track, firstResult?: boolean): Promise { - if (!message) throw new PlayerError('Play function needs message'); - if (!query) throw new PlayerError('Play function needs search query as a string or Player.Track object'); - - if (this._cooldownsTimeout.has(`end_${message.guild.id}`)) { - clearTimeout(this._cooldownsTimeout.get(`end_${message.guild.id}`)); - this._cooldownsTimeout.delete(`end_${message.guild.id}`); - } - - if (typeof query === 'string') query = query.replace(/<(.+)>/g, '$1'); - let track; - - if (query instanceof Track) track = query; - else { - if (ytdl.validateURL(query)) { - const info = await ytdl.getBasicInfo(query).catch(() => {}); - if (!info) return void this.emit(PlayerEvents.NO_RESULTS, message, query); - if (info.videoDetails.isLiveContent && !this.options.enableLive) - return void this.emit( - PlayerEvents.ERROR, - PlayerErrorEventCodes.LIVE_VIDEO, - message, - new PlayerError('Live video is not enabled!') - ); - const lastThumbnail = info.videoDetails.thumbnails[info.videoDetails.thumbnails.length - 1]; - - track = new Track(this, { - title: info.videoDetails.title, - description: info.videoDetails.description, - author: info.videoDetails.author.name, - url: info.videoDetails.video_url, - thumbnail: lastThumbnail.url, - duration: Util.buildTimeCode(Util.parseMS(parseInt(info.videoDetails.lengthSeconds) * 1000)), - views: parseInt(info.videoDetails.viewCount), - requestedBy: message.author, - fromPlaylist: false, - source: 'youtube', - live: Boolean(info.videoDetails.isLiveContent) - }); - } else { - for (const [_, extractor] of this.Extractors) { - if (extractor.validate(query)) { - const data = await extractor.handle(query); - if (data) { - track = new Track(this, { - title: data.title, - description: data.description, - duration: Util.buildTimeCode(Util.parseMS(data.duration)), - thumbnail: data.thumbnail, - author: data.author, - views: data.views, - engine: data.engine, - source: 'arbitrary', - fromPlaylist: false, - requestedBy: message.author, - url: data.url - }); - - if (extractor.important) break; - } - } - } - - if (!track) track = await this._searchTracks(message, query, firstResult); - } - } - - if (track) { - if (this.isPlaying(message)) { - const queue = this._addTrackToQueue(message, track); - this.emit(PlayerEvents.TRACK_ADD, message, queue, queue.tracks[queue.tracks.length - 1]); - } else { - const queue = await this._createQueue(message, track); - if (queue) this.emit(PlayerEvents.TRACK_START, message, queue.tracks[0], queue); - } - } - } - - /** - * Checks if this player is playing in a server - * @param {DiscordMessage} message The message object - * @returns {Boolean} - */ - isPlaying(message: Message): boolean { - return this.queues.some((g) => g.guildID === message.guild.id); - } - - /** - * Returns guild queue object - * @param {DiscordMessage} message The message object - * @returns {Queue} - */ - getQueue(message: Message): Queue { - return this.queues.find((g) => g.guildID === message.guild.id); - } - - /** - * Sets audio filters in this player - * @param {DiscordMessage} message The message object - * @param {QueueFilters} newFilters Audio filters object - * @returns {Promise} - */ - setFilters(message: Message, newFilters: QueueFilters): Promise { - return new Promise((resolve) => { - const queue = this.queues.find((g) => g.guildID === message.guild.id); - if (!queue) - this.emit( - PlayerEvents.ERROR, - PlayerErrorEventCodes.NOT_PLAYING, - message, - new PlayerError('Not playing') - ); - - if (queue.playing.raw.live) - return void this.emit( - PlayerEvents.ERROR, - PlayerErrorEventCodes.LIVE_VIDEO, - message, - new PlayerError('Cannot use setFilters on livestream') - ); - - Object.keys(newFilters).forEach((filterName) => { - // @ts-ignore - queue.filters[filterName] = newFilters[filterName]; - }); - - this._playStream(queue, true).then(() => { - resolve(); - }); - }); - } - - /** - * Sets track position - * @param {DiscordMessage} message The message object - * @param {Number} time Time in ms to set - * @returns {Promise} - */ - setPosition(message: Message, time: number): Promise { - return new Promise((resolve) => { - const queue = this.queues.find((g) => g.guildID === message.guild.id); - if (!queue) return this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - - if (typeof time !== 'number' && !isNaN(time)) time = parseInt(time); - if (queue.playing.durationMS <= time) return this.skip(message); - if ( - queue.voiceConnection.dispatcher.streamTime === time || - queue.voiceConnection.dispatcher.streamTime + queue.additionalStreamTime === time - ) - return resolve(); - if (time < 0) this._playStream(queue, false).then(() => resolve()); - - this._playStream(queue, false, time).then(() => resolve()); - }); - } - - /** - * Sets track position - * @param {DiscordMessage} message The message object - * @param {Number} time Time in ms to set - * @returns {Promise} - */ - seek(message: Message, time: number): Promise { - return this.setPosition(message, time); - } - - /** - * Skips current track - * @param {DiscordMessage} message The message object - * @returns {Boolean} - */ - skip(message: Message): boolean { - const queue = this.getQueue(message); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return false; - } - if (!queue.voiceConnection || !queue.voiceConnection.dispatcher) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.MUSIC_STARTING, message); - return false; - } - - queue.voiceConnection.dispatcher.end(); - queue.lastSkipped = true; - - return true; - } - - /** - * Moves to a new voice channel - * @param {DiscordMessage} message The message object - * @param {DiscordVoiceChannel} channel New voice channel to move to - * @returns {Boolean} - */ - moveTo(message: Message, channel?: VoiceChannel): boolean { - if (!channel || channel.type !== 'voice') return; - const queue = this.queues.find((g) => g.guildID === message.guild.id); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return false; - } - if (!queue.voiceConnection || !queue.voiceConnection.dispatcher) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.MUSIC_STARTING, message); - return false; - } - if (queue.voiceConnection.channel.id === channel.id) return; - - queue.voiceConnection.dispatcher.pause(); - channel - .join() - .then(() => queue.voiceConnection.dispatcher.resume()) - .catch(() => this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.UNABLE_TO_JOIN, message)); - - return true; - } - - /** - * Pause the playback - * @param {DiscordMessage} message The message object - * @returns {Boolean} - */ - pause(message: Message): boolean { - const queue = this.getQueue(message); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return false; - } - if (!queue.voiceConnection || !queue.voiceConnection.dispatcher) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.MUSIC_STARTING, message); - return false; - } - - queue.voiceConnection.dispatcher.pause(); - queue.paused = true; - return true; - } - - /** - * Resume the playback - * @param {DiscordMessage} message The message object - * @returns {Boolean} - */ - resume(message: Message): boolean { - const queue = this.getQueue(message); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return false; - } - if (!queue.voiceConnection || !queue.voiceConnection.dispatcher) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.MUSIC_STARTING, message); - return false; - } - - queue.voiceConnection.dispatcher.resume(); - queue.paused = false; - return true; - } - - /** - * Stops the player - * @param {DiscordMessage} message The message object - * @returns {Boolean} - */ - stop(message: Message): boolean { - const queue = this.getQueue(message); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return false; - } - if (!queue.voiceConnection || !queue.voiceConnection.dispatcher) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.MUSIC_STARTING, message); - return false; - } - - queue.stopped = true; - queue.tracks = []; - if (queue.stream) queue.stream.destroy(); - queue.voiceConnection.dispatcher.end(); - if (this.options.leaveOnStop) queue.voiceConnection.channel.leave(); - this.queues.delete(message.guild.id); - return true; - } - - /** - * Sets music volume - * @param {DiscordMessage} message The message object - * @param {Number} percent The volume percentage/amount to set - * @returns {Boolean} - */ - setVolume(message: Message, percent: number): boolean { - const queue = this.getQueue(message); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return false; - } - if (!queue.voiceConnection || !queue.voiceConnection.dispatcher) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.MUSIC_STARTING, message); - return false; - } - - queue.volume = percent; - queue.voiceConnection.dispatcher.setVolumeLogarithmic(queue.calculatedVolume / 200); - - return true; - } - - /** - * Clears the queue - * @param {DiscordMessage} message The message object - * @returns {Boolean} - */ - clearQueue(message: Message): boolean { - const queue = this.getQueue(message); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return false; - } - - queue.tracks = queue.playing ? [queue.playing] : []; - - return true; - } - - /** - * Plays previous track - * @param {DiscordMessage} message The message object - * @returns {Boolean} - */ - back(message: Message): boolean { - const queue = this.getQueue(message); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return false; - } - if (!queue.voiceConnection || !queue.voiceConnection.dispatcher) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.MUSIC_STARTING, message); - return false; - } - - queue.tracks.splice(1, 0, queue.previousTracks.shift()); - queue.voiceConnection.dispatcher.end(); - queue.lastSkipped = true; - - return true; - } - - /** - * Sets repeat mode - * @param {DiscordMessage} message The message object - * @param {Boolean} enabled If it should enable the repeat mode - */ - setRepeatMode(message: Message, enabled: boolean): boolean { - const queue = this.getQueue(message); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return; - } - - queue.repeatMode = Boolean(enabled); - - return queue.repeatMode; - } - - /** - * Sets loop mode - * @param {DiscordMessage} message The message object - * @param {Boolean} enabled If it should enable the loop mode - * @returns {Boolean} - */ - setLoopMode(message: Message, enabled: boolean): boolean { - const queue = this.getQueue(message); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return; - } - - queue.loopMode = Boolean(enabled); - - return queue.loopMode; - } - - /** - * Returns currently playing track - * @param {DiscordMessage} message The message object - * @returns {Track} - */ - nowPlaying(message: Message): Track { - const queue = this.getQueue(message); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return; - } - - return queue.tracks[0]; - } - - /** - * Shuffles the queue - * @param {DiscordMessage} message The message object - * @returns {Queue} - */ - shuffle(message: Message): Queue { - const queue = this.getQueue(message); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return; - } - - const currentTrack = queue.tracks.shift(); - - for (let i = queue.tracks.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)); - [queue.tracks[i], queue.tracks[j]] = [queue.tracks[j], queue.tracks[i]]; - } - - queue.tracks.unshift(currentTrack); + createQueue(guild: Guild, queueInitOptions?: PlayerOptions) { + if (this.queues.has(guild.id)) return this.queues.get(guild.id); + const queue = new Queue(this, guild, queueInitOptions); + this.queues.set(guild.id, queue); return queue; } - /** - * Removes specified track - * @param {DiscordMessage} message The message object - * @param {Track|number} track The track object/id to remove - * @returns {Track} - */ - remove(message: Message, track: Track | number): Track { - const queue = this.getQueue(message); - if (!queue) { - this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - return; - } - - let trackFound: Track = null; - if (typeof track === 'number') { - trackFound = queue.tracks[track]; - if (trackFound) { - queue.tracks = queue.tracks.filter((t) => t !== trackFound); - } - } else { - trackFound = queue.tracks.find((s) => s === track); - if (trackFound) { - queue.tracks = queue.tracks.filter((s) => s !== trackFound); - } - } - - return trackFound; + getQueue(guild: Snowflake) { + return this.queues.get(guild); } - /** - * Returns time code of currently playing song - * @param {DiscordMessage} message The message object - * @param {Boolean} [queueTime] If it should make the time code of the whole queue - * @returns {Object} - */ - getTimeCode(message: Message, queueTime?: boolean): { current: string; end: string } { - const queue = this.getQueue(message); - if (!queue) return; - - const previousTracksTime = - queue.previousTracks.length > 0 ? queue.previousTracks.reduce((p, c) => p + c.durationMS, 0) : 0; - const currentStreamTime = queueTime ? previousTracksTime + queue.currentStreamTime : queue.currentStreamTime; - const totalTracksTime = queue.totalTime; - const totalTime = queueTime ? previousTracksTime + totalTracksTime : queue.playing.durationMS; - - const currentTimecode = Util.buildTimeCode(Util.parseMS(currentStreamTime)); - const endTimecode = Util.buildTimeCode(Util.parseMS(totalTime)); - - return { - current: currentTimecode, - end: endTimecode - }; - } - - /** - * Creates progressbar - * @param {DiscordMessage} message The message object - * @param {PlayerProgressbarOptions} [options] Progressbar options - * @returns {String} - */ - createProgressBar(message: Message, options?: PlayerProgressbarOptions): string { - const queue = this.getQueue(message); - if (!queue) return; - - const previousTracksTime = - queue.previousTracks.length > 0 ? queue.previousTracks.reduce((p, c) => p + c.durationMS, 0) : 0; - const currentStreamTime = options?.queue - ? previousTracksTime + queue.currentStreamTime - : queue.currentStreamTime; - const totalTracksTime = queue.totalTime; - const totalTime = options?.queue ? previousTracksTime + totalTracksTime : queue.playing.durationMS; - const length = - typeof options?.length === 'number' - ? options?.length <= 0 || options?.length === Infinity - ? 15 - : options?.length - : 15; - - const index = Math.round((currentStreamTime / totalTime) * length); - const indicator = '🔘'; - const line = '▬'; - - if (index >= 1 && index <= length) { - const bar = line.repeat(length - 1).split(''); - bar.splice(index, 0, indicator); - if (Boolean(options?.timecodes)) { - const currentTimecode = Util.buildTimeCode(Util.parseMS(currentStreamTime)); - const endTimecode = Util.buildTimeCode(Util.parseMS(totalTime)); - return `${currentTimecode} ┃ ${bar.join('')} ┃ ${endTimecode}`; - } else { - return `${bar.join('')}`; - } - } else { - if (Boolean(options?.timecodes)) { - const currentTimecode = Util.buildTimeCode(Util.parseMS(currentStreamTime)); - const endTimecode = Util.buildTimeCode(Util.parseMS(totalTime)); - return `${currentTimecode} ┃ ${indicator}${line.repeat(length - 1)} ┃ ${endTimecode}`; - } else { - return `${indicator}${line.repeat(length - 1)}`; - } - } - } - - /** - * Gets lyrics of a song - * You need to have `@discord-player/extractor` installed in order to use this method! - * @param {String} query Search query - * @example const lyrics = await player.lyrics("alan walker faded") - * message.channel.send(lyrics.lyrics); - * @returns {Promise} - */ - async lyrics(query: string): Promise { - const extractor = Util.require('@discord-player/extractor'); - if (!extractor) throw new PlayerError("Cannot call 'Player.lyrics()' without '@discord-player/extractor'"); - - const data = await extractor.Lyrics(query); - if (Array.isArray(data)) return null; - - return data; - } - - /** - * Toggle autoplay for youtube streams - * @param {DiscordMessage} message The message object - * @param {Boolean} enable Enable/Disable autoplay - * @returns {boolean} - */ - setAutoPlay(message: Message, enable: boolean): boolean { - const queue = this.getQueue(message); - if (!queue) return void this.emit(PlayerEvents.ERROR, PlayerErrorEventCodes.NOT_PLAYING, message); - - queue.autoPlay = Boolean(enable); - - return queue.autoPlay; - } - - /** - * Player stats - * @returns {PlayerStats} - */ - getStats(): PlayerStats { - return { - uptime: this.client.uptime, - connections: this.client.voice.connections.size, - users: this.client.voice.connections.reduce( - (a, c) => a + c.channel.members.filter((a) => a.user.id !== this.client.user.id).size, - 0 - ), - queues: this.queues.size, - extractors: this.Extractors.size, - versions: { - ffmpeg: Util.getFFmpegVersion(), - node: process.version, - v8: process.versions.v8 - }, - system: { - arch: process.arch, - platform: process.platform, - cpu: os.cpus().length, - memory: { - total: (process.memoryUsage().heapTotal / 1024 / 1024).toFixed(2), - usage: (process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2), - rss: (process.memoryUsage().rss / 1024 / 1024).toFixed(2), - arrayBuffers: (process.memoryUsage().arrayBuffers / 1024 / 1024).toFixed(2) - }, - uptime: process.uptime() - } - }; - } - - /** - * Jumps to particular track - * @param {DiscordMessage} message The message - * @param {Track|number} track The track to jump to - * @returns {boolean} - */ - jump(message: Message, track: Track | number): boolean { - const toJUMP = this.remove(message, track); - const queue = this.getQueue(message); - if (!toJUMP || !queue) throw new PlayerError('Specified Track not found'); - - queue.tracks.splice(1, 0, toJUMP); - - return this.skip(message); - } - - private _handleVoiceStateUpdate(oldState: VoiceState, newState: VoiceState): void { - const queue = this.queues.find((g) => g.guildID === oldState.guild.id); - if (!queue) return; - - if (newState.member.id === this.client.user.id && !newState.channelID) { - queue.stream.destroy(); - this.queues.delete(newState.guild.id); - this.emit(PlayerEvents.BOT_DISCONNECT, queue.firstMessage); - } - - if (!queue.voiceConnection || !queue.voiceConnection.channel) return; - if (!this.options.leaveOnEmpty) return; - - if (!oldState.channelID || newState.channelID) { - const emptyTimeout = this._cooldownsTimeout.get(`empty_${oldState.guild.id}`); - const channelEmpty = Util.isVoiceEmpty(queue.voiceConnection.channel); - if (!channelEmpty && emptyTimeout) { - clearTimeout(emptyTimeout); - this._cooldownsTimeout.delete(`empty_${oldState.guild.id}`); - } - } else { - if (!Util.isVoiceEmpty(queue.voiceConnection.channel)) return; - const timeout = setTimeout(() => { - if (!Util.isVoiceEmpty(queue.voiceConnection.channel)) return; - if (!this.queues.has(queue.guildID)) return; - queue.voiceConnection.channel.leave(); - this.queues.delete(queue.guildID); - this.emit(PlayerEvents.CHANNEL_EMPTY, queue.firstMessage, queue); - }, this.options.leaveOnEmptyCooldown || 0); - this._cooldownsTimeout.set(`empty_${oldState.guild.id}`, timeout); - } - } - - private _addTrackToQueue(message: Message, track: Track): Queue { - const queue = this.getQueue(message); - if (!queue) - this.emit( - PlayerEvents.ERROR, - PlayerErrorEventCodes.NOT_PLAYING, - message, - new PlayerError('Player is not available in this server') - ); - if (!track || !(track instanceof Track)) throw new PlayerError('No track specified to add to the queue'); - queue.tracks.push(track); - return queue; - } - - private _addTracksToQueue(message: Message, tracks: Track[]): Queue { - const queue = this.getQueue(message); - if (!queue) - throw new PlayerError( - 'Cannot add tracks to queue because no song is currently being played on the server.' - ); - queue.tracks.push(...tracks); - return queue; - } - - private _createQueue(message: Message, track: Track): Promise { - return new Promise((resolve) => { - const channel = message.member.voice ? message.member.voice.channel : null; - if (!channel) - return void this.emit( - PlayerEvents.ERROR, - PlayerErrorEventCodes.NOT_CONNECTED, - message, - new PlayerError('Voice connection is not available in this server!') - ); - - const queue = new Queue(this, message); - this.queues.set(message.guild.id, queue); - - channel - .join() - .then((connection) => { - this.emit(PlayerEvents.CONNECTION_CREATE, message, connection); - - queue.voiceConnection = connection; - if (this.options.autoSelfDeaf) connection.voice.setSelfDeaf(true); - queue.tracks.push(track); - this.emit(PlayerEvents.QUEUE_CREATE, message, queue); - resolve(queue); - this._playTrack(queue, true); - }) - .catch((err) => { - this.queues.delete(message.guild.id); - this.emit( - PlayerEvents.ERROR, - PlayerErrorEventCodes.UNABLE_TO_JOIN, - message, - new PlayerError(err.message ?? err) - ); - }); - }); - } - - private async _playTrack(queue: Queue, firstPlay: boolean): Promise { - if (queue.stopped) return; - - if (!queue.autoPlay && queue.tracks.length === 1 && !queue.loopMode && !queue.repeatMode && !firstPlay) { - if (this.options.leaveOnEnd && !queue.stopped) { - this.queues.delete(queue.guildID); - const timeout = setTimeout(() => { - queue.voiceConnection.channel.leave(); - }, this.options.leaveOnEndCooldown || 0); - this._cooldownsTimeout.set(`end_${queue.guildID}`, timeout); - } - - this.queues.delete(queue.guildID); - - if (queue.stopped) { - return void this.emit(PlayerEvents.MUSIC_STOP, queue.firstMessage); - } - - return void this.emit(PlayerEvents.QUEUE_END, queue.firstMessage, queue); - } - - if (queue.autoPlay && !queue.repeatMode && !firstPlay) { - const oldTrack = queue.tracks.shift(); - - const info = oldTrack.raw.source === 'youtube' ? await ytdl.getInfo(oldTrack.url).catch((e) => {}) : null; - if (info) { - const res = await Util.ytSearch(info.related_videos[0].title, { - player: this, - limit: 1, - user: oldTrack.requestedBy - }) - .then((v) => v[0]) - .catch((e) => {}); - - if (res) { - queue.tracks.push(res); - if (queue.loopMode) queue.tracks.push(oldTrack); - queue.previousTracks.push(oldTrack); - } - } - } else if (!queue.autoPlay && !queue.repeatMode && !firstPlay) { - const oldTrack = queue.tracks.shift(); - if (queue.loopMode) queue.tracks.push(oldTrack); - queue.previousTracks.push(oldTrack); - } - - const track = queue.playing; - - queue.lastSkipped = false; - this._playStream(queue, false).then(() => { - if (!firstPlay) this.emit(PlayerEvents.TRACK_START, queue.firstMessage, track, queue); - }); - } - - private _playStream(queue: Queue, updateFilter: boolean, seek?: number): Promise { - return new Promise(async (resolve) => { - const ffmpeg = Util.checkFFmpeg(); - if (!ffmpeg) return; - - const seekTime = - typeof seek === 'number' - ? seek - : updateFilter - ? queue.voiceConnection.dispatcher.streamTime + queue.additionalStreamTime - : undefined; - const encoderArgsFilters: string[] = []; - - Object.keys(queue.filters).forEach((filterName) => { - // @ts-ignore - if (queue.filters[filterName]) { - // @ts-ignore - encoderArgsFilters.push(this.filters[filterName]); - } - }); - - let encoderArgs: string[] = []; - if (encoderArgsFilters.length < 1) { - encoderArgs = []; - } else { - encoderArgs = ['-af', encoderArgsFilters.join(',')]; - } - - let newStream: any; - if (queue.playing.raw.source === 'youtube') { - newStream = ytdl(queue.playing.url, { - opusEncoded: true, - encoderArgs: queue.playing.raw.live ? [] : encoderArgs, - seek: seekTime / 1000, - // tslint:disable-next-line:no-bitwise - highWaterMark: 1 << 25, - ...this.options.ytdlDownloadOptions - }); - } else { - newStream = ytdl.arbitraryStream( - queue.playing.raw.source === 'soundcloud' - ? await queue.playing.raw.engine.downloadProgressive() - : queue.playing.raw.engine, - { - opusEncoded: true, - encoderArgs, - seek: seekTime / 1000 - } - ); - } - - setTimeout(() => { - if (queue.stream) queue.stream.destroy(); - queue.stream = newStream; - queue.voiceConnection.play(newStream, { - type: 'opus', - bitrate: 'auto', - volume: Util.isRepl() ? false : undefined - }); - - if (seekTime) { - queue.additionalStreamTime = seekTime; - } - queue.voiceConnection.dispatcher.setVolumeLogarithmic(queue.calculatedVolume / 200); - queue.voiceConnection.dispatcher.on('start', () => { - resolve(); - }); - - queue.voiceConnection.dispatcher.on('finish', () => { - queue.additionalStreamTime = 0; - return this._playTrack(queue, false); - }); - - newStream.on('error', (error: Error) => { - if (error.message.toLowerCase().includes('video unavailable')) { - this.emit( - PlayerEvents.ERROR, - PlayerErrorEventCodes.VIDEO_UNAVAILABLE, - queue.firstMessage, - queue.playing, - error - ); - this._playTrack(queue, false); - } else { - this.emit(PlayerEvents.ERROR, error, queue.firstMessage, error); - } - }); - }, 1000); - }); - } - - toString() { - return ``; + *[Symbol.iterator]() { + yield* Array.from(this.queues.values()); } } -export default Player; - -/** - * Emitted when a track starts - * @event Player#trackStart - * @param {DiscordMessage} message The message - * @param {Track} track The track - * @param {Queue} queue The queue - */ - -/** - * Emitted when a playlist is started - * @event Player#queueCreate - * @param {DiscordMessage} message The message - * @param {Queue} queue The queue - */ - -/** - * Emitted when the bot is awaiting search results - * @event Player#searchResults - * @param {DiscordMessage} message The message - * @param {String} query The query - * @param {Track[]} tracks The tracks - * @param {DiscordCollector} collector The collector - */ - -/** - * Emitted when the user has sent an invalid response for search results - * @event Player#searchInvalidResponse - * @param {DiscordMessage} message The message - * @param {String} query The query - * @param {Track[]} tracks The tracks - * @param {String} invalidResponse The `invalidResponse` string - * @param {DiscordCollector} collector The collector - */ - -/** - * Emitted when the bot has stopped awaiting search results (timeout) - * @event Player#searchCancel - * @param {DiscordMessage} message The message - * @param {String} query The query - * @param {Track[]} tracks The tracks - */ - -/** - * Emitted when the bot can't find related results to the query - * @event Player#noResults - * @param {DiscordMessage} message The message - * @param {String} query The query - */ - -/** - * Emitted when the bot is disconnected from the channel - * @event Player#botDisconnect - * @param {DiscordMessage} message The message - */ - -/** - * Emitted when the channel of the bot is empty - * @event Player#channelEmpty - * @param {DiscordMessage} message The message - * @param {Queue} queue The queue - */ - -/** - * Emitted when the queue of the server is ended - * @event Player#queueEnd - * @param {DiscordMessage} message The message - * @param {Queue} queue The queue - */ - -/** - * Emitted when a track is added to the queue - * @event Player#trackAdd - * @param {DiscordMessage} message The message - * @param {Queue} queue The queue - * @param {Track} track The track - */ - -/** - * Emitted when a playlist is added to the queue - * @event Player#playlistAdd - * @param {DiscordMessage} message The message - * @param {Queue} queue The queue - * @param {Object} playlist The playlist - */ - -/** - * Emitted when an error is triggered - * @event Player#error - * @param {String} error It can be `NotConnected`, `UnableToJoin`, `NotPlaying`, `ParseError`, `LiveVideo` or `VideoUnavailable`. - * @param {DiscordMessage} message The message - */ - -/** - * Emitted when discord-player attempts to parse playlist contents (mostly soundcloud playlists) - * @event Player#playlistParseStart - * @param {Object} playlist Raw playlist (unparsed) - * @param {DiscordMessage} message The message - */ - -/** - * Emitted when discord-player finishes parsing playlist contents (mostly soundcloud playlists) - * @event Player#playlistParseEnd - * @param {Object} playlist The playlist data (parsed) - * @param {DiscordMessage} message The message - */ - -/** - * @typedef {Object} PlayerOptions - * @property {Boolean} [leaveOnEnd=false] If it should leave on queue end - * @property {Number} [leaveOnEndCooldown=0] Time in ms to wait before executing `leaveOnEnd` - * @property {Boolean} [leaveOnStop=false] If it should leave on stop command - * @property {Boolean} [leaveOnEmpty=false] If it should leave on empty voice channel - * @property {Number} [leaveOnEmptyCooldown=0] Time in ms to wait before executing `leaveOnEmpty` - * @property {Boolean} [autoSelfDeaf=false] If it should set the client to `self deaf` mode on joining - * @property {Boolean} [enableLive=false] If it should enable live videos support - * @property {YTDLDownloadOptions} [ytdlDownloadOptions={}] The download options passed to `ytdl-core` - * @property {Boolean} [useSafeSearch=false] If it should use `safe search` method for youtube searches - * @property {Boolean} [disableAutoRegister=false] If it should disable auto-registeration of `@discord-player/extractor` - */ - -/** - * The type of Track source, either: - * * `soundcloud` - a stream from SoundCloud - * * `youtube` - a stream from YouTube - * * `arbitrary` - arbitrary stream - * @typedef {String} TrackSource - */ - -/** - * @typedef {Object} TrackData - * @property {String} title The title - * @property {String} description The description - * @property {String} author The author - * @property {String} url The url - * @property {String} duration The duration - * @property {Number} views The view count - * @property {DiscordUser} requestedBy The user who requested this track - * @property {Boolean} fromPlaylist If this track came from a playlist - * @property {TrackSource} [source] The track source - * @property {string|Readable} [engine] The stream engine - * @property {Boolean} [live=false] If this track is livestream instance - */ - -/** - * @typedef {Object} QueueFilters - * The FFmpeg Filters - */ - -/** - * The query type, either: - * * `soundcloud_track` - a SoundCloud Track - * * `soundcloud_playlist` - a SoundCloud Playlist - * * `spotify_song` - a Spotify Song - * * `spotify_album` - a Spotify album - * * `spotify_playlist` - a Spotify playlist - * * `youtube_video` - a YouTube video - * * `youtube_playlist` - a YouTube playlist - * * `vimeo` - a Vimeo link - * * `facebook` - a Facebook link - * * `reverbnation` - a Reverbnation link - * * `attachment` - an attachment link - * * `youtube_search` - a YouTube search keyword - * @typedef {String} QueryType The query type - */ - -/** - * @typedef {Object} ExtractorModelData - * @property {String} title The title - * @property {Number} duration The duration in ms - * @property {String} thumbnail The thumbnail url - * @property {string|Readable} engine The audio engine - * @property {Number} views The views count of this stream - * @property {String} author The author - * @property {String} description The description - * @property {String} url The url - * @property {String} [version='0.0.0'] The extractor version - * @property {Boolean} [important=false] Mark as important - */ - -/** - * @typedef {Object} PlayerProgressbarOptions - * @property {Boolean} [timecodes] If it should return progres bar with time codes - * @property {Boolean} [queue] if it should return the progress bar of the whole queue - * @property {Number} [length] The length of progress bar to build - */ - -/** - * @typedef {Object} LyricsData - * @property {String} title The title of the lyrics - * @property {Number} id The song id - * @property {String} thumbnail The thumbnail - * @property {String} image The image - * @property {String} url The url - * @property {Object} artist The artust info - * @property {String} [artist.name] The name of the artist - * @property {Number} [artist.id] The ID of the artist - * @property {String} [artist.url] The profile link of the artist - * @property {String} [artist.image] The artist image url - * @property {String?} lyrics The lyrics - */ - -/** - * @typedef {Object} PlayerStats - * @property {Number} uptime The uptime in ms - * @property {Number} connections The number of connections - * @property {Number} users The number of users - * @property {Number} queues The number of queues - * @property {Number} extractors The number of custom extractors registered - * @property {Object} versions The versions metadata - * @property {String} [versions.ffmpeg] The ffmpeg version - * @property {String} [versions.node] The node version - * @property {String} [versions.v8] The v8 JavaScript engine version - * @property {Object} system The system data - * @property {String} [system.arch] The system arch - * @property {String} [system.platform] The system platform - * @property {Number} [system.cpu] The cpu count - * @property {Object} [system.memory] The memory info - * @property {String} [system.memory.total] The total memory - * @property {String} [system.memory.usage] The memory usage - * @property {String} [system.memory.rss] The memory usage in RSS - * @property {String} [system.memory.arrayBuffers] The memory usage in ArrayBuffers - * @property {Number} [system.uptime] The system uptime - */ - -/** - * @typedef {Object} TimeData - * @property {Number} days The time in days - * @property {Number} hours The time in hours - * @property {Number} minutes The time in minutes - * @property {Number} seconds The time in seconds - */ +export { DiscordPlayer as Player }; diff --git a/src/Structures/ExtractorModel.ts b/src/Structures/ExtractorModel.ts index 578470a..dbbdae7 100644 --- a/src/Structures/ExtractorModel.ts +++ b/src/Structures/ExtractorModel.ts @@ -1,4 +1,4 @@ -import { ExtractorModelData } from '../types/types'; +import { ExtractorModelData } from "../types/types"; class ExtractorModel { name: string; @@ -16,7 +16,7 @@ class ExtractorModel { */ this.name = extractorName; - Object.defineProperty(this, '_raw', { value: data, configurable: false, writable: false, enumerable: false }); + Object.defineProperty(this, "_raw", { value: data, configurable: false, writable: false, enumerable: false }); } /** @@ -54,7 +54,7 @@ class ExtractorModel { * @type {String} */ get version(): string { - return this._raw.version ?? '0.0.0'; + return this._raw.version ?? "0.0.0"; } /** @@ -66,5 +66,4 @@ class ExtractorModel { } } -export default ExtractorModel; export { ExtractorModel }; diff --git a/src/Structures/Playlist.ts b/src/Structures/Playlist.ts new file mode 100644 index 0000000..04a81c2 --- /dev/null +++ b/src/Structures/Playlist.ts @@ -0,0 +1,18 @@ +import { Player } from "../Player"; +import { Track } from "./Track"; + +class Playlist { + public readonly player: Player; + public tracks: Track[]; + + constructor(player: Player, tracks: Track[]) { + this.player = player; + this.tracks = tracks ?? []; + } + + *[Symbol.iterator]() { + yield* this.tracks; + } +} + +export { Playlist }; diff --git a/src/Structures/Queue.ts b/src/Structures/Queue.ts index 1cee68b..095c1f2 100644 --- a/src/Structures/Queue.ts +++ b/src/Structures/Queue.ts @@ -1,204 +1,66 @@ -import { Message, Snowflake, VoiceConnection } from 'discord.js'; -import AudioFilters from '../utils/AudioFilters'; -import { Player } from '../Player'; -import { EventEmitter } from 'events'; -import { Track } from './Track'; -import { QueueFilters } from '../types/types'; +import { Guild, StageChannel, VoiceChannel } from "discord.js"; +import { Player } from "../Player"; +import { VoiceSubscription } from "../VoiceInterface/VoiceSubscription"; +import Track from "./Track"; +import { PlayerOptions } from "../types/types"; -export class Queue extends EventEmitter { - public player!: Player; - public guildID: Snowflake; - public voiceConnection?: VoiceConnection; - public stream?: any; - public tracks: Track[]; - public previousTracks: Track[]; - public stopped: boolean; - public lastSkipped: boolean; - public volume: number; - public paused: boolean; - public repeatMode: boolean; - public loopMode: boolean; - public filters: QueueFilters; - public additionalStreamTime: number; - public firstMessage: Message; +class Queue { + public readonly guild: Guild; + public readonly player: Player; + public voiceConnection: VoiceSubscription; + public tracks: Track[] = []; + public options: PlayerOptions; - /** - * If autoplay is enabled in this queue - * @type {boolean} - */ - public autoPlay = false; + constructor(player: Player, guild: Guild, options: PlayerOptions = {}) { + this.player = player; + this.guild = guild; + this.options = {}; - /** - * Queue constructor - * @param {Player} player The player that instantiated this Queue - * @param {DiscordMessage} message The message object - */ - constructor(player: Player, message: Message) { - super(); - - /** - * The player that instantiated this Queue - * @name Queue#player - * @type {Player} - * @readonly - */ - Object.defineProperty(this, 'player', { value: player, enumerable: false }); - - /** - * ID of the guild assigned to this queue - * @type {DiscordSnowflake} - */ - this.guildID = message.guild.id; - - /** - * The voice connection of this queue - * @type {DiscordVoiceConnection} - */ - this.voiceConnection = null; - - /** - * Tracks of this queue - * @type {Track[]} - */ - this.tracks = []; - - /** - * Previous tracks of this queue - * @type {Track[]} - */ - this.previousTracks = []; - - /** - * If the player of this queue is stopped - * @type {boolean} - */ - this.stopped = false; - - /** - * If last track was skipped - * @type {boolean} - */ - this.lastSkipped = false; - - /** - * Queue volume - * @type {Number} - */ - this.volume = 100; - - /** - * If the player of this queue is paused - * @type {boolean} - */ - this.paused = Boolean(this.voiceConnection?.dispatcher?.paused); - - /** - * If repeat mode is enabled in this queue - * @type {boolean} - */ - this.repeatMode = false; - - /** - * If loop mode is enabled in this queue - * @type {boolean} - */ - this.loopMode = false; - - /** - * The additional calculated stream time - * @type {Number} - */ - this.additionalStreamTime = 0; - - /** - * The initial message object - * @type {DiscordMessage} - */ - this.firstMessage = message; - - /** - * The audio filters in this queue - * @type {QueueFilters} - */ - this.filters = {}; - - Object.keys(AudioFilters).forEach((fn) => { - this.filters[fn as keyof QueueFilters] = false; - }); + Object.assign( + this.options, + { + leaveOnEnd: true, + leaveOnEndCooldown: 1000, + leaveOnStop: true, + leaveOnEmpty: true, + leaveOnEmptyCooldown: 1000, + autoSelfDeaf: true, + enableLive: false, + ytdlDownloadOptions: {}, + useSafeSearch: false, + disableAutoRegister: false, + fetchBeforeQueued: false + } as PlayerOptions, + options + ); } - /** - * Currently playing track - * @type {Track} - */ - get playing(): Track { - return this.tracks[0]; + get current() { + return this.voiceConnection.audioResource?.metadata ?? this.tracks[0]; } - /** - * Calculated volume of this queue - * @type {Number} - */ - get calculatedVolume(): number { - return this.filters.normalizer ? this.volume + 70 : this.volume; + async joinVoiceChannel(channel: StageChannel | VoiceChannel) { + if (!["stage", "voice"].includes(channel.type)) + throw new TypeError(`Channel type must be voice or stage, got ${channel.type}!`); + const connection = await this.player.voiceUtils.connect(channel); + this.voiceConnection = connection; + + return this; } - /** - * Total duration - * @type {Number} - */ - get totalTime(): number { - return this.tracks.length > 0 ? this.tracks.map((t) => t.durationMS).reduce((p, c) => p + c) : 0; + destroy() { + this.voiceConnection.stop(); + this.voiceConnection.disconnect(); + this.player.queues.delete(this.guild.id); } - /** - * Current stream time - * @type {Number} - */ - get currentStreamTime(): number { - return this.voiceConnection?.dispatcher?.streamTime + this.additionalStreamTime || 0; + play() { + throw new Error("Not implemented"); } - /** - * Sets audio filters in this player - * @param {QueueFilters} filters Audio filters to set - * @type {Promise} - */ - setFilters(filters: QueueFilters): Promise { - return this.player.setFilters(this.firstMessage, filters); - } - - /** - * Returns array of all enabled filters - * @type {String[]} - */ - getFiltersEnabled(): string[] { - const filters: string[] = []; - - for (const filter in this.filters) { - if (this.filters[filter as keyof QueueFilters] !== false) filters.push(filter); - } - - return filters; - } - - /** - * Returns all disabled filters - * @type {String[]} - */ - getFiltersDisabled(): string[] { - const enabled = this.getFiltersEnabled(); - - return Object.keys(this.filters).filter((f) => !enabled.includes(f)); - } - - /** - * String representation of this Queue - * @returns {String} - */ - toString(): string { - return ``; + *[Symbol.iterator]() { + yield* this.tracks; } } -export default Queue; +export { Queue }; diff --git a/src/Structures/Track.ts b/src/Structures/Track.ts index b2759f1..ee5e79e 100644 --- a/src/Structures/Track.ts +++ b/src/Structures/Track.ts @@ -1,9 +1,9 @@ -import { Player } from '../Player'; -import { User } from 'discord.js'; -import { TrackData } from '../types/types'; -import Queue from './Queue'; +import { User } from "discord.js"; +import { Player } from "../Player"; +import { RawTrackData } from "../types/types"; +import { Queue } from "./Queue"; -export class Track { +class Track { public player!: Player; public title!: string; public description!: string; @@ -14,21 +14,21 @@ export class Track { public views!: number; public requestedBy!: User; public fromPlaylist!: boolean; - public raw!: TrackData; + public raw!: RawTrackData; /** * Track constructor * @param {Player} player The player that instantiated this Track - * @param {TrackData} data Track data + * @param {RawTrackData} data Track data */ - constructor(player: Player, data: TrackData) { + constructor(player: Player, data: RawTrackData) { /** * The player that instantiated this Track * @name Track#player * @type {Player} * @readonly */ - Object.defineProperty(this, 'player', { value: player, enumerable: false }); + Object.defineProperty(this, "player", { value: player, enumerable: false }); /** * Title of this track @@ -87,25 +87,24 @@ export class Track { /** * Raw track data * @name Track#raw - * @type {TrackData} + * @type {RawTrackData} */ void this._patch(data); } - private _patch(data: TrackData) { - this.title = data.title ?? ''; - this.description = data.description ?? ''; - this.author = data.author ?? ''; - this.url = data.url ?? ''; - this.thumbnail = data.thumbnail ?? ''; - this.duration = data.duration ?? ''; + private _patch(data: RawTrackData) { + this.title = data.title ?? ""; + this.author = data.author ?? ""; + this.url = data.url ?? ""; + this.thumbnail = data.thumbnail ?? ""; + this.duration = data.duration ?? ""; this.views = data.views ?? 0; this.requestedBy = data.requestedBy; this.fromPlaylist = Boolean(data.fromPlaylist); // raw - Object.defineProperty(this, 'raw', { get: () => data, enumerable: false }); + Object.defineProperty(this, "raw", { get: () => data, enumerable: false }); } /** @@ -128,12 +127,20 @@ export class Track { }; return this.duration - .split(':') + .split(":") .reverse() .map((m, i) => parseInt(m) * times(60, i)) .reduce((a, c) => a + c, 0); } + /** + * Returns source of this track + * @type {TrackSource} + */ + get source() { + return this.raw.source ?? "arbitrary"; + } + /** * String representation of this track * @returns {String} @@ -144,3 +151,5 @@ export class Track { } export default Track; + +export { Track }; diff --git a/src/VoiceInterface/VoiceSubscription.ts b/src/VoiceInterface/VoiceSubscription.ts new file mode 100644 index 0000000..fb12731 --- /dev/null +++ b/src/VoiceInterface/VoiceSubscription.ts @@ -0,0 +1,141 @@ +import { + AudioPlayer, + AudioPlayerError, + AudioPlayerStatus, + AudioResource, + createAudioPlayer, + createAudioResource, + entersState, + StreamType, + VoiceConnection, + VoiceConnectionStatus +} from "@discordjs/voice"; +import { Duplex, Readable } from "stream"; +import { TypedEmitter as EventEmitter } from "tiny-typed-emitter"; +import Track from "../Structures/Track"; +import PlayerError from "../utils/PlayerError"; + +export interface VoiceEvents { + error: (error: AudioPlayerError) => any; + debug: (message: string) => any; + start: () => any; + finish: () => any; +} + +class VoiceSubscription extends EventEmitter { + public readonly voiceConnection: VoiceConnection; + public readonly audioPlayer: AudioPlayer; + public connectPromise?: Promise; + public audioResource?: AudioResource; + + constructor(connection: VoiceConnection) { + super(); + + this.voiceConnection = connection; + this.audioPlayer = createAudioPlayer(); + + this.voiceConnection.on("stateChange", (_, newState) => { + if (newState.status === VoiceConnectionStatus.Disconnected) { + if (this.voiceConnection.reconnectAttempts < 5) { + setTimeout(() => { + if (this.voiceConnection.state.status === VoiceConnectionStatus.Disconnected) { + this.voiceConnection.reconnect(); + } + }, (this.voiceConnection.reconnectAttempts + 1) * 5000).unref(); + } else { + this.voiceConnection.destroy(); + } + } else if (newState.status === VoiceConnectionStatus.Destroyed) { + this.stop(); + } else if ( + !this.connectPromise && + (newState.status === VoiceConnectionStatus.Connecting || + newState.status === VoiceConnectionStatus.Signalling) + ) { + this.connectPromise = entersState(this.voiceConnection, VoiceConnectionStatus.Ready, 20000) + .then(() => undefined) + .catch(() => { + if (this.voiceConnection.state.status !== VoiceConnectionStatus.Destroyed) + this.voiceConnection.destroy(); + }) + .finally(() => (this.connectPromise = undefined)); + } + }); + + this.audioPlayer.on("stateChange", (oldState, newState) => { + if (newState.status === AudioPlayerStatus.Idle && oldState.status !== AudioPlayerStatus.Idle) { + void this.emit("finish"); + } else if (newState.status === AudioPlayerStatus.Playing) { + void this.emit("start"); + } + }); + + this.audioPlayer.on("debug", (m) => void this.emit("debug", m)); + this.audioPlayer.on("error", (error) => void this.emit("error", error)); + this.voiceConnection.subscribe(this.audioPlayer); + } + + /** + * Creates stream + * @param {Readable|Duplex|string} src The stream source + * @param {({type?:StreamType;data?:any;inlineVolume?:boolean})} [ops] Options + * @returns {AudioResource} + */ + createStream(src: Readable | Duplex | string, ops?: { type?: StreamType; data?: any; inlineVolume?: boolean }) { + this.audioResource = createAudioResource(src, { + inputType: ops?.type ?? StreamType.Arbitrary, + metadata: ops?.data, + inlineVolume: Boolean(ops?.inlineVolume) + }); + + return this.audioResource; + } + + /** + * The player status + */ + get status() { + return this.audioPlayer.state.status; + } + + /** + * Disconnects from voice + */ + disconnect() { + this.voiceConnection.destroy(); + } + + /** + * Stops the player + */ + stop() { + this.audioPlayer.stop(); + } + + pause(interpolateSilence?: boolean) { + return this.audioPlayer.pause(interpolateSilence); + } + + resume() { + return this.audioPlayer.unpause(); + } + + /** + * Play stream + * @param {AudioResource} resource The audio resource to play + */ + playStream(resource: AudioResource = this.audioResource) { + if (!resource) throw new PlayerError("Audio resource is not available!"); + if (!this.audioResource && resource) this.audioResource = resource; + this.audioPlayer.play(resource); + + return this; + } + + get streamTime() { + if (!this.audioResource) return 0; + return this.audioResource.playbackDuration; + } +} + +export { VoiceSubscription }; diff --git a/src/VoiceInterface/VoiceUtils.ts b/src/VoiceInterface/VoiceUtils.ts new file mode 100644 index 0000000..093af34 --- /dev/null +++ b/src/VoiceInterface/VoiceUtils.ts @@ -0,0 +1,53 @@ +import { VoiceChannel, StageChannel, Collection, Snowflake } from "discord.js"; +import { entersState, joinVoiceChannel, VoiceConnection, VoiceConnectionStatus } from "@discordjs/voice"; +import { VoiceSubscription } from "./VoiceSubscription"; + +class VoiceUtils { + public cache = new Collection(); + + /** + * Joins a voice channel + * @param {StageChannel|VoiceChannel} channel The voice channel + * @param {({deaf?: boolean;maxTime?: number;})} [options] Join options + * @returns {Promise} + */ + public async connect( + channel: VoiceChannel | StageChannel, + options?: { + deaf?: boolean; + maxTime?: number; + } + ): Promise { + let conn = joinVoiceChannel({ + guildId: channel.guild.id, + channelId: channel.id, + adapterCreator: channel.guild.voiceAdapterCreator, + selfDeaf: Boolean(options?.deaf) + }); + + try { + conn = await entersState(conn, VoiceConnectionStatus.Ready, options?.maxTime ?? 20000); + const sub = new VoiceSubscription(conn); + this.cache.set(channel.guild.id, sub); + return sub; + } catch (err) { + conn.destroy(); + throw err; + } + } + + /** + * Disconnects voice connection + * @param {VoiceConnection} connection The voice connection + */ + public disconnect(connection: VoiceConnection | VoiceSubscription) { + if (connection instanceof VoiceSubscription) return connection.voiceConnection.destroy(); + return connection.destroy(); + } + + public getConnection(guild: Snowflake) { + return this.cache.get(guild); + } +} + +export { VoiceUtils }; diff --git a/src/index.ts b/src/index.ts index 4dd3a82..5061c5a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,9 +1,4 @@ -export { AudioFilters } from './utils/AudioFilters'; -export * as Constants from './utils/Constants'; -export { ExtractorModel } from './Structures/ExtractorModel'; -export { Player } from './Player'; -export { Util } from './utils/Util'; -export { Track } from './Structures/Track'; -export { Queue } from './Structures/Queue'; -export * from './types/types'; -export { PlayerError } from './utils/PlayerError'; +export { AudioFilters } from "./utils/AudioFilters"; +export { PlayerError } from "./utils/PlayerError"; +export { VoiceUtils } from "./VoiceInterface/VoiceUtils"; +export { VoiceEvents, VoiceSubscription } from "./VoiceInterface/VoiceSubscription"; diff --git a/src/types/types.ts b/src/types/types.ts index 81ee970..414ba9e 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -1,42 +1,12 @@ -import { downloadOptions } from 'ytdl-core'; -import { User } from 'discord.js'; -import { Readable, Duplex } from 'stream'; - -export interface PlayerOptions { - leaveOnEnd?: boolean; - leaveOnEndCooldown?: number; - leaveOnStop?: boolean; - leaveOnEmpty?: boolean; - leaveOnEmptyCooldown?: number; - autoSelfDeaf?: boolean; - enableLive?: boolean; - ytdlDownloadOptions?: downloadOptions; - useSafeSearch?: boolean; - disableAutoRegister?: boolean; -} +import { User } from "discord.js"; +import { downloadOptions } from "ytdl-core"; +import { Readable, Duplex } from "stream"; export type FiltersName = keyof QueueFilters; -export type TrackSource = 'soundcloud' | 'youtube' | 'arbitrary'; - -export interface TrackData { - title: string; - description: string; - author: string; - url: string; - thumbnail: string; - duration: string; - views: number; - requestedBy: User; - fromPlaylist: boolean; - source?: TrackSource; - engine?: any; - live?: boolean; -} - export type QueueFilters = { bassboost?: boolean; - '8D'?: boolean; + "8D"?: boolean; vaporwave?: boolean; nightcore?: boolean; phaser?: boolean; @@ -65,19 +35,51 @@ export type QueueFilters = { fadein?: boolean; }; -export type QueryType = - | 'soundcloud_track' - | 'soundcloud_playlist' - | 'spotify_song' - | 'spotify_album' - | 'spotify_playlist' - | 'youtube_video' - | 'youtube_playlist' - | 'vimeo' - | 'facebook' - | 'reverbnation' - | 'attachment' - | 'youtube_search'; +export type TrackSource = "soundcloud" | "youtube" | "spotify" | "arbitrary"; + +export interface RawTrackData { + title: string; + description: string; + author: string; + url: string; + thumbnail: string; + duration: string; + views: number; + requestedBy: User; + fromPlaylist: boolean; + source?: TrackSource; + engine?: any; + live?: boolean; +} + +export interface TimeData { + days: number; + hours: number; + minutes: number; + seconds: number; +} + +export interface PlayerProgressbarOptions { + timecodes?: boolean; + queue?: boolean; + length?: number; + line?: string; + indicator?: string; +} + +export interface PlayerOptions { + leaveOnEnd?: boolean; + leaveOnEndCooldown?: number; + leaveOnStop?: boolean; + leaveOnEmpty?: boolean; + leaveOnEmptyCooldown?: number; + autoSelfDeaf?: boolean; + enableLive?: boolean; + ytdlDownloadOptions?: downloadOptions; + useSafeSearch?: boolean; + disableAutoRegister?: boolean; + fetchBeforeQueued?: boolean; +} export interface ExtractorModelData { title: string; @@ -90,67 +92,21 @@ export interface ExtractorModelData { url: string; version?: string; important?: boolean; + source?: TrackSource; } -export interface PlayerProgressbarOptions { - timecodes?: boolean; - queue?: boolean; - length?: number; -} - -export interface LyricsData { - title: string; - id: number; - thumbnail: string; - image: string; - url: string; - artist: { - name: string; - id: number; - url: string; - image: string; - }; - lyrics?: string; -} - -export interface PlayerStats { - uptime: number; - connections: number; - users: number; - queues: number; - extractors: number; - versions: { - ffmpeg: string; - node: string; - v8: string; - }; - system: { - arch: string; - platform: - | 'aix' - | 'android' - | 'darwin' - | 'freebsd' - | 'linux' - | 'openbsd' - | 'sunos' - | 'win32' - | 'cygwin' - | 'netbsd'; - cpu: number; - memory: { - total: string; - usage: string; - rss: string; - arrayBuffers: string; - }; - uptime: number; - }; -} - -export interface TimeData { - days: number; - hours: number; - minutes: number; - seconds: number; +export enum QueryType { + YOUTUBE = "youtube", + YOUTUBE_PLAYLIST = "youtube_playlist", + SOUNDCLOUD_TRACK = "soundcloud_track", + SOUNDCLOUD_PLAYLIST = "soundcloud_playlist", + SOUNDCLOUD = "soundcloud", + SPOTIFY_SONG = "spotify_song", + SPOTIFY_ALBUM = "spotify_album", + SPOTIFY_PLAYLIST = "spotify_playlist", + FACEBOOK = "facebook", + VIMEO = "vimeo", + ARBITRARY = "arbitrary", + REVERBNATION = "reverbnation", + YOUTUBE_SEARCH = "youtube_search" } diff --git a/src/utils/AudioFilters.ts b/src/utils/AudioFilters.ts index ff21b68..7ebf8e6 100644 --- a/src/utils/AudioFilters.ts +++ b/src/utils/AudioFilters.ts @@ -1,4 +1,4 @@ -import { FiltersName } from '../types/types'; +import { FiltersName } from "../types/types"; /** * The available audio filters @@ -34,63 +34,67 @@ import { FiltersName } from '../types/types'; */ const FilterList = { - bassboost: 'bass=g=20', - '8D': 'apulsator=hz=0.09', - vaporwave: 'aresample=48000,asetrate=48000*0.8', - nightcore: 'aresample=48000,asetrate=48000*1.25', - phaser: 'aphaser=in_gain=0.4', - tremolo: 'tremolo', - vibrato: 'vibrato=f=6.5', - reverse: 'areverse', - treble: 'treble=g=5', - normalizer: 'dynaudnorm=g=101', - surrounding: 'surround', - pulsator: 'apulsator=hz=1', - subboost: 'asubboost', - karaoke: 'stereotools=mlev=0.03', - flanger: 'flanger', - gate: 'agate', - haas: 'haas', - mcompand: 'mcompand', - mono: 'pan=mono|c0=.5*c0+.5*c1', - mstlr: 'stereotools=mode=ms>lr', - mstrr: 'stereotools=mode=ms>rr', - compressor: 'compand=points=-80/-105|-62/-80|-15.4/-15.4|0/-12|20/-7.6', - expander: 'compand=attacks=0:points=-80/-169|-54/-80|-49.5/-64.6|-41.1/-41.1|-25.8/-15|-10.8/-4.5|0/0|20/8.3', - softlimiter: 'compand=attacks=0:points=-80/-80|-12.4/-12.4|-6/-8|0/-6.8|20/-2.8', - chorus: 'chorus=0.7:0.9:55:0.4:0.25:2', - chorus2d: 'chorus=0.6:0.9:50|60:0.4|0.32:0.25|0.4:2|1.3', - chorus3d: 'chorus=0.5:0.9:50|60|40:0.4|0.32|0.3:0.25|0.4|0.3:2|2.3|1.3', - fadein: 'afade=t=in:ss=0:d=10', + bassboost: "bass=g=20", + "8D": "apulsator=hz=0.09", + vaporwave: "aresample=48000,asetrate=48000*0.8", + nightcore: "aresample=48000,asetrate=48000*1.25", + phaser: "aphaser=in_gain=0.4", + tremolo: "tremolo", + vibrato: "vibrato=f=6.5", + reverse: "areverse", + treble: "treble=g=5", + normalizer: "dynaudnorm=g=101", + surrounding: "surround", + pulsator: "apulsator=hz=1", + subboost: "asubboost", + karaoke: "stereotools=mlev=0.03", + flanger: "flanger", + gate: "agate", + haas: "haas", + mcompand: "mcompand", + mono: "pan=mono|c0=.5*c0+.5*c1", + mstlr: "stereotools=mode=ms>lr", + mstrr: "stereotools=mode=ms>rr", + compressor: "compand=points=-80/-105|-62/-80|-15.4/-15.4|0/-12|20/-7.6", + expander: "compand=attacks=0:points=-80/-169|-54/-80|-49.5/-64.6|-41.1/-41.1|-25.8/-15|-10.8/-4.5|0/0|20/8.3", + softlimiter: "compand=attacks=0:points=-80/-80|-12.4/-12.4|-6/-8|0/-6.8|20/-2.8", + chorus: "chorus=0.7:0.9:55:0.4:0.25:2", + chorus2d: "chorus=0.6:0.9:50|60:0.4|0.32:0.25|0.4:2|1.3", + chorus3d: "chorus=0.5:0.9:50|60|40:0.4|0.32|0.3:0.25|0.4|0.3:2|2.3|1.3", + fadein: "afade=t=in:ss=0:d=10", *[Symbol.iterator](): IterableIterator<{ name: FiltersName; value: string }> { for (const [k, v] of Object.entries(this)) { - if (typeof this[k as FiltersName] === 'string') yield { name: k as FiltersName, value: v as string }; + if (typeof this[k as FiltersName] === "string") yield { name: k as FiltersName, value: v as string }; } }, get names() { - return Object.keys(this).filter((p) => !['names', 'length'].includes(p) && typeof this[p as FiltersName] !== 'function'); + return Object.keys(this).filter( + (p) => !["names", "length"].includes(p) && typeof this[p as FiltersName] !== "function" + ); }, get length() { - return Object.keys(this).filter((p) => !['names', 'length'].includes(p) && typeof this[p as FiltersName] !== 'function').length; + return Object.keys(this).filter( + (p) => !["names", "length"].includes(p) && typeof this[p as FiltersName] !== "function" + ).length; }, toString() { - return `${Object.values(this).join(',')}`; + return `${Object.values(this).join(",")}`; }, create(filter?: FiltersName[]): string { if (!filter || !Array.isArray(filter)) return this.toString(); return filter - .filter((predicate) => typeof predicate === 'string') + .filter((predicate) => typeof predicate === "string") .map((m) => this[m]) - .join(','); + .join(","); }, define(filterName: string, value: string): void { - if (typeof this[filterName as FiltersName] && typeof this[filterName as FiltersName] === 'function') return; + if (typeof this[filterName as FiltersName] && typeof this[filterName as FiltersName] === "function") return; this[filterName as FiltersName] = value; }, diff --git a/src/utils/Constants.ts b/src/utils/Constants.ts index ef5eb1b..cb0ff5c 100644 --- a/src/utils/Constants.ts +++ b/src/utils/Constants.ts @@ -1,40 +1 @@ -import { PlayerOptions as DP_OPTIONS } from '../types/types'; - -export const PlayerEvents = { - BOT_DISCONNECT: 'botDisconnect', - CHANNEL_EMPTY: 'channelEmpty', - CONNECTION_CREATE: 'connectionCreate', - ERROR: 'error', - MUSIC_STOP: 'musicStop', - NO_RESULTS: 'noResults', - PLAYLIST_ADD: 'playlistAdd', - PLAYLIST_PARSE_END: 'playlistParseEnd', - PLAYLIST_PARSE_START: 'playlistParseStart', - QUEUE_CREATE: 'queueCreate', - QUEUE_END: 'queueEnd', - SEARCH_CANCEL: 'searchCancel', - SEARCH_INVALID_RESPONSE: 'searchInvalidResponse', - SEARCH_RESULTS: 'searchResults', - TRACK_ADD: 'trackAdd', - TRACK_START: 'trackStart' -}; - -export const PlayerErrorEventCodes = { - LIVE_VIDEO: 'LiveVideo', - NOT_CONNECTED: 'NotConnected', - UNABLE_TO_JOIN: 'UnableToJoin', - NOT_PLAYING: 'NotPlaying', - PARSE_ERROR: 'ParseError', - VIDEO_UNAVAILABLE: 'VideoUnavailable', - MUSIC_STARTING: 'MusicStarting' -}; - -export const PlayerOptions: DP_OPTIONS = { - leaveOnEnd: true, - leaveOnStop: true, - leaveOnEmpty: true, - leaveOnEmptyCooldown: 0, - autoSelfDeaf: true, - enableLive: false, - ytdlDownloadOptions: {} -}; +export {}; diff --git a/src/utils/PlayerError.ts b/src/utils/PlayerError.ts index c87e1f6..af8110d 100644 --- a/src/utils/PlayerError.ts +++ b/src/utils/PlayerError.ts @@ -1,7 +1,7 @@ export default class PlayerError extends Error { constructor(msg: string, name?: string) { super(); - this.name = name ?? 'PlayerError'; + this.name = name ?? "PlayerError"; this.message = msg; Error.captureStackTrace(this); } diff --git a/src/utils/QueryResolver.ts b/src/utils/QueryResolver.ts new file mode 100644 index 0000000..1e7544a --- /dev/null +++ b/src/utils/QueryResolver.ts @@ -0,0 +1,48 @@ +import { validateID, validateURL } from "ytdl-core"; +import { YouTube } from "youtube-sr"; +import { QueryType } from "../types/types"; +// @ts-ignore +import { validateURL as SoundcloudValidateURL } from "soundcloud-scraper"; + +// scary things below *sigh* +const spotifySongRegex = /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:track\/|\?uri=spotify:track:)((\w|-){22})/; +const spotifyPlaylistRegex = + /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:playlist\/|\?uri=spotify:playlist:)((\w|-){22})/; +const spotifyAlbumRegex = /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:album\/|\?uri=spotify:album:)((\w|-){22})/; +const vimeoRegex = + /(http|https)?:\/\/(www\.|player\.)?vimeo\.com\/(?:channels\/(?:\w+\/)?|groups\/([^/]*)\/videos\/|video\/|)(\d+)(?:|\/\?)/; +const facebookRegex = /(https?:\/\/)(www\.|m\.)?(facebook|fb).com\/.*\/videos\/.*/; +const reverbnationRegex = /https:\/\/(www.)?reverbnation.com\/(.+)\/song\/(.+)/; +const attachmentRegex = + /^(?:(?:https?|ftp):\/\/)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?$/; +// scary things above *sigh* + +class QueryResolver { + + static resolve(query: string): QueryType { + if (SoundcloudValidateURL(query, "track")) return QueryType.SOUNDCLOUD_TRACK; + if (SoundcloudValidateURL(query, "playlist") || query.includes("/sets/")) return QueryType.SOUNDCLOUD_PLAYLIST; + if (validateID(query) || validateURL(query)) return QueryType.YOUTUBE; + if (YouTube.validate(query, "PLAYLIST_ID")) return QueryType.YOUTUBE_PLAYLIST; + if (spotifySongRegex.test(query)) return QueryType.SPOTIFY_SONG; + if (spotifyPlaylistRegex.test(query)) return QueryType.SPOTIFY_PLAYLIST; + if (spotifyAlbumRegex.test(query)) return QueryType.SPOTIFY_ALBUM; + if (vimeoRegex.test(query)) return QueryType.VIMEO; + if (facebookRegex.test(query)) return QueryType.FACEBOOK; + if (reverbnationRegex.test(query)) return QueryType.REVERBNATION; + if (attachmentRegex.test(query)) return QueryType.ARBITRARY; + + return QueryType.YOUTUBE_SEARCH; + } + + static getVimeoID(query: string): string { + return QueryResolver.resolve(query) === QueryType.VIMEO + ? query + .split("/") + .filter((x) => !!x) + .pop() + : null; + } +} + +export { QueryResolver }; diff --git a/src/utils/Util.ts b/src/utils/Util.ts index 7826f5d..cb0ff5c 100644 --- a/src/utils/Util.ts +++ b/src/utils/Util.ts @@ -1,231 +1 @@ -import { QueryType, TimeData } from '../types/types'; -import { FFmpeg } from 'prism-media'; -import YouTube from 'youtube-sr'; -import { Track } from '../Structures/Track'; -// @ts-ignore -import { validateURL as SoundcloudValidateURL } from 'soundcloud-scraper'; -import { VoiceChannel } from 'discord.js'; - -const spotifySongRegex = /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:track\/|\?uri=spotify:track:)((\w|-){22})/; -const spotifyPlaylistRegex = /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:playlist\/|\?uri=spotify:playlist:)((\w|-){22})/; -const spotifyAlbumRegex = /https?:\/\/(?:embed\.|open\.)(?:spotify\.com\/)(?:album\/|\?uri=spotify:album:)((\w|-){22})/; -const vimeoRegex = /(http|https)?:\/\/(www\.|player\.)?vimeo\.com\/(?:channels\/(?:\w+\/)?|groups\/([^/]*)\/videos\/|video\/|)(\d+)(?:|\/\?)/; -const facebookRegex = /(https?:\/\/)(www\.|m\.)?(facebook|fb).com\/.*\/videos\/.*/; -const reverbnationRegex = /https:\/\/(www.)?reverbnation.com\/(.+)\/song\/(.+)/; -const attachmentRegex = /^(?:(?:https?|ftp):\/\/)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?$/; - -export class Util { - /** - * Static Player Util class - */ - constructor() { - throw new Error(`The ${this.constructor.name} class is static and cannot be instantiated!`); - } - - /** - * Checks FFmpeg Version - * @param {Boolean} [force] If it should forcefully get the version - * @returns {String} - */ - static getFFmpegVersion(force?: boolean): string { - try { - const info = FFmpeg.getInfo(Boolean(force)); - - return info.version; - } catch { - return null; - } - } - - /** - * Checks FFmpeg - * @param {Boolean} [force] If it should forcefully get the version - * @returns {Boolean} - */ - static checkFFmpeg(force?: boolean): boolean { - const version = Util.getFFmpegVersion(force); - return version === null ? false : true; - } - - /** - * Alerts if FFmpeg is not available - */ - static alertFFmpeg(): void { - const hasFFmpeg = Util.checkFFmpeg(); - - if (!hasFFmpeg) - console.warn( - '[Discord Player] FFmpeg/Avconv not found! Install via "npm install ffmpeg-static" or download from https://ffmpeg.org/download.html' - ); - } - - /** - * Resolves query type - * @param {String} query The query - * @returns {QueryType} - */ - static getQueryType(query: string): QueryType { - if (SoundcloudValidateURL(query) && !query.includes('/sets/')) return 'soundcloud_track'; - if (SoundcloudValidateURL(query) && query.includes('/sets/')) return 'soundcloud_playlist'; - if (spotifySongRegex.test(query)) return 'spotify_song'; - if (spotifyAlbumRegex.test(query)) return 'spotify_album'; - if (spotifyPlaylistRegex.test(query)) return 'spotify_playlist'; - if (YouTube.validate(query, 'PLAYLIST')) return 'youtube_playlist'; - if (YouTube.validate(query, 'VIDEO')) return 'youtube_video'; - if (vimeoRegex.test(query)) return 'vimeo'; - if (facebookRegex.test(query)) return 'facebook'; - if (reverbnationRegex.test(query)) return 'reverbnation'; - if (Util.isURL(query)) return 'attachment'; - - return 'youtube_search'; - } - - /** - * Checks if the given string is url - * @param {String} str URL to check - * @returns {Boolean} - */ - static isURL(str: string): boolean { - return str.length < 2083 && attachmentRegex.test(str); - } - - /** - * Returns Vimeo ID - * @param {String} query Vimeo link - * @returns {String} - */ - static getVimeoID(query: string): string { - return Util.getQueryType(query) === 'vimeo' - ? query - .split('/') - .filter((x) => !!x) - .pop() - : null; - } - - /** - * Parses ms time - * @param {Number} milliseconds Time to parse - * @returns {TimeData} - */ - static parseMS(milliseconds: number): TimeData { - const roundTowardsZero = milliseconds > 0 ? Math.floor : Math.ceil; - - return { - days: roundTowardsZero(milliseconds / 86400000), - hours: roundTowardsZero(milliseconds / 3600000) % 24, - minutes: roundTowardsZero(milliseconds / 60000) % 60, - seconds: roundTowardsZero(milliseconds / 1000) % 60 - }; - } - - /** - * Creates simple duration string - * @param {object} durObj Duration object - * @returns {String} - */ - static durationString(durObj: object): string { - return Object.values(durObj) - .map((m) => (isNaN(m) ? 0 : m)) - .join(':'); - } - - /** - * Makes youtube searches - * @param {String} query The query - * @param {any} options Options - * @returns {Promise} - */ - static ytSearch(query: string, options?: any): Promise { - return new Promise(async (resolve) => { - await YouTube.search(query, { - type: 'video', - safeSearch: Boolean(options?.player.options.useSafeSearch), - limit: options.limit ?? 10 - }) - .then((results) => { - resolve( - results.map( - (r) => - new Track(options?.player, { - title: r.title, - description: r.description, - author: r.channel.name, - url: r.url, - thumbnail: r.thumbnail.displayThumbnailURL(), - duration: Util.buildTimeCode(Util.parseMS(r.duration)), - views: r.views, - requestedBy: options?.user, - fromPlaylist: Boolean(options?.pl), - source: 'youtube' - }) - ) - ); - }) - .catch(() => resolve([])); - }); - } - - /** - * Checks if this system is running in replit.com - * @returns {Boolean} - */ - static isRepl(): boolean { - if ('DP_REPL_NOCHECK' in process.env) return false; - - const REPL_IT_PROPS = [ - 'REPL_SLUG', - 'REPL_OWNER', - 'REPL_IMAGE', - 'REPL_PUBKEYS', - 'REPL_ID', - 'REPL_LANGUAGE', - 'REPLIT_DB_URL' - ]; - - for (const prop of REPL_IT_PROPS) if (prop in process.env) return true; - - return false; - } - - /** - * Checks if the given voice channel is empty - * @param {DiscordVoiceChannel} channel The voice channel - * @returns {Boolean} - */ - static isVoiceEmpty(channel: VoiceChannel): boolean { - return channel.members.filter((member) => !member.user.bot).size === 0; - } - - /** - * Builds time code - * @param {object} data The data to build time code from - * @returns {String} - */ - static buildTimeCode(data: any): string { - const items = Object.keys(data); - const required = ['days', 'hours', 'minutes', 'seconds']; - - const parsed = items.filter((x) => required.includes(x)).map((m) => (data[m] > 0 ? data[m] : '')); - const final = parsed - .filter((x) => !!x) - .map((x) => x.toString().padStart(2, '0')) - .join(':'); - return final.length <= 3 ? `0:${final.padStart(2, '0') || 0}` : final; - } - - /** - * Manage CJS require - * @param {String} id id to require - * @returns {any} - */ - static require(id: string): any { - try { - return require(id); - } catch { - return null; - } - } -} - -export default Util; +export {}; diff --git a/yarn.lock b/yarn.lock index 8b2d9c3..5cf7134 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,9 +3,9 @@ "@babel/cli@^7.13.16": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.13.16.tgz#9d372e943ced0cc291f068204a9b010fd9cfadbc" - integrity sha512-cL9tllhqvsQ6r1+d9Invf7nNXg/3BlfL1vvvL/AdH9fZ2l5j0CeBcoq6UjsqHpvyN1v5nXSZgqJZoGeK+ZOAbw== + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.14.3.tgz#9f6c8aee12e8660df879610f19a8010958b26a6f" + integrity sha512-zU4JLvwk32ay1lhhyGfqiRUSPoltVDjhYkA3aQq8+Yby9z30s/EsFw1EPOHxWG9YZo2pAGfgdRNeHZQAYU5m9A== dependencies: commander "^4.0.1" convert-source-map "^1.1.0" @@ -25,25 +25,25 @@ dependencies: "@babel/highlight" "^7.12.13" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.13.8": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.15.tgz#7e8eea42d0b64fda2b375b22d06c605222e848f4" - integrity sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA== +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.4.tgz#45720fe0cecf3fd42019e1d12cc3d27fadc98d58" + integrity sha512-i2wXrWQNkH6JplJQGn3Rd2I4Pij8GdHkXwHMxm+zV5YG/Jci+bCNrWZEWC4o+umiDkRrRs4dVzH3X4GP7vyjQQ== "@babel/core@^7.13.16": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.16.tgz#7756ab24396cc9675f1c3fcd5b79fcce192ea96a" - integrity sha512-sXHpixBiWWFti0AV2Zq7avpTasr6sIAu7Y396c608541qAU2ui4a193m0KSQmfPSKFZLnQ3cvlKDOm3XkuXm3Q== + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.3.tgz#5395e30405f0776067fbd9cf0884f15bfb770a38" + integrity sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg== dependencies: "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.13.16" + "@babel/generator" "^7.14.3" "@babel/helper-compilation-targets" "^7.13.16" - "@babel/helper-module-transforms" "^7.13.14" - "@babel/helpers" "^7.13.16" - "@babel/parser" "^7.13.16" + "@babel/helper-module-transforms" "^7.14.2" + "@babel/helpers" "^7.14.0" + "@babel/parser" "^7.14.3" "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.15" - "@babel/types" "^7.13.16" + "@babel/traverse" "^7.14.2" + "@babel/types" "^7.14.2" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -51,12 +51,12 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.13.16": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.16.tgz#0befc287031a201d84cdfc173b46b320ae472d14" - integrity sha512-grBBR75UnKOcUWMp8WoDxNsWCFl//XCK6HWTrBQKTr5SV9f5g0pNOjdyzi/DTBv12S9GnYPInIXQBTky7OXEMg== +"@babel/generator@^7.14.2", "@babel/generator@^7.14.3": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.3.tgz#0c2652d91f7bddab7cccc6ba8157e4f40dcedb91" + integrity sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA== dependencies: - "@babel/types" "^7.13.16" + "@babel/types" "^7.14.2" jsesc "^2.5.1" source-map "^0.5.0" @@ -75,39 +75,40 @@ "@babel/helper-explode-assignable-expression" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.13", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.13.8": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" - integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA== +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.4.tgz#33ebd0ffc34248051ee2089350a929ab02f2a516" + integrity sha512-JgdzOYZ/qGaKTVkn5qEDV/SXAh8KcyUVkCoSWGN8T3bwrgd6m+/dJa2kVGi6RJYJgEYPBdZ84BZp9dUjNWkBaA== dependencies: - "@babel/compat-data" "^7.13.15" + "@babel/compat-data" "^7.14.4" "@babel/helper-validator-option" "^7.12.17" - browserslist "^4.14.5" + browserslist "^4.16.6" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.13.0": - version "7.13.11" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz#30d30a005bca2c953f5653fc25091a492177f4f6" - integrity sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw== +"@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.14.0", "@babel/helper-create-class-features-plugin@^7.14.3", "@babel/helper-create-class-features-plugin@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.4.tgz#abf888d836a441abee783c75229279748705dc42" + integrity sha512-idr3pthFlDCpV+p/rMgGLGYIVtazeatrSOQk8YzO2pAepIjQhCN3myeihVg58ax2bbbGK9PUE1reFi7axOYIOw== dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-member-expression-to-functions" "^7.13.0" + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-function-name" "^7.14.2" + "@babel/helper-member-expression-to-functions" "^7.13.12" "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-replace-supers" "^7.13.0" + "@babel/helper-replace-supers" "^7.14.4" "@babel/helper-split-export-declaration" "^7.12.13" "@babel/helper-create-regexp-features-plugin@^7.12.13": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7" - integrity sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg== + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.3.tgz#149aa6d78c016e318c43e2409a0ae9c136a86688" + integrity sha512-JIB2+XJrb7v3zceV2XzDhGIB902CmKGSpSl4q2C6agU9SNLG/2V1RtFRGPG1Ajh9STj3+q6zJMOC+N/pp2P9DA== dependencies: "@babel/helper-annotate-as-pure" "^7.12.13" regexpu-core "^4.7.1" -"@babel/helper-define-polyfill-provider@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz#a640051772045fedaaecc6f0c6c69f02bdd34bf1" - integrity sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw== +"@babel/helper-define-polyfill-provider@^0.2.2": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6" + integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew== dependencies: "@babel/helper-compilation-targets" "^7.13.0" "@babel/helper-module-imports" "^7.12.13" @@ -125,14 +126,14 @@ dependencies: "@babel/types" "^7.13.0" -"@babel/helper-function-name@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" - integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== +"@babel/helper-function-name@^7.12.13", "@babel/helper-function-name@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz#397688b590760b6ef7725b5f0860c82427ebaac2" + integrity sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ== dependencies: "@babel/helper-get-function-arity" "^7.12.13" "@babel/template" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/types" "^7.14.2" "@babel/helper-get-function-arity@^7.12.13": version "7.12.13" @@ -149,7 +150,7 @@ "@babel/traverse" "^7.13.15" "@babel/types" "^7.13.16" -"@babel/helper-member-expression-to-functions@^7.13.0", "@babel/helper-member-expression-to-functions@^7.13.12": +"@babel/helper-member-expression-to-functions@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw== @@ -163,19 +164,19 @@ dependencies: "@babel/types" "^7.13.12" -"@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.13.14": - version "7.13.14" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz#e600652ba48ccb1641775413cb32cfa4e8b495ef" - integrity sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g== +"@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.14.0", "@babel/helper-module-transforms@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz#ac1cc30ee47b945e3e0c4db12fa0c5389509dfe5" + integrity sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA== dependencies: "@babel/helper-module-imports" "^7.13.12" "@babel/helper-replace-supers" "^7.13.12" "@babel/helper-simple-access" "^7.13.12" "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-validator-identifier" "^7.14.0" "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.13" - "@babel/types" "^7.13.14" + "@babel/traverse" "^7.14.2" + "@babel/types" "^7.14.2" "@babel/helper-optimise-call-expression@^7.12.13": version "7.12.13" @@ -198,17 +199,17 @@ "@babel/helper-wrap-function" "^7.13.0" "@babel/types" "^7.13.0" -"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.0", "@babel/helper-replace-supers@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804" - integrity sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw== +"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.12", "@babel/helper-replace-supers@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.4.tgz#b2ab16875deecfff3ddfcd539bc315f72998d836" + integrity sha512-zZ7uHCWlxfEAAOVDYQpEf/uyi1dmeC7fX4nCf2iz9drnCwi1zvwXL3HwWWNXUQEJ1k23yVn3VbddiI9iJEXaTQ== dependencies: "@babel/helper-member-expression-to-functions" "^7.13.12" "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.12" + "@babel/traverse" "^7.14.2" + "@babel/types" "^7.14.4" -"@babel/helper-simple-access@^7.12.13", "@babel/helper-simple-access@^7.13.12": +"@babel/helper-simple-access@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA== @@ -229,10 +230,10 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-validator-identifier@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" - integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== +"@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" + integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== "@babel/helper-validator-option@^7.12.17": version "7.12.17" @@ -249,28 +250,28 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.0" -"@babel/helpers@^7.13.16": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.17.tgz#b497c7a00e9719d5b613b8982bda6ed3ee94caf6" - integrity sha512-Eal4Gce4kGijo1/TGJdqp3WuhllaMLSrW6XcL0ulyUAQOuxHcCafZE8KHg9857gcTehsm/v7RcOx2+jp0Ryjsg== +"@babel/helpers@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62" + integrity sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg== dependencies: "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.17" - "@babel/types" "^7.13.17" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.14.0" "@babel/highlight@^7.12.13": - version "7.13.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" - integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" + integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== dependencies: - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-validator-identifier" "^7.14.0" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.12.13", "@babel/parser@^7.13.16", "@babel/parser@^7.9.4": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.16.tgz#0f18179b0448e6939b1f3f5c4c355a3a9bcdfd37" - integrity sha512-6bAg36mCwuqLO0hbR+z7PHuqWiCeP7Dzg73OpQwsAB1Eb8HnGEz5xYBzCfbu+YjoaJsJs+qheDxVAuqbt3ILEw== +"@babel/parser@^7.12.13", "@babel/parser@^7.14.2", "@babel/parser@^7.14.3", "@babel/parser@^7.9.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.4.tgz#a5c560d6db6cd8e6ed342368dea8039232cbab18" + integrity sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA== "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": version "7.13.12" @@ -281,10 +282,10 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-proposal-optional-chaining" "^7.13.12" -"@babel/plugin-proposal-async-generator-functions@^7.13.15": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz#80e549df273a3b3050431b148c892491df1bcc5b" - integrity sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA== +"@babel/plugin-proposal-async-generator-functions@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.2.tgz#3a2085abbf5d5f962d480dbc81347385ed62eb1e" + integrity sha512-b1AM4F6fwck4N8ItZ/AtC4FP/cqZqmKRQ4FaTDutwSYyjuhtvsGEMLK4N/ztV/ImP40BjIDyMgBQAeAMsQYVFQ== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-remap-async-to-generator" "^7.13.0" @@ -298,77 +299,86 @@ "@babel/helper-create-class-features-plugin" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-proposal-dynamic-import@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz#876a1f6966e1dec332e8c9451afda3bebcdf2e1d" - integrity sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ== +"@babel/plugin-proposal-class-static-block@^7.14.3": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.3.tgz#5a527e2cae4a4753119c3a3e7f64ecae8ccf1360" + integrity sha512-HEjzp5q+lWSjAgJtSluFDrGGosmwTgKwCXdDQZvhKsRlwv3YdkUEqxNrrjesJd+B9E9zvr1PVPVBvhYZ9msjvQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.14.3" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-class-static-block" "^7.12.13" + +"@babel/plugin-proposal-dynamic-import@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.2.tgz#01ebabd7c381cff231fa43e302939a9de5be9d9f" + integrity sha512-oxVQZIWFh91vuNEMKltqNsKLFWkOIyJc95k2Gv9lWVyDfPUQGSSlbDEgWuJUU1afGE9WwlzpucMZ3yDRHIItkA== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" - integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw== +"@babel/plugin-proposal-export-namespace-from@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.2.tgz#62542f94aa9ce8f6dba79eec698af22112253791" + integrity sha512-sRxW3z3Zp3pFfLAgVEvzTFutTXax837oOatUIvSG9o5gRj9mKwm3br1Se5f4QalTQs9x4AzlA/HrCWbQIHASUQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz#bf1fb362547075afda3634ed31571c5901afef7b" - integrity sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q== +"@babel/plugin-proposal-json-strings@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.2.tgz#830b4e2426a782e8b2878fbfe2cba85b70cbf98c" + integrity sha512-w2DtsfXBBJddJacXMBhElGEYqCZQqN99Se1qeYn8DVLB33owlrlLftIbMzn5nz1OITfDVknXF433tBrLEAOEjA== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz#93fa78d63857c40ce3c8c3315220fd00bfbb4e1a" - integrity sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A== +"@babel/plugin-proposal-logical-assignment-operators@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.2.tgz#222348c080a1678e0e74ea63fe76f275882d1fd7" + integrity sha512-1JAZtUrqYyGsS7IDmFeaem+/LJqujfLZ2weLR9ugB0ufUPjzf8cguyVT1g5im7f7RXxuLq1xUxEzvm68uYRtGg== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz#3730a31dafd3c10d8ccd10648ed80a2ac5472ef3" - integrity sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.2.tgz#425b11dc62fc26939a2ab42cbba680bdf5734546" + integrity sha512-ebR0zU9OvI2N4qiAC38KIAK75KItpIPTpAtd2r4OZmMFeKbKJpUFLYP2EuDut82+BmYi8sz42B+TfTptJ9iG5Q== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" - integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w== +"@babel/plugin-proposal-numeric-separator@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.2.tgz#82b4cc06571143faf50626104b335dd71baa4f9e" + integrity sha512-DcTQY9syxu9BpU3Uo94fjCB3LN9/hgPS8oUL7KrSW3bA2ePrKZZPJcc5y0hoJAM9dft3pGfErtEUvxXQcfLxUg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz#5d210a4d727d6ce3b18f9de82cc99a3964eed60a" - integrity sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g== +"@babel/plugin-proposal-object-rest-spread@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.4.tgz#0e2b4de419915dc0b409378e829412e2031777c4" + integrity sha512-AYosOWBlyyXEagrPRfLJ1enStufsr7D1+ddpj8OLi9k7B6+NdZ0t/9V7Fh+wJ4g2Jol8z2JkgczYqtWrZd4vbA== dependencies: - "@babel/compat-data" "^7.13.8" - "@babel/helper-compilation-targets" "^7.13.8" + "@babel/compat-data" "^7.14.4" + "@babel/helper-compilation-targets" "^7.14.4" "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.13.0" + "@babel/plugin-transform-parameters" "^7.14.2" -"@babel/plugin-proposal-optional-catch-binding@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz#3ad6bd5901506ea996fc31bdcf3ccfa2bed71107" - integrity sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA== +"@babel/plugin-proposal-optional-catch-binding@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.2.tgz#150d4e58e525b16a9a1431bd5326c4eed870d717" + integrity sha512-XtkJsmJtBaUbOxZsNk0Fvrv8eiqgneug0A6aqLFZ4TSkar2L5dSXWcnUKHgmjJt49pyB/6ZHvkr3dPgl9MOWRQ== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz#ba9feb601d422e0adea6760c2bd6bbb7bfec4866" - integrity sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ== +"@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.2.tgz#df8171a8b9c43ebf4c1dabe6311b432d83e1b34e" + integrity sha512-qQByMRPwMZJainfig10BoaDldx/+VDtNcrA7qdNaEOAj6VXud+gfrkA8j4CRAU5HjnWREXqIpSpH30qZX1xivA== dependencies: "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" @@ -382,6 +392,16 @@ "@babel/helper-create-class-features-plugin" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" +"@babel/plugin-proposal-private-property-in-object@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.0.tgz#b1a1f2030586b9d3489cc26179d2eb5883277636" + integrity sha512-59ANdmEwwRUkLjB7CRtwJxxwtjESw+X2IePItA+RGQh+oy5RmpCh/EvVVvh5XQc3yxsm5gtv0+i9oBZhaDNVTg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-create-class-features-plugin" "^7.14.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-private-property-in-object" "^7.14.0" + "@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" @@ -404,6 +424,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-class-static-block@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.12.13.tgz#8e3d674b0613e67975ceac2776c97b60cafc5c9c" + integrity sha512-ZmKQ0ZXR0nYpHZIIuj9zE7oIqCx2hw9TKi+lIo73NNrMPAZGHfS92/VRV0ZmPj6H2ffBgyFHXvJ5NYsNeEaP2A== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" @@ -467,6 +494,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-private-property-in-object@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.0.tgz#762a4babec61176fec6c88480dec40372b140c0b" + integrity sha512-bda3xF8wGl5/5btF794utNOL0Jw+9jE5C1sLZcoK7c4uonE/y3iQiyG+KbkF3WBV/paX58VCpjhxLPkdj5Fe4w== + dependencies: + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-top-level-await@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" @@ -504,23 +538,23 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-block-scoping@^7.12.13": - version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.13.16.tgz#a9c0f10794855c63b1d629914c7dcfeddd185892" - integrity sha512-ad3PHUxGnfWF4Efd3qFuznEtZKoBp0spS+DgqzVzRPV7urEBvPLue3y2j80w4Jf2YLzZHj8TOv/Lmvdmh3b2xg== +"@babel/plugin-transform-block-scoping@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.4.tgz#caf140b0b2e2462c509553d140e6d0abefb61ed8" + integrity sha512-5KdpkGxsZlTk+fPleDtGKsA+pon28+ptYmMO8GBSa5fHERCJWAzj50uAfCKBqq42HO+Zot6JF1x37CRprwmN4g== dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-classes@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz#0265155075c42918bf4d3a4053134176ad9b533b" - integrity sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g== +"@babel/plugin-transform-classes@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.4.tgz#a83c15503fc71a0f99e876fdce7dadbc6575ec3a" + integrity sha512-p73t31SIj6y94RDVX57rafVjttNr8MvKEgs5YFatNB/xC68zM3pyosuOEcQmYsYlyQaGY9R7rAULVRcat5FKJQ== dependencies: "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-function-name" "^7.12.13" + "@babel/helper-function-name" "^7.14.2" "@babel/helper-optimise-call-expression" "^7.12.13" "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-replace-supers" "^7.13.0" + "@babel/helper-replace-supers" "^7.14.4" "@babel/helper-split-export-declaration" "^7.12.13" globals "^11.1.0" @@ -531,10 +565,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-destructuring@^7.13.0": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz#678d96576638c19d5b36b332504d3fd6e06dea27" - integrity sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA== +"@babel/plugin-transform-destructuring@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.4.tgz#acbec502e9951f30f4441eaca1d2f29efade59ed" + integrity sha512-JyywKreTCGTUsL1OKu1A3ms/R1sTP0WxbpXlALeGzF53eB3bxtNkYdMj9SDgK7g6ImPy76J5oYYKoTtQImlhQA== dependencies: "@babel/helper-plugin-utils" "^7.13.0" @@ -590,23 +624,23 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-modules-amd@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz#19f511d60e3d8753cc5a6d4e775d3a5184866cc3" - integrity sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ== +"@babel/plugin-transform-modules-amd@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.2.tgz#6622806fe1a7c07a1388444222ef9535f2ca17b0" + integrity sha512-hPC6XBswt8P3G2D1tSV2HzdKvkqOpmbyoy+g73JG0qlF/qx2y3KaMmXb1fLrpmWGLZYA0ojCvaHdzFWjlmV+Pw== dependencies: - "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-module-transforms" "^7.14.2" "@babel/helper-plugin-utils" "^7.13.0" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz#7b01ad7c2dcf2275b06fa1781e00d13d420b3e1b" - integrity sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw== +"@babel/plugin-transform-modules-commonjs@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz#52bc199cb581e0992edba0f0f80356467587f161" + integrity sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ== dependencies: - "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-module-transforms" "^7.14.0" "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-simple-access" "^7.12.13" + "@babel/helper-simple-access" "^7.13.12" babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-systemjs@^7.13.8": @@ -620,12 +654,12 @@ "@babel/helper-validator-identifier" "^7.12.11" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz#8a3d96a97d199705b9fd021580082af81c06e70b" - integrity sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw== +"@babel/plugin-transform-modules-umd@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.0.tgz#2f8179d1bbc9263665ce4a65f305526b2ea8ac34" + integrity sha512-nPZdnWtXXeY7I87UZr9VlsWme3Y0cfFFE41Wbxz4bbaexAjNMInXPFUpRRUJ8NoMm0Cw+zxbqjdPmLhcjfazMw== dependencies: - "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-module-transforms" "^7.14.0" "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": @@ -650,10 +684,10 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/helper-replace-supers" "^7.12.13" -"@babel/plugin-transform-parameters@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz#8fa7603e3097f9c0b7ca1a4821bc2fb52e9e5007" - integrity sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw== +"@babel/plugin-transform-parameters@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.2.tgz#e4290f72e0e9e831000d066427c4667098decc31" + integrity sha512-NxoVmA3APNCC1JdMXkdYXuQS+EMdqy0vIwyDHeKHiJKRxmp1qGSdb0JLEIoPRhkx6H/8Qi3RJ3uqOCYw8giy9A== dependencies: "@babel/helper-plugin-utils" "^7.13.0" @@ -715,11 +749,11 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-transform-typescript@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz#4a498e1f3600342d2a9e61f60131018f55774853" - integrity sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ== + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.4.tgz#1c48829fa6d5f2de646060cd08abb6cda4b521a7" + integrity sha512-WYdcGNEO7mCCZ2XzRlxwGj3PgeAr50ifkofOUC/+IN/GzKLB+biDPVBUAQN2C/dVZTvEXCp80kfQ1FFZPrwykQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.0" + "@babel/helper-create-class-features-plugin" "^7.14.4" "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-typescript" "^7.12.13" @@ -739,30 +773,33 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/preset-env@^7.13.15": - version "7.13.15" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.13.15.tgz#c8a6eb584f96ecba183d3d414a83553a599f478f" - integrity sha512-D4JAPMXcxk69PKe81jRJ21/fP/uYdcTZ3hJDF5QX2HSI9bBxxYw/dumdR6dGumhjxlprHPE4XWoPaqzZUVy2MA== + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.4.tgz#73fc3228c59727e5e974319156f304f0d6685a2d" + integrity sha512-GwMMsuAnDtULyOtuxHhzzuSRxFeP0aR/LNzrHRzP8y6AgDNgqnrfCCBm/1cRdTU75tRs28Eh76poHLcg9VF0LA== dependencies: - "@babel/compat-data" "^7.13.15" - "@babel/helper-compilation-targets" "^7.13.13" + "@babel/compat-data" "^7.14.4" + "@babel/helper-compilation-targets" "^7.14.4" "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-validator-option" "^7.12.17" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.13.12" - "@babel/plugin-proposal-async-generator-functions" "^7.13.15" + "@babel/plugin-proposal-async-generator-functions" "^7.14.2" "@babel/plugin-proposal-class-properties" "^7.13.0" - "@babel/plugin-proposal-dynamic-import" "^7.13.8" - "@babel/plugin-proposal-export-namespace-from" "^7.12.13" - "@babel/plugin-proposal-json-strings" "^7.13.8" - "@babel/plugin-proposal-logical-assignment-operators" "^7.13.8" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" - "@babel/plugin-proposal-numeric-separator" "^7.12.13" - "@babel/plugin-proposal-object-rest-spread" "^7.13.8" - "@babel/plugin-proposal-optional-catch-binding" "^7.13.8" - "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/plugin-proposal-class-static-block" "^7.14.3" + "@babel/plugin-proposal-dynamic-import" "^7.14.2" + "@babel/plugin-proposal-export-namespace-from" "^7.14.2" + "@babel/plugin-proposal-json-strings" "^7.14.2" + "@babel/plugin-proposal-logical-assignment-operators" "^7.14.2" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.2" + "@babel/plugin-proposal-numeric-separator" "^7.14.2" + "@babel/plugin-proposal-object-rest-spread" "^7.14.4" + "@babel/plugin-proposal-optional-catch-binding" "^7.14.2" + "@babel/plugin-proposal-optional-chaining" "^7.14.2" "@babel/plugin-proposal-private-methods" "^7.13.0" + "@babel/plugin-proposal-private-property-in-object" "^7.14.0" "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.12.13" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.3" @@ -772,14 +809,15 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.0" "@babel/plugin-syntax-top-level-await" "^7.12.13" "@babel/plugin-transform-arrow-functions" "^7.13.0" "@babel/plugin-transform-async-to-generator" "^7.13.0" "@babel/plugin-transform-block-scoped-functions" "^7.12.13" - "@babel/plugin-transform-block-scoping" "^7.12.13" - "@babel/plugin-transform-classes" "^7.13.0" + "@babel/plugin-transform-block-scoping" "^7.14.4" + "@babel/plugin-transform-classes" "^7.14.4" "@babel/plugin-transform-computed-properties" "^7.13.0" - "@babel/plugin-transform-destructuring" "^7.13.0" + "@babel/plugin-transform-destructuring" "^7.14.4" "@babel/plugin-transform-dotall-regex" "^7.12.13" "@babel/plugin-transform-duplicate-keys" "^7.12.13" "@babel/plugin-transform-exponentiation-operator" "^7.12.13" @@ -787,14 +825,14 @@ "@babel/plugin-transform-function-name" "^7.12.13" "@babel/plugin-transform-literals" "^7.12.13" "@babel/plugin-transform-member-expression-literals" "^7.12.13" - "@babel/plugin-transform-modules-amd" "^7.13.0" - "@babel/plugin-transform-modules-commonjs" "^7.13.8" + "@babel/plugin-transform-modules-amd" "^7.14.2" + "@babel/plugin-transform-modules-commonjs" "^7.14.0" "@babel/plugin-transform-modules-systemjs" "^7.13.8" - "@babel/plugin-transform-modules-umd" "^7.13.0" + "@babel/plugin-transform-modules-umd" "^7.14.0" "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" "@babel/plugin-transform-new-target" "^7.12.13" "@babel/plugin-transform-object-super" "^7.12.13" - "@babel/plugin-transform-parameters" "^7.13.0" + "@babel/plugin-transform-parameters" "^7.14.2" "@babel/plugin-transform-property-literals" "^7.12.13" "@babel/plugin-transform-regenerator" "^7.13.15" "@babel/plugin-transform-reserved-words" "^7.12.13" @@ -806,7 +844,7 @@ "@babel/plugin-transform-unicode-escapes" "^7.12.13" "@babel/plugin-transform-unicode-regex" "^7.12.13" "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.13.14" + "@babel/types" "^7.14.4" babel-plugin-polyfill-corejs2 "^0.2.0" babel-plugin-polyfill-corejs3 "^0.2.0" babel-plugin-polyfill-regenerator "^0.2.0" @@ -834,9 +872,9 @@ "@babel/plugin-transform-typescript" "^7.13.0" "@babel/runtime@^7.8.4": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.17.tgz#8966d1fc9593bf848602f0662d6b4d0069e3a7ec" - integrity sha512-NCdgJEelPTSh+FEFylhnP1ylq848l1z9t9N0j1Lfbcw0+KXGjsTvUmkxy+voLLXB5SOKMbLLx4jxYliGrYQseA== + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6" + integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA== dependencies: regenerator-runtime "^0.13.4" @@ -849,32 +887,32 @@ "@babel/parser" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/traverse@^7.13.0", "@babel/traverse@^7.13.13", "@babel/traverse@^7.13.15", "@babel/traverse@^7.13.17": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.17.tgz#c85415e0c7d50ac053d758baec98b28b2ecfeea3" - integrity sha512-BMnZn0R+X6ayqm3C3To7o1j7Q020gWdqdyP50KEoVqaCO2c/Im7sYZSmVgvefp8TTMQ+9CtwuBp0Z1CZ8V3Pvg== +"@babel/traverse@^7.13.0", "@babel/traverse@^7.13.15", "@babel/traverse@^7.14.0", "@babel/traverse@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.2.tgz#9201a8d912723a831c2679c7ebbf2fe1416d765b" + integrity sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA== dependencies: "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.13.16" - "@babel/helper-function-name" "^7.12.13" + "@babel/generator" "^7.14.2" + "@babel/helper-function-name" "^7.14.2" "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.13.16" - "@babel/types" "^7.13.17" + "@babel/parser" "^7.14.2" + "@babel/types" "^7.14.2" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.14", "@babel/types@^7.13.16", "@babel/types@^7.13.17", "@babel/types@^7.4.4": - version "7.13.17" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.17.tgz#48010a115c9fba7588b4437dd68c9469012b38b4" - integrity sha512-RawydLgxbOPDlTLJNtoIypwdmAy//uQIzlKt2+iBiJaRlVuI6QLUxVAyWGNfOzp8Yu4L4lLIacoCyTNtpb4wiA== +"@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.16", "@babel/types@^7.14.0", "@babel/types@^7.14.2", "@babel/types@^7.14.4", "@babel/types@^7.4.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.4.tgz#bfd6980108168593b38b3eb48a24aa026b919bc0" + integrity sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw== dependencies: - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-validator-identifier" "^7.14.0" to-fast-properties "^2.0.0" "@discord-player/extractor@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@discord-player/extractor/-/extractor-2.0.0.tgz#3879e51d64b72d4dcee9338bdece5251d006c746" - integrity sha512-qNyF0dkLNRYvtVtLLO022RV8DzToCPJqbuAOqSWCSdkXiKSGoqTdKcZI9I/Lb87mchYuuakOXyPRvRwkAruX6w== + version "2.0.2" + resolved "https://registry.yarnpkg.com/@discord-player/extractor/-/extractor-2.0.2.tgz#deb505bf66ed8749ea6eb674e8d53d2feeac0b41" + integrity sha512-Vexx0Fj+x3x5g0ZX7AnFu4SrkFHh4xyg+YGJTAcgF1L7b6CRi10/dH7ejnDTvhMLUG/u+a+TClh4as9PnACNDQ== dependencies: genius-lyrics "^4.2.7" jsdom "^16.5.2" @@ -918,6 +956,17 @@ "@discordjs/node-pre-gyp" "^0.3.2" node-addon-api "^3.1.0" +"@discordjs/voice@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@discordjs/voice/-/voice-0.3.1.tgz#326ba416454a441161a77884fe5142323e20104a" + integrity sha512-La+tv7sGEu7qPVfweur9nEd9FO+09iGgZu+CIDUKYP2MKAZqq+KE3D0Q5Xy+qF6iIFRXEzu5T+2f9DeKTppCDQ== + dependencies: + "@types/ws" "^7.4.4" + discord-api-types "^0.18.1" + prism-media "^1.2.9" + tiny-typed-emitter "^2.0.3" + ws "^7.4.4" + "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents": version "2.1.8-no-fsevents" resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.tgz#da7c3996b8e6e19ebd14d82eaced2313e7769f9b" @@ -935,20 +984,50 @@ readdirp "^2.2.1" upath "^1.1.1" +"@sapphire/async-queue@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.1.3.tgz#fbc70f2687a2473bd824a4723e962dfce933eba7" + integrity sha512-pyV+0njfBq6rHKEOpux5xy2cEM5u9KFjVzpmKsgk/8mdslLCuNXX4QvxWsSerLq/EtLhkvvl998cdFbGtpHa9Q== + "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== -"@types/node@*", "@types/node@^14.14.41": - version "14.14.41" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.41.tgz#d0b939d94c1d7bd53d04824af45f1139b8c45615" - integrity sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g== +"@tsconfig/node10@^1.0.7": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" + integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== -"@types/ws@^7.4.1": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.1.tgz#49eacb15a0534663d53a36fbf5b4d98f5ae9a73a" - integrity sha512-ISCK1iFnR+jYv7+jLNX0wDqesZ/5RAeY3wUx6QaphmocphU61h+b+PHjS18TF4WIPTu/MMzxIq2PHr32o2TS5Q== +"@tsconfig/node12@^1.0.7": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.8.tgz#a883d62f049a64fea1e56a6bbe66828d11c6241b" + integrity sha512-LM6XwBhjZRls1qJGpiM/It09SntEwe9M0riXRfQ9s6XlJQG0JPGl92ET18LtGeYh/GuOtafIXqwZeqLOd0FNFQ== + +"@tsconfig/node14@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" + integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== + +"@tsconfig/node16@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.1.tgz#a6ca6a9a0ff366af433f42f5f0e124794ff6b8f1" + integrity sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA== + +"@types/node@*": + version "15.12.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.2.tgz#1f2b42c4be7156ff4a6f914b2fb03d05fa84e38d" + integrity sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww== + +"@types/node@^14.14.41": + version "14.17.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.3.tgz#6d327abaa4be34a74e421ed6409a0ae2f47f4c3d" + integrity sha512-e6ZowgGJmTuXa3GyaPbTGxX17tnThl2aSSizrFthQ7m9uLGZBXiGhgE55cjRZTF5kjZvYn9EOPOMljdjwbflxw== + +"@types/ws@^7.4.1", "@types/ws@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.4.tgz#93e1e00824c1de2608c30e6de4303ab3b4c0c9bc" + integrity sha512-d/7W23JAXPodQNbOZNXvl2K+bqAQrCMwlh/nuQsPSQk6Fq0opHoPrUw43aHsvSbIiQPr8Of2hkFbnz1XBFVyZQ== dependencies: "@types/node" "*" @@ -992,10 +1071,10 @@ acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.1.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.1.1.tgz#fb0026885b9ac9f48bac1e185e4af472971149ff" - integrity sha512-xYiIVjNuqtKXMxlRMDc6mZUhXehod4a3gbZ1qRlM7icK4EbxUFNLhWoPblCvFtB2Y9CIqHP3CF/rdxLItaQv8g== +acorn@^8.2.4: + version "8.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.3.0.tgz#1193f9b96c4e8232f00b11a9edff81b2c8b98b88" + integrity sha512-tqPKHZ5CaBJw0Xmy0ZZvLs1qTV+BNFSyvn77ASXkpBNfIRk8ev26fKrD9iLGwGA9zedPao52GSHzq8lyZG0NUw== agent-base@6: version "6.0.2" @@ -1004,7 +1083,7 @@ agent-base@6: dependencies: debug "4" -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3: +ajv@^6.10.0, ajv@^6.10.2: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1091,6 +1170,11 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -1133,27 +1217,15 @@ array-back@^3.0.1: integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== array-back@^4.0.0, array-back@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.1.tgz#9b80312935a52062e1a233a9c7abeb5481b30e90" - integrity sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg== + version "4.0.2" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" + integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -1179,16 +1251,6 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== - axios@^0.21.1: version "0.21.1" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" @@ -1204,33 +1266,33 @@ babel-plugin-dynamic-import-node@^2.3.3: object.assign "^4.1.0" babel-plugin-polyfill-corejs2@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz#686775bf9a5aa757e10520903675e3889caeedc4" - integrity sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg== + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" + integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ== dependencies: "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.2.0" + "@babel/helper-define-polyfill-provider" "^0.2.2" semver "^6.1.1" babel-plugin-polyfill-corejs3@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz#f4b4bb7b19329827df36ff56f6e6d367026cb7a2" - integrity sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg== + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.2.tgz#7424a1682ee44baec817327710b1b094e5f8f7f5" + integrity sha512-l1Cf8PKk12eEk5QP/NQ6TH8A1pee6wWDJ96WjxrMXFLHLOBFzYM4moG80HFgduVhTqAFez4alnZKEhP/bYHg0A== dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.0" + "@babel/helper-define-polyfill-provider" "^0.2.2" core-js-compat "^3.9.1" babel-plugin-polyfill-regenerator@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz#853f5f5716f4691d98c84f8069c7636ea8da7ab8" - integrity sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg== + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" + integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.0" + "@babel/helper-define-polyfill-provider" "^0.2.2" balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base@^0.11.1: version "0.11.2" @@ -1245,13 +1307,6 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - binary-extensions@^1.0.0: version "1.13.1" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" @@ -1308,17 +1363,22 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.14.5, browserslist@^4.16.4: - version "4.16.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.4.tgz#7ebf913487f40caf4637b892b268069951c35d58" - integrity sha512-d7rCxYV8I9kj41RH8UKYnvDYCRENUlHRgyXy/Rhr/1BaeLGfiCptEdFE8MIrvGfWbBFNjVYx76SQWvNX1j+/cQ== +browserslist@^4.16.6: + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== dependencies: - caniuse-lite "^1.0.30001208" + caniuse-lite "^1.0.30001219" colorette "^1.2.2" - electron-to-chromium "^1.3.712" + electron-to-chromium "^1.3.723" escalade "^3.1.1" node-releases "^1.1.71" +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -1366,22 +1426,17 @@ camelcase@^5.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001208: - version "1.0.30001214" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001214.tgz#70f153c78223515c6d37a9fde6cd69250da9d872" - integrity sha512-O2/SCpuaU3eASWVaesQirZv1MSjUNOvmugaD8zNSJqw6Vv5SGwoOpA9LJs3pNPfM745nxqPvfZY3MQKY4AKHYg== +caniuse-lite@^1.0.30001219: + version "1.0.30001236" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001236.tgz#0a80de4cdf62e1770bb46a30d884fc8d633e3958" + integrity sha512-o0PRQSrSCGJKCPZcgMzl5fUaj5xHe8qA2m4QRvnyY4e1lITqoNkr7q/Oh1NcpGSy0Th97UZ35yoKcINPoq7YOQ== -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -catharsis@^0.8.11: - version "0.8.11" - resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.8.11.tgz#d0eb3d2b82b7da7a3ce2efb1a7b00becc6643468" - integrity sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g== +catharsis@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.9.0.tgz#40382a168be0e6da308c277d3a2b3eb40c7d2121" + integrity sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A== dependencies: - lodash "^4.17.14" + lodash "^4.17.15" chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0: version "2.4.2" @@ -1393,9 +1448,9 @@ chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0: supports-color "^5.3.0" chalk@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + version "4.1.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -1405,29 +1460,29 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -cheerio-select-tmp@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/cheerio-select-tmp/-/cheerio-select-tmp-0.1.1.tgz#55bbef02a4771710195ad736d5e346763ca4e646" - integrity sha512-YYs5JvbpU19VYJyj+F7oYrIE2BOll1/hRU7rEy/5+v9BzkSo3bK81iAeeQEMI92vRIxz677m72UmJUiVwwgjfQ== +cheerio-select@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-1.5.0.tgz#faf3daeb31b17c5e1a9dabcee288aaf8aafa5823" + integrity sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg== dependencies: - css-select "^3.1.2" - css-what "^4.0.0" - domelementtype "^2.1.0" - domhandler "^4.0.0" - domutils "^2.4.4" + css-select "^4.1.3" + css-what "^5.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + domutils "^2.7.0" -cheerio@^1.0.0-rc.3: - version "1.0.0-rc.5" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.5.tgz#88907e1828674e8f9fee375188b27dadd4f0fa2f" - integrity sha512-yoqps/VCaZgN4pfXtenwHROTp8NG6/Hlt4Jpz2FEP0ZJQ+ZUkVDd0hAPDNKhj3nakpfPt/CNs57yEtxD1bXQiw== +cheerio@^1.0.0-rc.9: + version "1.0.0-rc.10" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.10.tgz#2ba3dcdfcc26e7956fc1f440e61d51c643379f3e" + integrity sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw== dependencies: - cheerio-select-tmp "^0.1.0" - dom-serializer "~1.2.0" - domhandler "^4.0.0" - entities "~2.1.0" - htmlparser2 "^6.0.0" - parse5 "^6.0.0" - parse5-htmlparser2-tree-adapter "^6.0.0" + cheerio-select "^1.5.0" + dom-serializer "^1.3.2" + domhandler "^4.2.0" + htmlparser2 "^6.1.0" + parse5 "^6.0.1" + parse5-htmlparser2-tree-adapter "^6.0.1" + tslib "^2.2.0" chokidar@^3.4.0: version "3.5.1" @@ -1530,7 +1585,7 @@ colorette@^1.2.2: resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: +combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -1618,19 +1673,24 @@ copy-descriptor@^0.1.0: integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js-compat@^3.9.0, core-js-compat@^3.9.1: - version "3.10.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.10.2.tgz#0a675b4e1cde599616322a72c8886bcf696f3ec3" - integrity sha512-IGHnpuaM1N++gLSPI1F1wu3WXICPxSyj/Q++clcwsIOnUVp5uKUIPl/+6h0TQ112KU3fMiSxqJuM+OrCyKj5+A== + version "3.14.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.14.0.tgz#b574dabf29184681d5b16357bd33d104df3d29a5" + integrity sha512-R4NS2eupxtiJU+VwgkF9WTpnSfZW4pogwKHd8bclWU2sp93Pr5S1uYJI84cMOubJRou7bcfL0vmwtLslWN5p3A== dependencies: - browserslist "^4.16.4" + browserslist "^4.16.6" semver "7.0.0" -core-util-is@1.0.2, core-util-is@~1.0.0: +core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cross-fetch@^3.0.5: +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-fetch@~3.1.4: version "3.1.4" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" integrity sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ== @@ -1648,21 +1708,21 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -css-select@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-3.1.2.tgz#d52cbdc6fee379fba97fb0d3925abbd18af2d9d8" - integrity sha512-qmss1EihSuBNWNNhHjxzxSfJoFBM/lERB/Q4EnsJQQC62R2evJDW481091oAdOr9uh46/0n4nrg0It5cAnj1RA== +css-select@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" + integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== dependencies: boolbase "^1.0.0" - css-what "^4.0.0" - domhandler "^4.0.0" - domutils "^2.4.3" + css-what "^5.0.0" + domhandler "^4.2.0" + domutils "^2.6.0" nth-check "^2.0.0" -css-what@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-4.0.0.tgz#35e73761cab2eeb3d3661126b23d7aa0e8432233" - integrity sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A== +css-what@^5.0.0, css-what@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.0.1.tgz#3efa820131f4669a8ac2408f9c32e7c7de9f4cad" + integrity sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg== cssom@^0.4.4: version "0.4.4" @@ -1681,13 +1741,6 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - data-urls@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" @@ -1785,12 +1838,17 @@ diff@^4.0.1: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -discord-ytdl-core@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/discord-ytdl-core/-/discord-ytdl-core-5.0.2.tgz#28fb8712af8b5fda34f20800d2226b556e700422" - integrity sha512-tuu+skr0cA89Li7sCH+L1p3TwdfSOunmC9BFzSa0Jj567B1F2leVVbjKQ5ZKpsW1cXKv0fh0PdQA2/Fnu6WcQA== +discord-api-types@^0.18.1: + version "0.18.1" + resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.18.1.tgz#5d08ed1263236be9c21a22065d0e6b51f790f492" + integrity sha512-hNC38R9ZF4uaujaZQtQfm5CdQO58uhdkoHQAVvMfIL0LgOSZeW575W8H6upngQOuoxWd8tiRII3LLJm9zuQKYg== + +discord-ytdl-core@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/discord-ytdl-core/-/discord-ytdl-core-5.0.3.tgz#a31560f0bede41d6fc969377083ae958deac2b72" + integrity sha512-q4GOEFiV19l0OcPezXnkDWualf+n96LcbTEWReceiDHdx4xxn5CXZX9PR4iDTXQR3Kv2VUkwB8RO8dI50d88vQ== dependencies: - prism-media "^1.2.7" + prism-media "^1.2.9" discord.js-docgen@discordjs/docgen#ts-patch: version "0.9.0" @@ -1802,19 +1860,19 @@ discord.js-docgen@discordjs/docgen#ts-patch: tsubaki "^1.3.2" yargs "^14.0.0" -discord.js@^12.5.3: - version "12.5.3" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-12.5.3.tgz#56820d473c24320871df9ea0bbc6b462f21cf85c" - integrity sha512-D3nkOa/pCkNyn6jLZnAiJApw2N9XrIsXUAdThf01i7yrEuqUmDGc7/CexVWwEcgbQR97XQ+mcnqJpmJ/92B4Aw== +discord.js@^13.0.0-dev.f5f3f772865ee98bbb44df938e0e71f9f8865c10: + version "13.0.0-dev.f5f3f772865ee98bbb44df938e0e71f9f8865c10" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.0.0-dev.f5f3f772865ee98bbb44df938e0e71f9f8865c10.tgz#0fe3389e4befffd429ba37fc669b9153e87f33e5" + integrity sha512-VuGJMzXStqeeHmB3DDEShGHXGey215573kkbFxQinzrFYt1UNnQZ5d1ZmB7Y0oY3JSivpv3Whc5M/YtH41NMXQ== dependencies: "@discordjs/collection" "^0.1.6" "@discordjs/form-data" "^3.0.1" + "@sapphire/async-queue" "^1.1.2" + "@types/ws" "^7.4.4" abort-controller "^3.0.0" + discord-api-types "^0.18.1" node-fetch "^2.6.1" - prism-media "^1.2.9" - setimmediate "^1.0.5" - tweetnacl "^1.0.3" - ws "^7.4.4" + ws "^7.4.6" dmd@^4.0.5: version "4.0.6" @@ -1841,16 +1899,16 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-serializer@^1.0.1, dom-serializer@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.2.0.tgz#3433d9136aeb3c627981daa385fc7f32d27c48f1" - integrity sha512-n6kZFH/KlCrqs/1GHMOd5i2fd/beQHuehKdWvNNffbGHTr/almdhuVvTVFb3V7fglz+nC50fFusu3lY33h12pA== +dom-serializer@^1.0.1, dom-serializer@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" + integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== dependencies: domelementtype "^2.0.1" - domhandler "^4.0.0" + domhandler "^4.2.0" entities "^2.0.0" -domelementtype@^2.0.1, domelementtype@^2.1.0, domelementtype@^2.2.0: +domelementtype@^2.0.1, domelementtype@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== @@ -1862,34 +1920,26 @@ domexception@^2.0.1: dependencies: webidl-conversions "^5.0.0" -domhandler@^4.0.0, domhandler@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.1.0.tgz#c1d8d494d5ec6db22de99e46a149c2a4d23ddd43" - integrity sha512-/6/kmsGlMY4Tup/nGVutdrK9yQi4YjWVcVeoQmixpzjOUK1U7pQkvAPHBJeUxOgxF0J8f8lwCJSlCfD0V4CMGQ== +domhandler@^4.0.0, domhandler@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.0.tgz#f9768a5f034be60a89a27c2e4d0f74eba0d8b059" + integrity sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA== dependencies: domelementtype "^2.2.0" -domutils@^2.4.3, domutils@^2.4.4: - version "2.5.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.5.1.tgz#9b8e84b5d9f788499ae77506ea832e9b4f9aa1c0" - integrity sha512-hO1XwHMGAthA/1KL7c83oip/6UWo3FlUNIuWiWKltoiQ5oCOiqths8KknvY2jpOohUoUgnwa/+Rm7UpwpSbY/Q== +domutils@^2.5.2, domutils@^2.6.0, domutils@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.7.0.tgz#8ebaf0c41ebafcf55b0b72ec31c56323712c5442" + integrity sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg== dependencies: dom-serializer "^1.0.1" domelementtype "^2.2.0" - domhandler "^4.1.0" + domhandler "^4.2.0" -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -electron-to-chromium@^1.3.712: - version "1.3.718" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.718.tgz#a192981ced608978410ebc011e24ecab1bb4beb3" - integrity sha512-CikzdUSShGXwjq1pcW740wK8j+KbazgHZiwzlHICejDaczM6OVsPcrZmBHPwzj9i2rj5twg20MBwp+cYZwldYA== +electron-to-chromium@^1.3.723: + version "1.3.750" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.750.tgz#7e5ef6f478316b0bd656af5942fe502610e97eaf" + integrity sha512-Eqy9eHNepZxJXT+Pc5++zvEi5nQ6AGikwFYDCYwXUFBr+ynJ6pDG7MzZmwGYCIuXShLJM0n4bq+aoKDmvSGJ8A== emoji-regex@^7.0.1: version "7.0.3" @@ -1911,11 +1961,6 @@ entities@~2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== -entities@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" - integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -2082,11 +2127,6 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - external-editor@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" @@ -2110,16 +2150,6 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - fast-deep-equal@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -2211,27 +2241,22 @@ flatted@^2.0.0: integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== follow-redirects@^1.10.0: - version "1.13.3" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.3.tgz#e5598ad50174c1bc4e872301e82ac2cd97f90267" - integrity sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA== + version "1.14.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" + integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== dependencies: asynckit "^0.4.0" - combined-stream "^1.0.6" + combined-stream "^1.0.8" mime-types "^2.1.12" fragment-cache@^0.2.1: @@ -2293,12 +2318,12 @@ gauge@~2.7.3: wide-align "^1.1.0" genius-lyrics@^4.2.7: - version "4.2.7" - resolved "https://registry.yarnpkg.com/genius-lyrics/-/genius-lyrics-4.2.7.tgz#e85f65eb2de4ea2c0af1e11b13dda11e0c9744a9" - integrity sha512-laoeF2/P+Ed4uewuG6OeqymKTNdfGuymkCohMHIgr3g2DwziW49USXcEGCog1vnEDCpf2LhznNi3WOeLeSmAww== + version "4.2.9" + resolved "https://registry.yarnpkg.com/genius-lyrics/-/genius-lyrics-4.2.9.tgz#87d12946589d3e96df4e100c51805aa5046de2c7" + integrity sha512-BQm/gmaXEckLAc/Z9ZsGNWxh4CHudx0G1Key8Rnv0xFcqmrxIvssJIDBgDPJLqB6dpVas3uj6LQng1yMFtxfNA== dependencies: axios "^0.21.1" - node-html-parser "^3.0.4" + cheerio "^1.0.0-rc.9" gensync@^1.0.0-beta.2: version "1.0.0-beta.2" @@ -2324,13 +2349,6 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -2347,9 +2365,9 @@ glob-parent@^5.0.0, glob-parent@~5.1.0: is-glob "^4.0.1" glob@^7.0.0, glob@^7.1.1, glob@^7.1.3, glob@^7.1.5: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -2387,19 +2405,6 @@ handlebars@^4.5.3: optionalDependencies: uglify-js "^3.1.4" -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -2458,12 +2463,7 @@ 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== - -himalaya@^1.1.0: +himalaya@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/himalaya/-/himalaya-1.1.0.tgz#31724ae9d35714cd7c6f4be94888953f3604606a" integrity sha512-LLase1dHCRMel68/HZTFft0N0wti0epHr3nNY7ynpLbyZpmrKMQ8YIpiOV77TM97cNpC8Wb2n6f66IRggwdWPw== @@ -2475,14 +2475,14 @@ html-encoding-sniffer@^2.0.1: dependencies: whatwg-encoding "^1.0.5" -htmlparser2@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.0.1.tgz#422521231ef6d42e56bd411da8ba40aa36e91446" - integrity sha512-GDKPd+vk4jvSuvCbyuzx/unmXkk090Azec7LovXP8as1Hn8q9p3hbjmDGbUqqhknw0ajwit6LiiWqfiTUPMK7w== +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== dependencies: domelementtype "^2.0.1" domhandler "^4.0.0" - domutils "^2.4.4" + domutils "^2.5.2" entities "^2.0.0" http-proxy-agent@^4.0.1: @@ -2494,14 +2494,13 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" + agent-base "6" + debug "4" iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" @@ -2594,9 +2593,9 @@ is-buffer@^1.1.5: integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-core-module@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + version "2.4.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" + integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== dependencies: has "^1.0.3" @@ -2699,16 +2698,11 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-potential-custom-element-name@^1.0.0: +is-potential-custom-element-name@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -2724,11 +2718,6 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -iso8601-duration@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/iso8601-duration/-/iso8601-duration-1.3.0.tgz#29d7b69e0574e4acdee50c5e5e09adab4137ba5a" - integrity sha512-K4CiUBzo3YeWk76FuET/dQPH03WE04R94feo5TSKQCXpoXQt9E4yx2CnY737QZnSAI3PI4WlKo/zfqizGx52QQ== - isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" @@ -2741,11 +2730,6 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -2766,11 +2750,6 @@ js2xmlparser@^4.0.1: dependencies: xmlcreate "^2.0.3" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - jsdoc-api@^5.0.4: version "5.0.4" resolved "https://registry.yarnpkg.com/jsdoc-api/-/jsdoc-api-5.0.4.tgz#6b60cddaa4e7ff9a2e139acfc19ecaa9c48f8575" @@ -2825,32 +2804,32 @@ jsdoc-to-markdown@^5.0.1: walk-back "^4.0.0" jsdoc@^3.6.3: - version "3.6.6" - resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-3.6.6.tgz#9fe162bbdb13ee7988bf74352b5147565bcfd8e1" - integrity sha512-znR99e1BHeyEkSvgDDpX0sTiTu+8aQyDl9DawrkOGZTTW8hv0deIFXx87114zJ7gRaDZKVQD/4tr1ifmJp9xhQ== + version "3.6.7" + resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-3.6.7.tgz#00431e376bed7f9de4716c6f15caa80e64492b89" + integrity sha512-sxKt7h0vzCd+3Y81Ey2qinupL6DpRSZJclS04ugHDNmRUXGzqicMJ6iwayhSA0S0DwwX30c5ozyUthr1QKF6uw== dependencies: "@babel/parser" "^7.9.4" bluebird "^3.7.2" - catharsis "^0.8.11" + catharsis "^0.9.0" escape-string-regexp "^2.0.0" js2xmlparser "^4.0.1" klaw "^3.0.0" markdown-it "^10.0.0" markdown-it-anchor "^5.2.7" - marked "^0.8.2" + marked "^2.0.3" mkdirp "^1.0.4" requizzle "^0.2.3" strip-json-comments "^3.1.0" taffydb "2.6.2" - underscore "~1.10.2" + underscore "~1.13.1" jsdom@^16.5.2: - version "16.5.3" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.5.3.tgz#13a755b3950eb938b4482c407238ddf16f0d2136" - integrity sha512-Qj1H+PEvUsOtdPJ056ewXM4UJPCi4hhLA8wpiz9F2YvsRBhuFsXxtrIFAgGBDynQA9isAMGE91PfUYbdMPXuTA== + version "16.6.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.6.0.tgz#f79b3786682065492a3da6a60a4695da983805ac" + integrity sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg== dependencies: abab "^2.0.5" - acorn "^8.1.0" + acorn "^8.2.4" acorn-globals "^6.0.0" cssom "^0.4.4" cssstyle "^2.3.0" @@ -2858,12 +2837,13 @@ jsdom@^16.5.2: decimal.js "^10.2.1" domexception "^2.0.1" escodegen "^2.0.0" + form-data "^3.0.0" html-encoding-sniffer "^2.0.1" - is-potential-custom-element-name "^1.0.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" nwsapi "^2.2.0" parse5 "6.0.1" - request "^2.88.2" - request-promise-native "^1.0.9" saxes "^5.0.1" symbol-tree "^3.2.4" tough-cookie "^4.0.0" @@ -2873,7 +2853,7 @@ jsdom@^16.5.2: whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" whatwg-url "^8.5.0" - ws "^7.4.4" + ws "^7.4.5" xml-name-validator "^3.0.0" jsesc@^2.5.1: @@ -2891,21 +2871,11 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - json5@^2.1.2: version "2.2.0" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" @@ -2913,16 +2883,6 @@ json5@^2.1.2: dependencies: minimist "^1.2.5" -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -3002,7 +2962,7 @@ lodash.pick@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= -lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.7.0: +lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3014,10 +2974,10 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -m3u8stream@^0.8.0, m3u8stream@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/m3u8stream/-/m3u8stream-0.8.3.tgz#c4624e92b4240eb356d040c4a5e155586cf58108" - integrity sha512-0nAcdrF8YJKUkb6PzWdvGftTPyCVWgoiot1AkNVbPKTeIGsWs6DrOjifrJ0Zi8WQfQmD2SuVCjkYIOip12igng== +m3u8stream@^0.8.3: + version "0.8.4" + resolved "https://registry.yarnpkg.com/m3u8stream/-/m3u8stream-0.8.4.tgz#15b49d0c2b510755ea43c1e53f85d7aaa4dc65c2" + integrity sha512-sco80Db+30RvcaIOndenX6E6oQNgTiBKeJbFPc+yDXwPQIkryfboEbCvXPlBRq3mQTCVPQO93TDVlfRwqpD35w== dependencies: miniget "^4.0.0" sax "^1.2.4" @@ -3037,6 +2997,11 @@ make-dir@^3.1.0: dependencies: semver "^6.0.0" +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -3070,10 +3035,10 @@ marked@^0.7.0: resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e" integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg== -marked@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.8.2.tgz#4faad28d26ede351a7a1aaa5fec67915c869e355" - integrity sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw== +marked@^2.0.3: + version "2.0.7" + resolved "https://registry.yarnpkg.com/marked/-/marked-2.0.7.tgz#bc5b857a09071b48ce82a1f7304913a993d4b7d1" + integrity sha512-BJXxkuIfJchcXOJWTT2DOL+yFWifFv2yGYOUzvXg8Qz610QKw+sHCvTMYwA+qWGhlA2uivBezChZ/pBy1tWdkQ== mdurl@^1.0.1: version "1.0.1" @@ -3099,17 +3064,17 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -mime-db@1.47.0: - version "1.47.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" - integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== +mime-db@1.48.0: + version "1.48.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" + integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== -mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.30" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" - integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== +mime-types@^2.1.12: + version "2.1.31" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" + integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== dependencies: - mime-db "1.47.0" + mime-db "1.48.0" mimic-fn@^2.1.0: version "2.1.0" @@ -3117,9 +3082,9 @@ mimic-fn@^2.1.0: integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== miniget@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/miniget/-/miniget-4.2.0.tgz#0004e95536b192d95a7d09f4435d67b9285481d0" - integrity sha512-IzTOaNgBw/qEpzkPTE7X2cUVXQfSKbG8w52Emi93zb+Zya2ZFrbmavpixzebuDJD9Ku4ecbaFlC7Y1cEESzQtQ== + version "4.2.1" + resolved "https://registry.yarnpkg.com/miniget/-/miniget-4.2.1.tgz#11a1c24817a059e292378eb9cff4328d9240c665" + integrity sha512-O/DduzDR6f+oDtVype9S/Qu5hhnx73EDYGyZKwU/qN82lehFZdfhoa4DT51SpsO+8epYrB3gcRmws56ROfTIoQ== minimatch@^3.0.4: version "3.0.4" @@ -3220,28 +3185,20 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -node-addon-api@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.1.0.tgz#98b21931557466c6729e51cb77cd39c965f42239" - integrity sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw== +node-addon-api@*, node-addon-api@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== node-fetch@2.6.1, node-fetch@^2.6.0, node-fetch@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== -node-html-parser@^3.0.4: - version "3.1.5" - resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-3.1.5.tgz#ffb62f2a336b6b634f41f3315487fe446fb9d7b5" - integrity sha512-/XKKdWbSUymlXTjtNBcDlmM7Jp8S/BqGMzLx7r2bd2NMjTXz+ofuLcz0Bl3VT0vTvVzF+N511FNLrZt4HVitXA== - dependencies: - css-select "^3.1.2" - he "1.2.0" - node-releases@^1.1.71: - version "1.1.71" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" - integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== + version "1.1.73" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20" + integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg== nopt@^5.0.0: version "5.0.0" @@ -3289,11 +3246,6 @@ nwsapi@^2.2.0: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -3404,14 +3356,14 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse5-htmlparser2-tree-adapter@^6.0.0: +parse5-htmlparser2-tree-adapter@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== dependencies: parse5 "^6.0.1" -parse5@6.0.1, parse5@^6.0.0, parse5@^6.0.1: +parse5@6.0.1, parse5@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== @@ -3442,19 +3394,14 @@ path-key@^2.0.1: integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== picomatch@^2.0.4, picomatch@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d" - integrity sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg== + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== pify@^4.0.1: version "4.0.1" @@ -3472,11 +3419,11 @@ prelude-ls@~1.1.2: integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= prettier@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" - integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== + version "2.3.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.1.tgz#76903c3f8c4449bc9ac597acefa24dc5ad4cbea6" + integrity sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA== -prism-media@^1.2.7, prism-media@^1.2.9: +prism-media@^1.2.9: version "1.2.9" resolved "https://registry.yarnpkg.com/prism-media/-/prism-media-1.2.9.tgz#8d4f97b36efdfc82483eb8d3db64020767866f36" integrity sha512-UHCYuqHipbTR1ZsXr5eg4JUmHER8Ss4YEb9Azn+9zzJ7/jlTtD1h0lc4g6tNx3eMlB8Mp6bfll0LPMAV4R6r3Q== @@ -3491,7 +3438,7 @@ progress@^2.0.0: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -psl@^1.1.28, psl@^1.1.33: +psl@^1.1.33: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== @@ -3501,11 +3448,6 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - readable-stream@^2.0.2, readable-stream@^2.0.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -3548,9 +3490,9 @@ reduce-flatten@^1.0.1: integrity sha1-JYx479FT3fk8tWEjf2EYTzaW4yc= reduce-flatten@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-3.0.0.tgz#da477d68453fd9510f9a5fbef86e0fa04b4fd315" - integrity sha512-eczl8wAYBxJ6Egl6I1ECIF+8z6sHu+KE7BzaEDZTpPXKXfy9SUDQlVYwkRcNTjJLC3Iakxbhss50KuT/R6SYfg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-3.0.1.tgz#3db6b48ced1f4dbe4f4f5e31e422aa9ff0cd21ba" + integrity sha512-bYo+97BmUUOzg09XwfkwALt4PQH1M5L0wzKerBt6WLm3Fhdd43mMS89HiT1B9pJIqko/6lWx3OnV4J9f2Kqp5Q== reduce-unique@^2.0.1: version "2.0.1" @@ -3640,48 +3582,6 @@ repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -request-promise-core@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" - integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== - dependencies: - lodash "^4.17.19" - -request-promise-native@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" - integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== - dependencies: - request-promise-core "1.1.4" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - -request@^2.88.2: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -3763,11 +3663,6 @@ rxjs@^6.6.0: dependencies: tslib "^1.9.0" -safe-buffer@^5.0.1, safe-buffer@^5.1.2: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -3780,7 +3675,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -3834,11 +3729,6 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -3856,14 +3746,6 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== -simple-youtube-api@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/simple-youtube-api/-/simple-youtube-api-5.2.1.tgz#d1f6efb941ce404f50ce56e0c5e6bff249fcac6a" - integrity sha512-vmndP9Bkh35tifn2OwY+th2imSsfYtmDqczgdOW5yEARFzvSoR8VSQFsivJnctfV5QHQUL6VrOpNdbmDRLh9Bg== - dependencies: - iso8601-duration "^1.2.0" - node-fetch "^2.6.0" - slash@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" @@ -3908,6 +3790,13 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" +sodium@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/sodium/-/sodium-3.0.2.tgz#4dbd7eb4a21c92ca7e7f684756cd733fee78112e" + integrity sha512-IsTwTJeoNBU97km3XkrbCGC/n/9aUQejgD3QPr2YY2gtbSPru3TI6nhCqgoez9Mv88frF9oVZS/jrXFbd6WXyA== + dependencies: + node-addon-api "*" + sort-array@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sort-array/-/sort-array-2.0.0.tgz#38a9c6da27fd7d147b42e60554f281187b4df472" @@ -3917,13 +3806,13 @@ sort-array@^2.0.0: object-get "^2.1.0" typical "^2.6.0" -soundcloud-scraper@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/soundcloud-scraper/-/soundcloud-scraper-4.0.3.tgz#cd7ed1d7b6ed1d7729fd7580c011281f652b920f" - integrity sha512-A0a6sVJ2wkkWIX8Ft3L63sfHBlFDRAaPFif+SWi07KCNLh8YTcylw45pts76pndxlupKwV2NgOTIYeF/F9tg8w== +soundcloud-scraper@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/soundcloud-scraper/-/soundcloud-scraper-5.0.0.tgz#3f4e9d9fc9ee79cbaf6cdd64f462ad6803e25ac1" + integrity sha512-8Rt7WbW85AqiFoKkemF5BKsGAThLGnhOi13ztctAI0Y/wso/iuR97yiVXK1eYRc2YqaD8gkpKUAjEY7bOxLxnw== dependencies: - cheerio "^1.0.0-rc.3" - m3u8stream "^0.8.0" + cheerio "^1.0.0-rc.9" + m3u8stream "^0.8.3" node-fetch "^2.6.1" source-map-resolve@^0.5.0: @@ -3937,6 +3826,14 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" +source-map-support@^0.5.17: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" @@ -3947,7 +3844,7 @@ source-map@^0.5.0, source-map@^0.5.6: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -3959,40 +3856,25 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -spotify-uri@^2.1.0: +spotify-uri@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/spotify-uri/-/spotify-uri-2.2.0.tgz#8db641615cf6e122284874287fe39e89595922df" integrity sha512-uUybj02bfyfCoZ0MJ80MkqbKxtIVRJfbRGk05KJFq1li3zb7yNfN1f+TAw4wcXgp7jLWExeiw2wyPQXZ8PHtfg== -spotify-url-info@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spotify-url-info/-/spotify-url-info-2.2.0.tgz#7d14adbae65b54b918c46e2dcfdf02b1146f85c8" - integrity sha512-GEMoMf2RF+CSPsSGstY/9c7dgViKOKJ09bFZTwrU4KzQ+JpLq+0Ho4eMCeeGmES94yjBz+GHMtBfTcp+4DxEbA== +spotify-url-info@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/spotify-url-info/-/spotify-url-info-2.2.3.tgz#2f08400479f00472fb488eff4bd3c485db99361a" + integrity sha512-cZTE5nOnaAjIiaHG9psVYqKXWOlNUIgSU2e+bNInRaYZNgmVgOcKH0D7V1nSER3gv3h5BXvOo0EJTtrMQQo1bA== dependencies: - cross-fetch "^3.0.5" - himalaya "^1.1.0" - spotify-uri "^2.1.0" + cross-fetch "~3.1.4" + himalaya "~1.1.0" + spotify-uri "~2.2.0" sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -4001,11 +3883,6 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= - stream-connect@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/stream-connect/-/stream-connect-1.0.2.tgz#18bc81f2edb35b8b5d9a8009200a985314428a97" @@ -4189,6 +4066,11 @@ through@^2.3.6: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= +tiny-typed-emitter@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tiny-typed-emitter/-/tiny-typed-emitter-2.0.3.tgz#4335e3a75127ae7faba91b02e91615d97dc8db7d" + integrity sha512-MaCqhHlp6EAWN25yqBlajgd4scxxI2eJr7+EgoUAOV9UkMU3us/yp2bEnc2yOvyeDF8TUWuaz3zZCPGTKFJIpA== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -4233,14 +4115,6 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -tough-cookie@^2.3.3, tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - tough-cookie@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" @@ -4250,18 +4124,39 @@ tough-cookie@^4.0.0: punycode "^2.1.1" universalify "^0.1.2" -tr46@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" - integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== dependencies: punycode "^2.1.1" +ts-node@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.0.0.tgz#05f10b9a716b0b624129ad44f0ea05dac84ba3be" + integrity sha512-ROWeOIUvfFbPZkoDis0L/55Fk+6gFQNZwwKPLinacRl6tsxstTF1DbAcLKkovwnpKMVvOMHP1TIbnwXwtLg1gg== + dependencies: + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" + integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== + tslint-config-prettier@^1.18.0: version "1.18.0" resolved "https://registry.yarnpkg.com/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz#75f140bde947d35d8f0d238e0ebf809d64592c37" @@ -4298,23 +4193,6 @@ tsutils@^2.29.0: dependencies: tslib "^1.8.1" -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - -tweetnacl@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== - type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -4332,10 +4210,15 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +typescipt@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typescipt/-/typescipt-1.0.0.tgz#bbe7ca742d5e6fc2e3e44ad10d461fe59211f6a5" + integrity sha512-Rgg7DtWh0c0oJPz2p48B0hlINIkE5zxU5i+dGctkoiKjIu6twl0HXWzoy+mvp9bQfLJGx70zYuN6GK0S/x5Kxw== + typescript@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.3.tgz#39062d8019912d43726298f09493d598048c1ce3" - integrity sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw== + version "4.3.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.2.tgz#399ab18aac45802d6f2498de5054fcbbe716a805" + integrity sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw== typical@^2.4.2, typical@^2.6.0, typical@^2.6.1: version "2.6.1" @@ -4353,14 +4236,14 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== uglify-js@^3.1.4: - version "3.13.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.4.tgz#592588bb9f47ae03b24916e2471218d914955574" - integrity sha512-kv7fCkIXyQIilD5/yQy8O+uagsYIOt5cZvs890W40/e/rvjMSzJw81o9Bg0tkURxzZBROtDQhW2LFjOGoK3RZw== + version "3.13.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.9.tgz#4d8d21dcd497f29cfd8e9378b9df123ad025999b" + integrity sha512-wZbyTQ1w6Y7fHdt8sJnHfSIuWeDgk6B5rCb4E/AM6QNNPbOMIZph21PW5dRB3h7Df0GszN+t7RuUH6sWK5bF0g== -underscore@~1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.10.2.tgz#73d6aa3668f3188e4adb0f1943bd12cfd7efaaaf" - integrity sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg== +underscore@~1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1" + integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g== unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" @@ -4435,25 +4318,11 @@ util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - v8-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" @@ -4506,12 +4375,12 @@ whatwg-mimetype@^2.3.0: integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.5.0.tgz#7752b8464fc0903fec89aa9846fc9efe07351fd3" - integrity sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg== + version "8.6.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.6.0.tgz#27c0205a4902084b872aecb97cf0f2a7a3011f4c" + integrity sha512-os0KkeeqUOl7ccdDT1qqUcS4KH4tcBTSKK5Nl5WKb2lyxInIZ/CpjkqKa1Ss12mjfdcRX9mHmPPs7/SxG1Hbdw== dependencies: lodash "^4.7.0" - tr46 "^2.0.2" + tr46 "^2.1.0" webidl-conversions "^6.1.0" which-module@^2.0.0: @@ -4572,10 +4441,10 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@^7.4.4: - version "7.4.4" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59" - integrity sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw== +ws@^7.4.4, ws@^7.4.5, ws@^7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== xml-name-validator@^3.0.0: version "3.0.0" @@ -4627,18 +4496,22 @@ yargs@^14.0.0: y18n "^4.0.0" yargs-parser "^15.0.1" -youtube-sr@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/youtube-sr/-/youtube-sr-4.0.4.tgz#48369b0cb1c53bd84c366a5420bb8f35b1db2329" - integrity sha512-Wf6YlANcCjAweY2MQuqJqusmMcGzaSDWE6ZTD8vifb9i9oFyKQpWuV58fnebJCFJE8G8pTLidmj5aRV7x384EQ== +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +youtube-sr@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/youtube-sr/-/youtube-sr-4.1.4.tgz#5ea646812264a951df7b1f6094f9f7406001dde6" + integrity sha512-0KSPNTmrxDOKCMsZlLB4NYKwuDXZFGR/wu7BD4mVA0huiw22jRQYc8oj2BQADmS8uGadzkFy3Z4DKRtDWuNN+A== dependencies: node-fetch "^2.6.1" - simple-youtube-api "^5.2.1" -ytdl-core@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/ytdl-core/-/ytdl-core-4.5.0.tgz#f07733387c548e5c3a5614c93ef55bde666eeaf4" - integrity sha512-e8r6skrakWNixsVlNPBMoRM1HrdW1swE97If9nenDUjF65uogYk4DvxIuqlmqRfBWKe+6aIZwqedNxUU9XLYJA== +ytdl-core@^4.8.2: + version "4.8.2" + resolved "https://registry.yarnpkg.com/ytdl-core/-/ytdl-core-4.8.2.tgz#f034ad942c5d958f5987fc8ff0b0639664ae2fb7" + integrity sha512-O3n++YcgZawaXJwbPmnRDgfN6b4kU0DpNdkI9Na5yM3JAdfJmoq5UHc8v9Xjgjr1RilQUUh7mhDnRRPDtKr0Kg== dependencies: m3u8stream "^0.8.3" miniget "^4.0.0"