diff --git a/bot.js b/bot.js index f4010789..08a382f1 100644 --- a/bot.js +++ b/bot.js @@ -149,6 +149,19 @@ class DiscordHaloBot extends Client { }); } + /** + * Sends a discord message on the bot's behalf to the health log channel + * @param {Object} args + * @param {EmbedBase} args.embed Singular embed object to be sent in message + * @returns {Promise} Promise which resolves to the sent message + */ + async logHealth({ embed, ...options }) { + return (await this.channels.fetch(this.config.channels.log_health)).send({ + embeds: [embed], + ...options, + }); + } + /** * Sends a discord message on the bot's behalf to a public log channel * @param {Object} args diff --git a/classes/HaloWatcher.js b/classes/HaloWatcher.js index e2bd0776..12fe079e 100644 --- a/classes/HaloWatcher.js +++ b/classes/HaloWatcher.js @@ -16,7 +16,7 @@ import { EventEmitter } from 'node:events'; import { setIntervalAsync } from 'set-interval-async/fixed'; -import { Firebase, Halo, handle401, Logger } from '.'; +import { Firebase, Halo, handle401, HealthManager, Logger } from '.'; import { CLASS_ANNOUNCEMENTS, USER_GRADES, USER_INBOX } from '../caches'; export class HaloWatcher extends EventEmitter { @@ -24,9 +24,18 @@ export class HaloWatcher extends EventEmitter { super(); //create intervals - setIntervalAsync(async () => await this.#watchForAnnouncements(), 20000); - setIntervalAsync(async () => await this.#watchForGrades(), 20000); - setIntervalAsync(async () => await this.#watchForInboxMessages(), 20000); + setIntervalAsync(async () => { + await this.#watchForAnnouncements(); + HealthManager.record('ANNOUNCEMENTS'); + }, 20000); + setIntervalAsync(async () => { + await this.#watchForGrades(); + HealthManager.record('GRADES'); + }, 20000); + setIntervalAsync(async () => { + await this.#watchForInboxMessages(); + HealthManager.record('INBOX_MESSAGES'); + }, 20000); } /** diff --git a/classes/HealthManager.js b/classes/HealthManager.js new file mode 100644 index 00000000..74d93157 --- /dev/null +++ b/classes/HealthManager.js @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2023 Elijah Olmos + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import bot from '../bot'; +import { Logger, EmbedBase } from '.'; + +export class HealthManager { + static #records = new Map(); + + static record(event) { + this.#records.set(event, Date.now()); + Logger.health(`recorded event: ${event}`); + } + + static publishLogs() { + const flags = []; + // find all records that are older than 2min + const fields = Array.from(this.#records).map(([event, date]) => { + if (date < Date.now() - 120000) flags.push(event); + return { + name: `\`${event}\``, + value: bot.formatTimestamp(date, 'R'), + inline: true, + }; + }); + + const embed = new EmbedBase({ + title: 'Health Report', + description: `Discord API Latency: ${bot.ws.ping}ms`, + fields: [ + ...(!!flags.length + ? [ + { + name: 'Flags', + value: flags.map((flag) => `\`${flag}\``).join('\n'), + }, + ] + : []), + ...fields, + ], + }); + !!flags.length && embed.Error(); + bot.logHealth({ embed, ...(!!flags.length && { content: '<@!139120967208271872> unhealthy status' }) }); + } +} diff --git a/classes/Logger.js b/classes/Logger.js index 6a561d5f..fc0dbb58 100644 --- a/classes/Logger.js +++ b/classes/Logger.js @@ -22,14 +22,17 @@ import { serializeError } from 'serialize-error'; export class Logger { static async log(content, type = 'log') { - const timestamp = `[${chalk.white(moment().format('YYYY-MM-DD HH:mm:ss'))}]`; + const date = moment(); + const timestamp = `[${chalk.white(date.format('YYYY-MM-DD HH:mm:ss'))}]`; type !== 'error' && !!content && content.constructor === Object && (content = JSON.stringify(content)); switch (type) { case 'log': { - //create file first, if it does not exist - await fs.mkdir('./' + path.relative(process.cwd(), 'log/'), { recursive: true }); + //create dir first, if it does not exist + await fs.mkdir('./' + path.relative(process.cwd(), `log/${date.format('YYYY-MM-DD')}/`), { + recursive: true, + }); fs.appendFile( - './' + path.relative(process.cwd(), 'log/log.log'), + './' + path.relative(process.cwd(), `log/${date.format('YYYY-MM-DD')}/log.log`), `[${moment().format('YYYY-MM-DD HH:mm:ss')}]: ${content}\n` ); return console.log(`${timestamp} [${chalk.bgBlue(` ${type.toUpperCase()} `)}]: ${content}`); @@ -38,19 +41,23 @@ export class Logger { return console.log(`${timestamp} [${chalk.black.bgYellow(type.toUpperCase())}]: ${content}`); } case 'error': { - //create file first, if it does not exist - await fs.mkdir('./' + path.relative(process.cwd(), 'log/'), { recursive: true }); + //create dir first, if it does not exist + await fs.mkdir('./' + path.relative(process.cwd(), `log/${date.format('YYYY-MM-DD')}/`), { + recursive: true, + }); fs.appendFile( - './' + path.relative(process.cwd(), 'log/error.log'), + './' + path.relative(process.cwd(), `log/${date.format('YYYY-MM-DD')}/error.log`), `[${moment().format('YYYY-MM-DD HH:mm:ss')}]: ${JSON.stringify(serializeError(content))}\n` ); return console.log(`${timestamp} [${chalk.bgRed(type.toUpperCase())}]: ${content}`); } case 'debug': { - //create file first, if it does not exist - await fs.mkdir('./' + path.relative(process.cwd(), 'log/'), { recursive: true }); + //create dir first, if it does not exist + await fs.mkdir('./' + path.relative(process.cwd(), `log/${date.format('YYYY-MM-DD')}/`), { + recursive: true, + }); fs.appendFile( - './' + path.relative(process.cwd(), 'log/debug.log'), + './' + path.relative(process.cwd(), `log/${date.format('YYYY-MM-DD')}/debug.log`), `[${moment().format('YYYY-MM-DD HH:mm:ss')}]: ${content}\n` ); return console.log(`${timestamp} [${chalk.green(type.toUpperCase())}]: ${content}`); @@ -65,41 +72,52 @@ export class Logger { return console.log(`${timestamp} [${chalk.black.bgGreen(type.toUpperCase())}]: ${content}`); } case 'uninstall': { - //create file first, if it does not exist - await fs.mkdir('./' + path.relative(process.cwd(), 'log/'), { recursive: true }); + //create dir first, if it does not exist + await fs.mkdir('./' + path.relative(process.cwd(), `log/${date.format('YYYY-MM-DD')}/`), { + recursive: true, + }); fs.appendFile( - './' + path.relative(process.cwd(), 'log/uninstall.log'), + './' + path.relative(process.cwd(), `log/${date.format('YYYY-MM-DD')}/uninstall.log`), `[${moment().format('YYYY-MM-DD HH:mm:ss')}]: ${content}\n` ); return console.log(`${timestamp} [${chalk.yellow(type.toUpperCase())}]: ${content}`); } case 'unauth': { - //create file first, if it does not exist - await fs.mkdir('./' + path.relative(process.cwd(), 'log/'), { recursive: true }); + //create dir first, if it does not exist + await fs.mkdir('./' + path.relative(process.cwd(), `log/${date.format('YYYY-MM-DD')}/`), { + recursive: true, + }); fs.appendFile( - './' + path.relative(process.cwd(), 'log/unauth.log'), + './' + path.relative(process.cwd(), `log/${date.format('YYYY-MM-DD')}/unauth.log`), `[${moment().format('YYYY-MM-DD HH:mm:ss')}]: ${content}\n` ); return; //don't output to console } case 'cookie': { - //create file first, if it does not exist - await fs.mkdir('./' + path.relative(process.cwd(), 'log/'), { recursive: true }); + //create dir first, if it does not exist + await fs.mkdir('./' + path.relative(process.cwd(), `log/${date.format('YYYY-MM-DD')}/`), { + recursive: true, + }); fs.appendFile( - './' + path.relative(process.cwd(), 'log/cookie.log'), + './' + path.relative(process.cwd(), `log/${date.format('YYYY-MM-DD')}/cookie.log`), `[${moment().format('YYYY-MM-DD HH:mm:ss')}]: ${content}\n` ); return console.log(`${timestamp} [${chalk.grey(type.toUpperCase())}]: ${content}`); } case 'cron': { - //create file first, if it does not exist - await fs.mkdir('./' + path.relative(process.cwd(), 'log/'), { recursive: true }); + //create dir first, if it does not exist + await fs.mkdir('./' + path.relative(process.cwd(), `log/${date.format('YYYY-MM-DD')}/`), { + recursive: true, + }); fs.appendFile( - './' + path.relative(process.cwd(), 'log/cron.log'), + './' + path.relative(process.cwd(), `log/${date.format('YYYY-MM-DD')}/cron.log`), `[${moment().format('YYYY-MM-DD HH:mm:ss')}]: ${content}\n` ); return console.log(`${timestamp} [${chalk.bgYellow(type.toUpperCase())}]: ${content}`); } + case 'health': { + return console.log(`${timestamp} [${chalk.black.bgGreen(type.toUpperCase())}]: ${content}`); + } default: throw new TypeError('Unknown log type'); } @@ -144,4 +162,8 @@ export class Logger { static cron(content) { return this.log(content, 'cron'); } + + static health(content) { + return this.log(content, 'health'); + } } diff --git a/classes/components/EmbedBase.js b/classes/components/EmbedBase.js index cffd644c..6fa576eb 100644 --- a/classes/components/EmbedBase.js +++ b/classes/components/EmbedBase.js @@ -136,8 +136,7 @@ export class EmbedBase extends MessageEmbed { this.description &&= truncate(this.description.trim(), { length: 4095, omission: '\u2026' }); // I'd like to split the embeds before slicing fields, if possible this.fields = this.fields - .map((f) => this.splitField(f)) - .flat() + .flatMap((f) => this.splitField(f)) .slice(0, 25) .map((f) => ({ ...f, diff --git a/classes/index.js b/classes/index.js index 22ace06a..2551095d 100644 --- a/classes/index.js +++ b/classes/index.js @@ -32,3 +32,4 @@ export * from './services/GradeService'; export * from './services/InboxMessageService'; export * from './services/401Service'; export * as Encrypt from './services/EncryptionService'; +export * from './HealthManager'; diff --git a/classes/services/AnnouncementService.js b/classes/services/AnnouncementService.js index bf48013a..01085c6d 100644 --- a/classes/services/AnnouncementService.js +++ b/classes/services/AnnouncementService.js @@ -14,6 +14,7 @@ * along with this program. If not, see . */ +import { decode } from 'html-entities'; import { EmbedBase, Firebase, Logger } from '..'; import bot from '../../bot'; @@ -92,10 +93,15 @@ export class AnnouncementService { fields: [ { name: 'Message', - value: announcement.content - .replaceAll('
', '\n') - .replaceAll('

', '\n') //this is kinda hacky ngl - .replace(/<\/?[^>]+(>|$)/g, ''), + value: decode( + announcement.content + .replaceAll('
', '\n') + .replaceAll('

', '\n') //this is kinda hacky ngl + .replaceAll('

  • ', '\n\t\u2022 ') + .replaceAll('', '\n') + .replaceAll('', '\n') + .replace(/<\/?[^>]+(>|$)/g, '') + ), }, //TODO: cleanup dry code ...(!!announcement.resources.filter(({ kind }) => kind !== 'URL').length diff --git a/classes/services/GradeService.js b/classes/services/GradeService.js index 7b64f9d8..4bf6b587 100644 --- a/classes/services/GradeService.js +++ b/classes/services/GradeService.js @@ -14,6 +14,7 @@ * along with this program. If not, see . */ +import { decode } from 'html-entities'; import { round } from 'lodash-es'; import { EmbedBase, Firebase, Logger } from '..'; import bot from '../../bot'; @@ -106,10 +107,15 @@ export class GradeService { { name: `Feedback:`, value: !!finalComment?.comment - ? finalComment.comment - .replaceAll('
    ', '\n') - .replaceAll('

    ', '\n') //this is kinda hacky ngl - .replace(/<\/?[^>]+(>|$)/g, '') + ? decode( + finalComment.comment + .replaceAll('
    ', '\n') + .replaceAll('

    ', '\n') //this is kinda hacky ngl + .replaceAll('

  • ', '\n\t\u2022 ') + .replaceAll('', '\n') + .replaceAll('', '\n') + .replace(/<\/?[^>]+(>|$)/g, '') + ) : 'None', }, ...(show_overall_grade diff --git a/classes/services/InboxMessageService.js b/classes/services/InboxMessageService.js index 81c72b34..ed68b840 100644 --- a/classes/services/InboxMessageService.js +++ b/classes/services/InboxMessageService.js @@ -14,7 +14,8 @@ * along with this program. If not, see . */ -import { EmbedBase, Firebase, Logger } from '..'; +import { decode } from 'html-entities'; +import { EmbedBase, Logger } from '..'; import bot from '../../bot'; export class InboxMessageService { @@ -79,10 +80,15 @@ export class InboxMessageService { content: `New message received from **${firstName} ${lastName}**:`, embeds: [ new EmbedBase({ - description: inbox_message.content - .replaceAll('
    ', '\n') - .replaceAll('

    ', '\n') //this is kinda hacky ngl - .replace(/<\/?[^>]+(>|$)/g, ''), + description: decode( + inbox_message.content + .replaceAll('
    ', '\n') + .replaceAll('

    ', '\n') //this is kinda hacky ngl + .replaceAll('

  • ', '\n\t\u2022 ') + .replaceAll('', '\n') + .replaceAll('', '\n') + .replace(/<\/?[^>]+(>|$)/g, '') + ), fields: [ ...(!!inbox_message.resources.filter(({ kind }) => kind !== 'URL').length ? [ diff --git a/commands/development/test.js b/commands/development/test.js index 4feb1789..c154601b 100644 --- a/commands/development/test.js +++ b/commands/development/test.js @@ -15,7 +15,7 @@ */ import bot from '../../bot'; -import { Command, Firebase, Halo } from '../../classes'; +import { Command, Firebase, Halo, HealthManager } from '../../classes'; class test extends Command { constructor() { @@ -28,8 +28,7 @@ class test extends Command { async run({ intr }) { try { - const cookie = await Firebase.getUserCookie(intr.user.id); - + HealthManager.publishLogs(); // const feedback = await Halo.getGradeFeedback({ // cookie, // assessment_id: '1454f632-ab98-4900-8858-452160a85b9c', diff --git a/config.js b/config.js index 04ce39cd..ed76a27b 100644 --- a/config.js +++ b/config.js @@ -52,6 +52,7 @@ export default { connection_log: '932058303779983470', cron_log: '1029803136367476807', log_401: '1036438412011507773', + log_health: '1077445943865131018', }, events: {}, emoji: {}, @@ -98,6 +99,7 @@ export default { connection_log: '932058303779983470', cron_log: '1029803136367476807', log_401: '1036438412011507773', + log_health: '1077445943865131018', }, events: {}, emoji: {}, diff --git a/events/cron/publishHealthLogs.js b/events/cron/publishHealthLogs.js new file mode 100644 index 00000000..944e5a9c --- /dev/null +++ b/events/cron/publishHealthLogs.js @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2023 Elijah Olmos + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import { CronEvent, HealthManager } from '../../classes'; + +export default class extends CronEvent { + constructor() { + super({ + name: 'publishHealthLogs', + schedule: '0 * * * *', //every hour + }); + } + + run() { + HealthManager.publishLogs(); + } +} diff --git a/package.json b/package.json index f10d63a9..ebc82f8d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "halo-discord-bot", - "version": "2.5.2", + "version": "2.5.3", "author": "Elijah Olmos", "license": "AGPL-3.0-only", "main": "index.js", @@ -32,6 +32,7 @@ "dotenv": "16.0.3", "firebase-admin": "11.5.0", "graphql-request": "5.1.0", + "html-entities": "2.3.3", "klaw": "4.1.0", "lodash-es": "4.17.21", "moment": "2.29.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fc7b432a..97e8fd47 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,7 @@ specifiers: express: 4.18.2 firebase-admin: 11.5.0 graphql-request: 5.1.0 + html-entities: 2.3.3 klaw: 4.1.0 lodash-es: 4.17.21 moment: 2.29.4 @@ -23,6 +24,7 @@ dependencies: dotenv: 16.0.3 firebase-admin: 11.5.0 graphql-request: 5.1.0_graphql@16.6.0 + html-entities: 2.3.3 klaw: 4.1.0 lodash-es: 4.17.21 moment: 2.29.4 @@ -48,17 +50,17 @@ packages: dev: false optional: true - /@babel/parser/7.20.13: - resolution: {integrity: sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==} + /@babel/parser/7.21.1: + resolution: {integrity: sha512-JzhBFpkuhBNYUY7qs+wTzNmyCWUHEaAFpQQD2YfU1rPL38/L43Wvid0fFkiOCnHvsGncRZgEPyGnltABLcVDTg==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.21.0 dev: false optional: true - /@babel/types/7.20.7: - resolution: {integrity: sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==} + /@babel/types/7.21.0: + resolution: {integrity: sha512-uR7NWq2VNFnDi7EYqiRz2Jv/VQIu38tu64Zy8TX2nQFQ6etJ9V/Rr2msW8BS132mum2rL645qpDrLtAJtVpuow==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.19.4 @@ -75,8 +77,8 @@ packages: '@sapphire/shapeshift': 3.8.1 discord-api-types: 0.36.3 fast-deep-equal: 3.1.3 - ts-mixer: 6.0.2 - tslib: 2.4.1 + ts-mixer: 6.0.3 + tslib: 2.5.0 dev: false /@discordjs/collection/0.7.0: @@ -100,63 +102,63 @@ packages: resolution: {integrity: sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==} dev: false - /@firebase/component/0.6.1: - resolution: {integrity: sha512-yvKthG0InjFx9aOPnh6gk0lVNfNVEtyq3LwXgZr+hOwD0x/CtXq33XCpqv0sQj5CA4FdMy8OO+y9edI+ZUw8LA==} + /@firebase/component/0.6.3: + resolution: {integrity: sha512-rnhq5SOsB5nuJphZF50iwqnBiuuyg9kdnlUn1rBrKfu7/cUVJZF5IG1cWrL0rXXyiZW1WBI/J2pmTvVO8dStGQ==} dependencies: - '@firebase/util': 1.9.0 - tslib: 2.4.1 + '@firebase/util': 1.9.2 + tslib: 2.5.0 dev: false - /@firebase/database-compat/0.3.1: - resolution: {integrity: sha512-sI7LNh0C8PCq9uUKjrBKLbZvqHTSjsf2LeZRxin+rHVegomjsOAYk9OzYwxETWh3URhpMkCM8KcTl7RVwAldog==} + /@firebase/database-compat/0.3.3: + resolution: {integrity: sha512-r+L9jTbvsnb7sD+xz6UKU39DgBWqB2pyjzPNdBeriGC9Ssa2MAZe0bIqjCQg51RRXYc/aa/zK1Q2/4uesZeVgQ==} dependencies: - '@firebase/component': 0.6.1 - '@firebase/database': 0.14.1 - '@firebase/database-types': 0.10.1 + '@firebase/component': 0.6.3 + '@firebase/database': 0.14.3 + '@firebase/database-types': 0.10.3 '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.0 - tslib: 2.4.1 + '@firebase/util': 1.9.2 + tslib: 2.5.0 dev: false - /@firebase/database-types/0.10.1: - resolution: {integrity: sha512-UgUx9VakTHbP2WrVUdYrUT2ofTFVfWjGW2O1fwuvvMyo6WSnuSyO5nB1u0cyoMPvO25dfMIUVerfK7qFfwGL3Q==} + /@firebase/database-types/0.10.3: + resolution: {integrity: sha512-Hu34CDhHYZsd2eielr0jeaWrTJk8Hz0nd7WsnYDnXtQX4i49ppgPesUzPdXVBdIBLJmT0ZZRvT7qWHknkOT+zg==} dependencies: '@firebase/app-types': 0.9.0 - '@firebase/util': 1.9.0 + '@firebase/util': 1.9.2 dev: false - /@firebase/database/0.14.1: - resolution: {integrity: sha512-iX6/p7hoxUMbYAGZD+D97L05xQgpkslF2+uJLZl46EdaEfjVMEwAdy7RS/grF96kcFZFg502LwPYTXoIdrZqOA==} + /@firebase/database/0.14.3: + resolution: {integrity: sha512-J76W6N7JiVkLaAtPyjaGRkrsIu9pi6iZikuGGtGjqvV19vkn7oiL4Hbo5uTYCMd4waTUWoL9iI08eX184W+5GQ==} dependencies: '@firebase/auth-interop-types': 0.2.1 - '@firebase/component': 0.6.1 + '@firebase/component': 0.6.3 '@firebase/logger': 0.4.0 - '@firebase/util': 1.9.0 + '@firebase/util': 1.9.2 faye-websocket: 0.11.4 - tslib: 2.4.1 + tslib: 2.5.0 dev: false /@firebase/logger/0.4.0: resolution: {integrity: sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==} dependencies: - tslib: 2.4.1 + tslib: 2.5.0 dev: false - /@firebase/util/1.9.0: - resolution: {integrity: sha512-oeoq/6Sr9btbwUQs5HPfeww97bf7qgBbkknbDTXpRaph2LZ23O9XLCE5tJy856SBmGQfO4xBZP8dyryLLM2nSQ==} + /@firebase/util/1.9.2: + resolution: {integrity: sha512-9l0uMGPGw3GsoD5khjMmYCCcMq/OR/OOSViiWMN+s2Q0pxM+fYzrii1H+r8qC/uoMjSVXomjLZt0vZIyryCqtQ==} dependencies: - tslib: 2.4.1 + tslib: 2.5.0 dev: false - /@google-cloud/firestore/6.4.2: - resolution: {integrity: sha512-f7xFwINJveaqTFcgy0G4o2CBPm0Gv9lTGQ4dQt+7skwaHs3ytdue9ma8oQZYXKNoWcAoDIMQ929Dk0KOIocxFg==} + /@google-cloud/firestore/6.4.3: + resolution: {integrity: sha512-78Ymo6DCQ1t33UWK5TuV98ZbbinC1PwNLsfWIjQTaqSbQydvVfQrG3EsOk+WKKMSwdjEqqnehJ5V1FXb7S1iQQ==} engines: {node: '>=12.0.0'} requiresBuild: true dependencies: fast-deep-equal: 3.1.3 functional-red-black-tree: 1.0.1 - google-gax: 3.5.2 - protobufjs: 7.1.2 + google-gax: 3.5.7 + protobufjs: 7.2.2 transitivePeerDependencies: - encoding - supports-color @@ -184,8 +186,8 @@ packages: dev: false optional: true - /@google-cloud/storage/6.9.0: - resolution: {integrity: sha512-0mn9DUe3dtyTWLsWLplQP3gzPolJ5kD4PwHuzeD3ye0SAQ+oFfDbT8d+vNZxqyvddL2c6uNP72TKETN2PQxDKg==} + /@google-cloud/storage/6.9.3: + resolution: {integrity: sha512-ucbHoDvjXlcR/DrJNQlCFnQSaO7pXHTPGs3Gt2TQtPQ+b7Y6DR0ztIt/CEeH+O03I41g9e+T2N1SOOVq5UyaKQ==} engines: {node: '>=12'} requiresBuild: true dependencies: @@ -204,7 +206,7 @@ packages: mime-types: 2.1.35 p-limit: 3.1.0 retry-request: 5.0.2 - teeny-request: 8.0.2 + teeny-request: 8.0.3 uuid: 8.3.2 transitivePeerDependencies: - encoding @@ -220,28 +222,36 @@ packages: graphql: 16.6.0 dev: false - /@grpc/grpc-js/1.7.3: - resolution: {integrity: sha512-H9l79u4kJ2PVSxUNA08HMYAnUBLj9v6KjYQ7SQ71hOZcEXhShE/y5iQCesP8+6/Ik/7i2O0a10bPquIcYfufog==} + /@grpc/grpc-js/1.8.10: + resolution: {integrity: sha512-x7QS+gJq8WaS1OJYFJkmeoX2PHhi3b5TR5TqR9a8NJv6VyedFecp3LgAUmuJSQZlwoAODpCKRtu4HzG1srNjiA==} engines: {node: ^8.13.0 || >=10.10.0} dependencies: - '@grpc/proto-loader': 0.7.4 - '@types/node': 18.11.18 + '@grpc/proto-loader': 0.7.5 + '@types/node': 18.14.0 dev: false optional: true - /@grpc/proto-loader/0.7.4: - resolution: {integrity: sha512-MnWjkGwqQ3W8fx94/c1CwqLsNmHHv2t0CFn+9++6+cDphC1lolpg9M2OU0iebIjK//pBNX9e94ho+gjx6vz39w==} + /@grpc/proto-loader/0.7.5: + resolution: {integrity: sha512-mfcTuMbFowq1wh/Rn5KQl6qb95M21Prej3bewD9dUQMurYGVckGO/Pbe2Ocwto6sD05b/mxZLspvqwx60xO2Rg==} engines: {node: '>=6'} hasBin: true dependencies: '@types/long': 4.0.2 lodash.camelcase: 4.3.0 long: 4.0.0 - protobufjs: 7.1.2 + protobufjs: 7.2.2 yargs: 16.2.0 dev: false optional: true + /@jsdoc/salty/0.2.3: + resolution: {integrity: sha512-bbtCxCkxcnWhi50I+4Lj6mdz9w3pOXOgEQrID8TCZ/DF51fW7M9GCQW2y45SpBDdHd1Eirm1X/Cf6CkAAe8HPg==} + engines: {node: '>=v12.0.0'} + dependencies: + lodash: 4.17.21 + dev: false + optional: true + /@protobufjs/aspromise/1.1.2: resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} dev: false @@ -318,36 +328,44 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 18.11.18 + '@types/node': 18.14.0 dev: false /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 18.11.18 + '@types/node': 18.14.0 dev: false - /@types/express-serve-static-core/4.17.32: - resolution: {integrity: sha512-aI5h/VOkxOF2Z1saPy0Zsxs5avets/iaiAJYznQFm5By/pamU31xWKL//epiF4OfUA2qTOc9PV6tCUjhO8wlZA==} + /@types/express-serve-static-core/4.17.33: + resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} dependencies: - '@types/node': 18.11.18 + '@types/node': 18.14.0 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: false - /@types/express/4.17.15: - resolution: {integrity: sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==} + /@types/express/4.17.17: + resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} dependencies: '@types/body-parser': 1.19.2 - '@types/express-serve-static-core': 4.17.32 + '@types/express-serve-static-core': 4.17.33 '@types/qs': 6.9.7 '@types/serve-static': 1.15.0 dev: false + /@types/glob/8.0.1: + resolution: {integrity: sha512-8bVUjXZvJacUFkJXHdyZ9iH1Eaj5V7I8c4NdH5sQJsdXkqT4CA5Dhb4yb4VE/3asyx4L9ayZr1NIhTsWHczmMw==} + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 18.14.0 + dev: false + optional: true + /@types/jsonwebtoken/9.0.1: resolution: {integrity: sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==} dependencies: - '@types/node': 18.11.18 + '@types/node': 18.14.0 dev: false /@types/linkify-it/3.0.2: @@ -377,15 +395,20 @@ packages: resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} dev: false + /@types/minimatch/5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + dev: false + optional: true + /@types/node-fetch/2.6.2: resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} dependencies: - '@types/node': 18.11.18 + '@types/node': 18.14.0 form-data: 3.0.1 dev: false - /@types/node/18.11.18: - resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} + /@types/node/18.14.0: + resolution: {integrity: sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==} dev: false /@types/qs/6.9.7: @@ -396,17 +419,25 @@ packages: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} dev: false + /@types/rimraf/3.0.2: + resolution: {integrity: sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==} + dependencies: + '@types/glob': 8.0.1 + '@types/node': 18.14.0 + dev: false + optional: true + /@types/serve-static/1.15.0: resolution: {integrity: sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==} dependencies: '@types/mime': 3.0.1 - '@types/node': 18.11.18 + '@types/node': 18.14.0 dev: false /@types/ws/8.5.4: resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} dependencies: - '@types/node': 18.11.18 + '@types/node': 18.14.0 dev: false /abort-controller/3.0.0: @@ -425,17 +456,17 @@ packages: negotiator: 0.6.3 dev: true - /acorn-jsx/5.3.2_acorn@8.8.1: + /acorn-jsx/5.3.2_acorn@8.8.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.8.1 + acorn: 8.8.2 dev: false optional: true - /acorn/8.8.1: - resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} + /acorn/8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} hasBin: true dev: false @@ -524,7 +555,7 @@ packages: engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dependencies: bytes: 3.1.2 - content-type: 1.0.4 + content-type: 1.0.5 debug: 2.6.9 depd: 2.0.0 destroy: 1.2.0 @@ -644,8 +675,8 @@ packages: safe-buffer: 5.2.1 dev: true - /content-type/1.0.4: - resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} + /content-type/1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} dev: true @@ -706,8 +737,8 @@ packages: dev: false optional: true - /define-properties/1.1.4: - resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} + /define-properties/1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} dependencies: has-property-descriptors: 1.0.0 @@ -755,8 +786,8 @@ packages: '@types/ws': 8.5.4 discord-api-types: 0.33.5 form-data: 4.0.0 - node-fetch: 2.6.8 - ws: 8.12.0 + node-fetch: 2.6.9 + ws: 8.12.1 transitivePeerDependencies: - bufferutil - encoding @@ -855,8 +886,8 @@ packages: resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.8.1 - acorn-jsx: 5.3.2_acorn@8.8.1 + acorn: 8.8.2 + acorn-jsx: 5.3.2_acorn@8.8.2 eslint-visitor-keys: 3.3.0 dev: false optional: true @@ -905,7 +936,7 @@ packages: array-flatten: 1.1.1 body-parser: 1.20.1 content-disposition: 0.5.4 - content-type: 1.0.4 + content-type: 1.0.5 cookie: 0.5.0 cookie-signature: 1.0.6 debug: 2.6.9 @@ -991,16 +1022,16 @@ packages: engines: {node: '>=14'} dependencies: '@fastify/busboy': 1.2.1 - '@firebase/database-compat': 0.3.1 - '@firebase/database-types': 0.10.1 - '@types/node': 18.11.18 + '@firebase/database-compat': 0.3.3 + '@firebase/database-types': 0.10.3 + '@types/node': 18.14.0 jsonwebtoken: 9.0.0 jwks-rsa: 3.0.1 node-forge: 1.3.1 uuid: 9.0.0 optionalDependencies: - '@google-cloud/firestore': 6.4.2 - '@google-cloud/storage': 6.9.0 + '@google-cloud/firestore': 6.4.3 + '@google-cloud/storage': 6.9.3 transitivePeerDependencies: - encoding - supports-color @@ -1063,7 +1094,7 @@ packages: extend: 3.0.2 https-proxy-agent: 5.0.1 is-stream: 2.0.1 - node-fetch: 2.6.8 + node-fetch: 2.6.9 transitivePeerDependencies: - encoding - supports-color @@ -1138,24 +1169,25 @@ packages: dev: false optional: true - /google-gax/3.5.2: - resolution: {integrity: sha512-AyP53w0gHcWlzxm+jSgqCR3Xu4Ld7EpSjhtNBnNhzwwWaIUyphH9kBGNIEH+i4UGkTUXOY29K/Re8EiAvkBRGw==} + /google-gax/3.5.7: + resolution: {integrity: sha512-taDGwR9Ry5y6NkcPYKe0B3wr7rCwaImZZIuWajUcFe9Y8L71eBtaq0+ZJ62JByzr/2cJkd9EN1rr52rD6V/UDA==} engines: {node: '>=12'} hasBin: true dependencies: - '@grpc/grpc-js': 1.7.3 - '@grpc/proto-loader': 0.7.4 + '@grpc/grpc-js': 1.8.10 + '@grpc/proto-loader': 0.7.5 '@types/long': 4.0.2 + '@types/rimraf': 3.0.2 abort-controller: 3.0.0 duplexify: 4.1.2 fast-text-encoding: 1.0.6 google-auth-library: 8.7.0 is-stream-ended: 0.1.4 - node-fetch: 2.6.8 + node-fetch: 2.6.9 object-hash: 3.0.0 proto3-json-serializer: 1.1.0 - protobufjs: 7.1.2 - protobufjs-cli: 1.0.2_protobufjs@7.1.2 + protobufjs: 7.2.2 + protobufjs-cli: 1.1.1_protobufjs@7.2.2 retry-request: 5.0.2 transitivePeerDependencies: - encoding @@ -1236,6 +1268,10 @@ packages: engines: {node: '>=8'} dev: false + /html-entities/2.3.3: + resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} + dev: false + /http-errors/2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -1308,7 +1344,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 + define-properties: 1.2.0 dev: false /is-stream-ended/0.1.4: @@ -1322,8 +1358,8 @@ packages: dev: false optional: true - /jose/4.11.2: - resolution: {integrity: sha512-njj0VL2TsIxCtgzhO+9RRobBvws4oYyCM8TpvoUQwl/MbIM3NFJRR9+e6x0sS5xXaP1t6OCBkaBME98OV9zU5A==} + /jose/4.12.0: + resolution: {integrity: sha512-wW1u3cK81b+SFcHjGC8zw87yuyUweEFe0UJirrXEw1NasW00eF7sZjeG3SLBGz001ozxQ46Y9sofDvhBmWFtXQ==} dev: false /js2xmlparser/4.0.2: @@ -1333,12 +1369,13 @@ packages: dev: false optional: true - /jsdoc/3.6.11: - resolution: {integrity: sha512-8UCU0TYeIYD9KeLzEcAu2q8N/mx9O3phAGl32nmHlE0LpaJL71mMkP4d+QE5zWfNt50qheHtOZ0qoxVrsX5TUg==} + /jsdoc/4.0.2: + resolution: {integrity: sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==} engines: {node: '>=12.0.0'} hasBin: true dependencies: - '@babel/parser': 7.20.13 + '@babel/parser': 7.21.1 + '@jsdoc/salty': 0.2.3 '@types/markdown-it': 12.2.3 bluebird: 3.7.2 catharsis: 0.9.0 @@ -1346,12 +1383,11 @@ packages: js2xmlparser: 4.0.2 klaw: 3.0.0 markdown-it: 12.3.2 - markdown-it-anchor: 8.6.6_2zb4u3vubltivolgu556vv4aom + markdown-it-anchor: 8.6.7_2zb4u3vubltivolgu556vv4aom marked: 4.2.12 mkdirp: 1.0.4 requizzle: 0.2.4 strip-json-comments: 3.1.1 - taffydb: 2.6.2 underscore: 1.13.6 dev: false optional: true @@ -1394,12 +1430,12 @@ packages: resolution: {integrity: sha512-UUOZ0CVReK1QVU3rbi9bC7N5/le8ziUj0A2ef1Q0M7OPD2KvjEYizptqIxGIo6fSLYDkqBrazILS18tYuRc8gw==} engines: {node: '>=14'} dependencies: - '@types/express': 4.17.15 + '@types/express': 4.17.17 '@types/jsonwebtoken': 9.0.1 debug: 4.3.4 - jose: 4.11.2 + jose: 4.12.0 limiter: 1.1.5 - lru-memoizer: 2.1.4 + lru-memoizer: 2.2.0 transitivePeerDependencies: - supports-color dev: false @@ -1496,8 +1532,8 @@ packages: yallist: 4.0.0 dev: false - /lru-memoizer/2.1.4: - resolution: {integrity: sha512-IXAq50s4qwrOBrXJklY+KhgZF+5y98PDaNo0gi/v2KQBFLyWr+JyFvijZXkGKjQj/h9c0OwoE+JZbwUXce76hQ==} + /lru-memoizer/2.2.0: + resolution: {integrity: sha512-QfOZ6jNkxCcM/BkIPnFsqDhtrazLRsghi9mBwFAzol5GCvj4EkFT899Za3+QwikCg5sRX8JstioBDwOxEyzaNw==} dependencies: lodash.clonedeep: 4.5.0 lru-cache: 4.0.2 @@ -1507,8 +1543,8 @@ packages: resolution: {integrity: sha512-gYHAa180mKrNIUJCbwpmD0aTu9kV0dREDrwNnuyFAsO1Wt0EVYSZelPnJlbj9HplzXX/YWXHFTL45kvZ53M0pw==} dev: false - /markdown-it-anchor/8.6.6_2zb4u3vubltivolgu556vv4aom: - resolution: {integrity: sha512-jRW30YGywD2ESXDc+l17AiritL0uVaSnWsb26f+68qaW9zgbIIr1f4v2Nsvc0+s0Z2N3uX6t/yAw7BwCQ1wMsA==} + /markdown-it-anchor/8.6.7_2zb4u3vubltivolgu556vv4aom: + resolution: {integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==} peerDependencies: '@types/markdown-it': '*' markdown-it: '*' @@ -1599,8 +1635,8 @@ packages: dev: false optional: true - /minimist/1.2.7: - resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + /minimist/1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: false optional: true @@ -1643,8 +1679,8 @@ packages: whatwg-url: 5.0.0 dev: false - /node-fetch/2.6.8: - resolution: {integrity: sha512-RZ6dBYuj8dRSfxpUSu+NsdF1dpPpluJxwOp+6IoDp/sH2QNDSvurYsAa+F1WxY2RjA1iP93xhcsUoYbF2XBqVg==} + /node-fetch/2.6.9: + resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 @@ -1742,12 +1778,12 @@ packages: resolution: {integrity: sha512-SjXwUWe/vANGs/mJJTbw5++7U67nwsymg7qsoPtw6GiXqw3kUy8ByojrlEdVE2efxAdKreX8WkDafxvYW95ZQg==} engines: {node: '>=12.0.0'} dependencies: - protobufjs: 7.1.2 + protobufjs: 7.2.2 dev: false optional: true - /protobufjs-cli/1.0.2_protobufjs@7.1.2: - resolution: {integrity: sha512-cz9Pq9p/Zs7okc6avH20W7QuyjTclwJPgqXG11jNaulfS3nbVisID8rC+prfgq0gbZE0w9LBFd1OKFF03kgFzg==} + /protobufjs-cli/1.1.1_protobufjs@7.2.2: + resolution: {integrity: sha512-VPWMgIcRNyQwWUv8OLPyGQ/0lQY/QTQAVN5fh+XzfDwsVw1FZ2L3DM/bcBf8WPiRz2tNpaov9lPZfNcmNo6LXA==} engines: {node: '>=12.0.0'} hasBin: true peerDependencies: @@ -1758,17 +1794,17 @@ packages: espree: 9.4.1 estraverse: 5.3.0 glob: 8.1.0 - jsdoc: 3.6.11 - minimist: 1.2.7 - protobufjs: 7.1.2 + jsdoc: 4.0.2 + minimist: 1.2.8 + protobufjs: 7.2.2 semver: 7.3.8 tmp: 0.2.1 uglify-js: 3.17.4 dev: false optional: true - /protobufjs/7.1.2: - resolution: {integrity: sha512-4ZPTPkXCdel3+L81yw3dG6+Kq3umdWKh7Dc7GW/CpNk4SX3hK58iPCWeCyhVTDrbkNeKrYNZ7EojM5WDaEWTLQ==} + /protobufjs/7.2.2: + resolution: {integrity: sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==} engines: {node: '>=12.0.0'} requiresBuild: true dependencies: @@ -1782,7 +1818,7 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 18.11.18 + '@types/node': 18.14.0 long: 5.2.1 dev: false optional: true @@ -2029,18 +2065,13 @@ packages: dev: false optional: true - /taffydb/2.6.2: - resolution: {integrity: sha512-y3JaeRSplks6NYQuCOj3ZFMO3j60rTwbuKCvZxsAraGYH2epusatvZ0baZYA01WsGqJBq/Dl6vOrMUJqyMj8kA==} - dev: false - optional: true - - /teeny-request/8.0.2: - resolution: {integrity: sha512-34pe0a4zASseXZCKdeTiIZqSKA8ETHb1EwItZr01PAR3CLPojeAKgSjzeNS4373gi59hNulyDrPKEbh2zO9sCg==} + /teeny-request/8.0.3: + resolution: {integrity: sha512-jJZpA5He2y52yUhA7pyAGZlgQpcB+xLjcN0eUFxr9c8hP/H7uOXbBNVo/O0C/xVfJLJs680jvkFgVJEEvk9+ww==} engines: {node: '>=12'} dependencies: http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 - node-fetch: 2.6.8 + node-fetch: 2.6.9 stream-events: 1.0.5 uuid: 9.0.0 transitivePeerDependencies: @@ -2076,12 +2107,12 @@ packages: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: false - /ts-mixer/6.0.2: - resolution: {integrity: sha512-zvHx3VM83m2WYCE8XL99uaM7mFwYSkjR2OZti98fabHrwkjsCvgwChda5xctein3xGOyaQhtTeDq/1H/GNvF3A==} + /ts-mixer/6.0.3: + resolution: {integrity: sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==} dev: false - /tslib/2.4.1: - resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} + /tslib/2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} dev: false /type-check/0.3.2: @@ -2198,8 +2229,8 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: false - /ws/8.12.0: - resolution: {integrity: sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==} + /ws/8.12.1: + resolution: {integrity: sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1