From d6ef3c869741ea97d1e3ec538b8613da244ab6c5 Mon Sep 17 00:00:00 2001 From: JandereDev Date: Wed, 13 Oct 2021 18:27:19 +0200 Subject: [PATCH] more testing in prod --- package.json | 5 +- src/bot/commands/debug.ts | 1 - src/bot/commands/moderator.ts | 66 ++++ src/bot/commands/warn.ts | 43 +++ src/bot/commands/warns.ts | 116 +++++++ src/bot/modules/antispam.ts | 30 +- src/bot/util.ts | 27 +- src/struct/ServerConfig.ts | 1 + src/struct/antispam/Infraction.ts | 13 + src/struct/antispam/InfractionType.ts | 9 + src/struct/antispam/ModerationAction.ts | 7 +- yarn-error.log | 391 ++++++++++++++++++++++++ yarn.lock | 148 +++++++++ 13 files changed, 848 insertions(+), 9 deletions(-) create mode 100644 src/bot/commands/moderator.ts create mode 100644 src/bot/commands/warn.ts create mode 100644 src/bot/commands/warns.ts create mode 100644 src/struct/antispam/Infraction.ts create mode 100644 src/struct/antispam/InfractionType.ts create mode 100644 yarn-error.log diff --git a/package.json b/package.json index 46456f4..bcc02da 100644 --- a/package.json +++ b/package.json @@ -14,11 +14,14 @@ "dependencies": { "@types/monk": "^6.0.0", "axios": "^0.22.0", + "dayjs": "^1.10.7", "dotenv": "^10.0.0", + "form-data": "^4.0.0", "log75": "2.0.1", "monk": "^7.3.4", "revolt.js": "^5.1.0-alpha.6", - "ulid": "^2.3.0" + "ulid": "^2.3.0", + "xlsx": "^0.17.3" }, "devDependencies": { "typescript": "^4.4.3" diff --git a/src/bot/commands/debug.ts b/src/bot/commands/debug.ts index 3c76218..b78bbb9 100644 --- a/src/bot/commands/debug.ts +++ b/src/bot/commands/debug.ts @@ -1,6 +1,5 @@ import Command from "../../struct/Command"; import { Message } from "revolt.js/dist/maps/Messages"; -import { hasPerm } from "../util"; export default { name: 'debug', diff --git a/src/bot/commands/moderator.ts b/src/bot/commands/moderator.ts new file mode 100644 index 0000000..6bd2f7d --- /dev/null +++ b/src/bot/commands/moderator.ts @@ -0,0 +1,66 @@ +import Command from "../../struct/Command"; +import { Message } from "revolt.js/dist/maps/Messages"; +import { isBotManager, NO_MANAGER_MSG, parseUser } from "../util"; +import ServerConfig from "../../struct/ServerConfig"; +import { client } from "../.."; +import { User } from "revolt.js/dist/maps/Users"; + +const SYNTAX = '/mod add @user; /mod remove @user; /mod list'; + +// yes this is bot_manager.ts copypasted + +export default { + name: 'moderator', + aliases: [ 'moderators', 'mod', 'mods' ], + description: 'Allow users to moderate other users', + syntax: SYNTAX, + run: async (message: Message, args: string[]) => { + if (!await isBotManager(message.member!)) return message.reply(NO_MANAGER_MSG); + + let config: ServerConfig = (await client.db.get('servers').findOne({ id: message.channel?.server_id })) ?? {}; + let mods = config.moderators ?? []; + let user: User|null; + + switch(args[0]?.toLowerCase()) { + case 'add': + case 'new': + if (!args[1]) return message.reply('No user specified.'); + user = await parseUser(args[1]); + if (!user) return message.reply('I can\'t find that user.'); + + if (mods.indexOf(user._id) > -1) return message.reply('This user is already added as moderator.'); + + mods.push(user._id); + await client.db.get('servers').update({ id: message.channel?.server_id }, { $set: { moderators: mods } }); + + message.reply(`✅ Added \`@${user.username}\` to moderators.`); + break; + case 'remove': + case 'delete': + case 'rm': + case 'del': + if (!args[1]) return message.reply('No user specified.'); + user = await parseUser(args[1]); + if (!user) return message.reply('I can\'t find that user.'); + + if (mods.indexOf(user._id) == -1) return message.reply('This user is not added as moderator.'); + + mods = mods.filter(a => a != user?._id); + await client.db.get('servers').update({ id: message.channel?.server_id }, { $set: { moderators: mods } }); + + message.reply(`✅ Removed \`@${user.username}\` from moderators.`); + break; + case 'list': + case 'ls': + case 'show': + message.reply(`# Moderators\n` + + `Bot admins can add or remove moderators.\n\n` + + `${mods.map(a => `* <@${a}>`).join('\n')}\n\n` + + `${mods.length} user${mods.length == 1 ? '' : 's'}.`) + ?.catch(e => message.reply(e)); + break; + default: + message.reply(`Available subcommands: ${SYNTAX}`); + } + } +} as Command; diff --git a/src/bot/commands/warn.ts b/src/bot/commands/warn.ts new file mode 100644 index 0000000..633ed85 --- /dev/null +++ b/src/bot/commands/warn.ts @@ -0,0 +1,43 @@ +import Command from "../../struct/Command"; +import { Message } from "revolt.js/dist/maps/Messages"; +import { isModerator, NO_MANAGER_MSG, parseUser, storeInfraction } from "../util"; +import Infraction from "../../struct/antispam/Infraction"; +import { ulid } from "ulid"; +import InfractionType from "../../struct/antispam/InfractionType"; + +export default { + name: 'warn', + aliases: null, + removeEmptyArgs: false, + description: 'add an infraction to an user\'s record', + run: async (message: Message, args: string[]) => { + if (!await isModerator(message.member!)) return message.reply(NO_MANAGER_MSG); + let user = await parseUser(args.shift() ?? ''); + if (!user) return message.reply('I can\'t find that user.'); + if (user.bot != null) return message.reply('You cannot warn bots.'); + + let reason: string = args.join(' ') + ?.replace(new RegExp('`', 'g'), '\'') + ?.replace(new RegExp('\n', 'g'), ' ') + || 'No reason provided.'; + if (reason.length > 200) return message.reply('Warn reason may not be longer than 200 characters.'); + + let infraction = { + _id: ulid(), + createdBy: message.author_id, + user: user._id, + reason: reason, + server: message.channel?.server_id!, + type: InfractionType.Manual, + date: Date.now(), + } as Infraction; + + let { userWarnCount } = await storeInfraction(infraction); + + await message.reply(`## User warned.\n` + + `This is ${userWarnCount == 1 ? '**the first warn**' : `warn number **${userWarnCount}**`}` + + ` for ${user.username ?? 'this user'}.\n` + + `**Infraction ID:** \`${infraction._id}\`\n` + + `**Reason:** \`${infraction.reason}\``); + } +} as Command; diff --git a/src/bot/commands/warns.ts b/src/bot/commands/warns.ts new file mode 100644 index 0000000..6474313 --- /dev/null +++ b/src/bot/commands/warns.ts @@ -0,0 +1,116 @@ +import Command from "../../struct/Command"; +import { Message } from "revolt.js/dist/maps/Messages"; +import { client } from "../.."; +import Infraction from "../../struct/antispam/Infraction"; +import InfractionType from "../../struct/antispam/InfractionType"; +import { isModerator, parseUser } from "../util"; +import Day from 'dayjs'; +import RelativeTime from 'dayjs/plugin/relativeTime'; +import Xlsx from 'xlsx'; +import FormData from 'form-data'; +import axios from "axios"; + +Day.extend(RelativeTime); + +export default { + name: 'warns', + aliases: [ 'warnings', 'infractions', 'infraction' ], + description: 'Show all user infractions', + syntax: '/warns; /warns @username; /warns @username export-csv', + run: async (message: Message, args: string[]) => { + if (!await isModerator(message.member!)) return; + + let collection = client.db.get('infractions'); + let infractions: Array = await collection.find({ + server: message.channel?.server_id, + }); + let userInfractions: Map = new Map(); + infractions.forEach(i => { + if (!userInfractions.get(i.user)) userInfractions.set(i.user, [ i ]); + else userInfractions.set(i.user, [ i, ...userInfractions.get(i.user)! ]); + }); + + if (!args[0]) { + // Show top most warned users + let msg = `## Most warned users in ${message.channel?.server?.name ?? 'this server'}\n\u200b\n`; + for (let inf of Array.from(userInfractions.values()).sort((a, b) => b.length - a.length).slice(0, 9)) { + inf = inf.sort((a, b) => b.date - a.date); + msg += `**${await fetchUsername(inf[0].user)}** (${inf[0].user}): **${inf.length}** infractions\n`; + msg += `\u200b \u200b \u200b \u200b \u200b ↳ Most recent warning: \`${inf[0].reason}\` ` + + `${inf[0].type == InfractionType.Manual && `(${await fetchUsername(inf[0].createdBy ?? '')})`}\n`; + }; + + message.reply(msg.substr(0, 1999)); + } else { + let user = await parseUser(args[0]); + if (!user) return message.reply('Unknown user'); + + let infs = userInfractions.get(user._id); + if (!infs) return message.reply(`There are no infractions stored for \`@${user.username}\`.`); + else { + let msg = `## ${infs.length} infractions stored for @${user.username}\n\u200b\n`; + let attachSpreadsheet = false; + for (const i in infs) { console.log(i) + let inf = infs[i]; + let toAdd = ''; + toAdd += `#${Number(i)+1}: \`${inf.reason}\` (${inf.type == InfractionType.Manual ? await fetchUsername(inf.createdBy!) : 'System'})\n`; + toAdd += `\u200b \u200b \u200b \u200b \u200b ↳ ${Day(inf.date).fromNow()} (Infraction ID: \`${inf._id}\`)\n`; + + if ((msg + toAdd).length > 1900 || Number(i) > 5) { + msg += `\u200b\n[${infs.length - Number(i) + 1} more, check attached file]`; + attachSpreadsheet = true; + break; + } + else msg += toAdd; + } + + if (args[1]?.toLowerCase() == 'export-csv' || + args[1]?.toLowerCase() == 'csv' || + args[1]?.toLowerCase() == 'export') attachSpreadsheet = true; + + if (attachSpreadsheet) { + try { + let csv_data = [ + [`Warns for @${user.username} (${user._id}) - ${Day().toString()}`], + [], + ['Date', 'Reason', 'Created By', 'Type', 'ID'], + ]; + + for (const inf of infs) { + csv_data.push([ + Day(inf.date).toString(), + inf.reason, + inf.type == InfractionType.Manual ? `${await fetchUsername(inf.createdBy!)} (${inf.createdBy})` : 'SYSTEM', + inf.type == InfractionType.Automatic ? 'Automatic' : 'Manual', + inf._id, + ]); + } + + let sheet = Xlsx.utils.aoa_to_sheet(csv_data); + + let csv = Xlsx.utils.sheet_to_csv(sheet); + + let apiConfig: any = (await axios.get(client.apiURL)).data; + let autumnURL = apiConfig.features.autumn.url; + + let data = new FormData(); + data.append("file", csv, { filename: `${user._id}.csv` }); + + let req = await axios.post(autumnURL + '/attachments', data, { headers: data.getHeaders() }); + message.reply({ content: msg, attachments: [ (req.data as any)['id'] as string ] }); + } catch(e) { + console.error(e); + message.reply(msg); + } + } else message.reply(msg); + } + } + } +} as Command; + +let fetchUsername = async (id: string) => { + try { + let u = await client.users.fetch(id); + return `@${u.username}`; + } catch(e) { return 'Unknown user' } +} diff --git a/src/bot/modules/antispam.ts b/src/bot/modules/antispam.ts index 14c291b..5db9459 100644 --- a/src/bot/modules/antispam.ts +++ b/src/bot/modules/antispam.ts @@ -1,10 +1,13 @@ import { Message } from "revolt.js/dist/maps/Messages"; +import { ulid } from "ulid"; import { client } from "../.."; import AntispamRule from "../../struct/antispam/AntispamRule"; +import Infraction from "../../struct/antispam/Infraction"; +import InfractionType from "../../struct/antispam/InfractionType"; import ModerationAction from "../../struct/antispam/ModerationAction"; import ServerConfig from "../../struct/ServerConfig"; import logger from "../logger"; -import { isBotManager } from "../util"; +import { isBotManager, isModerator, storeInfraction } from "../util"; let msgCountStore: Map = new Map(); @@ -27,7 +30,7 @@ async function antispam(message: Message): Promise { if (message.author?.bot != null) break; if (serverRules.whitelist?.users?.includes(message.author_id)) break; if (message.member?.roles?.filter(r => serverRules.whitelist?.roles?.includes(r)).length) break; - if (serverRules.whitelist?.managers !== false && await isBotManager(message.member!)) break; + if (serverRules.whitelist?.managers !== false && await isModerator(message.member!)) break; if (rule.channels?.indexOf(message.channel_id) == -1) break; let store = msgCountStore.get(rule.id)!; @@ -48,13 +51,34 @@ async function antispam(message: Message): Promise { message.delete() .catch(() => logger.warn('Antispam: Failed to delete message') ); break; - case ModerationAction.Warn: + case ModerationAction.Message: if (!userStore.warnTriggered) { userStore.warnTriggered = true; setTimeout(() => userStore.warnTriggered = false, 5000); message.channel?.sendMessage(getWarnMsg(rule, message)); } break; + case ModerationAction.Warn: + if (!userStore.warnTriggered) { + userStore.warnTriggered = true; + setTimeout(() => userStore.warnTriggered = false, 5000); + + let inf = { + _id: ulid(), + createdBy: null, + date: Date.now(), + reason: `Automatic moderation rule triggered: More than ${rule.max_msg} messages per ${rule.timeframe} seconds.` + + (rule.message ?? ''), + server: message.channel?.server_id, + type: InfractionType.Automatic, + user: message.author_id, + } as Infraction; + + let m = message.channel?.sendMessage('## User has been warned.\n\u200b\n' + getWarnMsg(rule, message)); + + await storeInfraction(inf); + } + break; case ModerationAction.Kick: message.reply('(Kick user)'); break; diff --git a/src/bot/util.ts b/src/bot/util.ts index 09e5574..60e02ab 100644 --- a/src/bot/util.ts +++ b/src/bot/util.ts @@ -1,6 +1,7 @@ import { Member } from "revolt.js/dist/maps/Members"; import { User } from "revolt.js/dist/maps/Users"; import { client } from ".."; +import Infraction from "../struct/antispam/Infraction"; import ServerConfig from "../struct/ServerConfig"; let ServerPermissions = { @@ -54,6 +55,12 @@ async function parseUser(text: string): Promise { } catch(e) { return null; } } +async function isModerator(member: Member) { + return hasPerm(member, 'KickMembers') + || await isBotManager(member) + || (((await client.db.get('servers').findOne({ id: member.server?._id }) || {}) as ServerConfig) + .moderators?.indexOf(member.user?._id!) ?? -1) > -1; +} async function isBotManager(member: Member) { return hasPerm(member, 'ManageServer') || (((await client.db.get('servers').findOne({ id: member.server?._id }) || {}) as ServerConfig) @@ -73,11 +80,29 @@ function hasPerm(member: Member, perm: 'View'|'ManageRoles'|'ManageChannels'|'M return !!(userPerm & p); } +async function storeInfraction(infraction: Infraction): Promise<{ userWarnCount: number }> { + let collection = client.db.get('infractions'); + let p = [ + collection.insert(infraction, { castIds: false }), + collection.find({ + server: infraction.server, + user: infraction.user, + _id: { $not: { $eq: infraction._id } } }, + ), + ]; + + let r = await Promise.all(p); + + return { userWarnCount: (r[1].length ?? 0) + 1 } +} + export { hasPerm, + isModerator, isBotManager, parseUser, + storeInfraction, NO_MANAGER_MSG, USER_MENTION_REGEX, - CHANNEL_MENTION_REGEX + CHANNEL_MENTION_REGEX, } diff --git a/src/struct/ServerConfig.ts b/src/struct/ServerConfig.ts index 1399132..fe1eade 100644 --- a/src/struct/ServerConfig.ts +++ b/src/struct/ServerConfig.ts @@ -6,6 +6,7 @@ class ServerConfig { spaceAfterPrefix: boolean | undefined; automodSettings: AutomodSettings | undefined; botManagers: string[] | undefined; + moderators: string[] | undefined; whitelist: { users: string[] | undefined, roles: string[] | undefined, diff --git a/src/struct/antispam/Infraction.ts b/src/struct/antispam/Infraction.ts new file mode 100644 index 0000000..5aa303e --- /dev/null +++ b/src/struct/antispam/Infraction.ts @@ -0,0 +1,13 @@ +import InfractionType from "./InfractionType"; + +class Infraction { + _id: string; + type: InfractionType; + user: string; + createdBy: string|null; + server: string; + reason: string; + date: number; +} + +export default Infraction; diff --git a/src/struct/antispam/InfractionType.ts b/src/struct/antispam/InfractionType.ts new file mode 100644 index 0000000..2f75e38 --- /dev/null +++ b/src/struct/antispam/InfractionType.ts @@ -0,0 +1,9 @@ +enum InfractionType { + // Infraction was created automatically by a moderation rule + Automatic = 0, + + // Infraction was created manually by a moderator using /warn + Manual = 1, +} + +export default InfractionType; diff --git a/src/struct/antispam/ModerationAction.ts b/src/struct/antispam/ModerationAction.ts index 4a0492a..6809049 100644 --- a/src/struct/antispam/ModerationAction.ts +++ b/src/struct/antispam/ModerationAction.ts @@ -1,8 +1,9 @@ enum ModerationAction { Delete = 0, - Warn = 1, - Kick = 2, - Ban = 3, + Message = 1, + Warn = 2, + Kick = 3, + Ban = 4, } export default ModerationAction; diff --git a/yarn-error.log b/yarn-error.log new file mode 100644 index 0000000..e9297cd --- /dev/null +++ b/yarn-error.log @@ -0,0 +1,391 @@ +Arguments: + /usr/bin/node /usr/bin/yarn add day.js + +PATH: + /home/jan/bin:/home/jan/.cargo/bin/:/usr/local/bin:/home/jan/bin:/home/jan/.cargo/bin/:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/var/lib/flatpak/exports/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/usr/lib/jvm/default/bin + +Yarn version: + 1.22.15 + +Node version: + 16.11.0 + +Platform: + linux x64 + +Trace: + Error: https://registry.yarnpkg.com/day.js: Not found + at Request.params.callback [as _callback] (/usr/lib/node_modules/yarn/lib/cli.js:67031:18) + at Request.self.callback (/usr/lib/node_modules/yarn/lib/cli.js:140885:22) + at Request.emit (node:events:390:28) + at Request. (/usr/lib/node_modules/yarn/lib/cli.js:141857:10) + at Request.emit (node:events:390:28) + at IncomingMessage. (/usr/lib/node_modules/yarn/lib/cli.js:141779:12) + at Object.onceWrapper (node:events:509:28) + at IncomingMessage.emit (node:events:402:35) + at endReadableNT (node:internal/streams/readable:1343:12) + at processTicksAndRejections (node:internal/process/task_queues:83:21) + +npm manifest: + { + "name": "revolt-automod", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "build": "rm -rf dist && tsc", + "start": "node dist/index", + "dev": "yarn build && yarn start" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@types/monk": "^6.0.0", + "axios": "^0.22.0", + "dotenv": "^10.0.0", + "log75": "2.0.1", + "monk": "^7.3.4", + "revolt.js": "^5.1.0-alpha.6", + "ulid": "^2.3.0" + }, + "devDependencies": { + "typescript": "^4.4.3" + } + } + +yarn manifest: + No manifest + +Lockfile: + # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. + # yarn lockfile v1 + + + "@types/bson@*": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@types/bson/-/bson-4.2.0.tgz#a2f71e933ff54b2c3bf267b67fa221e295a33337" + integrity sha512-ELCPqAdroMdcuxqwMgUpifQyRoTpyYCNr1V9xKyF40VsBobsj+BbWNRvwGchMgBPGqkw655ypkjj2MEF5ywVwg== + dependencies: + bson "*" + + "@types/mongodb@^3.5.25": + version "3.6.20" + resolved "https://registry.yarnpkg.com/@types/mongodb/-/mongodb-3.6.20.tgz#b7c5c580644f6364002b649af1c06c3c0454e1d2" + integrity sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ== + dependencies: + "@types/bson" "*" + "@types/node" "*" + + "@types/monk@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@types/monk/-/monk-6.0.0.tgz#236750988e24d92c674529a81b9a296f8bbc3763" + integrity sha512-9qy4Gva0uVgaQsDqlcWD+XOXUmgInPAoxyyoN8uFUTjNFvswyCH1hwpnYuh2MVr60ekZgYiquWEjBYvfYfE1Jw== + dependencies: + monk "*" + + "@types/node@*": + version "16.10.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.10.3.tgz#7a8f2838603ea314d1d22bb3171d899e15c57bd5" + integrity sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ== + + ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + + axios@^0.21.4: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + + axios@^0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.22.0.tgz#bf702c41fb50fbca4539589d839a077117b79b25" + integrity sha512-Z0U3uhqQeg1oNcihswf4ZD57O3NrR1+ZXhxaROaWpDmsDTx7T2HNBV2ulBtie2hwJptu8UvgnJoK+BIqdzh/1w== + dependencies: + follow-redirects "^1.14.4" + + base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + + bl@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.1.tgz#8c11a7b730655c5d56898cdc871224f40fd901d5" + integrity sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + + bson@*: + version "4.5.3" + resolved "https://registry.yarnpkg.com/bson/-/bson-4.5.3.tgz#de3783b357a407d935510beb1fbb285fef43bb06" + integrity sha512-qVX7LX79Mtj7B3NPLzCfBiCP6RAsjiV8N63DjlaVVpZW+PFoDTxQ4SeDbSpcqgE6mXksM5CAwZnXxxxn/XwC0g== + dependencies: + buffer "^5.6.0" + + bson@^1.1.4: + version "1.1.6" + resolved "https://registry.yarnpkg.com/bson/-/bson-1.1.6.tgz#fb819be9a60cd677e0853aee4ca712a785d6618a" + integrity sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg== + + buffer@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + + core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + + debug@*: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + + denque@^1.4.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.1.tgz#07f670e29c9a78f8faecb2566a1e2c11929c5cbf" + integrity sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw== + + dotenv@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== + + eventemitter3@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + + exponential-backoff@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.0.tgz#9409c7e579131f8bd4b32d7d8094a911040f2e68" + integrity sha512-oBuz5SYz5zzyuHINoe9ooePwSu0xApKWgeNzok4hZ5YKXFh9zrQBEM15CXqoZkJJPuI2ArvqjPQd8UKJA753XA== + + follow-redirects@^1.14.0, follow-redirects@^1.14.4: + version "1.14.4" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" + integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g== + + ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + + inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + + isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + + isomorphic-ws@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" + integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== + + lodash.defaultsdeep@^4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6" + integrity sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA== + + lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + + log75@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/log75/-/log75-2.0.1.tgz#dd0e2bd0935df0c4fd3984c2731e7eaa3034c635" + integrity sha512-yoG7E0Hh2izZaZAhqL2WbwJ0PIkNcuEV09vFsX5owebLl4/xSmTaEd3gUle/j2ivUbuv2toUeEcJKUSG/MAO+A== + dependencies: + ansi-colors "^4.1.1" + + memory-pager@^1.0.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" + integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== + + mobx@^6.3.2: + version "6.3.3" + resolved "https://registry.yarnpkg.com/mobx/-/mobx-6.3.3.tgz#a3006c56243b1c7ea4ee671a66f963b9f43cf1af" + integrity sha512-JoNU50rO6d1wHwKPJqKq4rmUMbYnI9CsJmBo+Cu4exBYenFvIN77LWrZENpzW6reZPADtXMmB1DicbDSfy8Clw== + + mongodb@^3.2.3: + version "3.7.2" + resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.7.2.tgz#d0d43b08ff1e5c13f4112175e321fa292cf35a3d" + integrity sha512-/Qi0LmOjzIoV66Y2JQkqmIIfFOy7ZKsXnQNlUXPFXChOw3FCdNqVD5zvci9ybm6pkMe/Nw+Rz9I0Zsk2a+05iQ== + dependencies: + bl "^2.2.1" + bson "^1.1.4" + denque "^1.4.1" + optional-require "^1.1.8" + safe-buffer "^5.1.2" + optionalDependencies: + saslprep "^1.0.0" + + monk-middleware-cast-ids@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/monk-middleware-cast-ids/-/monk-middleware-cast-ids-0.2.1.tgz#40c40e5a6cb33ccedc289220943275ee8861c529" + integrity sha1-QMQOWmyzPM7cKJIglDJ17ohhxSk= + + monk-middleware-fields@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/monk-middleware-fields/-/monk-middleware-fields-0.2.0.tgz#ff637af35f5948879ccb2be15a91360911bea6c1" + integrity sha1-/2N6819ZSIecyyvhWpE2CRG+psE= + + monk-middleware-handle-callback@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/monk-middleware-handle-callback/-/monk-middleware-handle-callback-0.2.2.tgz#47de6cc1248726c72a2be0c81bc4e68310c32146" + integrity sha512-5hBynb7asZ2uw9XVze7C3XH0zXT51yFDvYydk/5HnWWzh2NLglDSiKDcX0yLKPHzFgiq+5Z4Laq5fFVnFsmm8w== + + monk-middleware-options@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/monk-middleware-options/-/monk-middleware-options-0.2.1.tgz#58dae1c518d46636ebdff506fadfc773bb442886" + integrity sha1-WNrhxRjUZjbr3/UG+t/Hc7tEKIY= + + monk-middleware-query@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/monk-middleware-query/-/monk-middleware-query-0.2.0.tgz#a926c677d4a5620c62151b0a56d0c0c151675874" + integrity sha1-qSbGd9SlYgxiFRsKVtDAwVFnWHQ= + + monk-middleware-wait-for-connection@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/monk-middleware-wait-for-connection/-/monk-middleware-wait-for-connection-0.2.0.tgz#312958d30e588b57d09754dd7c97b4843316835a" + integrity sha1-MSlY0w5Yi1fQl1TdfJe0hDMWg1o= + + monk@*, monk@^7.3.4: + version "7.3.4" + resolved "https://registry.yarnpkg.com/monk/-/monk-7.3.4.tgz#50ccd7daebb4c16ace58d45b2c28c29112f8a85e" + integrity sha512-PkPNiElwroVyKQj01usyziOvwiKYBUVSq7YU1FB4KFr0J3v0GeXW0TebYsLR4u33WB8JGqPiAcuzDspfdujqQg== + dependencies: + "@types/mongodb" "^3.5.25" + debug "*" + mongodb "^3.2.3" + monk-middleware-cast-ids "^0.2.1" + monk-middleware-fields "^0.2.0" + monk-middleware-handle-callback "^0.2.0" + monk-middleware-options "^0.2.1" + monk-middleware-query "^0.2.0" + monk-middleware-wait-for-connection "^0.2.0" + object-assign "^4.1.1" + + ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + + object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + + optional-require@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/optional-require/-/optional-require-1.1.8.tgz#16364d76261b75d964c482b2406cb824d8ec44b7" + integrity sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA== + dependencies: + require-at "^1.0.6" + + process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + + readable-stream@^2.3.5: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + + require-at@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/require-at/-/require-at-1.0.6.tgz#9eb7e3c5e00727f5a4744070a7f560d4de4f6e6a" + integrity sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g== + + revolt.js@^5.1.0-alpha.6: + version "5.1.0-alpha.6" + resolved "https://registry.yarnpkg.com/revolt.js/-/revolt.js-5.1.0-alpha.6.tgz#bdd1c9f3bdd7e0f45e309a3e1fa5239138e1cb1a" + integrity sha512-XqdP24tGc+En9M8ccWkk74z/v2DBtH7OboTbFQBQTjWIT4fLMP/ox+GLdDVWSF7Zg6M/xPrMbg4oL/nP+xqZHQ== + dependencies: + axios "^0.21.4" + eventemitter3 "^4.0.7" + exponential-backoff "^3.1.0" + isomorphic-ws "^4.0.1" + lodash.defaultsdeep "^4.6.1" + lodash.isequal "^4.5.0" + mobx "^6.3.2" + ulid "^2.3.0" + ws "^8.2.2" + + safe-buffer@^5.1.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" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + + saslprep@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226" + integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag== + dependencies: + sparse-bitfield "^3.0.3" + + sparse-bitfield@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" + integrity sha1-/0rm5oZWBWuks+eSqzM004JzyhE= + dependencies: + memory-pager "^1.0.2" + + string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + + 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== + + ulid@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/ulid/-/ulid-2.3.0.tgz#93063522771a9774121a84d126ecd3eb9804071f" + integrity sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw== + + util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + + ws@^8.2.2: + version "8.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" + integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== diff --git a/yarn.lock b/yarn.lock index 3dab908..4b0596e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29,11 +29,31 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.10.3.tgz#7a8f2838603ea314d1d22bb3171d899e15c57bd5" integrity sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ== +adler-32@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/adler-32/-/adler-32-1.2.0.tgz#6a3e6bf0a63900ba15652808cb15c6813d1a5f25" + integrity sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU= + dependencies: + exit-on-epipe "~1.0.1" + printj "~1.1.0" + +adler-32@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/adler-32/-/adler-32-1.3.0.tgz#3cad1b71cdfa69f6c8a91f3e3615d31a4fdedc72" + integrity sha512-f5nltvjl+PRUh6YNfUstRaXwJxtfnKEWhAWWlmKvh+Y3J2+98a0KKVYDEhz6NdKGqswLhjNGznxfSsZGOvOd9g== + dependencies: + printj "~1.2.2" + ansi-colors@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + axios@^0.21.4: version "0.21.4" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" @@ -81,11 +101,50 @@ buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" +cfb@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/cfb/-/cfb-1.2.1.tgz#209429e4c68efd30641f6fc74b2d6028bd202402" + integrity sha512-wT2ScPAFGSVy7CY+aauMezZBnNrfnaLSrxHUHdea+Td/86vrk6ZquggV+ssBR88zNs0OnBkL2+lf9q0K+zVGzQ== + dependencies: + adler-32 "~1.3.0" + crc-32 "~1.2.0" + printj "~1.3.0" + +codepage@~1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/codepage/-/codepage-1.15.0.tgz#2e00519024b39424ec66eeb3ec07227e692618ab" + integrity sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA== + +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== + dependencies: + delayed-stream "~1.0.0" + +commander@~2.17.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== + core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +crc-32@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208" + integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA== + dependencies: + exit-on-epipe "~1.0.1" + printj "~1.1.0" + +dayjs@^1.10.7: + version "1.10.7" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.7.tgz#2cf5f91add28116748440866a0a1d26f3a6ce468" + integrity sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig== + debug@*: version "4.3.2" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" @@ -93,6 +152,11 @@ debug@*: dependencies: ms "2.1.2" +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + denque@^1.4.1: version "1.5.1" resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.1.tgz#07f670e29c9a78f8faecb2566a1e2c11929c5cbf" @@ -108,16 +172,40 @@ eventemitter3@^4.0.7: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +exit-on-epipe@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" + integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== + exponential-backoff@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.0.tgz#9409c7e579131f8bd4b32d7d8094a911040f2e68" integrity sha512-oBuz5SYz5zzyuHINoe9ooePwSu0xApKWgeNzok4hZ5YKXFh9zrQBEM15CXqoZkJJPuI2ArvqjPQd8UKJA753XA== +fflate@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.7.1.tgz#56e87e87c3f2fe01b025fbb1c4ea835990c02fa2" + integrity sha512-VYM2Xy1gSA5MerKzCnmmuV2XljkpKwgJBKezW+495TTnTCh1x5HcYa1aH8wRU/MfTGhW4ziXqgwprgQUVl3Ohw== + follow-redirects@^1.14.0, follow-redirects@^1.14.4: version "1.14.4" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g== +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +frac@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/frac/-/frac-1.1.2.tgz#3d74f7f6478c88a1b5020306d747dc6313c74d0b" + integrity sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA== + ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -160,6 +248,18 @@ memory-pager@^1.0.2: resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== +mime-db@1.50.0: + version "1.50.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f" + integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A== + +mime-types@^2.1.12: + version "2.1.33" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.33.tgz#1fa12a904472fafd068e48d9e8401f74d3f70edb" + integrity sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g== + dependencies: + mime-db "1.50.0" + mobx@^6.3.2: version "6.3.3" resolved "https://registry.yarnpkg.com/mobx/-/mobx-6.3.3.tgz#a3006c56243b1c7ea4ee671a66f963b9f43cf1af" @@ -241,6 +341,21 @@ optional-require@^1.1.8: dependencies: require-at "^1.0.6" +printj@~1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" + integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== + +printj@~1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/printj/-/printj-1.2.3.tgz#2cfb2b192a1e5385dbbe5b46658ac34aa828508a" + integrity sha512-sanczS6xOJOg7IKDvi4sGOUOe7c1tsEzjwlLFH/zgwx/uyImVM9/rgBkc8AfiQa/Vg54nRd8mkm9yI7WV/O+WA== + +printj@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/printj/-/printj-1.3.0.tgz#9018a918a790e43707f10625d6e10187a367cff6" + integrity sha512-017o8YIaz8gLhaNxRB9eBv2mWXI2CtzhPJALnQTP+OPpuUfP0RMWqr/mHCzqVeu1AQxfzSfAtAq66vKB8y7Lzg== + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -303,6 +418,13 @@ sparse-bitfield@^3.0.3: dependencies: memory-pager "^1.0.2" +ssf@~0.11.2: + version "0.11.2" + resolved "https://registry.yarnpkg.com/ssf/-/ssf-0.11.2.tgz#0b99698b237548d088fc43cdf2b70c1a7512c06c" + integrity sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g== + dependencies: + frac "~1.1.2" + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -325,7 +447,33 @@ util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +wmf@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wmf/-/wmf-1.0.2.tgz#7d19d621071a08c2bdc6b7e688a9c435298cc2da" + integrity sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw== + +word@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/word/-/word-0.3.0.tgz#8542157e4f8e849f4a363a288992d47612db9961" + integrity sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA== + ws@^8.2.2: version "8.2.3" resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== + +xlsx@^0.17.3: + version "0.17.3" + resolved "https://registry.yarnpkg.com/xlsx/-/xlsx-0.17.3.tgz#1c2dd36ff1cecb0ebdf79ba4f268e945d0070849" + integrity sha512-dGZKfyPSXfnoITruwisuDVZkvnxhjgqzWJXBJm2Khmh01wcw8//baRUvhroVRhW2SLbnlpGcCZZbeZO1qJgMIw== + dependencies: + adler-32 "~1.2.0" + cfb "^1.1.4" + codepage "~1.15.0" + commander "~2.17.1" + crc-32 "~1.2.0" + exit-on-epipe "~1.0.1" + fflate "^0.7.1" + ssf "~0.11.2" + wmf "~1.0.1" + word "~0.3.0"