diff --git a/package.json b/package.json index 7d93ea5..b28c10f 100644 --- a/package.json +++ b/package.json @@ -38,15 +38,15 @@ "@types/spotify-web-api-node": "^5.0.2", "@types/validator": "^13.1.4", "@types/ws": "^7.4.4", - "@typescript-eslint/eslint-plugin": "^4.25.0", - "@typescript-eslint/parser": "^4.26.1", - "eslint": "^7.28.0", - "eslint-config-xo": "^0.35.0", - "eslint-config-xo-typescript": "^0.36.0", + "@typescript-eslint/eslint-plugin": "^4.31.1", + "@typescript-eslint/parser": "^4.31.1", + "eslint": "^7.32.0", + "eslint-config-xo": "^0.38.0", + "eslint-config-xo-typescript": "^0.44.0", "husky": "^4.3.8", "nodemon": "^2.0.7", "ts-node": "^9.1.1", - "typescript": "^4.3.4" + "typescript": "^4.4.3" }, "eslintConfig": { "extends": [ diff --git a/src/bot.ts b/src/bot.ts index 6e6060b..5d2e97e 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -67,7 +67,7 @@ export default class { let handler: Command; if (this.commands.has(command)) { - handler = this.commands.get(command) as Command; + handler = this.commands.get(command)!; } else if (shortcut) { const possibleHandler = this.commands.get(shortcut.command.split(' ')[0]); diff --git a/src/commands/clear.ts b/src/commands/clear.ts index 189b8af..9906dab 100644 --- a/src/commands/clear.ts +++ b/src/commands/clear.ts @@ -9,7 +9,7 @@ export default class implements Command { public name = 'clear'; public aliases = ['c']; public examples = [ - ['clear', 'clears all songs in queue except currently playing'] + ['clear', 'clears all songs in queue except currently playing'], ]; public requiresVC = true; diff --git a/src/commands/config.ts b/src/commands/config.ts index 6ecad6b..0e5728a 100644 --- a/src/commands/config.ts +++ b/src/commands/config.ts @@ -10,7 +10,7 @@ export default class implements Command { public aliases = []; public examples = [ ['config prefix !', 'set the prefix to !'], - ['config channel music-commands', 'bind the bot to the music-commands channel'] + ['config channel music-commands', 'bind the bot to the music-commands channel'], ]; public async execute(msg: Message, args: string []): Promise { @@ -64,7 +64,7 @@ export default class implements Command { await Promise.all([ (channel as TextChannel).send('hey apparently I\'m bound to this channel now'), - msg.react('👍') + msg.react('👍'), ]); } else { await msg.channel.send(errorMsg('either that channel doesn\'t exist or you want me to become sentient and listen to a voice channel')); diff --git a/src/commands/disconnect.ts b/src/commands/disconnect.ts index 7280b51..89b0b85 100644 --- a/src/commands/disconnect.ts +++ b/src/commands/disconnect.ts @@ -10,7 +10,7 @@ export default class implements Command { public name = 'disconnect'; public aliases = ['dc']; public examples = [ - ['disconnect', 'pauses and disconnects player'] + ['disconnect', 'pauses and disconnects player'], ]; public requiresVC = true; diff --git a/src/commands/fseek.ts b/src/commands/fseek.ts index 850889d..16d1430 100644 --- a/src/commands/fseek.ts +++ b/src/commands/fseek.ts @@ -11,7 +11,7 @@ export default class implements Command { public name = 'fseek'; public aliases = []; public examples = [ - ['fseek 10', 'skips forward in current song by 10 seconds'] + ['fseek 10', 'skips forward in current song by 10 seconds'], ]; public requiresVC = true; diff --git a/src/commands/help.ts b/src/commands/help.ts index 05bc565..f150c54 100644 --- a/src/commands/help.ts +++ b/src/commands/help.ts @@ -10,7 +10,7 @@ export default class implements Command { public name = 'help'; public aliases = ['h']; public examples = [ - ['help', 'you don\'t need a description'] + ['help', 'you don\'t need a description'], ]; private commands: Command[] = []; diff --git a/src/commands/pause.ts b/src/commands/pause.ts index 4f57e95..1dee95d 100644 --- a/src/commands/pause.ts +++ b/src/commands/pause.ts @@ -11,7 +11,7 @@ export default class implements Command { public name = 'pause'; public aliases = []; public examples = [ - ['pause', 'pauses currently playing song'] + ['pause', 'pauses currently playing song'], ]; public requiresVC = true; diff --git a/src/commands/play.ts b/src/commands/play.ts index 7013626..8221f7b 100644 --- a/src/commands/play.ts +++ b/src/commands/play.ts @@ -24,7 +24,7 @@ export default class implements Command { ['play https://open.spotify.com/album/5dv1oLETxdsYOkS2Sic00z?si=bDa7PaloRx6bMIfKdnvYQw', 'adds all songs from album to the queue'], ['play https://open.spotify.com/playlist/37i9dQZF1DX94qaYRnkufr?si=r2fOVL_QQjGxFM5MWb84Xw', 'adds all songs from playlist to the queue'], ['play cool music immediate', 'adds the first search result for "cool music" to the front of the queue'], - ['play cool music i', 'adds the first search result for "cool music" to the front of the queue'] + ['play cool music i', 'adds the first search result for "cool music" to the front of the queue'], ]; public requiresVC = true; @@ -82,7 +82,7 @@ export default class implements Command { // YouTube source if (url.searchParams.get('list')) { // YouTube playlist - newSongs.push(...await this.getSongs.youtubePlaylist(url.searchParams.get('list') as string)); + newSongs.push(...await this.getSongs.youtubePlaylist(url.searchParams.get('list')!)); } else { // Single video const song = await this.getSongs.youtubeVideo(url.href); @@ -135,7 +135,9 @@ export default class implements Command { return; } - newSongs.forEach(song => player.add({...song, addedInChannelId: msg.channel.id}, {immediate: addToFrontOfQueue})); + newSongs.forEach(song => { + player.add({...song, addedInChannelId: msg.channel.id}, {immediate: addToFrontOfQueue}); + }); const firstSong = newSongs[0]; diff --git a/src/commands/queue.ts b/src/commands/queue.ts index a4bdc1e..85420e8 100644 --- a/src/commands/queue.ts +++ b/src/commands/queue.ts @@ -17,7 +17,7 @@ export default class implements Command { public aliases = ['q']; public examples = [ ['queue', 'shows current queue'], - ['queue 2', 'shows second page of queue'] + ['queue 2', 'shows second page of queue'], ]; private readonly playerManager: PlayerManager; diff --git a/src/commands/seek.ts b/src/commands/seek.ts index ae064ef..5578aca 100644 --- a/src/commands/seek.ts +++ b/src/commands/seek.ts @@ -14,7 +14,7 @@ export default class implements Command { public examples = [ ['seek 10', 'seeks to 10 seconds from beginning of song'], ['seek 1:30', 'seeks to 1 minute and 30 seconds from beginning of song'], - ['seek 1:00:00', 'seeks to 1 hour from beginning of song'] + ['seek 1:00:00', 'seeks to 1 hour from beginning of song'], ]; public requiresVC = true; diff --git a/src/commands/shortcuts.ts b/src/commands/shortcuts.ts index 57ed245..109d5fc 100644 --- a/src/commands/shortcuts.ts +++ b/src/commands/shortcuts.ts @@ -12,7 +12,7 @@ export default class implements Command { ['shortcuts', 'show all shortcuts'], ['shortcuts set s skip', 'aliases `s` to `skip`'], ['shortcuts set party play https://www.youtube.com/watch?v=zK6oOJ1wz8k', 'aliases `party` to a specific play command'], - ['shortcuts delete party', 'removes the `party` shortcut'] + ['shortcuts delete party', 'removes the `party` shortcut'], ]; public async execute(msg: Message, args: string []): Promise { diff --git a/src/commands/shuffle.ts b/src/commands/shuffle.ts index 0f1d832..d50f0b3 100644 --- a/src/commands/shuffle.ts +++ b/src/commands/shuffle.ts @@ -10,7 +10,7 @@ export default class implements Command { public name = 'shuffle'; public aliases = []; public examples = [ - ['shuffle', 'shuffles the current queue'] + ['shuffle', 'shuffles the current queue'], ]; public requiresVC = true; diff --git a/src/commands/skip.ts b/src/commands/skip.ts index 7330888..4bab307 100644 --- a/src/commands/skip.ts +++ b/src/commands/skip.ts @@ -12,7 +12,7 @@ export default class implements Command { public aliases = ['s']; public examples = [ ['skip', 'skips the current song'], - ['skip 2', 'skips the next 2 songs'] + ['skip 2', 'skips the next 2 songs'], ]; public requiresVC = true; diff --git a/src/commands/unskip.ts b/src/commands/unskip.ts index 9444b8e..a453448 100644 --- a/src/commands/unskip.ts +++ b/src/commands/unskip.ts @@ -10,7 +10,7 @@ export default class implements Command { public name = 'unskip'; public aliases = ['back']; public examples = [ - ['unskip', 'goes back in the queue by one song'] + ['unskip', 'goes back in the queue by one song'], ]; public requiresVC = true; diff --git a/src/events/guild-create.ts b/src/events/guild-create.ts index 9b8bb34..3bcf281 100644 --- a/src/events/guild-create.ts +++ b/src/events/guild-create.ts @@ -1,4 +1,4 @@ -import {Guild, TextChannel, Message} from 'discord.js'; +import {Guild, TextChannel, Message, MessageReaction, User} from 'discord.js'; import emoji from 'node-emoji'; import pEvent from 'p-event'; import {Settings} from '../models/index.js'; @@ -31,7 +31,7 @@ export default async (guild: Guild): Promise => { emojiChannels.push({ name: channel.name, id: channelId, - emoji: emoji.random().emoji + emoji: emoji.random().emoji, }); } } @@ -52,16 +52,12 @@ export default async (guild: Guild): Promise => { }); // Wait for response from user - const [choice] = await pEvent(guild.client, 'messageReactionAdd', { multiArgs: true, - filter: options => { - const [reaction, user] = options; - return sentMessageIds.includes(reaction.message.id) && user.id === owner.id; - } + filter: ([reaction, user]: [MessageReaction, User]) => sentMessageIds.includes(reaction.message.id) && user.id === owner.id, }); - const chosenChannel = emojiChannels.find(e => e.emoji === choice.emoji.name) as EmojiChannel; + const chosenChannel = emojiChannels.find(e => e.emoji === (choice as unknown as MessageReaction).emoji.name)!; // Second setup step (get prefix) let secondStep = `👍 Cool, I'll listen to **#${chosenChannel.name}** \n\n`; diff --git a/src/inversify.config.ts b/src/inversify.config.ts index 1aa367d..00a2507 100644 --- a/src/inversify.config.ts +++ b/src/inversify.config.ts @@ -30,7 +30,7 @@ import Unskip from './commands/unskip.js'; import ThirdParty from './services/third-party.js'; import CacheProvider from './services/cache.js'; -let container = new Container(); +const container = new Container(); // Bot container.bind(TYPES.Bot).to(Bot).inSingletonScope(); @@ -57,7 +57,7 @@ container.bind(TYPES.Services.NaturalLanguage).to(NaturalLangua Shortcuts, Shuffle, Skip, - Unskip + Unskip, ].forEach(command => { container.bind(TYPES.Command).to(command).inSingletonScope(); }); diff --git a/src/models/index.ts b/src/models/index.ts index b0cd909..fec0c8e 100644 --- a/src/models/index.ts +++ b/src/models/index.ts @@ -5,5 +5,5 @@ import Shortcut from './shortcut.js'; export { Cache, Settings, - Shortcut + Shortcut, }; diff --git a/src/services/cache.ts b/src/services/cache.ts index d76eab9..8d962b8 100644 --- a/src/services/cache.ts +++ b/src/services/cache.ts @@ -22,7 +22,7 @@ export default class CacheProvider { const { key = JSON.stringify(functionArgs), - expiresIn + expiresIn, } = options[options.length - 1] as Options; const cachedResult = await Cache.findByPk(key); @@ -30,7 +30,7 @@ export default class CacheProvider { if (cachedResult) { if (new Date() < cachedResult.expiresAt) { debug(`Cache hit: ${key}`); - return JSON.parse(cachedResult.value); + return JSON.parse(cachedResult.value) as F; } await cachedResult.destroy(); @@ -44,7 +44,7 @@ export default class CacheProvider { await Cache.upsert({ key, value: JSON.stringify(result), - expiresAt: futureTimeToDate(expiresIn) + expiresAt: futureTimeToDate(expiresIn), }); return result; diff --git a/src/services/config.ts b/src/services/config.ts index 80b4a81..759a27a3 100644 --- a/src/services/config.ts +++ b/src/services/config.ts @@ -11,7 +11,7 @@ const CONFIG_MAP = { SPOTIFY_CLIENT_ID: process.env.SPOTIFY_CLIENT_ID, SPOTIFY_CLIENT_SECRET: process.env.SPOTIFY_CLIENT_SECRET, DATA_DIR, - CACHE_DIR: path.join(DATA_DIR, 'cache') + CACHE_DIR: path.join(DATA_DIR, 'cache'), } as const; @injectable() diff --git a/src/services/get-songs.ts b/src/services/get-songs.ts index e02c837..a624d54 100644 --- a/src/services/get-songs.ts +++ b/src/services/get-songs.ts @@ -42,17 +42,17 @@ export default class { this.ytsrQueue = new PQueue({concurrency: 4}); } - async youtubeVideoSearch(query: string): Promise { + async youtubeVideoSearch(query: string): Promise { try { const {items} = await this.ytsrQueue.add(async () => this.cache.wrap( ytsr, query, { - limit: 10 + limit: 10, }, { - expiresIn: ONE_HOUR_IN_SECONDS - } + expiresIn: ONE_HOUR_IN_SECONDS, + }, )); let firstVideo: Video | undefined; @@ -74,14 +74,14 @@ export default class { } } - async youtubeVideo(url: string): Promise { + async youtubeVideo(url: string): Promise { try { const videoDetails = await this.cache.wrap( this.youtube.videos.get, cleanUrl(url), { - expiresIn: ONE_HOUR_IN_SECONDS - } + expiresIn: ONE_HOUR_IN_SECONDS, + }, ); return { @@ -90,7 +90,7 @@ export default class { length: toSeconds(parse(videoDetails.contentDetails.duration)), url: videoDetails.id, playlist: null, - isLive: videoDetails.snippet.liveBroadcastContent === 'live' + isLive: videoDetails.snippet.liveBroadcastContent === 'live', }; } catch (_: unknown) { return null; @@ -103,8 +103,8 @@ export default class { this.youtube.playlists.get, listId, { - expiresIn: ONE_MINUTE_IN_SECONDS - } + expiresIn: ONE_MINUTE_IN_SECONDS, + }, ); interface VideoDetailsResponse { @@ -128,8 +128,8 @@ export default class { listId, {maxResults: '50', pageToken: nextToken}, { - expiresIn: ONE_MINUTE_IN_SECONDS - } + expiresIn: ONE_MINUTE_IN_SECONDS, + }, ); nextToken = nextPageToken; @@ -140,22 +140,20 @@ export default class { videoDetailsPromises.push((async () => { // Unfortunately, package doesn't provide a method for this const {items: videoDetailItems} = await this.cache.wrap( - () => { - return got( - 'https://www.googleapis.com/youtube/v3/videos', - { - searchParams: { - part: 'contentDetails', - id: items.map(item => item.contentDetails.videoId).join(','), - key: this.youtubeKey, - responseType: 'json' - } - } - ).json(); - }, + async () => got( + 'https://www.googleapis.com/youtube/v3/videos', + { + searchParams: { + part: 'contentDetails', + id: items.map(item => item.contentDetails.videoId).join(','), + key: this.youtubeKey, + responseType: 'json', + }, + }, + ).json() as Promise<{items: VideoDetailsResponse[]}>, { - expiresIn: ONE_MINUTE_IN_SECONDS - } + expiresIn: ONE_MINUTE_IN_SECONDS, + }, ); videoDetails.push(...videoDetailItems); @@ -168,9 +166,9 @@ export default class { const songsToReturn: QueuedSongWithoutChannel[] = []; - for (let video of playlistVideos) { + for (const video of playlistVideos) { try { - const length = toSeconds(parse(videoDetails.find((i: { id: string }) => i.id === video.contentDetails.videoId)!.contentDetails.duration)); + const length = toSeconds(parse(videoDetails.find((i: {id: string}) => i.id === video.contentDetails.videoId)!.contentDetails.duration)); songsToReturn.push({ title: video.snippet.title, @@ -178,7 +176,7 @@ export default class { length, url: video.contentDetails.videoId, playlist: queuedPlaylist, - isLive: false + isLive: false, }); } catch (_: unknown) { // Private and deleted videos are sometimes in playlists, duration of these is not returned and they should not be added to the queue. @@ -220,7 +218,7 @@ export default class { // eslint-disable-next-line no-await-in-loop ({body: tracksResponse} = await this.spotify.getPlaylistTracks(uri.id, { limit: parseInt(new URL(tracksResponse.next).searchParams.get('limit') ?? '50', 10), - offset: parseInt(new URL(tracksResponse.next).searchParams.get('offset') ?? '0', 10) + offset: parseInt(new URL(tracksResponse.next).searchParams.get('offset') ?? '0', 10), })); tracks.push(...tracksResponse.items.map(playlistItem => playlistItem.track)); diff --git a/src/services/natural-language-commands.ts b/src/services/natural-language-commands.ts index 39e547d..1401eac 100644 --- a/src/services/natural-language-commands.ts +++ b/src/services/natural-language-commands.ts @@ -31,8 +31,8 @@ export default class { length: 204, playlist: null, isLive: false, - addedInChannelId: msg.channel.id - }, 8, 10) + addedInChannelId: msg.channel.id, + }, 8, 10), ]); return true; @@ -48,8 +48,8 @@ export default class { length: 385, playlist: null, isLive: false, - addedInChannelId: msg.channel.id - }, 358, 5.5) + addedInChannelId: msg.channel.id, + }, 358, 5.5), ]); return true; @@ -65,8 +65,8 @@ export default class { length: 227, playlist: null, isLive: false, - addedInChannelId: msg.channel.id - }, 50, 13) + addedInChannelId: msg.channel.id, + }, 50, 13), ]); return true; diff --git a/src/services/player.ts b/src/services/player.ts index 8897597..a74cb37 100644 --- a/src/services/player.ts +++ b/src/services/player.ts @@ -26,7 +26,7 @@ export interface QueuedSong { export enum STATUS { PLAYING, - PAUSED + PAUSED, } export default class { @@ -368,7 +368,7 @@ export default class { '-reconnect_streamed', '1', '-reconnect_delay_max', - '5' + '5', ]); if (options.seek) { diff --git a/src/services/third-party.ts b/src/services/third-party.ts index 7958438..6eaf644 100644 --- a/src/services/third-party.ts +++ b/src/services/third-party.ts @@ -13,10 +13,11 @@ export default class ThirdParty { constructor(@inject(TYPES.Config) config: Config) { // Library is transpiled incorrectly + // eslint-disable-next-line this.youtube = new ((Youtube as any).default)(config.YOUTUBE_API_KEY); this.spotify = new SpotifyWebApi({ clientId: config.SPOTIFY_CLIENT_ID, - clientSecret: config.SPOTIFY_CLIENT_SECRET + clientSecret: config.SPOTIFY_CLIENT_SECRET, }); void this.refreshSpotifyToken(); diff --git a/src/types.ts b/src/types.ts index 776097f..8bcd684 100644 --- a/src/types.ts +++ b/src/types.ts @@ -6,10 +6,10 @@ export const TYPES = { Command: Symbol('Command'), ThirdParty: Symbol('ThirdParty'), Managers: { - Player: Symbol('PlayerManager') + Player: Symbol('PlayerManager'), }, Services: { GetSongs: Symbol('GetSongs'), - NaturalLanguage: Symbol('NaturalLanguage') - } + NaturalLanguage: Symbol('NaturalLanguage'), + }, }; diff --git a/src/utils/channels.ts b/src/utils/channels.ts index f46e469..4c5b6b0 100644 --- a/src/utils/channels.ts +++ b/src/utils/channels.ts @@ -25,7 +25,7 @@ export const getMemberVoiceChannel = (member?: GuildMember): [VoiceChannel, numb if (channel && channel.type === 'voice') { return [ channel, - getSizeWithoutBots(channel) + getSizeWithoutBots(channel), ]; } @@ -46,7 +46,7 @@ export const getMostPopularVoiceChannel = (guild: Guild): [VoiceChannel, number] voiceChannels.push({ channel: channel as VoiceChannel, - n: size + n: size, }); } } diff --git a/src/utils/db.ts b/src/utils/db.ts index 4a15875..be42013 100644 --- a/src/utils/db.ts +++ b/src/utils/db.ts @@ -8,5 +8,5 @@ export const sequelize = new Sequelize({ database: 'muse', storage: path.join(DATA_DIR, 'db.sqlite'), models: [Cache, Settings, Shortcut], - logging: false + logging: false, }); diff --git a/yarn.lock b/yarn.lock index b3c1236..4ff3fe3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -67,10 +67,10 @@ "@discordjs/node-pre-gyp" "^0.4.0" node-addon-api "^3.2.1" -"@eslint/eslintrc@^0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.2.tgz#f63d0ef06f5c0c57d76c4ab5f63d3835c51b0179" - integrity sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg== +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== dependencies: ajv "^6.12.4" debug "^4.1.1" @@ -82,6 +82,20 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" + integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== + "@nodelib/fs.scandir@2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" @@ -166,10 +180,10 @@ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a" integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A== -"@types/json-schema@^7.0.3": - version "7.0.7" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" - integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== +"@types/json-schema@^7.0.7": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== "@types/keyv@*": version "3.1.1" @@ -229,108 +243,73 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@^4.25.0": - version "4.25.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.25.0.tgz#d82657b6ab4caa4c3f888ff923175fadc2f31f2a" - integrity sha512-Qfs3dWkTMKkKwt78xp2O/KZQB8MPS1UQ5D3YW2s6LQWBE1074BE+Rym+b1pXZIX3M3fSvPUDaCvZLKV2ylVYYQ== +"@typescript-eslint/eslint-plugin@^4.31.1": + version "4.31.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.1.tgz#e938603a136f01dcabeece069da5fb2e331d4498" + integrity sha512-UDqhWmd5i0TvPLmbK5xY3UZB0zEGseF+DHPghZ37Sb83Qd3p8ujhvAtkU4OF46Ka5Pm5kWvFIx0cCTBFKo0alA== dependencies: - "@typescript-eslint/experimental-utils" "4.25.0" - "@typescript-eslint/scope-manager" "4.25.0" - debug "^4.1.1" + "@typescript-eslint/experimental-utils" "4.31.1" + "@typescript-eslint/scope-manager" "4.31.1" + debug "^4.3.1" functional-red-black-tree "^1.0.1" - lodash "^4.17.15" - regexpp "^3.0.0" - semver "^7.3.2" - tsutils "^3.17.1" + regexpp "^3.1.0" + semver "^7.3.5" + tsutils "^3.21.0" -"@typescript-eslint/experimental-utils@4.25.0": - version "4.25.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.25.0.tgz#b2febcfa715d2c1806fd5f0335193a6cd270df54" - integrity sha512-f0doRE76vq7NEEU0tw+ajv6CrmPelw5wLoaghEHkA2dNLFb3T/zJQqGPQ0OYt5XlZaS13MtnN+GTPCuUVg338w== +"@typescript-eslint/experimental-utils@4.31.1": + version "4.31.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.1.tgz#0c900f832f270b88e13e51753647b02d08371ce5" + integrity sha512-NtoPsqmcSsWty0mcL5nTZXMf7Ei0Xr2MT8jWjXMVgRK0/1qeQ2jZzLFUh4QtyJ4+/lPUyMw5cSfeeME+Zrtp9Q== dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/scope-manager" "4.25.0" - "@typescript-eslint/types" "4.25.0" - "@typescript-eslint/typescript-estree" "4.25.0" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" + "@types/json-schema" "^7.0.7" + "@typescript-eslint/scope-manager" "4.31.1" + "@typescript-eslint/types" "4.31.1" + "@typescript-eslint/typescript-estree" "4.31.1" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" -"@typescript-eslint/parser@^4.26.1": - version "4.26.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.26.1.tgz#cecfdd5eb7a5c13aabce1c1cfd7fbafb5a0f1e8e" - integrity sha512-q7F3zSo/nU6YJpPJvQveVlIIzx9/wu75lr6oDbDzoeIRWxpoc/HQ43G4rmMoCc5my/3uSj2VEpg/D83LYZF5HQ== +"@typescript-eslint/parser@^4.31.1": + version "4.31.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.31.1.tgz#8f9a2672033e6f6d33b1c0260eebdc0ddf539064" + integrity sha512-dnVZDB6FhpIby6yVbHkwTKkn2ypjVIfAR9nh+kYsA/ZL0JlTsd22BiDjouotisY3Irmd3OW1qlk9EI5R8GrvRQ== dependencies: - "@typescript-eslint/scope-manager" "4.26.1" - "@typescript-eslint/types" "4.26.1" - "@typescript-eslint/typescript-estree" "4.26.1" + "@typescript-eslint/scope-manager" "4.31.1" + "@typescript-eslint/types" "4.31.1" + "@typescript-eslint/typescript-estree" "4.31.1" debug "^4.3.1" -"@typescript-eslint/scope-manager@4.25.0": - version "4.25.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.25.0.tgz#9d86a5bcc46ef40acd03d85ad4e908e5aab8d4ca" - integrity sha512-2NElKxMb/0rya+NJG1U71BuNnp1TBd1JgzYsldsdA83h/20Tvnf/HrwhiSlNmuq6Vqa0EzidsvkTArwoq+tH6w== +"@typescript-eslint/scope-manager@4.31.1": + version "4.31.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.31.1.tgz#0c21e8501f608d6a25c842fcf59541ef4f1ab561" + integrity sha512-N1Uhn6SqNtU2XpFSkD4oA+F0PfKdWHyr4bTX0xTj8NRx1314gBDRL1LUuZd5+L3oP+wo6hCbZpaa1in6SwMcVQ== dependencies: - "@typescript-eslint/types" "4.25.0" - "@typescript-eslint/visitor-keys" "4.25.0" + "@typescript-eslint/types" "4.31.1" + "@typescript-eslint/visitor-keys" "4.31.1" -"@typescript-eslint/scope-manager@4.26.1": - version "4.26.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.26.1.tgz#075a74a15ff33ee3a7ed33e5fce16ee86689f662" - integrity sha512-TW1X2p62FQ8Rlne+WEShyd7ac2LA6o27S9i131W4NwDSfyeVlQWhw8ylldNNS8JG6oJB9Ha9Xyc+IUcqipvheQ== +"@typescript-eslint/types@4.31.1": + version "4.31.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.31.1.tgz#5f255b695627a13401d2fdba5f7138bc79450d66" + integrity sha512-kixltt51ZJGKENNW88IY5MYqTBA8FR0Md8QdGbJD2pKZ+D5IvxjTYDNtJPDxFBiXmka2aJsITdB1BtO1fsgmsQ== + +"@typescript-eslint/typescript-estree@4.31.1": + version "4.31.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.1.tgz#4a04d5232cf1031232b7124a9c0310b577a62d17" + integrity sha512-EGHkbsUvjFrvRnusk6yFGqrqMBTue5E5ROnS5puj3laGQPasVUgwhrxfcgkdHNFECHAewpvELE1Gjv0XO3mdWg== dependencies: - "@typescript-eslint/types" "4.26.1" - "@typescript-eslint/visitor-keys" "4.26.1" - -"@typescript-eslint/types@4.25.0": - version "4.25.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.25.0.tgz#0e444a5c5e3c22d7ffa5e16e0e60510b3de5af87" - integrity sha512-+CNINNvl00OkW6wEsi32wU5MhHti2J25TJsJJqgQmJu3B3dYDBcmOxcE5w9cgoM13TrdE/5ND2HoEnBohasxRQ== - -"@typescript-eslint/types@4.26.1": - version "4.26.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.26.1.tgz#9e7c523f73c34b04a765e4167ca5650436ef1d38" - integrity sha512-STyMPxR3cS+LaNvS8yK15rb8Y0iL0tFXq0uyl6gY45glyI7w0CsyqyEXl/Fa0JlQy+pVANeK3sbwPneCbWE7yg== - -"@typescript-eslint/typescript-estree@4.25.0": - version "4.25.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.25.0.tgz#942e4e25888736bff5b360d9b0b61e013d0cfa25" - integrity sha512-1B8U07TGNAFMxZbSpF6jqiDs1cVGO0izVkf18Q/SPcUAc9LhHxzvSowXDTvkHMWUVuPpagupaW63gB6ahTXVlg== - dependencies: - "@typescript-eslint/types" "4.25.0" - "@typescript-eslint/visitor-keys" "4.25.0" - debug "^4.1.1" - globby "^11.0.1" - is-glob "^4.0.1" - semver "^7.3.2" - tsutils "^3.17.1" - -"@typescript-eslint/typescript-estree@4.26.1": - version "4.26.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.26.1.tgz#b2ce2e789233d62283fae2c16baabd4f1dbc9633" - integrity sha512-l3ZXob+h0NQzz80lBGaykdScYaiEbFqznEs99uwzm8fPHhDjwaBFfQkjUC/slw6Sm7npFL8qrGEAMxcfBsBJUg== - dependencies: - "@typescript-eslint/types" "4.26.1" - "@typescript-eslint/visitor-keys" "4.26.1" + "@typescript-eslint/types" "4.31.1" + "@typescript-eslint/visitor-keys" "4.31.1" debug "^4.3.1" globby "^11.0.3" is-glob "^4.0.1" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/visitor-keys@4.25.0": - version "4.25.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.25.0.tgz#863e7ed23da4287c5b469b13223255d0fde6aaa7" - integrity sha512-AmkqV9dDJVKP/TcZrbf6s6i1zYXt5Hl8qOLrRDTFfRNae4+LB8A4N3i+FLZPW85zIxRy39BgeWOfMS3HoH5ngg== +"@typescript-eslint/visitor-keys@4.31.1": + version "4.31.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.1.tgz#f2e7a14c7f20c4ae07d7fc3c5878c4441a1da9cc" + integrity sha512-PCncP8hEqKw6SOJY+3St4LVtoZpPPn+Zlpm7KW5xnviMhdqcsBty4Lsg4J/VECpJjw1CkROaZhH4B8M1OfnXTQ== dependencies: - "@typescript-eslint/types" "4.25.0" - eslint-visitor-keys "^2.0.0" - -"@typescript-eslint/visitor-keys@4.26.1": - version "4.26.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.26.1.tgz#0d55ea735cb0d8903b198017d6d4f518fdaac546" - integrity sha512-IGouNSSd+6x/fHtYRyLOM6/C+QxMDzWlDtN41ea+flWuSF9g02iqcIlX8wM53JkfljoIjP0U+yp7SiTS1onEkw== - dependencies: - "@typescript-eslint/types" "4.26.1" + "@typescript-eslint/types" "4.31.1" eslint-visitor-keys "^2.0.0" abbrev@1: @@ -1023,19 +1002,21 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-xo-typescript@^0.36.0: - version "0.36.0" - resolved "https://registry.yarnpkg.com/eslint-config-xo-typescript/-/eslint-config-xo-typescript-0.36.0.tgz#4161d6342198c176f7264e76fc5fab20dfcc021e" - integrity sha512-wze9CboL9XHj4KRfqFedXjsJ9yM7iiJJnnVgiXJWdwzPXewFfdIUWHQVRoEYjGZ94cA8kVBkKnTCp8pi3EU3HQ== +eslint-config-xo-typescript@^0.44.0: + version "0.44.0" + resolved "https://registry.yarnpkg.com/eslint-config-xo-typescript/-/eslint-config-xo-typescript-0.44.0.tgz#972285f401ea6b26c5802e177431de8b15851b0f" + integrity sha512-/mRj2KHHwnl3ZyM8vn68NSfRoEunkSYagWERGmNnU5UOLo4AY9jjBNZW+/sDOaPYuc5xzYmLxYspDCVCXKLGNQ== + dependencies: + typescript ">=4.3" -eslint-config-xo@^0.35.0: - version "0.35.0" - resolved "https://registry.yarnpkg.com/eslint-config-xo/-/eslint-config-xo-0.35.0.tgz#8b5afca244c44129c32386c28602f973ad5cb762" - integrity sha512-+WyZTLWUJlvExFrBU/Ldw8AB/S0d3x+26JQdBWbcqig2ZaWh0zinYcHok+ET4IoPaEcRRf3FE9kjItNVjBwnAg== +eslint-config-xo@^0.38.0: + version "0.38.0" + resolved "https://registry.yarnpkg.com/eslint-config-xo/-/eslint-config-xo-0.38.0.tgz#50cbe676a90d5582e1bbf1de750286e7cf09378e" + integrity sha512-G2jL+VyfkcZW8GoTmqLsExvrWssBedSoaQQ11vyhflDeT3csMdBVp0On+AVijrRuvgmkWeDwwUL5Rj0qDRHK6g== dependencies: confusing-browser-globals "1.0.10" -eslint-scope@^5.0.0, eslint-scope@^5.1.1: +eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -1043,13 +1024,20 @@ eslint-scope@^5.0.0, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^2.0.0, eslint-utils@^2.1.0: +eslint-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: eslint-visitor-keys "^1.1.0" +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" @@ -1060,13 +1048,14 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint@^7.28.0: - version "7.28.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.28.0.tgz#435aa17a0b82c13bb2be9d51408b617e49c1e820" - integrity sha512-UMfH0VSjP0G4p3EWirscJEQ/cHqnT/iuH6oNZOB94nBjWbMnhGEPxsZm1eyIW0C/9jLI0Fow4W5DXLjEI7mn1g== +eslint@^7.32.0: + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== dependencies: "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.2" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -1440,7 +1429,7 @@ globals@^13.6.0, globals@^13.9.0: dependencies: type-fest "^0.20.2" -globby@^11.0.1, globby@^11.0.3: +globby@^11.0.3: version "11.0.3" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== @@ -2549,7 +2538,7 @@ reflect-metadata@^0.1.13: resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== -regexpp@^3.0.0, regexpp@^3.1.0: +regexpp@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== @@ -3081,7 +3070,7 @@ tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tsutils@^3.17.1, tsutils@^3.21.0: +tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== @@ -3129,10 +3118,10 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.4.tgz#3f85b986945bcf31071decdd96cf8bfa65f9dcbc" - integrity sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew== +typescript@>=4.3, typescript@^4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324" + integrity sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA== undefsafe@^2.0.3: version "2.0.3"