From 2aaf7347a0624cc4717b5168560a8d05e38b3013 Mon Sep 17 00:00:00 2001 From: melike2d Date: Mon, 27 Sep 2021 11:12:45 -0700 Subject: [PATCH] :sparkles: get some basic gateway stuff out of the way --- .eslintrc.json | 8 +- README.md | 2 +- ava.config.js | 10 +- package.json | 77 +++--- renovate.json | 8 +- src/cluster.ts | 6 + src/gateway/default.ts | 61 +++++ src/gateway/index.ts | 2 + src/gateway/interface.ts | 63 +++++ src/index.test.ts | 6 - src/index.ts | 11 +- src/shard/compression/index.ts | 2 + src/shard/compression/interface.ts | 31 +++ src/shard/compression/zlib.ts | 83 ++++++ src/shard/encoding/index.ts | 2 + src/shard/encoding/interface.ts | 26 ++ src/shard/encoding/json.ts | 24 ++ src/shard/interface.ts | 95 +++++++ src/shard/state.ts | 13 + src/util/functions.ts | 3 + tsconfig.eslint.json | 14 +- tsconfig.json | 98 +++---- yarn.lock | 396 ++++++++++++++++++++--------- 23 files changed, 813 insertions(+), 228 deletions(-) create mode 100644 src/cluster.ts create mode 100644 src/gateway/default.ts create mode 100644 src/gateway/index.ts create mode 100644 src/gateway/interface.ts delete mode 100644 src/index.test.ts create mode 100644 src/shard/compression/index.ts create mode 100644 src/shard/compression/interface.ts create mode 100644 src/shard/compression/zlib.ts create mode 100644 src/shard/encoding/index.ts create mode 100644 src/shard/encoding/interface.ts create mode 100644 src/shard/encoding/json.ts create mode 100644 src/shard/interface.ts create mode 100644 src/shard/state.ts create mode 100644 src/util/functions.ts diff --git a/.eslintrc.json b/.eslintrc.json index 5dca7e1..691fe91 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,6 +1,6 @@ { - "extends": "@neocord", - "parserOptions": { - "project": "./tsconfig.eslint.json" - } + "extends": "@keiryo", + "parserOptions": { + "project": "./tsconfig.eslint.json" + } } diff --git a/README.md b/README.md index 49eadf9..fd7304e 100644 --- a/README.md +++ b/README.md @@ -8,4 +8,4 @@ --- -copyright 2020 - 2021 © neocord team & contributors +copyright 2020 - 2021 © keiryo team & contributors diff --git a/ava.config.js b/ava.config.js index 8ce3bff..499756e 100644 --- a/ava.config.js +++ b/ava.config.js @@ -1,7 +1,7 @@ export default { - typescript: { - rewritePaths: { - "src/": "dist/" + typescript: { + rewritePaths: { + "src/": "dist/" + } } - } -} \ No newline at end of file +} diff --git a/package.json b/package.json index ad7b378..4d2be4b 100644 --- a/package.json +++ b/package.json @@ -1,36 +1,45 @@ { - "name": "@neocord/project", - "version": "1.0.0", - "description": "A project in the neocord family!", - "main": "dist/index.js", - "repository": "git@github.com:neo-cord/typescript-project.git", - "author": "neocord team", - "license": "Apache-2.0", - "private": false, - "publishConfig": { - "access": "public" - }, - "scripts": { - "build": "rm -rf dist && tsc --removeComments", - "lint": "eslint src --ext .ts", - "lint:fix": "yarn lint --fix", - "test": "ava" - }, - "files": [ - "!*.test.*", - "!*.spec.*", - "dist/", - "LICENSE", - "README.md" - ], - "devDependencies": { - "@ava/typescript": "1.1.1", - "@neocord/eslint-config": "neo-cord/eslint-config", - "@types/node": "14.14.41", - "@typescript-eslint/eslint-plugin": "4.22.0", - "@typescript-eslint/parser": "4.22.0", - "ava": "3.15.0", - "eslint": "7.25.0", - "typescript": "4.2.4" - } + "name": "@keiryo/project", + "version": "1.0.0", + "description": "A project in the keiryo family!", + "main": "dist/index.js", + "repository": "git@github.com:KeiryoJS/typescript-project.git", + "author": "keiryo team", + "license": "Apache-2.0", + "private": false, + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "rm -rf dist && tsc --removeComments", + "lint": "eslint src --ext .ts", + "lint:fix": "yarn lint --fix", + "test": "ava" + }, + "files": [ + "!*.test.*", + "!*.spec.*", + "dist/", + "LICENSE", + "README.md" + ], + "devDependencies": { + "@ava/typescript": "2.0.0", + "@keiryo/eslint-config": "^1.0.1", + "@types/node": "16.9.6", + "@types/ws": "^8.2.0", + "@typescript-eslint/eslint-plugin": "4.31.2", + "@typescript-eslint/parser": "4.31.2", + "ava": "3.15.0", + "eslint": "7.32.0", + "tiny-typed-emitter": "^2.1.0", + "typescript": "4.4.3" + }, + "dependencies": { + "@keiryo/common": "^1.0.2", + "@keiryo/rest": "^1.0.1", + "discord-api-types": "^0.23.1", + "tslib": "^2.3.1", + "ws": "^8.2.2" + } } diff --git a/renovate.json b/renovate.json index d9bec0d..26bfe2c 100644 --- a/renovate.json +++ b/renovate.json @@ -1,6 +1,6 @@ { - "extends": [ - "config:base" - ], - "commitMessage": ":arrow_up: {{{commitMessagePrefix}}} {{{commitMessageAction}}} {{{commitMessageTopic}}} {{{commitMessageExtra}}} {{{commitMessageSuffix}}}" + "extends": [ + "config:base" + ], + "commitMessage": ":arrow_up: {{{commitMessagePrefix}}} {{{commitMessageAction}}} {{{commitMessageTopic}}} {{{commitMessageExtra}}} {{{commitMessageSuffix}}}" } diff --git a/src/cluster.ts b/src/cluster.ts new file mode 100644 index 0000000..90612e0 --- /dev/null +++ b/src/cluster.ts @@ -0,0 +1,6 @@ +import type { RestClient } from "@keiryo/rest"; + +export class Cluster { + constructor(readonly rest: RestClient) { + } +} diff --git a/src/gateway/default.ts b/src/gateway/default.ts new file mode 100644 index 0000000..e769abe --- /dev/null +++ b/src/gateway/default.ts @@ -0,0 +1,61 @@ +import type { GatewayEvents, IGateway, ISessionManager, MaxConcurrency, Session } from "./interface"; +import { AsyncLimiter, Collection } from "@keiryo/common"; +import type { RestClient } from "@keiryo/rest"; +import type { RESTGetAPIGatewayBotResult } from "discord-api-types"; +import { TypedEmitter } from "tiny-typed-emitter"; + +export class Gateway extends TypedEmitter implements IGateway { + readonly sessions: ISessionManager; + + private buckets: Collection; + private maxConcurrency?: MaxConcurrency; + + constructor(readonly rest: RestClient) { + super(); + + this.sessions = new SessionManager(); + this.buckets = new Collection(); + } + + async setup(): Promise { + await this.get(); + for (let bucket = 0; bucket < this.maxConcurrency!; bucket++) { + const limiter = new AsyncLimiter(1, 5000, true); + this.buckets.set(bucket, limiter); + } + } + + async queueIdentify(shard: number, callback: () => Promise): Promise { + if (!this.maxConcurrency) { + throw new Error("This gateway instance has not been set up yet. Please call Gateway#setup before identifying."); + } + + let bucket = this.buckets.get(shard % this.maxConcurrency); + if (!bucket) { + this.emit("warn", `Creating rate-limit bucket for unknown key: ${shard % this.maxConcurrency}.`); + bucket = new AsyncLimiter(1, 5000, true); + this.buckets.set(shard % this.maxConcurrency, bucket); + } + + await bucket.consume(callback); + } + + async get(): Promise { + const result = await this.rest.get("/gateway/bot"); + this.maxConcurrency = result!.session_start_limit.max_concurrency as MaxConcurrency; + return result!; + } +} + +export class SessionManager implements ISessionManager { + private _sessions = new Collection(); + + async get(shard: number): Promise { + return this._sessions.get(shard) ?? { sequence: -1 }; + } + + async update(shard: number, session: Session): Promise { + const current = await this.get(shard); + this._sessions.set(shard, { ...current, ...session }); + } +} diff --git a/src/gateway/index.ts b/src/gateway/index.ts new file mode 100644 index 0000000..58cb835 --- /dev/null +++ b/src/gateway/index.ts @@ -0,0 +1,2 @@ +export * from "./interface"; +export * from "./default"; diff --git a/src/gateway/interface.ts b/src/gateway/interface.ts new file mode 100644 index 0000000..b0d13fe --- /dev/null +++ b/src/gateway/interface.ts @@ -0,0 +1,63 @@ +import type { TypedEmitter } from "tiny-typed-emitter"; +import type { RESTGetAPIGatewayBotResult } from "discord-api-types"; + +export interface IGateway extends TypedEmitter { + /** + * The session manager. + */ + readonly sessions: ISessionManager; + + /** + * Setup this gateway, usually called right after instantiation. + * @returns {Promise} + */ + setup(): Promise; + + /** + * Queues an OP 2 Identify payload. + * + * @param shard The shard id which is identifying. + * @param callback The callback + */ + queueIdentify(shard: number, callback: () => Promise): Promise; + + /** + * Gets the /gateway/bot information. + * + * @returns {Promise} + */ + get(): Promise; +} + +export interface ISessionManager { + /** + * Get a shard's session. + * @param shard The shard id. + */ + get(shard: number): Promise; + + /** + * Update a shard's session. + * @param shard The shard to update. + * @param session The session data. + */ + update(shard: number, session: Session): Promise; +} + +export type MaxConcurrency = 1 | 16 | 32 | 64; + +export type GatewayEvents = { + debug: (message: string) => void; + warn: (message: string) => void; +} + +export interface Session { + /** + * The ID for this session. + */ + id?: string; + /** + * The last received sequence, used for resuming. + */ + sequence: number; +} diff --git a/src/index.test.ts b/src/index.test.ts deleted file mode 100644 index 6484356..0000000 --- a/src/index.test.ts +++ /dev/null @@ -1,6 +0,0 @@ -import test from "ava"; -import { hello } from "."; - -test("hello equals world", t => { - t.is(hello, "world"); -}); diff --git a/src/index.ts b/src/index.ts index 1e29c45..b64c513 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1,10 @@ -export const hello = "world"; +export * from "./gateway"; + +export * from "./shard/compression"; +export * from "./shard/encoding"; +export * from "./shard/interface"; +export * from "./shard/state"; + +export * from "./util/functions"; + +export * from "./cluster"; diff --git a/src/shard/compression/index.ts b/src/shard/compression/index.ts new file mode 100644 index 0000000..081a0f5 --- /dev/null +++ b/src/shard/compression/index.ts @@ -0,0 +1,2 @@ +export * from "./interface"; +export * from "./zlib"; diff --git a/src/shard/compression/interface.ts b/src/shard/compression/interface.ts new file mode 100644 index 0000000..78f2322 --- /dev/null +++ b/src/shard/compression/interface.ts @@ -0,0 +1,31 @@ +import type { TypedEmitter } from "tiny-typed-emitter"; + +export interface IDecompressor extends TypedEmitter { + readonly type: "zlib-stream"; + + /** + * Initializes this decompressor. + */ + init(): void; + + /** + * Closes this decompressor. + */ + close(): void; + + /** + * Adds data to decompress. + * @param data The data to decompress. + */ + decompress(data: CompressedData): void; +} + +export type DecompressorFactory = () => IDecompressor; + +export type CompressedData = string | Buffer | Buffer[] | ArrayBuffer; + +export type DecompressorEvents = { + data: (decompressed: Buffer) => void; + debug: (message: string) => void; + error: (error: Error) => void; +} diff --git a/src/shard/compression/zlib.ts b/src/shard/compression/zlib.ts new file mode 100644 index 0000000..86f18a0 --- /dev/null +++ b/src/shard/compression/zlib.ts @@ -0,0 +1,83 @@ +import type { CompressedData, DecompressorEvents, DecompressorFactory, IDecompressor } from "./interface"; +import { TypedEmitter } from "tiny-typed-emitter"; +import * as zlib from "zlib"; + +export class ZlibDecompressor extends TypedEmitter implements IDecompressor { + static readonly FACTORY: DecompressorFactory = () => new ZlibDecompressor(); + + readonly type = "zlib-stream"; + + private chunks: Buffer[] = []; + private incomingChunks: Buffer[] = []; + private flushing = false; + private unzip!: zlib.Unzip; + + init(): void { + this.unzip = zlib.createUnzip({ + flush: zlib.constants.Z_SYNC_FLUSH, + chunkSize: 128 * 1024 + }); + + this.unzip.on("data", c => this.chunks.push(c)); + this.unzip.on("error", e => this.emit("error", e)); + } + + close(): void { + this.unzip.close(); + } + + decompress(data: CompressedData): void { + if (data instanceof Buffer) { + this._decompress(data); + return; + } else if (Array.isArray(data)) { + this.emit("debug", "received fragmented buffer message."); + for (const buf of data) this._decompress(buf); + return; + } else if (data instanceof ArrayBuffer) { + this.emit("debug", "received array buffer message."); + this._decompress(Buffer.from(data)); + return; + } + + throw new TypeError("Received invalid data"); + } + + private _decompress(buf: Buffer) { + this.flushing + ? this.incomingChunks.push(buf) + : this._write(buf); + } + + private _flush() { + this.flushing = false; + if (!this.chunks.length) { + return; + } + + let buf = this.chunks[0]; + if (this.chunks.length > 1) { + buf = Buffer.concat(this.chunks); + } + + this.chunks = []; + while (this.incomingChunks.length > 0) { + const incoming = this.incomingChunks.shift(); + if (incoming && this._write(incoming)) break; + } + + this.emit("data", buf); + } + + private _write(buf: Buffer) { + this.unzip.write(buf); + + const len = buf.length; + if (len >= 4 && buf.readUInt32BE(len - 4) === 0xFFFF) { + this.flushing = true; + this.unzip.flush(zlib.constants.Z_SYNC_FLUSH, this._flush.bind(this)); + } + + return this.flushing; + } +} diff --git a/src/shard/encoding/index.ts b/src/shard/encoding/index.ts new file mode 100644 index 0000000..d4ad993 --- /dev/null +++ b/src/shard/encoding/index.ts @@ -0,0 +1,2 @@ +export * from "./interface"; +export * from "./json"; diff --git a/src/shard/encoding/interface.ts b/src/shard/encoding/interface.ts new file mode 100644 index 0000000..5e01573 --- /dev/null +++ b/src/shard/encoding/interface.ts @@ -0,0 +1,26 @@ +import type { GatewayReceivePayload, GatewaySendPayload } from "discord-api-types"; +import type { TypedEmitter } from "tiny-typed-emitter"; + +export interface IEncoder extends TypedEmitter { + /** + * Encodes any outgoing data + * + * @param data The data to encode + * @returns EncodedData + */ + encode(data: From): EncodedData; + + /** + * Decodes any encoded data. + * + * @param data The data to decode. + * @returns To + */ + decode(data: EncodedData): To; +} + +export type EncodedData = string | Buffer | Buffer[] | ArrayBuffer; + +export type EncoderEvents = { + debug: (message: string) => void; +} diff --git a/src/shard/encoding/json.ts b/src/shard/encoding/json.ts new file mode 100644 index 0000000..c788f20 --- /dev/null +++ b/src/shard/encoding/json.ts @@ -0,0 +1,24 @@ +import type { EncodedData, IEncoder } from "./interface"; +import type { GatewayReceivePayload, GatewaySendPayload } from "discord-api-types"; +import { TypedEmitter } from "tiny-typed-emitter"; + +export class JsonEncoder extends TypedEmitter implements IEncoder { + encode(data: To): EncodedData { + return JSON.stringify(data); + } + + decode(data: EncodedData): From { + if (data instanceof Buffer) { + return JSON.parse(data.toString()); + } else if (data instanceof ArrayBuffer) { + data = Buffer.from(data); + return JSON.parse(data.toString()); + } else if (Array.isArray(data)) { + this.emit("debug", "received fragmented buffer message."); + data = Buffer.concat(data); + return JSON.parse(data.toString()); + } + + return JSON.parse(data); + } +} diff --git a/src/shard/interface.ts b/src/shard/interface.ts new file mode 100644 index 0000000..11f2b1d --- /dev/null +++ b/src/shard/interface.ts @@ -0,0 +1,95 @@ +import type { GatewayDispatchPayload, GatewaySendPayload } from "discord-api-types"; +import type { TypedEmitter } from "tiny-typed-emitter"; +import type { ShardState } from "./state"; +import type { snowflake } from "@keiryo/common"; + +export interface IShard extends TypedEmitter { + /** + * The ID of this shard. + */ + readonly id: number; + + /** + * The state of this shard. + * @returns {ShardState} The current state of this shard. + */ + get state(): ShardState; + + /** + * Updates this shard's state. + * @param updated The updated state of this shard. + */ + set state(updated: ShardState); + + /** + * Connects this shard to the gateway. + */ + connect(): Promise; + + /** + * Disconnects this shard from the gateway. + * + * @param options The options to use. + */ + disconnect(options?: DisconnectOptions): Promise; + + /** + * Destroys this shard, it must be remade before it can reconnect. + */ + destroy(): Promise; + + /** + * Sends a payload to the gateway, this may not resolve instantly if: + * 1. We're currently rate-limited. + * 2. The shard is not connected to the gateway. + * + * @param payload The payload to send. + * @param important Whether this is an important payload. + */ + send(payload: GatewaySendPayload, important?: boolean): Promise; + + /** + * Sends a payload immediately, bypassing any rate-limiting. + * This is NOT recommended at all, to make sure you don't get rate-limited use {@see IShard#send} + * + * @param payload The payload to send. + */ + sendNow(payload: GatewaySendPayload): Promise; +} + +export type ShardEvents = { + /** + * Emitted when a dispatch event is received. + * @param payload The received dispatch payload. + */ + dispatch: (payload: GatewayDispatchPayload) => void; + /** + * Used for debugging the shard. + * @param message + */ + debug: (message: string) => void; + /** + * Emitted when the shard has become ready. + */ + ready: (unavailableGuilds: Array) => void; + close: (code: number, reason: string, clean: boolean) => void; + state: (current: ShardState, updated: ShardState) => void; +} + +export interface DisconnectOptions { + /** + * Whether to immediately reconnect. + * @default false + */ + reconnect: boolean; + /** + * The close code to use. + * @default 1_000 + */ + code: number; + /** + * Whether this is a fatal disconnect. + * @default false + */ + fatal: boolean; +} diff --git a/src/shard/state.ts b/src/shard/state.ts new file mode 100644 index 0000000..e93476e --- /dev/null +++ b/src/shard/state.ts @@ -0,0 +1,13 @@ +// TODO: clean up shard states + +export enum ShardState { + Idle, + Ready, + Disconnecting, + Disconnected, + Reconnecting, + Connecting, + Resuming, + Identifying, + Destroyed +} diff --git a/src/util/functions.ts b/src/util/functions.ts new file mode 100644 index 0000000..7e63d1f --- /dev/null +++ b/src/util/functions.ts @@ -0,0 +1,3 @@ +export function createArray(length: number, mapper: (index: number) => T): T[] { + return Array.from({ length }, (_, i) => mapper(i)); +} diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json index 00e1d3a..b09808c 100644 --- a/tsconfig.eslint.json +++ b/tsconfig.eslint.json @@ -1,8 +1,8 @@ { - "extends": "./tsconfig.json", - "include": [ - "src/**/*.ts", - "src/**/*.test.ts", - "src/**/*.spec.ts" - ] -} \ No newline at end of file + "extends": "./tsconfig.json", + "include": [ + "src/**/*.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts" + ] +} diff --git a/tsconfig.json b/tsconfig.json index fdce472..352b66f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,48 +1,60 @@ { - "compilerOptions": { - /* Basic */ - "lib": ["ESNext"], - "target": "ESNext", - "module": "CommonJS", - "skipLibCheck": true, + "compilerOptions": { + /* Basic */ + "lib": [ + "ESNext", + "ESNext.Array", + "ESNext.AsyncIterable", + "ESNext.BigInt", + "ESNext.Promise", + "ESNext.String", + "ESNext.Symbol" + ], + "target": "ESNext", + "module": "commonjs", + "skipLibCheck": true, - /* Compiling */ - "inlineSourceMap": false, - "declaration": false, - "allowJs": true, - "rootDir": "./src", - "outDir": "./dist", + /* Compiling */ + "inlineSourceMap": false, + "declaration": false, + "allowJs": true, + "rootDir": "./src", + "outDir": "./dist", + "removeComments": true, + "importHelpers": true, - /* Strict Options */ - "strict": true, - "noImplicitAny": true, - "strictNullChecks": true, - "strictBindCallApply": true, - "strictPropertyInitialization": true, - "noImplicitThis": true, - "alwaysStrict": true, - "noFallthroughCasesInSwitch": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "pretty": true, - "experimentalDecorators": true, - "emitDecoratorMetadata": true, - "importsNotUsedAsValues": "error", + /* Strict Options */ + "strict": true, + "useDefineForClassFields": false, + "noImplicitAny": true, + "strictNullChecks": true, + "strictBindCallApply": true, + "strictPropertyInitialization": true, + "noImplicitThis": true, + "alwaysStrict": true, + "noFallthroughCasesInSwitch": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "pretty": false, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "importsNotUsedAsValues": "error", - /* Types */ - "types": [ "node" ], - "forceConsistentCasingInFileNames": true, - "moduleResolution": "node", + /* Types */ + "types": [ + "node" + ], + "forceConsistentCasingInFileNames": true, + "moduleResolution": "node", - /* Module Resolution */ - "resolveJsonModule": true, - "esModuleInterop": true - }, - "include": [ - "./src/**/*", - "**/*.test.*" - ], - "exclude": [ - "./node_modules" - ] -} \ No newline at end of file + /* Module Resolution */ + "resolveJsonModule": true, + "esModuleInterop": true + }, + "include": [ + "./src/**/*" + ], + "exclude": [ + "./node_modules" + ] +} diff --git a/yarn.lock b/yarn.lock index 5c15b35..793aab5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,12 +2,13 @@ # yarn lockfile v1 -"@ava/typescript@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@ava/typescript/-/typescript-1.1.1.tgz#3dcaba3aced8026fdb584d927d809752854dc6e6" - integrity sha512-KbLUAe2cWXK63WLK6LnOJonjwEDU/8MNXCOA1ooX/YFZgKRmeAD1kZu+2K0ks5fnOCEcckNQAooyBNGdZUmMQA== +"@ava/typescript@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@ava/typescript/-/typescript-2.0.0.tgz#519aff16ce53bec7f323cae0bcf427a957679ba3" + integrity sha512-sn+upcMk81AMrlnx/hb/9T7gCGuBfw7hi+p79NPSSQMvY2G64mOB7qRaDExiHiZfZ7FN9j7HwQeFhHZLGD/NWQ== dependencies: - escape-string-regexp "^2.0.0" + escape-string-regexp "^4.0.0" + execa "^5.0.0" "@babel/code-frame@7.12.11": version "7.12.11" @@ -44,24 +45,57 @@ dependencies: arrify "^1.0.1" -"@eslint/eslintrc@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.0.tgz#99cc0a0584d72f1df38b900fb062ba995f395547" - integrity sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog== +"@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" espree "^7.3.0" - globals "^12.1.0" + globals "^13.9.0" ignore "^4.0.6" import-fresh "^3.2.1" js-yaml "^3.13.1" minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@neocord/eslint-config@neo-cord/eslint-config": - version "1.0.4" - resolved "https://codeload.github.com/neo-cord/eslint-config/tar.gz/f2595817dd7a283b3404da8b7513538c6a09a738" +"@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== + +"@keiryo/common@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@keiryo/common/-/common-1.0.2.tgz#db83e083fdc0e2b82b3926d982c0c29265cbb14b" + integrity sha512-SRe94kbnhzbpEKkAPYiOiONn3x847D2jm6wLqrz6Pxv6iZ7+kXb4xqAP6/qqKgB109Liwe2Dgm2vS3A68N5iyw== + dependencies: + tiny-typed-emitter "^2.1.0" + +"@keiryo/eslint-config@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@keiryo/eslint-config/-/eslint-config-1.0.1.tgz#ed3ad2d3932087121fd5fa9ccd23b266677841fe" + integrity sha512-unKVKRXH5HOGaZUalv4CJ8FMPo8w57fdiRZ4MqlRIweDkXtrVhFHZG92DwvbvKSXiDnJ+f+Uw/T//uhDQGWXdA== + +"@keiryo/rest@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@keiryo/rest/-/rest-1.0.1.tgz#55ac9c17f96de977d832f7ddcc3a1556afb02599" + integrity sha512-SARCNgZuHdms8bdhIGMPB2cFELpcpxJ42nVZG78Cgxifl6dNGgGVQjFW3y4yzK8//3+GQQcIiJVpv8HSQonBPQ== + dependencies: + "@keiryo/common" "^1.0.2" + abort-controller "^3.0.0" + tiny-typed-emitter "^2.1.0" + tslib "^2.3.1" + undici "^4.7.0" "@nodelib/fs.scandir@2.1.4": version "2.1.4" @@ -96,91 +130,109 @@ dependencies: defer-to-connect "^1.0.1" -"@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/node@14.14.41": - version "14.14.41" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.41.tgz#d0b939d94c1d7bd53d04824af45f1139b8c45615" - integrity sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g== +"@types/node@*": + version "16.10.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.10.1.tgz#f3647623199ca920960006b3dccf633ea905f243" + integrity sha512-4/Z9DMPKFexZj/Gn3LylFgamNKHm4K3QDi0gz9B26Uk0c8izYf97B5fxfpspMNkWlFupblKM/nV8+NA9Ffvr+w== + +"@types/node@16.9.6": + version "16.9.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.9.6.tgz#040a64d7faf9e5d9e940357125f0963012e66f04" + integrity sha512-YHUZhBOMTM3mjFkXVcK+WwAcYmyhe1wL4lfqNtzI0b3qAy7yuSetnM7QJazgE5PFmgVTNGiLOgRFfJMqW7XpSQ== "@types/normalize-package-data@^2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== -"@typescript-eslint/eslint-plugin@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.22.0.tgz#3d5f29bb59e61a9dba1513d491b059e536e16dbc" - integrity sha512-U8SP9VOs275iDXaL08Ln1Fa/wLXfj5aTr/1c0t0j6CdbOnxh+TruXu1p4I0NAvdPBQgoPjHsgKn28mOi0FzfoA== +"@types/ws@^8.2.0": + version "8.2.0" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.2.0.tgz#75faefbe2328f3b833cb8dc640658328990d04f3" + integrity sha512-cyeefcUCgJlEk+hk2h3N+MqKKsPViQgF5boi9TTHSK+PoR9KWBb/C5ccPcDyAqgsbAYHTwulch725DV84+pSpg== dependencies: - "@typescript-eslint/experimental-utils" "4.22.0" - "@typescript-eslint/scope-manager" "4.22.0" - debug "^4.1.1" + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.2.tgz#9f41efaee32cdab7ace94b15bd19b756dd099b0a" + integrity sha512-w63SCQ4bIwWN/+3FxzpnWrDjQRXVEGiTt9tJTRptRXeFvdZc/wLiz3FQUwNQ2CVoRGI6KUWMNUj/pk63noUfcA== + dependencies: + "@typescript-eslint/experimental-utils" "4.31.2" + "@typescript-eslint/scope-manager" "4.31.2" + 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" - -"@typescript-eslint/experimental-utils@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.22.0.tgz#68765167cca531178e7b650a53456e6e0bef3b1f" - integrity sha512-xJXHHl6TuAxB5AWiVrGhvbGL8/hbiCQ8FiWwObO3r0fnvBdrbWEDy1hlvGQOAWc6qsCWuWMKdVWlLAEMpxnddg== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/scope-manager" "4.22.0" - "@typescript-eslint/types" "4.22.0" - "@typescript-eslint/typescript-estree" "4.22.0" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/parser@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.22.0.tgz#e1637327fcf796c641fe55f73530e90b16ac8fe8" - integrity sha512-z/bGdBJJZJN76nvAY9DkJANYgK3nlRstRRi74WHm3jjgf2I8AglrSY+6l7ogxOmn55YJ6oKZCLLy+6PW70z15Q== - dependencies: - "@typescript-eslint/scope-manager" "4.22.0" - "@typescript-eslint/types" "4.22.0" - "@typescript-eslint/typescript-estree" "4.22.0" - debug "^4.1.1" + regexpp "^3.1.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz#98727a9c1e977dd5d20c8705e69cd3c2a86553fa" + integrity sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q== + dependencies: + "@types/json-schema" "^7.0.7" + "@typescript-eslint/scope-manager" "4.31.2" + "@typescript-eslint/types" "4.31.2" + "@typescript-eslint/typescript-estree" "4.31.2" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/parser@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.31.2.tgz#54aa75986e3302d91eff2bbbaa6ecfa8084e9c34" + integrity sha512-EcdO0E7M/sv23S/rLvenHkb58l3XhuSZzKf6DBvLgHqOYdL6YFMYVtreGFWirxaU2mS1GYDby3Lyxco7X5+Vjw== + dependencies: + "@typescript-eslint/scope-manager" "4.31.2" + "@typescript-eslint/types" "4.31.2" + "@typescript-eslint/typescript-estree" "4.31.2" + debug "^4.3.1" -"@typescript-eslint/scope-manager@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.22.0.tgz#ed411545e61161a8d702e703a4b7d96ec065b09a" - integrity sha512-OcCO7LTdk6ukawUM40wo61WdeoA7NM/zaoq1/2cs13M7GyiF+T4rxuA4xM+6LeHWjWbss7hkGXjFDRcKD4O04Q== +"@typescript-eslint/scope-manager@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz#1d528cb3ed3bcd88019c20a57c18b897b073923a" + integrity sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w== dependencies: - "@typescript-eslint/types" "4.22.0" - "@typescript-eslint/visitor-keys" "4.22.0" + "@typescript-eslint/types" "4.31.2" + "@typescript-eslint/visitor-keys" "4.31.2" -"@typescript-eslint/types@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.22.0.tgz#0ca6fde5b68daf6dba133f30959cc0688c8dd0b6" - integrity sha512-sW/BiXmmyMqDPO2kpOhSy2Py5w6KvRRsKZnV0c4+0nr4GIcedJwXAq+RHNK4lLVEZAJYFltnnk1tJSlbeS9lYA== +"@typescript-eslint/types@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.31.2.tgz#2aea7177d6d744521a168ed4668eddbd912dfadf" + integrity sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w== -"@typescript-eslint/typescript-estree@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.22.0.tgz#b5d95d6d366ff3b72f5168c75775a3e46250d05c" - integrity sha512-TkIFeu5JEeSs5ze/4NID+PIcVjgoU3cUQUIZnH3Sb1cEn1lBo7StSV5bwPuJQuoxKXlzAObjYTilOEKRuhR5yg== +"@typescript-eslint/typescript-estree@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz#abfd50594d8056b37e7428df3b2d185ef2d0060c" + integrity sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA== dependencies: - "@typescript-eslint/types" "4.22.0" - "@typescript-eslint/visitor-keys" "4.22.0" - debug "^4.1.1" - globby "^11.0.1" + "@typescript-eslint/types" "4.31.2" + "@typescript-eslint/visitor-keys" "4.31.2" + debug "^4.3.1" + globby "^11.0.3" is-glob "^4.0.1" - semver "^7.3.2" - tsutils "^3.17.1" + semver "^7.3.5" + tsutils "^3.21.0" -"@typescript-eslint/visitor-keys@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.22.0.tgz#169dae26d3c122935da7528c839f42a8a42f6e47" - integrity sha512-nnMu4F+s4o0sll6cBSsTeVsT4cwxB7zECK3dFxzEjPBii9xLpq4yqqsy/FU5zMfan6G60DKZSCXAa3sHJZrcYw== +"@typescript-eslint/visitor-keys@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz#7d5b4a4705db7fe59ecffb273c1d082760f635cc" + integrity sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug== dependencies: - "@typescript-eslint/types" "4.22.0" + "@typescript-eslint/types" "4.31.2" eslint-visitor-keys "^2.0.0" +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + acorn-jsx@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" @@ -653,7 +705,7 @@ convert-to-spaces@^1.0.1: resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715" integrity sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU= -cross-spawn@^7.0.2: +cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -738,6 +790,11 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +discord-api-types@^0.23.1: + version "0.23.1" + resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.23.1.tgz#832d0ee2b3c8e2eae02947c1dbf38121d6d357d5" + integrity sha512-igWmn+45mzXRWNEPU25I/pr8MwxHb767wAr51oy3VRLRcTlp5ADBbrBR0lq3SA1Rfw3MtM4TQu1xo3kxscfVdQ== + doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -823,7 +880,7 @@ 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-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== @@ -831,13 +888,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" @@ -848,28 +912,31 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -eslint@7.25.0: - version "7.25.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.25.0.tgz#1309e4404d94e676e3e831b3a3ad2b050031eb67" - integrity sha512-TVpSovpvCNpLURIScDRB6g5CYu/ZFq9GfX2hLNIV4dSBKxIWojeDODvYl3t0k0VtMxYeR8OXPCFE5+oHMlGfhw== +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.0" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" enquirer "^2.3.5" + escape-string-regexp "^4.0.0" eslint-scope "^5.1.1" eslint-utils "^2.1.0" eslint-visitor-keys "^2.0.0" espree "^7.3.1" esquery "^1.4.0" esutils "^2.0.2" + fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" + glob-parent "^5.1.2" globals "^13.6.0" ignore "^4.0.6" import-fresh "^3.0.0" @@ -878,7 +945,7 @@ eslint@7.25.0: js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.21" + lodash.merge "^4.6.2" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -887,7 +954,7 @@ eslint@7.25.0: semver "^7.2.1" strip-ansi "^6.0.0" strip-json-comments "^3.1.0" - table "^6.0.4" + table "^6.0.9" text-table "^0.2.0" v8-compile-cache "^2.0.3" @@ -934,7 +1001,27 @@ esutils@^2.0.2, esutils@^2.0.3: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -fast-deep-equal@^3.1.1: +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -1061,7 +1148,12 @@ get-stream@^5.1.0: dependencies: pump "^3.0.0" -glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob-parent@^5.1.0, glob-parent@^5.1.2, glob-parent@~5.1.0: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -1087,13 +1179,6 @@ global-dirs@^3.0.0: dependencies: ini "2.0.0" -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== - dependencies: - type-fest "^0.8.1" - globals@^13.6.0: version "13.8.0" resolved "https://registry.yarnpkg.com/globals/-/globals-13.8.0.tgz#3e20f504810ce87a8d72e55aecf8435b50f4c1b3" @@ -1101,6 +1186,13 @@ globals@^13.6.0: dependencies: type-fest "^0.20.2" +globals@^13.9.0: + version "13.11.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7" + integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g== + dependencies: + type-fest "^0.20.2" + globby@^11.0.1: version "11.0.3" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" @@ -1113,6 +1205,18 @@ globby@^11.0.1: merge2 "^1.3.0" slash "^3.0.0" +globby@^11.0.3: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + got@^9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -1167,6 +1271,11 @@ http-cache-semantics@^4.0.0: resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -1347,6 +1456,11 @@ is-promise@^4.0.0: resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -1473,17 +1587,17 @@ lodash.clonedeep@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= -lodash.flatten@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash.truncate@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= -lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21: +lodash@^4.17.15, lodash@^4.17.20: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -1549,6 +1663,11 @@ mem@^8.0.0: map-age-cleaner "^0.1.3" mimic-fn "^3.1.0" +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + merge2@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" @@ -1624,6 +1743,13 @@ normalize-url@^4.1.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -1631,7 +1757,7 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.0: +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -1782,7 +1908,7 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-key@^3.1.0: +path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== @@ -1912,7 +2038,7 @@ readdirp@~3.5.0: dependencies: picomatch "^2.2.1" -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== @@ -2027,7 +2153,7 @@ semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: +semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -2058,6 +2184,11 @@ signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== +signal-exit@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.4.tgz#366a4684d175b9cab2081e3681fda3747b6c51d7" + integrity sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -2176,6 +2307,11 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -2211,14 +2347,13 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -table@^6.0.4: - version "6.5.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.5.1.tgz#930885a7430f15f8766b35cd1e36de40793db523" - integrity sha512-xGDXWTBJxahkzPQCsn1S9ESHEenU7TbMD5Iv4FeopXv/XwJyWatFjfbor+6ipI10/MNPXBYUamYukOrbPZ9L/w== +table@^6.0.9: + version "6.7.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" + integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== dependencies: ajv "^8.0.1" lodash.clonedeep "^4.5.0" - lodash.flatten "^4.4.0" lodash.truncate "^4.4.2" slice-ansi "^4.0.0" string-width "^4.2.0" @@ -2239,6 +2374,11 @@ time-zone@^1.0.0: resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d" integrity sha1-mcW/VZWJZq9tBtg73zgA3IL67F0= +tiny-typed-emitter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz#b3b027fdd389ff81a152c8e847ee2f5be9fad7b5" + integrity sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA== + to-readable-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" @@ -2261,7 +2401,12 @@ 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: +tslib@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +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== @@ -2295,11 +2440,6 @@ type-fest@^0.6.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -2307,10 +2447,15 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961" - integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg== +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== + +undici@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-4.7.0.tgz#3bda286d67bf45d0ab1b94ca6c84e546dcb3b0d4" + integrity sha512-O1q+/EIs4g0HnVMH8colei3qODGiYBLpavWYv3kI+JazBBsBIndnZfUqZ2MEfPJ12H9d56yVdwZG1/nV/xcoSQ== unique-string@^2.0.0: version "2.0.0" @@ -2426,6 +2571,11 @@ write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +ws@^8.2.2: + version "8.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.2.tgz#ca684330c6dd6076a737250ed81ac1606cb0a63e" + integrity sha512-Q6B6H2oc8QY3llc3cB8kVmQ6pnJWVQbP7Q5algTcIxx7YEpc0oU4NBVHlztA7Ekzfhw2r0rPducMUiCGWKQRzw== + xdg-basedir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"