├── .gitattributes ├── src ├── index.ts ├── discord.js.ts ├── eris.ts ├── oceanic.ts ├── cloudstorm.ts ├── detritus.ts └── lib │ ├── Types.ts │ ├── Rest.ts │ ├── LavalinkNode.ts │ ├── Player.ts │ └── Manager.ts ├── .github ├── FUNDING.yml └── workflows │ ├── lint.yml │ ├── tsc.yml │ ├── codeql.yml │ └── update-documentation.yml ├── eslint.config.mjs ├── tsconfig.json ├── .gitignore ├── package.json ├── README.md ├── LICENSE └── yarn.lock /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./lib/LavalinkNode"; 2 | export * from "./lib/Player"; 3 | export * from "./lib/Manager"; 4 | export * from "./lib/Rest"; 5 | export * from "./lib/Types"; 6 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [AmandaDiscord, MrJacz] 4 | patreon: 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | custom: # Replace with a single custom sponsorship URL 9 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | 3 | import eslint from '@eslint/js'; 4 | import tseslint from 'typescript-eslint'; 5 | import { globalIgnores } from "eslint/config"; 6 | 7 | export default tseslint.config( 8 | globalIgnores(["docs"]), 9 | eslint.configs.recommended, 10 | tseslint.configs.recommended, 11 | tseslint.configs.strict, 12 | tseslint.configs.stylistic, 13 | { 14 | ignores: ["node_modules", "docs", "dist"], 15 | rules: { 16 | "@typescript-eslint/no-non-null-assertion": "off", 17 | "@typescript-eslint/no-unsafe-declaration-merging": "off", 18 | "@typescript-eslint/no-explicit-any": ["error", { 19 | "ignoreRestArgs": true 20 | }] 21 | } 22 | } 23 | ); 24 | 25 | -------------------------------------------------------------------------------- /.github/workflows/lint.yml: -------------------------------------------------------------------------------- 1 | name: Lint 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | 9 | jobs: 10 | eslint: 11 | name: eslint 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout Project 15 | uses: actions/checkout@v4 16 | - name: Install Node 17 | uses: actions/setup-node@v4 18 | with: 19 | node-version: 20 20 | - name: Restore CI Cache 21 | uses: actions/cache@v4 22 | with: 23 | path: node_modules 24 | key: ${{ runner.os }}-16-${{ hashFiles('**/yarn.lock') }} 25 | - name: Install Dependencies 26 | run: yarn --ignore-scripts 27 | - name: Run ESLint 28 | run: yarn lint 29 | -------------------------------------------------------------------------------- /.github/workflows/tsc.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | 9 | jobs: 10 | tsc: 11 | name: tsc 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout Project 15 | uses: actions/checkout@v4 16 | - name: Install Node 17 | uses: actions/setup-node@v4 18 | with: 19 | node-version: 20 20 | - name: Restore CI Cache 21 | uses: actions/cache@v4 22 | with: 23 | path: node_modules 24 | key: ${{ runner.os }}-16-${{ hashFiles('**/yarn.lock') }} 25 | - name: Install Dependencies 26 | run: yarn --ignore-scripts 27 | - name: Compile TypeScript 28 | run: yarn compile 29 | -------------------------------------------------------------------------------- /.github/workflows/codeql.yml: -------------------------------------------------------------------------------- 1 | name: "CodeQL" 2 | 3 | on: 4 | push: 5 | branches: [ "master", "LL-v4" ] 6 | pull_request: 7 | branches: [ "master", "LL-v4" ] 8 | schedule: 9 | - cron: "56 19 * * 3" 10 | 11 | jobs: 12 | analyze: 13 | name: Analyze 14 | runs-on: ubuntu-latest 15 | permissions: 16 | actions: read 17 | contents: read 18 | security-events: write 19 | 20 | strategy: 21 | fail-fast: false 22 | matrix: 23 | language: [ javascript ] 24 | 25 | steps: 26 | - name: Checkout 27 | uses: actions/checkout@v4 28 | 29 | - name: Initialize CodeQL 30 | uses: github/codeql-action/init@v2 31 | with: 32 | languages: ${{ matrix.language }} 33 | queries: +security-and-quality 34 | 35 | - name: Autobuild 36 | uses: github/codeql-action/autobuild@v2 37 | 38 | - name: Perform CodeQL Analysis 39 | uses: github/codeql-action/analyze@v2 40 | with: 41 | category: "/language:${{ matrix.language }}" 42 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowSyntheticDefaultImports": true, 4 | "esModuleInterop": true, 5 | "alwaysStrict": true, 6 | "declaration": true, 7 | "emitDecoratorMetadata": true, 8 | "experimentalDecorators": true, 9 | "strict": true, 10 | "incremental": true, 11 | "lib": ["esnext"], 12 | "module": "commonjs", 13 | "moduleResolution": "node", 14 | "noUnusedLocals": true, 15 | "outDir": "./dist", 16 | "pretty": true, 17 | "removeComments": false, 18 | "resolveJsonModule": true, 19 | "sourceMap": true, 20 | "strictFunctionTypes": true, 21 | "strictBindCallApply": true, 22 | "target": "esnext", 23 | "types": ["node", "ws"], 24 | "skipLibCheck": true 25 | }, 26 | "exclude": ["node_modules"], 27 | "include": ["src"], 28 | "typedocOptions": { 29 | "entryPoints": ["src/index.ts"], 30 | "out": "./docs/", 31 | "readme": "./README.md", 32 | "name": "Lavacord", 33 | "exclude": ["**/node_modules/**"], 34 | "excludeExternals": true, 35 | "excludePrivate": true, 36 | "excludeProtected": true 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Optional npm cache directory 40 | .npm 41 | 42 | # Optional eslint cache 43 | .eslintcache 44 | 45 | # Optional REPL history 46 | .node_repl_history 47 | 48 | # Output of 'npm pack' 49 | *.tgz 50 | 51 | # Yarn Integrity file 52 | .yarn-integrity 53 | 54 | # dotenv environment variables file 55 | .env 56 | 57 | # Build 58 | dist/ 59 | docs 60 | -------------------------------------------------------------------------------- /src/discord.js.ts: -------------------------------------------------------------------------------- 1 | import { Manager as BaseManager } from "./lib/Manager"; 2 | import type { ManagerOptions, LavalinkNodeOptions } from "./lib/Types"; 3 | 4 | import { Client, GatewayDispatchEvents } from "discord.js"; 5 | 6 | export * from "./index"; 7 | 8 | export class Manager extends BaseManager { 9 | public constructor(public readonly client: Client, nodes: LavalinkNodeOptions[], options?: ManagerOptions) { 10 | if (!options) options = {}; 11 | if (!options.user) options.user = client.user?.id; 12 | super(nodes, options); 13 | 14 | if (!this.send) { 15 | this.send = packet => { 16 | const guild = this.client.guilds.cache.get(packet.d.guild_id); 17 | if (guild) { 18 | guild.shard.send(packet); 19 | return true; 20 | } else { 21 | return false; 22 | } 23 | }; 24 | } 25 | 26 | client.ws 27 | .on(GatewayDispatchEvents.VoiceServerUpdate, this.voiceServerUpdate.bind(this)) 28 | .on(GatewayDispatchEvents.VoiceStateUpdate, this.voiceStateUpdate.bind(this)) 29 | .on(GatewayDispatchEvents.GuildCreate, data => { 30 | for (const state of data.voice_states ?? []) this.voiceStateUpdate({ ...state, guild_id: data.id }); 31 | }); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/eris.ts: -------------------------------------------------------------------------------- 1 | import { Manager as BaseManager } from "./lib/Manager"; 2 | import type { ManagerOptions, LavalinkNodeOptions, DiscordPacket } from "./lib/Types"; 3 | 4 | import type { Client } from "eris"; 5 | 6 | export * from "./index"; 7 | 8 | export class Manager extends BaseManager { 9 | public constructor(public readonly client: Client, nodes: LavalinkNodeOptions[], options?: ManagerOptions) { 10 | if (!options) options = {}; 11 | if (!options.user) options.user = client.user?.id; 12 | super(nodes, options); 13 | 14 | if (!this.send) { 15 | this.send = packet => { 16 | const guild = this.client.guilds.get(packet.d.guild_id); 17 | if (guild) { 18 | guild.shard.sendWS(packet.op, packet.d); 19 | return true; 20 | } else { 21 | return false; 22 | } 23 | }; 24 | } 25 | 26 | client.on("rawWS", (packet: DiscordPacket) => { 27 | switch (packet.t) { 28 | case "VOICE_SERVER_UPDATE": 29 | this.voiceServerUpdate(packet.d); 30 | break; 31 | 32 | case "VOICE_STATE_UPDATE": 33 | this.voiceStateUpdate(packet.d); 34 | break; 35 | 36 | case "GUILD_CREATE": 37 | for (const state of packet.d.voice_states ?? []) this.voiceStateUpdate({ ...state, guild_id: packet.d.id }); 38 | break; 39 | 40 | default: break; 41 | } 42 | }); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/oceanic.ts: -------------------------------------------------------------------------------- 1 | import { Manager as BaseManager } from "./lib/Manager"; 2 | import type { ManagerOptions, LavalinkNodeOptions, VoiceServerUpdate, VoiceStateUpdate } from "./lib/Types"; 3 | import type { Client } from "oceanic.js"; 4 | 5 | export * from "./index"; 6 | 7 | export class Manager extends BaseManager { 8 | public constructor(public readonly client: Client, nodes: LavalinkNodeOptions[], options?: ManagerOptions) { 9 | if (!options) options = {}; 10 | if (!options.user) options.user = client.user?.id; 11 | super(nodes, options); 12 | 13 | if (!this.send) { 14 | this.send = packet => { 15 | const guild = this.client.guilds.get(packet.d.guild_id); 16 | if (guild) { 17 | guild.shard.send(packet.op, packet.d); 18 | return true; 19 | } else { 20 | return false; 21 | } 22 | }; 23 | } 24 | 25 | client.on("packet", packet => { 26 | switch (packet.t) { 27 | case "VOICE_SERVER_UPDATE": 28 | this.voiceServerUpdate(packet.d as VoiceServerUpdate); 29 | break; 30 | 31 | case "VOICE_STATE_UPDATE": 32 | this.voiceStateUpdate(packet.d as VoiceStateUpdate); 33 | break; 34 | 35 | case "GUILD_CREATE": 36 | if (packet.d.unavailable) break; 37 | for (const state of packet.d.voice_states ?? []) this.voiceStateUpdate({ ...state, guild_id: packet.d.id } as VoiceStateUpdate); 38 | break; 39 | 40 | default: break; 41 | } 42 | }); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/cloudstorm.ts: -------------------------------------------------------------------------------- 1 | import { Manager as BaseManager } from "./lib/Manager"; 2 | import type { ManagerOptions, LavalinkNodeOptions, VoiceServerUpdate, VoiceStateUpdate } from "./lib/Types"; 3 | 4 | import { Client } from "cloudstorm"; 5 | 6 | export * from "./index"; 7 | 8 | export class Manager extends BaseManager { 9 | public constructor(public readonly client: Client, nodes: LavalinkNodeOptions[], options: ManagerOptions) { 10 | super(nodes, options); 11 | 12 | if (!this.send) { 13 | this.send = packet => { 14 | if (!this.client.options.totalShards) return false; 15 | 16 | const shardID = Number((BigInt(packet.d.guild_id) >> BigInt(22)) % BigInt(this.client.options.totalShards)); 17 | 18 | const s = Object.entries(this.client.shardManager.shards).find(e => String(e[0]) === String(shardID))?.[1]; 19 | 20 | if (s) { 21 | s.connector.sendMessage(packet); 22 | return true; 23 | } else { 24 | return false; 25 | } 26 | }; 27 | } 28 | 29 | client.on("event", packet => { 30 | switch (packet.t) { 31 | case "VOICE_SERVER_UPDATE": 32 | this.voiceServerUpdate(packet.d as VoiceServerUpdate); 33 | break; 34 | 35 | case "VOICE_STATE_UPDATE": 36 | this.voiceStateUpdate(packet.d as VoiceStateUpdate); 37 | break; 38 | 39 | case "GUILD_CREATE": 40 | for (const state of packet.d.voice_states ?? []) this.voiceStateUpdate({ ...state, guild_id: packet.d.id } as VoiceStateUpdate); 41 | break; 42 | 43 | default: break; 44 | } 45 | }); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/detritus.ts: -------------------------------------------------------------------------------- 1 | import { Manager as BaseManager } from "./lib/Manager"; 2 | import type { ManagerOptions, LavalinkNodeOptions } from "./lib/Types"; 3 | 4 | import type { ClusterClient, ShardClient } from "detritus-client"; 5 | 6 | export * from "./index"; 7 | 8 | export class Manager extends BaseManager { 9 | public constructor(public readonly client: ClusterClient | ShardClient, nodes: LavalinkNodeOptions[], options: ManagerOptions) { 10 | super(nodes, options); 11 | 12 | if (!this.send) { 13 | this.send = packet => { 14 | const asCluster = this.client as ClusterClient; 15 | const asShard = this.client as ShardClient; 16 | 17 | if (asShard.guilds) { 18 | asShard.gateway.send(packet.op, packet.d); 19 | return true; 20 | } else if (asCluster.shards) { 21 | const shard = asCluster.shards.find(c => c.guilds.has(packet.d.guild_id)); 22 | if (shard) { 23 | shard.gateway.send(packet.op, packet.d); 24 | return true; 25 | } else { 26 | return false; 27 | } 28 | } 29 | }; 30 | } 31 | 32 | client.on("raw", packet => { 33 | switch (packet.t) { 34 | case "VOICE_SERVER_UPDATE": 35 | this.voiceServerUpdate(packet.d); 36 | break; 37 | 38 | case "VOICE_STATE_UPDATE": 39 | this.voiceStateUpdate(packet.d); 40 | break; 41 | 42 | case "GUILD_CREATE": 43 | for (const state of packet.d.voice_states ?? []) this.voiceStateUpdate({ ...state, guild_id: packet.d.id }); 44 | break; 45 | 46 | default: break; 47 | } 48 | }); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "lavacord", 3 | "version": "2.2.0", 4 | "description": "A simple by design lavalink wrapper made for any discord library.", 5 | "main": "./dist/index.js", 6 | "types": "./dist/index.d.ts", 7 | "scripts": { 8 | "postinstall": "yarn compile", 9 | "prepublishOnly": "yarn compile", 10 | "lint": "eslint . -c eslint.config.mjs --fix", 11 | "test": "eslint . -c eslint.config.mjs", 12 | "compile": "tsc -p .", 13 | "watch": "tsc -p . -w", 14 | "docs": "typedoc --plugin typedoc-github-theme" 15 | }, 16 | "repository": { 17 | "type": "git", 18 | "url": "git+https://github.com/lavacord/lavacord.git" 19 | }, 20 | "keywords": [ 21 | "bot", 22 | "music", 23 | "discord", 24 | "api", 25 | "lava", 26 | "link", 27 | "lavalink", 28 | "discord.js", 29 | "eris" 30 | ], 31 | "author": "Jack Nagle", 32 | "license": "Apache-2.0", 33 | "bugs": { 34 | "url": "https://github.com/lavacord/lavacord/issues" 35 | }, 36 | "homepage": "https://github.com/MrJacz/lavacord#readme", 37 | "dependencies": { 38 | "lavalink-types": "^2.1.1", 39 | "ws": "^8.18.1" 40 | }, 41 | "devDependencies": { 42 | "@eslint/eslintrc": "^3.3.1", 43 | "@eslint/js": "^9.26.0", 44 | "@types/node": "^22.13.10", 45 | "@types/ws": "^8.18.0", 46 | "@typescript-eslint/eslint-plugin": "^8.26.1", 47 | "@typescript-eslint/parser": "^8.26.1", 48 | "eslint": "^9.26.0", 49 | "eslint-plugin-node": "^11.1.0", 50 | "eslint-plugin-promise": "^7.2.1", 51 | "globals": "^16.1.0", 52 | "typedoc": "^0.28.4", 53 | "typedoc-github-theme": "^0.3.0", 54 | "typescript": "^5.8.3", 55 | "typescript-eslint": "^8.32.0" 56 | }, 57 | "optionalDependencies": { 58 | "cloudstorm": "0.13.2", 59 | "detritus-client": "0.16.x", 60 | "discord.js": "14.x", 61 | "eris": "0.18.x", 62 | "oceanic.js": "1.12.0" 63 | }, 64 | "files": [ 65 | "dist", 66 | "LICENSE" 67 | ], 68 | "engines": { 69 | "node": ">=16.15.0", 70 | "npm": ">=8" 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /.github/workflows/update-documentation.yml: -------------------------------------------------------------------------------- 1 | name: Generate API Documentation 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | 9 | jobs: 10 | TypeDoc: 11 | name: Generate API Documentation 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout Project 15 | uses: actions/checkout@v4 16 | - name: Install Node 17 | uses: actions/setup-node@v4 18 | with: 19 | node-version: 20 20 | - name: Restore CI Cache 21 | uses: actions/cache@v4 22 | with: 23 | path: node_modules 24 | key: ${{ runner.os }}-16-${{ hashFiles('**/yarn.lock') }} 25 | - name: Install Dependencies 26 | run: yarn 27 | - name: Test Docs 28 | if: github.event_name == 'pull_request' 29 | run: yarn docs 30 | - name: Publish Docs 31 | if: github.event_name == 'push' && (github.ref == 'refs/heads/master') 32 | run: | 33 | #!/bin/bash 34 | set -euxo pipefail 35 | echo -e "\n# Initialise some useful variables" 36 | REPO="https://${GITHUB_ACTOR}:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git" 37 | BRANCH_OR_TAG=`awk -F/ '{print $2}' <<< $GITHUB_REF` 38 | CURRENT_BRANCH=`awk -F/ '{print $NF}' <<< $GITHUB_REF` 39 | if [ "$BRANCH_OR_TAG" == "heads" ]; then 40 | SOURCE_TYPE="branch" 41 | else 42 | SOURCE_TYPE="tag" 43 | fi 44 | echo -e "\n# Checkout the repo in the target branch" 45 | TARGET_BRANCH="gh-pages" 46 | git clone $REPO out -b $TARGET_BRANCH 47 | 48 | yarn docs 49 | echo -e "\n# Move the generated docs to the newly-checked-out repo, to be committed and pushed" 50 | rsync -vau docs/ out/ 51 | rsync -vau README.md LICENSE out/ 52 | echo -e "\n# Commit and push" 53 | cd out 54 | git add --all . 55 | git config user.name "${GITHUB_ACTOR}" 56 | git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" 57 | git commit -m "Docs build: ${GITHUB_SHA}" || true 58 | git push origin $TARGET_BRANCH 59 | env: 60 | GITHUB_TOKEN: ${{ secrets.WORKFLOW_TOKEN }} 61 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Discord](https://discordapp.com/api/guilds/323779330033319941/embed.png)](https://discord.gg/wXrjZmV) 2 | [![npm (scoped)](https://img.shields.io/npm/v/lavacord?label=npm%20version)](https://www.npmjs.com/package/lavacord) 3 | [![npm downloads](https://img.shields.io/npm/dt/lavacord.svg?label=total%20downloads)](https://www.npmjs.com/package/lavacord) 4 | [![GitHub](https://img.shields.io/github/license/lavacord/lavacord)](https://github.com/lavacord/lavacord/) 5 | [![Depfu](https://badges.depfu.com/badges/70051aad57dddc0c44a990d26b1f6e23/overview.svg)](https://depfu.com/github/lavacord/Lavacord?project_id=11810) 6 | [![Codacy Badge](https://api.codacy.com/project/badge/Grade/b50839d781c24a94a4e1c17342a147bd)](https://www.codacy.com/app/lavacord/lavacord) 7 | 8 | # LavaCord 9 | A simple and easy to use lavalink wrapper. 10 | 11 | ## Documentation 12 | [**lavacord.github.io/lavacord**](https://lavacord.github.io/Lavacord/) 13 | 14 | ## Installation 15 | 16 | **For stable** 17 | ```bash 18 | # Using yarn 19 | yarn add lavacord 20 | 21 | # Using npm 22 | npm install lavacord 23 | ``` 24 | 25 | **For Development** 26 | ```bash 27 | # Using yarn 28 | yarn add lavacord/lavacord 29 | 30 | # Using npm 31 | npm install lavacord/lavacord 32 | ``` 33 | 34 | ## LavaLink configuration 35 | Download Lavalink from [their GitHub releases](https://github.com/lavalink-devs/Lavalink/releases) 36 | 37 | Put an `application.yml` file in your working directory. [Example](https://github.com/lavalink-devs/Lavalink/blob/master/LavalinkServer/application.yml.example) 38 | 39 | Run with `java -jar Lavalink.jar` 40 | 41 | ## The issue tracker is for issues only 42 | If you're having a problem with the module contact us in the [**Discord Server**](https://discord.gg/wXrjZmV) 43 | 44 | # Implementation 45 | Start by creating a new `Manager` passing an array of nodes and an object with `user` the client's user id. 46 | 47 | ```javascript 48 | // import the Manager class from lavacord 49 | const { Manager } = require("lavacord"); 50 | 51 | // Define the nodes array as an example 52 | const nodes = [ 53 | { id: "1", host: "localhost", port: 2333, password: "youshallnotpass" } 54 | ]; 55 | 56 | // Initilize the Manager with all the data it needs 57 | const manager = new Manager(nodes, { 58 | user: client.user.id, // Client id 59 | send: (packet) => { 60 | // this needs to send the provided packet to discord's WS using the method from your library. 61 | // use the bindings for the discord library you use if you don't understand this 62 | } 63 | }); 64 | 65 | // Connects all the LavalinkNode WebSockets 66 | await manager.connect(); 67 | 68 | // The error event, which you should handle otherwise your application will crash when an error is emitted 69 | manager.on("error", (error, node) => { 70 | error, // is the error 71 | node // is the node which the error is from 72 | }); 73 | ``` 74 | 75 | Resolving tracks using LavaLink REST API 76 | 77 | ```javascript 78 | const { Rest } = require("lavacord"); 79 | 80 | async function getSongs(search) { 81 | // This gets the best node available, what I mean by that is the idealNodes getter will filter all the connected nodes and then sort them from best to least beast. 82 | const node = manager.idealNodes[0]; 83 | 84 | return Rest.load(node, search) 85 | .catch(err => { 86 | console.error(err); 87 | return null; 88 | }); 89 | } 90 | 91 | getSongs("ytsearch:30 second song").then(songs => { 92 | // handle loading of the tracks somehow ¯\_(ツ)_/¯ 93 | }); 94 | ``` 95 | 96 | Joining and Leaving channels 97 | 98 | ```javascript 99 | // Join 100 | const player = await manager.join({ 101 | guild: guildId, // Guild id 102 | channel: channelId, // Channel id 103 | node: "1" // lavalink node id, based on array of nodes 104 | }); 105 | 106 | await player.play(track); // Track is a base64 string we get from Lavalink REST API 107 | 108 | player.once("error", error => console.error(error)); 109 | player.once("end", data => { 110 | if (data.type === "TrackEndEvent" && data.reason === "replaced") return; // Ignore replaced reason to prevent skip loops 111 | // Play next song 112 | }); 113 | 114 | // Leave voice channel and destroy Player 115 | await manager.leave(guildId); // Player ID aka guild id 116 | ``` 117 | -------------------------------------------------------------------------------- /src/lib/Types.ts: -------------------------------------------------------------------------------- 1 | import type { Player } from "./Player"; 2 | 3 | /** 4 | * Player Update Voice State 5 | */ 6 | export interface PlayerUpdateVoiceState { 7 | /** 8 | * The session id of the voice connection 9 | */ 10 | sessionId: string; 11 | /** 12 | * Event data 13 | */ 14 | event: VoiceServerUpdate; 15 | } 16 | 17 | /** 18 | * Manager Options 19 | */ 20 | export interface ManagerOptions { 21 | /** 22 | * User id of the bot 23 | */ 24 | user?: string; 25 | /** 26 | * The Player class that the manager uses to create Players, so users can modify this 27 | */ 28 | player?: typeof Player; 29 | /** 30 | * The send function for end users to implement for their specific library 31 | */ 32 | send?: (packet: DiscordPacket) => unknown; 33 | } 34 | 35 | /** 36 | * Manager Join Data 37 | */ 38 | export interface JoinData { 39 | /** 40 | * The guild id of the guild the voice channel is in, that you want to join 41 | */ 42 | guild: string; 43 | /** 44 | * The voice channel you want to join 45 | */ 46 | channel: string; 47 | /** 48 | * The LavalinkNode ID you want to use 49 | */ 50 | node: string; 51 | } 52 | 53 | /** 54 | * Manager Join Options 55 | */ 56 | export interface JoinOptions { 57 | /** 58 | * Whether or not the bot will be self muted when it joins the voice channel 59 | */ 60 | selfmute?: boolean; 61 | /** 62 | * Whether or not the bot will be self deafen when it joins the voice channel 63 | */ 64 | selfdeaf?: boolean; 65 | } 66 | 67 | /** 68 | * Voice Server Update 69 | */ 70 | export interface VoiceServerUpdate { 71 | /** 72 | * The token for the session 73 | */ 74 | token: string; 75 | /** 76 | * Guild if of the voice connection 77 | */ 78 | guild_id: string; 79 | /** 80 | * The endpoint lavalink will connect to 81 | */ 82 | endpoint: string; 83 | } 84 | 85 | /** 86 | * Voice State Update 87 | */ 88 | export interface VoiceStateUpdate { 89 | /** 90 | * Guild id 91 | */ 92 | guild_id: string; 93 | /** 94 | * channel id 95 | */ 96 | channel_id?: string; 97 | /** 98 | * User id 99 | */ 100 | user_id: string; 101 | /** 102 | * Session id 103 | */ 104 | session_id: string; 105 | /** 106 | * Whether the user is deafened or not 107 | */ 108 | deaf?: boolean; 109 | /** 110 | * Whether the user is muted or not 111 | */ 112 | mute?: boolean; 113 | /** 114 | * Whether the user is self-deafened or not 115 | */ 116 | self_deaf?: boolean; 117 | /** 118 | * Whether the user is self-muted or not 119 | */ 120 | self_mute?: boolean; 121 | /** 122 | * Whether the user is suppressed 123 | */ 124 | suppress?: boolean; 125 | } 126 | 127 | /** 128 | * Discord Packet 129 | */ 130 | export interface DiscordPacket { 131 | /** 132 | * opcode for the payload 133 | */ 134 | op: number; 135 | /** 136 | * event data 137 | */ 138 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 139 | d: any; 140 | /** 141 | * sequence number, used for resuming sessions and heartbeats 142 | */ 143 | s?: number; 144 | /** 145 | * the event name for this payload 146 | */ 147 | t?: string; 148 | } 149 | 150 | /** 151 | * Lavalink Node Options 152 | */ 153 | export interface LavalinkNodeOptions { 154 | /** 155 | * The id of the LavalinkNode so Nodes are better organized 156 | */ 157 | id: string; 158 | /** 159 | * The host of the LavalinkNode, this could be a ip or domain. 160 | */ 161 | host: string; 162 | /** 163 | * The port of the LavalinkNode 164 | */ 165 | port?: number | string; 166 | /** 167 | * The password of the lavalink node 168 | */ 169 | password?: string; 170 | /** 171 | * The interval that the node will try to reconnect to lavalink at in milliseconds 172 | */ 173 | reconnectInterval?: number; 174 | /** 175 | * The previous sessionId to send to the LavalinkNode so you can resume properly 176 | */ 177 | sessionId?: string; 178 | /** 179 | * If the node should attempt to resume if the sessionId is present on WS open/node ready 180 | */ 181 | resuming?: boolean; 182 | /** 183 | * Resume timeout 184 | */ 185 | resumeTimeout?: number; 186 | /** 187 | * Extra info attached to your node, not required and is not sent to lavalink, purely for you. 188 | */ 189 | state?: unknown; 190 | } 191 | 192 | export interface LavalinkStats { 193 | op?: number; 194 | 195 | players?: number; 196 | 197 | playingPlayers?: number; 198 | 199 | uptime: number; 200 | 201 | memory?: { 202 | free?: number; 203 | used?: number; 204 | allocated?: number; 205 | reservable?: number; 206 | }; 207 | 208 | cpu?: { 209 | cores?: number; 210 | systemLoad?: number; 211 | lavalinkLoad?: number; 212 | }; 213 | 214 | frameStats?: { 215 | sent?: number; 216 | nulled?: number; 217 | deficit?: number; 218 | }; 219 | } -------------------------------------------------------------------------------- /src/lib/Rest.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-extraneous-class */ 2 | import { URLSearchParams } from "url"; 3 | import type { LavalinkNode } from "./LavalinkNode"; 4 | import type { TrackLoadingResult, DecodeTrackResult, DecodeTracksResult, GetLavalinkVersionResult, UpdateSessionResult, UpdateSessionData, ErrorResponse, UpdatePlayerData, UpdatePlayerResult, DestroyPlayerResult } from "lavalink-types/v4"; 5 | 6 | export class RestError extends Error { 7 | constructor(public json: ErrorResponse) { 8 | super(json.message); 9 | } 10 | } 11 | 12 | /** 13 | * A Rest helper for Lavalink 14 | */ 15 | export class Rest { 16 | /** 17 | * Private base request function 18 | * @param node The lavalink node 19 | * @param path Route starting with / 20 | * @param init Request init if any 21 | * @param requires Properties of the lavalink node the route requires 22 | * @throws {RestError} If lavalink encounters an error 23 | */ 24 | private static async baseRequest(node: LavalinkNode, path: string, init?: RequestInit, requires?: ("version" | "sessionId")[]): Promise { 25 | if (requires && !requires.every(r => !!node[r])) throw new RestError({ timestamp: Date.now(), status: 400, error: "Bad Request", message: `Node ${requires.join(", ")} is required for this route. Did you forget to connect?`, path }); 26 | if (!init) init = {}; 27 | if (!init.headers) init.headers = {}; 28 | Object.assign(init.headers, { Authorization: node.password }); 29 | const res = await fetch(`http://${node.host}:${node.port}${path}`, init); 30 | let body; 31 | if (res.status !== 204 && res.headers.get("content-type") === "application/json") body = await res.json(); 32 | else if (res.status !== 204) body = await res.text(); 33 | else body = undefined; 34 | 35 | if (body && (body as ErrorResponse).error) throw new RestError(body as ErrorResponse); 36 | return body as T; 37 | } 38 | 39 | /** 40 | * A helper for /v?/loadtracks endpoint 41 | * @param node The LavalinkNode 42 | * @param identifer The thing you want to load 43 | * @throws {RestError} If lavalink encounters an error 44 | */ 45 | static load(node: LavalinkNode, identifer: string): Promise { 46 | const params = new URLSearchParams(); 47 | params.append("identifier", identifer); 48 | 49 | return Rest.baseRequest(node, `/v${node.version}/loadtracks?${params}`, undefined, ["version"]); 50 | } 51 | 52 | /** 53 | * A helper for /v?/decodetrack & /v?/decodetracks 54 | * @param node The lavalink node 55 | * @param track The track(s) you want to decode 56 | * @throws {RestError} If lavalink encounters an error 57 | */ 58 | static decode(node: LavalinkNode, track: string): Promise; 59 | static decode(node: LavalinkNode, tracks: string[]): Promise; 60 | static decode(node: LavalinkNode, tracks: string | string[]): Promise { 61 | if (Array.isArray(tracks)) { 62 | return Rest.baseRequest(node, `/v${node.version}/decodetracks`, { 63 | method: "POST", 64 | body: JSON.stringify(tracks), 65 | headers: { "Content-Type": "application/json" } 66 | }, ["version"]); 67 | } else { 68 | const params = new URLSearchParams(); 69 | params.append("track", tracks); 70 | return Rest.baseRequest(node, `/v${node.version}/decodetrack?${params}`, undefined, ["version"]); 71 | } 72 | } 73 | 74 | /** 75 | * A helper for /version 76 | * @param node The lavalink node 77 | * @throws {RestError} If lavalink encounters an error 78 | */ 79 | static version(node: LavalinkNode): Promise { 80 | return Rest.baseRequest(node, `/version`); 81 | } 82 | 83 | /** 84 | * A helper for PATCH /v?/sessions/:sessionId 85 | * @param node The lavalink node 86 | * @throws {RestError} If lavalink encounters an error 87 | */ 88 | static updateSession(node: LavalinkNode): Promise { 89 | return Rest.baseRequest(node, `/v${node.version}/sessions/${node.sessionId}`, { 90 | method: "PATCH", 91 | body: JSON.stringify({ resuming: node.resuming, timeout: node.resumeTimeout } as UpdateSessionData), 92 | headers: { "Content-Type": "application/json" } 93 | }, ["version", "sessionId"]); 94 | } 95 | 96 | /** 97 | * A helper for PATCH /v?/sessions/:sessionId/players/:guildId 98 | * @param node The lavalink node 99 | * @param guildId The Id of the guild 100 | * @param data The update data 101 | * @param noReplace If the event should be dropped if there's a currently playing track 102 | * @throws {RestError} If lavalink encounters an error 103 | */ 104 | static updatePlayer(node: LavalinkNode, guildId: string, data: UpdatePlayerData, noReplace = false): Promise { 105 | return Rest.baseRequest(node, `/v${node.version}/sessions/${node.sessionId}/players/${guildId}${noReplace ? `?noReplace=${noReplace}` : ""}`, { 106 | method: "PATCH", 107 | body: JSON.stringify(data), 108 | headers: { "Content-Type": "application/json" } 109 | }, ["version", "sessionId"]); 110 | } 111 | 112 | /** 113 | * A helper for DELETE /v?/sessions/:sessionId/players/:guildId 114 | * @param node The lavalink node 115 | * @param guildId The Id of the guild 116 | * @throws {RestError} If lavalink encounters an error 117 | */ 118 | static destroyPlayer(node: LavalinkNode, guildId: string): Promise { 119 | return Rest.baseRequest(node, `/v${node.version}/sessions/${node.sessionId}/players/${guildId}`, { method: "DELETE" }, ["version", "sessionId"]); 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /src/lib/LavalinkNode.ts: -------------------------------------------------------------------------------- 1 | import WebSocket from "ws"; 2 | import { Rest } from "./Rest"; 3 | 4 | import type { Manager } from "./Manager"; 5 | import type { LavalinkNodeOptions, LavalinkStats } from "./Types"; 6 | import type { Stats, OutboundHandshakeHeaders, WebsocketMessage } from "lavalink-types/v4"; 7 | 8 | 9 | import { version } from "../../package.json" 10 | 11 | /** 12 | * The class for handling everything to do with connecting to Lavalink 13 | */ 14 | export class LavalinkNode { 15 | 16 | /** 17 | * The id of the LavalinkNode so Nodes are better organized 18 | */ 19 | public id: string; 20 | /** 21 | * The host of the LavalinkNode, this could be a ip or domain. 22 | */ 23 | public host = "localhost"; 24 | /** 25 | * The port of the LavalinkNode 26 | */ 27 | public port: number | string = 2333; 28 | /** 29 | * The interval that the node will try to reconnect to lavalink at in milliseconds 30 | */ 31 | public reconnectInterval = 10000; 32 | /** 33 | * The password of the lavalink node 34 | */ 35 | public password = "youshallnotpass"; 36 | /** 37 | * The WebSocket instance for this LavalinkNode 38 | */ 39 | public ws: WebSocket | null = null; 40 | /** 41 | * The statistics of the LavalinkNode 42 | */ 43 | public stats: Stats; 44 | /** 45 | * If the LavalinkNode should allow resuming 46 | */ 47 | public resuming = false; 48 | /** 49 | * The resume timeout 50 | */ 51 | public resumeTimeout = 120; 52 | /** 53 | * Extra info attached to your node, not required and is not sent to lavalink, purely for you. 54 | */ 55 | public state?: unknown; 56 | /** 57 | * The major version of the LavaLink node as indicated by /version 58 | */ 59 | public version?: number; 60 | /** 61 | * The session ID sent by LavaLink on connect. Used for some REST routes 62 | */ 63 | public sessionId?: string; 64 | 65 | /** 66 | * The reconnect timeout 67 | * @private 68 | */ 69 | private _reconnect?: NodeJS.Timeout; 70 | 71 | private _sessionUpdated = false; 72 | 73 | /** 74 | * The base of the connection to lavalink 75 | * @param manager The manager that created the LavalinkNode 76 | * @param options The options of the LavalinkNode {@link LavalinkNodeOptions} 77 | */ 78 | public constructor(public manager: Manager, options: LavalinkNodeOptions) { 79 | this.id = options.id; 80 | 81 | if (options.host) Object.defineProperty(this, "host", { value: options.host }); 82 | if (options.port) Object.defineProperty(this, "port", { value: options.port }); 83 | if (options.password) Object.defineProperty(this, "password", { value: options.password }); 84 | if (options.reconnectInterval) this.reconnectInterval = options.reconnectInterval; 85 | if (options.sessionId) this.sessionId = options.sessionId; 86 | if (options.resuming !== undefined) this.resuming = options.resuming; 87 | if (options.resumeTimeout) this.resumeTimeout = options.resumeTimeout; 88 | if (options.state) this.state = options.state; 89 | 90 | this.stats = { 91 | players: 0, 92 | playingPlayers: 0, 93 | uptime: 0, 94 | memory: { 95 | free: 0, 96 | used: 0, 97 | allocated: 0, 98 | reservable: 0 99 | }, 100 | cpu: { 101 | cores: 0, 102 | systemLoad: 0, 103 | lavalinkLoad: 0 104 | }, 105 | frameStats: { 106 | sent: 0, 107 | nulled: 0, 108 | deficit: 0 109 | } 110 | }; 111 | } 112 | 113 | /** 114 | * Connects the node to Lavalink 115 | */ 116 | public async connect(): Promise { 117 | return new Promise((resolve, reject) => { 118 | if (this.connected) this.ws?.close(); 119 | 120 | return Rest.version(this) 121 | .then(nodeVersion => { 122 | // defaults to v4 which is reasonable. Actually supports snapshot versions now 123 | const major = typeof nodeVersion === "string" && nodeVersion.indexOf(".") !== -1 ? nodeVersion.split(".")[0] : "4"; 124 | if (!major || isNaN(Number(major))) return reject(new Error("Node didn't respond to /version with a major.minor.patch version string")); 125 | const numMajor = Number(major); 126 | this.version = numMajor; 127 | 128 | const headers: OutboundHandshakeHeaders = { 129 | Authorization: this.password, 130 | "User-Id": this.manager.user, 131 | "Client-Name": `Lavacord/${version}` 132 | }; 133 | 134 | if (this.sessionId && this.resuming) headers["Session-Id"] = this.sessionId; 135 | 136 | const ws = new WebSocket(`ws://${this.host}:${this.port}/v${numMajor}/websocket`, { headers }); 137 | 138 | const onEvent = (event: unknown): void => { 139 | ws.removeAllListeners(); 140 | reject(event instanceof Error ? event : new Error("Premature close")); 141 | }; 142 | 143 | const onOpen = (): void => { 144 | this.ws = ws; 145 | this.onOpen(); 146 | ws.removeListener("open", onOpen) 147 | .removeListener("error", onEvent) 148 | .removeListener("close", onEvent) 149 | .on("error", error => this.onError(error)) 150 | .on("close", (code, reason) => this.onClose(code, reason)); 151 | resolve(ws); 152 | }; 153 | ws 154 | .on("message", data => this.onMessage(data)) 155 | .once("open", onOpen) 156 | .once("error", onEvent) 157 | .once("close", onEvent); 158 | }).catch(reject); 159 | }); 160 | } 161 | 162 | /** 163 | * Destroys the connection to the Lavalink Websocket 164 | */ 165 | public destroy(): boolean { 166 | if (!this.connected) return false; 167 | this.ws?.close(1000, "destroy"); 168 | return true; 169 | } 170 | 171 | /** 172 | * Whether or not the node is connected 173 | */ 174 | public get connected(): boolean { 175 | if (!this.ws) return false; 176 | return this.ws?.readyState === WebSocket.OPEN; 177 | } 178 | 179 | /** 180 | * A private function for handling the open event from WebSocket 181 | */ 182 | private onOpen(): void { 183 | if (this._reconnect) clearTimeout(this._reconnect); 184 | this.manager.emit("ready", this); 185 | if (!this._sessionUpdated && this.sessionId) { 186 | this._sessionUpdated = true; 187 | Rest.updateSession(this).catch(e => this.manager.emit("error", e, this)); 188 | } 189 | } 190 | 191 | /** 192 | * Private function for handling the message event from WebSocket 193 | * @param data The data that came from lavalink 194 | */ 195 | private onMessage(data: WebSocket.Data): void { 196 | const str = Array.isArray(data) 197 | ? Buffer.concat(data).toString() 198 | : data instanceof ArrayBuffer 199 | ? Buffer.from(data).toString() 200 | : data.toString(); 201 | 202 | const msg: WebsocketMessage = JSON.parse(str); 203 | 204 | switch (msg.op) { 205 | case "ready": 206 | if (msg.sessionId) this.sessionId = msg.sessionId; 207 | if (!this._sessionUpdated) { 208 | this._sessionUpdated = true; 209 | Rest.updateSession(this).catch(e => this.manager.emit("error", e, this)); 210 | } 211 | break; 212 | 213 | case "stats": 214 | this.stats = { ...msg }; 215 | delete (this.stats as LavalinkStats).op; 216 | break; 217 | 218 | case "event": 219 | case "playerUpdate": 220 | if (!this.manager.players.has(msg.guildId)) break; 221 | this.manager.players.get(msg.guildId)?.emit(msg.op, msg as never); 222 | break; 223 | 224 | default: break; 225 | } 226 | 227 | this.manager.emit("raw", msg, this); 228 | } 229 | 230 | /** 231 | * Private function for handling the error event from WebSocket 232 | * @param error WebSocket error 233 | */ 234 | private onError(error: Error): void { 235 | if (!error) return; 236 | 237 | this.manager.emit("error", error, this); 238 | this.reconnect(); 239 | } 240 | 241 | /** 242 | * Private function for handling the close event from WebSocket 243 | * @param code WebSocket close code 244 | * @param reason WebSocket close reason 245 | */ 246 | private onClose(code: number, reason: Buffer): void { 247 | this._sessionUpdated = false; 248 | this.manager.emit("disconnect", code, reason.toString(), this); 249 | if (code !== 1000 || reason.toString() !== "destroy") return this.reconnect(); 250 | } 251 | 252 | /** 253 | * Handles reconnecting if something happens and the node discounnects 254 | */ 255 | private reconnect(): void { 256 | this._reconnect = setTimeout(() => { 257 | this.ws?.removeAllListeners(); 258 | this.ws = null; 259 | 260 | this.manager.emit("reconnecting", this); 261 | this.connect(); 262 | }, this.reconnectInterval); 263 | } 264 | } 265 | -------------------------------------------------------------------------------- /src/lib/Player.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-explicit-any */ 2 | import { EventEmitter } from "events"; 3 | import { Rest } from "./Rest"; 4 | import type { LavalinkNode } from "./LavalinkNode"; 5 | import type { Manager } from "./Manager"; 6 | import type { PlayerUpdateVoiceState, JoinOptions } from "./Types"; 7 | import type { EventOP, PlayerState, Equalizer, Filters, PlayerUpdate, UpdatePlayerData, UpdatePlayerResult, DestroyPlayerResult, Player as APIPlayer } from "lavalink-types/v4"; 8 | 9 | /** 10 | * The Player class, this handles everything to do with the guild sides of things, like playing, stoping, pausing, resuming etc 11 | */ 12 | export class Player extends EventEmitter { 13 | /** 14 | * The PlayerState of this Player 15 | */ 16 | public state: Partial & { filters: Filters; } = { filters: {} }; 17 | /** 18 | * Whether or not the player is actually playing anything 19 | */ 20 | public playing = false; 21 | /** 22 | * When the track started playing 23 | */ 24 | public timestamp: number | null = null; 25 | /** 26 | * Whether or not the song that is playing is paused or not 27 | */ 28 | public paused = false; 29 | /** 30 | * The current track in Lavalink's base64 string form 31 | */ 32 | public track: string | null = null; 33 | /** 34 | * The voiceUpdateState of the player, used for swtiching nodes 35 | */ 36 | public voiceUpdateState: PlayerUpdateVoiceState | null = null; 37 | 38 | /** 39 | * The constructor of the player 40 | * @param node The Lavalink of the player 41 | * @param id the id of the player, aka the guild id 42 | */ 43 | public constructor(public node: LavalinkNode, public id: string) { 44 | super(); 45 | 46 | this.on("event", data => { 47 | switch (data.type) { 48 | case "TrackStartEvent": 49 | if (this.listenerCount("start")) this.emit("start", data); 50 | break; 51 | case "TrackEndEvent": 52 | if (data.reason !== "replaced") this.playing = false; 53 | this.track = null; 54 | this.timestamp = null; 55 | if (this.listenerCount("end")) this.emit("end", data); 56 | break; 57 | case "TrackExceptionEvent": 58 | if (this.listenerCount("error")) this.emit("error", data); 59 | break; 60 | case "TrackStuckEvent": 61 | this.stop(); 62 | if (this.listenerCount("end")) this.emit("end", data); 63 | break; 64 | case "WebSocketClosedEvent": 65 | if (this.listenerCount("error")) this.emit("error", data); 66 | break; 67 | default: 68 | if (this.listenerCount("warn")) this.emit("warn", `Unexpected event type: ${(data as { type: string; }).type}`); 69 | break; 70 | } 71 | }) 72 | .on("playerUpdate", data => { 73 | this.state = { filters: this.state.filters, ...data.state }; 74 | }); 75 | } 76 | 77 | /** 78 | * Updates the current player on lavalink 79 | * @param options Update options 80 | * @param noReplace If the event should be dropped if there's a currently playing track should encodedTrack or identifier be present in options 81 | */ 82 | public async update(options: UpdatePlayerData, noReplace = false): Promise { 83 | const d = await Rest.updatePlayer(this.node, this.id, options, noReplace); 84 | if (d.track) this.track = d.track.encoded; 85 | return d; 86 | } 87 | 88 | /** 89 | * Plays the specified song using the base64 string from lavalink 90 | * @param track The base64 string of the song that you want to play 91 | * @param options Play options 92 | */ 93 | public async play(track: string, options?: Omit & { noReplace?: boolean; userData?: Record; }): Promise { 94 | const noReplace = options?.noReplace ?? false; 95 | const userData = options?.userData; 96 | if (options) { 97 | delete options.noReplace; 98 | delete options.userData; 99 | } 100 | const d = await this.update(Object.assign({ track: { encoded: track, userData } } as UpdatePlayerData, options), noReplace); 101 | this.playing = true; 102 | this.timestamp = Date.now(); 103 | return d; 104 | } 105 | 106 | /** 107 | * Stops the music, depending on how the end event is handled this will either stop 108 | */ 109 | public async stop(): Promise { 110 | const d = await this.update({ track: { encoded: null } }); 111 | this.playing = false; 112 | this.timestamp = null; 113 | return d; 114 | } 115 | 116 | /** 117 | * Pauses/Resumes the song depending on what is specified 118 | * @param pause Whether or not to pause whats currently playing 119 | */ 120 | public async pause(pause: boolean): Promise { 121 | const d = await this.update({ paused: pause }); 122 | this.paused = pause; 123 | if (this.listenerCount("pause")) this.emit("pause", pause); 124 | return d; 125 | } 126 | 127 | /** 128 | * Resumes the current song 129 | */ 130 | public resume(): Promise { 131 | return this.pause(false); 132 | } 133 | 134 | /** 135 | * Changes the volume, only for the current song 136 | * @param volume The volume as a float from 0.0 to 10.0. 1.0 is default. 137 | */ 138 | public async volume(volume: number): Promise { 139 | const d = await this.update({ volume: volume * 100 }); 140 | if (this.listenerCount("volume")) this.emit("volume", volume); 141 | return d; 142 | } 143 | 144 | /** 145 | * Seeks the current song to a certain position 146 | * @param position Seeks the song to the position specified in milliseconds, use the duration of the song from lavalink to get the duration 147 | */ 148 | public async seek(position: number): Promise { 149 | const d = await this.update({ position }); 150 | if (this.listenerCount("seek")) this.emit("seek", position); 151 | return d; 152 | } 153 | 154 | public async filters(options: Filters): Promise { 155 | const d = await this.update({ filters: options }); 156 | this.state.filters = options; 157 | if (this.listenerCount("filters")) this.emit("filters", options); 158 | return d; 159 | } 160 | 161 | /** 162 | * Sets the equalizer of the current song, if you wanted to do something like bassboost 163 | * @param bands The bands that you want lavalink to modify read [IMPLEMENTATION.md](https://github.com/lavalink-devs/Lavalink/blob/master/IMPLEMENTATION.md#equalizer) for more information 164 | */ 165 | public async equalizer(bands: Equalizer[]): Promise { 166 | const newFilters = Object.assign(this.state.filters, { equalizer: bands }); 167 | const d = await this.filters(newFilters); 168 | return d; 169 | } 170 | 171 | /** 172 | * Sends a destroy signal to lavalink, basically just a cleanup op for lavalink to clean its shit up 173 | */ 174 | public async destroy(): Promise { 175 | return Rest.destroyPlayer(this.node, this.id); 176 | } 177 | 178 | /** 179 | * Sends voiceUpdate information to lavalink so it can connect to discords voice servers properly 180 | * @param data The data lavalink needs to connect and recieve data from discord 181 | */ 182 | public connect(data: PlayerUpdateVoiceState): Promise { 183 | this.voiceUpdateState = data; 184 | return this.update({ voice: { token: data.event.token, endpoint: data.event.endpoint, sessionId: data.sessionId } }); 185 | } 186 | 187 | /** 188 | * Use this to switch channels 189 | * @param channel The channel id of the channel you want to switch to 190 | * @param options selfMute and selfDeaf options 191 | */ 192 | public switchChannel(channel: string, options: JoinOptions = {}): any { 193 | return this.manager.sendWS(this.id, channel, options); 194 | } 195 | 196 | /** 197 | * The manager that created the player 198 | */ 199 | public get manager(): Manager { 200 | return this.node.manager; 201 | } 202 | } 203 | 204 | export interface PlayerEvents { 205 | event: [EventOP]; 206 | start: [Extract]; 207 | end: [Extract]; 208 | pause: [boolean]; 209 | seek: [number]; 210 | error: [Extract]; 211 | warn: [string]; 212 | volume: [number]; 213 | playerUpdate: [PlayerUpdate]; 214 | filters: [Filters]; 215 | } 216 | 217 | export interface Player { 218 | addListener(event: E, listener: (...args: PlayerEvents[E]) => any): this; 219 | emit(event: E, ...args: PlayerEvents[E]): boolean; 220 | eventNames(): (keyof PlayerEvents)[]; 221 | listenerCount(event: keyof PlayerEvents): number; 222 | listeners(event: keyof PlayerEvents): ((...args: any[]) => any)[]; 223 | off(event: E, listener: (...args: PlayerEvents[E]) => any): this; 224 | on(event: E, listener: (...args: PlayerEvents[E]) => any): this; 225 | once(event: E, listener: (...args: PlayerEvents[E]) => any): this; 226 | prependListener(event: E, listener: (...args: PlayerEvents[E]) => any): this; 227 | prependOnceListener(event: E, listener: (...args: PlayerEvents[E]) => any): this; 228 | rawListeners(event: keyof PlayerEvents): ((...args: any[]) => any)[]; 229 | removeAllListeners(event?: keyof PlayerEvents): this; 230 | removeListener(event: E, listener: (...args: PlayerEvents[E]) => any): this; 231 | } 232 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright 2019-2025 Jack Nagle 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /src/lib/Manager.ts: -------------------------------------------------------------------------------- 1 | import { EventEmitter } from "events"; 2 | import { LavalinkNode } from "./LavalinkNode"; 3 | import { Player } from "./Player"; 4 | import WebSocket from "ws"; 5 | import type { JoinData, VoiceServerUpdate, VoiceStateUpdate, DiscordPacket, ManagerOptions, JoinOptions, LavalinkNodeOptions } from "./Types"; 6 | 7 | /** 8 | * The class that handles everything to do with Lavalink. it is the hub of the library basically 9 | */ 10 | export class Manager extends EventEmitter { 11 | 12 | /** 13 | * A [**Map**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) of Lavalink Nodes 14 | */ 15 | public nodes = new Map(); 16 | /** 17 | * A [**Map**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) of all the players 18 | */ 19 | public players = new Map(); 20 | /** 21 | * A [**Map**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) of all the VOICE_SERVER_UPDATE States 22 | */ 23 | public voiceServers = new Map(); 24 | /** 25 | * A [**Map**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) of all the VOICE_STATE_UPDATE States 26 | */ 27 | public voiceStates = new Map(); 28 | /** 29 | * The user id of the bot this Manager is managing 30 | */ 31 | public user!: string; 32 | /** 33 | * The send function needs for the library to function 34 | */ 35 | public send?: (packet: DiscordPacket) => unknown; 36 | /** 37 | * The Player the manager will use when creating new Players 38 | */ 39 | private readonly Player: typeof Player = Player; 40 | /** 41 | * An Set of all the expecting connections guild id's 42 | */ 43 | private readonly expecting = new Set(); 44 | 45 | /** 46 | * The constructor of the Manager 47 | * @param nodes A Array of {@link LavalinkNodeOptions} that the Manager will connect to 48 | * @param options The options for the Manager {@link ManagerOptions} 49 | */ 50 | public constructor(nodes: LavalinkNodeOptions[], options: ManagerOptions) { 51 | super(); 52 | 53 | if (options.user) this.user = options.user; 54 | if (options.player) this.Player = options.player; 55 | if (options.send) this.send = options.send; 56 | 57 | for (const node of nodes) this.createNode(node); 58 | setImmediate(() => { 59 | if (!this.send) this.send = () => undefined; 60 | }); 61 | } 62 | 63 | /** 64 | * Connects all the {@link LavalinkNode} to the respective Lavalink instance 65 | */ 66 | public connect(): Promise { 67 | if (!this.user) { 68 | console.warn("Lavacord Manager.connect was called without the client user ID being set.\ 69 | You should construct your Manager when your client becomes ready as that's where you/your Discord lib receives the current user info.\ 70 | Alternatively, you can get your client's user ID (which is all that lavacord needs) by doing\ 71 | Buffer.from(token.split(\".\")[0], \"base64\").toString(\"utf8\") unless your token was generated a REALLY long time ago."); 72 | } 73 | return Promise.all(Array.from(this.nodes.values()).map(node => node.connect())); 74 | } 75 | 76 | /** 77 | * Disconnects everything, basically destorying the manager. 78 | * Stops all players, leaves all voice channels then disconnects all LavalinkNodes 79 | */ 80 | public disconnect(): Promise { 81 | const promises = []; 82 | for (const id of Array.from(this.players.keys())) promises.push(this.leave(id)); 83 | for (const node of Array.from(this.nodes.values())) node.destroy(); 84 | return Promise.all(promises); 85 | } 86 | 87 | /** 88 | * Creating a {@link LavalinkNode} and adds it to the the nodes Map 89 | * @param options The node options of the node you're creating 90 | */ 91 | public createNode(options: LavalinkNodeOptions): LavalinkNode { 92 | const node = new LavalinkNode(this, options); 93 | this.nodes.set(options.id, node); 94 | return node; 95 | } 96 | 97 | /** 98 | * Disconnects and Deletes the specified node 99 | * @param id The id of the node you want to remove 100 | */ 101 | public removeNode(id: string): boolean { 102 | const node = this.nodes.get(id); 103 | if (!node) return false; 104 | return node.destroy() && this.nodes.delete(id); 105 | } 106 | 107 | /** 108 | * Connects the bot to the selected voice channel 109 | * @param data The Join Data 110 | * @param joinOptions Selfmute and Selfdeaf options, if you want the bot to be deafen or muted upon joining 111 | */ 112 | public async join(data: JoinData, joinOptions: JoinOptions = {}): Promise { 113 | const player = this.players.get(data.guild); 114 | if (player) return player; 115 | await this.sendWS(data.guild, data.channel, joinOptions); 116 | return this.spawnPlayer(data); 117 | } 118 | 119 | /** 120 | * Leaves the specified voice channel 121 | * @param guild The guild you want the bot to leave the voice channel of 122 | */ 123 | public async leave(guild: string): Promise { 124 | await this.sendWS(guild, null); 125 | const player = this.players.get(guild); 126 | if (!player) return false; 127 | if (player.listenerCount("end") && player.playing) { 128 | player.emit("end", { 129 | track: { 130 | encoded: player.track!, 131 | info: { 132 | identifier: "PLACEHOLDER", 133 | isSeekable: false, 134 | author: "PLACEHOLDER", 135 | length: 0, 136 | isStream: false, 137 | position: 0, 138 | title: "PLACEHOLDER", 139 | uri: "PLACEHOLDER", 140 | artworkUrl: null, 141 | isrc: null, 142 | sourceName: "PLACEHOLDER" 143 | }, 144 | pluginInfo: {}, 145 | userData: {} 146 | }, 147 | op: "event", 148 | type: "TrackEndEvent", 149 | reason: "cleanup", 150 | guildId: guild 151 | }); 152 | } 153 | player.removeAllListeners(); 154 | await player.destroy(); 155 | return this.players.delete(guild); 156 | } 157 | 158 | /** 159 | * Switch a player from one node to another, this is to implement fallback 160 | * @param player The player you want to switch nodes with 161 | * @param node The node you want to switch to 162 | */ 163 | public async switch(player: Player, node: LavalinkNode): Promise { 164 | const { track, state, voiceUpdateState } = { ...player }; 165 | const position = (state.position ?? 0) + 2000; 166 | if (!voiceUpdateState) { 167 | player.node = node; 168 | return player; 169 | } 170 | 171 | await player.destroy(); 172 | 173 | player.node = node; 174 | 175 | await player.play(track!, { 176 | position, 177 | volume: state.filters.volume ?? 1.0, 178 | filters: state.filters, 179 | voice: { 180 | token: voiceUpdateState.event.token, 181 | endpoint: voiceUpdateState.event.endpoint, 182 | sessionId: voiceUpdateState.sessionId 183 | } 184 | }); 185 | 186 | return player; 187 | } 188 | 189 | /** 190 | * For handling voiceServerUpdate from the user's library of choice 191 | * @param data The data directly from discord 192 | */ 193 | public voiceServerUpdate(data: VoiceServerUpdate): Promise { 194 | this.voiceServers.set(data.guild_id, data); 195 | this.expecting.add(data.guild_id); 196 | return this._attemptConnection(data.guild_id); 197 | } 198 | 199 | /** 200 | * For handling voiceStateUpdate from the user's library of choice 201 | * @param data The data directly from discord 202 | */ 203 | public voiceStateUpdate(data: VoiceStateUpdate): Promise { 204 | if (data.user_id !== this.user) return Promise.resolve(false); 205 | 206 | if (data.channel_id) { 207 | this.voiceStates.set(data.guild_id, data); 208 | return this._attemptConnection(data.guild_id); 209 | } 210 | 211 | this.voiceServers.delete(data.guild_id); 212 | this.voiceStates.delete(data.guild_id); 213 | 214 | return Promise.resolve(false); 215 | } 216 | 217 | /** 218 | * Just a utility method to easily send OPCode 4 websocket events to discord 219 | * @param guild The guild is 220 | * @param channel Voice channel id, or null to leave a voice channel 221 | * @param param2 Selfmute and Selfdeaf options, if you want the bot to be deafen or muted upon joining 222 | */ 223 | public sendWS(guild: string, channel: string | null, { selfmute = false, selfdeaf = false }: JoinOptions = {}): unknown { 224 | return this.send!({ 225 | op: 4, 226 | d: { 227 | guild_id: guild, 228 | channel_id: channel, 229 | self_mute: selfmute, 230 | self_deaf: selfdeaf 231 | } 232 | }); 233 | } 234 | 235 | /** 236 | * Gets all connected nodes, sorts them by cou load of the node 237 | */ 238 | public get idealNodes(): LavalinkNode[] { 239 | return Array.from(this.nodes.values()) 240 | .filter(node => node.connected) 241 | .sort((a, b) => { 242 | const aload = a.stats.cpu ? a.stats.cpu.systemLoad / a.stats.cpu.cores * 100 : 0; 243 | const bload = b.stats.cpu ? b.stats.cpu.systemLoad / b.stats.cpu.cores * 100 : 0; 244 | return aload - bload; 245 | }); 246 | } 247 | 248 | /** 249 | * Handles the data of voiceServerUpdate & voiceStateUpdate to see if a connection is possible with the data we have and if it is then make the connection to lavalink 250 | * @param guildId The guild id that we're trying to attempt to connect to 251 | */ 252 | private async _attemptConnection(guildID: string): Promise { 253 | const server = this.voiceServers.get(guildID); 254 | const state = this.voiceStates.get(guildID); 255 | 256 | if (!server || !state || !this.expecting.has(guildID)) return false; 257 | 258 | const player = this.players.get(guildID); 259 | if (!player) return false; 260 | 261 | await player.connect({ sessionId: state.session_id, event: server }); 262 | this.expecting.delete(guildID); 263 | 264 | return true; 265 | } 266 | 267 | /** 268 | * This creates the {@link Player} 269 | * @param data The Join Data, this is called by {@link Manager.join} 270 | */ 271 | private spawnPlayer(data: JoinData): Player { 272 | const exists = this.players.get(data.guild); 273 | if (exists) return exists; 274 | const node = this.nodes.get(data.node); 275 | if (!node) throw new Error(`INVALID_HOST: No available node with ${data.node}`); 276 | const player = new this.Player(node, data.guild); 277 | this.players.set(data.guild, player); 278 | return player; 279 | } 280 | } 281 | 282 | export interface ManagerEvents { 283 | ready: [LavalinkNode]; 284 | raw: [unknown, LavalinkNode]; 285 | error: [unknown, LavalinkNode]; 286 | disconnect: [number, string, LavalinkNode]; 287 | reconnecting: [LavalinkNode]; 288 | } 289 | 290 | export interface Manager extends EventEmitter { 291 | addListener(event: E, listener: (...args: ManagerEvents[E]) => unknown): this; 292 | emit(event: E, ...args: ManagerEvents[E]): boolean; 293 | eventNames(): (keyof ManagerEvents)[]; 294 | listenerCount(event: keyof ManagerEvents): number; 295 | listeners(event: keyof ManagerEvents): ((...args: unknown[]) => unknown)[]; 296 | off(event: E, listener: (...args: ManagerEvents[E]) => unknown): this; 297 | on(event: E, listener: (...args: ManagerEvents[E]) => unknown): this; 298 | once(event: E, listener: (...args: ManagerEvents[E]) => unknown): this; 299 | prependListener(event: E, listener: (...args: ManagerEvents[E]) => unknown): this; 300 | prependOnceListener(event: E, listener: (...args: ManagerEvents[E]) => unknown): this; 301 | rawListeners(event: keyof ManagerEvents): ((...args: unknown[]) => unknown)[]; 302 | removeAllListeners(event?: keyof ManagerEvents): this; 303 | removeListener(event: E, listener: (...args: ManagerEvents[E]) => unknown): this; 304 | } 305 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@discordjs/builders@^1.11.2": 6 | version "1.11.2" 7 | resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-1.11.2.tgz#b96185d05d22f9d6bde89aada2decf45a5c982ce" 8 | integrity sha512-F1WTABdd8/R9D1icJzajC4IuLyyS8f3rTOz66JsSI3pKvpCAtsMBweu8cyNYsIyvcrKAVn9EPK+Psoymq+XC0A== 9 | dependencies: 10 | "@discordjs/formatters" "^0.6.1" 11 | "@discordjs/util" "^1.1.1" 12 | "@sapphire/shapeshift" "^4.0.0" 13 | discord-api-types "^0.38.1" 14 | fast-deep-equal "^3.1.3" 15 | ts-mixer "^6.0.4" 16 | tslib "^2.6.3" 17 | 18 | "@discordjs/collection@1.5.3": 19 | version "1.5.3" 20 | resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-1.5.3.tgz#5a1250159ebfff9efa4f963cfa7e97f1b291be18" 21 | integrity sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ== 22 | 23 | "@discordjs/collection@^2.1.0", "@discordjs/collection@^2.1.1": 24 | version "2.1.1" 25 | resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-2.1.1.tgz#901917bc538c12b9c3613036d317847baee08cae" 26 | integrity sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg== 27 | 28 | "@discordjs/formatters@^0.6.1": 29 | version "0.6.1" 30 | resolved "https://registry.yarnpkg.com/@discordjs/formatters/-/formatters-0.6.1.tgz#211bf3eb060d8fe7fa1f020b8be3c4adad00555a" 31 | integrity sha512-5cnX+tASiPCqCWtFcFslxBVUaCetB0thvM/JyavhbXInP1HJIEU+Qv/zMrnuwSsX3yWH2lVXNJZeDK3EiP4HHg== 32 | dependencies: 33 | discord-api-types "^0.38.1" 34 | 35 | "@discordjs/rest@^2.5.0": 36 | version "2.5.0" 37 | resolved "https://registry.yarnpkg.com/@discordjs/rest/-/rest-2.5.0.tgz#fc4c5e23bee31f4df98e6e148e9d22f8eb031924" 38 | integrity sha512-PWhchxTzpn9EV3vvPRpwS0EE2rNYB9pvzDU/eLLW3mByJl0ZHZjHI2/wA8EbH2gRMQV7nu+0FoDF84oiPl8VAQ== 39 | dependencies: 40 | "@discordjs/collection" "^2.1.1" 41 | "@discordjs/util" "^1.1.1" 42 | "@sapphire/async-queue" "^1.5.3" 43 | "@sapphire/snowflake" "^3.5.3" 44 | "@vladfrangu/async_event_emitter" "^2.4.6" 45 | discord-api-types "^0.38.1" 46 | magic-bytes.js "^1.10.0" 47 | tslib "^2.6.3" 48 | undici "6.21.1" 49 | 50 | "@discordjs/util@^1.1.0", "@discordjs/util@^1.1.1": 51 | version "1.1.1" 52 | resolved "https://registry.yarnpkg.com/@discordjs/util/-/util-1.1.1.tgz#bafcde0faa116c834da1258d78ec237080bbab29" 53 | integrity sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g== 54 | 55 | "@discordjs/voice@^0.18.0": 56 | version "0.18.0" 57 | resolved "https://registry.yarnpkg.com/@discordjs/voice/-/voice-0.18.0.tgz#8fb1f1c46fb19a26bdff7d7c4e609b25cb46b1ba" 58 | integrity sha512-BvX6+VJE5/vhD9azV9vrZEt9hL1G+GlOdsQaVl5iv9n87fkXjf3cSwllhR3GdaUC8m6dqT8umXIWtn3yCu4afg== 59 | dependencies: 60 | "@types/ws" "^8.5.12" 61 | discord-api-types "^0.37.103" 62 | prism-media "^1.3.5" 63 | tslib "^2.6.3" 64 | ws "^8.18.0" 65 | 66 | "@discordjs/ws@^1.2.2": 67 | version "1.2.2" 68 | resolved "https://registry.yarnpkg.com/@discordjs/ws/-/ws-1.2.2.tgz#bab8d16ea2fe9eb205351bd8896e03307bf42fdb" 69 | integrity sha512-dyfq7yn0wO0IYeYOs3z79I6/HumhmKISzFL0Z+007zQJMtAFGtt3AEoq1nuLXtcunUE5YYYQqgKvybXukAK8/w== 70 | dependencies: 71 | "@discordjs/collection" "^2.1.0" 72 | "@discordjs/rest" "^2.5.0" 73 | "@discordjs/util" "^1.1.0" 74 | "@sapphire/async-queue" "^1.5.2" 75 | "@types/ws" "^8.5.10" 76 | "@vladfrangu/async_event_emitter" "^2.2.4" 77 | discord-api-types "^0.38.1" 78 | tslib "^2.6.2" 79 | ws "^8.17.0" 80 | 81 | "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0", "@eslint-community/eslint-utils@^4.7.0": 82 | version "4.7.0" 83 | resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" 84 | integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== 85 | dependencies: 86 | eslint-visitor-keys "^3.4.3" 87 | 88 | "@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1": 89 | version "4.12.1" 90 | resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" 91 | integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== 92 | 93 | "@eslint/config-array@^0.20.0": 94 | version "0.20.0" 95 | resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.20.0.tgz#7a1232e82376712d3340012a2f561a2764d1988f" 96 | integrity sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ== 97 | dependencies: 98 | "@eslint/object-schema" "^2.1.6" 99 | debug "^4.3.1" 100 | minimatch "^3.1.2" 101 | 102 | "@eslint/config-helpers@^0.2.1": 103 | version "0.2.2" 104 | resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.2.2.tgz#3779f76b894de3a8ec4763b79660e6d54d5b1010" 105 | integrity sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg== 106 | 107 | "@eslint/core@^0.13.0": 108 | version "0.13.0" 109 | resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.13.0.tgz#bf02f209846d3bf996f9e8009db62df2739b458c" 110 | integrity sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw== 111 | dependencies: 112 | "@types/json-schema" "^7.0.15" 113 | 114 | "@eslint/eslintrc@^3.3.1": 115 | version "3.3.1" 116 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964" 117 | integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== 118 | dependencies: 119 | ajv "^6.12.4" 120 | debug "^4.3.2" 121 | espree "^10.0.1" 122 | globals "^14.0.0" 123 | ignore "^5.2.0" 124 | import-fresh "^3.2.1" 125 | js-yaml "^4.1.0" 126 | minimatch "^3.1.2" 127 | strip-json-comments "^3.1.1" 128 | 129 | "@eslint/js@9.26.0", "@eslint/js@^9.26.0": 130 | version "9.26.0" 131 | resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.26.0.tgz#1e13126b67a3db15111d2dcc61f69a2acff70bd5" 132 | integrity sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ== 133 | 134 | "@eslint/object-schema@^2.1.6": 135 | version "2.1.6" 136 | resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f" 137 | integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== 138 | 139 | "@eslint/plugin-kit@^0.2.8": 140 | version "0.2.8" 141 | resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz#47488d8f8171b5d4613e833313f3ce708e3525f8" 142 | integrity sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA== 143 | dependencies: 144 | "@eslint/core" "^0.13.0" 145 | levn "^0.4.1" 146 | 147 | "@gerrit0/mini-shiki@^3.2.2": 148 | version "3.4.0" 149 | resolved "https://registry.yarnpkg.com/@gerrit0/mini-shiki/-/mini-shiki-3.4.0.tgz#763ef33c2a03b55d679f1d8f8944770e096b9a32" 150 | integrity sha512-48lKoQegmfJ0iyR/jRz5OrYOSM3WewG9YWCPqUvYFEC54shQO8RsAaspaK/2PRHVVnjekRqfAFvq8pwCpIo5ig== 151 | dependencies: 152 | "@shikijs/engine-oniguruma" "^3.4.0" 153 | "@shikijs/langs" "^3.4.0" 154 | "@shikijs/themes" "^3.4.0" 155 | "@shikijs/types" "^3.4.0" 156 | "@shikijs/vscode-textmate" "^10.0.2" 157 | 158 | "@humanfs/core@^0.19.1": 159 | version "0.19.1" 160 | resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" 161 | integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== 162 | 163 | "@humanfs/node@^0.16.6": 164 | version "0.16.6" 165 | resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" 166 | integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== 167 | dependencies: 168 | "@humanfs/core" "^0.19.1" 169 | "@humanwhocodes/retry" "^0.3.0" 170 | 171 | "@humanwhocodes/module-importer@^1.0.1": 172 | version "1.0.1" 173 | resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" 174 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 175 | 176 | "@humanwhocodes/retry@^0.3.0": 177 | version "0.3.1" 178 | resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" 179 | integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== 180 | 181 | "@humanwhocodes/retry@^0.4.2": 182 | version "0.4.3" 183 | resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" 184 | integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== 185 | 186 | "@modelcontextprotocol/sdk@^1.8.0": 187 | version "1.11.1" 188 | resolved "https://registry.yarnpkg.com/@modelcontextprotocol/sdk/-/sdk-1.11.1.tgz#c7f4a1432872ef10130f5d9b0072060c17a3946b" 189 | integrity sha512-9LfmxKTb1v+vUS1/emSk1f5ePmTLkb9Le9AxOB5T0XM59EUumwcS45z05h7aiZx3GI0Bl7mjb3FMEglYj+acuQ== 190 | dependencies: 191 | content-type "^1.0.5" 192 | cors "^2.8.5" 193 | cross-spawn "^7.0.3" 194 | eventsource "^3.0.2" 195 | express "^5.0.1" 196 | express-rate-limit "^7.5.0" 197 | pkce-challenge "^5.0.0" 198 | raw-body "^3.0.0" 199 | zod "^3.23.8" 200 | zod-to-json-schema "^3.24.1" 201 | 202 | "@nodelib/fs.scandir@2.1.5": 203 | version "2.1.5" 204 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 205 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 206 | dependencies: 207 | "@nodelib/fs.stat" "2.0.5" 208 | run-parallel "^1.1.9" 209 | 210 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 211 | version "2.0.5" 212 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 213 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 214 | 215 | "@nodelib/fs.walk@^1.2.3": 216 | version "1.2.8" 217 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 218 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 219 | dependencies: 220 | "@nodelib/fs.scandir" "2.1.5" 221 | fastq "^1.6.0" 222 | 223 | "@sapphire/async-queue@^1.5.2", "@sapphire/async-queue@^1.5.3": 224 | version "1.5.5" 225 | resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.5.5.tgz#2b18d402bb920b65b13ad4ed8dfb6c386300dd84" 226 | integrity sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg== 227 | 228 | "@sapphire/shapeshift@^4.0.0": 229 | version "4.0.0" 230 | resolved "https://registry.yarnpkg.com/@sapphire/shapeshift/-/shapeshift-4.0.0.tgz#86c1b41002ff5d0b2ad21cbc3418b06834b89040" 231 | integrity sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg== 232 | dependencies: 233 | fast-deep-equal "^3.1.3" 234 | lodash "^4.17.21" 235 | 236 | "@sapphire/snowflake@3.5.3": 237 | version "3.5.3" 238 | resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.5.3.tgz#0c102aa2ec5b34f806e9bc8625fc6a5e1d0a0c6a" 239 | integrity sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ== 240 | 241 | "@sapphire/snowflake@^3.5.3": 242 | version "3.5.5" 243 | resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.5.5.tgz#33a60ab4231e3cab29e8a0077f342125f2c8d1bd" 244 | integrity sha512-xzvBr1Q1c4lCe7i6sRnrofxeO1QTP/LKQ6A6qy0iB4x5yfiSfARMEQEghojzTNALDTcv8En04qYNIco9/K9eZQ== 245 | 246 | "@shikijs/engine-oniguruma@^3.4.0": 247 | version "3.4.0" 248 | resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-3.4.0.tgz#86e9ff95ed16e69177f19b5f2e1cb8481b623a68" 249 | integrity sha512-zwcWlZ4OQuJ/+1t32ClTtyTU1AiDkK1lhtviRWoq/hFqPjCNyLj22bIg9rB7BfoZKOEOfrsGz7No33BPCf+WlQ== 250 | dependencies: 251 | "@shikijs/types" "3.4.0" 252 | "@shikijs/vscode-textmate" "^10.0.2" 253 | 254 | "@shikijs/langs@^3.4.0": 255 | version "3.4.0" 256 | resolved "https://registry.yarnpkg.com/@shikijs/langs/-/langs-3.4.0.tgz#4a4b330cfd43af1a7c04cc668793e87ad40ad28f" 257 | integrity sha512-bQkR+8LllaM2duU9BBRQU0GqFTx7TuF5kKlw/7uiGKoK140n1xlLAwCgXwSxAjJ7Htk9tXTFwnnsJTCU5nDPXQ== 258 | dependencies: 259 | "@shikijs/types" "3.4.0" 260 | 261 | "@shikijs/themes@^3.4.0": 262 | version "3.4.0" 263 | resolved "https://registry.yarnpkg.com/@shikijs/themes/-/themes-3.4.0.tgz#59582f19c04b79fa3fa7a9cc2630624c0368f115" 264 | integrity sha512-YPP4PKNFcFGLxItpbU0ZW1Osyuk8AyZ24YEFaq04CFsuCbcqydMvMUTi40V2dkc0qs1U2uZFrnU6s5zI6IH+uA== 265 | dependencies: 266 | "@shikijs/types" "3.4.0" 267 | 268 | "@shikijs/types@3.4.0", "@shikijs/types@^3.4.0": 269 | version "3.4.0" 270 | resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-3.4.0.tgz#f7b5cdde2db5dd5c79b8dc785b11322e5dd5fe59" 271 | integrity sha512-EUT/0lGiE//7j5N/yTMNMT3eCWNcHJLrRKxT0NDXWIfdfSmFJKfPX7nMmRBrQnWboAzIsUziCThrYMMhjbMS1A== 272 | dependencies: 273 | "@shikijs/vscode-textmate" "^10.0.2" 274 | "@types/hast" "^3.0.4" 275 | 276 | "@shikijs/vscode-textmate@^10.0.2": 277 | version "10.0.2" 278 | resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz#a90ab31d0cc1dfb54c66a69e515bf624fa7b2224" 279 | integrity sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg== 280 | 281 | "@types/estree@^1.0.6": 282 | version "1.0.7" 283 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" 284 | integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== 285 | 286 | "@types/hast@^3.0.4": 287 | version "3.0.4" 288 | resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" 289 | integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== 290 | dependencies: 291 | "@types/unist" "*" 292 | 293 | "@types/json-schema@^7.0.15": 294 | version "7.0.15" 295 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" 296 | integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== 297 | 298 | "@types/node-fetch@^2.5.10": 299 | version "2.6.12" 300 | resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.12.tgz#8ab5c3ef8330f13100a7479e2cd56d3386830a03" 301 | integrity sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA== 302 | dependencies: 303 | "@types/node" "*" 304 | form-data "^4.0.0" 305 | 306 | "@types/node@*", "@types/node@^22.13.10": 307 | version "22.15.17" 308 | resolved "https://registry.yarnpkg.com/@types/node/-/node-22.15.17.tgz#355ccec95f705b664e4332bb64a7f07db30b7055" 309 | integrity sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw== 310 | dependencies: 311 | undici-types "~6.21.0" 312 | 313 | "@types/node@^14.17.1", "@types/node@^14.17.2": 314 | version "14.18.63" 315 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.63.tgz#1788fa8da838dbb5f9ea994b834278205db6ca2b" 316 | integrity sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ== 317 | 318 | "@types/unist@*": 319 | version "3.0.3" 320 | resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" 321 | integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== 322 | 323 | "@types/ws@^8.18.0", "@types/ws@^8.5.10", "@types/ws@^8.5.12": 324 | version "8.18.1" 325 | resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.18.1.tgz#48464e4bf2ddfd17db13d845467f6070ffea4aa9" 326 | integrity sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg== 327 | dependencies: 328 | "@types/node" "*" 329 | 330 | "@typescript-eslint/eslint-plugin@8.32.0", "@typescript-eslint/eslint-plugin@^8.26.1": 331 | version "8.32.0" 332 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.32.0.tgz#86630dd3084f9d6c4239bbcd6a7ee1a7ee844f7f" 333 | integrity sha512-/jU9ettcntkBFmWUzzGgsClEi2ZFiikMX5eEQsmxIAWMOn4H3D4rvHssstmAHGVvrYnaMqdWWWg0b5M6IN/MTQ== 334 | dependencies: 335 | "@eslint-community/regexpp" "^4.10.0" 336 | "@typescript-eslint/scope-manager" "8.32.0" 337 | "@typescript-eslint/type-utils" "8.32.0" 338 | "@typescript-eslint/utils" "8.32.0" 339 | "@typescript-eslint/visitor-keys" "8.32.0" 340 | graphemer "^1.4.0" 341 | ignore "^5.3.1" 342 | natural-compare "^1.4.0" 343 | ts-api-utils "^2.1.0" 344 | 345 | "@typescript-eslint/parser@8.32.0", "@typescript-eslint/parser@^8.26.1": 346 | version "8.32.0" 347 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.32.0.tgz#fe840ecb2726a82fa9f5562837ec40503ae71caf" 348 | integrity sha512-B2MdzyWxCE2+SqiZHAjPphft+/2x2FlO9YBx7eKE1BCb+rqBlQdhtAEhzIEdozHd55DXPmxBdpMygFJjfjjA9A== 349 | dependencies: 350 | "@typescript-eslint/scope-manager" "8.32.0" 351 | "@typescript-eslint/types" "8.32.0" 352 | "@typescript-eslint/typescript-estree" "8.32.0" 353 | "@typescript-eslint/visitor-keys" "8.32.0" 354 | debug "^4.3.4" 355 | 356 | "@typescript-eslint/scope-manager@8.32.0": 357 | version "8.32.0" 358 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.32.0.tgz#6be89f652780f0d3d19d58dc0ee107b1a9e3282c" 359 | integrity sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ== 360 | dependencies: 361 | "@typescript-eslint/types" "8.32.0" 362 | "@typescript-eslint/visitor-keys" "8.32.0" 363 | 364 | "@typescript-eslint/type-utils@8.32.0": 365 | version "8.32.0" 366 | resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.32.0.tgz#5e0882393e801963f749bea38888e716045fe895" 367 | integrity sha512-t2vouuYQKEKSLtJaa5bB4jHeha2HJczQ6E5IXPDPgIty9EqcJxpr1QHQ86YyIPwDwxvUmLfP2YADQ5ZY4qddZg== 368 | dependencies: 369 | "@typescript-eslint/typescript-estree" "8.32.0" 370 | "@typescript-eslint/utils" "8.32.0" 371 | debug "^4.3.4" 372 | ts-api-utils "^2.1.0" 373 | 374 | "@typescript-eslint/types@8.32.0": 375 | version "8.32.0" 376 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.32.0.tgz#a4a66b8876b8391970cf069b49572e43f1fc957a" 377 | integrity sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA== 378 | 379 | "@typescript-eslint/typescript-estree@8.32.0": 380 | version "8.32.0" 381 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.32.0.tgz#11d45f47bfabb141206a3da6c7b91a9d869ff32d" 382 | integrity sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ== 383 | dependencies: 384 | "@typescript-eslint/types" "8.32.0" 385 | "@typescript-eslint/visitor-keys" "8.32.0" 386 | debug "^4.3.4" 387 | fast-glob "^3.3.2" 388 | is-glob "^4.0.3" 389 | minimatch "^9.0.4" 390 | semver "^7.6.0" 391 | ts-api-utils "^2.1.0" 392 | 393 | "@typescript-eslint/utils@8.32.0": 394 | version "8.32.0" 395 | resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.32.0.tgz#24570f68cf845d198b73a7f94ca88d8c2505ba47" 396 | integrity sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw== 397 | dependencies: 398 | "@eslint-community/eslint-utils" "^4.7.0" 399 | "@typescript-eslint/scope-manager" "8.32.0" 400 | "@typescript-eslint/types" "8.32.0" 401 | "@typescript-eslint/typescript-estree" "8.32.0" 402 | 403 | "@typescript-eslint/visitor-keys@8.32.0": 404 | version "8.32.0" 405 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.32.0.tgz#0cca2cac046bc71cc40ce8214bac2850d6ecf4a6" 406 | integrity sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w== 407 | dependencies: 408 | "@typescript-eslint/types" "8.32.0" 409 | eslint-visitor-keys "^4.2.0" 410 | 411 | "@vladfrangu/async_event_emitter@^2.2.4", "@vladfrangu/async_event_emitter@^2.4.6": 412 | version "2.4.6" 413 | resolved "https://registry.yarnpkg.com/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.6.tgz#508b6c45b03f917112a9008180b308ba0e4d1805" 414 | integrity sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA== 415 | 416 | accepts@^2.0.0: 417 | version "2.0.0" 418 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-2.0.0.tgz#bbcf4ba5075467f3f2131eab3cffc73c2f5d7895" 419 | integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== 420 | dependencies: 421 | mime-types "^3.0.0" 422 | negotiator "^1.0.0" 423 | 424 | acorn-jsx@^5.3.2: 425 | version "5.3.2" 426 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 427 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 428 | 429 | acorn@^8.14.0: 430 | version "8.14.1" 431 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" 432 | integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== 433 | 434 | ajv@^6.12.4: 435 | version "6.12.6" 436 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 437 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 438 | dependencies: 439 | fast-deep-equal "^3.1.1" 440 | fast-json-stable-stringify "^2.0.0" 441 | json-schema-traverse "^0.4.1" 442 | uri-js "^4.2.2" 443 | 444 | ansi-styles@^4.1.0: 445 | version "4.3.0" 446 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 447 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 448 | dependencies: 449 | color-convert "^2.0.1" 450 | 451 | argparse@^2.0.1: 452 | version "2.0.1" 453 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 454 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 455 | 456 | asynckit@^0.4.0: 457 | version "0.4.0" 458 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 459 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 460 | 461 | balanced-match@^1.0.0: 462 | version "1.0.2" 463 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 464 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 465 | 466 | body-parser@^2.2.0: 467 | version "2.2.0" 468 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-2.2.0.tgz#f7a9656de305249a715b549b7b8fd1ab9dfddcfa" 469 | integrity sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg== 470 | dependencies: 471 | bytes "^3.1.2" 472 | content-type "^1.0.5" 473 | debug "^4.4.0" 474 | http-errors "^2.0.0" 475 | iconv-lite "^0.6.3" 476 | on-finished "^2.4.1" 477 | qs "^6.14.0" 478 | raw-body "^3.0.0" 479 | type-is "^2.0.0" 480 | 481 | brace-expansion@^1.1.7: 482 | version "1.1.11" 483 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 484 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 485 | dependencies: 486 | balanced-match "^1.0.0" 487 | concat-map "0.0.1" 488 | 489 | brace-expansion@^2.0.1: 490 | version "2.0.1" 491 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 492 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 493 | dependencies: 494 | balanced-match "^1.0.0" 495 | 496 | braces@^3.0.3: 497 | version "3.0.3" 498 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" 499 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 500 | dependencies: 501 | fill-range "^7.1.1" 502 | 503 | bytes@3.1.2, bytes@^3.1.2: 504 | version "3.1.2" 505 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" 506 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 507 | 508 | call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: 509 | version "1.0.2" 510 | resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" 511 | integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== 512 | dependencies: 513 | es-errors "^1.3.0" 514 | function-bind "^1.1.2" 515 | 516 | call-bound@^1.0.2: 517 | version "1.0.4" 518 | resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" 519 | integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== 520 | dependencies: 521 | call-bind-apply-helpers "^1.0.2" 522 | get-intrinsic "^1.3.0" 523 | 524 | callsites@^3.0.0: 525 | version "3.1.0" 526 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 527 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 528 | 529 | chalk@^4.0.0: 530 | version "4.1.2" 531 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 532 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 533 | dependencies: 534 | ansi-styles "^4.1.0" 535 | supports-color "^7.1.0" 536 | 537 | cloudstorm@0.13.2: 538 | version "0.13.2" 539 | resolved "https://registry.yarnpkg.com/cloudstorm/-/cloudstorm-0.13.2.tgz#2f02d1ddbedd67972687e8f850c32c0339c38b36" 540 | integrity sha512-BknlZ45IjUBnd3FYfw4zaUkALCTlPlx2a1bEIqt1BN/Vg3WK6ybE0Jg5/2MrTC/Lu+QWljTSYgfYKcyjgA/Bjg== 541 | dependencies: 542 | discord-api-types "^0.38.1" 543 | snowtransfer "^0.14.1" 544 | 545 | color-convert@^2.0.1: 546 | version "2.0.1" 547 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 548 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 549 | dependencies: 550 | color-name "~1.1.4" 551 | 552 | color-name@~1.1.4: 553 | version "1.1.4" 554 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 555 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 556 | 557 | combined-stream@^1.0.8: 558 | version "1.0.8" 559 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 560 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 561 | dependencies: 562 | delayed-stream "~1.0.0" 563 | 564 | concat-map@0.0.1: 565 | version "0.0.1" 566 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 567 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 568 | 569 | content-disposition@^1.0.0: 570 | version "1.0.0" 571 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-1.0.0.tgz#844426cb398f934caefcbb172200126bc7ceace2" 572 | integrity sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg== 573 | dependencies: 574 | safe-buffer "5.2.1" 575 | 576 | content-type@^1.0.5: 577 | version "1.0.5" 578 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" 579 | integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== 580 | 581 | cookie-signature@^1.2.1: 582 | version "1.2.2" 583 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.2.tgz#57c7fc3cc293acab9fec54d73e15690ebe4a1793" 584 | integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== 585 | 586 | cookie@^0.7.1: 587 | version "0.7.2" 588 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" 589 | integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== 590 | 591 | cors@^2.8.5: 592 | version "2.8.5" 593 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" 594 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== 595 | dependencies: 596 | object-assign "^4" 597 | vary "^1" 598 | 599 | cross-spawn@^7.0.3, cross-spawn@^7.0.6: 600 | version "7.0.6" 601 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" 602 | integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== 603 | dependencies: 604 | path-key "^3.1.0" 605 | shebang-command "^2.0.0" 606 | which "^2.0.1" 607 | 608 | debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0: 609 | version "4.4.0" 610 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" 611 | integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== 612 | dependencies: 613 | ms "^2.1.3" 614 | 615 | deep-is@^0.1.3: 616 | version "0.1.4" 617 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 618 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 619 | 620 | delayed-stream@~1.0.0: 621 | version "1.0.0" 622 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 623 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 624 | 625 | depd@2.0.0, depd@^2.0.0: 626 | version "2.0.0" 627 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 628 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 629 | 630 | detritus-client-rest@^0.10.5-beta.1: 631 | version "0.10.5" 632 | resolved "https://registry.yarnpkg.com/detritus-client-rest/-/detritus-client-rest-0.10.5.tgz#ca2a12dd11a886b6337f5b7af2fdc42089f4d681" 633 | integrity sha512-N5Bx2/Cru6OxwEqACtm4QghAQb/USa7a4OrrxGYQtgJch7/Rey739FdDBUWJexxfRUGG07IZSZmfiaiI5Tidjw== 634 | dependencies: 635 | detritus-rest "^0.7.0" 636 | detritus-utils "^0.4.0" 637 | 638 | detritus-client-socket@^0.8.3-beta.0: 639 | version "0.8.3" 640 | resolved "https://registry.yarnpkg.com/detritus-client-socket/-/detritus-client-socket-0.8.3.tgz#a23143468f0e70e40b8bdfc588e69cac92d843f1" 641 | integrity sha512-gMMD5Xo14A69wGxmpAwdQsh5TFaxpjq7LRC6cTWAvs+p34dSiKrU7sBnS+8IsnQt8uvjradhAxKqGkJK2xo6Jg== 642 | dependencies: 643 | "@types/node" "^14.17.1" 644 | detritus-utils "^0.4.0" 645 | ws "^7.4.6" 646 | 647 | detritus-client@0.16.x: 648 | version "0.16.3" 649 | resolved "https://registry.yarnpkg.com/detritus-client/-/detritus-client-0.16.3.tgz#aae28b73a2a6891c244935af30f60ab728d7d065" 650 | integrity sha512-+hwMunnPEvJOazhTFS6BJd25nv3sreLagDhlclPDzwkdwkK++svyiKCnZcEHnhmlSNTjzYcdHL9X7G2d7dOxaA== 651 | dependencies: 652 | "@types/node" "^14.17.2" 653 | "@types/node-fetch" "^2.5.10" 654 | detritus-client-rest "^0.10.5-beta.1" 655 | detritus-client-socket "^0.8.3-beta.0" 656 | detritus-utils "^0.4.0" 657 | 658 | detritus-rest@^0.7.0: 659 | version "0.7.0" 660 | resolved "https://registry.yarnpkg.com/detritus-rest/-/detritus-rest-0.7.0.tgz#15d7a98c7038935de7ba2a88eeed83aba1c88ed7" 661 | integrity sha512-T5FNXpyv5F69ZXEz6z8mWo5yiz7Mhrg+HQsZumih/uDeqf3+1AvZgNI4XLscG1D56F0o5DSyXkoOxDgd2oeTgA== 662 | dependencies: 663 | form-data "^3.0.0" 664 | node-fetch "^2.6.1" 665 | 666 | detritus-utils@^0.4.0: 667 | version "0.4.0" 668 | resolved "https://registry.yarnpkg.com/detritus-utils/-/detritus-utils-0.4.0.tgz#42c01e029bd716c5be30a82ee4c621136f64ef35" 669 | integrity sha512-XO9crk1eCOecajzOg4WMsvcgXV/3GAltV0nt+kXXmglwcKyh/5DpQ7jmQ/2HycEN0dGBdgLCLPzYMxrWPN9gpw== 670 | 671 | discord-api-types@^0.37.103: 672 | version "0.37.120" 673 | resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.37.120.tgz#ad7209930509c4cee3efddbacc77a1b18cf66d34" 674 | integrity sha512-7xpNK0EiWjjDFp2nAhHXezE4OUWm7s1zhc/UXXN6hnFFU8dfoPHgV0Hx0RPiCa3ILRpdeh152icc68DGCyXYIw== 675 | 676 | discord-api-types@^0.38.1: 677 | version "0.38.4" 678 | resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.38.4.tgz#7610429ce900f1bdb39c2c547f14a55b263c8a69" 679 | integrity sha512-EgxEQ4vrJUjXaTjif4ItOGoD6TH87nfESJ6XBSqoVgqkZrcmdLPjkciCzuIMdHxLjY2al3BcIcElqnpOoaqxHg== 680 | 681 | discord.js@14.x: 682 | version "14.19.3" 683 | resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-14.19.3.tgz#ed08c61ad300efc3033ecf2b70f28a68d95b138a" 684 | integrity sha512-lncTRk0k+8Q5D3nThnODBR8fR8x2fM798o8Vsr40Krx0DjPwpZCuxxTcFMrXMQVOqM1QB9wqWgaXPg3TbmlHqA== 685 | dependencies: 686 | "@discordjs/builders" "^1.11.2" 687 | "@discordjs/collection" "1.5.3" 688 | "@discordjs/formatters" "^0.6.1" 689 | "@discordjs/rest" "^2.5.0" 690 | "@discordjs/util" "^1.1.1" 691 | "@discordjs/ws" "^1.2.2" 692 | "@sapphire/snowflake" "3.5.3" 693 | discord-api-types "^0.38.1" 694 | fast-deep-equal "3.1.3" 695 | lodash.snakecase "4.1.1" 696 | magic-bytes.js "^1.10.0" 697 | tslib "^2.6.3" 698 | undici "6.21.1" 699 | 700 | dunder-proto@^1.0.1: 701 | version "1.0.1" 702 | resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" 703 | integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== 704 | dependencies: 705 | call-bind-apply-helpers "^1.0.1" 706 | es-errors "^1.3.0" 707 | gopd "^1.2.0" 708 | 709 | ee-first@1.1.1: 710 | version "1.1.1" 711 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 712 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== 713 | 714 | encodeurl@^2.0.0: 715 | version "2.0.0" 716 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" 717 | integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== 718 | 719 | entities@^4.4.0: 720 | version "4.5.0" 721 | resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" 722 | integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== 723 | 724 | eris@0.18.x: 725 | version "0.18.0" 726 | resolved "https://registry.yarnpkg.com/eris/-/eris-0.18.0.tgz#41e34179fd6759a046d24b5ec2d114439370d9ab" 727 | integrity sha512-zv2hjAfs4SYjR/EHUwBGNoKClctbqki1jPMed4SiQ4KKfafV1MIBLqKodQSGDgT9qkSUI5+MQ4EQW/8MkbAPkg== 728 | dependencies: 729 | ws "^8.2.3" 730 | optionalDependencies: 731 | opusscript "^0.0.8" 732 | tweetnacl "^1.0.3" 733 | 734 | es-define-property@^1.0.1: 735 | version "1.0.1" 736 | resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" 737 | integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== 738 | 739 | es-errors@^1.3.0: 740 | version "1.3.0" 741 | resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" 742 | integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== 743 | 744 | es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: 745 | version "1.1.1" 746 | resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" 747 | integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== 748 | dependencies: 749 | es-errors "^1.3.0" 750 | 751 | es-set-tostringtag@^2.1.0: 752 | version "2.1.0" 753 | resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" 754 | integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== 755 | dependencies: 756 | es-errors "^1.3.0" 757 | get-intrinsic "^1.2.6" 758 | has-tostringtag "^1.0.2" 759 | hasown "^2.0.2" 760 | 761 | escape-html@^1.0.3: 762 | version "1.0.3" 763 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 764 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 765 | 766 | escape-string-regexp@^4.0.0: 767 | version "4.0.0" 768 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 769 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 770 | 771 | eslint-plugin-es@^3.0.0: 772 | version "3.0.1" 773 | resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893" 774 | integrity sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ== 775 | dependencies: 776 | eslint-utils "^2.0.0" 777 | regexpp "^3.0.0" 778 | 779 | eslint-plugin-node@^11.1.0: 780 | version "11.1.0" 781 | resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" 782 | integrity sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g== 783 | dependencies: 784 | eslint-plugin-es "^3.0.0" 785 | eslint-utils "^2.0.0" 786 | ignore "^5.1.1" 787 | minimatch "^3.0.4" 788 | resolve "^1.10.1" 789 | semver "^6.1.0" 790 | 791 | eslint-plugin-promise@^7.2.1: 792 | version "7.2.1" 793 | resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-7.2.1.tgz#a0652195700aea40b926dc3c74b38e373377bfb0" 794 | integrity sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA== 795 | dependencies: 796 | "@eslint-community/eslint-utils" "^4.4.0" 797 | 798 | eslint-scope@^8.3.0: 799 | version "8.3.0" 800 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.3.0.tgz#10cd3a918ffdd722f5f3f7b5b83db9b23c87340d" 801 | integrity sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ== 802 | dependencies: 803 | esrecurse "^4.3.0" 804 | estraverse "^5.2.0" 805 | 806 | eslint-utils@^2.0.0: 807 | version "2.1.0" 808 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" 809 | integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== 810 | dependencies: 811 | eslint-visitor-keys "^1.1.0" 812 | 813 | eslint-visitor-keys@^1.1.0: 814 | version "1.3.0" 815 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" 816 | integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== 817 | 818 | eslint-visitor-keys@^3.4.3: 819 | version "3.4.3" 820 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" 821 | integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== 822 | 823 | eslint-visitor-keys@^4.2.0: 824 | version "4.2.0" 825 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" 826 | integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== 827 | 828 | eslint@^9.26.0: 829 | version "9.26.0" 830 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.26.0.tgz#978fe029adc2aceed28ab437bca876e83461c3b4" 831 | integrity sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ== 832 | dependencies: 833 | "@eslint-community/eslint-utils" "^4.2.0" 834 | "@eslint-community/regexpp" "^4.12.1" 835 | "@eslint/config-array" "^0.20.0" 836 | "@eslint/config-helpers" "^0.2.1" 837 | "@eslint/core" "^0.13.0" 838 | "@eslint/eslintrc" "^3.3.1" 839 | "@eslint/js" "9.26.0" 840 | "@eslint/plugin-kit" "^0.2.8" 841 | "@humanfs/node" "^0.16.6" 842 | "@humanwhocodes/module-importer" "^1.0.1" 843 | "@humanwhocodes/retry" "^0.4.2" 844 | "@modelcontextprotocol/sdk" "^1.8.0" 845 | "@types/estree" "^1.0.6" 846 | "@types/json-schema" "^7.0.15" 847 | ajv "^6.12.4" 848 | chalk "^4.0.0" 849 | cross-spawn "^7.0.6" 850 | debug "^4.3.2" 851 | escape-string-regexp "^4.0.0" 852 | eslint-scope "^8.3.0" 853 | eslint-visitor-keys "^4.2.0" 854 | espree "^10.3.0" 855 | esquery "^1.5.0" 856 | esutils "^2.0.2" 857 | fast-deep-equal "^3.1.3" 858 | file-entry-cache "^8.0.0" 859 | find-up "^5.0.0" 860 | glob-parent "^6.0.2" 861 | ignore "^5.2.0" 862 | imurmurhash "^0.1.4" 863 | is-glob "^4.0.0" 864 | json-stable-stringify-without-jsonify "^1.0.1" 865 | lodash.merge "^4.6.2" 866 | minimatch "^3.1.2" 867 | natural-compare "^1.4.0" 868 | optionator "^0.9.3" 869 | zod "^3.24.2" 870 | 871 | espree@^10.0.1, espree@^10.3.0: 872 | version "10.3.0" 873 | resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" 874 | integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== 875 | dependencies: 876 | acorn "^8.14.0" 877 | acorn-jsx "^5.3.2" 878 | eslint-visitor-keys "^4.2.0" 879 | 880 | esquery@^1.5.0: 881 | version "1.6.0" 882 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" 883 | integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== 884 | dependencies: 885 | estraverse "^5.1.0" 886 | 887 | esrecurse@^4.3.0: 888 | version "4.3.0" 889 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 890 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 891 | dependencies: 892 | estraverse "^5.2.0" 893 | 894 | estraverse@^5.1.0, estraverse@^5.2.0: 895 | version "5.3.0" 896 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 897 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 898 | 899 | esutils@^2.0.2: 900 | version "2.0.3" 901 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 902 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 903 | 904 | etag@^1.8.1: 905 | version "1.8.1" 906 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 907 | integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== 908 | 909 | eventsource-parser@^3.0.1: 910 | version "3.0.1" 911 | resolved "https://registry.yarnpkg.com/eventsource-parser/-/eventsource-parser-3.0.1.tgz#5e358dba9a55ba64ca90da883c4ca35bd82467bd" 912 | integrity sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA== 913 | 914 | eventsource@^3.0.2: 915 | version "3.0.7" 916 | resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-3.0.7.tgz#1157622e2f5377bb6aef2114372728ba0c156989" 917 | integrity sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA== 918 | dependencies: 919 | eventsource-parser "^3.0.1" 920 | 921 | express-rate-limit@^7.5.0: 922 | version "7.5.0" 923 | resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-7.5.0.tgz#6a67990a724b4fbbc69119419feef50c51e8b28f" 924 | integrity sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg== 925 | 926 | express@^5.0.1: 927 | version "5.1.0" 928 | resolved "https://registry.yarnpkg.com/express/-/express-5.1.0.tgz#d31beaf715a0016f0d53f47d3b4d7acf28c75cc9" 929 | integrity sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA== 930 | dependencies: 931 | accepts "^2.0.0" 932 | body-parser "^2.2.0" 933 | content-disposition "^1.0.0" 934 | content-type "^1.0.5" 935 | cookie "^0.7.1" 936 | cookie-signature "^1.2.1" 937 | debug "^4.4.0" 938 | encodeurl "^2.0.0" 939 | escape-html "^1.0.3" 940 | etag "^1.8.1" 941 | finalhandler "^2.1.0" 942 | fresh "^2.0.0" 943 | http-errors "^2.0.0" 944 | merge-descriptors "^2.0.0" 945 | mime-types "^3.0.0" 946 | on-finished "^2.4.1" 947 | once "^1.4.0" 948 | parseurl "^1.3.3" 949 | proxy-addr "^2.0.7" 950 | qs "^6.14.0" 951 | range-parser "^1.2.1" 952 | router "^2.2.0" 953 | send "^1.1.0" 954 | serve-static "^2.2.0" 955 | statuses "^2.0.1" 956 | type-is "^2.0.1" 957 | vary "^1.1.2" 958 | 959 | fast-deep-equal@3.1.3, fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 960 | version "3.1.3" 961 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 962 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 963 | 964 | fast-glob@^3.3.2: 965 | version "3.3.3" 966 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" 967 | integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== 968 | dependencies: 969 | "@nodelib/fs.stat" "^2.0.2" 970 | "@nodelib/fs.walk" "^1.2.3" 971 | glob-parent "^5.1.2" 972 | merge2 "^1.3.0" 973 | micromatch "^4.0.8" 974 | 975 | fast-json-stable-stringify@^2.0.0: 976 | version "2.1.0" 977 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 978 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 979 | 980 | fast-levenshtein@^2.0.6: 981 | version "2.0.6" 982 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 983 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 984 | 985 | fastq@^1.6.0: 986 | version "1.19.1" 987 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" 988 | integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== 989 | dependencies: 990 | reusify "^1.0.4" 991 | 992 | file-entry-cache@^8.0.0: 993 | version "8.0.0" 994 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" 995 | integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== 996 | dependencies: 997 | flat-cache "^4.0.0" 998 | 999 | fill-range@^7.1.1: 1000 | version "7.1.1" 1001 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" 1002 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 1003 | dependencies: 1004 | to-regex-range "^5.0.1" 1005 | 1006 | finalhandler@^2.1.0: 1007 | version "2.1.0" 1008 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-2.1.0.tgz#72306373aa89d05a8242ed569ed86a1bff7c561f" 1009 | integrity sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q== 1010 | dependencies: 1011 | debug "^4.4.0" 1012 | encodeurl "^2.0.0" 1013 | escape-html "^1.0.3" 1014 | on-finished "^2.4.1" 1015 | parseurl "^1.3.3" 1016 | statuses "^2.0.1" 1017 | 1018 | find-up@^5.0.0: 1019 | version "5.0.0" 1020 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 1021 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 1022 | dependencies: 1023 | locate-path "^6.0.0" 1024 | path-exists "^4.0.0" 1025 | 1026 | flat-cache@^4.0.0: 1027 | version "4.0.1" 1028 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" 1029 | integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== 1030 | dependencies: 1031 | flatted "^3.2.9" 1032 | keyv "^4.5.4" 1033 | 1034 | flatted@^3.2.9: 1035 | version "3.3.3" 1036 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" 1037 | integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== 1038 | 1039 | form-data@^3.0.0: 1040 | version "3.0.3" 1041 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.3.tgz#349c8f2c9d8f8f0c879ee0eb7cc0d300018d6b09" 1042 | integrity sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w== 1043 | dependencies: 1044 | asynckit "^0.4.0" 1045 | combined-stream "^1.0.8" 1046 | es-set-tostringtag "^2.1.0" 1047 | mime-types "^2.1.35" 1048 | 1049 | form-data@^4.0.0: 1050 | version "4.0.2" 1051 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.2.tgz#35cabbdd30c3ce73deb2c42d3c8d3ed9ca51794c" 1052 | integrity sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w== 1053 | dependencies: 1054 | asynckit "^0.4.0" 1055 | combined-stream "^1.0.8" 1056 | es-set-tostringtag "^2.1.0" 1057 | mime-types "^2.1.12" 1058 | 1059 | forwarded@0.2.0: 1060 | version "0.2.0" 1061 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 1062 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 1063 | 1064 | fresh@^2.0.0: 1065 | version "2.0.0" 1066 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-2.0.0.tgz#8dd7df6a1b3a1b3a5cf186c05a5dd267622635a4" 1067 | integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== 1068 | 1069 | function-bind@^1.1.2: 1070 | version "1.1.2" 1071 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" 1072 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 1073 | 1074 | get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: 1075 | version "1.3.0" 1076 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" 1077 | integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== 1078 | dependencies: 1079 | call-bind-apply-helpers "^1.0.2" 1080 | es-define-property "^1.0.1" 1081 | es-errors "^1.3.0" 1082 | es-object-atoms "^1.1.1" 1083 | function-bind "^1.1.2" 1084 | get-proto "^1.0.1" 1085 | gopd "^1.2.0" 1086 | has-symbols "^1.1.0" 1087 | hasown "^2.0.2" 1088 | math-intrinsics "^1.1.0" 1089 | 1090 | get-proto@^1.0.1: 1091 | version "1.0.1" 1092 | resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" 1093 | integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== 1094 | dependencies: 1095 | dunder-proto "^1.0.1" 1096 | es-object-atoms "^1.0.0" 1097 | 1098 | glob-parent@^5.1.2: 1099 | version "5.1.2" 1100 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 1101 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 1102 | dependencies: 1103 | is-glob "^4.0.1" 1104 | 1105 | glob-parent@^6.0.2: 1106 | version "6.0.2" 1107 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 1108 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 1109 | dependencies: 1110 | is-glob "^4.0.3" 1111 | 1112 | globals@^14.0.0: 1113 | version "14.0.0" 1114 | resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" 1115 | integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== 1116 | 1117 | globals@^16.1.0: 1118 | version "16.1.0" 1119 | resolved "https://registry.yarnpkg.com/globals/-/globals-16.1.0.tgz#ee6ab147d41c64e9f2beaaaf66572d18df8e1e60" 1120 | integrity sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g== 1121 | 1122 | gopd@^1.2.0: 1123 | version "1.2.0" 1124 | resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" 1125 | integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== 1126 | 1127 | graphemer@^1.4.0: 1128 | version "1.4.0" 1129 | resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" 1130 | integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== 1131 | 1132 | has-flag@^4.0.0: 1133 | version "4.0.0" 1134 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1135 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1136 | 1137 | has-symbols@^1.0.3, has-symbols@^1.1.0: 1138 | version "1.1.0" 1139 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" 1140 | integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== 1141 | 1142 | has-tostringtag@^1.0.2: 1143 | version "1.0.2" 1144 | resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" 1145 | integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== 1146 | dependencies: 1147 | has-symbols "^1.0.3" 1148 | 1149 | hasown@^2.0.2: 1150 | version "2.0.2" 1151 | resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" 1152 | integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== 1153 | dependencies: 1154 | function-bind "^1.1.2" 1155 | 1156 | http-errors@2.0.0, http-errors@^2.0.0: 1157 | version "2.0.0" 1158 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" 1159 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 1160 | dependencies: 1161 | depd "2.0.0" 1162 | inherits "2.0.4" 1163 | setprototypeof "1.2.0" 1164 | statuses "2.0.1" 1165 | toidentifier "1.0.1" 1166 | 1167 | iconv-lite@0.6.3, iconv-lite@^0.6.3: 1168 | version "0.6.3" 1169 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" 1170 | integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== 1171 | dependencies: 1172 | safer-buffer ">= 2.1.2 < 3.0.0" 1173 | 1174 | ignore@^5.1.1, ignore@^5.2.0, ignore@^5.3.1: 1175 | version "5.3.2" 1176 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" 1177 | integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== 1178 | 1179 | import-fresh@^3.2.1: 1180 | version "3.3.1" 1181 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" 1182 | integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== 1183 | dependencies: 1184 | parent-module "^1.0.0" 1185 | resolve-from "^4.0.0" 1186 | 1187 | imurmurhash@^0.1.4: 1188 | version "0.1.4" 1189 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1190 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 1191 | 1192 | inherits@2.0.4: 1193 | version "2.0.4" 1194 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1195 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1196 | 1197 | ipaddr.js@1.9.1: 1198 | version "1.9.1" 1199 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 1200 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 1201 | 1202 | is-core-module@^2.16.0: 1203 | version "2.16.1" 1204 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" 1205 | integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== 1206 | dependencies: 1207 | hasown "^2.0.2" 1208 | 1209 | is-extglob@^2.1.1: 1210 | version "2.1.1" 1211 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1212 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 1213 | 1214 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: 1215 | version "4.0.3" 1216 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1217 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1218 | dependencies: 1219 | is-extglob "^2.1.1" 1220 | 1221 | is-number@^7.0.0: 1222 | version "7.0.0" 1223 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1224 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1225 | 1226 | is-promise@^4.0.0: 1227 | version "4.0.0" 1228 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" 1229 | integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== 1230 | 1231 | isexe@^2.0.0: 1232 | version "2.0.0" 1233 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1234 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 1235 | 1236 | js-yaml@^4.1.0: 1237 | version "4.1.0" 1238 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 1239 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 1240 | dependencies: 1241 | argparse "^2.0.1" 1242 | 1243 | json-buffer@3.0.1: 1244 | version "3.0.1" 1245 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" 1246 | integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== 1247 | 1248 | json-schema-traverse@^0.4.1: 1249 | version "0.4.1" 1250 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1251 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1252 | 1253 | json-stable-stringify-without-jsonify@^1.0.1: 1254 | version "1.0.1" 1255 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1256 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 1257 | 1258 | keyv@^4.5.4: 1259 | version "4.5.4" 1260 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" 1261 | integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== 1262 | dependencies: 1263 | json-buffer "3.0.1" 1264 | 1265 | lavalink-types@^2.1.1: 1266 | version "2.1.1" 1267 | resolved "https://registry.yarnpkg.com/lavalink-types/-/lavalink-types-2.1.1.tgz#30e90cdc897b5b62d1215b4b8df00a6daed0f895" 1268 | integrity sha512-dfu7U0aFCc75qUTyz855bkTvmi58sn6iZk5wHyMeGKqLtIhJJKrLG5ukYcGOGbuIqEYXAO5xqyyExGscFZ4r0Q== 1269 | 1270 | levn@^0.4.1: 1271 | version "0.4.1" 1272 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 1273 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 1274 | dependencies: 1275 | prelude-ls "^1.2.1" 1276 | type-check "~0.4.0" 1277 | 1278 | linkify-it@^5.0.0: 1279 | version "5.0.0" 1280 | resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" 1281 | integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== 1282 | dependencies: 1283 | uc.micro "^2.0.0" 1284 | 1285 | locate-path@^6.0.0: 1286 | version "6.0.0" 1287 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 1288 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 1289 | dependencies: 1290 | p-locate "^5.0.0" 1291 | 1292 | lodash.merge@^4.6.2: 1293 | version "4.6.2" 1294 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 1295 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 1296 | 1297 | lodash.snakecase@4.1.1: 1298 | version "4.1.1" 1299 | resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" 1300 | integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== 1301 | 1302 | lodash@^4.17.21: 1303 | version "4.17.21" 1304 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 1305 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 1306 | 1307 | lunr@^2.3.9: 1308 | version "2.3.9" 1309 | resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" 1310 | integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== 1311 | 1312 | magic-bytes.js@^1.10.0: 1313 | version "1.12.1" 1314 | resolved "https://registry.yarnpkg.com/magic-bytes.js/-/magic-bytes.js-1.12.1.tgz#031fedceb1fc652c1ccd917c6b45a6e8d6554245" 1315 | integrity sha512-ThQLOhN86ZkJ7qemtVRGYM+gRgR8GEXNli9H/PMvpnZsE44Xfh3wx9kGJaldg314v85m+bFW6WBMaVHJc/c3zA== 1316 | 1317 | markdown-it@^14.1.0: 1318 | version "14.1.0" 1319 | resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.0.tgz#3c3c5992883c633db4714ccb4d7b5935d98b7d45" 1320 | integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== 1321 | dependencies: 1322 | argparse "^2.0.1" 1323 | entities "^4.4.0" 1324 | linkify-it "^5.0.0" 1325 | mdurl "^2.0.0" 1326 | punycode.js "^2.3.1" 1327 | uc.micro "^2.1.0" 1328 | 1329 | math-intrinsics@^1.1.0: 1330 | version "1.1.0" 1331 | resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" 1332 | integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== 1333 | 1334 | mdurl@^2.0.0: 1335 | version "2.0.0" 1336 | resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" 1337 | integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== 1338 | 1339 | media-typer@^1.1.0: 1340 | version "1.1.0" 1341 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561" 1342 | integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== 1343 | 1344 | merge-descriptors@^2.0.0: 1345 | version "2.0.0" 1346 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz#ea922f660635a2249ee565e0449f951e6b603808" 1347 | integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== 1348 | 1349 | merge2@^1.3.0: 1350 | version "1.4.1" 1351 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1352 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1353 | 1354 | micromatch@^4.0.8: 1355 | version "4.0.8" 1356 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" 1357 | integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== 1358 | dependencies: 1359 | braces "^3.0.3" 1360 | picomatch "^2.3.1" 1361 | 1362 | mime-db@1.52.0: 1363 | version "1.52.0" 1364 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 1365 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 1366 | 1367 | mime-db@^1.54.0: 1368 | version "1.54.0" 1369 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" 1370 | integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== 1371 | 1372 | mime-types@^2.1.12, mime-types@^2.1.35: 1373 | version "2.1.35" 1374 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 1375 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 1376 | dependencies: 1377 | mime-db "1.52.0" 1378 | 1379 | mime-types@^3.0.0, mime-types@^3.0.1: 1380 | version "3.0.1" 1381 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.1.tgz#b1d94d6997a9b32fd69ebaed0db73de8acb519ce" 1382 | integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA== 1383 | dependencies: 1384 | mime-db "^1.54.0" 1385 | 1386 | minimatch@^3.0.4, minimatch@^3.1.2: 1387 | version "3.1.2" 1388 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1389 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1390 | dependencies: 1391 | brace-expansion "^1.1.7" 1392 | 1393 | minimatch@^9.0.4, minimatch@^9.0.5: 1394 | version "9.0.5" 1395 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" 1396 | integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== 1397 | dependencies: 1398 | brace-expansion "^2.0.1" 1399 | 1400 | ms@^2.1.3: 1401 | version "2.1.3" 1402 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1403 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1404 | 1405 | natural-compare@^1.4.0: 1406 | version "1.4.0" 1407 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1408 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 1409 | 1410 | negotiator@^1.0.0: 1411 | version "1.0.0" 1412 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a" 1413 | integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== 1414 | 1415 | node-fetch@^2.6.1: 1416 | version "2.7.0" 1417 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" 1418 | integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== 1419 | dependencies: 1420 | whatwg-url "^5.0.0" 1421 | 1422 | object-assign@^4: 1423 | version "4.1.1" 1424 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1425 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 1426 | 1427 | object-inspect@^1.13.3: 1428 | version "1.13.4" 1429 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" 1430 | integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== 1431 | 1432 | oceanic.js@1.12.0: 1433 | version "1.12.0" 1434 | resolved "https://registry.yarnpkg.com/oceanic.js/-/oceanic.js-1.12.0.tgz#63e10a4eb15b97efa34687a33dc11583aea35558" 1435 | integrity sha512-e3h5ptwBfbX4/gDz13UFiIfAFsaZrXDwJbfTdV7YEKdQG6d0A6of2KGzkBbqXrVC5wmM/7TWAYeh2fe9zuxGYA== 1436 | dependencies: 1437 | tslib "^2.8.1" 1438 | ws "^8.18.1" 1439 | optionalDependencies: 1440 | "@discordjs/voice" "^0.18.0" 1441 | 1442 | on-finished@^2.4.1: 1443 | version "2.4.1" 1444 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 1445 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 1446 | dependencies: 1447 | ee-first "1.1.1" 1448 | 1449 | once@^1.4.0: 1450 | version "1.4.0" 1451 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1452 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 1453 | dependencies: 1454 | wrappy "1" 1455 | 1456 | optionator@^0.9.3: 1457 | version "0.9.4" 1458 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" 1459 | integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== 1460 | dependencies: 1461 | deep-is "^0.1.3" 1462 | fast-levenshtein "^2.0.6" 1463 | levn "^0.4.1" 1464 | prelude-ls "^1.2.1" 1465 | type-check "^0.4.0" 1466 | word-wrap "^1.2.5" 1467 | 1468 | opusscript@^0.0.8: 1469 | version "0.0.8" 1470 | resolved "https://registry.yarnpkg.com/opusscript/-/opusscript-0.0.8.tgz#00b49e81281b4d99092d013b1812af8654bd0a87" 1471 | integrity sha512-VSTi1aWFuCkRCVq+tx/BQ5q9fMnQ9pVZ3JU4UHKqTkf0ED3fKEPdr+gKAAl3IA2hj9rrP6iyq3hlcJq3HELtNQ== 1472 | 1473 | p-limit@^3.0.2: 1474 | version "3.1.0" 1475 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1476 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1477 | dependencies: 1478 | yocto-queue "^0.1.0" 1479 | 1480 | p-locate@^5.0.0: 1481 | version "5.0.0" 1482 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1483 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1484 | dependencies: 1485 | p-limit "^3.0.2" 1486 | 1487 | parent-module@^1.0.0: 1488 | version "1.0.1" 1489 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1490 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1491 | dependencies: 1492 | callsites "^3.0.0" 1493 | 1494 | parseurl@^1.3.3: 1495 | version "1.3.3" 1496 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 1497 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 1498 | 1499 | path-exists@^4.0.0: 1500 | version "4.0.0" 1501 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1502 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1503 | 1504 | path-key@^3.1.0: 1505 | version "3.1.1" 1506 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1507 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1508 | 1509 | path-parse@^1.0.7: 1510 | version "1.0.7" 1511 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1512 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1513 | 1514 | path-to-regexp@^8.0.0: 1515 | version "8.2.0" 1516 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz#73990cc29e57a3ff2a0d914095156df5db79e8b4" 1517 | integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ== 1518 | 1519 | picomatch@^2.3.1: 1520 | version "2.3.1" 1521 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1522 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1523 | 1524 | pkce-challenge@^5.0.0: 1525 | version "5.0.0" 1526 | resolved "https://registry.yarnpkg.com/pkce-challenge/-/pkce-challenge-5.0.0.tgz#c3a405cb49e272094a38e890a2b51da0228c4d97" 1527 | integrity sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ== 1528 | 1529 | prelude-ls@^1.2.1: 1530 | version "1.2.1" 1531 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 1532 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1533 | 1534 | prism-media@^1.3.5: 1535 | version "1.3.5" 1536 | resolved "https://registry.yarnpkg.com/prism-media/-/prism-media-1.3.5.tgz#ea1533229f304a1b774b158de40e98c765db0aa6" 1537 | integrity sha512-IQdl0Q01m4LrkN1EGIE9lphov5Hy7WWlH6ulf5QdGePLlPas9p2mhgddTEHrlaXYjjFToM1/rWuwF37VF4taaA== 1538 | 1539 | proxy-addr@^2.0.7: 1540 | version "2.0.7" 1541 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 1542 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 1543 | dependencies: 1544 | forwarded "0.2.0" 1545 | ipaddr.js "1.9.1" 1546 | 1547 | punycode.js@^2.3.1: 1548 | version "2.3.1" 1549 | resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" 1550 | integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== 1551 | 1552 | punycode@^2.1.0: 1553 | version "2.3.1" 1554 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" 1555 | integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== 1556 | 1557 | qs@^6.14.0: 1558 | version "6.14.0" 1559 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" 1560 | integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== 1561 | dependencies: 1562 | side-channel "^1.1.0" 1563 | 1564 | queue-microtask@^1.2.2: 1565 | version "1.2.3" 1566 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1567 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1568 | 1569 | range-parser@^1.2.1: 1570 | version "1.2.1" 1571 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 1572 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 1573 | 1574 | raw-body@^3.0.0: 1575 | version "3.0.0" 1576 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-3.0.0.tgz#25b3476f07a51600619dae3fe82ddc28a36e5e0f" 1577 | integrity sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g== 1578 | dependencies: 1579 | bytes "3.1.2" 1580 | http-errors "2.0.0" 1581 | iconv-lite "0.6.3" 1582 | unpipe "1.0.0" 1583 | 1584 | regexpp@^3.0.0: 1585 | version "3.2.0" 1586 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" 1587 | integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== 1588 | 1589 | resolve-from@^4.0.0: 1590 | version "4.0.0" 1591 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1592 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1593 | 1594 | resolve@^1.10.1: 1595 | version "1.22.10" 1596 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" 1597 | integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== 1598 | dependencies: 1599 | is-core-module "^2.16.0" 1600 | path-parse "^1.0.7" 1601 | supports-preserve-symlinks-flag "^1.0.0" 1602 | 1603 | reusify@^1.0.4: 1604 | version "1.1.0" 1605 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" 1606 | integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== 1607 | 1608 | router@^2.2.0: 1609 | version "2.2.0" 1610 | resolved "https://registry.yarnpkg.com/router/-/router-2.2.0.tgz#019be620b711c87641167cc79b99090f00b146ef" 1611 | integrity sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ== 1612 | dependencies: 1613 | debug "^4.4.0" 1614 | depd "^2.0.0" 1615 | is-promise "^4.0.0" 1616 | parseurl "^1.3.3" 1617 | path-to-regexp "^8.0.0" 1618 | 1619 | run-parallel@^1.1.9: 1620 | version "1.2.0" 1621 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1622 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1623 | dependencies: 1624 | queue-microtask "^1.2.2" 1625 | 1626 | safe-buffer@5.2.1: 1627 | version "5.2.1" 1628 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1629 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1630 | 1631 | "safer-buffer@>= 2.1.2 < 3.0.0": 1632 | version "2.1.2" 1633 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1634 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1635 | 1636 | semver@^6.1.0: 1637 | version "6.3.1" 1638 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" 1639 | integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== 1640 | 1641 | semver@^7.6.0: 1642 | version "7.7.1" 1643 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" 1644 | integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== 1645 | 1646 | send@^1.1.0, send@^1.2.0: 1647 | version "1.2.0" 1648 | resolved "https://registry.yarnpkg.com/send/-/send-1.2.0.tgz#32a7554fb777b831dfa828370f773a3808d37212" 1649 | integrity sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw== 1650 | dependencies: 1651 | debug "^4.3.5" 1652 | encodeurl "^2.0.0" 1653 | escape-html "^1.0.3" 1654 | etag "^1.8.1" 1655 | fresh "^2.0.0" 1656 | http-errors "^2.0.0" 1657 | mime-types "^3.0.1" 1658 | ms "^2.1.3" 1659 | on-finished "^2.4.1" 1660 | range-parser "^1.2.1" 1661 | statuses "^2.0.1" 1662 | 1663 | serve-static@^2.2.0: 1664 | version "2.2.0" 1665 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-2.2.0.tgz#9c02564ee259bdd2251b82d659a2e7e1938d66f9" 1666 | integrity sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ== 1667 | dependencies: 1668 | encodeurl "^2.0.0" 1669 | escape-html "^1.0.3" 1670 | parseurl "^1.3.3" 1671 | send "^1.2.0" 1672 | 1673 | setprototypeof@1.2.0: 1674 | version "1.2.0" 1675 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 1676 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 1677 | 1678 | shebang-command@^2.0.0: 1679 | version "2.0.0" 1680 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1681 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1682 | dependencies: 1683 | shebang-regex "^3.0.0" 1684 | 1685 | shebang-regex@^3.0.0: 1686 | version "3.0.0" 1687 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1688 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1689 | 1690 | side-channel-list@^1.0.0: 1691 | version "1.0.0" 1692 | resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" 1693 | integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== 1694 | dependencies: 1695 | es-errors "^1.3.0" 1696 | object-inspect "^1.13.3" 1697 | 1698 | side-channel-map@^1.0.1: 1699 | version "1.0.1" 1700 | resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" 1701 | integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== 1702 | dependencies: 1703 | call-bound "^1.0.2" 1704 | es-errors "^1.3.0" 1705 | get-intrinsic "^1.2.5" 1706 | object-inspect "^1.13.3" 1707 | 1708 | side-channel-weakmap@^1.0.2: 1709 | version "1.0.2" 1710 | resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" 1711 | integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== 1712 | dependencies: 1713 | call-bound "^1.0.2" 1714 | es-errors "^1.3.0" 1715 | get-intrinsic "^1.2.5" 1716 | object-inspect "^1.13.3" 1717 | side-channel-map "^1.0.1" 1718 | 1719 | side-channel@^1.1.0: 1720 | version "1.1.0" 1721 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" 1722 | integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== 1723 | dependencies: 1724 | es-errors "^1.3.0" 1725 | object-inspect "^1.13.3" 1726 | side-channel-list "^1.0.0" 1727 | side-channel-map "^1.0.1" 1728 | side-channel-weakmap "^1.0.2" 1729 | 1730 | snowtransfer@^0.14.1: 1731 | version "0.14.1" 1732 | resolved "https://registry.yarnpkg.com/snowtransfer/-/snowtransfer-0.14.1.tgz#63b0d4f5bb99ccac7801da09b17792615f3a8d13" 1733 | integrity sha512-KggjM3IT12aSRagfbSFbwQX7fwmNFkyZyZuZ9/N2PCXLKwRZXs4EczwY4ZsjpMuoAjJCeolC0jkxBzeHjle9JA== 1734 | dependencies: 1735 | discord-api-types "^0.38.1" 1736 | 1737 | statuses@2.0.1, statuses@^2.0.1: 1738 | version "2.0.1" 1739 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 1740 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 1741 | 1742 | strip-json-comments@^3.1.1: 1743 | version "3.1.1" 1744 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1745 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1746 | 1747 | supports-color@^7.1.0: 1748 | version "7.2.0" 1749 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1750 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1751 | dependencies: 1752 | has-flag "^4.0.0" 1753 | 1754 | supports-preserve-symlinks-flag@^1.0.0: 1755 | version "1.0.0" 1756 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 1757 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 1758 | 1759 | to-regex-range@^5.0.1: 1760 | version "5.0.1" 1761 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1762 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1763 | dependencies: 1764 | is-number "^7.0.0" 1765 | 1766 | toidentifier@1.0.1: 1767 | version "1.0.1" 1768 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 1769 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 1770 | 1771 | tr46@~0.0.3: 1772 | version "0.0.3" 1773 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" 1774 | integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== 1775 | 1776 | ts-api-utils@^2.1.0: 1777 | version "2.1.0" 1778 | resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz#595f7094e46eed364c13fd23e75f9513d29baf91" 1779 | integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== 1780 | 1781 | ts-mixer@^6.0.4: 1782 | version "6.0.4" 1783 | resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.4.tgz#1da39ceabc09d947a82140d9f09db0f84919ca28" 1784 | integrity sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA== 1785 | 1786 | tslib@^2.6.2, tslib@^2.6.3, tslib@^2.8.1: 1787 | version "2.8.1" 1788 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" 1789 | integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== 1790 | 1791 | tweetnacl@^1.0.3: 1792 | version "1.0.3" 1793 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" 1794 | integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== 1795 | 1796 | type-check@^0.4.0, type-check@~0.4.0: 1797 | version "0.4.0" 1798 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 1799 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 1800 | dependencies: 1801 | prelude-ls "^1.2.1" 1802 | 1803 | type-is@^2.0.0, type-is@^2.0.1: 1804 | version "2.0.1" 1805 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-2.0.1.tgz#64f6cf03f92fce4015c2b224793f6bdd4b068c97" 1806 | integrity sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw== 1807 | dependencies: 1808 | content-type "^1.0.5" 1809 | media-typer "^1.1.0" 1810 | mime-types "^3.0.0" 1811 | 1812 | typedoc-github-theme@^0.3.0: 1813 | version "0.3.0" 1814 | resolved "https://registry.yarnpkg.com/typedoc-github-theme/-/typedoc-github-theme-0.3.0.tgz#9fbc2f54acc3034748825ee9bf28547a4513680f" 1815 | integrity sha512-7HzKJt8ZZSTNYczK8BcZZbpr7GsyTZgsoLFKtO4NYxXOb7mSr92yTj7hl16ind0WsOzxPo2DZGjkUH2VoPrdxg== 1816 | 1817 | typedoc@^0.28.4: 1818 | version "0.28.4" 1819 | resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.28.4.tgz#015958b6c9cbf6ec70e77ca73ec6b65c74c8af02" 1820 | integrity sha512-xKvKpIywE1rnqqLgjkoq0F3wOqYaKO9nV6YkkSat6IxOWacUCc/7Es0hR3OPmkIqkPoEn7U3x+sYdG72rstZQA== 1821 | dependencies: 1822 | "@gerrit0/mini-shiki" "^3.2.2" 1823 | lunr "^2.3.9" 1824 | markdown-it "^14.1.0" 1825 | minimatch "^9.0.5" 1826 | yaml "^2.7.1" 1827 | 1828 | typescript-eslint@^8.32.0: 1829 | version "8.32.0" 1830 | resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.32.0.tgz#032cf9176d987caff291990ea6313bf4c0b63b4e" 1831 | integrity sha512-UMq2kxdXCzinFFPsXc9o2ozIpYCCOiEC46MG3yEh5Vipq6BO27otTtEBZA1fQ66DulEUgE97ucQ/3YY66CPg0A== 1832 | dependencies: 1833 | "@typescript-eslint/eslint-plugin" "8.32.0" 1834 | "@typescript-eslint/parser" "8.32.0" 1835 | "@typescript-eslint/utils" "8.32.0" 1836 | 1837 | typescript@^5.8.3: 1838 | version "5.8.3" 1839 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e" 1840 | integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== 1841 | 1842 | uc.micro@^2.0.0, uc.micro@^2.1.0: 1843 | version "2.1.0" 1844 | resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" 1845 | integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== 1846 | 1847 | undici-types@~6.21.0: 1848 | version "6.21.0" 1849 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" 1850 | integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== 1851 | 1852 | undici@6.21.1: 1853 | version "6.21.1" 1854 | resolved "https://registry.yarnpkg.com/undici/-/undici-6.21.1.tgz#336025a14162e6837e44ad7b819b35b6c6af0e05" 1855 | integrity sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ== 1856 | 1857 | unpipe@1.0.0: 1858 | version "1.0.0" 1859 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1860 | integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== 1861 | 1862 | uri-js@^4.2.2: 1863 | version "4.4.1" 1864 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 1865 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 1866 | dependencies: 1867 | punycode "^2.1.0" 1868 | 1869 | vary@^1, vary@^1.1.2: 1870 | version "1.1.2" 1871 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 1872 | integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== 1873 | 1874 | webidl-conversions@^3.0.0: 1875 | version "3.0.1" 1876 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" 1877 | integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== 1878 | 1879 | whatwg-url@^5.0.0: 1880 | version "5.0.0" 1881 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" 1882 | integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== 1883 | dependencies: 1884 | tr46 "~0.0.3" 1885 | webidl-conversions "^3.0.0" 1886 | 1887 | which@^2.0.1: 1888 | version "2.0.2" 1889 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1890 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1891 | dependencies: 1892 | isexe "^2.0.0" 1893 | 1894 | word-wrap@^1.2.5: 1895 | version "1.2.5" 1896 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" 1897 | integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== 1898 | 1899 | wrappy@1: 1900 | version "1.0.2" 1901 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1902 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1903 | 1904 | ws@^7.4.6: 1905 | version "7.5.10" 1906 | resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" 1907 | integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== 1908 | 1909 | ws@^8.17.0, ws@^8.18.0, ws@^8.18.1, ws@^8.2.3: 1910 | version "8.18.2" 1911 | resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.2.tgz#42738b2be57ced85f46154320aabb51ab003705a" 1912 | integrity sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ== 1913 | 1914 | yaml@^2.7.1: 1915 | version "2.7.1" 1916 | resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.7.1.tgz#44a247d1b88523855679ac7fa7cda6ed7e135cf6" 1917 | integrity sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ== 1918 | 1919 | yocto-queue@^0.1.0: 1920 | version "0.1.0" 1921 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1922 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1923 | 1924 | zod-to-json-schema@^3.24.1: 1925 | version "3.24.5" 1926 | resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz#d1095440b147fb7c2093812a53c54df8d5df50a3" 1927 | integrity sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g== 1928 | 1929 | zod@^3.23.8, zod@^3.24.2: 1930 | version "3.24.4" 1931 | resolved "https://registry.yarnpkg.com/zod/-/zod-3.24.4.tgz#e2e2cca5faaa012d76e527d0d36622e0a90c315f" 1932 | integrity sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg== 1933 | --------------------------------------------------------------------------------