diff --git a/.gitignore b/.gitignore
index 022baec..518ac03 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
key.json
/nbproject/private/
+node_modules/
\ No newline at end of file
diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json
deleted file mode 100644
index f4dcce1..0000000
--- a/node_modules/.package-lock.json
+++ /dev/null
@@ -1,366 +0,0 @@
-{
- "name": "nomoreacronyms",
- "version": "1.0.0",
- "lockfileVersion": 2,
- "requires": true,
- "packages": {
- "node_modules/@discordjs/builders": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.5.0.tgz",
- "integrity": "sha512-7XxT78mnNBPigHn2y6KAXkicxIBFtZREGWaRZ249EC1l6gBUEP8IyVY5JTciIjJArxkF+tg675aZvsTNTKBpmA==",
- "dependencies": {
- "@discordjs/formatters": "^0.2.0",
- "@discordjs/util": "^0.2.0",
- "@sapphire/shapeshift": "^3.8.1",
- "discord-api-types": "^0.37.35",
- "fast-deep-equal": "^3.1.3",
- "ts-mixer": "^6.0.3",
- "tslib": "^2.5.0"
- },
- "engines": {
- "node": ">=16.9.0"
- }
- },
- "node_modules/@discordjs/collection": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.4.0.tgz",
- "integrity": "sha512-hiOJyk2CPFf1+FL3a4VKCuu1f448LlROVuu8nLz1+jCOAPokUcdFAV+l4pd3B3h6uJlJQSASoZzrdyNdjdtfzQ==",
- "engines": {
- "node": ">=16.9.0"
- }
- },
- "node_modules/@discordjs/formatters": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.2.0.tgz",
- "integrity": "sha512-vn4oMSXuMZUm8ITqVOtvE7/fMMISj4cI5oLsR09PEQXHKeKDAMLltG/DWeeIs7Idfy6V8Fk3rn1e69h7NfzuNA==",
- "dependencies": {
- "discord-api-types": "^0.37.35"
- },
- "engines": {
- "node": ">=16.9.0"
- }
- },
- "node_modules/@discordjs/rest": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.6.0.tgz",
- "integrity": "sha512-HGvqNCZ5Z5j0tQHjmT1lFvE5ETO4hvomJ1r0cbnpC1zM23XhCpZ9wgTCiEmaxKz05cyf2CI9p39+9LL+6Yz1bA==",
- "dependencies": {
- "@discordjs/collection": "^1.4.0",
- "@discordjs/util": "^0.2.0",
- "@sapphire/async-queue": "^1.5.0",
- "@sapphire/snowflake": "^3.4.0",
- "discord-api-types": "^0.37.35",
- "file-type": "^18.2.1",
- "tslib": "^2.5.0",
- "undici": "^5.20.0"
- },
- "engines": {
- "node": ">=16.9.0"
- }
- },
- "node_modules/@discordjs/util": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-0.2.0.tgz",
- "integrity": "sha512-/8qNbebFzLWKOOg+UV+RB8itp4SmU5jw0tBUD3ifElW6rYNOj1Ku5JaSW7lLl/WgjjxF01l/1uQPCzkwr110vg==",
- "engines": {
- "node": ">=16.9.0"
- }
- },
- "node_modules/@sapphire/async-queue": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz",
- "integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==",
- "engines": {
- "node": ">=v14.0.0",
- "npm": ">=7.0.0"
- }
- },
- "node_modules/@sapphire/shapeshift": {
- "version": "3.8.1",
- "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.8.1.tgz",
- "integrity": "sha512-xG1oXXBhCjPKbxrRTlox9ddaZTvVpOhYLmKmApD/vIWOV1xEYXnpoFs68zHIZBGbqztq6FrUPNPerIrO1Hqeaw==",
- "dependencies": {
- "fast-deep-equal": "^3.1.3",
- "lodash": "^4.17.21"
- },
- "engines": {
- "node": ">=v14.0.0",
- "npm": ">=7.0.0"
- }
- },
- "node_modules/@sapphire/snowflake": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.4.0.tgz",
- "integrity": "sha512-zZxymtVO6zeXVMPds+6d7gv/OfnCc25M1Z+7ZLB0oPmeMTPeRWVPQSS16oDJy5ZsyCOLj7M6mbZml5gWXcVRNw==",
- "engines": {
- "node": ">=v14.0.0",
- "npm": ">=7.0.0"
- }
- },
- "node_modules/@tokenizer/token": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz",
- "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="
- },
- "node_modules/@types/node": {
- "version": "18.15.11",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz",
- "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q=="
- },
- "node_modules/@types/ws": {
- "version": "8.5.4",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz",
- "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/busboy": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
- "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
- "dependencies": {
- "streamsearch": "^1.1.0"
- },
- "engines": {
- "node": ">=10.16.0"
- }
- },
- "node_modules/discord-api-types": {
- "version": "0.37.37",
- "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.37.tgz",
- "integrity": "sha512-LDMBKzl/zbvHO/yCzno5hevuA6lFIXJwdKSJZQrB+1ToDpFfN9thK+xxgZNR4aVkI7GHRDja0p4Sl2oYVPnHYg=="
- },
- "node_modules/discord.js": {
- "version": "14.8.0",
- "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.8.0.tgz",
- "integrity": "sha512-UOxYtc/YnV7jAJ2gISluJyYeBw4e+j8gWn+IoqG8unaHAVuvZ13DdYN0M1f9fbUgUvSarV798inIrYFtDNDjwQ==",
- "dependencies": {
- "@discordjs/builders": "^1.5.0",
- "@discordjs/collection": "^1.4.0",
- "@discordjs/formatters": "^0.2.0",
- "@discordjs/rest": "^1.6.0",
- "@discordjs/util": "^0.2.0",
- "@sapphire/snowflake": "^3.4.0",
- "@types/ws": "^8.5.4",
- "discord-api-types": "^0.37.35",
- "fast-deep-equal": "^3.1.3",
- "lodash.snakecase": "^4.1.1",
- "tslib": "^2.5.0",
- "undici": "^5.20.0",
- "ws": "^8.12.1"
- },
- "engines": {
- "node": ">=16.9.0"
- }
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
- },
- "node_modules/file-type": {
- "version": "18.2.1",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.2.1.tgz",
- "integrity": "sha512-Yw5MtnMv7vgD2/6Bjmmuegc8bQEVA9GmAyaR18bMYWKqsWDG9wgYZ1j4I6gNMF5Y5JBDcUcjRQqNQx7Y8uotcg==",
- "dependencies": {
- "readable-web-to-node-stream": "^3.0.2",
- "strtok3": "^7.0.0",
- "token-types": "^5.0.1"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/file-type?sponsor=1"
- }
- },
- "node_modules/ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
- },
- "node_modules/lodash.snakecase": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz",
- "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw=="
- },
- "node_modules/peek-readable": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz",
- "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==",
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Borewit"
- }
- },
- "node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/readable-web-to-node-stream": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz",
- "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==",
- "dependencies": {
- "readable-stream": "^3.6.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Borewit"
- }
- },
- "node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/streamsearch": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
- "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "dependencies": {
- "safe-buffer": "~5.2.0"
- }
- },
- "node_modules/strtok3": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz",
- "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==",
- "dependencies": {
- "@tokenizer/token": "^0.3.0",
- "peek-readable": "^5.0.0"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Borewit"
- }
- },
- "node_modules/token-types": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz",
- "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==",
- "dependencies": {
- "@tokenizer/token": "^0.3.0",
- "ieee754": "^1.2.1"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Borewit"
- }
- },
- "node_modules/ts-mixer": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz",
- "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ=="
- },
- "node_modules/tslib": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
- "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg=="
- },
- "node_modules/undici": {
- "version": "5.21.0",
- "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz",
- "integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==",
- "dependencies": {
- "busboy": "^1.6.0"
- },
- "engines": {
- "node": ">=12.18"
- }
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
- },
- "node_modules/ws": {
- "version": "8.13.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
- "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": ">=5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- }
- }
-}
diff --git a/node_modules/@discordjs/builders/CHANGELOG.md b/node_modules/@discordjs/builders/CHANGELOG.md
deleted file mode 100644
index eb8000d..0000000
--- a/node_modules/@discordjs/builders/CHANGELOG.md
+++ /dev/null
@@ -1,233 +0,0 @@
-# Changelog
-
-All notable changes to this project will be documented in this file.
-
-# [@discordjs/builders@1.5.0](https://github.com/discordjs/discord.js/compare/@discordjs/builders@1.4.0...@discordjs/builders@1.5.0) - (2023-03-12)
-
-## Documentation
-
-- **EmbedBuilder#spliceFields:** Fix a typo (#9159) ([4367ab9](https://github.com/discordjs/discord.js/commit/4367ab930227048868db3ed8437f6c4507ff32e1))
-- Fix version export (#9049) ([8b70f49](https://github.com/discordjs/discord.js/commit/8b70f497a1207e30edebdecd12b926c981c13d28))
-
-## Features
-
-- **website:** Add support for source file links (#9048) ([f6506e9](https://github.com/discordjs/discord.js/commit/f6506e99c496683ee0ab67db0726b105b929af38))
-- **StringSelectMenu:** Add `spliceOptions()` (#8937) ([a6941d5](https://github.com/discordjs/discord.js/commit/a6941d536ce24ed2b5446a154cbc886b2b97c63a))
-- Add support for nsfw commands (#7976) ([7a51344](https://github.com/discordjs/discord.js/commit/7a5134459c5f06864bf74631d83b96d9c21b72d8))
-- Add `@discordjs/formatters` (#8889) ([3fca638](https://github.com/discordjs/discord.js/commit/3fca638a8470dcea2f79ddb9f18526dbc0017c88))
-
-## Styling
-
-- Run prettier (#9041) ([2798ba1](https://github.com/discordjs/discord.js/commit/2798ba1eb3d734f0cf2eeccd2e16cfba6804873b))
-
-# [@discordjs/builders@1.4.0](https://github.com/discordjs/discord.js/compare/@discordjs/builders@1.3.0...@discordjs/builders@1.4.0) - (2022-11-28)
-
-## Bug Fixes
-
-- Pin @types/node version ([9d8179c](https://github.com/discordjs/discord.js/commit/9d8179c6a78e1c7f9976f852804055964d5385d4))
-
-## Features
-
-- New select menus (#8793) ([5152abf](https://github.com/discordjs/discord.js/commit/5152abf7285581abf7689e9050fdc56c4abb1e2b))
-- Allow punctuation characters in context menus (#8783) ([b521366](https://github.com/discordjs/discord.js/commit/b5213664fa66746daab1673ebe2adf2db3d1522c))
-
-## Typings
-
-- **Formatters:** Allow boolean in `formatEmoji` (#8823) ([ec37f13](https://github.com/discordjs/discord.js/commit/ec37f137fd4fca0fdbdb8a5c83abf32362a8f285))
-
-# [@discordjs/builders@1.3.0](https://github.com/discordjs/discord.js/compare/@discordjs/builders@1.2.0...@discordjs/builders@1.3.0) - (2022-10-08)
-
-## Bug Fixes
-
-- Allow adding forums to `channelTypes` (#8658) ([b1e190c](https://github.com/discordjs/discord.js/commit/b1e190c4f0773a1a739625f5b41026f593515370))
-- **SlashCommandBuilder:** Missing methods in subcommand builder (#8583) ([1c5b78f](https://github.com/discordjs/discord.js/commit/1c5b78fd2130f09c951459cf4c2d637f46c3c2c9))
-- Footer / sidebar / deprecation alert ([ba3e0ed](https://github.com/discordjs/discord.js/commit/ba3e0ed348258fe8e51eefb4aa7379a1230616a9))
-
-## Documentation
-
-- **builders/components:** Document constructors (#8636) ([8444576](https://github.com/discordjs/discord.js/commit/8444576f45da5fdddbf8ba2d91b4cb31a3b51c04))
-- Change name (#8604) ([dd5a089](https://github.com/discordjs/discord.js/commit/dd5a08944c258a847fc4377f1d5e953264ab47d0))
-- Use remarks instead of `Note` in descriptions (#8597) ([f3ce4a7](https://github.com/discordjs/discord.js/commit/f3ce4a75d0c4eafc89a1f0ce9f4964bcbcdae6da))
-
-## Features
-
-- Web-components (#8715) ([0ac3e76](https://github.com/discordjs/discord.js/commit/0ac3e766bd9dbdeb106483fa4bb085d74de346a2))
-- Add `@discordjs/util` (#8591) ([b2ec865](https://github.com/discordjs/discord.js/commit/b2ec865765bf94181473864a627fb63ea8173fd3))
-- Add `chatInputApplicationCommandMention` formatter (#8546) ([d08a57c](https://github.com/discordjs/discord.js/commit/d08a57cadd9d69a734077cc1902d931ab10336db))
-
-## Refactor
-
-- Replace usage of deprecated `ChannelType`s (#8625) ([669c3cd](https://github.com/discordjs/discord.js/commit/669c3cd2566eac68ef38ab522dd6378ba761e8b3))
-- Website components (#8600) ([c334157](https://github.com/discordjs/discord.js/commit/c3341570d983aea9ecc419979d5a01de658c9d67))
-- Use `eslint-config-neon` for packages. (#8579) ([edadb9f](https://github.com/discordjs/discord.js/commit/edadb9fe5dfd9ff51a3cfc9b25cb242d3f9f5241))
-
-## Testing
-
-- Rename incorrect test (#8596) ([ce991dd](https://github.com/discordjs/discord.js/commit/ce991dd1d883f6785b5f4b4b3ac80ef21cb304e7))
-
-## Typings
-
-- **interactions:** Fix `{Slash,ContextMenu}CommandBuilder#toJSON` (#8568) ([b7eb96d](https://github.com/discordjs/discord.js/commit/b7eb96d45670616521fbcca28a657793d91605c7))
-
-# [@discordjs/builders@1.2.0](https://github.com/discordjs/discord.js/compare/@discordjs/builders@1.1.0...@discordjs/builders@1.2.0) - (2022-08-22)
-
-## Features
-
-- **website:** Show `constructor` information (#8540) ([e42fd16](https://github.com/discordjs/discord.js/commit/e42fd1636973b10dd7ed6fb4280ee1a4a8f82007))
-- **website:** Show descriptions for `@typeParam` blocks (#8523) ([e475b63](https://github.com/discordjs/discord.js/commit/e475b63f257f6261d73cb89fee9ecbcdd84e2a6b))
-- **website:** Show parameter descriptions (#8519) ([7f415a2](https://github.com/discordjs/discord.js/commit/7f415a2502bf7ce2025dbcfed9017b0635a19966))
-- **WebSocketShard:** Support new resume url (#8480) ([bc06cc6](https://github.com/discordjs/discord.js/commit/bc06cc638d2f57ab5c600e8cdb6afc8eb2180166))
-
-## Refactor
-
-- Docs design (#8487) ([4ab1d09](https://github.com/discordjs/discord.js/commit/4ab1d09997a18879a9eb9bda39df6f15aa22557e))
-
-# [@discordjs/builders@1.1.0](https://github.com/discordjs/discord.js/compare/@discordjs/builders@0.16.0...@discordjs/builders@1.1.0) - (2022-07-29)
-
-## Bug Fixes
-
-- Use proper format for `@link` text (#8384) ([2655639](https://github.com/discordjs/discord.js/commit/26556390a3800e954974a00c1328ff47d3e67e9a))
-- **Formatters:** Add newline in `codeBlock` (#8369) ([5d8bd03](https://github.com/discordjs/discord.js/commit/5d8bd030d60ef364de3ef5f9963da8bda5c4efd4))
-- **selectMenu:** Allow json to be used for select menu options (#8322) ([6a2d0d8](https://github.com/discordjs/discord.js/commit/6a2d0d8e96d157d5b85cee7f17bffdfff4240074))
-
-## Documentation
-
-- Use link tags (#8382) ([5494791](https://github.com/discordjs/discord.js/commit/549479131318c659f86f0eb18578d597e22522d3))
-
-## Features
-
-- Add channel & message URL formatters (#8371) ([a7deb8f](https://github.com/discordjs/discord.js/commit/a7deb8f89830ead6185c5fb46a49688b6d209ed1))
-
-## Testing
-
-- **builders:** Improve coverage (#8274) ([b7e6238](https://github.com/discordjs/discord.js/commit/b7e62380f2e6b9324d6bba9b9eaa5315080bf66a))
-
-# [@discordjs/builders@0.16.0](https://github.com/discordjs/discord.js/compare/@discordjs/builders@0.15.0...@discordjs/builders@0.16.0) - (2022-07-17)
-
-## Bug Fixes
-
-- Slash command name regex (#8265) ([32f9056](https://github.com/discordjs/discord.js/commit/32f9056b15edede3bab07de96afb4b56d3a9ecca))
-- **TextInputBuilder:** Parse `custom_id`, `label`, and `style` (#8216) ([2d9dfa3](https://github.com/discordjs/discord.js/commit/2d9dfa3c6ea4bb972da2f7e088d148b798c866d9))
-
-## Documentation
-
-- Add codecov coverage badge to readmes (#8226) ([f6db285](https://github.com/discordjs/discord.js/commit/f6db285c073898a749fe4591cbd4463d1896daf5))
-
-## Features
-
-- **builder:** Add max min length in string option (#8214) ([96c8d21](https://github.com/discordjs/discord.js/commit/96c8d21f95eb366c46ae23505ba9054f44821b25))
-- Codecov (#8219) ([f10f4cd](https://github.com/discordjs/discord.js/commit/f10f4cdcd88ca6be7ec735ed3a415ba13da83db0))
-- **docgen:** Update typedoc ([b3346f4](https://github.com/discordjs/discord.js/commit/b3346f4b9b3d4f96443506643d4631dc1c6d7b21))
-- Website (#8043) ([127931d](https://github.com/discordjs/discord.js/commit/127931d1df7a2a5c27923c2f2151dbf3824e50cc))
-- **docgen:** Typescript support ([3279b40](https://github.com/discordjs/discord.js/commit/3279b40912e6aa61507bedb7db15a2b8668de44b))
-- Docgen package (#8029) ([8b979c0](https://github.com/discordjs/discord.js/commit/8b979c0245c42fd824d8e98745ee869f5360fc86))
-
-## Refactor
-
-- **builder:** Remove `unsafe*Builder`s (#8074) ([a4d1862](https://github.com/discordjs/discord.js/commit/a4d18629828234f43f03d1bd4851d4b727c6903b))
-- Remove @sindresorhus/is as it's now esm only (#8133) ([c6f285b](https://github.com/discordjs/discord.js/commit/c6f285b7b089b004776fbeb444fe973a68d158d8))
-- Move all the config files to root (#8033) ([769ea0b](https://github.com/discordjs/discord.js/commit/769ea0bfe78c4f1d413c6b397c604ffe91e39c6a))
-
-## Typings
-
-- Remove expect error (#8242) ([7e6dbaa](https://github.com/discordjs/discord.js/commit/7e6dbaaed900c07d1a04e23bbbf9cd0d1b0501c5))
-- **builder:** Remove casting (#8241) ([8198da5](https://github.com/discordjs/discord.js/commit/8198da5cd0898e06954615a2287853321e7ebbd4))
-
-# [@discordjs/builders@0.15.0](https://github.com/discordjs/discord.js/compare/@discordjs/builders@0.14.0...@discordjs/builders@0.15.0) - (2022-06-06)
-
-## Features
-
-- Allow builders to accept rest params and arrays (#7874) ([ad75be9](https://github.com/discordjs/discord.js/commit/ad75be9a9cf90c8624495df99b75177e6c24022f))
-- Use vitest instead of jest for more speed ([8d8e6c0](https://github.com/discordjs/discord.js/commit/8d8e6c03decd7352a2aa180f6e5bc1a13602539b))
-- Add scripts package for locally used scripts ([f2ae1f9](https://github.com/discordjs/discord.js/commit/f2ae1f9348bfd893332a9060f71a8a5f272a1b8b))
-
-# [@discordjs/builders@0.14.0](https://github.com/discordjs/discord.js/compare/@discordjs/builders@0.13.0...@discordjs/builders@0.14.0) - (2022-06-04)
-
-## Bug Fixes
-
-- **builders:** Leftover invalid null type ([8a7cd10](https://github.com/discordjs/discord.js/commit/8a7cd10554a2a71cd2fe7f6a177b5f4f43464348))
-- **SlashCommandBuilder:** Import `Permissions` correctly (#7921) ([7ce641d](https://github.com/discordjs/discord.js/commit/7ce641d33a4af6586d5e7beffbe7d38619dcf1a2))
-- Add localizations for subcommand builders and option choices (#7862) ([c1b5e73](https://github.com/discordjs/discord.js/commit/c1b5e731daa9cbbfca03a046e47cb1221ee1ed7c))
-
-## Features
-
-- Export types from `interactions/slashCommands/mixins` (#7942) ([68d5169](https://github.com/discordjs/discord.js/commit/68d5169f66c96f8fe5be17a1c01cdd5155607ab2))
-- **builders:** Add new command permissions v2 (#7861) ([de3f157](https://github.com/discordjs/discord.js/commit/de3f1573f07dda294cc0fbb1ca4b659eb2388a12))
-- **builders:** Improve embed errors and predicates (#7795) ([ec8d87f](https://github.com/discordjs/discord.js/commit/ec8d87f93272cc9987f9613735c0361680c4ed1e))
-
-## Refactor
-
-- Use arrays instead of rest parameters for builders (#7759) ([29293d7](https://github.com/discordjs/discord.js/commit/29293d7bbb5ed463e52e5a5853817e5a09cf265b))
-
-## Styling
-
-- Cleanup tests and tsup configs ([6b8ef20](https://github.com/discordjs/discord.js/commit/6b8ef20cb3af5b5cfd176dd0aa0a1a1e98551629))
-
-# [@discordjs/builders@0.13.0](https://github.com/discordjs/discord.js/compare/@discordjs/builders@0.12.0...@discordjs/builders@0.13.0) - (2022-04-17)
-
-## Bug Fixes
-
-- Validate select menu options (#7566) ([b1d63d9](https://github.com/discordjs/discord.js/commit/b1d63d919a61f309ac89f27016b0f148678dac2b))
-- **SelectMenu:** Set `placeholder` max to 150 (#7538) ([dcd4797](https://github.com/discordjs/discord.js/commit/dcd479767b6ec980a373f2ea1f22754f41661c1e))
-- Only check `instanceof Component` once (#7546) ([0aa4851](https://github.com/discordjs/discord.js/commit/0aa48516a4e33497e8e8dc50da164a57cdee09d3))
-- **builders:** Allow negative min/max value of number/integer option (#7484) ([3baa340](https://github.com/discordjs/discord.js/commit/3baa340821b8ecf8a16253bc0917a1033250d7c9))
-- **components:** SetX should take rest parameters (#7461) ([3617359](https://github.com/discordjs/discord.js/commit/36173590a712f041b087b7882054805a8bd42dae))
-- Unsafe embed builder field normalization (#7418) ([b936103](https://github.com/discordjs/discord.js/commit/b936103395121cb21a8c616f669ddab1d2efb0f1))
-- Fix some typos (#7393) ([92a04f4](https://github.com/discordjs/discord.js/commit/92a04f4d98f6c6760214034cc8f5a1eaa78893c7))
-- **builders:** Make type optional in constructor (#7391) ([4abb28c](https://github.com/discordjs/discord.js/commit/4abb28c0a1256c57a60369a6b8ec9e98c265b489))
-- Don't create new instances of builders classes (#7343) ([d6b56d0](https://github.com/discordjs/discord.js/commit/d6b56d0080c4c5f8ace731f1e8bcae0c9d3fb5a5))
-
-## Documentation
-
-- Completely fix builders example link (#7543) ([1a14c0c](https://github.com/discordjs/discord.js/commit/1a14c0ca562ea173d363a770a0437209f461fd23))
-- Add slash command builders example, fixes #7338 (#7339) ([3ae6f3c](https://github.com/discordjs/discord.js/commit/3ae6f3c313091151245d6e6b52337b459ecfc765))
-
-## Features
-
-- Slash command localization for builders (#7683) ([40b9a1d](https://github.com/discordjs/discord.js/commit/40b9a1d67d0b508ec593e030913acd8161cd17f8))
-- Add API v10 support (#7477) ([72577c4](https://github.com/discordjs/discord.js/commit/72577c4bfd02524a27afb6ff4aebba9301a690d3))
-- Add support for module: NodeNext in TS and ESM (#7598) ([8f1986a](https://github.com/discordjs/discord.js/commit/8f1986a6aa98365e09b00e84ad5f9f354ab61f3d))
-- Add Modals and Text Inputs (#7023) ([ed92015](https://github.com/discordjs/discord.js/commit/ed920156344233241a21b0c0b99736a3a855c23c))
-- Add missing `v13` component methods (#7466) ([f7257f0](https://github.com/discordjs/discord.js/commit/f7257f07655076eabfe355cb6a53260b39ca9670))
-- **builders:** Add attachment command option type (#7203) ([ae0f35f](https://github.com/discordjs/discord.js/commit/ae0f35f51d68dfa5a7dc43d161ef9365171debdb))
-- **components:** Add unsafe message component builders (#7387) ([6b6222b](https://github.com/discordjs/discord.js/commit/6b6222bf513d1ee8cd98fba0ad313def560b864f))
-- **embed:** Add setFields (#7322) ([bcc5cda](https://github.com/discordjs/discord.js/commit/bcc5cda8a902ddb28c7e3578e0f29b4272832624))
-
-## Refactor
-
-- Remove nickname parsing (#7736) ([78a3afc](https://github.com/discordjs/discord.js/commit/78a3afcd7fdac358e06764cc0d675e1215c785f3))
-- Replace zod with shapeshift (#7547) ([3c0bbac](https://github.com/discordjs/discord.js/commit/3c0bbac82fa9988af4a62ff00c66d149fbe6b921))
-- Remove store channels (#7634) ([aedddb8](https://github.com/discordjs/discord.js/commit/aedddb875e740e1f1bd77f06ce1b361fd3b7bc36))
-- Allow builders to accept emoji strings (#7616) ([fb9a9c2](https://github.com/discordjs/discord.js/commit/fb9a9c221121ee1c7986f9c775b77b9691a0ae15))
-- Don't return builders from API data (#7584) ([549716e](https://github.com/discordjs/discord.js/commit/549716e4fcec89ca81216a6d22aa8e623175e37a))
-- Remove obsolete builder methods (#7590) ([10607db](https://github.com/discordjs/discord.js/commit/10607dbdafe257c5cbf5b952b7eecec4919e8b4a))
-- **Embed:** Remove add field (#7522) ([8478d2f](https://github.com/discordjs/discord.js/commit/8478d2f4de9ac013733850cbbc67902f7c5abc55))
-- Make `data` public in builders (#7486) ([ba31203](https://github.com/discordjs/discord.js/commit/ba31203a0ad96e0a00f8312c397889351e4c5cfd))
-- **embed:** Remove array support in favor of rest params (#7498) ([b3fa2ec](https://github.com/discordjs/discord.js/commit/b3fa2ece402839008738ad3adce3db958445838d))
-- **components:** Default set boolean methods to true (#7502) ([b122149](https://github.com/discordjs/discord.js/commit/b12214922cea2f43afbe6b1555a74a3c8e16f798))
-- Make public builder props getters (#7422) ([e8252ed](https://github.com/discordjs/discord.js/commit/e8252ed3b981a4b7e4013f12efadd2f5d9318d3e))
-- **builders-methods:** Make methods consistent (#7395) ([f495364](https://github.com/discordjs/discord.js/commit/f4953647ff9f39127978c73bf8a62c08462802ca))
-- Remove conditional autocomplete option return types (#7396) ([0909824](https://github.com/discordjs/discord.js/commit/09098240bfb13b8afafa4ab549f06d236e0ff1c9))
-- **embed:** Mark properties as readonly (#7332) ([31768fc](https://github.com/discordjs/discord.js/commit/31768fcd69ed5b4566a340bda89ce881418e8272))
-
-## Typings
-
-- Fix regressions (#7649) ([5748dbe](https://github.com/discordjs/discord.js/commit/5748dbe08783beb80c526de38ccd105eb0e82664))
-
-# [@discordjs/builders@0.12.0](https://github.com/discordjs/discord.js/compare/@discordjs/builders@0.11.0...@discordjs/builders@0.12.0) - (2022-01-24)
-
-## Bug Fixes
-
-- **builders:** Dont export `Button` component stuff twice (#7289) ([86d9d06](https://github.com/discordjs/discord.js/commit/86d9d0674347c08d056cd054cb4ce4253195bf94))
-
-## Documentation
-
-- **SlashCommandSubcommands:** Updating old links from Discord developer portal (#7224) ([bd7a6f2](https://github.com/discordjs/discord.js/commit/bd7a6f265212624199fb0b2ddc8ece39759c63de))
-
-## Features
-
-- Add components to /builders (#7195) ([2bb40fd](https://github.com/discordjs/discord.js/commit/2bb40fd767cf5918e3ba422ff73082734bfa05b0))
-
-## Typings
-
-- Make `required` a boolean (#7307) ([c10afea](https://github.com/discordjs/discord.js/commit/c10afeadc702ab98bec5e077b3b92494a9596f9c))
diff --git a/node_modules/@discordjs/builders/LICENSE b/node_modules/@discordjs/builders/LICENSE
deleted file mode 100644
index cbe9c65..0000000
--- a/node_modules/@discordjs/builders/LICENSE
+++ /dev/null
@@ -1,191 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- Copyright 2021 Noel Buechler
- Copyright 2021 Vlad Frangu
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/node_modules/@discordjs/builders/README.md b/node_modules/@discordjs/builders/README.md
deleted file mode 100644
index 59508dd..0000000
--- a/node_modules/@discordjs/builders/README.md
+++ /dev/null
@@ -1,70 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-## Installation
-
-**Node.js 16.9.0 or newer is required.**
-
-```sh-session
-npm install @discordjs/builders
-yarn add @discordjs/builders
-pnpm add @discordjs/builders
-```
-
-## Examples
-
-Here are some examples for the builders and utilities you can find in this package:
-
-- [Slash Command Builders][example]
-
-## Links
-
-- [Website][website] ([source][website-source])
-- [Documentation][documentation]
-- [Guide][guide] ([source][guide-source])
- See also the [Update Guide][guide-update], including updated and removed items in the library.
-- [discord.js Discord server][discord]
-- [Discord API Discord server][discord-api]
-- [GitHub][source]
-- [npm][npm]
-- [Related libraries][related-libs]
-
-## Contributing
-
-Before creating an issue, please ensure that it hasn't already been reported/suggested, and double-check the
-[documentation][documentation].
-See [the contribution guide][contributing] if you'd like to submit a PR.
-
-## Help
-
-If you don't understand something in the documentation, you are experiencing problems, or you just need a gentle
-nudge in the right direction, please don't hesitate to join our official [discord.js Server][discord].
-
-[example]: https://github.com/discordjs/discord.js/blob/main/packages/builders/docs/examples/Slash%20Command%20Builders.md
-[website]: https://discord.js.org/
-[website-source]: https://github.com/discordjs/discord.js/tree/main/apps/website
-[documentation]: https://discord.js.org/#/docs/builders
-[guide]: https://discordjs.guide/
-[guide-source]: https://github.com/discordjs/guide
-[guide-update]: https://discordjs.guide/additional-info/changes-in-v14.html
-[discord]: https://discord.gg/djs
-[discord-api]: https://discord.gg/discord-api
-[source]: https://github.com/discordjs/discord.js/tree/main/packages/builders
-[npm]: https://www.npmjs.com/package/@discordjs/builders
-[related-libs]: https://discord.com/developers/docs/topics/community-resources#libraries
-[contributing]: https://github.com/discordjs/discord.js/blob/main/.github/CONTRIBUTING.md
diff --git a/node_modules/@discordjs/builders/dist/index.d.ts b/node_modules/@discordjs/builders/dist/index.d.ts
deleted file mode 100644
index b648419..0000000
--- a/node_modules/@discordjs/builders/dist/index.d.ts
+++ /dev/null
@@ -1,1564 +0,0 @@
-import * as _sapphire_shapeshift from '@sapphire/shapeshift';
-import { APIEmbedField, APIEmbedAuthor, APIEmbedFooter, APIEmbedImage, APIEmbed, APISelectMenuOption, APIMessageComponentEmoji, ButtonStyle, ChannelType, APIActionRowComponent, APIActionRowComponentTypes, APIBaseComponent, ComponentType, APIButtonComponent, APISelectMenuComponent, APIChannelSelectComponent, APIMentionableSelectComponent, APIRoleSelectComponent, APIStringSelectComponent, APIUserSelectComponent, APITextInputComponent, TextInputStyle, APIMessageActionRowComponent, APIModalActionRowComponent, APIModalComponent, APIMessageComponent, APIModalInteractionResponseCallbackData, LocalizationMap, LocaleString, ApplicationCommandOptionType, APIApplicationCommandBasicOption, APIApplicationCommandAttachmentOption, APIApplicationCommandBooleanOption, APIApplicationCommandChannelOption, APIApplicationCommandOptionChoice, APIApplicationCommandIntegerOption, APIApplicationCommandMentionableOption, APIApplicationCommandNumberOption, APIApplicationCommandRoleOption, APIApplicationCommandStringOption, APIApplicationCommandUserOption, APIApplicationCommandSubcommandGroupOption, APIApplicationCommandSubcommandOption, Permissions, RESTPostAPIChatInputApplicationCommandsJSONBody, APIApplicationCommandOption, Locale, RESTPostAPIContextMenuApplicationCommandsJSONBody, ApplicationCommandType } from 'discord-api-types/v10';
-export * from '@discordjs/formatters';
-import { JSONEncodable, Equatable } from '@discordjs/util';
-export * from '@discordjs/util';
-
-declare const fieldNamePredicate: _sapphire_shapeshift.StringValidator;
-declare const fieldValuePredicate: _sapphire_shapeshift.StringValidator;
-declare const fieldInlinePredicate: _sapphire_shapeshift.UnionValidator;
-declare const embedFieldPredicate: _sapphire_shapeshift.ObjectValidator<{
- name: string;
- value: string;
- inline: boolean | undefined;
-}, _sapphire_shapeshift.UndefinedToOptional<{
- name: string;
- value: string;
- inline: boolean | undefined;
-}>>;
-declare const embedFieldsArrayPredicate: _sapphire_shapeshift.ArrayValidator<_sapphire_shapeshift.UndefinedToOptional<{
- name: string;
- value: string;
- inline: boolean | undefined;
-}>[], _sapphire_shapeshift.UndefinedToOptional<{
- name: string;
- value: string;
- inline: boolean | undefined;
-}>>;
-declare const fieldLengthPredicate: _sapphire_shapeshift.NumberValidator;
-declare function validateFieldLength(amountAdding: number, fields?: APIEmbedField[]): void;
-declare const authorNamePredicate: _sapphire_shapeshift.UnionValidator;
-declare const imageURLPredicate: _sapphire_shapeshift.UnionValidator;
-declare const urlPredicate: _sapphire_shapeshift.UnionValidator;
-declare const embedAuthorPredicate: _sapphire_shapeshift.ObjectValidator<{
- name: string | null;
- iconURL: string | null | undefined;
- url: string | null | undefined;
-}, _sapphire_shapeshift.UndefinedToOptional<{
- name: string | null;
- iconURL: string | null | undefined;
- url: string | null | undefined;
-}>>;
-declare const RGBPredicate: _sapphire_shapeshift.NumberValidator;
-declare const colorPredicate: _sapphire_shapeshift.UnionValidator;
-declare const descriptionPredicate: _sapphire_shapeshift.UnionValidator;
-declare const footerTextPredicate: _sapphire_shapeshift.UnionValidator;
-declare const embedFooterPredicate: _sapphire_shapeshift.ObjectValidator<{
- text: string | null;
- iconURL: string | null | undefined;
-}, _sapphire_shapeshift.UndefinedToOptional<{
- text: string | null;
- iconURL: string | null | undefined;
-}>>;
-declare const timestampPredicate: _sapphire_shapeshift.UnionValidator;
-declare const titlePredicate: _sapphire_shapeshift.UnionValidator;
-
-declare const Assertions$5_RGBPredicate: typeof RGBPredicate;
-declare const Assertions$5_authorNamePredicate: typeof authorNamePredicate;
-declare const Assertions$5_colorPredicate: typeof colorPredicate;
-declare const Assertions$5_descriptionPredicate: typeof descriptionPredicate;
-declare const Assertions$5_embedAuthorPredicate: typeof embedAuthorPredicate;
-declare const Assertions$5_embedFieldPredicate: typeof embedFieldPredicate;
-declare const Assertions$5_embedFieldsArrayPredicate: typeof embedFieldsArrayPredicate;
-declare const Assertions$5_embedFooterPredicate: typeof embedFooterPredicate;
-declare const Assertions$5_fieldInlinePredicate: typeof fieldInlinePredicate;
-declare const Assertions$5_fieldLengthPredicate: typeof fieldLengthPredicate;
-declare const Assertions$5_fieldNamePredicate: typeof fieldNamePredicate;
-declare const Assertions$5_fieldValuePredicate: typeof fieldValuePredicate;
-declare const Assertions$5_footerTextPredicate: typeof footerTextPredicate;
-declare const Assertions$5_imageURLPredicate: typeof imageURLPredicate;
-declare const Assertions$5_timestampPredicate: typeof timestampPredicate;
-declare const Assertions$5_titlePredicate: typeof titlePredicate;
-declare const Assertions$5_urlPredicate: typeof urlPredicate;
-declare const Assertions$5_validateFieldLength: typeof validateFieldLength;
-declare namespace Assertions$5 {
- export {
- Assertions$5_RGBPredicate as RGBPredicate,
- Assertions$5_authorNamePredicate as authorNamePredicate,
- Assertions$5_colorPredicate as colorPredicate,
- Assertions$5_descriptionPredicate as descriptionPredicate,
- Assertions$5_embedAuthorPredicate as embedAuthorPredicate,
- Assertions$5_embedFieldPredicate as embedFieldPredicate,
- Assertions$5_embedFieldsArrayPredicate as embedFieldsArrayPredicate,
- Assertions$5_embedFooterPredicate as embedFooterPredicate,
- Assertions$5_fieldInlinePredicate as fieldInlinePredicate,
- Assertions$5_fieldLengthPredicate as fieldLengthPredicate,
- Assertions$5_fieldNamePredicate as fieldNamePredicate,
- Assertions$5_fieldValuePredicate as fieldValuePredicate,
- Assertions$5_footerTextPredicate as footerTextPredicate,
- Assertions$5_imageURLPredicate as imageURLPredicate,
- Assertions$5_timestampPredicate as timestampPredicate,
- Assertions$5_titlePredicate as titlePredicate,
- Assertions$5_urlPredicate as urlPredicate,
- Assertions$5_validateFieldLength as validateFieldLength,
- };
-}
-
-declare function normalizeArray(arr: RestOrArray): T[];
-type RestOrArray = T[] | [T[]];
-
-type RGBTuple = [red: number, green: number, blue: number];
-interface IconData {
- /**
- * The URL of the icon
- */
- iconURL?: string;
- /**
- * The proxy URL of the icon
- */
- proxyIconURL?: string;
-}
-type EmbedAuthorData = IconData & Omit;
-type EmbedAuthorOptions = Omit;
-type EmbedFooterData = IconData & Omit;
-type EmbedFooterOptions = Omit;
-interface EmbedImageData extends Omit {
- /**
- * The proxy URL for the image
- */
- proxyURL?: string;
-}
-/**
- * Represents a embed in a message (image/video preview, rich embed, etc.)
- */
-declare class EmbedBuilder {
- readonly data: APIEmbed;
- constructor(data?: APIEmbed);
- /**
- * Appends fields to the embed
- *
- * @remarks
- * This method accepts either an array of fields or a variable number of field parameters.
- * The maximum amount of fields that can be added is 25.
- * @example
- * Using an array
- * ```ts
- * const fields: APIEmbedField[] = ...;
- * const embed = new EmbedBuilder()
- * .addFields(fields);
- * ```
- * @example
- * Using rest parameters (variadic)
- * ```ts
- * const embed = new EmbedBuilder()
- * .addFields(
- * { name: 'Field 1', value: 'Value 1' },
- * { name: 'Field 2', value: 'Value 2' },
- * );
- * ```
- * @param fields - The fields to add
- */
- addFields(...fields: RestOrArray): this;
- /**
- * Removes, replaces, or inserts fields in the embed.
- *
- * @remarks
- * This method behaves similarly
- * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice}.
- * The maximum amount of fields that can be added is 25.
- *
- * It's useful for modifying and adjusting order of the already-existing fields of an embed.
- * @example
- * Remove the first field
- * ```ts
- * embed.spliceFields(0, 1);
- * ```
- * @example
- * Remove the first n fields
- * ```ts
- * const n = 4
- * embed.spliceFields(0, n);
- * ```
- * @example
- * Remove the last field
- * ```ts
- * embed.spliceFields(-1, 1);
- * ```
- * @param index - The index to start at
- * @param deleteCount - The number of fields to remove
- * @param fields - The replacing field objects
- */
- spliceFields(index: number, deleteCount: number, ...fields: APIEmbedField[]): this;
- /**
- * Sets the embed's fields
- *
- * @remarks
- * This method is an alias for {@link EmbedBuilder.spliceFields}. More specifically,
- * it splices the entire array of fields, replacing them with the provided fields.
- *
- * You can set a maximum of 25 fields.
- * @param fields - The fields to set
- */
- setFields(...fields: RestOrArray): this;
- /**
- * Sets the author of this embed
- *
- * @param options - The options for the author
- */
- setAuthor(options: EmbedAuthorOptions | null): this;
- /**
- * Sets the color of this embed
- *
- * @param color - The color of the embed
- */
- setColor(color: RGBTuple | number | null): this;
- /**
- * Sets the description of this embed
- *
- * @param description - The description
- */
- setDescription(description: string | null): this;
- /**
- * Sets the footer of this embed
- *
- * @param options - The options for the footer
- */
- setFooter(options: EmbedFooterOptions | null): this;
- /**
- * Sets the image of this embed
- *
- * @param url - The URL of the image
- */
- setImage(url: string | null): this;
- /**
- * Sets the thumbnail of this embed
- *
- * @param url - The URL of the thumbnail
- */
- setThumbnail(url: string | null): this;
- /**
- * Sets the timestamp of this embed
- *
- * @param timestamp - The timestamp or date
- */
- setTimestamp(timestamp?: Date | number | null): this;
- /**
- * Sets the title of this embed
- *
- * @param title - The title
- */
- setTitle(title: string | null): this;
- /**
- * Sets the URL of this embed
- *
- * @param url - The URL
- */
- setURL(url: string | null): this;
- /**
- * Transforms the embed to a plain object
- */
- toJSON(): APIEmbed;
-}
-
-/**
- * Represents an option within a string select menu component
- */
-declare class StringSelectMenuOptionBuilder implements JSONEncodable {
- data: Partial;
- /**
- * Creates a new string select menu option from API data
- *
- * @param data - The API data to create this string select menu option with
- * @example
- * Creating a string select menu option from an API data object
- * ```ts
- * const selectMenuOption = new SelectMenuOptionBuilder({
- * label: 'catchy label',
- * value: '1',
- * });
- * ```
- * @example
- * Creating a string select menu option using setters and API data
- * ```ts
- * const selectMenuOption = new SelectMenuOptionBuilder({
- * default: true,
- * value: '1',
- * })
- * .setLabel('woah')
- * ```
- */
- constructor(data?: Partial);
- /**
- * Sets the label of this option
- *
- * @param label - The label to show on this option
- */
- setLabel(label: string): this;
- /**
- * Sets the value of this option
- *
- * @param value - The value of this option
- */
- setValue(value: string): this;
- /**
- * Sets the description of this option
- *
- * @param description - The description of this option
- */
- setDescription(description: string): this;
- /**
- * Sets whether this option is selected by default
- *
- * @param isDefault - Whether this option is selected by default
- */
- setDefault(isDefault?: boolean): this;
- /**
- * Sets the emoji to display on this option
- *
- * @param emoji - The emoji to display on this option
- */
- setEmoji(emoji: APIMessageComponentEmoji): this;
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON(): APISelectMenuOption;
-}
-
-declare const customIdValidator: _sapphire_shapeshift.StringValidator;
-declare const emojiValidator: _sapphire_shapeshift.ObjectValidator<{
- name?: string | undefined;
- id?: string | undefined;
- animated?: boolean | undefined;
-}, _sapphire_shapeshift.UndefinedToOptional<{
- name?: string | undefined;
- id?: string | undefined;
- animated?: boolean | undefined;
-}>>;
-declare const disabledValidator: _sapphire_shapeshift.BooleanValidator;
-declare const buttonLabelValidator: _sapphire_shapeshift.StringValidator;
-declare const buttonStyleValidator: _sapphire_shapeshift.NativeEnumValidator;
-declare const placeholderValidator$1: _sapphire_shapeshift.StringValidator;
-declare const minMaxValidator: _sapphire_shapeshift.NumberValidator;
-declare const labelValueDescriptionValidator: _sapphire_shapeshift.StringValidator;
-declare const jsonOptionValidator: _sapphire_shapeshift.ObjectValidator<{
- label: string;
- value: string;
- description: string | undefined;
- emoji: _sapphire_shapeshift.UndefinedToOptional<{
- name?: string | undefined;
- id?: string | undefined;
- animated?: boolean | undefined;
- }> | undefined;
- default: boolean | undefined;
-}, _sapphire_shapeshift.UndefinedToOptional<{
- label: string;
- value: string;
- description: string | undefined;
- emoji: _sapphire_shapeshift.UndefinedToOptional<{
- name?: string | undefined;
- id?: string | undefined;
- animated?: boolean | undefined;
- }> | undefined;
- default: boolean | undefined;
-}>>;
-declare const optionValidator: _sapphire_shapeshift.InstanceValidator;
-declare const optionsValidator: _sapphire_shapeshift.ArrayValidator;
-declare const optionsLengthValidator: _sapphire_shapeshift.NumberValidator;
-declare function validateRequiredSelectMenuParameters(options: StringSelectMenuOptionBuilder[], customId?: string): void;
-declare const defaultValidator: _sapphire_shapeshift.BooleanValidator;
-declare function validateRequiredSelectMenuOptionParameters(label?: string, value?: string): void;
-declare const channelTypesValidator: _sapphire_shapeshift.ArrayValidator;
-declare const urlValidator: _sapphire_shapeshift.StringValidator;
-declare function validateRequiredButtonParameters(style?: ButtonStyle, label?: string, emoji?: APIMessageComponentEmoji, customId?: string, url?: string): void;
-
-declare const Assertions$4_buttonLabelValidator: typeof buttonLabelValidator;
-declare const Assertions$4_buttonStyleValidator: typeof buttonStyleValidator;
-declare const Assertions$4_channelTypesValidator: typeof channelTypesValidator;
-declare const Assertions$4_customIdValidator: typeof customIdValidator;
-declare const Assertions$4_defaultValidator: typeof defaultValidator;
-declare const Assertions$4_disabledValidator: typeof disabledValidator;
-declare const Assertions$4_emojiValidator: typeof emojiValidator;
-declare const Assertions$4_jsonOptionValidator: typeof jsonOptionValidator;
-declare const Assertions$4_labelValueDescriptionValidator: typeof labelValueDescriptionValidator;
-declare const Assertions$4_minMaxValidator: typeof minMaxValidator;
-declare const Assertions$4_optionValidator: typeof optionValidator;
-declare const Assertions$4_optionsLengthValidator: typeof optionsLengthValidator;
-declare const Assertions$4_optionsValidator: typeof optionsValidator;
-declare const Assertions$4_urlValidator: typeof urlValidator;
-declare const Assertions$4_validateRequiredButtonParameters: typeof validateRequiredButtonParameters;
-declare const Assertions$4_validateRequiredSelectMenuOptionParameters: typeof validateRequiredSelectMenuOptionParameters;
-declare const Assertions$4_validateRequiredSelectMenuParameters: typeof validateRequiredSelectMenuParameters;
-declare namespace Assertions$4 {
- export {
- Assertions$4_buttonLabelValidator as buttonLabelValidator,
- Assertions$4_buttonStyleValidator as buttonStyleValidator,
- Assertions$4_channelTypesValidator as channelTypesValidator,
- Assertions$4_customIdValidator as customIdValidator,
- Assertions$4_defaultValidator as defaultValidator,
- Assertions$4_disabledValidator as disabledValidator,
- Assertions$4_emojiValidator as emojiValidator,
- Assertions$4_jsonOptionValidator as jsonOptionValidator,
- Assertions$4_labelValueDescriptionValidator as labelValueDescriptionValidator,
- Assertions$4_minMaxValidator as minMaxValidator,
- Assertions$4_optionValidator as optionValidator,
- Assertions$4_optionsLengthValidator as optionsLengthValidator,
- Assertions$4_optionsValidator as optionsValidator,
- placeholderValidator$1 as placeholderValidator,
- Assertions$4_urlValidator as urlValidator,
- Assertions$4_validateRequiredButtonParameters as validateRequiredButtonParameters,
- Assertions$4_validateRequiredSelectMenuOptionParameters as validateRequiredSelectMenuOptionParameters,
- Assertions$4_validateRequiredSelectMenuParameters as validateRequiredSelectMenuParameters,
- };
-}
-
-type AnyAPIActionRowComponent = APIActionRowComponent | APIActionRowComponentTypes;
-/**
- * Represents a discord component
- *
- * @typeParam DataType - The type of internal API data that is stored within the component
- */
-declare abstract class ComponentBuilder> = APIBaseComponent> implements JSONEncodable {
- /**
- * The API data associated with this component
- */
- readonly data: Partial;
- /**
- * Serializes this component to an API-compatible JSON object
- *
- * @remarks
- * This method runs validations on the data before serializing it.
- * As such, it may throw an error if the data is invalid.
- */
- abstract toJSON(): AnyAPIActionRowComponent;
- constructor(data: Partial);
-}
-
-/**
- * Represents a button component
- */
-declare class ButtonBuilder extends ComponentBuilder {
- /**
- * Creates a new button from API data
- *
- * @param data - The API data to create this button with
- * @example
- * Creating a button from an API data object
- * ```ts
- * const button = new ButtonBuilder({
- * custom_id: 'a cool button',
- * style: ButtonStyle.Primary,
- * label: 'Click Me',
- * emoji: {
- * name: 'smile',
- * id: '123456789012345678',
- * },
- * });
- * ```
- * @example
- * Creating a button using setters and API data
- * ```ts
- * const button = new ButtonBuilder({
- * style: ButtonStyle.Secondary,
- * label: 'Click Me',
- * })
- * .setEmoji({ name: '🙂' })
- * .setCustomId('another cool button');
- * ```
- */
- constructor(data?: Partial);
- /**
- * Sets the style of this button
- *
- * @param style - The style of the button
- */
- setStyle(style: ButtonStyle): this;
- /**
- * Sets the URL for this button
- *
- * @remarks
- * This method is only available to buttons using the `Link` button style.
- * Only three types of URL schemes are currently supported: `https://`, `http://` and `discord://`
- * @param url - The URL to open when this button is clicked
- */
- setURL(url: string): this;
- /**
- * Sets the custom id for this button
- *
- * @remarks
- * This method is only applicable to buttons that are not using the `Link` button style.
- * @param customId - The custom id to use for this button
- */
- setCustomId(customId: string): this;
- /**
- * Sets the emoji to display on this button
- *
- * @param emoji - The emoji to display on this button
- */
- setEmoji(emoji: APIMessageComponentEmoji): this;
- /**
- * Sets whether this button is disabled
- *
- * @param disabled - Whether to disable this button
- */
- setDisabled(disabled?: boolean): this;
- /**
- * Sets the label for this button
- *
- * @param label - The label to display on this button
- */
- setLabel(label: string): this;
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON(): APIButtonComponent;
-}
-
-declare class BaseSelectMenuBuilder extends ComponentBuilder {
- /**
- * Sets the placeholder for this select menu
- *
- * @param placeholder - The placeholder to use for this select menu
- */
- setPlaceholder(placeholder: string): this;
- /**
- * Sets the minimum values that must be selected in the select menu
- *
- * @param minValues - The minimum values that must be selected
- */
- setMinValues(minValues: number): this;
- /**
- * Sets the maximum values that must be selected in the select menu
- *
- * @param maxValues - The maximum values that must be selected
- */
- setMaxValues(maxValues: number): this;
- /**
- * Sets the custom id for this select menu
- *
- * @param customId - The custom id to use for this select menu
- */
- setCustomId(customId: string): this;
- /**
- * Sets whether this select menu is disabled
- *
- * @param disabled - Whether this select menu is disabled
- */
- setDisabled(disabled?: boolean): this;
- toJSON(): SelectMenuType;
-}
-
-declare class ChannelSelectMenuBuilder extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object
- * ```ts
- * const selectMenu = new ChannelSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data
- * ```ts
- * const selectMenu = new ChannelSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .addChannelTypes(ChannelType.GuildText, ChannelType.GuildAnnouncement)
- * .setMinValues(2)
- * ```
- */
- constructor(data?: Partial);
- addChannelTypes(...types: RestOrArray): this;
- setChannelTypes(...types: RestOrArray): this;
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON(): APIChannelSelectComponent;
-}
-
-declare class MentionableSelectMenuBuilder extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object
- * ```ts
- * const selectMenu = new MentionableSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data
- * ```ts
- * const selectMenu = new MentionableSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .setMinValues(1)
- * ```
- */
- constructor(data?: Partial);
-}
-
-declare class RoleSelectMenuBuilder extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object
- * ```ts
- * const selectMenu = new RoleSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data
- * ```ts
- * const selectMenu = new RoleSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .setMinValues(1)
- * ```
- */
- constructor(data?: Partial);
-}
-
-/**
- * Represents a string select menu component
- */
-declare class StringSelectMenuBuilder extends BaseSelectMenuBuilder {
- /**
- * The options within this select menu
- */
- readonly options: StringSelectMenuOptionBuilder[];
- /**
- * Creates a new select menu from API data
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object
- * ```ts
- * const selectMenu = new StringSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * options: [
- * { label: 'option 1', value: '1' },
- * { label: 'option 2', value: '2' },
- * { label: 'option 3', value: '3' },
- * ],
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data
- * ```ts
- * const selectMenu = new StringSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .setMinValues(1)
- * .addOptions({
- * label: 'Catchy',
- * value: 'catch',
- * });
- * ```
- */
- constructor(data?: Partial);
- /**
- * Adds options to this select menu
- *
- * @param options - The options to add to this select menu
- * @returns
- */
- addOptions(...options: RestOrArray): this;
- /**
- * Sets the options on this select menu
- *
- * @param options - The options to set on this select menu
- */
- setOptions(...options: RestOrArray): this;
- /**
- * Removes, replaces, or inserts options in the string select menu.
- *
- * @remarks
- * This method behaves similarly
- * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice | Array.prototype.splice}.
- *
- * It's useful for modifying and adjusting order of the already-existing options of a string select menu.
- * @example
- * Remove the first option
- * ```ts
- * selectMenu.spliceOptions(0, 1);
- * ```
- * @example
- * Remove the first n option
- * ```ts
- * const n = 4
- * selectMenu.spliceOptions(0, n);
- * ```
- * @example
- * Remove the last option
- * ```ts
- * selectMenu.spliceOptions(-1, 1);
- * ```
- * @param index - The index to start at
- * @param deleteCount - The number of options to remove
- * @param options - The replacing option objects or builders
- */
- spliceOptions(index: number, deleteCount: number, ...options: RestOrArray): this;
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON(): APIStringSelectComponent;
-}
-
-declare class UserSelectMenuBuilder extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object
- * ```ts
- * const selectMenu = new UserSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data
- * ```ts
- * const selectMenu = new UserSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .setMinValues(1)
- * ```
- */
- constructor(data?: Partial);
-}
-
-declare class TextInputBuilder extends ComponentBuilder implements Equatable> {
- /**
- * Creates a new text input from API data
- *
- * @param data - The API data to create this text input with
- * @example
- * Creating a select menu option from an API data object
- * ```ts
- * const textInput = new TextInputBuilder({
- * custom_id: 'a cool select menu',
- * label: 'Type something',
- * style: TextInputStyle.Short,
- * });
- * ```
- * @example
- * Creating a select menu option using setters and API data
- * ```ts
- * const textInput = new TextInputBuilder({
- * label: 'Type something else',
- * })
- * .setCustomId('woah')
- * .setStyle(TextInputStyle.Paragraph);
- * ```
- */
- constructor(data?: APITextInputComponent & {
- type?: ComponentType.TextInput;
- });
- /**
- * Sets the custom id for this text input
- *
- * @param customId - The custom id of this text input
- */
- setCustomId(customId: string): this;
- /**
- * Sets the label for this text input
- *
- * @param label - The label for this text input
- */
- setLabel(label: string): this;
- /**
- * Sets the style for this text input
- *
- * @param style - The style for this text input
- */
- setStyle(style: TextInputStyle): this;
- /**
- * Sets the minimum length of text for this text input
- *
- * @param minLength - The minimum length of text for this text input
- */
- setMinLength(minLength: number): this;
- /**
- * Sets the maximum length of text for this text input
- *
- * @param maxLength - The maximum length of text for this text input
- */
- setMaxLength(maxLength: number): this;
- /**
- * Sets the placeholder of this text input
- *
- * @param placeholder - The placeholder of this text input
- */
- setPlaceholder(placeholder: string): this;
- /**
- * Sets the value of this text input
- *
- * @param value - The value for this text input
- */
- setValue(value: string): this;
- /**
- * Sets whether this text input is required
- *
- * @param required - Whether this text input is required
- */
- setRequired(required?: boolean): this;
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON(): APITextInputComponent;
- /**
- * {@inheritDoc Equatable.equals}
- */
- equals(other: APITextInputComponent | JSONEncodable): boolean;
-}
-
-type MessageComponentBuilder = ActionRowBuilder | MessageActionRowComponentBuilder;
-type ModalComponentBuilder = ActionRowBuilder | ModalActionRowComponentBuilder;
-type MessageActionRowComponentBuilder = ButtonBuilder | ChannelSelectMenuBuilder | MentionableSelectMenuBuilder | RoleSelectMenuBuilder | StringSelectMenuBuilder | UserSelectMenuBuilder;
-type ModalActionRowComponentBuilder = TextInputBuilder;
-type AnyComponentBuilder = MessageActionRowComponentBuilder | ModalActionRowComponentBuilder;
-/**
- * Represents an action row component
- *
- * @typeParam T - The types of components this action row holds
- */
-declare class ActionRowBuilder extends ComponentBuilder> {
- /**
- * The components within this action row
- */
- readonly components: T[];
- /**
- * Creates a new action row from API data
- *
- * @param data - The API data to create this action row with
- * @example
- * Creating an action row from an API data object
- * ```ts
- * const actionRow = new ActionRowBuilder({
- * components: [
- * {
- * custom_id: "custom id",
- * label: "Type something",
- * style: TextInputStyle.Short,
- * type: ComponentType.TextInput,
- * },
- * ],
- * });
- * ```
- * @example
- * Creating an action row using setters and API data
- * ```ts
- * const actionRow = new ActionRowBuilder({
- * components: [
- * {
- * custom_id: "custom id",
- * label: "Click me",
- * style: ButtonStyle.Primary,
- * type: ComponentType.Button,
- * },
- * ],
- * })
- * .addComponents(button2, button3);
- * ```
- */
- constructor({ components, ...data }?: Partial>);
- /**
- * Adds components to this action row.
- *
- * @param components - The components to add to this action row.
- */
- addComponents(...components: RestOrArray): this;
- /**
- * Sets the components in this action row
- *
- * @param components - The components to set this row to
- */
- setComponents(...components: RestOrArray): this;
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON(): APIActionRowComponent>;
-}
-
-interface MappedComponentTypes {
- [ComponentType.ActionRow]: ActionRowBuilder;
- [ComponentType.Button]: ButtonBuilder;
- [ComponentType.StringSelect]: StringSelectMenuBuilder;
- [ComponentType.TextInput]: TextInputBuilder;
- [ComponentType.UserSelect]: UserSelectMenuBuilder;
- [ComponentType.RoleSelect]: RoleSelectMenuBuilder;
- [ComponentType.MentionableSelect]: MentionableSelectMenuBuilder;
- [ComponentType.ChannelSelect]: ChannelSelectMenuBuilder;
-}
-/**
- * Factory for creating components from API data
- *
- * @param data - The api data to transform to a component class
- */
-declare function createComponentBuilder(data: (APIModalComponent | APIMessageComponent) & {
- type: T;
-}): MappedComponentTypes[T];
-declare function createComponentBuilder(data: C): C;
-
-declare const textInputStyleValidator: _sapphire_shapeshift.NativeEnumValidator;
-declare const minLengthValidator: _sapphire_shapeshift.NumberValidator;
-declare const maxLengthValidator: _sapphire_shapeshift.NumberValidator;
-declare const requiredValidator: _sapphire_shapeshift.BooleanValidator;
-declare const valueValidator: _sapphire_shapeshift.StringValidator;
-declare const placeholderValidator: _sapphire_shapeshift.StringValidator;
-declare const labelValidator: _sapphire_shapeshift.StringValidator;
-declare function validateRequiredParameters$3(customId?: string, style?: TextInputStyle, label?: string): void;
-
-declare const Assertions$3_labelValidator: typeof labelValidator;
-declare const Assertions$3_maxLengthValidator: typeof maxLengthValidator;
-declare const Assertions$3_minLengthValidator: typeof minLengthValidator;
-declare const Assertions$3_placeholderValidator: typeof placeholderValidator;
-declare const Assertions$3_requiredValidator: typeof requiredValidator;
-declare const Assertions$3_textInputStyleValidator: typeof textInputStyleValidator;
-declare const Assertions$3_valueValidator: typeof valueValidator;
-declare namespace Assertions$3 {
- export {
- Assertions$3_labelValidator as labelValidator,
- Assertions$3_maxLengthValidator as maxLengthValidator,
- Assertions$3_minLengthValidator as minLengthValidator,
- Assertions$3_placeholderValidator as placeholderValidator,
- Assertions$3_requiredValidator as requiredValidator,
- Assertions$3_textInputStyleValidator as textInputStyleValidator,
- validateRequiredParameters$3 as validateRequiredParameters,
- Assertions$3_valueValidator as valueValidator,
- };
-}
-
-declare class ModalBuilder implements JSONEncodable {
- readonly data: Partial;
- readonly components: ActionRowBuilder[];
- constructor({ components, ...data }?: Partial);
- /**
- * Sets the title of the modal
- *
- * @param title - The title of the modal
- */
- setTitle(title: string): this;
- /**
- * Sets the custom id of the modal
- *
- * @param customId - The custom id of this modal
- */
- setCustomId(customId: string): this;
- /**
- * Adds components to this modal
- *
- * @param components - The components to add to this modal
- */
- addComponents(...components: RestOrArray | APIActionRowComponent>): this;
- /**
- * Sets the components in this modal
- *
- * @param components - The components to set this modal to
- */
- setComponents(...components: RestOrArray>): this;
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON(): APIModalInteractionResponseCallbackData;
-}
-
-declare const titleValidator: _sapphire_shapeshift.StringValidator;
-declare const componentsValidator: _sapphire_shapeshift.ArrayValidator<[ActionRowBuilder, ...ActionRowBuilder[]], ActionRowBuilder>;
-declare function validateRequiredParameters$2(customId?: string, title?: string, components?: ActionRowBuilder[]): void;
-
-declare const Assertions$2_componentsValidator: typeof componentsValidator;
-declare const Assertions$2_titleValidator: typeof titleValidator;
-declare namespace Assertions$2 {
- export {
- Assertions$2_componentsValidator as componentsValidator,
- Assertions$2_titleValidator as titleValidator,
- validateRequiredParameters$2 as validateRequiredParameters,
- };
-}
-
-declare class SharedNameAndDescription {
- readonly name: string;
- readonly name_localizations?: LocalizationMap;
- readonly description: string;
- readonly description_localizations?: LocalizationMap;
- /**
- * Sets the name
- *
- * @param name - The name
- */
- setName(name: string): this;
- /**
- * Sets the description
- *
- * @param description - The description
- */
- setDescription(description: string): this;
- /**
- * Sets a name localization
- *
- * @param locale - The locale to set a description for
- * @param localizedName - The localized description for the given locale
- */
- setNameLocalization(locale: LocaleString, localizedName: string | null): this;
- /**
- * Sets the name localizations
- *
- * @param localizedNames - The dictionary of localized descriptions to set
- */
- setNameLocalizations(localizedNames: LocalizationMap | null): this;
- /**
- * Sets a description localization
- *
- * @param locale - The locale to set a description for
- * @param localizedDescription - The localized description for the given locale
- */
- setDescriptionLocalization(locale: LocaleString, localizedDescription: string | null): this;
- /**
- * Sets the description localizations
- *
- * @param localizedDescriptions - The dictionary of localized descriptions to set
- */
- setDescriptionLocalizations(localizedDescriptions: LocalizationMap | null): this;
-}
-
-declare abstract class ApplicationCommandOptionBase extends SharedNameAndDescription {
- abstract readonly type: ApplicationCommandOptionType;
- readonly required: boolean;
- /**
- * Marks the option as required
- *
- * @param required - If this option should be required
- */
- setRequired(required: boolean): this;
- abstract toJSON(): APIApplicationCommandBasicOption;
- protected runRequiredValidations(): void;
-}
-
-declare class SlashCommandAttachmentOption extends ApplicationCommandOptionBase {
- readonly type: ApplicationCommandOptionType.Attachment;
- toJSON(): APIApplicationCommandAttachmentOption;
-}
-
-declare class SlashCommandBooleanOption extends ApplicationCommandOptionBase {
- readonly type: ApplicationCommandOptionType.Boolean;
- toJSON(): APIApplicationCommandBooleanOption;
-}
-
-declare const allowedChannelTypes: readonly [ChannelType.GuildText, ChannelType.GuildVoice, ChannelType.GuildCategory, ChannelType.GuildAnnouncement, ChannelType.AnnouncementThread, ChannelType.PublicThread, ChannelType.PrivateThread, ChannelType.GuildStageVoice, ChannelType.GuildForum];
-type ApplicationCommandOptionAllowedChannelTypes = (typeof allowedChannelTypes)[number];
-declare class ApplicationCommandOptionChannelTypesMixin {
- readonly channel_types?: ApplicationCommandOptionAllowedChannelTypes[];
- /**
- * Adds channel types to this option
- *
- * @param channelTypes - The channel types to add
- */
- addChannelTypes(...channelTypes: ApplicationCommandOptionAllowedChannelTypes[]): this;
-}
-
-declare class SlashCommandChannelOption extends ApplicationCommandOptionBase {
- readonly type: ApplicationCommandOptionType.Channel;
- toJSON(): APIApplicationCommandChannelOption;
-}
-interface SlashCommandChannelOption extends ApplicationCommandOptionChannelTypesMixin {
-}
-
-declare abstract class ApplicationCommandNumericOptionMinMaxValueMixin {
- readonly max_value?: number;
- readonly min_value?: number;
- /**
- * Sets the maximum number value of this option
- *
- * @param max - The maximum value this option can be
- */
- abstract setMaxValue(max: number): this;
- /**
- * Sets the minimum number value of this option
- *
- * @param min - The minimum value this option can be
- */
- abstract setMinValue(min: number): this;
-}
-
-declare class ApplicationCommandOptionWithChoicesAndAutocompleteMixin {
- readonly choices?: APIApplicationCommandOptionChoice[];
- readonly autocomplete?: boolean;
- readonly type: ApplicationCommandOptionType;
- /**
- * Adds multiple choices for this option
- *
- * @param choices - The choices to add
- */
- addChoices(...choices: APIApplicationCommandOptionChoice[]): this;
- setChoices[]>(...choices: Input): this;
- /**
- * Marks the option as autocompletable
- *
- * @param autocomplete - If this option should be autocompletable
- */
- setAutocomplete(autocomplete: boolean): this;
-}
-
-declare class SlashCommandIntegerOption extends ApplicationCommandOptionBase implements ApplicationCommandNumericOptionMinMaxValueMixin {
- readonly type: ApplicationCommandOptionType.Integer;
- /**
- * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue}
- */
- setMaxValue(max: number): this;
- /**
- * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue}
- */
- setMinValue(min: number): this;
- toJSON(): APIApplicationCommandIntegerOption;
-}
-interface SlashCommandIntegerOption extends ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionWithChoicesAndAutocompleteMixin {
-}
-
-declare class SlashCommandMentionableOption extends ApplicationCommandOptionBase {
- readonly type: ApplicationCommandOptionType.Mentionable;
- toJSON(): APIApplicationCommandMentionableOption;
-}
-
-declare class SlashCommandNumberOption extends ApplicationCommandOptionBase implements ApplicationCommandNumericOptionMinMaxValueMixin {
- readonly type: ApplicationCommandOptionType.Number;
- /**
- * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue}
- */
- setMaxValue(max: number): this;
- /**
- * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue}
- */
- setMinValue(min: number): this;
- toJSON(): APIApplicationCommandNumberOption;
-}
-interface SlashCommandNumberOption extends ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionWithChoicesAndAutocompleteMixin {
-}
-
-declare class SlashCommandRoleOption extends ApplicationCommandOptionBase {
- readonly type: ApplicationCommandOptionType.Role;
- toJSON(): APIApplicationCommandRoleOption;
-}
-
-declare class SlashCommandStringOption extends ApplicationCommandOptionBase {
- readonly type: ApplicationCommandOptionType.String;
- readonly max_length?: number;
- readonly min_length?: number;
- /**
- * Sets the maximum length of this string option.
- *
- * @param max - The maximum length this option can be
- */
- setMaxLength(max: number): this;
- /**
- * Sets the minimum length of this string option.
- *
- * @param min - The minimum length this option can be
- */
- setMinLength(min: number): this;
- toJSON(): APIApplicationCommandStringOption;
-}
-interface SlashCommandStringOption extends ApplicationCommandOptionWithChoicesAndAutocompleteMixin {
-}
-
-declare class SlashCommandUserOption extends ApplicationCommandOptionBase {
- readonly type: ApplicationCommandOptionType.User;
- toJSON(): APIApplicationCommandUserOption;
-}
-
-declare class SharedSlashCommandOptions {
- readonly options: ToAPIApplicationCommandOptions[];
- /**
- * Adds a boolean option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addBooleanOption(input: SlashCommandBooleanOption | ((builder: SlashCommandBooleanOption) => SlashCommandBooleanOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
- /**
- * Adds a user option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addUserOption(input: SlashCommandUserOption | ((builder: SlashCommandUserOption) => SlashCommandUserOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
- /**
- * Adds a channel option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addChannelOption(input: SlashCommandChannelOption | ((builder: SlashCommandChannelOption) => SlashCommandChannelOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
- /**
- * Adds a role option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addRoleOption(input: SlashCommandRoleOption | ((builder: SlashCommandRoleOption) => SlashCommandRoleOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
- /**
- * Adds an attachment option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addAttachmentOption(input: SlashCommandAttachmentOption | ((builder: SlashCommandAttachmentOption) => SlashCommandAttachmentOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
- /**
- * Adds a mentionable option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addMentionableOption(input: SlashCommandMentionableOption | ((builder: SlashCommandMentionableOption) => SlashCommandMentionableOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
- /**
- * Adds a string option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addStringOption(input: Omit | Omit | SlashCommandStringOption | ((builder: SlashCommandStringOption) => Omit | Omit | SlashCommandStringOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
- /**
- * Adds an integer option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addIntegerOption(input: Omit | Omit | SlashCommandIntegerOption | ((builder: SlashCommandIntegerOption) => Omit | Omit | SlashCommandIntegerOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
- /**
- * Adds a number option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addNumberOption(input: Omit | Omit | SlashCommandNumberOption | ((builder: SlashCommandNumberOption) => Omit | Omit | SlashCommandNumberOption)): ShouldOmitSubcommandFunctions extends true ? Omit : this;
- private _sharedAddOptionMethod;
-}
-
-/**
- * Represents a folder for subcommands
- *
- * For more information, go to https://discord.com/developers/docs/interactions/application-commands#subcommands-and-subcommand-groups
- */
-declare class SlashCommandSubcommandGroupBuilder implements ToAPIApplicationCommandOptions {
- /**
- * The name of this subcommand group
- */
- readonly name: string;
- /**
- * The description of this subcommand group
- */
- readonly description: string;
- /**
- * The subcommands part of this subcommand group
- */
- readonly options: SlashCommandSubcommandBuilder[];
- /**
- * Adds a new subcommand to this group
- *
- * @param input - A function that returns a subcommand builder, or an already built builder
- */
- addSubcommand(input: SlashCommandSubcommandBuilder | ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder)): this;
- toJSON(): APIApplicationCommandSubcommandGroupOption;
-}
-interface SlashCommandSubcommandGroupBuilder extends SharedNameAndDescription {
-}
-/**
- * Represents a subcommand
- *
- * For more information, go to https://discord.com/developers/docs/interactions/application-commands#subcommands-and-subcommand-groups
- */
-declare class SlashCommandSubcommandBuilder implements ToAPIApplicationCommandOptions {
- /**
- * The name of this subcommand
- */
- readonly name: string;
- /**
- * The description of this subcommand
- */
- readonly description: string;
- /**
- * The options of this subcommand
- */
- readonly options: ApplicationCommandOptionBase[];
- toJSON(): APIApplicationCommandSubcommandOption;
-}
-interface SlashCommandSubcommandBuilder extends SharedNameAndDescription, SharedSlashCommandOptions {
-}
-
-declare class SlashCommandBuilder {
- /**
- * The name of this slash command
- */
- readonly name: string;
- /**
- * The localized names for this command
- */
- readonly name_localizations?: LocalizationMap;
- /**
- * The description of this slash command
- */
- readonly description: string;
- /**
- * The localized descriptions for this command
- */
- readonly description_localizations?: LocalizationMap;
- /**
- * The options of this slash command
- */
- readonly options: ToAPIApplicationCommandOptions[];
- /**
- * Whether the command is enabled by default when the app is added to a guild
- *
- * @deprecated This property is deprecated and will be removed in the future.
- * You should use {@link (SlashCommandBuilder:class).setDefaultMemberPermissions} or {@link (SlashCommandBuilder:class).setDMPermission} instead.
- */
- readonly default_permission: boolean | undefined;
- /**
- * Set of permissions represented as a bit set for the command
- */
- readonly default_member_permissions: Permissions | null | undefined;
- /**
- * Indicates whether the command is available in DMs with the application, only for globally-scoped commands.
- * By default, commands are visible.
- */
- readonly dm_permission: boolean | undefined;
- /**
- * Whether this command is NSFW
- */
- readonly nsfw: boolean | undefined;
- /**
- * Returns the final data that should be sent to Discord.
- *
- * @remarks
- * This method runs validations on the data before serializing it.
- * As such, it may throw an error if the data is invalid.
- */
- toJSON(): RESTPostAPIChatInputApplicationCommandsJSONBody;
- /**
- * Sets whether the command is enabled by default when the application is added to a guild.
- *
- * @remarks
- * If set to `false`, you will have to later `PUT` the permissions for this command.
- * @param value - Whether or not to enable this command by default
- * @see https://discord.com/developers/docs/interactions/application-commands#permissions
- * @deprecated Use {@link (SlashCommandBuilder:class).setDefaultMemberPermissions} or {@link (SlashCommandBuilder:class).setDMPermission} instead.
- */
- setDefaultPermission(value: boolean): this;
- /**
- * Sets the default permissions a member should have in order to run the command.
- *
- * @remarks
- * You can set this to `'0'` to disable the command by default.
- * @param permissions - The permissions bit field to set
- * @see https://discord.com/developers/docs/interactions/application-commands#permissions
- */
- setDefaultMemberPermissions(permissions: Permissions | bigint | number | null | undefined): this;
- /**
- * Sets if the command is available in DMs with the application, only for globally-scoped commands.
- * By default, commands are visible.
- *
- * @param enabled - If the command should be enabled in DMs
- * @see https://discord.com/developers/docs/interactions/application-commands#permissions
- */
- setDMPermission(enabled: boolean | null | undefined): this;
- /**
- * Sets whether this command is NSFW
- *
- * @param nsfw - Whether this command is NSFW
- */
- setNSFW(nsfw?: boolean): this;
- /**
- * Adds a new subcommand group to this command
- *
- * @param input - A function that returns a subcommand group builder, or an already built builder
- */
- addSubcommandGroup(input: SlashCommandSubcommandGroupBuilder | ((subcommandGroup: SlashCommandSubcommandGroupBuilder) => SlashCommandSubcommandGroupBuilder)): SlashCommandSubcommandsOnlyBuilder;
- /**
- * Adds a new subcommand to this command
- *
- * @param input - A function that returns a subcommand builder, or an already built builder
- */
- addSubcommand(input: SlashCommandSubcommandBuilder | ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder)): SlashCommandSubcommandsOnlyBuilder;
-}
-interface SlashCommandBuilder extends SharedNameAndDescription, SharedSlashCommandOptions {
-}
-interface SlashCommandSubcommandsOnlyBuilder extends Omit> {
-}
-interface SlashCommandOptionsOnlyBuilder extends SharedNameAndDescription, SharedSlashCommandOptions, Pick {
-}
-interface ToAPIApplicationCommandOptions {
- toJSON(): APIApplicationCommandOption;
-}
-
-declare function validateName$1(name: unknown): asserts name is string;
-declare function validateDescription(description: unknown): asserts description is string;
-declare function validateLocale(locale: unknown): Locale;
-declare function validateMaxOptionsLength(options: unknown): asserts options is ToAPIApplicationCommandOptions[];
-declare function validateRequiredParameters$1(name: string, description: string, options: ToAPIApplicationCommandOptions[]): void;
-declare function validateDefaultPermission$1(value: unknown): asserts value is boolean;
-declare function validateRequired(required: unknown): asserts required is boolean;
-declare function validateChoicesLength(amountAdding: number, choices?: APIApplicationCommandOptionChoice[]): void;
-declare function assertReturnOfBuilder(input: unknown, ExpectedInstanceOf: new () => T): asserts input is T;
-declare const localizationMapPredicate: _sapphire_shapeshift.UnionValidator<_sapphire_shapeshift.UndefinedToOptional>> | null | undefined>;
-declare function validateLocalizationMap(value: unknown): asserts value is LocalizationMap;
-declare function validateDMPermission$1(value: unknown): asserts value is boolean | null | undefined;
-declare function validateDefaultMemberPermissions$1(permissions: unknown): string | null | undefined;
-declare function validateNSFW(value: unknown): asserts value is boolean;
-
-declare const Assertions$1_assertReturnOfBuilder: typeof assertReturnOfBuilder;
-declare const Assertions$1_localizationMapPredicate: typeof localizationMapPredicate;
-declare const Assertions$1_validateChoicesLength: typeof validateChoicesLength;
-declare const Assertions$1_validateDescription: typeof validateDescription;
-declare const Assertions$1_validateLocale: typeof validateLocale;
-declare const Assertions$1_validateLocalizationMap: typeof validateLocalizationMap;
-declare const Assertions$1_validateMaxOptionsLength: typeof validateMaxOptionsLength;
-declare const Assertions$1_validateNSFW: typeof validateNSFW;
-declare const Assertions$1_validateRequired: typeof validateRequired;
-declare namespace Assertions$1 {
- export {
- Assertions$1_assertReturnOfBuilder as assertReturnOfBuilder,
- Assertions$1_localizationMapPredicate as localizationMapPredicate,
- Assertions$1_validateChoicesLength as validateChoicesLength,
- validateDMPermission$1 as validateDMPermission,
- validateDefaultMemberPermissions$1 as validateDefaultMemberPermissions,
- validateDefaultPermission$1 as validateDefaultPermission,
- Assertions$1_validateDescription as validateDescription,
- Assertions$1_validateLocale as validateLocale,
- Assertions$1_validateLocalizationMap as validateLocalizationMap,
- Assertions$1_validateMaxOptionsLength as validateMaxOptionsLength,
- Assertions$1_validateNSFW as validateNSFW,
- validateName$1 as validateName,
- Assertions$1_validateRequired as validateRequired,
- validateRequiredParameters$1 as validateRequiredParameters,
- };
-}
-
-declare class ContextMenuCommandBuilder {
- /**
- * The name of this context menu command
- */
- readonly name: string;
- /**
- * The localized names for this command
- */
- readonly name_localizations?: LocalizationMap;
- /**
- * The type of this context menu command
- */
- readonly type: ContextMenuCommandType;
- /**
- * Whether the command is enabled by default when the app is added to a guild
- *
- * @deprecated This property is deprecated and will be removed in the future.
- * You should use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.
- */
- readonly default_permission: boolean | undefined;
- /**
- * Set of permissions represented as a bit set for the command
- */
- readonly default_member_permissions: Permissions | null | undefined;
- /**
- * Indicates whether the command is available in DMs with the application, only for globally-scoped commands.
- * By default, commands are visible.
- */
- readonly dm_permission: boolean | undefined;
- /**
- * Sets the name
- *
- * @param name - The name
- */
- setName(name: string): this;
- /**
- * Sets the type
- *
- * @param type - The type
- */
- setType(type: ContextMenuCommandType): this;
- /**
- * Sets whether the command is enabled by default when the application is added to a guild.
- *
- * @remarks
- * If set to `false`, you will have to later `PUT` the permissions for this command.
- * @param value - Whether or not to enable this command by default
- * @see https://discord.com/developers/docs/interactions/application-commands#permissions
- * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.
- */
- setDefaultPermission(value: boolean): this;
- /**
- * Sets the default permissions a member should have in order to run the command.
- *
- * @remarks
- * You can set this to `'0'` to disable the command by default.
- * @param permissions - The permissions bit field to set
- * @see https://discord.com/developers/docs/interactions/application-commands#permissions
- */
- setDefaultMemberPermissions(permissions: Permissions | bigint | number | null | undefined): this;
- /**
- * Sets if the command is available in DMs with the application, only for globally-scoped commands.
- * By default, commands are visible.
- *
- * @param enabled - If the command should be enabled in DMs
- * @see https://discord.com/developers/docs/interactions/application-commands#permissions
- */
- setDMPermission(enabled: boolean | null | undefined): this;
- /**
- * Sets a name localization
- *
- * @param locale - The locale to set a description for
- * @param localizedName - The localized description for the given locale
- */
- setNameLocalization(locale: LocaleString, localizedName: string | null): this;
- /**
- * Sets the name localizations
- *
- * @param localizedNames - The dictionary of localized descriptions to set
- */
- setNameLocalizations(localizedNames: LocalizationMap | null): this;
- /**
- * Returns the final data that should be sent to Discord.
- *
- * @remarks
- * This method runs validations on the data before serializing it.
- * As such, it may throw an error if the data is invalid.
- */
- toJSON(): RESTPostAPIContextMenuApplicationCommandsJSONBody;
-}
-type ContextMenuCommandType = ApplicationCommandType.Message | ApplicationCommandType.User;
-
-declare function validateDefaultPermission(value: unknown): asserts value is boolean;
-declare function validateName(name: unknown): asserts name is string;
-declare function validateType(type: unknown): asserts type is ContextMenuCommandType;
-declare function validateRequiredParameters(name: string, type: number): void;
-declare function validateDMPermission(value: unknown): asserts value is boolean | null | undefined;
-declare function validateDefaultMemberPermissions(permissions: unknown): string | null | undefined;
-
-declare const Assertions_validateDMPermission: typeof validateDMPermission;
-declare const Assertions_validateDefaultMemberPermissions: typeof validateDefaultMemberPermissions;
-declare const Assertions_validateDefaultPermission: typeof validateDefaultPermission;
-declare const Assertions_validateName: typeof validateName;
-declare const Assertions_validateRequiredParameters: typeof validateRequiredParameters;
-declare const Assertions_validateType: typeof validateType;
-declare namespace Assertions {
- export {
- Assertions_validateDMPermission as validateDMPermission,
- Assertions_validateDefaultMemberPermissions as validateDefaultMemberPermissions,
- Assertions_validateDefaultPermission as validateDefaultPermission,
- Assertions_validateName as validateName,
- Assertions_validateRequiredParameters as validateRequiredParameters,
- Assertions_validateType as validateType,
- };
-}
-
-declare function embedLength(data: APIEmbed): number;
-
-declare const enableValidators: () => boolean;
-declare const disableValidators: () => boolean;
-declare const isValidationEnabled: () => boolean;
-
-/**
- * The {@link https://github.com/discordjs/discord.js/blob/main/packages/builders/#readme | @discordjs/builders} version
- * that you are currently using.
- */
-declare const version: string;
-
-export { ActionRowBuilder, AnyAPIActionRowComponent, AnyComponentBuilder, ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionAllowedChannelTypes, ApplicationCommandOptionBase, ApplicationCommandOptionChannelTypesMixin, ApplicationCommandOptionWithChoicesAndAutocompleteMixin, BaseSelectMenuBuilder, ButtonBuilder, ChannelSelectMenuBuilder, Assertions$4 as ComponentAssertions, ComponentBuilder, Assertions as ContextMenuCommandAssertions, ContextMenuCommandBuilder, ContextMenuCommandType, Assertions$5 as EmbedAssertions, EmbedAuthorData, EmbedAuthorOptions, EmbedBuilder, EmbedFooterData, EmbedFooterOptions, EmbedImageData, IconData, MappedComponentTypes, MentionableSelectMenuBuilder, MessageActionRowComponentBuilder, MessageComponentBuilder, ModalActionRowComponentBuilder, Assertions$2 as ModalAssertions, ModalBuilder, ModalComponentBuilder, RGBTuple, RestOrArray, RoleSelectMenuBuilder, StringSelectMenuBuilder as SelectMenuBuilder, StringSelectMenuOptionBuilder as SelectMenuOptionBuilder, SharedNameAndDescription, SharedSlashCommandOptions, Assertions$1 as SlashCommandAssertions, SlashCommandAttachmentOption, SlashCommandBooleanOption, SlashCommandBuilder, SlashCommandChannelOption, SlashCommandIntegerOption, SlashCommandMentionableOption, SlashCommandNumberOption, SlashCommandOptionsOnlyBuilder, SlashCommandRoleOption, SlashCommandStringOption, SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder, SlashCommandSubcommandsOnlyBuilder, SlashCommandUserOption, StringSelectMenuBuilder, StringSelectMenuOptionBuilder, Assertions$3 as TextInputAssertions, TextInputBuilder, ToAPIApplicationCommandOptions, UserSelectMenuBuilder, createComponentBuilder, disableValidators, embedLength, enableValidators, isValidationEnabled, normalizeArray, version };
diff --git a/node_modules/@discordjs/builders/dist/index.js b/node_modules/@discordjs/builders/dist/index.js
deleted file mode 100644
index 992fe9f..0000000
--- a/node_modules/@discordjs/builders/dist/index.js
+++ /dev/null
@@ -1,2446 +0,0 @@
-"use strict";
-var __create = Object.create;
-var __defProp = Object.defineProperty;
-var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
-var __getOwnPropNames = Object.getOwnPropertyNames;
-var __getProtoOf = Object.getPrototypeOf;
-var __hasOwnProp = Object.prototype.hasOwnProperty;
-var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
-var __export = (target, all) => {
- for (var name in all)
- __defProp(target, name, { get: all[name], enumerable: true });
-};
-var __copyProps = (to, from, except, desc) => {
- if (from && typeof from === "object" || typeof from === "function") {
- for (let key of __getOwnPropNames(from))
- if (!__hasOwnProp.call(to, key) && key !== except)
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
- }
- return to;
-};
-var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
-var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
- // If the importer is in node compatibility mode or this is not an ESM
- // file that has been converted to a CommonJS file using a Babel-
- // compatible transform (i.e. "__esModule" has not been set), then set
- // "default" to the CommonJS "module.exports" for node compatibility.
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
- mod
-));
-var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
-
-// src/index.ts
-var src_exports = {};
-__export(src_exports, {
- ActionRowBuilder: () => ActionRowBuilder,
- ApplicationCommandNumericOptionMinMaxValueMixin: () => ApplicationCommandNumericOptionMinMaxValueMixin,
- ApplicationCommandOptionBase: () => ApplicationCommandOptionBase,
- ApplicationCommandOptionChannelTypesMixin: () => ApplicationCommandOptionChannelTypesMixin,
- ApplicationCommandOptionWithChoicesAndAutocompleteMixin: () => ApplicationCommandOptionWithChoicesAndAutocompleteMixin,
- BaseSelectMenuBuilder: () => BaseSelectMenuBuilder,
- ButtonBuilder: () => ButtonBuilder,
- ChannelSelectMenuBuilder: () => ChannelSelectMenuBuilder,
- ComponentAssertions: () => Assertions_exports2,
- ComponentBuilder: () => ComponentBuilder,
- ContextMenuCommandAssertions: () => Assertions_exports6,
- ContextMenuCommandBuilder: () => ContextMenuCommandBuilder,
- EmbedAssertions: () => Assertions_exports,
- EmbedBuilder: () => EmbedBuilder,
- MentionableSelectMenuBuilder: () => MentionableSelectMenuBuilder,
- ModalAssertions: () => Assertions_exports4,
- ModalBuilder: () => ModalBuilder,
- RoleSelectMenuBuilder: () => RoleSelectMenuBuilder,
- SelectMenuBuilder: () => StringSelectMenuBuilder,
- SelectMenuOptionBuilder: () => StringSelectMenuOptionBuilder,
- SharedNameAndDescription: () => SharedNameAndDescription,
- SharedSlashCommandOptions: () => SharedSlashCommandOptions,
- SlashCommandAssertions: () => Assertions_exports5,
- SlashCommandAttachmentOption: () => SlashCommandAttachmentOption,
- SlashCommandBooleanOption: () => SlashCommandBooleanOption,
- SlashCommandBuilder: () => SlashCommandBuilder,
- SlashCommandChannelOption: () => SlashCommandChannelOption,
- SlashCommandIntegerOption: () => SlashCommandIntegerOption,
- SlashCommandMentionableOption: () => SlashCommandMentionableOption,
- SlashCommandNumberOption: () => SlashCommandNumberOption,
- SlashCommandRoleOption: () => SlashCommandRoleOption,
- SlashCommandStringOption: () => SlashCommandStringOption,
- SlashCommandSubcommandBuilder: () => SlashCommandSubcommandBuilder,
- SlashCommandSubcommandGroupBuilder: () => SlashCommandSubcommandGroupBuilder,
- SlashCommandUserOption: () => SlashCommandUserOption,
- StringSelectMenuBuilder: () => StringSelectMenuBuilder,
- StringSelectMenuOptionBuilder: () => StringSelectMenuOptionBuilder,
- TextInputAssertions: () => Assertions_exports3,
- TextInputBuilder: () => TextInputBuilder,
- UserSelectMenuBuilder: () => UserSelectMenuBuilder,
- createComponentBuilder: () => createComponentBuilder,
- disableValidators: () => disableValidators,
- embedLength: () => embedLength,
- enableValidators: () => enableValidators,
- isValidationEnabled: () => isValidationEnabled,
- normalizeArray: () => normalizeArray,
- version: () => version
-});
-module.exports = __toCommonJS(src_exports);
-
-// src/messages/embed/Assertions.ts
-var Assertions_exports = {};
-__export(Assertions_exports, {
- RGBPredicate: () => RGBPredicate,
- authorNamePredicate: () => authorNamePredicate,
- colorPredicate: () => colorPredicate,
- descriptionPredicate: () => descriptionPredicate,
- embedAuthorPredicate: () => embedAuthorPredicate,
- embedFieldPredicate: () => embedFieldPredicate,
- embedFieldsArrayPredicate: () => embedFieldsArrayPredicate,
- embedFooterPredicate: () => embedFooterPredicate,
- fieldInlinePredicate: () => fieldInlinePredicate,
- fieldLengthPredicate: () => fieldLengthPredicate,
- fieldNamePredicate: () => fieldNamePredicate,
- fieldValuePredicate: () => fieldValuePredicate,
- footerTextPredicate: () => footerTextPredicate,
- imageURLPredicate: () => imageURLPredicate,
- timestampPredicate: () => timestampPredicate,
- titlePredicate: () => titlePredicate,
- urlPredicate: () => urlPredicate,
- validateFieldLength: () => validateFieldLength
-});
-var import_shapeshift = require("@sapphire/shapeshift");
-
-// src/util/validation.ts
-var validate = true;
-var enableValidators = /* @__PURE__ */ __name(() => validate = true, "enableValidators");
-var disableValidators = /* @__PURE__ */ __name(() => validate = false, "disableValidators");
-var isValidationEnabled = /* @__PURE__ */ __name(() => validate, "isValidationEnabled");
-
-// src/messages/embed/Assertions.ts
-var fieldNamePredicate = import_shapeshift.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(256).setValidationEnabled(isValidationEnabled);
-var fieldValuePredicate = import_shapeshift.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(1024).setValidationEnabled(isValidationEnabled);
-var fieldInlinePredicate = import_shapeshift.s.boolean.optional;
-var embedFieldPredicate = import_shapeshift.s.object({
- name: fieldNamePredicate,
- value: fieldValuePredicate,
- inline: fieldInlinePredicate
-}).setValidationEnabled(isValidationEnabled);
-var embedFieldsArrayPredicate = embedFieldPredicate.array.setValidationEnabled(isValidationEnabled);
-var fieldLengthPredicate = import_shapeshift.s.number.lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);
-function validateFieldLength(amountAdding, fields) {
- fieldLengthPredicate.parse((fields?.length ?? 0) + amountAdding);
-}
-__name(validateFieldLength, "validateFieldLength");
-var authorNamePredicate = fieldNamePredicate.nullable.setValidationEnabled(isValidationEnabled);
-var imageURLPredicate = import_shapeshift.s.string.url({
- allowedProtocols: [
- "http:",
- "https:",
- "attachment:"
- ]
-}).nullish.setValidationEnabled(isValidationEnabled);
-var urlPredicate = import_shapeshift.s.string.url({
- allowedProtocols: [
- "http:",
- "https:"
- ]
-}).nullish.setValidationEnabled(isValidationEnabled);
-var embedAuthorPredicate = import_shapeshift.s.object({
- name: authorNamePredicate,
- iconURL: imageURLPredicate,
- url: urlPredicate
-}).setValidationEnabled(isValidationEnabled);
-var RGBPredicate = import_shapeshift.s.number.int.greaterThanOrEqual(0).lessThanOrEqual(255).setValidationEnabled(isValidationEnabled);
-var colorPredicate = import_shapeshift.s.number.int.greaterThanOrEqual(0).lessThanOrEqual(16777215).or(import_shapeshift.s.tuple([
- RGBPredicate,
- RGBPredicate,
- RGBPredicate
-])).nullable.setValidationEnabled(isValidationEnabled);
-var descriptionPredicate = import_shapeshift.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(4096).nullable.setValidationEnabled(isValidationEnabled);
-var footerTextPredicate = import_shapeshift.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(2048).nullable.setValidationEnabled(isValidationEnabled);
-var embedFooterPredicate = import_shapeshift.s.object({
- text: footerTextPredicate,
- iconURL: imageURLPredicate
-}).setValidationEnabled(isValidationEnabled);
-var timestampPredicate = import_shapeshift.s.union(import_shapeshift.s.number, import_shapeshift.s.date).nullable.setValidationEnabled(isValidationEnabled);
-var titlePredicate = fieldNamePredicate.nullable.setValidationEnabled(isValidationEnabled);
-
-// src/util/normalizeArray.ts
-function normalizeArray(arr) {
- if (Array.isArray(arr[0]))
- return arr[0];
- return arr;
-}
-__name(normalizeArray, "normalizeArray");
-
-// src/messages/embed/Embed.ts
-var EmbedBuilder = class {
- constructor(data = {}) {
- this.data = {
- ...data
- };
- if (data.timestamp)
- this.data.timestamp = new Date(data.timestamp).toISOString();
- }
- /**
- * Appends fields to the embed
- *
- * @remarks
- * This method accepts either an array of fields or a variable number of field parameters.
- * The maximum amount of fields that can be added is 25.
- * @example
- * Using an array
- * ```ts
- * const fields: APIEmbedField[] = ...;
- * const embed = new EmbedBuilder()
- * .addFields(fields);
- * ```
- * @example
- * Using rest parameters (variadic)
- * ```ts
- * const embed = new EmbedBuilder()
- * .addFields(
- * { name: 'Field 1', value: 'Value 1' },
- * { name: 'Field 2', value: 'Value 2' },
- * );
- * ```
- * @param fields - The fields to add
- */
- addFields(...fields) {
- fields = normalizeArray(fields);
- validateFieldLength(fields.length, this.data.fields);
- embedFieldsArrayPredicate.parse(fields);
- if (this.data.fields)
- this.data.fields.push(...fields);
- else
- this.data.fields = fields;
- return this;
- }
- /**
- * Removes, replaces, or inserts fields in the embed.
- *
- * @remarks
- * This method behaves similarly
- * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice}.
- * The maximum amount of fields that can be added is 25.
- *
- * It's useful for modifying and adjusting order of the already-existing fields of an embed.
- * @example
- * Remove the first field
- * ```ts
- * embed.spliceFields(0, 1);
- * ```
- * @example
- * Remove the first n fields
- * ```ts
- * const n = 4
- * embed.spliceFields(0, n);
- * ```
- * @example
- * Remove the last field
- * ```ts
- * embed.spliceFields(-1, 1);
- * ```
- * @param index - The index to start at
- * @param deleteCount - The number of fields to remove
- * @param fields - The replacing field objects
- */
- spliceFields(index, deleteCount, ...fields) {
- validateFieldLength(fields.length - deleteCount, this.data.fields);
- embedFieldsArrayPredicate.parse(fields);
- if (this.data.fields)
- this.data.fields.splice(index, deleteCount, ...fields);
- else
- this.data.fields = fields;
- return this;
- }
- /**
- * Sets the embed's fields
- *
- * @remarks
- * This method is an alias for {@link EmbedBuilder.spliceFields}. More specifically,
- * it splices the entire array of fields, replacing them with the provided fields.
- *
- * You can set a maximum of 25 fields.
- * @param fields - The fields to set
- */
- setFields(...fields) {
- this.spliceFields(0, this.data.fields?.length ?? 0, ...normalizeArray(fields));
- return this;
- }
- /**
- * Sets the author of this embed
- *
- * @param options - The options for the author
- */
- setAuthor(options) {
- if (options === null) {
- this.data.author = void 0;
- return this;
- }
- embedAuthorPredicate.parse(options);
- this.data.author = {
- name: options.name,
- url: options.url,
- icon_url: options.iconURL
- };
- return this;
- }
- /**
- * Sets the color of this embed
- *
- * @param color - The color of the embed
- */
- setColor(color) {
- colorPredicate.parse(color);
- if (Array.isArray(color)) {
- const [red, green, blue] = color;
- this.data.color = (red << 16) + (green << 8) + blue;
- return this;
- }
- this.data.color = color ?? void 0;
- return this;
- }
- /**
- * Sets the description of this embed
- *
- * @param description - The description
- */
- setDescription(description) {
- descriptionPredicate.parse(description);
- this.data.description = description ?? void 0;
- return this;
- }
- /**
- * Sets the footer of this embed
- *
- * @param options - The options for the footer
- */
- setFooter(options) {
- if (options === null) {
- this.data.footer = void 0;
- return this;
- }
- embedFooterPredicate.parse(options);
- this.data.footer = {
- text: options.text,
- icon_url: options.iconURL
- };
- return this;
- }
- /**
- * Sets the image of this embed
- *
- * @param url - The URL of the image
- */
- setImage(url) {
- imageURLPredicate.parse(url);
- this.data.image = url ? {
- url
- } : void 0;
- return this;
- }
- /**
- * Sets the thumbnail of this embed
- *
- * @param url - The URL of the thumbnail
- */
- setThumbnail(url) {
- imageURLPredicate.parse(url);
- this.data.thumbnail = url ? {
- url
- } : void 0;
- return this;
- }
- /**
- * Sets the timestamp of this embed
- *
- * @param timestamp - The timestamp or date
- */
- setTimestamp(timestamp = Date.now()) {
- timestampPredicate.parse(timestamp);
- this.data.timestamp = timestamp ? new Date(timestamp).toISOString() : void 0;
- return this;
- }
- /**
- * Sets the title of this embed
- *
- * @param title - The title
- */
- setTitle(title) {
- titlePredicate.parse(title);
- this.data.title = title ?? void 0;
- return this;
- }
- /**
- * Sets the URL of this embed
- *
- * @param url - The URL
- */
- setURL(url) {
- urlPredicate.parse(url);
- this.data.url = url ?? void 0;
- return this;
- }
- /**
- * Transforms the embed to a plain object
- */
- toJSON() {
- return {
- ...this.data
- };
- }
-};
-__name(EmbedBuilder, "EmbedBuilder");
-
-// src/index.ts
-__reExport(src_exports, require("@discordjs/formatters"), module.exports);
-
-// src/components/Assertions.ts
-var Assertions_exports2 = {};
-__export(Assertions_exports2, {
- buttonLabelValidator: () => buttonLabelValidator,
- buttonStyleValidator: () => buttonStyleValidator,
- channelTypesValidator: () => channelTypesValidator,
- customIdValidator: () => customIdValidator,
- defaultValidator: () => defaultValidator,
- disabledValidator: () => disabledValidator,
- emojiValidator: () => emojiValidator,
- jsonOptionValidator: () => jsonOptionValidator,
- labelValueDescriptionValidator: () => labelValueDescriptionValidator,
- minMaxValidator: () => minMaxValidator,
- optionValidator: () => optionValidator,
- optionsLengthValidator: () => optionsLengthValidator,
- optionsValidator: () => optionsValidator,
- placeholderValidator: () => placeholderValidator,
- urlValidator: () => urlValidator,
- validateRequiredButtonParameters: () => validateRequiredButtonParameters,
- validateRequiredSelectMenuOptionParameters: () => validateRequiredSelectMenuOptionParameters,
- validateRequiredSelectMenuParameters: () => validateRequiredSelectMenuParameters
-});
-var import_shapeshift2 = require("@sapphire/shapeshift");
-var import_v10 = require("discord-api-types/v10");
-
-// src/components/selectMenu/StringSelectMenuOption.ts
-var StringSelectMenuOptionBuilder = class {
- /**
- * Creates a new string select menu option from API data
- *
- * @param data - The API data to create this string select menu option with
- * @example
- * Creating a string select menu option from an API data object
- * ```ts
- * const selectMenuOption = new SelectMenuOptionBuilder({
- * label: 'catchy label',
- * value: '1',
- * });
- * ```
- * @example
- * Creating a string select menu option using setters and API data
- * ```ts
- * const selectMenuOption = new SelectMenuOptionBuilder({
- * default: true,
- * value: '1',
- * })
- * .setLabel('woah')
- * ```
- */
- constructor(data = {}) {
- this.data = data;
- }
- /**
- * Sets the label of this option
- *
- * @param label - The label to show on this option
- */
- setLabel(label) {
- this.data.label = labelValueDescriptionValidator.parse(label);
- return this;
- }
- /**
- * Sets the value of this option
- *
- * @param value - The value of this option
- */
- setValue(value) {
- this.data.value = labelValueDescriptionValidator.parse(value);
- return this;
- }
- /**
- * Sets the description of this option
- *
- * @param description - The description of this option
- */
- setDescription(description) {
- this.data.description = labelValueDescriptionValidator.parse(description);
- return this;
- }
- /**
- * Sets whether this option is selected by default
- *
- * @param isDefault - Whether this option is selected by default
- */
- setDefault(isDefault = true) {
- this.data.default = defaultValidator.parse(isDefault);
- return this;
- }
- /**
- * Sets the emoji to display on this option
- *
- * @param emoji - The emoji to display on this option
- */
- setEmoji(emoji) {
- this.data.emoji = emojiValidator.parse(emoji);
- return this;
- }
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON() {
- validateRequiredSelectMenuOptionParameters(this.data.label, this.data.value);
- return {
- ...this.data
- };
- }
-};
-__name(StringSelectMenuOptionBuilder, "StringSelectMenuOptionBuilder");
-
-// src/components/Assertions.ts
-var customIdValidator = import_shapeshift2.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled);
-var emojiValidator = import_shapeshift2.s.object({
- id: import_shapeshift2.s.string,
- name: import_shapeshift2.s.string,
- animated: import_shapeshift2.s.boolean
-}).partial.strict.setValidationEnabled(isValidationEnabled);
-var disabledValidator = import_shapeshift2.s.boolean;
-var buttonLabelValidator = import_shapeshift2.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(80).setValidationEnabled(isValidationEnabled);
-var buttonStyleValidator = import_shapeshift2.s.nativeEnum(import_v10.ButtonStyle);
-var placeholderValidator = import_shapeshift2.s.string.lengthLessThanOrEqual(150).setValidationEnabled(isValidationEnabled);
-var minMaxValidator = import_shapeshift2.s.number.int.greaterThanOrEqual(0).lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);
-var labelValueDescriptionValidator = import_shapeshift2.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled);
-var jsonOptionValidator = import_shapeshift2.s.object({
- label: labelValueDescriptionValidator,
- value: labelValueDescriptionValidator,
- description: labelValueDescriptionValidator.optional,
- emoji: emojiValidator.optional,
- default: import_shapeshift2.s.boolean.optional
-}).setValidationEnabled(isValidationEnabled);
-var optionValidator = import_shapeshift2.s.instance(StringSelectMenuOptionBuilder).setValidationEnabled(isValidationEnabled);
-var optionsValidator = optionValidator.array.lengthGreaterThanOrEqual(0).setValidationEnabled(isValidationEnabled);
-var optionsLengthValidator = import_shapeshift2.s.number.int.greaterThanOrEqual(0).lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);
-function validateRequiredSelectMenuParameters(options, customId) {
- customIdValidator.parse(customId);
- optionsValidator.parse(options);
-}
-__name(validateRequiredSelectMenuParameters, "validateRequiredSelectMenuParameters");
-var defaultValidator = import_shapeshift2.s.boolean;
-function validateRequiredSelectMenuOptionParameters(label, value) {
- labelValueDescriptionValidator.parse(label);
- labelValueDescriptionValidator.parse(value);
-}
-__name(validateRequiredSelectMenuOptionParameters, "validateRequiredSelectMenuOptionParameters");
-var channelTypesValidator = import_shapeshift2.s.nativeEnum(import_v10.ChannelType).array.setValidationEnabled(isValidationEnabled);
-var urlValidator = import_shapeshift2.s.string.url({
- allowedProtocols: [
- "http:",
- "https:",
- "discord:"
- ]
-}).setValidationEnabled(isValidationEnabled);
-function validateRequiredButtonParameters(style, label, emoji, customId, url) {
- if (url && customId) {
- throw new RangeError("URL and custom id are mutually exclusive");
- }
- if (!label && !emoji) {
- throw new RangeError("Buttons must have a label and/or an emoji");
- }
- if (style === import_v10.ButtonStyle.Link) {
- if (!url) {
- throw new RangeError("Link buttons must have a url");
- }
- } else if (url) {
- throw new RangeError("Non-link buttons cannot have a url");
- }
-}
-__name(validateRequiredButtonParameters, "validateRequiredButtonParameters");
-
-// src/components/ActionRow.ts
-var import_v1011 = require("discord-api-types/v10");
-
-// src/components/Component.ts
-var ComponentBuilder = class {
- constructor(data) {
- this.data = data;
- }
-};
-__name(ComponentBuilder, "ComponentBuilder");
-
-// src/components/Components.ts
-var import_v1010 = require("discord-api-types/v10");
-
-// src/components/button/Button.ts
-var import_v102 = require("discord-api-types/v10");
-var ButtonBuilder = class extends ComponentBuilder {
- /**
- * Creates a new button from API data
- *
- * @param data - The API data to create this button with
- * @example
- * Creating a button from an API data object
- * ```ts
- * const button = new ButtonBuilder({
- * custom_id: 'a cool button',
- * style: ButtonStyle.Primary,
- * label: 'Click Me',
- * emoji: {
- * name: 'smile',
- * id: '123456789012345678',
- * },
- * });
- * ```
- * @example
- * Creating a button using setters and API data
- * ```ts
- * const button = new ButtonBuilder({
- * style: ButtonStyle.Secondary,
- * label: 'Click Me',
- * })
- * .setEmoji({ name: '🙂' })
- * .setCustomId('another cool button');
- * ```
- */
- constructor(data) {
- super({
- type: import_v102.ComponentType.Button,
- ...data
- });
- }
- /**
- * Sets the style of this button
- *
- * @param style - The style of the button
- */
- setStyle(style) {
- this.data.style = buttonStyleValidator.parse(style);
- return this;
- }
- /**
- * Sets the URL for this button
- *
- * @remarks
- * This method is only available to buttons using the `Link` button style.
- * Only three types of URL schemes are currently supported: `https://`, `http://` and `discord://`
- * @param url - The URL to open when this button is clicked
- */
- setURL(url) {
- this.data.url = urlValidator.parse(url);
- return this;
- }
- /**
- * Sets the custom id for this button
- *
- * @remarks
- * This method is only applicable to buttons that are not using the `Link` button style.
- * @param customId - The custom id to use for this button
- */
- setCustomId(customId) {
- this.data.custom_id = customIdValidator.parse(customId);
- return this;
- }
- /**
- * Sets the emoji to display on this button
- *
- * @param emoji - The emoji to display on this button
- */
- setEmoji(emoji) {
- this.data.emoji = emojiValidator.parse(emoji);
- return this;
- }
- /**
- * Sets whether this button is disabled
- *
- * @param disabled - Whether to disable this button
- */
- setDisabled(disabled = true) {
- this.data.disabled = disabledValidator.parse(disabled);
- return this;
- }
- /**
- * Sets the label for this button
- *
- * @param label - The label to display on this button
- */
- setLabel(label) {
- this.data.label = buttonLabelValidator.parse(label);
- return this;
- }
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON() {
- validateRequiredButtonParameters(this.data.style, this.data.label, this.data.emoji, this.data.custom_id, this.data.url);
- return {
- ...this.data
- };
- }
-};
-__name(ButtonBuilder, "ButtonBuilder");
-
-// src/components/selectMenu/ChannelSelectMenu.ts
-var import_v103 = require("discord-api-types/v10");
-
-// src/components/selectMenu/BaseSelectMenu.ts
-var BaseSelectMenuBuilder = class extends ComponentBuilder {
- /**
- * Sets the placeholder for this select menu
- *
- * @param placeholder - The placeholder to use for this select menu
- */
- setPlaceholder(placeholder) {
- this.data.placeholder = placeholderValidator.parse(placeholder);
- return this;
- }
- /**
- * Sets the minimum values that must be selected in the select menu
- *
- * @param minValues - The minimum values that must be selected
- */
- setMinValues(minValues) {
- this.data.min_values = minMaxValidator.parse(minValues);
- return this;
- }
- /**
- * Sets the maximum values that must be selected in the select menu
- *
- * @param maxValues - The maximum values that must be selected
- */
- setMaxValues(maxValues) {
- this.data.max_values = minMaxValidator.parse(maxValues);
- return this;
- }
- /**
- * Sets the custom id for this select menu
- *
- * @param customId - The custom id to use for this select menu
- */
- setCustomId(customId) {
- this.data.custom_id = customIdValidator.parse(customId);
- return this;
- }
- /**
- * Sets whether this select menu is disabled
- *
- * @param disabled - Whether this select menu is disabled
- */
- setDisabled(disabled = true) {
- this.data.disabled = disabledValidator.parse(disabled);
- return this;
- }
- toJSON() {
- customIdValidator.parse(this.data.custom_id);
- return {
- ...this.data
- };
- }
-};
-__name(BaseSelectMenuBuilder, "BaseSelectMenuBuilder");
-
-// src/components/selectMenu/ChannelSelectMenu.ts
-var ChannelSelectMenuBuilder = class extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object
- * ```ts
- * const selectMenu = new ChannelSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data
- * ```ts
- * const selectMenu = new ChannelSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .addChannelTypes(ChannelType.GuildText, ChannelType.GuildAnnouncement)
- * .setMinValues(2)
- * ```
- */
- constructor(data) {
- super({
- ...data,
- type: import_v103.ComponentType.ChannelSelect
- });
- }
- addChannelTypes(...types) {
- types = normalizeArray(types);
- this.data.channel_types ??= [];
- this.data.channel_types.push(...channelTypesValidator.parse(types));
- return this;
- }
- setChannelTypes(...types) {
- types = normalizeArray(types);
- this.data.channel_types ??= [];
- this.data.channel_types.splice(0, this.data.channel_types.length, ...channelTypesValidator.parse(types));
- return this;
- }
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON() {
- customIdValidator.parse(this.data.custom_id);
- return {
- ...this.data
- };
- }
-};
-__name(ChannelSelectMenuBuilder, "ChannelSelectMenuBuilder");
-
-// src/components/selectMenu/MentionableSelectMenu.ts
-var import_v104 = require("discord-api-types/v10");
-var MentionableSelectMenuBuilder = class extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object
- * ```ts
- * const selectMenu = new MentionableSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data
- * ```ts
- * const selectMenu = new MentionableSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .setMinValues(1)
- * ```
- */
- constructor(data) {
- super({
- ...data,
- type: import_v104.ComponentType.MentionableSelect
- });
- }
-};
-__name(MentionableSelectMenuBuilder, "MentionableSelectMenuBuilder");
-
-// src/components/selectMenu/RoleSelectMenu.ts
-var import_v105 = require("discord-api-types/v10");
-var RoleSelectMenuBuilder = class extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object
- * ```ts
- * const selectMenu = new RoleSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data
- * ```ts
- * const selectMenu = new RoleSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .setMinValues(1)
- * ```
- */
- constructor(data) {
- super({
- ...data,
- type: import_v105.ComponentType.RoleSelect
- });
- }
-};
-__name(RoleSelectMenuBuilder, "RoleSelectMenuBuilder");
-
-// src/components/selectMenu/StringSelectMenu.ts
-var import_v106 = require("discord-api-types/v10");
-var StringSelectMenuBuilder = class extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object
- * ```ts
- * const selectMenu = new StringSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * options: [
- * { label: 'option 1', value: '1' },
- * { label: 'option 2', value: '2' },
- * { label: 'option 3', value: '3' },
- * ],
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data
- * ```ts
- * const selectMenu = new StringSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .setMinValues(1)
- * .addOptions({
- * label: 'Catchy',
- * value: 'catch',
- * });
- * ```
- */
- constructor(data) {
- const { options, ...initData } = data ?? {};
- super({
- ...initData,
- type: import_v106.ComponentType.StringSelect
- });
- this.options = options?.map((option) => new StringSelectMenuOptionBuilder(option)) ?? [];
- }
- /**
- * Adds options to this select menu
- *
- * @param options - The options to add to this select menu
- * @returns
- */
- addOptions(...options) {
- options = normalizeArray(options);
- optionsLengthValidator.parse(this.options.length + options.length);
- this.options.push(...options.map((option) => option instanceof StringSelectMenuOptionBuilder ? option : new StringSelectMenuOptionBuilder(jsonOptionValidator.parse(option))));
- return this;
- }
- /**
- * Sets the options on this select menu
- *
- * @param options - The options to set on this select menu
- */
- setOptions(...options) {
- return this.spliceOptions(0, this.options.length, ...options);
- }
- /**
- * Removes, replaces, or inserts options in the string select menu.
- *
- * @remarks
- * This method behaves similarly
- * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice | Array.prototype.splice}.
- *
- * It's useful for modifying and adjusting order of the already-existing options of a string select menu.
- * @example
- * Remove the first option
- * ```ts
- * selectMenu.spliceOptions(0, 1);
- * ```
- * @example
- * Remove the first n option
- * ```ts
- * const n = 4
- * selectMenu.spliceOptions(0, n);
- * ```
- * @example
- * Remove the last option
- * ```ts
- * selectMenu.spliceOptions(-1, 1);
- * ```
- * @param index - The index to start at
- * @param deleteCount - The number of options to remove
- * @param options - The replacing option objects or builders
- */
- spliceOptions(index, deleteCount, ...options) {
- options = normalizeArray(options);
- const clone = [
- ...this.options
- ];
- clone.splice(index, deleteCount, ...options.map((option) => option instanceof StringSelectMenuOptionBuilder ? option : new StringSelectMenuOptionBuilder(jsonOptionValidator.parse(option))));
- optionsLengthValidator.parse(clone.length);
- this.options.splice(0, this.options.length, ...clone);
- return this;
- }
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON() {
- validateRequiredSelectMenuParameters(this.options, this.data.custom_id);
- return {
- ...this.data,
- options: this.options.map((option) => option.toJSON())
- };
- }
-};
-__name(StringSelectMenuBuilder, "StringSelectMenuBuilder");
-
-// src/components/selectMenu/UserSelectMenu.ts
-var import_v107 = require("discord-api-types/v10");
-var UserSelectMenuBuilder = class extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object
- * ```ts
- * const selectMenu = new UserSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data
- * ```ts
- * const selectMenu = new UserSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .setMinValues(1)
- * ```
- */
- constructor(data) {
- super({
- ...data,
- type: import_v107.ComponentType.UserSelect
- });
- }
-};
-__name(UserSelectMenuBuilder, "UserSelectMenuBuilder");
-
-// src/components/textInput/TextInput.ts
-var import_util = require("@discordjs/util");
-var import_v109 = require("discord-api-types/v10");
-var import_fast_deep_equal = __toESM(require("fast-deep-equal"));
-
-// src/components/textInput/Assertions.ts
-var Assertions_exports3 = {};
-__export(Assertions_exports3, {
- labelValidator: () => labelValidator,
- maxLengthValidator: () => maxLengthValidator,
- minLengthValidator: () => minLengthValidator,
- placeholderValidator: () => placeholderValidator2,
- requiredValidator: () => requiredValidator,
- textInputStyleValidator: () => textInputStyleValidator,
- validateRequiredParameters: () => validateRequiredParameters,
- valueValidator: () => valueValidator
-});
-var import_shapeshift3 = require("@sapphire/shapeshift");
-var import_v108 = require("discord-api-types/v10");
-var textInputStyleValidator = import_shapeshift3.s.nativeEnum(import_v108.TextInputStyle);
-var minLengthValidator = import_shapeshift3.s.number.int.greaterThanOrEqual(0).lessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled);
-var maxLengthValidator = import_shapeshift3.s.number.int.greaterThanOrEqual(1).lessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled);
-var requiredValidator = import_shapeshift3.s.boolean;
-var valueValidator = import_shapeshift3.s.string.lengthLessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled);
-var placeholderValidator2 = import_shapeshift3.s.string.lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled);
-var labelValidator = import_shapeshift3.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(45).setValidationEnabled(isValidationEnabled);
-function validateRequiredParameters(customId, style, label) {
- customIdValidator.parse(customId);
- textInputStyleValidator.parse(style);
- labelValidator.parse(label);
-}
-__name(validateRequiredParameters, "validateRequiredParameters");
-
-// src/components/textInput/TextInput.ts
-var TextInputBuilder = class extends ComponentBuilder {
- /**
- * Creates a new text input from API data
- *
- * @param data - The API data to create this text input with
- * @example
- * Creating a select menu option from an API data object
- * ```ts
- * const textInput = new TextInputBuilder({
- * custom_id: 'a cool select menu',
- * label: 'Type something',
- * style: TextInputStyle.Short,
- * });
- * ```
- * @example
- * Creating a select menu option using setters and API data
- * ```ts
- * const textInput = new TextInputBuilder({
- * label: 'Type something else',
- * })
- * .setCustomId('woah')
- * .setStyle(TextInputStyle.Paragraph);
- * ```
- */
- constructor(data) {
- super({
- type: import_v109.ComponentType.TextInput,
- ...data
- });
- }
- /**
- * Sets the custom id for this text input
- *
- * @param customId - The custom id of this text input
- */
- setCustomId(customId) {
- this.data.custom_id = customIdValidator.parse(customId);
- return this;
- }
- /**
- * Sets the label for this text input
- *
- * @param label - The label for this text input
- */
- setLabel(label) {
- this.data.label = labelValidator.parse(label);
- return this;
- }
- /**
- * Sets the style for this text input
- *
- * @param style - The style for this text input
- */
- setStyle(style) {
- this.data.style = textInputStyleValidator.parse(style);
- return this;
- }
- /**
- * Sets the minimum length of text for this text input
- *
- * @param minLength - The minimum length of text for this text input
- */
- setMinLength(minLength) {
- this.data.min_length = minLengthValidator.parse(minLength);
- return this;
- }
- /**
- * Sets the maximum length of text for this text input
- *
- * @param maxLength - The maximum length of text for this text input
- */
- setMaxLength(maxLength) {
- this.data.max_length = maxLengthValidator.parse(maxLength);
- return this;
- }
- /**
- * Sets the placeholder of this text input
- *
- * @param placeholder - The placeholder of this text input
- */
- setPlaceholder(placeholder) {
- this.data.placeholder = placeholderValidator2.parse(placeholder);
- return this;
- }
- /**
- * Sets the value of this text input
- *
- * @param value - The value for this text input
- */
- setValue(value) {
- this.data.value = valueValidator.parse(value);
- return this;
- }
- /**
- * Sets whether this text input is required
- *
- * @param required - Whether this text input is required
- */
- setRequired(required = true) {
- this.data.required = requiredValidator.parse(required);
- return this;
- }
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON() {
- validateRequiredParameters(this.data.custom_id, this.data.style, this.data.label);
- return {
- ...this.data
- };
- }
- /**
- * {@inheritDoc Equatable.equals}
- */
- equals(other) {
- if ((0, import_util.isJSONEncodable)(other)) {
- return (0, import_fast_deep_equal.default)(other.toJSON(), this.data);
- }
- return (0, import_fast_deep_equal.default)(other, this.data);
- }
-};
-__name(TextInputBuilder, "TextInputBuilder");
-
-// src/components/Components.ts
-function createComponentBuilder(data) {
- if (data instanceof ComponentBuilder) {
- return data;
- }
- switch (data.type) {
- case import_v1010.ComponentType.ActionRow:
- return new ActionRowBuilder(data);
- case import_v1010.ComponentType.Button:
- return new ButtonBuilder(data);
- case import_v1010.ComponentType.StringSelect:
- return new StringSelectMenuBuilder(data);
- case import_v1010.ComponentType.TextInput:
- return new TextInputBuilder(data);
- case import_v1010.ComponentType.UserSelect:
- return new UserSelectMenuBuilder(data);
- case import_v1010.ComponentType.RoleSelect:
- return new RoleSelectMenuBuilder(data);
- case import_v1010.ComponentType.MentionableSelect:
- return new MentionableSelectMenuBuilder(data);
- case import_v1010.ComponentType.ChannelSelect:
- return new ChannelSelectMenuBuilder(data);
- default:
- throw new Error(`Cannot properly serialize component type: ${data.type}`);
- }
-}
-__name(createComponentBuilder, "createComponentBuilder");
-
-// src/components/ActionRow.ts
-var ActionRowBuilder = class extends ComponentBuilder {
- /**
- * Creates a new action row from API data
- *
- * @param data - The API data to create this action row with
- * @example
- * Creating an action row from an API data object
- * ```ts
- * const actionRow = new ActionRowBuilder({
- * components: [
- * {
- * custom_id: "custom id",
- * label: "Type something",
- * style: TextInputStyle.Short,
- * type: ComponentType.TextInput,
- * },
- * ],
- * });
- * ```
- * @example
- * Creating an action row using setters and API data
- * ```ts
- * const actionRow = new ActionRowBuilder({
- * components: [
- * {
- * custom_id: "custom id",
- * label: "Click me",
- * style: ButtonStyle.Primary,
- * type: ComponentType.Button,
- * },
- * ],
- * })
- * .addComponents(button2, button3);
- * ```
- */
- constructor({ components, ...data } = {}) {
- super({
- type: import_v1011.ComponentType.ActionRow,
- ...data
- });
- this.components = components?.map((component) => createComponentBuilder(component)) ?? [];
- }
- /**
- * Adds components to this action row.
- *
- * @param components - The components to add to this action row.
- */
- addComponents(...components) {
- this.components.push(...normalizeArray(components));
- return this;
- }
- /**
- * Sets the components in this action row
- *
- * @param components - The components to set this row to
- */
- setComponents(...components) {
- this.components.splice(0, this.components.length, ...normalizeArray(components));
- return this;
- }
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON() {
- return {
- ...this.data,
- components: this.components.map((component) => component.toJSON())
- };
- }
-};
-__name(ActionRowBuilder, "ActionRowBuilder");
-
-// src/interactions/modals/Assertions.ts
-var Assertions_exports4 = {};
-__export(Assertions_exports4, {
- componentsValidator: () => componentsValidator,
- titleValidator: () => titleValidator,
- validateRequiredParameters: () => validateRequiredParameters2
-});
-var import_shapeshift4 = require("@sapphire/shapeshift");
-var titleValidator = import_shapeshift4.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(45).setValidationEnabled(isValidationEnabled);
-var componentsValidator = import_shapeshift4.s.instance(ActionRowBuilder).array.lengthGreaterThanOrEqual(1).setValidationEnabled(isValidationEnabled);
-function validateRequiredParameters2(customId, title, components) {
- customIdValidator.parse(customId);
- titleValidator.parse(title);
- componentsValidator.parse(components);
-}
-__name(validateRequiredParameters2, "validateRequiredParameters");
-
-// src/interactions/modals/Modal.ts
-var ModalBuilder = class {
- components = [];
- constructor({ components, ...data } = {}) {
- this.data = {
- ...data
- };
- this.components = components?.map((component) => createComponentBuilder(component)) ?? [];
- }
- /**
- * Sets the title of the modal
- *
- * @param title - The title of the modal
- */
- setTitle(title) {
- this.data.title = titleValidator.parse(title);
- return this;
- }
- /**
- * Sets the custom id of the modal
- *
- * @param customId - The custom id of this modal
- */
- setCustomId(customId) {
- this.data.custom_id = customIdValidator.parse(customId);
- return this;
- }
- /**
- * Adds components to this modal
- *
- * @param components - The components to add to this modal
- */
- addComponents(...components) {
- this.components.push(...normalizeArray(components).map((component) => component instanceof ActionRowBuilder ? component : new ActionRowBuilder(component)));
- return this;
- }
- /**
- * Sets the components in this modal
- *
- * @param components - The components to set this modal to
- */
- setComponents(...components) {
- this.components.splice(0, this.components.length, ...normalizeArray(components));
- return this;
- }
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON() {
- validateRequiredParameters2(this.data.custom_id, this.data.title, this.components);
- return {
- ...this.data,
- components: this.components.map((component) => component.toJSON())
- };
- }
-};
-__name(ModalBuilder, "ModalBuilder");
-
-// src/interactions/slashCommands/Assertions.ts
-var Assertions_exports5 = {};
-__export(Assertions_exports5, {
- assertReturnOfBuilder: () => assertReturnOfBuilder,
- localizationMapPredicate: () => localizationMapPredicate,
- validateChoicesLength: () => validateChoicesLength,
- validateDMPermission: () => validateDMPermission,
- validateDefaultMemberPermissions: () => validateDefaultMemberPermissions,
- validateDefaultPermission: () => validateDefaultPermission,
- validateDescription: () => validateDescription,
- validateLocale: () => validateLocale,
- validateLocalizationMap: () => validateLocalizationMap,
- validateMaxOptionsLength: () => validateMaxOptionsLength,
- validateNSFW: () => validateNSFW,
- validateName: () => validateName,
- validateRequired: () => validateRequired,
- validateRequiredParameters: () => validateRequiredParameters3
-});
-var import_shapeshift5 = require("@sapphire/shapeshift");
-var import_v1012 = require("discord-api-types/v10");
-var namePredicate = import_shapeshift5.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(32).regex(/^[\p{Ll}\p{Lm}\p{Lo}\p{N}\p{sc=Devanagari}\p{sc=Thai}_-]+$/u).setValidationEnabled(isValidationEnabled);
-function validateName(name) {
- namePredicate.parse(name);
-}
-__name(validateName, "validateName");
-var descriptionPredicate2 = import_shapeshift5.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled);
-var localePredicate = import_shapeshift5.s.nativeEnum(import_v1012.Locale);
-function validateDescription(description) {
- descriptionPredicate2.parse(description);
-}
-__name(validateDescription, "validateDescription");
-var maxArrayLengthPredicate = import_shapeshift5.s.unknown.array.lengthLessThanOrEqual(25).setValidationEnabled(isValidationEnabled);
-function validateLocale(locale) {
- return localePredicate.parse(locale);
-}
-__name(validateLocale, "validateLocale");
-function validateMaxOptionsLength(options) {
- maxArrayLengthPredicate.parse(options);
-}
-__name(validateMaxOptionsLength, "validateMaxOptionsLength");
-function validateRequiredParameters3(name, description, options) {
- validateName(name);
- validateDescription(description);
- validateMaxOptionsLength(options);
-}
-__name(validateRequiredParameters3, "validateRequiredParameters");
-var booleanPredicate = import_shapeshift5.s.boolean;
-function validateDefaultPermission(value) {
- booleanPredicate.parse(value);
-}
-__name(validateDefaultPermission, "validateDefaultPermission");
-function validateRequired(required) {
- booleanPredicate.parse(required);
-}
-__name(validateRequired, "validateRequired");
-var choicesLengthPredicate = import_shapeshift5.s.number.lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);
-function validateChoicesLength(amountAdding, choices) {
- choicesLengthPredicate.parse((choices?.length ?? 0) + amountAdding);
-}
-__name(validateChoicesLength, "validateChoicesLength");
-function assertReturnOfBuilder(input, ExpectedInstanceOf) {
- import_shapeshift5.s.instance(ExpectedInstanceOf).parse(input);
-}
-__name(assertReturnOfBuilder, "assertReturnOfBuilder");
-var localizationMapPredicate = import_shapeshift5.s.object(Object.fromEntries(Object.values(import_v1012.Locale).map((locale) => [
- locale,
- import_shapeshift5.s.string.nullish
-]))).strict.nullish.setValidationEnabled(isValidationEnabled);
-function validateLocalizationMap(value) {
- localizationMapPredicate.parse(value);
-}
-__name(validateLocalizationMap, "validateLocalizationMap");
-var dmPermissionPredicate = import_shapeshift5.s.boolean.nullish;
-function validateDMPermission(value) {
- dmPermissionPredicate.parse(value);
-}
-__name(validateDMPermission, "validateDMPermission");
-var memberPermissionPredicate = import_shapeshift5.s.union(import_shapeshift5.s.bigint.transform((value) => value.toString()), import_shapeshift5.s.number.safeInt.transform((value) => value.toString()), import_shapeshift5.s.string.regex(/^\d+$/)).nullish;
-function validateDefaultMemberPermissions(permissions) {
- return memberPermissionPredicate.parse(permissions);
-}
-__name(validateDefaultMemberPermissions, "validateDefaultMemberPermissions");
-function validateNSFW(value) {
- booleanPredicate.parse(value);
-}
-__name(validateNSFW, "validateNSFW");
-
-// src/interactions/slashCommands/SlashCommandBuilder.ts
-var import_ts_mixer6 = require("ts-mixer");
-
-// src/interactions/slashCommands/SlashCommandSubcommands.ts
-var import_v1024 = require("discord-api-types/v10");
-var import_ts_mixer5 = require("ts-mixer");
-
-// src/interactions/slashCommands/mixins/NameAndDescription.ts
-var SharedNameAndDescription = class {
- /**
- * Sets the name
- *
- * @param name - The name
- */
- setName(name) {
- validateName(name);
- Reflect.set(this, "name", name);
- return this;
- }
- /**
- * Sets the description
- *
- * @param description - The description
- */
- setDescription(description) {
- validateDescription(description);
- Reflect.set(this, "description", description);
- return this;
- }
- /**
- * Sets a name localization
- *
- * @param locale - The locale to set a description for
- * @param localizedName - The localized description for the given locale
- */
- setNameLocalization(locale, localizedName) {
- if (!this.name_localizations) {
- Reflect.set(this, "name_localizations", {});
- }
- const parsedLocale = validateLocale(locale);
- if (localizedName === null) {
- this.name_localizations[parsedLocale] = null;
- return this;
- }
- validateName(localizedName);
- this.name_localizations[parsedLocale] = localizedName;
- return this;
- }
- /**
- * Sets the name localizations
- *
- * @param localizedNames - The dictionary of localized descriptions to set
- */
- setNameLocalizations(localizedNames) {
- if (localizedNames === null) {
- Reflect.set(this, "name_localizations", null);
- return this;
- }
- Reflect.set(this, "name_localizations", {});
- for (const args of Object.entries(localizedNames)) {
- this.setNameLocalization(...args);
- }
- return this;
- }
- /**
- * Sets a description localization
- *
- * @param locale - The locale to set a description for
- * @param localizedDescription - The localized description for the given locale
- */
- setDescriptionLocalization(locale, localizedDescription) {
- if (!this.description_localizations) {
- Reflect.set(this, "description_localizations", {});
- }
- const parsedLocale = validateLocale(locale);
- if (localizedDescription === null) {
- this.description_localizations[parsedLocale] = null;
- return this;
- }
- validateDescription(localizedDescription);
- this.description_localizations[parsedLocale] = localizedDescription;
- return this;
- }
- /**
- * Sets the description localizations
- *
- * @param localizedDescriptions - The dictionary of localized descriptions to set
- */
- setDescriptionLocalizations(localizedDescriptions) {
- if (localizedDescriptions === null) {
- Reflect.set(this, "description_localizations", null);
- return this;
- }
- Reflect.set(this, "description_localizations", {});
- for (const args of Object.entries(localizedDescriptions)) {
- this.setDescriptionLocalization(...args);
- }
- return this;
- }
-};
-__name(SharedNameAndDescription, "SharedNameAndDescription");
-
-// src/interactions/slashCommands/options/attachment.ts
-var import_v1013 = require("discord-api-types/v10");
-
-// src/interactions/slashCommands/mixins/ApplicationCommandOptionBase.ts
-var ApplicationCommandOptionBase = class extends SharedNameAndDescription {
- required = false;
- /**
- * Marks the option as required
- *
- * @param required - If this option should be required
- */
- setRequired(required) {
- validateRequired(required);
- Reflect.set(this, "required", required);
- return this;
- }
- runRequiredValidations() {
- validateRequiredParameters3(this.name, this.description, []);
- validateLocalizationMap(this.name_localizations);
- validateLocalizationMap(this.description_localizations);
- validateRequired(this.required);
- }
-};
-__name(ApplicationCommandOptionBase, "ApplicationCommandOptionBase");
-
-// src/interactions/slashCommands/options/attachment.ts
-var SlashCommandAttachmentOption = class extends ApplicationCommandOptionBase {
- type = import_v1013.ApplicationCommandOptionType.Attachment;
- toJSON() {
- this.runRequiredValidations();
- return {
- ...this
- };
- }
-};
-__name(SlashCommandAttachmentOption, "SlashCommandAttachmentOption");
-
-// src/interactions/slashCommands/options/boolean.ts
-var import_v1014 = require("discord-api-types/v10");
-var SlashCommandBooleanOption = class extends ApplicationCommandOptionBase {
- type = import_v1014.ApplicationCommandOptionType.Boolean;
- toJSON() {
- this.runRequiredValidations();
- return {
- ...this
- };
- }
-};
-__name(SlashCommandBooleanOption, "SlashCommandBooleanOption");
-
-// src/interactions/slashCommands/options/channel.ts
-var import_v1016 = require("discord-api-types/v10");
-var import_ts_mixer = require("ts-mixer");
-
-// src/interactions/slashCommands/mixins/ApplicationCommandOptionChannelTypesMixin.ts
-var import_shapeshift6 = require("@sapphire/shapeshift");
-var import_v1015 = require("discord-api-types/v10");
-var allowedChannelTypes = [
- import_v1015.ChannelType.GuildText,
- import_v1015.ChannelType.GuildVoice,
- import_v1015.ChannelType.GuildCategory,
- import_v1015.ChannelType.GuildAnnouncement,
- import_v1015.ChannelType.AnnouncementThread,
- import_v1015.ChannelType.PublicThread,
- import_v1015.ChannelType.PrivateThread,
- import_v1015.ChannelType.GuildStageVoice,
- import_v1015.ChannelType.GuildForum
-];
-var channelTypesPredicate = import_shapeshift6.s.array(import_shapeshift6.s.union(...allowedChannelTypes.map((type) => import_shapeshift6.s.literal(type))));
-var ApplicationCommandOptionChannelTypesMixin = class {
- /**
- * Adds channel types to this option
- *
- * @param channelTypes - The channel types to add
- */
- addChannelTypes(...channelTypes) {
- if (this.channel_types === void 0) {
- Reflect.set(this, "channel_types", []);
- }
- this.channel_types.push(...channelTypesPredicate.parse(channelTypes));
- return this;
- }
-};
-__name(ApplicationCommandOptionChannelTypesMixin, "ApplicationCommandOptionChannelTypesMixin");
-
-// src/interactions/slashCommands/options/channel.ts
-var __decorate = function(decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
- r = Reflect.decorate(decorators, target, key, desc);
- else
- for (var i = decorators.length - 1; i >= 0; i--)
- if (d = decorators[i])
- r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
-};
-var SlashCommandChannelOption = /* @__PURE__ */ __name(class SlashCommandChannelOption2 extends ApplicationCommandOptionBase {
- type = import_v1016.ApplicationCommandOptionType.Channel;
- toJSON() {
- this.runRequiredValidations();
- return {
- ...this
- };
- }
-}, "SlashCommandChannelOption");
-SlashCommandChannelOption = __decorate([
- (0, import_ts_mixer.mix)(ApplicationCommandOptionChannelTypesMixin)
-], SlashCommandChannelOption);
-
-// src/interactions/slashCommands/options/integer.ts
-var import_shapeshift8 = require("@sapphire/shapeshift");
-var import_v1018 = require("discord-api-types/v10");
-var import_ts_mixer2 = require("ts-mixer");
-
-// src/interactions/slashCommands/mixins/ApplicationCommandNumericOptionMinMaxValueMixin.ts
-var ApplicationCommandNumericOptionMinMaxValueMixin = class {
-};
-__name(ApplicationCommandNumericOptionMinMaxValueMixin, "ApplicationCommandNumericOptionMinMaxValueMixin");
-
-// src/interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin.ts
-var import_shapeshift7 = require("@sapphire/shapeshift");
-var import_v1017 = require("discord-api-types/v10");
-var stringPredicate = import_shapeshift7.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100);
-var numberPredicate = import_shapeshift7.s.number.greaterThan(Number.NEGATIVE_INFINITY).lessThan(Number.POSITIVE_INFINITY);
-var choicesPredicate = import_shapeshift7.s.object({
- name: stringPredicate,
- name_localizations: localizationMapPredicate,
- value: import_shapeshift7.s.union(stringPredicate, numberPredicate)
-}).array;
-var booleanPredicate2 = import_shapeshift7.s.boolean;
-var ApplicationCommandOptionWithChoicesAndAutocompleteMixin = class {
- /**
- * Adds multiple choices for this option
- *
- * @param choices - The choices to add
- */
- addChoices(...choices) {
- if (choices.length > 0 && this.autocomplete) {
- throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");
- }
- choicesPredicate.parse(choices);
- if (this.choices === void 0) {
- Reflect.set(this, "choices", []);
- }
- validateChoicesLength(choices.length, this.choices);
- for (const { name, name_localizations, value } of choices) {
- if (this.type === import_v1017.ApplicationCommandOptionType.String) {
- stringPredicate.parse(value);
- } else {
- numberPredicate.parse(value);
- }
- this.choices.push({
- name,
- name_localizations,
- value
- });
- }
- return this;
- }
- setChoices(...choices) {
- if (choices.length > 0 && this.autocomplete) {
- throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");
- }
- choicesPredicate.parse(choices);
- Reflect.set(this, "choices", []);
- this.addChoices(...choices);
- return this;
- }
- /**
- * Marks the option as autocompletable
- *
- * @param autocomplete - If this option should be autocompletable
- */
- setAutocomplete(autocomplete) {
- booleanPredicate2.parse(autocomplete);
- if (autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {
- throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");
- }
- Reflect.set(this, "autocomplete", autocomplete);
- return this;
- }
-};
-__name(ApplicationCommandOptionWithChoicesAndAutocompleteMixin, "ApplicationCommandOptionWithChoicesAndAutocompleteMixin");
-
-// src/interactions/slashCommands/options/integer.ts
-var __decorate2 = function(decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
- r = Reflect.decorate(decorators, target, key, desc);
- else
- for (var i = decorators.length - 1; i >= 0; i--)
- if (d = decorators[i])
- r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
-};
-var numberValidator = import_shapeshift8.s.number.int;
-var SlashCommandIntegerOption = /* @__PURE__ */ __name(class SlashCommandIntegerOption2 extends ApplicationCommandOptionBase {
- type = import_v1018.ApplicationCommandOptionType.Integer;
- /**
- * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue}
- */
- setMaxValue(max) {
- numberValidator.parse(max);
- Reflect.set(this, "max_value", max);
- return this;
- }
- /**
- * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue}
- */
- setMinValue(min) {
- numberValidator.parse(min);
- Reflect.set(this, "min_value", min);
- return this;
- }
- toJSON() {
- this.runRequiredValidations();
- if (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {
- throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");
- }
- return {
- ...this
- };
- }
-}, "SlashCommandIntegerOption");
-SlashCommandIntegerOption = __decorate2([
- (0, import_ts_mixer2.mix)(ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionWithChoicesAndAutocompleteMixin)
-], SlashCommandIntegerOption);
-
-// src/interactions/slashCommands/options/mentionable.ts
-var import_v1019 = require("discord-api-types/v10");
-var SlashCommandMentionableOption = class extends ApplicationCommandOptionBase {
- type = import_v1019.ApplicationCommandOptionType.Mentionable;
- toJSON() {
- this.runRequiredValidations();
- return {
- ...this
- };
- }
-};
-__name(SlashCommandMentionableOption, "SlashCommandMentionableOption");
-
-// src/interactions/slashCommands/options/number.ts
-var import_shapeshift9 = require("@sapphire/shapeshift");
-var import_v1020 = require("discord-api-types/v10");
-var import_ts_mixer3 = require("ts-mixer");
-var __decorate3 = function(decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
- r = Reflect.decorate(decorators, target, key, desc);
- else
- for (var i = decorators.length - 1; i >= 0; i--)
- if (d = decorators[i])
- r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
-};
-var numberValidator2 = import_shapeshift9.s.number;
-var SlashCommandNumberOption = /* @__PURE__ */ __name(class SlashCommandNumberOption2 extends ApplicationCommandOptionBase {
- type = import_v1020.ApplicationCommandOptionType.Number;
- /**
- * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue}
- */
- setMaxValue(max) {
- numberValidator2.parse(max);
- Reflect.set(this, "max_value", max);
- return this;
- }
- /**
- * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue}
- */
- setMinValue(min) {
- numberValidator2.parse(min);
- Reflect.set(this, "min_value", min);
- return this;
- }
- toJSON() {
- this.runRequiredValidations();
- if (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {
- throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");
- }
- return {
- ...this
- };
- }
-}, "SlashCommandNumberOption");
-SlashCommandNumberOption = __decorate3([
- (0, import_ts_mixer3.mix)(ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionWithChoicesAndAutocompleteMixin)
-], SlashCommandNumberOption);
-
-// src/interactions/slashCommands/options/role.ts
-var import_v1021 = require("discord-api-types/v10");
-var SlashCommandRoleOption = class extends ApplicationCommandOptionBase {
- type = import_v1021.ApplicationCommandOptionType.Role;
- toJSON() {
- this.runRequiredValidations();
- return {
- ...this
- };
- }
-};
-__name(SlashCommandRoleOption, "SlashCommandRoleOption");
-
-// src/interactions/slashCommands/options/string.ts
-var import_shapeshift10 = require("@sapphire/shapeshift");
-var import_v1022 = require("discord-api-types/v10");
-var import_ts_mixer4 = require("ts-mixer");
-var __decorate4 = function(decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
- r = Reflect.decorate(decorators, target, key, desc);
- else
- for (var i = decorators.length - 1; i >= 0; i--)
- if (d = decorators[i])
- r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
-};
-var minLengthValidator2 = import_shapeshift10.s.number.greaterThanOrEqual(0).lessThanOrEqual(6e3);
-var maxLengthValidator2 = import_shapeshift10.s.number.greaterThanOrEqual(1).lessThanOrEqual(6e3);
-var SlashCommandStringOption = /* @__PURE__ */ __name(class SlashCommandStringOption2 extends ApplicationCommandOptionBase {
- type = import_v1022.ApplicationCommandOptionType.String;
- /**
- * Sets the maximum length of this string option.
- *
- * @param max - The maximum length this option can be
- */
- setMaxLength(max) {
- maxLengthValidator2.parse(max);
- Reflect.set(this, "max_length", max);
- return this;
- }
- /**
- * Sets the minimum length of this string option.
- *
- * @param min - The minimum length this option can be
- */
- setMinLength(min) {
- minLengthValidator2.parse(min);
- Reflect.set(this, "min_length", min);
- return this;
- }
- toJSON() {
- this.runRequiredValidations();
- if (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {
- throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");
- }
- return {
- ...this
- };
- }
-}, "SlashCommandStringOption");
-SlashCommandStringOption = __decorate4([
- (0, import_ts_mixer4.mix)(ApplicationCommandOptionWithChoicesAndAutocompleteMixin)
-], SlashCommandStringOption);
-
-// src/interactions/slashCommands/options/user.ts
-var import_v1023 = require("discord-api-types/v10");
-var SlashCommandUserOption = class extends ApplicationCommandOptionBase {
- type = import_v1023.ApplicationCommandOptionType.User;
- toJSON() {
- this.runRequiredValidations();
- return {
- ...this
- };
- }
-};
-__name(SlashCommandUserOption, "SlashCommandUserOption");
-
-// src/interactions/slashCommands/mixins/SharedSlashCommandOptions.ts
-var SharedSlashCommandOptions = class {
- /**
- * Adds a boolean option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addBooleanOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandBooleanOption);
- }
- /**
- * Adds a user option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addUserOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandUserOption);
- }
- /**
- * Adds a channel option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addChannelOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandChannelOption);
- }
- /**
- * Adds a role option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addRoleOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandRoleOption);
- }
- /**
- * Adds an attachment option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addAttachmentOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandAttachmentOption);
- }
- /**
- * Adds a mentionable option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addMentionableOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandMentionableOption);
- }
- /**
- * Adds a string option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addStringOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandStringOption);
- }
- /**
- * Adds an integer option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addIntegerOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandIntegerOption);
- }
- /**
- * Adds a number option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addNumberOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandNumberOption);
- }
- _sharedAddOptionMethod(input, Instance) {
- const { options } = this;
- validateMaxOptionsLength(options);
- const result = typeof input === "function" ? input(new Instance()) : input;
- assertReturnOfBuilder(result, Instance);
- options.push(result);
- return this;
- }
-};
-__name(SharedSlashCommandOptions, "SharedSlashCommandOptions");
-
-// src/interactions/slashCommands/SlashCommandSubcommands.ts
-var __decorate5 = function(decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
- r = Reflect.decorate(decorators, target, key, desc);
- else
- for (var i = decorators.length - 1; i >= 0; i--)
- if (d = decorators[i])
- r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
-};
-var SlashCommandSubcommandGroupBuilder = /* @__PURE__ */ __name(class SlashCommandSubcommandGroupBuilder2 {
- /**
- * The name of this subcommand group
- */
- name = void 0;
- /**
- * The description of this subcommand group
- */
- description = void 0;
- /**
- * The subcommands part of this subcommand group
- */
- options = [];
- /**
- * Adds a new subcommand to this group
- *
- * @param input - A function that returns a subcommand builder, or an already built builder
- */
- addSubcommand(input) {
- const { options } = this;
- validateMaxOptionsLength(options);
- const result = typeof input === "function" ? input(new SlashCommandSubcommandBuilder()) : input;
- assertReturnOfBuilder(result, SlashCommandSubcommandBuilder);
- options.push(result);
- return this;
- }
- toJSON() {
- validateRequiredParameters3(this.name, this.description, this.options);
- return {
- type: import_v1024.ApplicationCommandOptionType.SubcommandGroup,
- name: this.name,
- name_localizations: this.name_localizations,
- description: this.description,
- description_localizations: this.description_localizations,
- options: this.options.map((option) => option.toJSON())
- };
- }
-}, "SlashCommandSubcommandGroupBuilder");
-SlashCommandSubcommandGroupBuilder = __decorate5([
- (0, import_ts_mixer5.mix)(SharedNameAndDescription)
-], SlashCommandSubcommandGroupBuilder);
-var SlashCommandSubcommandBuilder = /* @__PURE__ */ __name(class SlashCommandSubcommandBuilder2 {
- /**
- * The name of this subcommand
- */
- name = void 0;
- /**
- * The description of this subcommand
- */
- description = void 0;
- /**
- * The options of this subcommand
- */
- options = [];
- toJSON() {
- validateRequiredParameters3(this.name, this.description, this.options);
- return {
- type: import_v1024.ApplicationCommandOptionType.Subcommand,
- name: this.name,
- name_localizations: this.name_localizations,
- description: this.description,
- description_localizations: this.description_localizations,
- options: this.options.map((option) => option.toJSON())
- };
- }
-}, "SlashCommandSubcommandBuilder");
-SlashCommandSubcommandBuilder = __decorate5([
- (0, import_ts_mixer5.mix)(SharedNameAndDescription, SharedSlashCommandOptions)
-], SlashCommandSubcommandBuilder);
-
-// src/interactions/slashCommands/SlashCommandBuilder.ts
-var __decorate6 = function(decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
- r = Reflect.decorate(decorators, target, key, desc);
- else
- for (var i = decorators.length - 1; i >= 0; i--)
- if (d = decorators[i])
- r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
-};
-var SlashCommandBuilder = /* @__PURE__ */ __name(class SlashCommandBuilder2 {
- /**
- * The name of this slash command
- */
- name = void 0;
- /**
- * The description of this slash command
- */
- description = void 0;
- /**
- * The options of this slash command
- */
- options = [];
- /**
- * Whether the command is enabled by default when the app is added to a guild
- *
- * @deprecated This property is deprecated and will be removed in the future.
- * You should use {@link (SlashCommandBuilder:class).setDefaultMemberPermissions} or {@link (SlashCommandBuilder:class).setDMPermission} instead.
- */
- default_permission = void 0;
- /**
- * Set of permissions represented as a bit set for the command
- */
- default_member_permissions = void 0;
- /**
- * Indicates whether the command is available in DMs with the application, only for globally-scoped commands.
- * By default, commands are visible.
- */
- dm_permission = void 0;
- /**
- * Whether this command is NSFW
- */
- nsfw = void 0;
- /**
- * Returns the final data that should be sent to Discord.
- *
- * @remarks
- * This method runs validations on the data before serializing it.
- * As such, it may throw an error if the data is invalid.
- */
- toJSON() {
- validateRequiredParameters3(this.name, this.description, this.options);
- validateLocalizationMap(this.name_localizations);
- validateLocalizationMap(this.description_localizations);
- return {
- ...this,
- options: this.options.map((option) => option.toJSON())
- };
- }
- /**
- * Sets whether the command is enabled by default when the application is added to a guild.
- *
- * @remarks
- * If set to `false`, you will have to later `PUT` the permissions for this command.
- * @param value - Whether or not to enable this command by default
- * @see https://discord.com/developers/docs/interactions/application-commands#permissions
- * @deprecated Use {@link (SlashCommandBuilder:class).setDefaultMemberPermissions} or {@link (SlashCommandBuilder:class).setDMPermission} instead.
- */
- setDefaultPermission(value) {
- validateDefaultPermission(value);
- Reflect.set(this, "default_permission", value);
- return this;
- }
- /**
- * Sets the default permissions a member should have in order to run the command.
- *
- * @remarks
- * You can set this to `'0'` to disable the command by default.
- * @param permissions - The permissions bit field to set
- * @see https://discord.com/developers/docs/interactions/application-commands#permissions
- */
- setDefaultMemberPermissions(permissions) {
- const permissionValue = validateDefaultMemberPermissions(permissions);
- Reflect.set(this, "default_member_permissions", permissionValue);
- return this;
- }
- /**
- * Sets if the command is available in DMs with the application, only for globally-scoped commands.
- * By default, commands are visible.
- *
- * @param enabled - If the command should be enabled in DMs
- * @see https://discord.com/developers/docs/interactions/application-commands#permissions
- */
- setDMPermission(enabled) {
- validateDMPermission(enabled);
- Reflect.set(this, "dm_permission", enabled);
- return this;
- }
- /**
- * Sets whether this command is NSFW
- *
- * @param nsfw - Whether this command is NSFW
- */
- setNSFW(nsfw = true) {
- validateNSFW(nsfw);
- Reflect.set(this, "nsfw", nsfw);
- return this;
- }
- /**
- * Adds a new subcommand group to this command
- *
- * @param input - A function that returns a subcommand group builder, or an already built builder
- */
- addSubcommandGroup(input) {
- const { options } = this;
- validateMaxOptionsLength(options);
- const result = typeof input === "function" ? input(new SlashCommandSubcommandGroupBuilder()) : input;
- assertReturnOfBuilder(result, SlashCommandSubcommandGroupBuilder);
- options.push(result);
- return this;
- }
- /**
- * Adds a new subcommand to this command
- *
- * @param input - A function that returns a subcommand builder, or an already built builder
- */
- addSubcommand(input) {
- const { options } = this;
- validateMaxOptionsLength(options);
- const result = typeof input === "function" ? input(new SlashCommandSubcommandBuilder()) : input;
- assertReturnOfBuilder(result, SlashCommandSubcommandBuilder);
- options.push(result);
- return this;
- }
-}, "SlashCommandBuilder");
-SlashCommandBuilder = __decorate6([
- (0, import_ts_mixer6.mix)(SharedSlashCommandOptions, SharedNameAndDescription)
-], SlashCommandBuilder);
-
-// src/interactions/contextMenuCommands/Assertions.ts
-var Assertions_exports6 = {};
-__export(Assertions_exports6, {
- validateDMPermission: () => validateDMPermission2,
- validateDefaultMemberPermissions: () => validateDefaultMemberPermissions2,
- validateDefaultPermission: () => validateDefaultPermission2,
- validateName: () => validateName2,
- validateRequiredParameters: () => validateRequiredParameters4,
- validateType: () => validateType
-});
-var import_shapeshift11 = require("@sapphire/shapeshift");
-var import_v1025 = require("discord-api-types/v10");
-var namePredicate2 = import_shapeshift11.s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(32).regex(/^( *[\p{P}\p{L}\p{N}\p{sc=Devanagari}\p{sc=Thai}]+ *)+$/u).setValidationEnabled(isValidationEnabled);
-var typePredicate = import_shapeshift11.s.union(import_shapeshift11.s.literal(import_v1025.ApplicationCommandType.User), import_shapeshift11.s.literal(import_v1025.ApplicationCommandType.Message)).setValidationEnabled(isValidationEnabled);
-var booleanPredicate3 = import_shapeshift11.s.boolean;
-function validateDefaultPermission2(value) {
- booleanPredicate3.parse(value);
-}
-__name(validateDefaultPermission2, "validateDefaultPermission");
-function validateName2(name) {
- namePredicate2.parse(name);
-}
-__name(validateName2, "validateName");
-function validateType(type) {
- typePredicate.parse(type);
-}
-__name(validateType, "validateType");
-function validateRequiredParameters4(name, type) {
- validateName2(name);
- validateType(type);
-}
-__name(validateRequiredParameters4, "validateRequiredParameters");
-var dmPermissionPredicate2 = import_shapeshift11.s.boolean.nullish;
-function validateDMPermission2(value) {
- dmPermissionPredicate2.parse(value);
-}
-__name(validateDMPermission2, "validateDMPermission");
-var memberPermissionPredicate2 = import_shapeshift11.s.union(import_shapeshift11.s.bigint.transform((value) => value.toString()), import_shapeshift11.s.number.safeInt.transform((value) => value.toString()), import_shapeshift11.s.string.regex(/^\d+$/)).nullish;
-function validateDefaultMemberPermissions2(permissions) {
- return memberPermissionPredicate2.parse(permissions);
-}
-__name(validateDefaultMemberPermissions2, "validateDefaultMemberPermissions");
-
-// src/interactions/contextMenuCommands/ContextMenuCommandBuilder.ts
-var ContextMenuCommandBuilder = class {
- /**
- * The name of this context menu command
- */
- name = void 0;
- /**
- * The type of this context menu command
- */
- type = void 0;
- /**
- * Whether the command is enabled by default when the app is added to a guild
- *
- * @deprecated This property is deprecated and will be removed in the future.
- * You should use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.
- */
- default_permission = void 0;
- /**
- * Set of permissions represented as a bit set for the command
- */
- default_member_permissions = void 0;
- /**
- * Indicates whether the command is available in DMs with the application, only for globally-scoped commands.
- * By default, commands are visible.
- */
- dm_permission = void 0;
- /**
- * Sets the name
- *
- * @param name - The name
- */
- setName(name) {
- validateName2(name);
- Reflect.set(this, "name", name);
- return this;
- }
- /**
- * Sets the type
- *
- * @param type - The type
- */
- setType(type) {
- validateType(type);
- Reflect.set(this, "type", type);
- return this;
- }
- /**
- * Sets whether the command is enabled by default when the application is added to a guild.
- *
- * @remarks
- * If set to `false`, you will have to later `PUT` the permissions for this command.
- * @param value - Whether or not to enable this command by default
- * @see https://discord.com/developers/docs/interactions/application-commands#permissions
- * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.
- */
- setDefaultPermission(value) {
- validateDefaultPermission2(value);
- Reflect.set(this, "default_permission", value);
- return this;
- }
- /**
- * Sets the default permissions a member should have in order to run the command.
- *
- * @remarks
- * You can set this to `'0'` to disable the command by default.
- * @param permissions - The permissions bit field to set
- * @see https://discord.com/developers/docs/interactions/application-commands#permissions
- */
- setDefaultMemberPermissions(permissions) {
- const permissionValue = validateDefaultMemberPermissions2(permissions);
- Reflect.set(this, "default_member_permissions", permissionValue);
- return this;
- }
- /**
- * Sets if the command is available in DMs with the application, only for globally-scoped commands.
- * By default, commands are visible.
- *
- * @param enabled - If the command should be enabled in DMs
- * @see https://discord.com/developers/docs/interactions/application-commands#permissions
- */
- setDMPermission(enabled) {
- validateDMPermission2(enabled);
- Reflect.set(this, "dm_permission", enabled);
- return this;
- }
- /**
- * Sets a name localization
- *
- * @param locale - The locale to set a description for
- * @param localizedName - The localized description for the given locale
- */
- setNameLocalization(locale, localizedName) {
- if (!this.name_localizations) {
- Reflect.set(this, "name_localizations", {});
- }
- const parsedLocale = validateLocale(locale);
- if (localizedName === null) {
- this.name_localizations[parsedLocale] = null;
- return this;
- }
- validateName2(localizedName);
- this.name_localizations[parsedLocale] = localizedName;
- return this;
- }
- /**
- * Sets the name localizations
- *
- * @param localizedNames - The dictionary of localized descriptions to set
- */
- setNameLocalizations(localizedNames) {
- if (localizedNames === null) {
- Reflect.set(this, "name_localizations", null);
- return this;
- }
- Reflect.set(this, "name_localizations", {});
- for (const args of Object.entries(localizedNames))
- this.setNameLocalization(...args);
- return this;
- }
- /**
- * Returns the final data that should be sent to Discord.
- *
- * @remarks
- * This method runs validations on the data before serializing it.
- * As such, it may throw an error if the data is invalid.
- */
- toJSON() {
- validateRequiredParameters4(this.name, this.type);
- validateLocalizationMap(this.name_localizations);
- return {
- ...this
- };
- }
-};
-__name(ContextMenuCommandBuilder, "ContextMenuCommandBuilder");
-
-// src/util/componentUtil.ts
-function embedLength(data) {
- return (data.title?.length ?? 0) + (data.description?.length ?? 0) + (data.fields?.reduce((prev, curr) => prev + curr.name.length + curr.value.length, 0) ?? 0) + (data.footer?.text.length ?? 0) + (data.author?.name.length ?? 0);
-}
-__name(embedLength, "embedLength");
-
-// src/index.ts
-__reExport(src_exports, require("@discordjs/util"), module.exports);
-var version = "[VI]{{inject}}[/VI]";
-// Annotate the CommonJS export names for ESM import in node:
-0 && (module.exports = {
- ActionRowBuilder,
- ApplicationCommandNumericOptionMinMaxValueMixin,
- ApplicationCommandOptionBase,
- ApplicationCommandOptionChannelTypesMixin,
- ApplicationCommandOptionWithChoicesAndAutocompleteMixin,
- BaseSelectMenuBuilder,
- ButtonBuilder,
- ChannelSelectMenuBuilder,
- ComponentAssertions,
- ComponentBuilder,
- ContextMenuCommandAssertions,
- ContextMenuCommandBuilder,
- EmbedAssertions,
- EmbedBuilder,
- MentionableSelectMenuBuilder,
- ModalAssertions,
- ModalBuilder,
- RoleSelectMenuBuilder,
- SelectMenuBuilder,
- SelectMenuOptionBuilder,
- SharedNameAndDescription,
- SharedSlashCommandOptions,
- SlashCommandAssertions,
- SlashCommandAttachmentOption,
- SlashCommandBooleanOption,
- SlashCommandBuilder,
- SlashCommandChannelOption,
- SlashCommandIntegerOption,
- SlashCommandMentionableOption,
- SlashCommandNumberOption,
- SlashCommandRoleOption,
- SlashCommandStringOption,
- SlashCommandSubcommandBuilder,
- SlashCommandSubcommandGroupBuilder,
- SlashCommandUserOption,
- StringSelectMenuBuilder,
- StringSelectMenuOptionBuilder,
- TextInputAssertions,
- TextInputBuilder,
- UserSelectMenuBuilder,
- createComponentBuilder,
- disableValidators,
- embedLength,
- enableValidators,
- isValidationEnabled,
- normalizeArray,
- version
-});
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/index.js.map b/node_modules/@discordjs/builders/dist/index.js.map
deleted file mode 100644
index 423fbbe..0000000
--- a/node_modules/@discordjs/builders/dist/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../src/index.ts","../src/messages/embed/Assertions.ts","../src/util/validation.ts","../src/util/normalizeArray.ts","../src/messages/embed/Embed.ts","../src/components/Assertions.ts","../src/components/selectMenu/StringSelectMenuOption.ts","../src/components/ActionRow.ts","../src/components/Component.ts","../src/components/Components.ts","../src/components/button/Button.ts","../src/components/selectMenu/ChannelSelectMenu.ts","../src/components/selectMenu/BaseSelectMenu.ts","../src/components/selectMenu/MentionableSelectMenu.ts","../src/components/selectMenu/RoleSelectMenu.ts","../src/components/selectMenu/StringSelectMenu.ts","../src/components/selectMenu/UserSelectMenu.ts","../src/components/textInput/TextInput.ts","../src/components/textInput/Assertions.ts","../src/interactions/modals/Assertions.ts","../src/interactions/modals/Modal.ts","../src/interactions/slashCommands/Assertions.ts","../src/interactions/slashCommands/SlashCommandBuilder.ts","../src/interactions/slashCommands/SlashCommandSubcommands.ts","../src/interactions/slashCommands/mixins/NameAndDescription.ts","../src/interactions/slashCommands/options/attachment.ts","../src/interactions/slashCommands/mixins/ApplicationCommandOptionBase.ts","../src/interactions/slashCommands/options/boolean.ts","../src/interactions/slashCommands/options/channel.ts","../src/interactions/slashCommands/mixins/ApplicationCommandOptionChannelTypesMixin.ts","../src/interactions/slashCommands/options/integer.ts","../src/interactions/slashCommands/mixins/ApplicationCommandNumericOptionMinMaxValueMixin.ts","../src/interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin.ts","../src/interactions/slashCommands/options/mentionable.ts","../src/interactions/slashCommands/options/number.ts","../src/interactions/slashCommands/options/role.ts","../src/interactions/slashCommands/options/string.ts","../src/interactions/slashCommands/options/user.ts","../src/interactions/slashCommands/mixins/SharedSlashCommandOptions.ts","../src/interactions/contextMenuCommands/Assertions.ts","../src/interactions/contextMenuCommands/ContextMenuCommandBuilder.ts","../src/util/componentUtil.ts"],"sourcesContent":["export * as EmbedAssertions from './messages/embed/Assertions.js';\nexport * from './messages/embed/Embed.js';\n// TODO: Consider removing this dep in the next major version\nexport * from '@discordjs/formatters';\n\nexport * as ComponentAssertions from './components/Assertions.js';\nexport * from './components/ActionRow.js';\nexport * from './components/button/Button.js';\nexport * from './components/Component.js';\nexport * from './components/Components.js';\nexport * from './components/textInput/TextInput.js';\nexport * as TextInputAssertions from './components/textInput/Assertions.js';\nexport * from './interactions/modals/Modal.js';\nexport * as ModalAssertions from './interactions/modals/Assertions.js';\n\nexport * from './components/selectMenu/BaseSelectMenu.js';\nexport * from './components/selectMenu/ChannelSelectMenu.js';\nexport * from './components/selectMenu/MentionableSelectMenu.js';\nexport * from './components/selectMenu/RoleSelectMenu.js';\nexport * from './components/selectMenu/StringSelectMenu.js';\n// TODO: Remove those aliases in v2\nexport {\n\t/**\n\t * @deprecated Will be removed in the next major version, use {@link StringSelectMenuBuilder} instead.\n\t */\n\tStringSelectMenuBuilder as SelectMenuBuilder,\n} from './components/selectMenu/StringSelectMenu.js';\nexport {\n\t/**\n\t * @deprecated Will be removed in the next major version, use {@link StringSelectMenuOptionBuilder} instead.\n\t */\n\tStringSelectMenuOptionBuilder as SelectMenuOptionBuilder,\n} from './components/selectMenu/StringSelectMenuOption.js';\nexport * from './components/selectMenu/StringSelectMenuOption.js';\nexport * from './components/selectMenu/UserSelectMenu.js';\n\nexport * as SlashCommandAssertions from './interactions/slashCommands/Assertions.js';\nexport * from './interactions/slashCommands/SlashCommandBuilder.js';\nexport * from './interactions/slashCommands/SlashCommandSubcommands.js';\nexport * from './interactions/slashCommands/options/boolean.js';\nexport * from './interactions/slashCommands/options/channel.js';\nexport * from './interactions/slashCommands/options/integer.js';\nexport * from './interactions/slashCommands/options/mentionable.js';\nexport * from './interactions/slashCommands/options/number.js';\nexport * from './interactions/slashCommands/options/role.js';\nexport * from './interactions/slashCommands/options/attachment.js';\nexport * from './interactions/slashCommands/options/string.js';\nexport * from './interactions/slashCommands/options/user.js';\nexport * from './interactions/slashCommands/mixins/ApplicationCommandNumericOptionMinMaxValueMixin.js';\nexport * from './interactions/slashCommands/mixins/ApplicationCommandOptionBase.js';\nexport * from './interactions/slashCommands/mixins/ApplicationCommandOptionChannelTypesMixin.js';\nexport * from './interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin.js';\nexport * from './interactions/slashCommands/mixins/NameAndDescription.js';\nexport * from './interactions/slashCommands/mixins/SharedSlashCommandOptions.js';\n\nexport * as ContextMenuCommandAssertions from './interactions/contextMenuCommands/Assertions.js';\nexport * from './interactions/contextMenuCommands/ContextMenuCommandBuilder.js';\n\nexport * from './util/componentUtil.js';\nexport * from './util/normalizeArray.js';\nexport * from './util/validation.js';\nexport * from '@discordjs/util';\n\n/**\n * The {@link https://github.com/discordjs/discord.js/blob/main/packages/builders/#readme | @discordjs/builders} version\n * that you are currently using.\n */\n// This needs to explicitly be `string` so it is not typed as a \"const string\" that gets injected by esbuild\nexport const version = '[VI]{{inject}}[/VI]' as string;\n","import { s } from '@sapphire/shapeshift';\nimport type { APIEmbedField } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\n\nexport const fieldNamePredicate = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(256)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const fieldValuePredicate = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(1_024)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const fieldInlinePredicate = s.boolean.optional;\n\nexport const embedFieldPredicate = s\n\t.object({\n\t\tname: fieldNamePredicate,\n\t\tvalue: fieldValuePredicate,\n\t\tinline: fieldInlinePredicate,\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const embedFieldsArrayPredicate = embedFieldPredicate.array.setValidationEnabled(isValidationEnabled);\n\nexport const fieldLengthPredicate = s.number.lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);\n\nexport function validateFieldLength(amountAdding: number, fields?: APIEmbedField[]): void {\n\tfieldLengthPredicate.parse((fields?.length ?? 0) + amountAdding);\n}\n\nexport const authorNamePredicate = fieldNamePredicate.nullable.setValidationEnabled(isValidationEnabled);\n\nexport const imageURLPredicate = s.string\n\t.url({\n\t\tallowedProtocols: ['http:', 'https:', 'attachment:'],\n\t})\n\t.nullish.setValidationEnabled(isValidationEnabled);\n\nexport const urlPredicate = s.string\n\t.url({\n\t\tallowedProtocols: ['http:', 'https:'],\n\t})\n\t.nullish.setValidationEnabled(isValidationEnabled);\n\nexport const embedAuthorPredicate = s\n\t.object({\n\t\tname: authorNamePredicate,\n\t\ticonURL: imageURLPredicate,\n\t\turl: urlPredicate,\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const RGBPredicate = s.number.int\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(255)\n\t.setValidationEnabled(isValidationEnabled);\nexport const colorPredicate = s.number.int\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(0xffffff)\n\t.or(s.tuple([RGBPredicate, RGBPredicate, RGBPredicate]))\n\t.nullable.setValidationEnabled(isValidationEnabled);\n\nexport const descriptionPredicate = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(4_096)\n\t.nullable.setValidationEnabled(isValidationEnabled);\n\nexport const footerTextPredicate = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(2_048)\n\t.nullable.setValidationEnabled(isValidationEnabled);\n\nexport const embedFooterPredicate = s\n\t.object({\n\t\ttext: footerTextPredicate,\n\t\ticonURL: imageURLPredicate,\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const timestampPredicate = s.union(s.number, s.date).nullable.setValidationEnabled(isValidationEnabled);\n\nexport const titlePredicate = fieldNamePredicate.nullable.setValidationEnabled(isValidationEnabled);\n","let validate = true;\n\nexport const enableValidators = () => (validate = true);\nexport const disableValidators = () => (validate = false);\nexport const isValidationEnabled = () => validate;\n","export function normalizeArray(arr: RestOrArray): T[] {\n\tif (Array.isArray(arr[0])) return arr[0];\n\treturn arr as T[];\n}\n\nexport type RestOrArray = T[] | [T[]];\n","import type { APIEmbed, APIEmbedAuthor, APIEmbedField, APIEmbedFooter, APIEmbedImage } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport {\n\tcolorPredicate,\n\tdescriptionPredicate,\n\tembedAuthorPredicate,\n\tembedFieldsArrayPredicate,\n\tembedFooterPredicate,\n\timageURLPredicate,\n\ttimestampPredicate,\n\ttitlePredicate,\n\turlPredicate,\n\tvalidateFieldLength,\n} from './Assertions.js';\n\nexport type RGBTuple = [red: number, green: number, blue: number];\n\nexport interface IconData {\n\t/**\n\t * The URL of the icon\n\t */\n\ticonURL?: string;\n\t/**\n\t * The proxy URL of the icon\n\t */\n\tproxyIconURL?: string;\n}\n\nexport type EmbedAuthorData = IconData & Omit;\n\nexport type EmbedAuthorOptions = Omit;\n\nexport type EmbedFooterData = IconData & Omit;\n\nexport type EmbedFooterOptions = Omit;\n\nexport interface EmbedImageData extends Omit {\n\t/**\n\t * The proxy URL for the image\n\t */\n\tproxyURL?: string;\n}\n/**\n * Represents a embed in a message (image/video preview, rich embed, etc.)\n */\nexport class EmbedBuilder {\n\tpublic readonly data: APIEmbed;\n\n\tpublic constructor(data: APIEmbed = {}) {\n\t\tthis.data = { ...data };\n\t\tif (data.timestamp) this.data.timestamp = new Date(data.timestamp).toISOString();\n\t}\n\n\t/**\n\t * Appends fields to the embed\n\t *\n\t * @remarks\n\t * This method accepts either an array of fields or a variable number of field parameters.\n\t * The maximum amount of fields that can be added is 25.\n\t * @example\n\t * Using an array\n\t * ```ts\n\t * const fields: APIEmbedField[] = ...;\n\t * const embed = new EmbedBuilder()\n\t * \t.addFields(fields);\n\t * ```\n\t * @example\n\t * Using rest parameters (variadic)\n\t * ```ts\n\t * const embed = new EmbedBuilder()\n\t * \t.addFields(\n\t * \t\t{ name: 'Field 1', value: 'Value 1' },\n\t * \t\t{ name: 'Field 2', value: 'Value 2' },\n\t * \t);\n\t * ```\n\t * @param fields - The fields to add\n\t */\n\tpublic addFields(...fields: RestOrArray): this {\n\t\t// eslint-disable-next-line no-param-reassign\n\t\tfields = normalizeArray(fields);\n\t\t// Ensure adding these fields won't exceed the 25 field limit\n\t\tvalidateFieldLength(fields.length, this.data.fields);\n\n\t\t// Data assertions\n\t\tembedFieldsArrayPredicate.parse(fields);\n\n\t\tif (this.data.fields) this.data.fields.push(...fields);\n\t\telse this.data.fields = fields;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts fields in the embed.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice}.\n\t * The maximum amount of fields that can be added is 25.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing fields of an embed.\n\t * @example\n\t * Remove the first field\n\t * ```ts\n\t * embed.spliceFields(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n fields\n\t * ```ts\n\t * const n = 4\n\t * embed.spliceFields(0, n);\n\t * ```\n\t * @example\n\t * Remove the last field\n\t * ```ts\n\t * embed.spliceFields(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of fields to remove\n\t * @param fields - The replacing field objects\n\t */\n\tpublic spliceFields(index: number, deleteCount: number, ...fields: APIEmbedField[]): this {\n\t\t// Ensure adding these fields won't exceed the 25 field limit\n\t\tvalidateFieldLength(fields.length - deleteCount, this.data.fields);\n\n\t\t// Data assertions\n\t\tembedFieldsArrayPredicate.parse(fields);\n\t\tif (this.data.fields) this.data.fields.splice(index, deleteCount, ...fields);\n\t\telse this.data.fields = fields;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the embed's fields\n\t *\n\t * @remarks\n\t * This method is an alias for {@link EmbedBuilder.spliceFields}. More specifically,\n\t * it splices the entire array of fields, replacing them with the provided fields.\n\t *\n\t * You can set a maximum of 25 fields.\n\t * @param fields - The fields to set\n\t */\n\tpublic setFields(...fields: RestOrArray) {\n\t\tthis.spliceFields(0, this.data.fields?.length ?? 0, ...normalizeArray(fields));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the author of this embed\n\t *\n\t * @param options - The options for the author\n\t */\n\n\tpublic setAuthor(options: EmbedAuthorOptions | null): this {\n\t\tif (options === null) {\n\t\t\tthis.data.author = undefined;\n\t\t\treturn this;\n\t\t}\n\n\t\t// Data assertions\n\t\tembedAuthorPredicate.parse(options);\n\n\t\tthis.data.author = { name: options.name, url: options.url, icon_url: options.iconURL };\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the color of this embed\n\t *\n\t * @param color - The color of the embed\n\t */\n\tpublic setColor(color: RGBTuple | number | null): this {\n\t\t// Data assertions\n\t\tcolorPredicate.parse(color);\n\n\t\tif (Array.isArray(color)) {\n\t\t\tconst [red, green, blue] = color;\n\t\t\tthis.data.color = (red << 16) + (green << 8) + blue;\n\t\t\treturn this;\n\t\t}\n\n\t\tthis.data.color = color ?? undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description of this embed\n\t *\n\t * @param description - The description\n\t */\n\tpublic setDescription(description: string | null): this {\n\t\t// Data assertions\n\t\tdescriptionPredicate.parse(description);\n\n\t\tthis.data.description = description ?? undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the footer of this embed\n\t *\n\t * @param options - The options for the footer\n\t */\n\tpublic setFooter(options: EmbedFooterOptions | null): this {\n\t\tif (options === null) {\n\t\t\tthis.data.footer = undefined;\n\t\t\treturn this;\n\t\t}\n\n\t\t// Data assertions\n\t\tembedFooterPredicate.parse(options);\n\n\t\tthis.data.footer = { text: options.text, icon_url: options.iconURL };\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the image of this embed\n\t *\n\t * @param url - The URL of the image\n\t */\n\tpublic setImage(url: string | null): this {\n\t\t// Data assertions\n\t\timageURLPredicate.parse(url);\n\n\t\tthis.data.image = url ? { url } : undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the thumbnail of this embed\n\t *\n\t * @param url - The URL of the thumbnail\n\t */\n\tpublic setThumbnail(url: string | null): this {\n\t\t// Data assertions\n\t\timageURLPredicate.parse(url);\n\n\t\tthis.data.thumbnail = url ? { url } : undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the timestamp of this embed\n\t *\n\t * @param timestamp - The timestamp or date\n\t */\n\tpublic setTimestamp(timestamp: Date | number | null = Date.now()): this {\n\t\t// Data assertions\n\t\ttimestampPredicate.parse(timestamp);\n\n\t\tthis.data.timestamp = timestamp ? new Date(timestamp).toISOString() : undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the title of this embed\n\t *\n\t * @param title - The title\n\t */\n\tpublic setTitle(title: string | null): this {\n\t\t// Data assertions\n\t\ttitlePredicate.parse(title);\n\n\t\tthis.data.title = title ?? undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the URL of this embed\n\t *\n\t * @param url - The URL\n\t */\n\tpublic setURL(url: string | null): this {\n\t\t// Data assertions\n\t\turlPredicate.parse(url);\n\n\t\tthis.data.url = url ?? undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Transforms the embed to a plain object\n\t */\n\tpublic toJSON(): APIEmbed {\n\t\treturn { ...this.data };\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ButtonStyle, ChannelType, type APIMessageComponentEmoji } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../util/validation.js';\nimport { StringSelectMenuOptionBuilder } from './selectMenu/StringSelectMenuOption.js';\n\nexport const customIdValidator = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(100)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const emojiValidator = s\n\t.object({\n\t\tid: s.string,\n\t\tname: s.string,\n\t\tanimated: s.boolean,\n\t})\n\t.partial.strict.setValidationEnabled(isValidationEnabled);\n\nexport const disabledValidator = s.boolean;\n\nexport const buttonLabelValidator = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(80)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const buttonStyleValidator = s.nativeEnum(ButtonStyle);\n\nexport const placeholderValidator = s.string.lengthLessThanOrEqual(150).setValidationEnabled(isValidationEnabled);\nexport const minMaxValidator = s.number.int\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(25)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const labelValueDescriptionValidator = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(100)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const jsonOptionValidator = s\n\t.object({\n\t\tlabel: labelValueDescriptionValidator,\n\t\tvalue: labelValueDescriptionValidator,\n\t\tdescription: labelValueDescriptionValidator.optional,\n\t\temoji: emojiValidator.optional,\n\t\tdefault: s.boolean.optional,\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const optionValidator = s.instance(StringSelectMenuOptionBuilder).setValidationEnabled(isValidationEnabled);\n\nexport const optionsValidator = optionValidator.array\n\t.lengthGreaterThanOrEqual(0)\n\t.setValidationEnabled(isValidationEnabled);\nexport const optionsLengthValidator = s.number.int\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(25)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateRequiredSelectMenuParameters(options: StringSelectMenuOptionBuilder[], customId?: string) {\n\tcustomIdValidator.parse(customId);\n\toptionsValidator.parse(options);\n}\n\nexport const defaultValidator = s.boolean;\n\nexport function validateRequiredSelectMenuOptionParameters(label?: string, value?: string) {\n\tlabelValueDescriptionValidator.parse(label);\n\tlabelValueDescriptionValidator.parse(value);\n}\n\nexport const channelTypesValidator = s.nativeEnum(ChannelType).array.setValidationEnabled(isValidationEnabled);\n\nexport const urlValidator = s.string\n\t.url({\n\t\tallowedProtocols: ['http:', 'https:', 'discord:'],\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateRequiredButtonParameters(\n\tstyle?: ButtonStyle,\n\tlabel?: string,\n\temoji?: APIMessageComponentEmoji,\n\tcustomId?: string,\n\turl?: string,\n) {\n\tif (url && customId) {\n\t\tthrow new RangeError('URL and custom id are mutually exclusive');\n\t}\n\n\tif (!label && !emoji) {\n\t\tthrow new RangeError('Buttons must have a label and/or an emoji');\n\t}\n\n\tif (style === ButtonStyle.Link) {\n\t\tif (!url) {\n\t\t\tthrow new RangeError('Link buttons must have a url');\n\t\t}\n\t} else if (url) {\n\t\tthrow new RangeError('Non-link buttons cannot have a url');\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APIMessageComponentEmoji, APISelectMenuOption } from 'discord-api-types/v10';\nimport {\n\tdefaultValidator,\n\temojiValidator,\n\tlabelValueDescriptionValidator,\n\tvalidateRequiredSelectMenuOptionParameters,\n} from '../Assertions.js';\n\n/**\n * Represents an option within a string select menu component\n */\nexport class StringSelectMenuOptionBuilder implements JSONEncodable {\n\t/**\n\t * Creates a new string select menu option from API data\n\t *\n\t * @param data - The API data to create this string select menu option with\n\t * @example\n\t * Creating a string select menu option from an API data object\n\t * ```ts\n\t * const selectMenuOption = new SelectMenuOptionBuilder({\n\t * \tlabel: 'catchy label',\n\t * \tvalue: '1',\n\t * });\n\t * ```\n\t * @example\n\t * Creating a string select menu option using setters and API data\n\t * ```ts\n\t * const selectMenuOption = new SelectMenuOptionBuilder({\n\t * \tdefault: true,\n\t * \tvalue: '1',\n\t * })\n\t * \t.setLabel('woah')\n\t * ```\n\t */\n\tpublic constructor(public data: Partial = {}) {}\n\n\t/**\n\t * Sets the label of this option\n\t *\n\t * @param label - The label to show on this option\n\t */\n\tpublic setLabel(label: string) {\n\t\tthis.data.label = labelValueDescriptionValidator.parse(label);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the value of this option\n\t *\n\t * @param value - The value of this option\n\t */\n\tpublic setValue(value: string) {\n\t\tthis.data.value = labelValueDescriptionValidator.parse(value);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description of this option\n\t *\n\t * @param description - The description of this option\n\t */\n\tpublic setDescription(description: string) {\n\t\tthis.data.description = labelValueDescriptionValidator.parse(description);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this option is selected by default\n\t *\n\t * @param isDefault - Whether this option is selected by default\n\t */\n\tpublic setDefault(isDefault = true) {\n\t\tthis.data.default = defaultValidator.parse(isDefault);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the emoji to display on this option\n\t *\n\t * @param emoji - The emoji to display on this option\n\t */\n\tpublic setEmoji(emoji: APIMessageComponentEmoji) {\n\t\tthis.data.emoji = emojiValidator.parse(emoji);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APISelectMenuOption {\n\t\tvalidateRequiredSelectMenuOptionParameters(this.data.label, this.data.value);\n\n\t\treturn {\n\t\t\t...this.data,\n\t\t} as APISelectMenuOption;\n\t}\n}\n","/* eslint-disable jsdoc/check-param-names */\n\nimport {\n\ttype APIActionRowComponent,\n\tComponentType,\n\ttype APIMessageActionRowComponent,\n\ttype APIModalActionRowComponent,\n\ttype APIActionRowComponentTypes,\n} from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../util/normalizeArray.js';\nimport { ComponentBuilder } from './Component.js';\nimport { createComponentBuilder } from './Components.js';\nimport type { ButtonBuilder } from './button/Button.js';\nimport type { ChannelSelectMenuBuilder } from './selectMenu/ChannelSelectMenu.js';\nimport type { MentionableSelectMenuBuilder } from './selectMenu/MentionableSelectMenu.js';\nimport type { RoleSelectMenuBuilder } from './selectMenu/RoleSelectMenu.js';\nimport type { StringSelectMenuBuilder } from './selectMenu/StringSelectMenu.js';\nimport type { UserSelectMenuBuilder } from './selectMenu/UserSelectMenu.js';\nimport type { TextInputBuilder } from './textInput/TextInput.js';\n\nexport type MessageComponentBuilder =\n\t| ActionRowBuilder\n\t| MessageActionRowComponentBuilder;\nexport type ModalComponentBuilder = ActionRowBuilder | ModalActionRowComponentBuilder;\nexport type MessageActionRowComponentBuilder =\n\t| ButtonBuilder\n\t| ChannelSelectMenuBuilder\n\t| MentionableSelectMenuBuilder\n\t| RoleSelectMenuBuilder\n\t| StringSelectMenuBuilder\n\t| UserSelectMenuBuilder;\nexport type ModalActionRowComponentBuilder = TextInputBuilder;\nexport type AnyComponentBuilder = MessageActionRowComponentBuilder | ModalActionRowComponentBuilder;\n\n/**\n * Represents an action row component\n *\n * @typeParam T - The types of components this action row holds\n */\nexport class ActionRowBuilder extends ComponentBuilder<\n\tAPIActionRowComponent\n> {\n\t/**\n\t * The components within this action row\n\t */\n\tpublic readonly components: T[];\n\n\t/**\n\t * Creates a new action row from API data\n\t *\n\t * @param data - The API data to create this action row with\n\t * @example\n\t * Creating an action row from an API data object\n\t * ```ts\n\t * const actionRow = new ActionRowBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcustom_id: \"custom id\",\n\t * \t\t\tlabel: \"Type something\",\n\t * \t\t\tstyle: TextInputStyle.Short,\n\t * \t\t\ttype: ComponentType.TextInput,\n\t * \t\t},\n\t * \t],\n\t * });\n\t * ```\n\t * @example\n\t * Creating an action row using setters and API data\n\t * ```ts\n\t * const actionRow = new ActionRowBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcustom_id: \"custom id\",\n\t * \t\t\tlabel: \"Click me\",\n\t * \t\t\tstyle: ButtonStyle.Primary,\n\t * \t\t\ttype: ComponentType.Button,\n\t * \t\t},\n\t * \t],\n\t * })\n\t * \t.addComponents(button2, button3);\n\t * ```\n\t */\n\tpublic constructor({ components, ...data }: Partial> = {}) {\n\t\tsuper({ type: ComponentType.ActionRow, ...data });\n\t\tthis.components = (components?.map((component) => createComponentBuilder(component)) ?? []) as T[];\n\t}\n\n\t/**\n\t * Adds components to this action row.\n\t *\n\t * @param components - The components to add to this action row.\n\t */\n\tpublic addComponents(...components: RestOrArray) {\n\t\tthis.components.push(...normalizeArray(components));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the components in this action row\n\t *\n\t * @param components - The components to set this row to\n\t */\n\tpublic setComponents(...components: RestOrArray) {\n\t\tthis.components.splice(0, this.components.length, ...normalizeArray(components));\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APIActionRowComponent> {\n\t\treturn {\n\t\t\t...this.data,\n\t\t\tcomponents: this.components.map((component) => component.toJSON()),\n\t\t} as APIActionRowComponent>;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type {\n\tAPIActionRowComponent,\n\tAPIActionRowComponentTypes,\n\tAPIBaseComponent,\n\tComponentType,\n} from 'discord-api-types/v10';\n\nexport type AnyAPIActionRowComponent = APIActionRowComponent | APIActionRowComponentTypes;\n\n/**\n * Represents a discord component\n *\n * @typeParam DataType - The type of internal API data that is stored within the component\n */\nexport abstract class ComponentBuilder<\n\tDataType extends Partial> = APIBaseComponent,\n> implements JSONEncodable\n{\n\t/**\n\t * The API data associated with this component\n\t */\n\tpublic readonly data: Partial;\n\n\t/**\n\t * Serializes this component to an API-compatible JSON object\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic abstract toJSON(): AnyAPIActionRowComponent;\n\n\tpublic constructor(data: Partial) {\n\t\tthis.data = data;\n\t}\n}\n","import { ComponentType, type APIMessageComponent, type APIModalComponent } from 'discord-api-types/v10';\nimport {\n\tActionRowBuilder,\n\ttype AnyComponentBuilder,\n\ttype MessageComponentBuilder,\n\ttype ModalComponentBuilder,\n} from './ActionRow.js';\nimport { ComponentBuilder } from './Component.js';\nimport { ButtonBuilder } from './button/Button.js';\nimport { ChannelSelectMenuBuilder } from './selectMenu/ChannelSelectMenu.js';\nimport { MentionableSelectMenuBuilder } from './selectMenu/MentionableSelectMenu.js';\nimport { RoleSelectMenuBuilder } from './selectMenu/RoleSelectMenu.js';\nimport { StringSelectMenuBuilder } from './selectMenu/StringSelectMenu.js';\nimport { UserSelectMenuBuilder } from './selectMenu/UserSelectMenu.js';\nimport { TextInputBuilder } from './textInput/TextInput.js';\n\nexport interface MappedComponentTypes {\n\t[ComponentType.ActionRow]: ActionRowBuilder;\n\t[ComponentType.Button]: ButtonBuilder;\n\t[ComponentType.StringSelect]: StringSelectMenuBuilder;\n\t[ComponentType.TextInput]: TextInputBuilder;\n\t[ComponentType.UserSelect]: UserSelectMenuBuilder;\n\t[ComponentType.RoleSelect]: RoleSelectMenuBuilder;\n\t[ComponentType.MentionableSelect]: MentionableSelectMenuBuilder;\n\t[ComponentType.ChannelSelect]: ChannelSelectMenuBuilder;\n}\n\n/**\n * Factory for creating components from API data\n *\n * @param data - The api data to transform to a component class\n */\nexport function createComponentBuilder(\n\t// eslint-disable-next-line @typescript-eslint/sort-type-union-intersection-members\n\tdata: (APIModalComponent | APIMessageComponent) & { type: T },\n): MappedComponentTypes[T];\nexport function createComponentBuilder(data: C): C;\nexport function createComponentBuilder(\n\tdata: APIMessageComponent | APIModalComponent | MessageComponentBuilder,\n): ComponentBuilder {\n\tif (data instanceof ComponentBuilder) {\n\t\treturn data;\n\t}\n\n\tswitch (data.type) {\n\t\tcase ComponentType.ActionRow:\n\t\t\treturn new ActionRowBuilder(data);\n\t\tcase ComponentType.Button:\n\t\t\treturn new ButtonBuilder(data);\n\t\tcase ComponentType.StringSelect:\n\t\t\treturn new StringSelectMenuBuilder(data);\n\t\tcase ComponentType.TextInput:\n\t\t\treturn new TextInputBuilder(data);\n\t\tcase ComponentType.UserSelect:\n\t\t\treturn new UserSelectMenuBuilder(data);\n\t\tcase ComponentType.RoleSelect:\n\t\t\treturn new RoleSelectMenuBuilder(data);\n\t\tcase ComponentType.MentionableSelect:\n\t\t\treturn new MentionableSelectMenuBuilder(data);\n\t\tcase ComponentType.ChannelSelect:\n\t\t\treturn new ChannelSelectMenuBuilder(data);\n\t\tdefault:\n\t\t\t// @ts-expect-error: This case can still occur if we get a newer unsupported component type\n\t\t\tthrow new Error(`Cannot properly serialize component type: ${data.type}`);\n\t}\n}\n","import {\n\tComponentType,\n\ttype APIMessageComponentEmoji,\n\ttype APIButtonComponent,\n\ttype APIButtonComponentWithURL,\n\ttype APIButtonComponentWithCustomId,\n\ttype ButtonStyle,\n} from 'discord-api-types/v10';\nimport {\n\tbuttonLabelValidator,\n\tbuttonStyleValidator,\n\tcustomIdValidator,\n\tdisabledValidator,\n\temojiValidator,\n\turlValidator,\n\tvalidateRequiredButtonParameters,\n} from '../Assertions.js';\nimport { ComponentBuilder } from '../Component.js';\n\n/**\n * Represents a button component\n */\nexport class ButtonBuilder extends ComponentBuilder {\n\t/**\n\t * Creates a new button from API data\n\t *\n\t * @param data - The API data to create this button with\n\t * @example\n\t * Creating a button from an API data object\n\t * ```ts\n\t * const button = new ButtonBuilder({\n\t * \tcustom_id: 'a cool button',\n\t * \tstyle: ButtonStyle.Primary,\n\t * \tlabel: 'Click Me',\n\t * \temoji: {\n\t * \t\tname: 'smile',\n\t * \t\tid: '123456789012345678',\n\t * \t},\n\t * });\n\t * ```\n\t * @example\n\t * Creating a button using setters and API data\n\t * ```ts\n\t * const button = new ButtonBuilder({\n\t * \tstyle: ButtonStyle.Secondary,\n\t * \tlabel: 'Click Me',\n\t * })\n\t * \t.setEmoji({ name: '🙂' })\n\t * \t.setCustomId('another cool button');\n\t * ```\n\t */\n\tpublic constructor(data?: Partial) {\n\t\tsuper({ type: ComponentType.Button, ...data });\n\t}\n\n\t/**\n\t * Sets the style of this button\n\t *\n\t * @param style - The style of the button\n\t */\n\tpublic setStyle(style: ButtonStyle) {\n\t\tthis.data.style = buttonStyleValidator.parse(style);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the URL for this button\n\t *\n\t * @remarks\n\t * This method is only available to buttons using the `Link` button style.\n\t * Only three types of URL schemes are currently supported: `https://`, `http://` and `discord://`\n\t * @param url - The URL to open when this button is clicked\n\t */\n\tpublic setURL(url: string) {\n\t\t(this.data as APIButtonComponentWithURL).url = urlValidator.parse(url);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the custom id for this button\n\t *\n\t * @remarks\n\t * This method is only applicable to buttons that are not using the `Link` button style.\n\t * @param customId - The custom id to use for this button\n\t */\n\tpublic setCustomId(customId: string) {\n\t\t(this.data as APIButtonComponentWithCustomId).custom_id = customIdValidator.parse(customId);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the emoji to display on this button\n\t *\n\t * @param emoji - The emoji to display on this button\n\t */\n\tpublic setEmoji(emoji: APIMessageComponentEmoji) {\n\t\tthis.data.emoji = emojiValidator.parse(emoji);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this button is disabled\n\t *\n\t * @param disabled - Whether to disable this button\n\t */\n\tpublic setDisabled(disabled = true) {\n\t\tthis.data.disabled = disabledValidator.parse(disabled);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the label for this button\n\t *\n\t * @param label - The label to display on this button\n\t */\n\tpublic setLabel(label: string) {\n\t\tthis.data.label = buttonLabelValidator.parse(label);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APIButtonComponent {\n\t\tvalidateRequiredButtonParameters(\n\t\t\tthis.data.style,\n\t\t\tthis.data.label,\n\t\t\tthis.data.emoji,\n\t\t\t(this.data as APIButtonComponentWithCustomId).custom_id,\n\t\t\t(this.data as APIButtonComponentWithURL).url,\n\t\t);\n\n\t\treturn {\n\t\t\t...this.data,\n\t\t} as APIButtonComponent;\n\t}\n}\n","import type { APIChannelSelectComponent, ChannelType } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { channelTypesValidator, customIdValidator } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\nexport class ChannelSelectMenuBuilder extends BaseSelectMenuBuilder {\n\t/**\n\t * Creates a new select menu from API data\n\t *\n\t * @param data - The API data to create this select menu with\n\t * @example\n\t * Creating a select menu from an API data object\n\t * ```ts\n\t * const selectMenu = new ChannelSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data\n\t * ```ts\n\t * const selectMenu = new ChannelSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.addChannelTypes(ChannelType.GuildText, ChannelType.GuildAnnouncement)\n\t * \t.setMinValues(2)\n\t * ```\n\t */\n\tpublic constructor(data?: Partial) {\n\t\tsuper({ ...data, type: ComponentType.ChannelSelect });\n\t}\n\n\tpublic addChannelTypes(...types: RestOrArray) {\n\t\t// eslint-disable-next-line no-param-reassign\n\t\ttypes = normalizeArray(types);\n\n\t\tthis.data.channel_types ??= [];\n\t\tthis.data.channel_types.push(...channelTypesValidator.parse(types));\n\t\treturn this;\n\t}\n\n\tpublic setChannelTypes(...types: RestOrArray) {\n\t\t// eslint-disable-next-line no-param-reassign\n\t\ttypes = normalizeArray(types);\n\n\t\tthis.data.channel_types ??= [];\n\t\tthis.data.channel_types.splice(0, this.data.channel_types.length, ...channelTypesValidator.parse(types));\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(): APIChannelSelectComponent {\n\t\tcustomIdValidator.parse(this.data.custom_id);\n\n\t\treturn {\n\t\t\t...this.data,\n\t\t} as APIChannelSelectComponent;\n\t}\n}\n","import type { APISelectMenuComponent } from 'discord-api-types/v10';\nimport { customIdValidator, disabledValidator, minMaxValidator, placeholderValidator } from '../Assertions.js';\nimport { ComponentBuilder } from '../Component.js';\n\nexport class BaseSelectMenuBuilder<\n\tSelectMenuType extends APISelectMenuComponent,\n> extends ComponentBuilder {\n\t/**\n\t * Sets the placeholder for this select menu\n\t *\n\t * @param placeholder - The placeholder to use for this select menu\n\t */\n\tpublic setPlaceholder(placeholder: string) {\n\t\tthis.data.placeholder = placeholderValidator.parse(placeholder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum values that must be selected in the select menu\n\t *\n\t * @param minValues - The minimum values that must be selected\n\t */\n\tpublic setMinValues(minValues: number) {\n\t\tthis.data.min_values = minMaxValidator.parse(minValues);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the maximum values that must be selected in the select menu\n\t *\n\t * @param maxValues - The maximum values that must be selected\n\t */\n\tpublic setMaxValues(maxValues: number) {\n\t\tthis.data.max_values = minMaxValidator.parse(maxValues);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the custom id for this select menu\n\t *\n\t * @param customId - The custom id to use for this select menu\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customIdValidator.parse(customId);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this select menu is disabled\n\t *\n\t * @param disabled - Whether this select menu is disabled\n\t */\n\tpublic setDisabled(disabled = true) {\n\t\tthis.data.disabled = disabledValidator.parse(disabled);\n\t\treturn this;\n\t}\n\n\tpublic toJSON(): SelectMenuType {\n\t\tcustomIdValidator.parse(this.data.custom_id);\n\t\treturn {\n\t\t\t...this.data,\n\t\t} as SelectMenuType;\n\t}\n}\n","import type { APIMentionableSelectComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\nexport class MentionableSelectMenuBuilder extends BaseSelectMenuBuilder {\n\t/**\n\t * Creates a new select menu from API data\n\t *\n\t * @param data - The API data to create this select menu with\n\t * @example\n\t * Creating a select menu from an API data object\n\t * ```ts\n\t * const selectMenu = new MentionableSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data\n\t * ```ts\n\t * const selectMenu = new MentionableSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.setMinValues(1)\n\t * ```\n\t */\n\tpublic constructor(data?: Partial) {\n\t\tsuper({ ...data, type: ComponentType.MentionableSelect });\n\t}\n}\n","import type { APIRoleSelectComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\nexport class RoleSelectMenuBuilder extends BaseSelectMenuBuilder {\n\t/**\n\t * Creates a new select menu from API data\n\t *\n\t * @param data - The API data to create this select menu with\n\t * @example\n\t * Creating a select menu from an API data object\n\t * ```ts\n\t * const selectMenu = new RoleSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data\n\t * ```ts\n\t * const selectMenu = new RoleSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.setMinValues(1)\n\t * ```\n\t */\n\tpublic constructor(data?: Partial) {\n\t\tsuper({ ...data, type: ComponentType.RoleSelect });\n\t}\n}\n","import type { APIStringSelectComponent } from 'discord-api-types/v10';\nimport { ComponentType, type APISelectMenuOption } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { jsonOptionValidator, optionsLengthValidator, validateRequiredSelectMenuParameters } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\nimport { StringSelectMenuOptionBuilder } from './StringSelectMenuOption.js';\n\n/**\n * Represents a string select menu component\n */\nexport class StringSelectMenuBuilder extends BaseSelectMenuBuilder {\n\t/**\n\t * The options within this select menu\n\t */\n\tpublic readonly options: StringSelectMenuOptionBuilder[];\n\n\t/**\n\t * Creates a new select menu from API data\n\t *\n\t * @param data - The API data to create this select menu with\n\t * @example\n\t * Creating a select menu from an API data object\n\t * ```ts\n\t * const selectMenu = new StringSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * \toptions: [\n\t * \t\t{ label: 'option 1', value: '1' },\n\t * \t\t{ label: 'option 2', value: '2' },\n\t * \t\t{ label: 'option 3', value: '3' },\n\t * \t],\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data\n\t * ```ts\n\t * const selectMenu = new StringSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.setMinValues(1)\n\t * \t.addOptions({\n\t * \t\tlabel: 'Catchy',\n\t * \t\tvalue: 'catch',\n\t * \t});\n\t * ```\n\t */\n\tpublic constructor(data?: Partial) {\n\t\tconst { options, ...initData } = data ?? {};\n\t\tsuper({ ...initData, type: ComponentType.StringSelect });\n\t\tthis.options = options?.map((option: APISelectMenuOption) => new StringSelectMenuOptionBuilder(option)) ?? [];\n\t}\n\n\t/**\n\t * Adds options to this select menu\n\t *\n\t * @param options - The options to add to this select menu\n\t * @returns\n\t */\n\tpublic addOptions(...options: RestOrArray) {\n\t\t// eslint-disable-next-line no-param-reassign\n\t\toptions = normalizeArray(options);\n\t\toptionsLengthValidator.parse(this.options.length + options.length);\n\t\tthis.options.push(\n\t\t\t...options.map((option) =>\n\t\t\t\toption instanceof StringSelectMenuOptionBuilder\n\t\t\t\t\t? option\n\t\t\t\t\t: new StringSelectMenuOptionBuilder(jsonOptionValidator.parse(option)),\n\t\t\t),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the options on this select menu\n\t *\n\t * @param options - The options to set on this select menu\n\t */\n\tpublic setOptions(...options: RestOrArray) {\n\t\treturn this.spliceOptions(0, this.options.length, ...options);\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts options in the string select menu.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice | Array.prototype.splice}.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing options of a string select menu.\n\t * @example\n\t * Remove the first option\n\t * ```ts\n\t * selectMenu.spliceOptions(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n option\n\t * ```ts\n\t * const n = 4\n\t * selectMenu.spliceOptions(0, n);\n\t * ```\n\t * @example\n\t * Remove the last option\n\t * ```ts\n\t * selectMenu.spliceOptions(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of options to remove\n\t * @param options - The replacing option objects or builders\n\t */\n\tpublic spliceOptions(\n\t\tindex: number,\n\t\tdeleteCount: number,\n\t\t...options: RestOrArray\n\t) {\n\t\t// eslint-disable-next-line no-param-reassign\n\t\toptions = normalizeArray(options);\n\n\t\tconst clone = [...this.options];\n\n\t\tclone.splice(\n\t\t\tindex,\n\t\t\tdeleteCount,\n\t\t\t...options.map((option) =>\n\t\t\t\toption instanceof StringSelectMenuOptionBuilder\n\t\t\t\t\t? option\n\t\t\t\t\t: new StringSelectMenuOptionBuilder(jsonOptionValidator.parse(option)),\n\t\t\t),\n\t\t);\n\n\t\toptionsLengthValidator.parse(clone.length);\n\n\t\tthis.options.splice(0, this.options.length, ...clone);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic override toJSON(): APIStringSelectComponent {\n\t\tvalidateRequiredSelectMenuParameters(this.options, this.data.custom_id);\n\n\t\treturn {\n\t\t\t...this.data,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t} as APIStringSelectComponent;\n\t}\n}\n","import type { APIUserSelectComponent } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\nexport class UserSelectMenuBuilder extends BaseSelectMenuBuilder {\n\t/**\n\t * Creates a new select menu from API data\n\t *\n\t * @param data - The API data to create this select menu with\n\t * @example\n\t * Creating a select menu from an API data object\n\t * ```ts\n\t * const selectMenu = new UserSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data\n\t * ```ts\n\t * const selectMenu = new UserSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.setMinValues(1)\n\t * ```\n\t */\n\tpublic constructor(data?: Partial) {\n\t\tsuper({ ...data, type: ComponentType.UserSelect });\n\t}\n}\n","import { isJSONEncodable, type Equatable, type JSONEncodable } from '@discordjs/util';\nimport { ComponentType, type TextInputStyle, type APITextInputComponent } from 'discord-api-types/v10';\nimport isEqual from 'fast-deep-equal';\nimport { customIdValidator } from '../Assertions.js';\nimport { ComponentBuilder } from '../Component.js';\nimport {\n\tmaxLengthValidator,\n\tminLengthValidator,\n\tplaceholderValidator,\n\trequiredValidator,\n\tvalueValidator,\n\tvalidateRequiredParameters,\n\tlabelValidator,\n\ttextInputStyleValidator,\n} from './Assertions.js';\n\nexport class TextInputBuilder\n\textends ComponentBuilder\n\timplements Equatable>\n{\n\t/**\n\t * Creates a new text input from API data\n\t *\n\t * @param data - The API data to create this text input with\n\t * @example\n\t * Creating a select menu option from an API data object\n\t * ```ts\n\t * const textInput = new TextInputBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tlabel: 'Type something',\n\t * \tstyle: TextInputStyle.Short,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu option using setters and API data\n\t * ```ts\n\t * const textInput = new TextInputBuilder({\n\t * \tlabel: 'Type something else',\n\t * })\n\t * \t.setCustomId('woah')\n\t * \t.setStyle(TextInputStyle.Paragraph);\n\t * ```\n\t */\n\tpublic constructor(data?: APITextInputComponent & { type?: ComponentType.TextInput }) {\n\t\tsuper({ type: ComponentType.TextInput, ...data });\n\t}\n\n\t/**\n\t * Sets the custom id for this text input\n\t *\n\t * @param customId - The custom id of this text input\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customIdValidator.parse(customId);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the label for this text input\n\t *\n\t * @param label - The label for this text input\n\t */\n\tpublic setLabel(label: string) {\n\t\tthis.data.label = labelValidator.parse(label);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the style for this text input\n\t *\n\t * @param style - The style for this text input\n\t */\n\tpublic setStyle(style: TextInputStyle) {\n\t\tthis.data.style = textInputStyleValidator.parse(style);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum length of text for this text input\n\t *\n\t * @param minLength - The minimum length of text for this text input\n\t */\n\tpublic setMinLength(minLength: number) {\n\t\tthis.data.min_length = minLengthValidator.parse(minLength);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the maximum length of text for this text input\n\t *\n\t * @param maxLength - The maximum length of text for this text input\n\t */\n\tpublic setMaxLength(maxLength: number) {\n\t\tthis.data.max_length = maxLengthValidator.parse(maxLength);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the placeholder of this text input\n\t *\n\t * @param placeholder - The placeholder of this text input\n\t */\n\tpublic setPlaceholder(placeholder: string) {\n\t\tthis.data.placeholder = placeholderValidator.parse(placeholder);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the value of this text input\n\t *\n\t * @param value - The value for this text input\n\t */\n\tpublic setValue(value: string) {\n\t\tthis.data.value = valueValidator.parse(value);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this text input is required\n\t *\n\t * @param required - Whether this text input is required\n\t */\n\tpublic setRequired(required = true) {\n\t\tthis.data.required = requiredValidator.parse(required);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APITextInputComponent {\n\t\tvalidateRequiredParameters(this.data.custom_id, this.data.style, this.data.label);\n\n\t\treturn {\n\t\t\t...this.data,\n\t\t} as APITextInputComponent;\n\t}\n\n\t/**\n\t * {@inheritDoc Equatable.equals}\n\t */\n\tpublic equals(other: APITextInputComponent | JSONEncodable): boolean {\n\t\tif (isJSONEncodable(other)) {\n\t\t\treturn isEqual(other.toJSON(), this.data);\n\t\t}\n\n\t\treturn isEqual(other, this.data);\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { TextInputStyle } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\nimport { customIdValidator } from '../Assertions.js';\n\nexport const textInputStyleValidator = s.nativeEnum(TextInputStyle);\nexport const minLengthValidator = s.number.int\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(4_000)\n\t.setValidationEnabled(isValidationEnabled);\nexport const maxLengthValidator = s.number.int\n\t.greaterThanOrEqual(1)\n\t.lessThanOrEqual(4_000)\n\t.setValidationEnabled(isValidationEnabled);\nexport const requiredValidator = s.boolean;\nexport const valueValidator = s.string.lengthLessThanOrEqual(4_000).setValidationEnabled(isValidationEnabled);\nexport const placeholderValidator = s.string.lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled);\nexport const labelValidator = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(45)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateRequiredParameters(customId?: string, style?: TextInputStyle, label?: string) {\n\tcustomIdValidator.parse(customId);\n\ttextInputStyleValidator.parse(style);\n\tlabelValidator.parse(label);\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ActionRowBuilder, type ModalActionRowComponentBuilder } from '../../components/ActionRow.js';\nimport { customIdValidator } from '../../components/Assertions.js';\nimport { isValidationEnabled } from '../../util/validation.js';\n\nexport const titleValidator = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(45)\n\t.setValidationEnabled(isValidationEnabled);\nexport const componentsValidator = s\n\t.instance(ActionRowBuilder)\n\t.array.lengthGreaterThanOrEqual(1)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateRequiredParameters(\n\tcustomId?: string,\n\ttitle?: string,\n\tcomponents?: ActionRowBuilder[],\n) {\n\tcustomIdValidator.parse(customId);\n\ttitleValidator.parse(title);\n\tcomponentsValidator.parse(components);\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type {\n\tAPIActionRowComponent,\n\tAPIModalActionRowComponent,\n\tAPIModalInteractionResponseCallbackData,\n} from 'discord-api-types/v10';\nimport { ActionRowBuilder, type ModalActionRowComponentBuilder } from '../../components/ActionRow.js';\nimport { customIdValidator } from '../../components/Assertions.js';\nimport { createComponentBuilder } from '../../components/Components.js';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { titleValidator, validateRequiredParameters } from './Assertions.js';\n\nexport class ModalBuilder implements JSONEncodable {\n\tpublic readonly data: Partial;\n\n\tpublic readonly components: ActionRowBuilder[] = [];\n\n\tpublic constructor({ components, ...data }: Partial = {}) {\n\t\tthis.data = { ...data };\n\t\tthis.components = (components?.map((component) => createComponentBuilder(component)) ??\n\t\t\t[]) as ActionRowBuilder[];\n\t}\n\n\t/**\n\t * Sets the title of the modal\n\t *\n\t * @param title - The title of the modal\n\t */\n\tpublic setTitle(title: string) {\n\t\tthis.data.title = titleValidator.parse(title);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the custom id of the modal\n\t *\n\t * @param customId - The custom id of this modal\n\t */\n\tpublic setCustomId(customId: string) {\n\t\tthis.data.custom_id = customIdValidator.parse(customId);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds components to this modal\n\t *\n\t * @param components - The components to add to this modal\n\t */\n\tpublic addComponents(\n\t\t...components: RestOrArray<\n\t\t\tActionRowBuilder | APIActionRowComponent\n\t\t>\n\t) {\n\t\tthis.components.push(\n\t\t\t...normalizeArray(components).map((component) =>\n\t\t\t\tcomponent instanceof ActionRowBuilder\n\t\t\t\t\t? component\n\t\t\t\t\t: new ActionRowBuilder(component),\n\t\t\t),\n\t\t);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the components in this modal\n\t *\n\t * @param components - The components to set this modal to\n\t */\n\tpublic setComponents(...components: RestOrArray>) {\n\t\tthis.components.splice(0, this.components.length, ...normalizeArray(components));\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APIModalInteractionResponseCallbackData {\n\t\tvalidateRequiredParameters(this.data.custom_id, this.data.title, this.components);\n\n\t\treturn {\n\t\t\t...this.data,\n\t\t\tcomponents: this.components.map((component) => component.toJSON()),\n\t\t} as APIModalInteractionResponseCallbackData;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { Locale, type APIApplicationCommandOptionChoice, type LocalizationMap } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\nimport type { ToAPIApplicationCommandOptions } from './SlashCommandBuilder.js';\nimport type { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from './SlashCommandSubcommands.js';\nimport type { ApplicationCommandOptionBase } from './mixins/ApplicationCommandOptionBase.js';\n\nconst namePredicate = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(32)\n\t.regex(/^[\\p{Ll}\\p{Lm}\\p{Lo}\\p{N}\\p{sc=Devanagari}\\p{sc=Thai}_-]+$/u)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateName(name: unknown): asserts name is string {\n\tnamePredicate.parse(name);\n}\n\nconst descriptionPredicate = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(100)\n\t.setValidationEnabled(isValidationEnabled);\nconst localePredicate = s.nativeEnum(Locale);\n\nexport function validateDescription(description: unknown): asserts description is string {\n\tdescriptionPredicate.parse(description);\n}\n\nconst maxArrayLengthPredicate = s.unknown.array.lengthLessThanOrEqual(25).setValidationEnabled(isValidationEnabled);\nexport function validateLocale(locale: unknown) {\n\treturn localePredicate.parse(locale);\n}\n\nexport function validateMaxOptionsLength(options: unknown): asserts options is ToAPIApplicationCommandOptions[] {\n\tmaxArrayLengthPredicate.parse(options);\n}\n\nexport function validateRequiredParameters(\n\tname: string,\n\tdescription: string,\n\toptions: ToAPIApplicationCommandOptions[],\n) {\n\t// Assert name matches all conditions\n\tvalidateName(name);\n\n\t// Assert description conditions\n\tvalidateDescription(description);\n\n\t// Assert options conditions\n\tvalidateMaxOptionsLength(options);\n}\n\nconst booleanPredicate = s.boolean;\n\nexport function validateDefaultPermission(value: unknown): asserts value is boolean {\n\tbooleanPredicate.parse(value);\n}\n\nexport function validateRequired(required: unknown): asserts required is boolean {\n\tbooleanPredicate.parse(required);\n}\n\nconst choicesLengthPredicate = s.number.lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);\n\nexport function validateChoicesLength(amountAdding: number, choices?: APIApplicationCommandOptionChoice[]): void {\n\tchoicesLengthPredicate.parse((choices?.length ?? 0) + amountAdding);\n}\n\nexport function assertReturnOfBuilder<\n\tT extends ApplicationCommandOptionBase | SlashCommandSubcommandBuilder | SlashCommandSubcommandGroupBuilder,\n>(input: unknown, ExpectedInstanceOf: new () => T): asserts input is T {\n\ts.instance(ExpectedInstanceOf).parse(input);\n}\n\nexport const localizationMapPredicate = s\n\t.object(Object.fromEntries(Object.values(Locale).map((locale) => [locale, s.string.nullish])))\n\t.strict.nullish.setValidationEnabled(isValidationEnabled);\n\nexport function validateLocalizationMap(value: unknown): asserts value is LocalizationMap {\n\tlocalizationMapPredicate.parse(value);\n}\n\nconst dmPermissionPredicate = s.boolean.nullish;\n\nexport function validateDMPermission(value: unknown): asserts value is boolean | null | undefined {\n\tdmPermissionPredicate.parse(value);\n}\n\nconst memberPermissionPredicate = s.union(\n\ts.bigint.transform((value) => value.toString()),\n\ts.number.safeInt.transform((value) => value.toString()),\n\ts.string.regex(/^\\d+$/),\n).nullish;\n\nexport function validateDefaultMemberPermissions(permissions: unknown) {\n\treturn memberPermissionPredicate.parse(permissions);\n}\n\nexport function validateNSFW(value: unknown): asserts value is boolean {\n\tbooleanPredicate.parse(value);\n}\n","import type {\n\tAPIApplicationCommandOption,\n\tLocalizationMap,\n\tPermissions,\n\tRESTPostAPIChatInputApplicationCommandsJSONBody,\n} from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport {\n\tassertReturnOfBuilder,\n\tvalidateDefaultMemberPermissions,\n\tvalidateDefaultPermission,\n\tvalidateLocalizationMap,\n\tvalidateDMPermission,\n\tvalidateMaxOptionsLength,\n\tvalidateRequiredParameters,\n\tvalidateNSFW,\n} from './Assertions.js';\nimport { SlashCommandSubcommandBuilder, SlashCommandSubcommandGroupBuilder } from './SlashCommandSubcommands.js';\nimport { SharedNameAndDescription } from './mixins/NameAndDescription.js';\nimport { SharedSlashCommandOptions } from './mixins/SharedSlashCommandOptions.js';\n\n@mix(SharedSlashCommandOptions, SharedNameAndDescription)\nexport class SlashCommandBuilder {\n\t/**\n\t * The name of this slash command\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The localized names for this command\n\t */\n\tpublic readonly name_localizations?: LocalizationMap;\n\n\t/**\n\t * The description of this slash command\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The localized descriptions for this command\n\t */\n\tpublic readonly description_localizations?: LocalizationMap;\n\n\t/**\n\t * The options of this slash command\n\t */\n\tpublic readonly options: ToAPIApplicationCommandOptions[] = [];\n\n\t/**\n\t * Whether the command is enabled by default when the app is added to a guild\n\t *\n\t * @deprecated This property is deprecated and will be removed in the future.\n\t * You should use {@link (SlashCommandBuilder:class).setDefaultMemberPermissions} or {@link (SlashCommandBuilder:class).setDMPermission} instead.\n\t */\n\tpublic readonly default_permission: boolean | undefined = undefined;\n\n\t/**\n\t * Set of permissions represented as a bit set for the command\n\t */\n\tpublic readonly default_member_permissions: Permissions | null | undefined = undefined;\n\n\t/**\n\t * Indicates whether the command is available in DMs with the application, only for globally-scoped commands.\n\t * By default, commands are visible.\n\t */\n\tpublic readonly dm_permission: boolean | undefined = undefined;\n\n\t/**\n\t * Whether this command is NSFW\n\t */\n\tpublic readonly nsfw: boolean | undefined = undefined;\n\n\t/**\n\t * Returns the final data that should be sent to Discord.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): RESTPostAPIChatInputApplicationCommandsJSONBody {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\n\t\tvalidateLocalizationMap(this.name_localizations);\n\t\tvalidateLocalizationMap(this.description_localizations);\n\n\t\treturn {\n\t\t\t...this,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n\n\t/**\n\t * Sets whether the command is enabled by default when the application is added to a guild.\n\t *\n\t * @remarks\n\t * If set to `false`, you will have to later `PUT` the permissions for this command.\n\t * @param value - Whether or not to enable this command by default\n\t * @see https://discord.com/developers/docs/interactions/application-commands#permissions\n\t * @deprecated Use {@link (SlashCommandBuilder:class).setDefaultMemberPermissions} or {@link (SlashCommandBuilder:class).setDMPermission} instead.\n\t */\n\tpublic setDefaultPermission(value: boolean) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDefaultPermission(value);\n\n\t\tReflect.set(this, 'default_permission', value);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the default permissions a member should have in order to run the command.\n\t *\n\t * @remarks\n\t * You can set this to `'0'` to disable the command by default.\n\t * @param permissions - The permissions bit field to set\n\t * @see https://discord.com/developers/docs/interactions/application-commands#permissions\n\t */\n\tpublic setDefaultMemberPermissions(permissions: Permissions | bigint | number | null | undefined) {\n\t\t// Assert the value and parse it\n\t\tconst permissionValue = validateDefaultMemberPermissions(permissions);\n\n\t\tReflect.set(this, 'default_member_permissions', permissionValue);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets if the command is available in DMs with the application, only for globally-scoped commands.\n\t * By default, commands are visible.\n\t *\n\t * @param enabled - If the command should be enabled in DMs\n\t * @see https://discord.com/developers/docs/interactions/application-commands#permissions\n\t */\n\tpublic setDMPermission(enabled: boolean | null | undefined) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDMPermission(enabled);\n\n\t\tReflect.set(this, 'dm_permission', enabled);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this command is NSFW\n\t *\n\t * @param nsfw - Whether this command is NSFW\n\t */\n\tpublic setNSFW(nsfw = true) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateNSFW(nsfw);\n\t\tReflect.set(this, 'nsfw', nsfw);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a new subcommand group to this command\n\t *\n\t * @param input - A function that returns a subcommand group builder, or an already built builder\n\t */\n\tpublic addSubcommandGroup(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandGroupBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandGroupBuilder) => SlashCommandSubcommandGroupBuilder),\n\t): SlashCommandSubcommandsOnlyBuilder {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandGroupBuilder()) : input;\n\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandGroupBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds a new subcommand to this command\n\t *\n\t * @param input - A function that returns a subcommand builder, or an already built builder\n\t */\n\tpublic addSubcommand(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder),\n\t): SlashCommandSubcommandsOnlyBuilder {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandBuilder()) : input;\n\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this;\n\t}\n}\n\nexport interface SlashCommandBuilder extends SharedNameAndDescription, SharedSlashCommandOptions {}\n\nexport interface SlashCommandSubcommandsOnlyBuilder\n\textends Omit> {}\n\nexport interface SlashCommandOptionsOnlyBuilder\n\textends SharedNameAndDescription,\n\t\tSharedSlashCommandOptions,\n\t\tPick {}\n\nexport interface ToAPIApplicationCommandOptions {\n\ttoJSON(): APIApplicationCommandOption;\n}\n","import {\n\tApplicationCommandOptionType,\n\ttype APIApplicationCommandSubcommandGroupOption,\n\ttype APIApplicationCommandSubcommandOption,\n} from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { assertReturnOfBuilder, validateMaxOptionsLength, validateRequiredParameters } from './Assertions.js';\nimport type { ToAPIApplicationCommandOptions } from './SlashCommandBuilder.js';\nimport type { ApplicationCommandOptionBase } from './mixins/ApplicationCommandOptionBase.js';\nimport { SharedNameAndDescription } from './mixins/NameAndDescription.js';\nimport { SharedSlashCommandOptions } from './mixins/SharedSlashCommandOptions.js';\n\n/**\n * Represents a folder for subcommands\n *\n * For more information, go to https://discord.com/developers/docs/interactions/application-commands#subcommands-and-subcommand-groups\n */\n@mix(SharedNameAndDescription)\nexport class SlashCommandSubcommandGroupBuilder implements ToAPIApplicationCommandOptions {\n\t/**\n\t * The name of this subcommand group\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The description of this subcommand group\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The subcommands part of this subcommand group\n\t */\n\tpublic readonly options: SlashCommandSubcommandBuilder[] = [];\n\n\t/**\n\t * Adds a new subcommand to this group\n\t *\n\t * @param input - A function that returns a subcommand builder, or an already built builder\n\t */\n\tpublic addSubcommand(\n\t\tinput:\n\t\t\t| SlashCommandSubcommandBuilder\n\t\t\t| ((subcommandGroup: SlashCommandSubcommandBuilder) => SlashCommandSubcommandBuilder),\n\t) {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\tconst result = typeof input === 'function' ? input(new SlashCommandSubcommandBuilder()) : input;\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\t\tassertReturnOfBuilder(result, SlashCommandSubcommandBuilder);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this;\n\t}\n\n\tpublic toJSON(): APIApplicationCommandSubcommandGroupOption {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\n\t\treturn {\n\t\t\ttype: ApplicationCommandOptionType.SubcommandGroup,\n\t\t\tname: this.name,\n\t\t\tname_localizations: this.name_localizations,\n\t\t\tdescription: this.description,\n\t\t\tdescription_localizations: this.description_localizations,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n\nexport interface SlashCommandSubcommandGroupBuilder extends SharedNameAndDescription {}\n\n/**\n * Represents a subcommand\n *\n * For more information, go to https://discord.com/developers/docs/interactions/application-commands#subcommands-and-subcommand-groups\n */\n@mix(SharedNameAndDescription, SharedSlashCommandOptions)\nexport class SlashCommandSubcommandBuilder implements ToAPIApplicationCommandOptions {\n\t/**\n\t * The name of this subcommand\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The description of this subcommand\n\t */\n\tpublic readonly description: string = undefined!;\n\n\t/**\n\t * The options of this subcommand\n\t */\n\tpublic readonly options: ApplicationCommandOptionBase[] = [];\n\n\tpublic toJSON(): APIApplicationCommandSubcommandOption {\n\t\tvalidateRequiredParameters(this.name, this.description, this.options);\n\n\t\treturn {\n\t\t\ttype: ApplicationCommandOptionType.Subcommand,\n\t\t\tname: this.name,\n\t\t\tname_localizations: this.name_localizations,\n\t\t\tdescription: this.description,\n\t\t\tdescription_localizations: this.description_localizations,\n\t\t\toptions: this.options.map((option) => option.toJSON()),\n\t\t};\n\t}\n}\n\nexport interface SlashCommandSubcommandBuilder extends SharedNameAndDescription, SharedSlashCommandOptions {}\n","import type { LocaleString, LocalizationMap } from 'discord-api-types/v10';\nimport { validateDescription, validateLocale, validateName } from '../Assertions.js';\n\nexport class SharedNameAndDescription {\n\tpublic readonly name!: string;\n\n\tpublic readonly name_localizations?: LocalizationMap;\n\n\tpublic readonly description!: string;\n\n\tpublic readonly description_localizations?: LocalizationMap;\n\n\t/**\n\t * Sets the name\n\t *\n\t * @param name - The name\n\t */\n\tpublic setName(name: string): this {\n\t\t// Assert the name matches the conditions\n\t\tvalidateName(name);\n\n\t\tReflect.set(this, 'name', name);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description\n\t *\n\t * @param description - The description\n\t */\n\tpublic setDescription(description: string) {\n\t\t// Assert the description matches the conditions\n\t\tvalidateDescription(description);\n\n\t\tReflect.set(this, 'description', description);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a name localization\n\t *\n\t * @param locale - The locale to set a description for\n\t * @param localizedName - The localized description for the given locale\n\t */\n\tpublic setNameLocalization(locale: LocaleString, localizedName: string | null) {\n\t\tif (!this.name_localizations) {\n\t\t\tReflect.set(this, 'name_localizations', {});\n\t\t}\n\n\t\tconst parsedLocale = validateLocale(locale);\n\n\t\tif (localizedName === null) {\n\t\t\tthis.name_localizations![parsedLocale] = null;\n\t\t\treturn this;\n\t\t}\n\n\t\tvalidateName(localizedName);\n\n\t\tthis.name_localizations![parsedLocale] = localizedName;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the name localizations\n\t *\n\t * @param localizedNames - The dictionary of localized descriptions to set\n\t */\n\tpublic setNameLocalizations(localizedNames: LocalizationMap | null) {\n\t\tif (localizedNames === null) {\n\t\t\tReflect.set(this, 'name_localizations', null);\n\t\t\treturn this;\n\t\t}\n\n\t\tReflect.set(this, 'name_localizations', {});\n\n\t\tfor (const args of Object.entries(localizedNames)) {\n\t\t\tthis.setNameLocalization(...(args as [LocaleString, string | null]));\n\t\t}\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a description localization\n\t *\n\t * @param locale - The locale to set a description for\n\t * @param localizedDescription - The localized description for the given locale\n\t */\n\tpublic setDescriptionLocalization(locale: LocaleString, localizedDescription: string | null) {\n\t\tif (!this.description_localizations) {\n\t\t\tReflect.set(this, 'description_localizations', {});\n\t\t}\n\n\t\tconst parsedLocale = validateLocale(locale);\n\n\t\tif (localizedDescription === null) {\n\t\t\tthis.description_localizations![parsedLocale] = null;\n\t\t\treturn this;\n\t\t}\n\n\t\tvalidateDescription(localizedDescription);\n\n\t\tthis.description_localizations![parsedLocale] = localizedDescription;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description localizations\n\t *\n\t * @param localizedDescriptions - The dictionary of localized descriptions to set\n\t */\n\tpublic setDescriptionLocalizations(localizedDescriptions: LocalizationMap | null) {\n\t\tif (localizedDescriptions === null) {\n\t\t\tReflect.set(this, 'description_localizations', null);\n\t\t\treturn this;\n\t\t}\n\n\t\tReflect.set(this, 'description_localizations', {});\n\t\tfor (const args of Object.entries(localizedDescriptions)) {\n\t\t\tthis.setDescriptionLocalization(...(args as [LocaleString, string | null]));\n\t\t}\n\n\t\treturn this;\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandAttachmentOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\nexport class SlashCommandAttachmentOption extends ApplicationCommandOptionBase {\n\tpublic override readonly type = ApplicationCommandOptionType.Attachment as const;\n\n\tpublic toJSON(): APIApplicationCommandAttachmentOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import type { APIApplicationCommandBasicOption, ApplicationCommandOptionType } from 'discord-api-types/v10';\nimport { validateRequiredParameters, validateRequired, validateLocalizationMap } from '../Assertions.js';\nimport { SharedNameAndDescription } from './NameAndDescription.js';\n\nexport abstract class ApplicationCommandOptionBase extends SharedNameAndDescription {\n\tpublic abstract readonly type: ApplicationCommandOptionType;\n\n\tpublic readonly required: boolean = false;\n\n\t/**\n\t * Marks the option as required\n\t *\n\t * @param required - If this option should be required\n\t */\n\tpublic setRequired(required: boolean) {\n\t\t// Assert that you actually passed a boolean\n\t\tvalidateRequired(required);\n\n\t\tReflect.set(this, 'required', required);\n\n\t\treturn this;\n\t}\n\n\tpublic abstract toJSON(): APIApplicationCommandBasicOption;\n\n\tprotected runRequiredValidations() {\n\t\tvalidateRequiredParameters(this.name, this.description, []);\n\n\t\t// Validate localizations\n\t\tvalidateLocalizationMap(this.name_localizations);\n\t\tvalidateLocalizationMap(this.description_localizations);\n\n\t\t// Assert that you actually passed a boolean\n\t\tvalidateRequired(this.required);\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandBooleanOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\nexport class SlashCommandBooleanOption extends ApplicationCommandOptionBase {\n\tpublic readonly type = ApplicationCommandOptionType.Boolean as const;\n\n\tpublic toJSON(): APIApplicationCommandBooleanOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandChannelOption } from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\nimport { ApplicationCommandOptionChannelTypesMixin } from '../mixins/ApplicationCommandOptionChannelTypesMixin.js';\n\n@mix(ApplicationCommandOptionChannelTypesMixin)\nexport class SlashCommandChannelOption extends ApplicationCommandOptionBase {\n\tpublic override readonly type = ApplicationCommandOptionType.Channel as const;\n\n\tpublic toJSON(): APIApplicationCommandChannelOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n\nexport interface SlashCommandChannelOption extends ApplicationCommandOptionChannelTypesMixin {}\n","import { s } from '@sapphire/shapeshift';\nimport { ChannelType } from 'discord-api-types/v10';\n\n// Only allow valid channel types to be used. (This can't be dynamic because const enums are erased at runtime)\nconst allowedChannelTypes = [\n\tChannelType.GuildText,\n\tChannelType.GuildVoice,\n\tChannelType.GuildCategory,\n\tChannelType.GuildAnnouncement,\n\tChannelType.AnnouncementThread,\n\tChannelType.PublicThread,\n\tChannelType.PrivateThread,\n\tChannelType.GuildStageVoice,\n\tChannelType.GuildForum,\n] as const;\n\nexport type ApplicationCommandOptionAllowedChannelTypes = (typeof allowedChannelTypes)[number];\n\nconst channelTypesPredicate = s.array(s.union(...allowedChannelTypes.map((type) => s.literal(type))));\n\nexport class ApplicationCommandOptionChannelTypesMixin {\n\tpublic readonly channel_types?: ApplicationCommandOptionAllowedChannelTypes[];\n\n\t/**\n\t * Adds channel types to this option\n\t *\n\t * @param channelTypes - The channel types to add\n\t */\n\tpublic addChannelTypes(...channelTypes: ApplicationCommandOptionAllowedChannelTypes[]) {\n\t\tif (this.channel_types === undefined) {\n\t\t\tReflect.set(this, 'channel_types', []);\n\t\t}\n\n\t\tthis.channel_types!.push(...channelTypesPredicate.parse(channelTypes));\n\n\t\treturn this;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandOptionType, type APIApplicationCommandIntegerOption } from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandNumericOptionMinMaxValueMixin } from '../mixins/ApplicationCommandNumericOptionMinMaxValueMixin.js';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\nimport { ApplicationCommandOptionWithChoicesAndAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin.js';\n\nconst numberValidator = s.number.int;\n\n@mix(ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionWithChoicesAndAutocompleteMixin)\nexport class SlashCommandIntegerOption\n\textends ApplicationCommandOptionBase\n\timplements ApplicationCommandNumericOptionMinMaxValueMixin\n{\n\tpublic readonly type = ApplicationCommandOptionType.Integer as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue}\n\t */\n\tpublic setMaxValue(max: number): this {\n\t\tnumberValidator.parse(max);\n\n\t\tReflect.set(this, 'max_value', max);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue}\n\t */\n\tpublic setMinValue(min: number): this {\n\t\tnumberValidator.parse(min);\n\n\t\tReflect.set(this, 'min_value', min);\n\n\t\treturn this;\n\t}\n\n\tpublic toJSON(): APIApplicationCommandIntegerOption {\n\t\tthis.runRequiredValidations();\n\n\t\tif (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\treturn { ...this };\n\t}\n}\n\nexport interface SlashCommandIntegerOption\n\textends ApplicationCommandNumericOptionMinMaxValueMixin,\n\t\tApplicationCommandOptionWithChoicesAndAutocompleteMixin {}\n","export abstract class ApplicationCommandNumericOptionMinMaxValueMixin {\n\tpublic readonly max_value?: number;\n\n\tpublic readonly min_value?: number;\n\n\t/**\n\t * Sets the maximum number value of this option\n\t *\n\t * @param max - The maximum value this option can be\n\t */\n\tpublic abstract setMaxValue(max: number): this;\n\n\t/**\n\t * Sets the minimum number value of this option\n\t *\n\t * @param min - The minimum value this option can be\n\t */\n\tpublic abstract setMinValue(min: number): this;\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandOptionType, type APIApplicationCommandOptionChoice } from 'discord-api-types/v10';\nimport { localizationMapPredicate, validateChoicesLength } from '../Assertions.js';\n\nconst stringPredicate = s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100);\nconst numberPredicate = s.number.greaterThan(Number.NEGATIVE_INFINITY).lessThan(Number.POSITIVE_INFINITY);\nconst choicesPredicate = s.object({\n\tname: stringPredicate,\n\tname_localizations: localizationMapPredicate,\n\tvalue: s.union(stringPredicate, numberPredicate),\n}).array;\nconst booleanPredicate = s.boolean;\n\nexport class ApplicationCommandOptionWithChoicesAndAutocompleteMixin {\n\tpublic readonly choices?: APIApplicationCommandOptionChoice[];\n\n\tpublic readonly autocomplete?: boolean;\n\n\t// Since this is present and this is a mixin, this is needed\n\tpublic readonly type!: ApplicationCommandOptionType;\n\n\t/**\n\t * Adds multiple choices for this option\n\t *\n\t * @param choices - The choices to add\n\t */\n\tpublic addChoices(...choices: APIApplicationCommandOptionChoice[]): this {\n\t\tif (choices.length > 0 && this.autocomplete) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tchoicesPredicate.parse(choices);\n\n\t\tif (this.choices === undefined) {\n\t\t\tReflect.set(this, 'choices', []);\n\t\t}\n\n\t\tvalidateChoicesLength(choices.length, this.choices);\n\n\t\tfor (const { name, name_localizations, value } of choices) {\n\t\t\t// Validate the value\n\t\t\tif (this.type === ApplicationCommandOptionType.String) {\n\t\t\t\tstringPredicate.parse(value);\n\t\t\t} else {\n\t\t\t\tnumberPredicate.parse(value);\n\t\t\t}\n\n\t\t\tthis.choices!.push({ name, name_localizations, value });\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tpublic setChoices[]>(...choices: Input): this {\n\t\tif (choices.length > 0 && this.autocomplete) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tchoicesPredicate.parse(choices);\n\n\t\tReflect.set(this, 'choices', []);\n\t\tthis.addChoices(...choices);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Marks the option as autocompletable\n\t *\n\t * @param autocomplete - If this option should be autocompletable\n\t */\n\tpublic setAutocomplete(autocomplete: boolean): this {\n\t\t// Assert that you actually passed a boolean\n\t\tbooleanPredicate.parse(autocomplete);\n\n\t\tif (autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\tReflect.set(this, 'autocomplete', autocomplete);\n\n\t\treturn this;\n\t}\n}\n","import { ApplicationCommandOptionType, type APIApplicationCommandMentionableOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\nexport class SlashCommandMentionableOption extends ApplicationCommandOptionBase {\n\tpublic readonly type = ApplicationCommandOptionType.Mentionable as const;\n\n\tpublic toJSON(): APIApplicationCommandMentionableOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandOptionType, type APIApplicationCommandNumberOption } from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandNumericOptionMinMaxValueMixin } from '../mixins/ApplicationCommandNumericOptionMinMaxValueMixin.js';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\nimport { ApplicationCommandOptionWithChoicesAndAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin.js';\n\nconst numberValidator = s.number;\n\n@mix(ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionWithChoicesAndAutocompleteMixin)\nexport class SlashCommandNumberOption\n\textends ApplicationCommandOptionBase\n\timplements ApplicationCommandNumericOptionMinMaxValueMixin\n{\n\tpublic readonly type = ApplicationCommandOptionType.Number as const;\n\n\t/**\n\t * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue}\n\t */\n\tpublic setMaxValue(max: number): this {\n\t\tnumberValidator.parse(max);\n\n\t\tReflect.set(this, 'max_value', max);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue}\n\t */\n\tpublic setMinValue(min: number): this {\n\t\tnumberValidator.parse(min);\n\n\t\tReflect.set(this, 'min_value', min);\n\n\t\treturn this;\n\t}\n\n\tpublic toJSON(): APIApplicationCommandNumberOption {\n\t\tthis.runRequiredValidations();\n\n\t\tif (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\treturn { ...this };\n\t}\n}\n\nexport interface SlashCommandNumberOption\n\textends ApplicationCommandNumericOptionMinMaxValueMixin,\n\t\tApplicationCommandOptionWithChoicesAndAutocompleteMixin {}\n","import { ApplicationCommandOptionType, type APIApplicationCommandRoleOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\nexport class SlashCommandRoleOption extends ApplicationCommandOptionBase {\n\tpublic override readonly type = ApplicationCommandOptionType.Role as const;\n\n\tpublic toJSON(): APIApplicationCommandRoleOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandOptionType, type APIApplicationCommandStringOption } from 'discord-api-types/v10';\nimport { mix } from 'ts-mixer';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\nimport { ApplicationCommandOptionWithChoicesAndAutocompleteMixin } from '../mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin.js';\n\nconst minLengthValidator = s.number.greaterThanOrEqual(0).lessThanOrEqual(6_000);\nconst maxLengthValidator = s.number.greaterThanOrEqual(1).lessThanOrEqual(6_000);\n\n@mix(ApplicationCommandOptionWithChoicesAndAutocompleteMixin)\nexport class SlashCommandStringOption extends ApplicationCommandOptionBase {\n\tpublic readonly type = ApplicationCommandOptionType.String as const;\n\n\tpublic readonly max_length?: number;\n\n\tpublic readonly min_length?: number;\n\n\t/**\n\t * Sets the maximum length of this string option.\n\t *\n\t * @param max - The maximum length this option can be\n\t */\n\tpublic setMaxLength(max: number): this {\n\t\tmaxLengthValidator.parse(max);\n\n\t\tReflect.set(this, 'max_length', max);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the minimum length of this string option.\n\t *\n\t * @param min - The minimum length this option can be\n\t */\n\tpublic setMinLength(min: number): this {\n\t\tminLengthValidator.parse(min);\n\n\t\tReflect.set(this, 'min_length', min);\n\n\t\treturn this;\n\t}\n\n\tpublic toJSON(): APIApplicationCommandStringOption {\n\t\tthis.runRequiredValidations();\n\n\t\tif (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {\n\t\t\tthrow new RangeError('Autocomplete and choices are mutually exclusive to each other.');\n\t\t}\n\n\t\treturn { ...this };\n\t}\n}\n\nexport interface SlashCommandStringOption extends ApplicationCommandOptionWithChoicesAndAutocompleteMixin {}\n","import { ApplicationCommandOptionType, type APIApplicationCommandUserOption } from 'discord-api-types/v10';\nimport { ApplicationCommandOptionBase } from '../mixins/ApplicationCommandOptionBase.js';\n\nexport class SlashCommandUserOption extends ApplicationCommandOptionBase {\n\tpublic readonly type = ApplicationCommandOptionType.User as const;\n\n\tpublic toJSON(): APIApplicationCommandUserOption {\n\t\tthis.runRequiredValidations();\n\n\t\treturn { ...this };\n\t}\n}\n","import { assertReturnOfBuilder, validateMaxOptionsLength } from '../Assertions.js';\nimport type { ToAPIApplicationCommandOptions } from '../SlashCommandBuilder';\nimport { SlashCommandAttachmentOption } from '../options/attachment.js';\nimport { SlashCommandBooleanOption } from '../options/boolean.js';\nimport { SlashCommandChannelOption } from '../options/channel.js';\nimport { SlashCommandIntegerOption } from '../options/integer.js';\nimport { SlashCommandMentionableOption } from '../options/mentionable.js';\nimport { SlashCommandNumberOption } from '../options/number.js';\nimport { SlashCommandRoleOption } from '../options/role.js';\nimport { SlashCommandStringOption } from '../options/string.js';\nimport { SlashCommandUserOption } from '../options/user.js';\nimport type { ApplicationCommandOptionBase } from './ApplicationCommandOptionBase.js';\n\nexport class SharedSlashCommandOptions {\n\tpublic readonly options!: ToAPIApplicationCommandOptions[];\n\n\t/**\n\t * Adds a boolean option\n\t *\n\t * @param input - A function that returns an option builder, or an already built builder\n\t */\n\tpublic addBooleanOption(\n\t\tinput: SlashCommandBooleanOption | ((builder: SlashCommandBooleanOption) => SlashCommandBooleanOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandBooleanOption);\n\t}\n\n\t/**\n\t * Adds a user option\n\t *\n\t * @param input - A function that returns an option builder, or an already built builder\n\t */\n\tpublic addUserOption(input: SlashCommandUserOption | ((builder: SlashCommandUserOption) => SlashCommandUserOption)) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandUserOption);\n\t}\n\n\t/**\n\t * Adds a channel option\n\t *\n\t * @param input - A function that returns an option builder, or an already built builder\n\t */\n\tpublic addChannelOption(\n\t\tinput: SlashCommandChannelOption | ((builder: SlashCommandChannelOption) => SlashCommandChannelOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandChannelOption);\n\t}\n\n\t/**\n\t * Adds a role option\n\t *\n\t * @param input - A function that returns an option builder, or an already built builder\n\t */\n\tpublic addRoleOption(input: SlashCommandRoleOption | ((builder: SlashCommandRoleOption) => SlashCommandRoleOption)) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandRoleOption);\n\t}\n\n\t/**\n\t * Adds an attachment option\n\t *\n\t * @param input - A function that returns an option builder, or an already built builder\n\t */\n\tpublic addAttachmentOption(\n\t\tinput: SlashCommandAttachmentOption | ((builder: SlashCommandAttachmentOption) => SlashCommandAttachmentOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandAttachmentOption);\n\t}\n\n\t/**\n\t * Adds a mentionable option\n\t *\n\t * @param input - A function that returns an option builder, or an already built builder\n\t */\n\tpublic addMentionableOption(\n\t\tinput: SlashCommandMentionableOption | ((builder: SlashCommandMentionableOption) => SlashCommandMentionableOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandMentionableOption);\n\t}\n\n\t/**\n\t * Adds a string option\n\t *\n\t * @param input - A function that returns an option builder, or an already built builder\n\t */\n\tpublic addStringOption(\n\t\tinput:\n\t\t\t| Omit\n\t\t\t| Omit\n\t\t\t| SlashCommandStringOption\n\t\t\t| ((\n\t\t\t\t\tbuilder: SlashCommandStringOption,\n\t\t\t ) =>\n\t\t\t\t\t| Omit\n\t\t\t\t\t| Omit\n\t\t\t\t\t| SlashCommandStringOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandStringOption);\n\t}\n\n\t/**\n\t * Adds an integer option\n\t *\n\t * @param input - A function that returns an option builder, or an already built builder\n\t */\n\tpublic addIntegerOption(\n\t\tinput:\n\t\t\t| Omit\n\t\t\t| Omit\n\t\t\t| SlashCommandIntegerOption\n\t\t\t| ((\n\t\t\t\t\tbuilder: SlashCommandIntegerOption,\n\t\t\t ) =>\n\t\t\t\t\t| Omit\n\t\t\t\t\t| Omit\n\t\t\t\t\t| SlashCommandIntegerOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandIntegerOption);\n\t}\n\n\t/**\n\t * Adds a number option\n\t *\n\t * @param input - A function that returns an option builder, or an already built builder\n\t */\n\tpublic addNumberOption(\n\t\tinput:\n\t\t\t| Omit\n\t\t\t| Omit\n\t\t\t| SlashCommandNumberOption\n\t\t\t| ((\n\t\t\t\t\tbuilder: SlashCommandNumberOption,\n\t\t\t ) =>\n\t\t\t\t\t| Omit\n\t\t\t\t\t| Omit\n\t\t\t\t\t| SlashCommandNumberOption),\n\t) {\n\t\treturn this._sharedAddOptionMethod(input, SlashCommandNumberOption);\n\t}\n\n\tprivate _sharedAddOptionMethod(\n\t\tinput:\n\t\t\t| Omit\n\t\t\t| Omit\n\t\t\t| T\n\t\t\t| ((builder: T) => Omit | Omit | T),\n\t\tInstance: new () => T,\n\t): ShouldOmitSubcommandFunctions extends true ? Omit : this {\n\t\tconst { options } = this;\n\n\t\t// First, assert options conditions - we cannot have more than 25 options\n\t\tvalidateMaxOptionsLength(options);\n\n\t\t// Get the final result\n\t\tconst result = typeof input === 'function' ? input(new Instance()) : input;\n\n\t\tassertReturnOfBuilder(result, Instance);\n\n\t\t// Push it\n\t\toptions.push(result);\n\n\t\treturn this;\n\t}\n}\n","import { s } from '@sapphire/shapeshift';\nimport { ApplicationCommandType } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\nimport type { ContextMenuCommandType } from './ContextMenuCommandBuilder.js';\n\nconst namePredicate = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(32)\n\t// eslint-disable-next-line prefer-named-capture-group, unicorn/no-unsafe-regex\n\t.regex(/^( *[\\p{P}\\p{L}\\p{N}\\p{sc=Devanagari}\\p{sc=Thai}]+ *)+$/u)\n\t.setValidationEnabled(isValidationEnabled);\nconst typePredicate = s\n\t.union(s.literal(ApplicationCommandType.User), s.literal(ApplicationCommandType.Message))\n\t.setValidationEnabled(isValidationEnabled);\nconst booleanPredicate = s.boolean;\n\nexport function validateDefaultPermission(value: unknown): asserts value is boolean {\n\tbooleanPredicate.parse(value);\n}\n\nexport function validateName(name: unknown): asserts name is string {\n\tnamePredicate.parse(name);\n}\n\nexport function validateType(type: unknown): asserts type is ContextMenuCommandType {\n\ttypePredicate.parse(type);\n}\n\nexport function validateRequiredParameters(name: string, type: number) {\n\t// Assert name matches all conditions\n\tvalidateName(name);\n\n\t// Assert type is valid\n\tvalidateType(type);\n}\n\nconst dmPermissionPredicate = s.boolean.nullish;\n\nexport function validateDMPermission(value: unknown): asserts value is boolean | null | undefined {\n\tdmPermissionPredicate.parse(value);\n}\n\nconst memberPermissionPredicate = s.union(\n\ts.bigint.transform((value) => value.toString()),\n\ts.number.safeInt.transform((value) => value.toString()),\n\ts.string.regex(/^\\d+$/),\n).nullish;\n\nexport function validateDefaultMemberPermissions(permissions: unknown) {\n\treturn memberPermissionPredicate.parse(permissions);\n}\n","import type {\n\tApplicationCommandType,\n\tLocaleString,\n\tLocalizationMap,\n\tPermissions,\n\tRESTPostAPIContextMenuApplicationCommandsJSONBody,\n} from 'discord-api-types/v10';\nimport { validateLocale, validateLocalizationMap } from '../slashCommands/Assertions.js';\nimport {\n\tvalidateRequiredParameters,\n\tvalidateName,\n\tvalidateType,\n\tvalidateDefaultPermission,\n\tvalidateDefaultMemberPermissions,\n\tvalidateDMPermission,\n} from './Assertions.js';\n\nexport class ContextMenuCommandBuilder {\n\t/**\n\t * The name of this context menu command\n\t */\n\tpublic readonly name: string = undefined!;\n\n\t/**\n\t * The localized names for this command\n\t */\n\tpublic readonly name_localizations?: LocalizationMap;\n\n\t/**\n\t * The type of this context menu command\n\t */\n\tpublic readonly type: ContextMenuCommandType = undefined!;\n\n\t/**\n\t * Whether the command is enabled by default when the app is added to a guild\n\t *\n\t * @deprecated This property is deprecated and will be removed in the future.\n\t * You should use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.\n\t */\n\tpublic readonly default_permission: boolean | undefined = undefined;\n\n\t/**\n\t * Set of permissions represented as a bit set for the command\n\t */\n\tpublic readonly default_member_permissions: Permissions | null | undefined = undefined;\n\n\t/**\n\t * Indicates whether the command is available in DMs with the application, only for globally-scoped commands.\n\t * By default, commands are visible.\n\t */\n\tpublic readonly dm_permission: boolean | undefined = undefined;\n\n\t/**\n\t * Sets the name\n\t *\n\t * @param name - The name\n\t */\n\tpublic setName(name: string) {\n\t\t// Assert the name matches the conditions\n\t\tvalidateName(name);\n\n\t\tReflect.set(this, 'name', name);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the type\n\t *\n\t * @param type - The type\n\t */\n\tpublic setType(type: ContextMenuCommandType) {\n\t\t// Assert the type is valid\n\t\tvalidateType(type);\n\n\t\tReflect.set(this, 'type', type);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether the command is enabled by default when the application is added to a guild.\n\t *\n\t * @remarks\n\t * If set to `false`, you will have to later `PUT` the permissions for this command.\n\t * @param value - Whether or not to enable this command by default\n\t * @see https://discord.com/developers/docs/interactions/application-commands#permissions\n\t * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.\n\t */\n\tpublic setDefaultPermission(value: boolean) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDefaultPermission(value);\n\n\t\tReflect.set(this, 'default_permission', value);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the default permissions a member should have in order to run the command.\n\t *\n\t * @remarks\n\t * You can set this to `'0'` to disable the command by default.\n\t * @param permissions - The permissions bit field to set\n\t * @see https://discord.com/developers/docs/interactions/application-commands#permissions\n\t */\n\tpublic setDefaultMemberPermissions(permissions: Permissions | bigint | number | null | undefined) {\n\t\t// Assert the value and parse it\n\t\tconst permissionValue = validateDefaultMemberPermissions(permissions);\n\n\t\tReflect.set(this, 'default_member_permissions', permissionValue);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets if the command is available in DMs with the application, only for globally-scoped commands.\n\t * By default, commands are visible.\n\t *\n\t * @param enabled - If the command should be enabled in DMs\n\t * @see https://discord.com/developers/docs/interactions/application-commands#permissions\n\t */\n\tpublic setDMPermission(enabled: boolean | null | undefined) {\n\t\t// Assert the value matches the conditions\n\t\tvalidateDMPermission(enabled);\n\n\t\tReflect.set(this, 'dm_permission', enabled);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets a name localization\n\t *\n\t * @param locale - The locale to set a description for\n\t * @param localizedName - The localized description for the given locale\n\t */\n\tpublic setNameLocalization(locale: LocaleString, localizedName: string | null) {\n\t\tif (!this.name_localizations) {\n\t\t\tReflect.set(this, 'name_localizations', {});\n\t\t}\n\n\t\tconst parsedLocale = validateLocale(locale);\n\n\t\tif (localizedName === null) {\n\t\t\tthis.name_localizations![parsedLocale] = null;\n\t\t\treturn this;\n\t\t}\n\n\t\tvalidateName(localizedName);\n\n\t\tthis.name_localizations![parsedLocale] = localizedName;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the name localizations\n\t *\n\t * @param localizedNames - The dictionary of localized descriptions to set\n\t */\n\tpublic setNameLocalizations(localizedNames: LocalizationMap | null) {\n\t\tif (localizedNames === null) {\n\t\t\tReflect.set(this, 'name_localizations', null);\n\t\t\treturn this;\n\t\t}\n\n\t\tReflect.set(this, 'name_localizations', {});\n\n\t\tfor (const args of Object.entries(localizedNames))\n\t\t\tthis.setNameLocalization(...(args as [LocaleString, string | null]));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns the final data that should be sent to Discord.\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic toJSON(): RESTPostAPIContextMenuApplicationCommandsJSONBody {\n\t\tvalidateRequiredParameters(this.name, this.type);\n\n\t\tvalidateLocalizationMap(this.name_localizations);\n\n\t\treturn { ...this };\n\t}\n}\n\nexport type ContextMenuCommandType = ApplicationCommandType.Message | ApplicationCommandType.User;\n","import type { APIEmbed } from 'discord-api-types/v10';\n\nexport function embedLength(data: APIEmbed) {\n\treturn (\n\t\t(data.title?.length ?? 0) +\n\t\t(data.description?.length ?? 0) +\n\t\t(data.fields?.reduce((prev, curr) => prev + curr.name.length + curr.value.length, 0) ?? 0) +\n\t\t(data.footer?.text.length ?? 0) +\n\t\t(data.author?.name.length ?? 0)\n\t);\n}\n"],"mappings":"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","names":["Assertions_exports","validate","enableValidators","disableValidators","isValidationEnabled","fieldNamePredicate","s","string","lengthGreaterThanOrEqual","lengthLessThanOrEqual","setValidationEnabled","isValidationEnabled","fieldValuePredicate","fieldInlinePredicate","boolean","optional","embedFieldPredicate","object","name","value","inline","embedFieldsArrayPredicate","array","fieldLengthPredicate","number","lessThanOrEqual","validateFieldLength","amountAdding","fields","parse","length","authorNamePredicate","nullable","imageURLPredicate","url","allowedProtocols","nullish","urlPredicate","embedAuthorPredicate","iconURL","RGBPredicate","int","greaterThanOrEqual","colorPredicate","or","tuple","descriptionPredicate","footerTextPredicate","embedFooterPredicate","text","timestampPredicate","union","date","titlePredicate","normalizeArray","arr","Array","isArray","EmbedBuilder","data","timestamp","Date","toISOString","addFields","fields","normalizeArray","validateFieldLength","length","embedFieldsArrayPredicate","parse","push","spliceFields","index","deleteCount","splice","setFields","setAuthor","options","author","undefined","embedAuthorPredicate","name","url","icon_url","iconURL","setColor","color","colorPredicate","Array","isArray","red","green","blue","setDescription","description","descriptionPredicate","setFooter","footer","embedFooterPredicate","text","setImage","imageURLPredicate","image","setThumbnail","thumbnail","setTimestamp","now","timestampPredicate","setTitle","title","titlePredicate","setURL","urlPredicate","toJSON","Assertions_exports","import_shapeshift","StringSelectMenuOptionBuilder","data","setLabel","label","labelValueDescriptionValidator","parse","setValue","value","setDescription","description","setDefault","isDefault","default","defaultValidator","setEmoji","emoji","emojiValidator","toJSON","validateRequiredSelectMenuOptionParameters","customIdValidator","s","string","lengthGreaterThanOrEqual","lengthLessThanOrEqual","setValidationEnabled","isValidationEnabled","emojiValidator","object","id","name","animated","boolean","partial","strict","disabledValidator","buttonLabelValidator","buttonStyleValidator","nativeEnum","ButtonStyle","placeholderValidator","minMaxValidator","number","int","greaterThanOrEqual","lessThanOrEqual","labelValueDescriptionValidator","jsonOptionValidator","label","value","description","optional","emoji","default","optionValidator","instance","StringSelectMenuOptionBuilder","optionsValidator","array","optionsLengthValidator","validateRequiredSelectMenuParameters","options","customId","parse","defaultValidator","validateRequiredSelectMenuOptionParameters","channelTypesValidator","ChannelType","urlValidator","url","allowedProtocols","validateRequiredButtonParameters","style","RangeError","Link","import_v10","ComponentBuilder","data","import_v10","import_v10","ButtonBuilder","ComponentBuilder","data","type","ComponentType","Button","setStyle","style","buttonStyleValidator","parse","setURL","url","urlValidator","setCustomId","customId","custom_id","customIdValidator","setEmoji","emoji","emojiValidator","setDisabled","disabled","disabledValidator","setLabel","label","buttonLabelValidator","toJSON","validateRequiredButtonParameters","import_v10","BaseSelectMenuBuilder","ComponentBuilder","setPlaceholder","placeholder","data","placeholderValidator","parse","setMinValues","minValues","min_values","minMaxValidator","setMaxValues","maxValues","max_values","setCustomId","customId","custom_id","customIdValidator","setDisabled","disabled","disabledValidator","toJSON","ChannelSelectMenuBuilder","BaseSelectMenuBuilder","data","type","ComponentType","ChannelSelect","addChannelTypes","types","normalizeArray","channel_types","push","channelTypesValidator","parse","setChannelTypes","splice","length","toJSON","customIdValidator","custom_id","import_v10","MentionableSelectMenuBuilder","BaseSelectMenuBuilder","data","type","ComponentType","MentionableSelect","import_v10","RoleSelectMenuBuilder","BaseSelectMenuBuilder","data","type","ComponentType","RoleSelect","import_v10","StringSelectMenuBuilder","BaseSelectMenuBuilder","data","options","initData","type","ComponentType","StringSelect","map","option","StringSelectMenuOptionBuilder","addOptions","normalizeArray","optionsLengthValidator","parse","length","push","jsonOptionValidator","setOptions","spliceOptions","index","deleteCount","clone","splice","toJSON","validateRequiredSelectMenuParameters","custom_id","import_v10","UserSelectMenuBuilder","BaseSelectMenuBuilder","data","type","ComponentType","UserSelect","import_v10","Assertions_exports","placeholderValidator","import_shapeshift","import_v10","textInputStyleValidator","s","nativeEnum","TextInputStyle","minLengthValidator","number","int","greaterThanOrEqual","lessThanOrEqual","setValidationEnabled","isValidationEnabled","maxLengthValidator","requiredValidator","boolean","valueValidator","string","lengthLessThanOrEqual","placeholderValidator","labelValidator","lengthGreaterThanOrEqual","validateRequiredParameters","customId","style","label","customIdValidator","parse","TextInputBuilder","ComponentBuilder","data","type","ComponentType","TextInput","setCustomId","customId","custom_id","customIdValidator","parse","setLabel","label","labelValidator","setStyle","style","textInputStyleValidator","setMinLength","minLength","min_length","minLengthValidator","setMaxLength","maxLength","max_length","maxLengthValidator","setPlaceholder","placeholder","placeholderValidator","setValue","value","valueValidator","setRequired","required","requiredValidator","toJSON","validateRequiredParameters","equals","other","isJSONEncodable","isEqual","createComponentBuilder","data","ComponentBuilder","type","ComponentType","ActionRow","ActionRowBuilder","Button","ButtonBuilder","StringSelect","StringSelectMenuBuilder","TextInput","TextInputBuilder","UserSelect","UserSelectMenuBuilder","RoleSelect","RoleSelectMenuBuilder","MentionableSelect","MentionableSelectMenuBuilder","ChannelSelect","ChannelSelectMenuBuilder","Error","ActionRowBuilder","ComponentBuilder","components","data","type","ComponentType","ActionRow","map","component","createComponentBuilder","addComponents","push","normalizeArray","setComponents","splice","length","toJSON","Assertions_exports","validateRequiredParameters","import_shapeshift","titleValidator","s","string","lengthGreaterThanOrEqual","lengthLessThanOrEqual","setValidationEnabled","isValidationEnabled","componentsValidator","instance","ActionRowBuilder","array","validateRequiredParameters","customId","title","components","customIdValidator","parse","ModalBuilder","components","data","map","component","createComponentBuilder","setTitle","title","titleValidator","parse","setCustomId","customId","custom_id","customIdValidator","addComponents","push","normalizeArray","ActionRowBuilder","setComponents","splice","length","toJSON","validateRequiredParameters","Assertions_exports","validateRequiredParameters","import_shapeshift","import_v10","namePredicate","s","string","lengthGreaterThanOrEqual","lengthLessThanOrEqual","regex","setValidationEnabled","isValidationEnabled","validateName","name","parse","descriptionPredicate","localePredicate","nativeEnum","Locale","validateDescription","description","maxArrayLengthPredicate","unknown","array","validateLocale","locale","validateMaxOptionsLength","options","validateRequiredParameters","booleanPredicate","boolean","validateDefaultPermission","value","validateRequired","required","choicesLengthPredicate","number","lessThanOrEqual","validateChoicesLength","amountAdding","choices","length","assertReturnOfBuilder","input","ExpectedInstanceOf","instance","localizationMapPredicate","object","Object","fromEntries","values","map","nullish","strict","validateLocalizationMap","dmPermissionPredicate","validateDMPermission","memberPermissionPredicate","union","bigint","transform","toString","safeInt","validateDefaultMemberPermissions","permissions","validateNSFW","import_ts_mixer","import_v10","import_ts_mixer","SharedNameAndDescription","setName","name","validateName","Reflect","set","setDescription","description","validateDescription","setNameLocalization","locale","localizedName","name_localizations","parsedLocale","validateLocale","setNameLocalizations","localizedNames","args","Object","entries","setDescriptionLocalization","localizedDescription","description_localizations","setDescriptionLocalizations","localizedDescriptions","import_v10","ApplicationCommandOptionBase","SharedNameAndDescription","required","setRequired","validateRequired","Reflect","set","runRequiredValidations","validateRequiredParameters","name","description","validateLocalizationMap","name_localizations","description_localizations","SlashCommandAttachmentOption","ApplicationCommandOptionBase","type","ApplicationCommandOptionType","Attachment","toJSON","runRequiredValidations","import_v10","SlashCommandBooleanOption","ApplicationCommandOptionBase","type","ApplicationCommandOptionType","Boolean","toJSON","runRequiredValidations","import_v10","import_shapeshift","import_v10","allowedChannelTypes","ChannelType","GuildText","GuildVoice","GuildCategory","GuildAnnouncement","AnnouncementThread","PublicThread","PrivateThread","GuildStageVoice","GuildForum","channelTypesPredicate","s","array","union","map","type","literal","ApplicationCommandOptionChannelTypesMixin","addChannelTypes","channelTypes","channel_types","undefined","Reflect","set","push","parse","SlashCommandChannelOption","ApplicationCommandOptionBase","type","ApplicationCommandOptionType","Channel","toJSON","runRequiredValidations","mix","ApplicationCommandOptionChannelTypesMixin","import_shapeshift","import_v10","import_ts_mixer","ApplicationCommandNumericOptionMinMaxValueMixin","import_shapeshift","import_v10","stringPredicate","s","string","lengthGreaterThanOrEqual","lengthLessThanOrEqual","numberPredicate","number","greaterThan","Number","NEGATIVE_INFINITY","lessThan","POSITIVE_INFINITY","choicesPredicate","object","name","name_localizations","localizationMapPredicate","value","union","array","booleanPredicate","boolean","ApplicationCommandOptionWithChoicesAndAutocompleteMixin","addChoices","choices","length","autocomplete","RangeError","parse","undefined","Reflect","set","validateChoicesLength","type","ApplicationCommandOptionType","String","push","setChoices","setAutocomplete","Array","isArray","numberValidator","s","number","int","SlashCommandIntegerOption","ApplicationCommandOptionBase","type","ApplicationCommandOptionType","Integer","setMaxValue","max","parse","Reflect","set","setMinValue","min","toJSON","runRequiredValidations","autocomplete","Array","isArray","choices","length","RangeError","mix","ApplicationCommandNumericOptionMinMaxValueMixin","ApplicationCommandOptionWithChoicesAndAutocompleteMixin","import_v10","SlashCommandMentionableOption","ApplicationCommandOptionBase","type","ApplicationCommandOptionType","Mentionable","toJSON","runRequiredValidations","import_shapeshift","import_v10","import_ts_mixer","numberValidator","s","number","SlashCommandNumberOption","ApplicationCommandOptionBase","type","ApplicationCommandOptionType","Number","setMaxValue","max","parse","Reflect","set","setMinValue","min","toJSON","runRequiredValidations","autocomplete","Array","isArray","choices","length","RangeError","mix","ApplicationCommandNumericOptionMinMaxValueMixin","ApplicationCommandOptionWithChoicesAndAutocompleteMixin","import_v10","SlashCommandRoleOption","ApplicationCommandOptionBase","type","ApplicationCommandOptionType","Role","toJSON","runRequiredValidations","import_shapeshift","import_v10","import_ts_mixer","minLengthValidator","s","number","greaterThanOrEqual","lessThanOrEqual","maxLengthValidator","SlashCommandStringOption","ApplicationCommandOptionBase","type","ApplicationCommandOptionType","String","setMaxLength","max","parse","Reflect","set","setMinLength","min","toJSON","runRequiredValidations","autocomplete","Array","isArray","choices","length","RangeError","mix","ApplicationCommandOptionWithChoicesAndAutocompleteMixin","import_v10","SlashCommandUserOption","ApplicationCommandOptionBase","type","ApplicationCommandOptionType","User","toJSON","runRequiredValidations","SharedSlashCommandOptions","addBooleanOption","input","_sharedAddOptionMethod","SlashCommandBooleanOption","addUserOption","SlashCommandUserOption","addChannelOption","SlashCommandChannelOption","addRoleOption","SlashCommandRoleOption","addAttachmentOption","SlashCommandAttachmentOption","addMentionableOption","SlashCommandMentionableOption","addStringOption","SlashCommandStringOption","addIntegerOption","SlashCommandIntegerOption","addNumberOption","SlashCommandNumberOption","Instance","options","validateMaxOptionsLength","result","assertReturnOfBuilder","push","SlashCommandSubcommandGroupBuilder","name","undefined","description","options","addSubcommand","input","validateMaxOptionsLength","result","SlashCommandSubcommandBuilder","assertReturnOfBuilder","push","toJSON","validateRequiredParameters","type","ApplicationCommandOptionType","SubcommandGroup","name_localizations","description_localizations","map","option","mix","SharedNameAndDescription","Subcommand","SharedSlashCommandOptions","SlashCommandBuilder","name","undefined","description","options","default_permission","default_member_permissions","dm_permission","nsfw","toJSON","validateRequiredParameters","validateLocalizationMap","name_localizations","description_localizations","map","option","setDefaultPermission","value","validateDefaultPermission","Reflect","set","setDefaultMemberPermissions","permissions","permissionValue","validateDefaultMemberPermissions","setDMPermission","enabled","validateDMPermission","setNSFW","validateNSFW","addSubcommandGroup","input","validateMaxOptionsLength","result","SlashCommandSubcommandGroupBuilder","assertReturnOfBuilder","push","addSubcommand","SlashCommandSubcommandBuilder","mix","SharedSlashCommandOptions","SharedNameAndDescription","Assertions_exports","validateDMPermission","validateDefaultMemberPermissions","validateDefaultPermission","validateName","validateRequiredParameters","import_shapeshift","import_v10","namePredicate","s","string","lengthGreaterThanOrEqual","lengthLessThanOrEqual","regex","setValidationEnabled","isValidationEnabled","typePredicate","union","literal","ApplicationCommandType","User","Message","booleanPredicate","boolean","validateDefaultPermission","value","parse","validateName","name","validateType","type","validateRequiredParameters","dmPermissionPredicate","nullish","validateDMPermission","memberPermissionPredicate","bigint","transform","toString","number","safeInt","validateDefaultMemberPermissions","permissions","ContextMenuCommandBuilder","name","undefined","type","default_permission","default_member_permissions","dm_permission","setName","validateName","Reflect","set","setType","validateType","setDefaultPermission","value","validateDefaultPermission","setDefaultMemberPermissions","permissions","permissionValue","validateDefaultMemberPermissions","setDMPermission","enabled","validateDMPermission","setNameLocalization","locale","localizedName","name_localizations","parsedLocale","validateLocale","setNameLocalizations","localizedNames","args","Object","entries","toJSON","validateRequiredParameters","validateLocalizationMap","embedLength","data","title","length","description","fields","reduce","prev","curr","name","value","footer","text","author","version"]}
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/index.mjs b/node_modules/@discordjs/builders/dist/index.mjs
deleted file mode 100644
index 500c20a..0000000
--- a/node_modules/@discordjs/builders/dist/index.mjs
+++ /dev/null
@@ -1,2368 +0,0 @@
-var __defProp = Object.defineProperty;
-var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
-var __export = (target, all) => {
- for (var name in all)
- __defProp(target, name, { get: all[name], enumerable: true });
-};
-
-// src/messages/embed/Assertions.ts
-var Assertions_exports = {};
-__export(Assertions_exports, {
- RGBPredicate: () => RGBPredicate,
- authorNamePredicate: () => authorNamePredicate,
- colorPredicate: () => colorPredicate,
- descriptionPredicate: () => descriptionPredicate,
- embedAuthorPredicate: () => embedAuthorPredicate,
- embedFieldPredicate: () => embedFieldPredicate,
- embedFieldsArrayPredicate: () => embedFieldsArrayPredicate,
- embedFooterPredicate: () => embedFooterPredicate,
- fieldInlinePredicate: () => fieldInlinePredicate,
- fieldLengthPredicate: () => fieldLengthPredicate,
- fieldNamePredicate: () => fieldNamePredicate,
- fieldValuePredicate: () => fieldValuePredicate,
- footerTextPredicate: () => footerTextPredicate,
- imageURLPredicate: () => imageURLPredicate,
- timestampPredicate: () => timestampPredicate,
- titlePredicate: () => titlePredicate,
- urlPredicate: () => urlPredicate,
- validateFieldLength: () => validateFieldLength
-});
-import { s } from "@sapphire/shapeshift";
-
-// src/util/validation.ts
-var validate = true;
-var enableValidators = /* @__PURE__ */ __name(() => validate = true, "enableValidators");
-var disableValidators = /* @__PURE__ */ __name(() => validate = false, "disableValidators");
-var isValidationEnabled = /* @__PURE__ */ __name(() => validate, "isValidationEnabled");
-
-// src/messages/embed/Assertions.ts
-var fieldNamePredicate = s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(256).setValidationEnabled(isValidationEnabled);
-var fieldValuePredicate = s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(1024).setValidationEnabled(isValidationEnabled);
-var fieldInlinePredicate = s.boolean.optional;
-var embedFieldPredicate = s.object({
- name: fieldNamePredicate,
- value: fieldValuePredicate,
- inline: fieldInlinePredicate
-}).setValidationEnabled(isValidationEnabled);
-var embedFieldsArrayPredicate = embedFieldPredicate.array.setValidationEnabled(isValidationEnabled);
-var fieldLengthPredicate = s.number.lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);
-function validateFieldLength(amountAdding, fields) {
- fieldLengthPredicate.parse((fields?.length ?? 0) + amountAdding);
-}
-__name(validateFieldLength, "validateFieldLength");
-var authorNamePredicate = fieldNamePredicate.nullable.setValidationEnabled(isValidationEnabled);
-var imageURLPredicate = s.string.url({
- allowedProtocols: [
- "http:",
- "https:",
- "attachment:"
- ]
-}).nullish.setValidationEnabled(isValidationEnabled);
-var urlPredicate = s.string.url({
- allowedProtocols: [
- "http:",
- "https:"
- ]
-}).nullish.setValidationEnabled(isValidationEnabled);
-var embedAuthorPredicate = s.object({
- name: authorNamePredicate,
- iconURL: imageURLPredicate,
- url: urlPredicate
-}).setValidationEnabled(isValidationEnabled);
-var RGBPredicate = s.number.int.greaterThanOrEqual(0).lessThanOrEqual(255).setValidationEnabled(isValidationEnabled);
-var colorPredicate = s.number.int.greaterThanOrEqual(0).lessThanOrEqual(16777215).or(s.tuple([
- RGBPredicate,
- RGBPredicate,
- RGBPredicate
-])).nullable.setValidationEnabled(isValidationEnabled);
-var descriptionPredicate = s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(4096).nullable.setValidationEnabled(isValidationEnabled);
-var footerTextPredicate = s.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(2048).nullable.setValidationEnabled(isValidationEnabled);
-var embedFooterPredicate = s.object({
- text: footerTextPredicate,
- iconURL: imageURLPredicate
-}).setValidationEnabled(isValidationEnabled);
-var timestampPredicate = s.union(s.number, s.date).nullable.setValidationEnabled(isValidationEnabled);
-var titlePredicate = fieldNamePredicate.nullable.setValidationEnabled(isValidationEnabled);
-
-// src/util/normalizeArray.ts
-function normalizeArray(arr) {
- if (Array.isArray(arr[0]))
- return arr[0];
- return arr;
-}
-__name(normalizeArray, "normalizeArray");
-
-// src/messages/embed/Embed.ts
-var EmbedBuilder = class {
- constructor(data = {}) {
- this.data = {
- ...data
- };
- if (data.timestamp)
- this.data.timestamp = new Date(data.timestamp).toISOString();
- }
- /**
- * Appends fields to the embed
- *
- * @remarks
- * This method accepts either an array of fields or a variable number of field parameters.
- * The maximum amount of fields that can be added is 25.
- * @example
- * Using an array
- * ```ts
- * const fields: APIEmbedField[] = ...;
- * const embed = new EmbedBuilder()
- * .addFields(fields);
- * ```
- * @example
- * Using rest parameters (variadic)
- * ```ts
- * const embed = new EmbedBuilder()
- * .addFields(
- * { name: 'Field 1', value: 'Value 1' },
- * { name: 'Field 2', value: 'Value 2' },
- * );
- * ```
- * @param fields - The fields to add
- */
- addFields(...fields) {
- fields = normalizeArray(fields);
- validateFieldLength(fields.length, this.data.fields);
- embedFieldsArrayPredicate.parse(fields);
- if (this.data.fields)
- this.data.fields.push(...fields);
- else
- this.data.fields = fields;
- return this;
- }
- /**
- * Removes, replaces, or inserts fields in the embed.
- *
- * @remarks
- * This method behaves similarly
- * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice}.
- * The maximum amount of fields that can be added is 25.
- *
- * It's useful for modifying and adjusting order of the already-existing fields of an embed.
- * @example
- * Remove the first field
- * ```ts
- * embed.spliceFields(0, 1);
- * ```
- * @example
- * Remove the first n fields
- * ```ts
- * const n = 4
- * embed.spliceFields(0, n);
- * ```
- * @example
- * Remove the last field
- * ```ts
- * embed.spliceFields(-1, 1);
- * ```
- * @param index - The index to start at
- * @param deleteCount - The number of fields to remove
- * @param fields - The replacing field objects
- */
- spliceFields(index, deleteCount, ...fields) {
- validateFieldLength(fields.length - deleteCount, this.data.fields);
- embedFieldsArrayPredicate.parse(fields);
- if (this.data.fields)
- this.data.fields.splice(index, deleteCount, ...fields);
- else
- this.data.fields = fields;
- return this;
- }
- /**
- * Sets the embed's fields
- *
- * @remarks
- * This method is an alias for {@link EmbedBuilder.spliceFields}. More specifically,
- * it splices the entire array of fields, replacing them with the provided fields.
- *
- * You can set a maximum of 25 fields.
- * @param fields - The fields to set
- */
- setFields(...fields) {
- this.spliceFields(0, this.data.fields?.length ?? 0, ...normalizeArray(fields));
- return this;
- }
- /**
- * Sets the author of this embed
- *
- * @param options - The options for the author
- */
- setAuthor(options) {
- if (options === null) {
- this.data.author = void 0;
- return this;
- }
- embedAuthorPredicate.parse(options);
- this.data.author = {
- name: options.name,
- url: options.url,
- icon_url: options.iconURL
- };
- return this;
- }
- /**
- * Sets the color of this embed
- *
- * @param color - The color of the embed
- */
- setColor(color) {
- colorPredicate.parse(color);
- if (Array.isArray(color)) {
- const [red, green, blue] = color;
- this.data.color = (red << 16) + (green << 8) + blue;
- return this;
- }
- this.data.color = color ?? void 0;
- return this;
- }
- /**
- * Sets the description of this embed
- *
- * @param description - The description
- */
- setDescription(description) {
- descriptionPredicate.parse(description);
- this.data.description = description ?? void 0;
- return this;
- }
- /**
- * Sets the footer of this embed
- *
- * @param options - The options for the footer
- */
- setFooter(options) {
- if (options === null) {
- this.data.footer = void 0;
- return this;
- }
- embedFooterPredicate.parse(options);
- this.data.footer = {
- text: options.text,
- icon_url: options.iconURL
- };
- return this;
- }
- /**
- * Sets the image of this embed
- *
- * @param url - The URL of the image
- */
- setImage(url) {
- imageURLPredicate.parse(url);
- this.data.image = url ? {
- url
- } : void 0;
- return this;
- }
- /**
- * Sets the thumbnail of this embed
- *
- * @param url - The URL of the thumbnail
- */
- setThumbnail(url) {
- imageURLPredicate.parse(url);
- this.data.thumbnail = url ? {
- url
- } : void 0;
- return this;
- }
- /**
- * Sets the timestamp of this embed
- *
- * @param timestamp - The timestamp or date
- */
- setTimestamp(timestamp = Date.now()) {
- timestampPredicate.parse(timestamp);
- this.data.timestamp = timestamp ? new Date(timestamp).toISOString() : void 0;
- return this;
- }
- /**
- * Sets the title of this embed
- *
- * @param title - The title
- */
- setTitle(title) {
- titlePredicate.parse(title);
- this.data.title = title ?? void 0;
- return this;
- }
- /**
- * Sets the URL of this embed
- *
- * @param url - The URL
- */
- setURL(url) {
- urlPredicate.parse(url);
- this.data.url = url ?? void 0;
- return this;
- }
- /**
- * Transforms the embed to a plain object
- */
- toJSON() {
- return {
- ...this.data
- };
- }
-};
-__name(EmbedBuilder, "EmbedBuilder");
-
-// src/index.ts
-export * from "@discordjs/formatters";
-
-// src/components/Assertions.ts
-var Assertions_exports2 = {};
-__export(Assertions_exports2, {
- buttonLabelValidator: () => buttonLabelValidator,
- buttonStyleValidator: () => buttonStyleValidator,
- channelTypesValidator: () => channelTypesValidator,
- customIdValidator: () => customIdValidator,
- defaultValidator: () => defaultValidator,
- disabledValidator: () => disabledValidator,
- emojiValidator: () => emojiValidator,
- jsonOptionValidator: () => jsonOptionValidator,
- labelValueDescriptionValidator: () => labelValueDescriptionValidator,
- minMaxValidator: () => minMaxValidator,
- optionValidator: () => optionValidator,
- optionsLengthValidator: () => optionsLengthValidator,
- optionsValidator: () => optionsValidator,
- placeholderValidator: () => placeholderValidator,
- urlValidator: () => urlValidator,
- validateRequiredButtonParameters: () => validateRequiredButtonParameters,
- validateRequiredSelectMenuOptionParameters: () => validateRequiredSelectMenuOptionParameters,
- validateRequiredSelectMenuParameters: () => validateRequiredSelectMenuParameters
-});
-import { s as s2 } from "@sapphire/shapeshift";
-import { ButtonStyle, ChannelType } from "discord-api-types/v10";
-
-// src/components/selectMenu/StringSelectMenuOption.ts
-var StringSelectMenuOptionBuilder = class {
- /**
- * Creates a new string select menu option from API data
- *
- * @param data - The API data to create this string select menu option with
- * @example
- * Creating a string select menu option from an API data object
- * ```ts
- * const selectMenuOption = new SelectMenuOptionBuilder({
- * label: 'catchy label',
- * value: '1',
- * });
- * ```
- * @example
- * Creating a string select menu option using setters and API data
- * ```ts
- * const selectMenuOption = new SelectMenuOptionBuilder({
- * default: true,
- * value: '1',
- * })
- * .setLabel('woah')
- * ```
- */
- constructor(data = {}) {
- this.data = data;
- }
- /**
- * Sets the label of this option
- *
- * @param label - The label to show on this option
- */
- setLabel(label) {
- this.data.label = labelValueDescriptionValidator.parse(label);
- return this;
- }
- /**
- * Sets the value of this option
- *
- * @param value - The value of this option
- */
- setValue(value) {
- this.data.value = labelValueDescriptionValidator.parse(value);
- return this;
- }
- /**
- * Sets the description of this option
- *
- * @param description - The description of this option
- */
- setDescription(description) {
- this.data.description = labelValueDescriptionValidator.parse(description);
- return this;
- }
- /**
- * Sets whether this option is selected by default
- *
- * @param isDefault - Whether this option is selected by default
- */
- setDefault(isDefault = true) {
- this.data.default = defaultValidator.parse(isDefault);
- return this;
- }
- /**
- * Sets the emoji to display on this option
- *
- * @param emoji - The emoji to display on this option
- */
- setEmoji(emoji) {
- this.data.emoji = emojiValidator.parse(emoji);
- return this;
- }
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON() {
- validateRequiredSelectMenuOptionParameters(this.data.label, this.data.value);
- return {
- ...this.data
- };
- }
-};
-__name(StringSelectMenuOptionBuilder, "StringSelectMenuOptionBuilder");
-
-// src/components/Assertions.ts
-var customIdValidator = s2.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled);
-var emojiValidator = s2.object({
- id: s2.string,
- name: s2.string,
- animated: s2.boolean
-}).partial.strict.setValidationEnabled(isValidationEnabled);
-var disabledValidator = s2.boolean;
-var buttonLabelValidator = s2.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(80).setValidationEnabled(isValidationEnabled);
-var buttonStyleValidator = s2.nativeEnum(ButtonStyle);
-var placeholderValidator = s2.string.lengthLessThanOrEqual(150).setValidationEnabled(isValidationEnabled);
-var minMaxValidator = s2.number.int.greaterThanOrEqual(0).lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);
-var labelValueDescriptionValidator = s2.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled);
-var jsonOptionValidator = s2.object({
- label: labelValueDescriptionValidator,
- value: labelValueDescriptionValidator,
- description: labelValueDescriptionValidator.optional,
- emoji: emojiValidator.optional,
- default: s2.boolean.optional
-}).setValidationEnabled(isValidationEnabled);
-var optionValidator = s2.instance(StringSelectMenuOptionBuilder).setValidationEnabled(isValidationEnabled);
-var optionsValidator = optionValidator.array.lengthGreaterThanOrEqual(0).setValidationEnabled(isValidationEnabled);
-var optionsLengthValidator = s2.number.int.greaterThanOrEqual(0).lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);
-function validateRequiredSelectMenuParameters(options, customId) {
- customIdValidator.parse(customId);
- optionsValidator.parse(options);
-}
-__name(validateRequiredSelectMenuParameters, "validateRequiredSelectMenuParameters");
-var defaultValidator = s2.boolean;
-function validateRequiredSelectMenuOptionParameters(label, value) {
- labelValueDescriptionValidator.parse(label);
- labelValueDescriptionValidator.parse(value);
-}
-__name(validateRequiredSelectMenuOptionParameters, "validateRequiredSelectMenuOptionParameters");
-var channelTypesValidator = s2.nativeEnum(ChannelType).array.setValidationEnabled(isValidationEnabled);
-var urlValidator = s2.string.url({
- allowedProtocols: [
- "http:",
- "https:",
- "discord:"
- ]
-}).setValidationEnabled(isValidationEnabled);
-function validateRequiredButtonParameters(style, label, emoji, customId, url) {
- if (url && customId) {
- throw new RangeError("URL and custom id are mutually exclusive");
- }
- if (!label && !emoji) {
- throw new RangeError("Buttons must have a label and/or an emoji");
- }
- if (style === ButtonStyle.Link) {
- if (!url) {
- throw new RangeError("Link buttons must have a url");
- }
- } else if (url) {
- throw new RangeError("Non-link buttons cannot have a url");
- }
-}
-__name(validateRequiredButtonParameters, "validateRequiredButtonParameters");
-
-// src/components/ActionRow.ts
-import { ComponentType as ComponentType9 } from "discord-api-types/v10";
-
-// src/components/Component.ts
-var ComponentBuilder = class {
- constructor(data) {
- this.data = data;
- }
-};
-__name(ComponentBuilder, "ComponentBuilder");
-
-// src/components/Components.ts
-import { ComponentType as ComponentType8 } from "discord-api-types/v10";
-
-// src/components/button/Button.ts
-import { ComponentType } from "discord-api-types/v10";
-var ButtonBuilder = class extends ComponentBuilder {
- /**
- * Creates a new button from API data
- *
- * @param data - The API data to create this button with
- * @example
- * Creating a button from an API data object
- * ```ts
- * const button = new ButtonBuilder({
- * custom_id: 'a cool button',
- * style: ButtonStyle.Primary,
- * label: 'Click Me',
- * emoji: {
- * name: 'smile',
- * id: '123456789012345678',
- * },
- * });
- * ```
- * @example
- * Creating a button using setters and API data
- * ```ts
- * const button = new ButtonBuilder({
- * style: ButtonStyle.Secondary,
- * label: 'Click Me',
- * })
- * .setEmoji({ name: '🙂' })
- * .setCustomId('another cool button');
- * ```
- */
- constructor(data) {
- super({
- type: ComponentType.Button,
- ...data
- });
- }
- /**
- * Sets the style of this button
- *
- * @param style - The style of the button
- */
- setStyle(style) {
- this.data.style = buttonStyleValidator.parse(style);
- return this;
- }
- /**
- * Sets the URL for this button
- *
- * @remarks
- * This method is only available to buttons using the `Link` button style.
- * Only three types of URL schemes are currently supported: `https://`, `http://` and `discord://`
- * @param url - The URL to open when this button is clicked
- */
- setURL(url) {
- this.data.url = urlValidator.parse(url);
- return this;
- }
- /**
- * Sets the custom id for this button
- *
- * @remarks
- * This method is only applicable to buttons that are not using the `Link` button style.
- * @param customId - The custom id to use for this button
- */
- setCustomId(customId) {
- this.data.custom_id = customIdValidator.parse(customId);
- return this;
- }
- /**
- * Sets the emoji to display on this button
- *
- * @param emoji - The emoji to display on this button
- */
- setEmoji(emoji) {
- this.data.emoji = emojiValidator.parse(emoji);
- return this;
- }
- /**
- * Sets whether this button is disabled
- *
- * @param disabled - Whether to disable this button
- */
- setDisabled(disabled = true) {
- this.data.disabled = disabledValidator.parse(disabled);
- return this;
- }
- /**
- * Sets the label for this button
- *
- * @param label - The label to display on this button
- */
- setLabel(label) {
- this.data.label = buttonLabelValidator.parse(label);
- return this;
- }
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON() {
- validateRequiredButtonParameters(this.data.style, this.data.label, this.data.emoji, this.data.custom_id, this.data.url);
- return {
- ...this.data
- };
- }
-};
-__name(ButtonBuilder, "ButtonBuilder");
-
-// src/components/selectMenu/ChannelSelectMenu.ts
-import { ComponentType as ComponentType2 } from "discord-api-types/v10";
-
-// src/components/selectMenu/BaseSelectMenu.ts
-var BaseSelectMenuBuilder = class extends ComponentBuilder {
- /**
- * Sets the placeholder for this select menu
- *
- * @param placeholder - The placeholder to use for this select menu
- */
- setPlaceholder(placeholder) {
- this.data.placeholder = placeholderValidator.parse(placeholder);
- return this;
- }
- /**
- * Sets the minimum values that must be selected in the select menu
- *
- * @param minValues - The minimum values that must be selected
- */
- setMinValues(minValues) {
- this.data.min_values = minMaxValidator.parse(minValues);
- return this;
- }
- /**
- * Sets the maximum values that must be selected in the select menu
- *
- * @param maxValues - The maximum values that must be selected
- */
- setMaxValues(maxValues) {
- this.data.max_values = minMaxValidator.parse(maxValues);
- return this;
- }
- /**
- * Sets the custom id for this select menu
- *
- * @param customId - The custom id to use for this select menu
- */
- setCustomId(customId) {
- this.data.custom_id = customIdValidator.parse(customId);
- return this;
- }
- /**
- * Sets whether this select menu is disabled
- *
- * @param disabled - Whether this select menu is disabled
- */
- setDisabled(disabled = true) {
- this.data.disabled = disabledValidator.parse(disabled);
- return this;
- }
- toJSON() {
- customIdValidator.parse(this.data.custom_id);
- return {
- ...this.data
- };
- }
-};
-__name(BaseSelectMenuBuilder, "BaseSelectMenuBuilder");
-
-// src/components/selectMenu/ChannelSelectMenu.ts
-var ChannelSelectMenuBuilder = class extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object
- * ```ts
- * const selectMenu = new ChannelSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data
- * ```ts
- * const selectMenu = new ChannelSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .addChannelTypes(ChannelType.GuildText, ChannelType.GuildAnnouncement)
- * .setMinValues(2)
- * ```
- */
- constructor(data) {
- super({
- ...data,
- type: ComponentType2.ChannelSelect
- });
- }
- addChannelTypes(...types) {
- types = normalizeArray(types);
- this.data.channel_types ??= [];
- this.data.channel_types.push(...channelTypesValidator.parse(types));
- return this;
- }
- setChannelTypes(...types) {
- types = normalizeArray(types);
- this.data.channel_types ??= [];
- this.data.channel_types.splice(0, this.data.channel_types.length, ...channelTypesValidator.parse(types));
- return this;
- }
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON() {
- customIdValidator.parse(this.data.custom_id);
- return {
- ...this.data
- };
- }
-};
-__name(ChannelSelectMenuBuilder, "ChannelSelectMenuBuilder");
-
-// src/components/selectMenu/MentionableSelectMenu.ts
-import { ComponentType as ComponentType3 } from "discord-api-types/v10";
-var MentionableSelectMenuBuilder = class extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object
- * ```ts
- * const selectMenu = new MentionableSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data
- * ```ts
- * const selectMenu = new MentionableSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .setMinValues(1)
- * ```
- */
- constructor(data) {
- super({
- ...data,
- type: ComponentType3.MentionableSelect
- });
- }
-};
-__name(MentionableSelectMenuBuilder, "MentionableSelectMenuBuilder");
-
-// src/components/selectMenu/RoleSelectMenu.ts
-import { ComponentType as ComponentType4 } from "discord-api-types/v10";
-var RoleSelectMenuBuilder = class extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object
- * ```ts
- * const selectMenu = new RoleSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data
- * ```ts
- * const selectMenu = new RoleSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .setMinValues(1)
- * ```
- */
- constructor(data) {
- super({
- ...data,
- type: ComponentType4.RoleSelect
- });
- }
-};
-__name(RoleSelectMenuBuilder, "RoleSelectMenuBuilder");
-
-// src/components/selectMenu/StringSelectMenu.ts
-import { ComponentType as ComponentType5 } from "discord-api-types/v10";
-var StringSelectMenuBuilder = class extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object
- * ```ts
- * const selectMenu = new StringSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * options: [
- * { label: 'option 1', value: '1' },
- * { label: 'option 2', value: '2' },
- * { label: 'option 3', value: '3' },
- * ],
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data
- * ```ts
- * const selectMenu = new StringSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .setMinValues(1)
- * .addOptions({
- * label: 'Catchy',
- * value: 'catch',
- * });
- * ```
- */
- constructor(data) {
- const { options, ...initData } = data ?? {};
- super({
- ...initData,
- type: ComponentType5.StringSelect
- });
- this.options = options?.map((option) => new StringSelectMenuOptionBuilder(option)) ?? [];
- }
- /**
- * Adds options to this select menu
- *
- * @param options - The options to add to this select menu
- * @returns
- */
- addOptions(...options) {
- options = normalizeArray(options);
- optionsLengthValidator.parse(this.options.length + options.length);
- this.options.push(...options.map((option) => option instanceof StringSelectMenuOptionBuilder ? option : new StringSelectMenuOptionBuilder(jsonOptionValidator.parse(option))));
- return this;
- }
- /**
- * Sets the options on this select menu
- *
- * @param options - The options to set on this select menu
- */
- setOptions(...options) {
- return this.spliceOptions(0, this.options.length, ...options);
- }
- /**
- * Removes, replaces, or inserts options in the string select menu.
- *
- * @remarks
- * This method behaves similarly
- * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice | Array.prototype.splice}.
- *
- * It's useful for modifying and adjusting order of the already-existing options of a string select menu.
- * @example
- * Remove the first option
- * ```ts
- * selectMenu.spliceOptions(0, 1);
- * ```
- * @example
- * Remove the first n option
- * ```ts
- * const n = 4
- * selectMenu.spliceOptions(0, n);
- * ```
- * @example
- * Remove the last option
- * ```ts
- * selectMenu.spliceOptions(-1, 1);
- * ```
- * @param index - The index to start at
- * @param deleteCount - The number of options to remove
- * @param options - The replacing option objects or builders
- */
- spliceOptions(index, deleteCount, ...options) {
- options = normalizeArray(options);
- const clone = [
- ...this.options
- ];
- clone.splice(index, deleteCount, ...options.map((option) => option instanceof StringSelectMenuOptionBuilder ? option : new StringSelectMenuOptionBuilder(jsonOptionValidator.parse(option))));
- optionsLengthValidator.parse(clone.length);
- this.options.splice(0, this.options.length, ...clone);
- return this;
- }
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON() {
- validateRequiredSelectMenuParameters(this.options, this.data.custom_id);
- return {
- ...this.data,
- options: this.options.map((option) => option.toJSON())
- };
- }
-};
-__name(StringSelectMenuBuilder, "StringSelectMenuBuilder");
-
-// src/components/selectMenu/UserSelectMenu.ts
-import { ComponentType as ComponentType6 } from "discord-api-types/v10";
-var UserSelectMenuBuilder = class extends BaseSelectMenuBuilder {
- /**
- * Creates a new select menu from API data
- *
- * @param data - The API data to create this select menu with
- * @example
- * Creating a select menu from an API data object
- * ```ts
- * const selectMenu = new UserSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * placeholder: 'select an option',
- * max_values: 2,
- * });
- * ```
- * @example
- * Creating a select menu using setters and API data
- * ```ts
- * const selectMenu = new UserSelectMenuBuilder({
- * custom_id: 'a cool select menu',
- * })
- * .setMinValues(1)
- * ```
- */
- constructor(data) {
- super({
- ...data,
- type: ComponentType6.UserSelect
- });
- }
-};
-__name(UserSelectMenuBuilder, "UserSelectMenuBuilder");
-
-// src/components/textInput/TextInput.ts
-import { isJSONEncodable } from "@discordjs/util";
-import { ComponentType as ComponentType7 } from "discord-api-types/v10";
-import isEqual from "fast-deep-equal";
-
-// src/components/textInput/Assertions.ts
-var Assertions_exports3 = {};
-__export(Assertions_exports3, {
- labelValidator: () => labelValidator,
- maxLengthValidator: () => maxLengthValidator,
- minLengthValidator: () => minLengthValidator,
- placeholderValidator: () => placeholderValidator2,
- requiredValidator: () => requiredValidator,
- textInputStyleValidator: () => textInputStyleValidator,
- validateRequiredParameters: () => validateRequiredParameters,
- valueValidator: () => valueValidator
-});
-import { s as s3 } from "@sapphire/shapeshift";
-import { TextInputStyle } from "discord-api-types/v10";
-var textInputStyleValidator = s3.nativeEnum(TextInputStyle);
-var minLengthValidator = s3.number.int.greaterThanOrEqual(0).lessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled);
-var maxLengthValidator = s3.number.int.greaterThanOrEqual(1).lessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled);
-var requiredValidator = s3.boolean;
-var valueValidator = s3.string.lengthLessThanOrEqual(4e3).setValidationEnabled(isValidationEnabled);
-var placeholderValidator2 = s3.string.lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled);
-var labelValidator = s3.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(45).setValidationEnabled(isValidationEnabled);
-function validateRequiredParameters(customId, style, label) {
- customIdValidator.parse(customId);
- textInputStyleValidator.parse(style);
- labelValidator.parse(label);
-}
-__name(validateRequiredParameters, "validateRequiredParameters");
-
-// src/components/textInput/TextInput.ts
-var TextInputBuilder = class extends ComponentBuilder {
- /**
- * Creates a new text input from API data
- *
- * @param data - The API data to create this text input with
- * @example
- * Creating a select menu option from an API data object
- * ```ts
- * const textInput = new TextInputBuilder({
- * custom_id: 'a cool select menu',
- * label: 'Type something',
- * style: TextInputStyle.Short,
- * });
- * ```
- * @example
- * Creating a select menu option using setters and API data
- * ```ts
- * const textInput = new TextInputBuilder({
- * label: 'Type something else',
- * })
- * .setCustomId('woah')
- * .setStyle(TextInputStyle.Paragraph);
- * ```
- */
- constructor(data) {
- super({
- type: ComponentType7.TextInput,
- ...data
- });
- }
- /**
- * Sets the custom id for this text input
- *
- * @param customId - The custom id of this text input
- */
- setCustomId(customId) {
- this.data.custom_id = customIdValidator.parse(customId);
- return this;
- }
- /**
- * Sets the label for this text input
- *
- * @param label - The label for this text input
- */
- setLabel(label) {
- this.data.label = labelValidator.parse(label);
- return this;
- }
- /**
- * Sets the style for this text input
- *
- * @param style - The style for this text input
- */
- setStyle(style) {
- this.data.style = textInputStyleValidator.parse(style);
- return this;
- }
- /**
- * Sets the minimum length of text for this text input
- *
- * @param minLength - The minimum length of text for this text input
- */
- setMinLength(minLength) {
- this.data.min_length = minLengthValidator.parse(minLength);
- return this;
- }
- /**
- * Sets the maximum length of text for this text input
- *
- * @param maxLength - The maximum length of text for this text input
- */
- setMaxLength(maxLength) {
- this.data.max_length = maxLengthValidator.parse(maxLength);
- return this;
- }
- /**
- * Sets the placeholder of this text input
- *
- * @param placeholder - The placeholder of this text input
- */
- setPlaceholder(placeholder) {
- this.data.placeholder = placeholderValidator2.parse(placeholder);
- return this;
- }
- /**
- * Sets the value of this text input
- *
- * @param value - The value for this text input
- */
- setValue(value) {
- this.data.value = valueValidator.parse(value);
- return this;
- }
- /**
- * Sets whether this text input is required
- *
- * @param required - Whether this text input is required
- */
- setRequired(required = true) {
- this.data.required = requiredValidator.parse(required);
- return this;
- }
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON() {
- validateRequiredParameters(this.data.custom_id, this.data.style, this.data.label);
- return {
- ...this.data
- };
- }
- /**
- * {@inheritDoc Equatable.equals}
- */
- equals(other) {
- if (isJSONEncodable(other)) {
- return isEqual(other.toJSON(), this.data);
- }
- return isEqual(other, this.data);
- }
-};
-__name(TextInputBuilder, "TextInputBuilder");
-
-// src/components/Components.ts
-function createComponentBuilder(data) {
- if (data instanceof ComponentBuilder) {
- return data;
- }
- switch (data.type) {
- case ComponentType8.ActionRow:
- return new ActionRowBuilder(data);
- case ComponentType8.Button:
- return new ButtonBuilder(data);
- case ComponentType8.StringSelect:
- return new StringSelectMenuBuilder(data);
- case ComponentType8.TextInput:
- return new TextInputBuilder(data);
- case ComponentType8.UserSelect:
- return new UserSelectMenuBuilder(data);
- case ComponentType8.RoleSelect:
- return new RoleSelectMenuBuilder(data);
- case ComponentType8.MentionableSelect:
- return new MentionableSelectMenuBuilder(data);
- case ComponentType8.ChannelSelect:
- return new ChannelSelectMenuBuilder(data);
- default:
- throw new Error(`Cannot properly serialize component type: ${data.type}`);
- }
-}
-__name(createComponentBuilder, "createComponentBuilder");
-
-// src/components/ActionRow.ts
-var ActionRowBuilder = class extends ComponentBuilder {
- /**
- * Creates a new action row from API data
- *
- * @param data - The API data to create this action row with
- * @example
- * Creating an action row from an API data object
- * ```ts
- * const actionRow = new ActionRowBuilder({
- * components: [
- * {
- * custom_id: "custom id",
- * label: "Type something",
- * style: TextInputStyle.Short,
- * type: ComponentType.TextInput,
- * },
- * ],
- * });
- * ```
- * @example
- * Creating an action row using setters and API data
- * ```ts
- * const actionRow = new ActionRowBuilder({
- * components: [
- * {
- * custom_id: "custom id",
- * label: "Click me",
- * style: ButtonStyle.Primary,
- * type: ComponentType.Button,
- * },
- * ],
- * })
- * .addComponents(button2, button3);
- * ```
- */
- constructor({ components, ...data } = {}) {
- super({
- type: ComponentType9.ActionRow,
- ...data
- });
- this.components = components?.map((component) => createComponentBuilder(component)) ?? [];
- }
- /**
- * Adds components to this action row.
- *
- * @param components - The components to add to this action row.
- */
- addComponents(...components) {
- this.components.push(...normalizeArray(components));
- return this;
- }
- /**
- * Sets the components in this action row
- *
- * @param components - The components to set this row to
- */
- setComponents(...components) {
- this.components.splice(0, this.components.length, ...normalizeArray(components));
- return this;
- }
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON() {
- return {
- ...this.data,
- components: this.components.map((component) => component.toJSON())
- };
- }
-};
-__name(ActionRowBuilder, "ActionRowBuilder");
-
-// src/interactions/modals/Assertions.ts
-var Assertions_exports4 = {};
-__export(Assertions_exports4, {
- componentsValidator: () => componentsValidator,
- titleValidator: () => titleValidator,
- validateRequiredParameters: () => validateRequiredParameters2
-});
-import { s as s4 } from "@sapphire/shapeshift";
-var titleValidator = s4.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(45).setValidationEnabled(isValidationEnabled);
-var componentsValidator = s4.instance(ActionRowBuilder).array.lengthGreaterThanOrEqual(1).setValidationEnabled(isValidationEnabled);
-function validateRequiredParameters2(customId, title, components) {
- customIdValidator.parse(customId);
- titleValidator.parse(title);
- componentsValidator.parse(components);
-}
-__name(validateRequiredParameters2, "validateRequiredParameters");
-
-// src/interactions/modals/Modal.ts
-var ModalBuilder = class {
- components = [];
- constructor({ components, ...data } = {}) {
- this.data = {
- ...data
- };
- this.components = components?.map((component) => createComponentBuilder(component)) ?? [];
- }
- /**
- * Sets the title of the modal
- *
- * @param title - The title of the modal
- */
- setTitle(title) {
- this.data.title = titleValidator.parse(title);
- return this;
- }
- /**
- * Sets the custom id of the modal
- *
- * @param customId - The custom id of this modal
- */
- setCustomId(customId) {
- this.data.custom_id = customIdValidator.parse(customId);
- return this;
- }
- /**
- * Adds components to this modal
- *
- * @param components - The components to add to this modal
- */
- addComponents(...components) {
- this.components.push(...normalizeArray(components).map((component) => component instanceof ActionRowBuilder ? component : new ActionRowBuilder(component)));
- return this;
- }
- /**
- * Sets the components in this modal
- *
- * @param components - The components to set this modal to
- */
- setComponents(...components) {
- this.components.splice(0, this.components.length, ...normalizeArray(components));
- return this;
- }
- /**
- * {@inheritDoc ComponentBuilder.toJSON}
- */
- toJSON() {
- validateRequiredParameters2(this.data.custom_id, this.data.title, this.components);
- return {
- ...this.data,
- components: this.components.map((component) => component.toJSON())
- };
- }
-};
-__name(ModalBuilder, "ModalBuilder");
-
-// src/interactions/slashCommands/Assertions.ts
-var Assertions_exports5 = {};
-__export(Assertions_exports5, {
- assertReturnOfBuilder: () => assertReturnOfBuilder,
- localizationMapPredicate: () => localizationMapPredicate,
- validateChoicesLength: () => validateChoicesLength,
- validateDMPermission: () => validateDMPermission,
- validateDefaultMemberPermissions: () => validateDefaultMemberPermissions,
- validateDefaultPermission: () => validateDefaultPermission,
- validateDescription: () => validateDescription,
- validateLocale: () => validateLocale,
- validateLocalizationMap: () => validateLocalizationMap,
- validateMaxOptionsLength: () => validateMaxOptionsLength,
- validateNSFW: () => validateNSFW,
- validateName: () => validateName,
- validateRequired: () => validateRequired,
- validateRequiredParameters: () => validateRequiredParameters3
-});
-import { s as s5 } from "@sapphire/shapeshift";
-import { Locale } from "discord-api-types/v10";
-var namePredicate = s5.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(32).regex(/^[\p{Ll}\p{Lm}\p{Lo}\p{N}\p{sc=Devanagari}\p{sc=Thai}_-]+$/u).setValidationEnabled(isValidationEnabled);
-function validateName(name) {
- namePredicate.parse(name);
-}
-__name(validateName, "validateName");
-var descriptionPredicate2 = s5.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100).setValidationEnabled(isValidationEnabled);
-var localePredicate = s5.nativeEnum(Locale);
-function validateDescription(description) {
- descriptionPredicate2.parse(description);
-}
-__name(validateDescription, "validateDescription");
-var maxArrayLengthPredicate = s5.unknown.array.lengthLessThanOrEqual(25).setValidationEnabled(isValidationEnabled);
-function validateLocale(locale) {
- return localePredicate.parse(locale);
-}
-__name(validateLocale, "validateLocale");
-function validateMaxOptionsLength(options) {
- maxArrayLengthPredicate.parse(options);
-}
-__name(validateMaxOptionsLength, "validateMaxOptionsLength");
-function validateRequiredParameters3(name, description, options) {
- validateName(name);
- validateDescription(description);
- validateMaxOptionsLength(options);
-}
-__name(validateRequiredParameters3, "validateRequiredParameters");
-var booleanPredicate = s5.boolean;
-function validateDefaultPermission(value) {
- booleanPredicate.parse(value);
-}
-__name(validateDefaultPermission, "validateDefaultPermission");
-function validateRequired(required) {
- booleanPredicate.parse(required);
-}
-__name(validateRequired, "validateRequired");
-var choicesLengthPredicate = s5.number.lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);
-function validateChoicesLength(amountAdding, choices) {
- choicesLengthPredicate.parse((choices?.length ?? 0) + amountAdding);
-}
-__name(validateChoicesLength, "validateChoicesLength");
-function assertReturnOfBuilder(input, ExpectedInstanceOf) {
- s5.instance(ExpectedInstanceOf).parse(input);
-}
-__name(assertReturnOfBuilder, "assertReturnOfBuilder");
-var localizationMapPredicate = s5.object(Object.fromEntries(Object.values(Locale).map((locale) => [
- locale,
- s5.string.nullish
-]))).strict.nullish.setValidationEnabled(isValidationEnabled);
-function validateLocalizationMap(value) {
- localizationMapPredicate.parse(value);
-}
-__name(validateLocalizationMap, "validateLocalizationMap");
-var dmPermissionPredicate = s5.boolean.nullish;
-function validateDMPermission(value) {
- dmPermissionPredicate.parse(value);
-}
-__name(validateDMPermission, "validateDMPermission");
-var memberPermissionPredicate = s5.union(s5.bigint.transform((value) => value.toString()), s5.number.safeInt.transform((value) => value.toString()), s5.string.regex(/^\d+$/)).nullish;
-function validateDefaultMemberPermissions(permissions) {
- return memberPermissionPredicate.parse(permissions);
-}
-__name(validateDefaultMemberPermissions, "validateDefaultMemberPermissions");
-function validateNSFW(value) {
- booleanPredicate.parse(value);
-}
-__name(validateNSFW, "validateNSFW");
-
-// src/interactions/slashCommands/SlashCommandBuilder.ts
-import { mix as mix6 } from "ts-mixer";
-
-// src/interactions/slashCommands/SlashCommandSubcommands.ts
-import { ApplicationCommandOptionType as ApplicationCommandOptionType11 } from "discord-api-types/v10";
-import { mix as mix5 } from "ts-mixer";
-
-// src/interactions/slashCommands/mixins/NameAndDescription.ts
-var SharedNameAndDescription = class {
- /**
- * Sets the name
- *
- * @param name - The name
- */
- setName(name) {
- validateName(name);
- Reflect.set(this, "name", name);
- return this;
- }
- /**
- * Sets the description
- *
- * @param description - The description
- */
- setDescription(description) {
- validateDescription(description);
- Reflect.set(this, "description", description);
- return this;
- }
- /**
- * Sets a name localization
- *
- * @param locale - The locale to set a description for
- * @param localizedName - The localized description for the given locale
- */
- setNameLocalization(locale, localizedName) {
- if (!this.name_localizations) {
- Reflect.set(this, "name_localizations", {});
- }
- const parsedLocale = validateLocale(locale);
- if (localizedName === null) {
- this.name_localizations[parsedLocale] = null;
- return this;
- }
- validateName(localizedName);
- this.name_localizations[parsedLocale] = localizedName;
- return this;
- }
- /**
- * Sets the name localizations
- *
- * @param localizedNames - The dictionary of localized descriptions to set
- */
- setNameLocalizations(localizedNames) {
- if (localizedNames === null) {
- Reflect.set(this, "name_localizations", null);
- return this;
- }
- Reflect.set(this, "name_localizations", {});
- for (const args of Object.entries(localizedNames)) {
- this.setNameLocalization(...args);
- }
- return this;
- }
- /**
- * Sets a description localization
- *
- * @param locale - The locale to set a description for
- * @param localizedDescription - The localized description for the given locale
- */
- setDescriptionLocalization(locale, localizedDescription) {
- if (!this.description_localizations) {
- Reflect.set(this, "description_localizations", {});
- }
- const parsedLocale = validateLocale(locale);
- if (localizedDescription === null) {
- this.description_localizations[parsedLocale] = null;
- return this;
- }
- validateDescription(localizedDescription);
- this.description_localizations[parsedLocale] = localizedDescription;
- return this;
- }
- /**
- * Sets the description localizations
- *
- * @param localizedDescriptions - The dictionary of localized descriptions to set
- */
- setDescriptionLocalizations(localizedDescriptions) {
- if (localizedDescriptions === null) {
- Reflect.set(this, "description_localizations", null);
- return this;
- }
- Reflect.set(this, "description_localizations", {});
- for (const args of Object.entries(localizedDescriptions)) {
- this.setDescriptionLocalization(...args);
- }
- return this;
- }
-};
-__name(SharedNameAndDescription, "SharedNameAndDescription");
-
-// src/interactions/slashCommands/options/attachment.ts
-import { ApplicationCommandOptionType } from "discord-api-types/v10";
-
-// src/interactions/slashCommands/mixins/ApplicationCommandOptionBase.ts
-var ApplicationCommandOptionBase = class extends SharedNameAndDescription {
- required = false;
- /**
- * Marks the option as required
- *
- * @param required - If this option should be required
- */
- setRequired(required) {
- validateRequired(required);
- Reflect.set(this, "required", required);
- return this;
- }
- runRequiredValidations() {
- validateRequiredParameters3(this.name, this.description, []);
- validateLocalizationMap(this.name_localizations);
- validateLocalizationMap(this.description_localizations);
- validateRequired(this.required);
- }
-};
-__name(ApplicationCommandOptionBase, "ApplicationCommandOptionBase");
-
-// src/interactions/slashCommands/options/attachment.ts
-var SlashCommandAttachmentOption = class extends ApplicationCommandOptionBase {
- type = ApplicationCommandOptionType.Attachment;
- toJSON() {
- this.runRequiredValidations();
- return {
- ...this
- };
- }
-};
-__name(SlashCommandAttachmentOption, "SlashCommandAttachmentOption");
-
-// src/interactions/slashCommands/options/boolean.ts
-import { ApplicationCommandOptionType as ApplicationCommandOptionType2 } from "discord-api-types/v10";
-var SlashCommandBooleanOption = class extends ApplicationCommandOptionBase {
- type = ApplicationCommandOptionType2.Boolean;
- toJSON() {
- this.runRequiredValidations();
- return {
- ...this
- };
- }
-};
-__name(SlashCommandBooleanOption, "SlashCommandBooleanOption");
-
-// src/interactions/slashCommands/options/channel.ts
-import { ApplicationCommandOptionType as ApplicationCommandOptionType3 } from "discord-api-types/v10";
-import { mix } from "ts-mixer";
-
-// src/interactions/slashCommands/mixins/ApplicationCommandOptionChannelTypesMixin.ts
-import { s as s6 } from "@sapphire/shapeshift";
-import { ChannelType as ChannelType2 } from "discord-api-types/v10";
-var allowedChannelTypes = [
- ChannelType2.GuildText,
- ChannelType2.GuildVoice,
- ChannelType2.GuildCategory,
- ChannelType2.GuildAnnouncement,
- ChannelType2.AnnouncementThread,
- ChannelType2.PublicThread,
- ChannelType2.PrivateThread,
- ChannelType2.GuildStageVoice,
- ChannelType2.GuildForum
-];
-var channelTypesPredicate = s6.array(s6.union(...allowedChannelTypes.map((type) => s6.literal(type))));
-var ApplicationCommandOptionChannelTypesMixin = class {
- /**
- * Adds channel types to this option
- *
- * @param channelTypes - The channel types to add
- */
- addChannelTypes(...channelTypes) {
- if (this.channel_types === void 0) {
- Reflect.set(this, "channel_types", []);
- }
- this.channel_types.push(...channelTypesPredicate.parse(channelTypes));
- return this;
- }
-};
-__name(ApplicationCommandOptionChannelTypesMixin, "ApplicationCommandOptionChannelTypesMixin");
-
-// src/interactions/slashCommands/options/channel.ts
-var __decorate = function(decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
- r = Reflect.decorate(decorators, target, key, desc);
- else
- for (var i = decorators.length - 1; i >= 0; i--)
- if (d = decorators[i])
- r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
-};
-var SlashCommandChannelOption = /* @__PURE__ */ __name(class SlashCommandChannelOption2 extends ApplicationCommandOptionBase {
- type = ApplicationCommandOptionType3.Channel;
- toJSON() {
- this.runRequiredValidations();
- return {
- ...this
- };
- }
-}, "SlashCommandChannelOption");
-SlashCommandChannelOption = __decorate([
- mix(ApplicationCommandOptionChannelTypesMixin)
-], SlashCommandChannelOption);
-
-// src/interactions/slashCommands/options/integer.ts
-import { s as s8 } from "@sapphire/shapeshift";
-import { ApplicationCommandOptionType as ApplicationCommandOptionType5 } from "discord-api-types/v10";
-import { mix as mix2 } from "ts-mixer";
-
-// src/interactions/slashCommands/mixins/ApplicationCommandNumericOptionMinMaxValueMixin.ts
-var ApplicationCommandNumericOptionMinMaxValueMixin = class {
-};
-__name(ApplicationCommandNumericOptionMinMaxValueMixin, "ApplicationCommandNumericOptionMinMaxValueMixin");
-
-// src/interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin.ts
-import { s as s7 } from "@sapphire/shapeshift";
-import { ApplicationCommandOptionType as ApplicationCommandOptionType4 } from "discord-api-types/v10";
-var stringPredicate = s7.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(100);
-var numberPredicate = s7.number.greaterThan(Number.NEGATIVE_INFINITY).lessThan(Number.POSITIVE_INFINITY);
-var choicesPredicate = s7.object({
- name: stringPredicate,
- name_localizations: localizationMapPredicate,
- value: s7.union(stringPredicate, numberPredicate)
-}).array;
-var booleanPredicate2 = s7.boolean;
-var ApplicationCommandOptionWithChoicesAndAutocompleteMixin = class {
- /**
- * Adds multiple choices for this option
- *
- * @param choices - The choices to add
- */
- addChoices(...choices) {
- if (choices.length > 0 && this.autocomplete) {
- throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");
- }
- choicesPredicate.parse(choices);
- if (this.choices === void 0) {
- Reflect.set(this, "choices", []);
- }
- validateChoicesLength(choices.length, this.choices);
- for (const { name, name_localizations, value } of choices) {
- if (this.type === ApplicationCommandOptionType4.String) {
- stringPredicate.parse(value);
- } else {
- numberPredicate.parse(value);
- }
- this.choices.push({
- name,
- name_localizations,
- value
- });
- }
- return this;
- }
- setChoices(...choices) {
- if (choices.length > 0 && this.autocomplete) {
- throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");
- }
- choicesPredicate.parse(choices);
- Reflect.set(this, "choices", []);
- this.addChoices(...choices);
- return this;
- }
- /**
- * Marks the option as autocompletable
- *
- * @param autocomplete - If this option should be autocompletable
- */
- setAutocomplete(autocomplete) {
- booleanPredicate2.parse(autocomplete);
- if (autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {
- throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");
- }
- Reflect.set(this, "autocomplete", autocomplete);
- return this;
- }
-};
-__name(ApplicationCommandOptionWithChoicesAndAutocompleteMixin, "ApplicationCommandOptionWithChoicesAndAutocompleteMixin");
-
-// src/interactions/slashCommands/options/integer.ts
-var __decorate2 = function(decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
- r = Reflect.decorate(decorators, target, key, desc);
- else
- for (var i = decorators.length - 1; i >= 0; i--)
- if (d = decorators[i])
- r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
-};
-var numberValidator = s8.number.int;
-var SlashCommandIntegerOption = /* @__PURE__ */ __name(class SlashCommandIntegerOption2 extends ApplicationCommandOptionBase {
- type = ApplicationCommandOptionType5.Integer;
- /**
- * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue}
- */
- setMaxValue(max) {
- numberValidator.parse(max);
- Reflect.set(this, "max_value", max);
- return this;
- }
- /**
- * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue}
- */
- setMinValue(min) {
- numberValidator.parse(min);
- Reflect.set(this, "min_value", min);
- return this;
- }
- toJSON() {
- this.runRequiredValidations();
- if (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {
- throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");
- }
- return {
- ...this
- };
- }
-}, "SlashCommandIntegerOption");
-SlashCommandIntegerOption = __decorate2([
- mix2(ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionWithChoicesAndAutocompleteMixin)
-], SlashCommandIntegerOption);
-
-// src/interactions/slashCommands/options/mentionable.ts
-import { ApplicationCommandOptionType as ApplicationCommandOptionType6 } from "discord-api-types/v10";
-var SlashCommandMentionableOption = class extends ApplicationCommandOptionBase {
- type = ApplicationCommandOptionType6.Mentionable;
- toJSON() {
- this.runRequiredValidations();
- return {
- ...this
- };
- }
-};
-__name(SlashCommandMentionableOption, "SlashCommandMentionableOption");
-
-// src/interactions/slashCommands/options/number.ts
-import { s as s9 } from "@sapphire/shapeshift";
-import { ApplicationCommandOptionType as ApplicationCommandOptionType7 } from "discord-api-types/v10";
-import { mix as mix3 } from "ts-mixer";
-var __decorate3 = function(decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
- r = Reflect.decorate(decorators, target, key, desc);
- else
- for (var i = decorators.length - 1; i >= 0; i--)
- if (d = decorators[i])
- r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
-};
-var numberValidator2 = s9.number;
-var SlashCommandNumberOption = /* @__PURE__ */ __name(class SlashCommandNumberOption2 extends ApplicationCommandOptionBase {
- type = ApplicationCommandOptionType7.Number;
- /**
- * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMaxValue}
- */
- setMaxValue(max) {
- numberValidator2.parse(max);
- Reflect.set(this, "max_value", max);
- return this;
- }
- /**
- * {@inheritDoc ApplicationCommandNumericOptionMinMaxValueMixin.setMinValue}
- */
- setMinValue(min) {
- numberValidator2.parse(min);
- Reflect.set(this, "min_value", min);
- return this;
- }
- toJSON() {
- this.runRequiredValidations();
- if (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {
- throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");
- }
- return {
- ...this
- };
- }
-}, "SlashCommandNumberOption");
-SlashCommandNumberOption = __decorate3([
- mix3(ApplicationCommandNumericOptionMinMaxValueMixin, ApplicationCommandOptionWithChoicesAndAutocompleteMixin)
-], SlashCommandNumberOption);
-
-// src/interactions/slashCommands/options/role.ts
-import { ApplicationCommandOptionType as ApplicationCommandOptionType8 } from "discord-api-types/v10";
-var SlashCommandRoleOption = class extends ApplicationCommandOptionBase {
- type = ApplicationCommandOptionType8.Role;
- toJSON() {
- this.runRequiredValidations();
- return {
- ...this
- };
- }
-};
-__name(SlashCommandRoleOption, "SlashCommandRoleOption");
-
-// src/interactions/slashCommands/options/string.ts
-import { s as s10 } from "@sapphire/shapeshift";
-import { ApplicationCommandOptionType as ApplicationCommandOptionType9 } from "discord-api-types/v10";
-import { mix as mix4 } from "ts-mixer";
-var __decorate4 = function(decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
- r = Reflect.decorate(decorators, target, key, desc);
- else
- for (var i = decorators.length - 1; i >= 0; i--)
- if (d = decorators[i])
- r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
-};
-var minLengthValidator2 = s10.number.greaterThanOrEqual(0).lessThanOrEqual(6e3);
-var maxLengthValidator2 = s10.number.greaterThanOrEqual(1).lessThanOrEqual(6e3);
-var SlashCommandStringOption = /* @__PURE__ */ __name(class SlashCommandStringOption2 extends ApplicationCommandOptionBase {
- type = ApplicationCommandOptionType9.String;
- /**
- * Sets the maximum length of this string option.
- *
- * @param max - The maximum length this option can be
- */
- setMaxLength(max) {
- maxLengthValidator2.parse(max);
- Reflect.set(this, "max_length", max);
- return this;
- }
- /**
- * Sets the minimum length of this string option.
- *
- * @param min - The minimum length this option can be
- */
- setMinLength(min) {
- minLengthValidator2.parse(min);
- Reflect.set(this, "min_length", min);
- return this;
- }
- toJSON() {
- this.runRequiredValidations();
- if (this.autocomplete && Array.isArray(this.choices) && this.choices.length > 0) {
- throw new RangeError("Autocomplete and choices are mutually exclusive to each other.");
- }
- return {
- ...this
- };
- }
-}, "SlashCommandStringOption");
-SlashCommandStringOption = __decorate4([
- mix4(ApplicationCommandOptionWithChoicesAndAutocompleteMixin)
-], SlashCommandStringOption);
-
-// src/interactions/slashCommands/options/user.ts
-import { ApplicationCommandOptionType as ApplicationCommandOptionType10 } from "discord-api-types/v10";
-var SlashCommandUserOption = class extends ApplicationCommandOptionBase {
- type = ApplicationCommandOptionType10.User;
- toJSON() {
- this.runRequiredValidations();
- return {
- ...this
- };
- }
-};
-__name(SlashCommandUserOption, "SlashCommandUserOption");
-
-// src/interactions/slashCommands/mixins/SharedSlashCommandOptions.ts
-var SharedSlashCommandOptions = class {
- /**
- * Adds a boolean option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addBooleanOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandBooleanOption);
- }
- /**
- * Adds a user option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addUserOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandUserOption);
- }
- /**
- * Adds a channel option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addChannelOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandChannelOption);
- }
- /**
- * Adds a role option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addRoleOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandRoleOption);
- }
- /**
- * Adds an attachment option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addAttachmentOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandAttachmentOption);
- }
- /**
- * Adds a mentionable option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addMentionableOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandMentionableOption);
- }
- /**
- * Adds a string option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addStringOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandStringOption);
- }
- /**
- * Adds an integer option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addIntegerOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandIntegerOption);
- }
- /**
- * Adds a number option
- *
- * @param input - A function that returns an option builder, or an already built builder
- */
- addNumberOption(input) {
- return this._sharedAddOptionMethod(input, SlashCommandNumberOption);
- }
- _sharedAddOptionMethod(input, Instance) {
- const { options } = this;
- validateMaxOptionsLength(options);
- const result = typeof input === "function" ? input(new Instance()) : input;
- assertReturnOfBuilder(result, Instance);
- options.push(result);
- return this;
- }
-};
-__name(SharedSlashCommandOptions, "SharedSlashCommandOptions");
-
-// src/interactions/slashCommands/SlashCommandSubcommands.ts
-var __decorate5 = function(decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
- r = Reflect.decorate(decorators, target, key, desc);
- else
- for (var i = decorators.length - 1; i >= 0; i--)
- if (d = decorators[i])
- r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
-};
-var SlashCommandSubcommandGroupBuilder = /* @__PURE__ */ __name(class SlashCommandSubcommandGroupBuilder2 {
- /**
- * The name of this subcommand group
- */
- name = void 0;
- /**
- * The description of this subcommand group
- */
- description = void 0;
- /**
- * The subcommands part of this subcommand group
- */
- options = [];
- /**
- * Adds a new subcommand to this group
- *
- * @param input - A function that returns a subcommand builder, or an already built builder
- */
- addSubcommand(input) {
- const { options } = this;
- validateMaxOptionsLength(options);
- const result = typeof input === "function" ? input(new SlashCommandSubcommandBuilder()) : input;
- assertReturnOfBuilder(result, SlashCommandSubcommandBuilder);
- options.push(result);
- return this;
- }
- toJSON() {
- validateRequiredParameters3(this.name, this.description, this.options);
- return {
- type: ApplicationCommandOptionType11.SubcommandGroup,
- name: this.name,
- name_localizations: this.name_localizations,
- description: this.description,
- description_localizations: this.description_localizations,
- options: this.options.map((option) => option.toJSON())
- };
- }
-}, "SlashCommandSubcommandGroupBuilder");
-SlashCommandSubcommandGroupBuilder = __decorate5([
- mix5(SharedNameAndDescription)
-], SlashCommandSubcommandGroupBuilder);
-var SlashCommandSubcommandBuilder = /* @__PURE__ */ __name(class SlashCommandSubcommandBuilder2 {
- /**
- * The name of this subcommand
- */
- name = void 0;
- /**
- * The description of this subcommand
- */
- description = void 0;
- /**
- * The options of this subcommand
- */
- options = [];
- toJSON() {
- validateRequiredParameters3(this.name, this.description, this.options);
- return {
- type: ApplicationCommandOptionType11.Subcommand,
- name: this.name,
- name_localizations: this.name_localizations,
- description: this.description,
- description_localizations: this.description_localizations,
- options: this.options.map((option) => option.toJSON())
- };
- }
-}, "SlashCommandSubcommandBuilder");
-SlashCommandSubcommandBuilder = __decorate5([
- mix5(SharedNameAndDescription, SharedSlashCommandOptions)
-], SlashCommandSubcommandBuilder);
-
-// src/interactions/slashCommands/SlashCommandBuilder.ts
-var __decorate6 = function(decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
- r = Reflect.decorate(decorators, target, key, desc);
- else
- for (var i = decorators.length - 1; i >= 0; i--)
- if (d = decorators[i])
- r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
-};
-var SlashCommandBuilder = /* @__PURE__ */ __name(class SlashCommandBuilder2 {
- /**
- * The name of this slash command
- */
- name = void 0;
- /**
- * The description of this slash command
- */
- description = void 0;
- /**
- * The options of this slash command
- */
- options = [];
- /**
- * Whether the command is enabled by default when the app is added to a guild
- *
- * @deprecated This property is deprecated and will be removed in the future.
- * You should use {@link (SlashCommandBuilder:class).setDefaultMemberPermissions} or {@link (SlashCommandBuilder:class).setDMPermission} instead.
- */
- default_permission = void 0;
- /**
- * Set of permissions represented as a bit set for the command
- */
- default_member_permissions = void 0;
- /**
- * Indicates whether the command is available in DMs with the application, only for globally-scoped commands.
- * By default, commands are visible.
- */
- dm_permission = void 0;
- /**
- * Whether this command is NSFW
- */
- nsfw = void 0;
- /**
- * Returns the final data that should be sent to Discord.
- *
- * @remarks
- * This method runs validations on the data before serializing it.
- * As such, it may throw an error if the data is invalid.
- */
- toJSON() {
- validateRequiredParameters3(this.name, this.description, this.options);
- validateLocalizationMap(this.name_localizations);
- validateLocalizationMap(this.description_localizations);
- return {
- ...this,
- options: this.options.map((option) => option.toJSON())
- };
- }
- /**
- * Sets whether the command is enabled by default when the application is added to a guild.
- *
- * @remarks
- * If set to `false`, you will have to later `PUT` the permissions for this command.
- * @param value - Whether or not to enable this command by default
- * @see https://discord.com/developers/docs/interactions/application-commands#permissions
- * @deprecated Use {@link (SlashCommandBuilder:class).setDefaultMemberPermissions} or {@link (SlashCommandBuilder:class).setDMPermission} instead.
- */
- setDefaultPermission(value) {
- validateDefaultPermission(value);
- Reflect.set(this, "default_permission", value);
- return this;
- }
- /**
- * Sets the default permissions a member should have in order to run the command.
- *
- * @remarks
- * You can set this to `'0'` to disable the command by default.
- * @param permissions - The permissions bit field to set
- * @see https://discord.com/developers/docs/interactions/application-commands#permissions
- */
- setDefaultMemberPermissions(permissions) {
- const permissionValue = validateDefaultMemberPermissions(permissions);
- Reflect.set(this, "default_member_permissions", permissionValue);
- return this;
- }
- /**
- * Sets if the command is available in DMs with the application, only for globally-scoped commands.
- * By default, commands are visible.
- *
- * @param enabled - If the command should be enabled in DMs
- * @see https://discord.com/developers/docs/interactions/application-commands#permissions
- */
- setDMPermission(enabled) {
- validateDMPermission(enabled);
- Reflect.set(this, "dm_permission", enabled);
- return this;
- }
- /**
- * Sets whether this command is NSFW
- *
- * @param nsfw - Whether this command is NSFW
- */
- setNSFW(nsfw = true) {
- validateNSFW(nsfw);
- Reflect.set(this, "nsfw", nsfw);
- return this;
- }
- /**
- * Adds a new subcommand group to this command
- *
- * @param input - A function that returns a subcommand group builder, or an already built builder
- */
- addSubcommandGroup(input) {
- const { options } = this;
- validateMaxOptionsLength(options);
- const result = typeof input === "function" ? input(new SlashCommandSubcommandGroupBuilder()) : input;
- assertReturnOfBuilder(result, SlashCommandSubcommandGroupBuilder);
- options.push(result);
- return this;
- }
- /**
- * Adds a new subcommand to this command
- *
- * @param input - A function that returns a subcommand builder, or an already built builder
- */
- addSubcommand(input) {
- const { options } = this;
- validateMaxOptionsLength(options);
- const result = typeof input === "function" ? input(new SlashCommandSubcommandBuilder()) : input;
- assertReturnOfBuilder(result, SlashCommandSubcommandBuilder);
- options.push(result);
- return this;
- }
-}, "SlashCommandBuilder");
-SlashCommandBuilder = __decorate6([
- mix6(SharedSlashCommandOptions, SharedNameAndDescription)
-], SlashCommandBuilder);
-
-// src/interactions/contextMenuCommands/Assertions.ts
-var Assertions_exports6 = {};
-__export(Assertions_exports6, {
- validateDMPermission: () => validateDMPermission2,
- validateDefaultMemberPermissions: () => validateDefaultMemberPermissions2,
- validateDefaultPermission: () => validateDefaultPermission2,
- validateName: () => validateName2,
- validateRequiredParameters: () => validateRequiredParameters4,
- validateType: () => validateType
-});
-import { s as s11 } from "@sapphire/shapeshift";
-import { ApplicationCommandType } from "discord-api-types/v10";
-var namePredicate2 = s11.string.lengthGreaterThanOrEqual(1).lengthLessThanOrEqual(32).regex(/^( *[\p{P}\p{L}\p{N}\p{sc=Devanagari}\p{sc=Thai}]+ *)+$/u).setValidationEnabled(isValidationEnabled);
-var typePredicate = s11.union(s11.literal(ApplicationCommandType.User), s11.literal(ApplicationCommandType.Message)).setValidationEnabled(isValidationEnabled);
-var booleanPredicate3 = s11.boolean;
-function validateDefaultPermission2(value) {
- booleanPredicate3.parse(value);
-}
-__name(validateDefaultPermission2, "validateDefaultPermission");
-function validateName2(name) {
- namePredicate2.parse(name);
-}
-__name(validateName2, "validateName");
-function validateType(type) {
- typePredicate.parse(type);
-}
-__name(validateType, "validateType");
-function validateRequiredParameters4(name, type) {
- validateName2(name);
- validateType(type);
-}
-__name(validateRequiredParameters4, "validateRequiredParameters");
-var dmPermissionPredicate2 = s11.boolean.nullish;
-function validateDMPermission2(value) {
- dmPermissionPredicate2.parse(value);
-}
-__name(validateDMPermission2, "validateDMPermission");
-var memberPermissionPredicate2 = s11.union(s11.bigint.transform((value) => value.toString()), s11.number.safeInt.transform((value) => value.toString()), s11.string.regex(/^\d+$/)).nullish;
-function validateDefaultMemberPermissions2(permissions) {
- return memberPermissionPredicate2.parse(permissions);
-}
-__name(validateDefaultMemberPermissions2, "validateDefaultMemberPermissions");
-
-// src/interactions/contextMenuCommands/ContextMenuCommandBuilder.ts
-var ContextMenuCommandBuilder = class {
- /**
- * The name of this context menu command
- */
- name = void 0;
- /**
- * The type of this context menu command
- */
- type = void 0;
- /**
- * Whether the command is enabled by default when the app is added to a guild
- *
- * @deprecated This property is deprecated and will be removed in the future.
- * You should use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.
- */
- default_permission = void 0;
- /**
- * Set of permissions represented as a bit set for the command
- */
- default_member_permissions = void 0;
- /**
- * Indicates whether the command is available in DMs with the application, only for globally-scoped commands.
- * By default, commands are visible.
- */
- dm_permission = void 0;
- /**
- * Sets the name
- *
- * @param name - The name
- */
- setName(name) {
- validateName2(name);
- Reflect.set(this, "name", name);
- return this;
- }
- /**
- * Sets the type
- *
- * @param type - The type
- */
- setType(type) {
- validateType(type);
- Reflect.set(this, "type", type);
- return this;
- }
- /**
- * Sets whether the command is enabled by default when the application is added to a guild.
- *
- * @remarks
- * If set to `false`, you will have to later `PUT` the permissions for this command.
- * @param value - Whether or not to enable this command by default
- * @see https://discord.com/developers/docs/interactions/application-commands#permissions
- * @deprecated Use {@link ContextMenuCommandBuilder.setDefaultMemberPermissions} or {@link ContextMenuCommandBuilder.setDMPermission} instead.
- */
- setDefaultPermission(value) {
- validateDefaultPermission2(value);
- Reflect.set(this, "default_permission", value);
- return this;
- }
- /**
- * Sets the default permissions a member should have in order to run the command.
- *
- * @remarks
- * You can set this to `'0'` to disable the command by default.
- * @param permissions - The permissions bit field to set
- * @see https://discord.com/developers/docs/interactions/application-commands#permissions
- */
- setDefaultMemberPermissions(permissions) {
- const permissionValue = validateDefaultMemberPermissions2(permissions);
- Reflect.set(this, "default_member_permissions", permissionValue);
- return this;
- }
- /**
- * Sets if the command is available in DMs with the application, only for globally-scoped commands.
- * By default, commands are visible.
- *
- * @param enabled - If the command should be enabled in DMs
- * @see https://discord.com/developers/docs/interactions/application-commands#permissions
- */
- setDMPermission(enabled) {
- validateDMPermission2(enabled);
- Reflect.set(this, "dm_permission", enabled);
- return this;
- }
- /**
- * Sets a name localization
- *
- * @param locale - The locale to set a description for
- * @param localizedName - The localized description for the given locale
- */
- setNameLocalization(locale, localizedName) {
- if (!this.name_localizations) {
- Reflect.set(this, "name_localizations", {});
- }
- const parsedLocale = validateLocale(locale);
- if (localizedName === null) {
- this.name_localizations[parsedLocale] = null;
- return this;
- }
- validateName2(localizedName);
- this.name_localizations[parsedLocale] = localizedName;
- return this;
- }
- /**
- * Sets the name localizations
- *
- * @param localizedNames - The dictionary of localized descriptions to set
- */
- setNameLocalizations(localizedNames) {
- if (localizedNames === null) {
- Reflect.set(this, "name_localizations", null);
- return this;
- }
- Reflect.set(this, "name_localizations", {});
- for (const args of Object.entries(localizedNames))
- this.setNameLocalization(...args);
- return this;
- }
- /**
- * Returns the final data that should be sent to Discord.
- *
- * @remarks
- * This method runs validations on the data before serializing it.
- * As such, it may throw an error if the data is invalid.
- */
- toJSON() {
- validateRequiredParameters4(this.name, this.type);
- validateLocalizationMap(this.name_localizations);
- return {
- ...this
- };
- }
-};
-__name(ContextMenuCommandBuilder, "ContextMenuCommandBuilder");
-
-// src/util/componentUtil.ts
-function embedLength(data) {
- return (data.title?.length ?? 0) + (data.description?.length ?? 0) + (data.fields?.reduce((prev, curr) => prev + curr.name.length + curr.value.length, 0) ?? 0) + (data.footer?.text.length ?? 0) + (data.author?.name.length ?? 0);
-}
-__name(embedLength, "embedLength");
-
-// src/index.ts
-export * from "@discordjs/util";
-var version = "[VI]{{inject}}[/VI]";
-export {
- ActionRowBuilder,
- ApplicationCommandNumericOptionMinMaxValueMixin,
- ApplicationCommandOptionBase,
- ApplicationCommandOptionChannelTypesMixin,
- ApplicationCommandOptionWithChoicesAndAutocompleteMixin,
- BaseSelectMenuBuilder,
- ButtonBuilder,
- ChannelSelectMenuBuilder,
- Assertions_exports2 as ComponentAssertions,
- ComponentBuilder,
- Assertions_exports6 as ContextMenuCommandAssertions,
- ContextMenuCommandBuilder,
- Assertions_exports as EmbedAssertions,
- EmbedBuilder,
- MentionableSelectMenuBuilder,
- Assertions_exports4 as ModalAssertions,
- ModalBuilder,
- RoleSelectMenuBuilder,
- StringSelectMenuBuilder as SelectMenuBuilder,
- StringSelectMenuOptionBuilder as SelectMenuOptionBuilder,
- SharedNameAndDescription,
- SharedSlashCommandOptions,
- Assertions_exports5 as SlashCommandAssertions,
- SlashCommandAttachmentOption,
- SlashCommandBooleanOption,
- SlashCommandBuilder,
- SlashCommandChannelOption,
- SlashCommandIntegerOption,
- SlashCommandMentionableOption,
- SlashCommandNumberOption,
- SlashCommandRoleOption,
- SlashCommandStringOption,
- SlashCommandSubcommandBuilder,
- SlashCommandSubcommandGroupBuilder,
- SlashCommandUserOption,
- StringSelectMenuBuilder,
- StringSelectMenuOptionBuilder,
- Assertions_exports3 as TextInputAssertions,
- TextInputBuilder,
- UserSelectMenuBuilder,
- createComponentBuilder,
- disableValidators,
- embedLength,
- enableValidators,
- isValidationEnabled,
- normalizeArray,
- version
-};
-//# sourceMappingURL=index.mjs.map
\ No newline at end of file
diff --git a/node_modules/@discordjs/builders/dist/index.mjs.map b/node_modules/@discordjs/builders/dist/index.mjs.map
deleted file mode 100644
index 8b72d7e..0000000
--- a/node_modules/@discordjs/builders/dist/index.mjs.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["../src/messages/embed/Assertions.ts","../src/util/validation.ts","../src/util/normalizeArray.ts","../src/messages/embed/Embed.ts","../src/index.ts","../src/components/Assertions.ts","../src/components/selectMenu/StringSelectMenuOption.ts","../src/components/ActionRow.ts","../src/components/Component.ts","../src/components/Components.ts","../src/components/button/Button.ts","../src/components/selectMenu/ChannelSelectMenu.ts","../src/components/selectMenu/BaseSelectMenu.ts","../src/components/selectMenu/MentionableSelectMenu.ts","../src/components/selectMenu/RoleSelectMenu.ts","../src/components/selectMenu/StringSelectMenu.ts","../src/components/selectMenu/UserSelectMenu.ts","../src/components/textInput/TextInput.ts","../src/components/textInput/Assertions.ts","../src/interactions/modals/Assertions.ts","../src/interactions/modals/Modal.ts","../src/interactions/slashCommands/Assertions.ts","../src/interactions/slashCommands/SlashCommandBuilder.ts","../src/interactions/slashCommands/SlashCommandSubcommands.ts","../src/interactions/slashCommands/mixins/NameAndDescription.ts","../src/interactions/slashCommands/options/attachment.ts","../src/interactions/slashCommands/mixins/ApplicationCommandOptionBase.ts","../src/interactions/slashCommands/options/boolean.ts","../src/interactions/slashCommands/options/channel.ts","../src/interactions/slashCommands/mixins/ApplicationCommandOptionChannelTypesMixin.ts","../src/interactions/slashCommands/options/integer.ts","../src/interactions/slashCommands/mixins/ApplicationCommandNumericOptionMinMaxValueMixin.ts","../src/interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin.ts","../src/interactions/slashCommands/options/mentionable.ts","../src/interactions/slashCommands/options/number.ts","../src/interactions/slashCommands/options/role.ts","../src/interactions/slashCommands/options/string.ts","../src/interactions/slashCommands/options/user.ts","../src/interactions/slashCommands/mixins/SharedSlashCommandOptions.ts","../src/interactions/contextMenuCommands/Assertions.ts","../src/interactions/contextMenuCommands/ContextMenuCommandBuilder.ts","../src/util/componentUtil.ts"],"sourcesContent":["import { s } from '@sapphire/shapeshift';\nimport type { APIEmbedField } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../../util/validation.js';\n\nexport const fieldNamePredicate = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(256)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const fieldValuePredicate = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(1_024)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const fieldInlinePredicate = s.boolean.optional;\n\nexport const embedFieldPredicate = s\n\t.object({\n\t\tname: fieldNamePredicate,\n\t\tvalue: fieldValuePredicate,\n\t\tinline: fieldInlinePredicate,\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const embedFieldsArrayPredicate = embedFieldPredicate.array.setValidationEnabled(isValidationEnabled);\n\nexport const fieldLengthPredicate = s.number.lessThanOrEqual(25).setValidationEnabled(isValidationEnabled);\n\nexport function validateFieldLength(amountAdding: number, fields?: APIEmbedField[]): void {\n\tfieldLengthPredicate.parse((fields?.length ?? 0) + amountAdding);\n}\n\nexport const authorNamePredicate = fieldNamePredicate.nullable.setValidationEnabled(isValidationEnabled);\n\nexport const imageURLPredicate = s.string\n\t.url({\n\t\tallowedProtocols: ['http:', 'https:', 'attachment:'],\n\t})\n\t.nullish.setValidationEnabled(isValidationEnabled);\n\nexport const urlPredicate = s.string\n\t.url({\n\t\tallowedProtocols: ['http:', 'https:'],\n\t})\n\t.nullish.setValidationEnabled(isValidationEnabled);\n\nexport const embedAuthorPredicate = s\n\t.object({\n\t\tname: authorNamePredicate,\n\t\ticonURL: imageURLPredicate,\n\t\turl: urlPredicate,\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const RGBPredicate = s.number.int\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(255)\n\t.setValidationEnabled(isValidationEnabled);\nexport const colorPredicate = s.number.int\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(0xffffff)\n\t.or(s.tuple([RGBPredicate, RGBPredicate, RGBPredicate]))\n\t.nullable.setValidationEnabled(isValidationEnabled);\n\nexport const descriptionPredicate = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(4_096)\n\t.nullable.setValidationEnabled(isValidationEnabled);\n\nexport const footerTextPredicate = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(2_048)\n\t.nullable.setValidationEnabled(isValidationEnabled);\n\nexport const embedFooterPredicate = s\n\t.object({\n\t\ttext: footerTextPredicate,\n\t\ticonURL: imageURLPredicate,\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const timestampPredicate = s.union(s.number, s.date).nullable.setValidationEnabled(isValidationEnabled);\n\nexport const titlePredicate = fieldNamePredicate.nullable.setValidationEnabled(isValidationEnabled);\n","let validate = true;\n\nexport const enableValidators = () => (validate = true);\nexport const disableValidators = () => (validate = false);\nexport const isValidationEnabled = () => validate;\n","export function normalizeArray(arr: RestOrArray): T[] {\n\tif (Array.isArray(arr[0])) return arr[0];\n\treturn arr as T[];\n}\n\nexport type RestOrArray = T[] | [T[]];\n","import type { APIEmbed, APIEmbedAuthor, APIEmbedField, APIEmbedFooter, APIEmbedImage } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport {\n\tcolorPredicate,\n\tdescriptionPredicate,\n\tembedAuthorPredicate,\n\tembedFieldsArrayPredicate,\n\tembedFooterPredicate,\n\timageURLPredicate,\n\ttimestampPredicate,\n\ttitlePredicate,\n\turlPredicate,\n\tvalidateFieldLength,\n} from './Assertions.js';\n\nexport type RGBTuple = [red: number, green: number, blue: number];\n\nexport interface IconData {\n\t/**\n\t * The URL of the icon\n\t */\n\ticonURL?: string;\n\t/**\n\t * The proxy URL of the icon\n\t */\n\tproxyIconURL?: string;\n}\n\nexport type EmbedAuthorData = IconData & Omit;\n\nexport type EmbedAuthorOptions = Omit;\n\nexport type EmbedFooterData = IconData & Omit;\n\nexport type EmbedFooterOptions = Omit;\n\nexport interface EmbedImageData extends Omit {\n\t/**\n\t * The proxy URL for the image\n\t */\n\tproxyURL?: string;\n}\n/**\n * Represents a embed in a message (image/video preview, rich embed, etc.)\n */\nexport class EmbedBuilder {\n\tpublic readonly data: APIEmbed;\n\n\tpublic constructor(data: APIEmbed = {}) {\n\t\tthis.data = { ...data };\n\t\tif (data.timestamp) this.data.timestamp = new Date(data.timestamp).toISOString();\n\t}\n\n\t/**\n\t * Appends fields to the embed\n\t *\n\t * @remarks\n\t * This method accepts either an array of fields or a variable number of field parameters.\n\t * The maximum amount of fields that can be added is 25.\n\t * @example\n\t * Using an array\n\t * ```ts\n\t * const fields: APIEmbedField[] = ...;\n\t * const embed = new EmbedBuilder()\n\t * \t.addFields(fields);\n\t * ```\n\t * @example\n\t * Using rest parameters (variadic)\n\t * ```ts\n\t * const embed = new EmbedBuilder()\n\t * \t.addFields(\n\t * \t\t{ name: 'Field 1', value: 'Value 1' },\n\t * \t\t{ name: 'Field 2', value: 'Value 2' },\n\t * \t);\n\t * ```\n\t * @param fields - The fields to add\n\t */\n\tpublic addFields(...fields: RestOrArray): this {\n\t\t// eslint-disable-next-line no-param-reassign\n\t\tfields = normalizeArray(fields);\n\t\t// Ensure adding these fields won't exceed the 25 field limit\n\t\tvalidateFieldLength(fields.length, this.data.fields);\n\n\t\t// Data assertions\n\t\tembedFieldsArrayPredicate.parse(fields);\n\n\t\tif (this.data.fields) this.data.fields.push(...fields);\n\t\telse this.data.fields = fields;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Removes, replaces, or inserts fields in the embed.\n\t *\n\t * @remarks\n\t * This method behaves similarly\n\t * to {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice | Array.prototype.splice}.\n\t * The maximum amount of fields that can be added is 25.\n\t *\n\t * It's useful for modifying and adjusting order of the already-existing fields of an embed.\n\t * @example\n\t * Remove the first field\n\t * ```ts\n\t * embed.spliceFields(0, 1);\n\t * ```\n\t * @example\n\t * Remove the first n fields\n\t * ```ts\n\t * const n = 4\n\t * embed.spliceFields(0, n);\n\t * ```\n\t * @example\n\t * Remove the last field\n\t * ```ts\n\t * embed.spliceFields(-1, 1);\n\t * ```\n\t * @param index - The index to start at\n\t * @param deleteCount - The number of fields to remove\n\t * @param fields - The replacing field objects\n\t */\n\tpublic spliceFields(index: number, deleteCount: number, ...fields: APIEmbedField[]): this {\n\t\t// Ensure adding these fields won't exceed the 25 field limit\n\t\tvalidateFieldLength(fields.length - deleteCount, this.data.fields);\n\n\t\t// Data assertions\n\t\tembedFieldsArrayPredicate.parse(fields);\n\t\tif (this.data.fields) this.data.fields.splice(index, deleteCount, ...fields);\n\t\telse this.data.fields = fields;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the embed's fields\n\t *\n\t * @remarks\n\t * This method is an alias for {@link EmbedBuilder.spliceFields}. More specifically,\n\t * it splices the entire array of fields, replacing them with the provided fields.\n\t *\n\t * You can set a maximum of 25 fields.\n\t * @param fields - The fields to set\n\t */\n\tpublic setFields(...fields: RestOrArray) {\n\t\tthis.spliceFields(0, this.data.fields?.length ?? 0, ...normalizeArray(fields));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the author of this embed\n\t *\n\t * @param options - The options for the author\n\t */\n\n\tpublic setAuthor(options: EmbedAuthorOptions | null): this {\n\t\tif (options === null) {\n\t\t\tthis.data.author = undefined;\n\t\t\treturn this;\n\t\t}\n\n\t\t// Data assertions\n\t\tembedAuthorPredicate.parse(options);\n\n\t\tthis.data.author = { name: options.name, url: options.url, icon_url: options.iconURL };\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the color of this embed\n\t *\n\t * @param color - The color of the embed\n\t */\n\tpublic setColor(color: RGBTuple | number | null): this {\n\t\t// Data assertions\n\t\tcolorPredicate.parse(color);\n\n\t\tif (Array.isArray(color)) {\n\t\t\tconst [red, green, blue] = color;\n\t\t\tthis.data.color = (red << 16) + (green << 8) + blue;\n\t\t\treturn this;\n\t\t}\n\n\t\tthis.data.color = color ?? undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description of this embed\n\t *\n\t * @param description - The description\n\t */\n\tpublic setDescription(description: string | null): this {\n\t\t// Data assertions\n\t\tdescriptionPredicate.parse(description);\n\n\t\tthis.data.description = description ?? undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the footer of this embed\n\t *\n\t * @param options - The options for the footer\n\t */\n\tpublic setFooter(options: EmbedFooterOptions | null): this {\n\t\tif (options === null) {\n\t\t\tthis.data.footer = undefined;\n\t\t\treturn this;\n\t\t}\n\n\t\t// Data assertions\n\t\tembedFooterPredicate.parse(options);\n\n\t\tthis.data.footer = { text: options.text, icon_url: options.iconURL };\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the image of this embed\n\t *\n\t * @param url - The URL of the image\n\t */\n\tpublic setImage(url: string | null): this {\n\t\t// Data assertions\n\t\timageURLPredicate.parse(url);\n\n\t\tthis.data.image = url ? { url } : undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the thumbnail of this embed\n\t *\n\t * @param url - The URL of the thumbnail\n\t */\n\tpublic setThumbnail(url: string | null): this {\n\t\t// Data assertions\n\t\timageURLPredicate.parse(url);\n\n\t\tthis.data.thumbnail = url ? { url } : undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the timestamp of this embed\n\t *\n\t * @param timestamp - The timestamp or date\n\t */\n\tpublic setTimestamp(timestamp: Date | number | null = Date.now()): this {\n\t\t// Data assertions\n\t\ttimestampPredicate.parse(timestamp);\n\n\t\tthis.data.timestamp = timestamp ? new Date(timestamp).toISOString() : undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the title of this embed\n\t *\n\t * @param title - The title\n\t */\n\tpublic setTitle(title: string | null): this {\n\t\t// Data assertions\n\t\ttitlePredicate.parse(title);\n\n\t\tthis.data.title = title ?? undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the URL of this embed\n\t *\n\t * @param url - The URL\n\t */\n\tpublic setURL(url: string | null): this {\n\t\t// Data assertions\n\t\turlPredicate.parse(url);\n\n\t\tthis.data.url = url ?? undefined;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Transforms the embed to a plain object\n\t */\n\tpublic toJSON(): APIEmbed {\n\t\treturn { ...this.data };\n\t}\n}\n","export * as EmbedAssertions from './messages/embed/Assertions.js';\nexport * from './messages/embed/Embed.js';\n// TODO: Consider removing this dep in the next major version\nexport * from '@discordjs/formatters';\n\nexport * as ComponentAssertions from './components/Assertions.js';\nexport * from './components/ActionRow.js';\nexport * from './components/button/Button.js';\nexport * from './components/Component.js';\nexport * from './components/Components.js';\nexport * from './components/textInput/TextInput.js';\nexport * as TextInputAssertions from './components/textInput/Assertions.js';\nexport * from './interactions/modals/Modal.js';\nexport * as ModalAssertions from './interactions/modals/Assertions.js';\n\nexport * from './components/selectMenu/BaseSelectMenu.js';\nexport * from './components/selectMenu/ChannelSelectMenu.js';\nexport * from './components/selectMenu/MentionableSelectMenu.js';\nexport * from './components/selectMenu/RoleSelectMenu.js';\nexport * from './components/selectMenu/StringSelectMenu.js';\n// TODO: Remove those aliases in v2\nexport {\n\t/**\n\t * @deprecated Will be removed in the next major version, use {@link StringSelectMenuBuilder} instead.\n\t */\n\tStringSelectMenuBuilder as SelectMenuBuilder,\n} from './components/selectMenu/StringSelectMenu.js';\nexport {\n\t/**\n\t * @deprecated Will be removed in the next major version, use {@link StringSelectMenuOptionBuilder} instead.\n\t */\n\tStringSelectMenuOptionBuilder as SelectMenuOptionBuilder,\n} from './components/selectMenu/StringSelectMenuOption.js';\nexport * from './components/selectMenu/StringSelectMenuOption.js';\nexport * from './components/selectMenu/UserSelectMenu.js';\n\nexport * as SlashCommandAssertions from './interactions/slashCommands/Assertions.js';\nexport * from './interactions/slashCommands/SlashCommandBuilder.js';\nexport * from './interactions/slashCommands/SlashCommandSubcommands.js';\nexport * from './interactions/slashCommands/options/boolean.js';\nexport * from './interactions/slashCommands/options/channel.js';\nexport * from './interactions/slashCommands/options/integer.js';\nexport * from './interactions/slashCommands/options/mentionable.js';\nexport * from './interactions/slashCommands/options/number.js';\nexport * from './interactions/slashCommands/options/role.js';\nexport * from './interactions/slashCommands/options/attachment.js';\nexport * from './interactions/slashCommands/options/string.js';\nexport * from './interactions/slashCommands/options/user.js';\nexport * from './interactions/slashCommands/mixins/ApplicationCommandNumericOptionMinMaxValueMixin.js';\nexport * from './interactions/slashCommands/mixins/ApplicationCommandOptionBase.js';\nexport * from './interactions/slashCommands/mixins/ApplicationCommandOptionChannelTypesMixin.js';\nexport * from './interactions/slashCommands/mixins/ApplicationCommandOptionWithChoicesAndAutocompleteMixin.js';\nexport * from './interactions/slashCommands/mixins/NameAndDescription.js';\nexport * from './interactions/slashCommands/mixins/SharedSlashCommandOptions.js';\n\nexport * as ContextMenuCommandAssertions from './interactions/contextMenuCommands/Assertions.js';\nexport * from './interactions/contextMenuCommands/ContextMenuCommandBuilder.js';\n\nexport * from './util/componentUtil.js';\nexport * from './util/normalizeArray.js';\nexport * from './util/validation.js';\nexport * from '@discordjs/util';\n\n/**\n * The {@link https://github.com/discordjs/discord.js/blob/main/packages/builders/#readme | @discordjs/builders} version\n * that you are currently using.\n */\n// This needs to explicitly be `string` so it is not typed as a \"const string\" that gets injected by esbuild\nexport const version = '[VI]{{inject}}[/VI]' as string;\n","import { s } from '@sapphire/shapeshift';\nimport { ButtonStyle, ChannelType, type APIMessageComponentEmoji } from 'discord-api-types/v10';\nimport { isValidationEnabled } from '../util/validation.js';\nimport { StringSelectMenuOptionBuilder } from './selectMenu/StringSelectMenuOption.js';\n\nexport const customIdValidator = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(100)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const emojiValidator = s\n\t.object({\n\t\tid: s.string,\n\t\tname: s.string,\n\t\tanimated: s.boolean,\n\t})\n\t.partial.strict.setValidationEnabled(isValidationEnabled);\n\nexport const disabledValidator = s.boolean;\n\nexport const buttonLabelValidator = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(80)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const buttonStyleValidator = s.nativeEnum(ButtonStyle);\n\nexport const placeholderValidator = s.string.lengthLessThanOrEqual(150).setValidationEnabled(isValidationEnabled);\nexport const minMaxValidator = s.number.int\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(25)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const labelValueDescriptionValidator = s.string\n\t.lengthGreaterThanOrEqual(1)\n\t.lengthLessThanOrEqual(100)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const jsonOptionValidator = s\n\t.object({\n\t\tlabel: labelValueDescriptionValidator,\n\t\tvalue: labelValueDescriptionValidator,\n\t\tdescription: labelValueDescriptionValidator.optional,\n\t\temoji: emojiValidator.optional,\n\t\tdefault: s.boolean.optional,\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport const optionValidator = s.instance(StringSelectMenuOptionBuilder).setValidationEnabled(isValidationEnabled);\n\nexport const optionsValidator = optionValidator.array\n\t.lengthGreaterThanOrEqual(0)\n\t.setValidationEnabled(isValidationEnabled);\nexport const optionsLengthValidator = s.number.int\n\t.greaterThanOrEqual(0)\n\t.lessThanOrEqual(25)\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateRequiredSelectMenuParameters(options: StringSelectMenuOptionBuilder[], customId?: string) {\n\tcustomIdValidator.parse(customId);\n\toptionsValidator.parse(options);\n}\n\nexport const defaultValidator = s.boolean;\n\nexport function validateRequiredSelectMenuOptionParameters(label?: string, value?: string) {\n\tlabelValueDescriptionValidator.parse(label);\n\tlabelValueDescriptionValidator.parse(value);\n}\n\nexport const channelTypesValidator = s.nativeEnum(ChannelType).array.setValidationEnabled(isValidationEnabled);\n\nexport const urlValidator = s.string\n\t.url({\n\t\tallowedProtocols: ['http:', 'https:', 'discord:'],\n\t})\n\t.setValidationEnabled(isValidationEnabled);\n\nexport function validateRequiredButtonParameters(\n\tstyle?: ButtonStyle,\n\tlabel?: string,\n\temoji?: APIMessageComponentEmoji,\n\tcustomId?: string,\n\turl?: string,\n) {\n\tif (url && customId) {\n\t\tthrow new RangeError('URL and custom id are mutually exclusive');\n\t}\n\n\tif (!label && !emoji) {\n\t\tthrow new RangeError('Buttons must have a label and/or an emoji');\n\t}\n\n\tif (style === ButtonStyle.Link) {\n\t\tif (!url) {\n\t\t\tthrow new RangeError('Link buttons must have a url');\n\t\t}\n\t} else if (url) {\n\t\tthrow new RangeError('Non-link buttons cannot have a url');\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type { APIMessageComponentEmoji, APISelectMenuOption } from 'discord-api-types/v10';\nimport {\n\tdefaultValidator,\n\temojiValidator,\n\tlabelValueDescriptionValidator,\n\tvalidateRequiredSelectMenuOptionParameters,\n} from '../Assertions.js';\n\n/**\n * Represents an option within a string select menu component\n */\nexport class StringSelectMenuOptionBuilder implements JSONEncodable {\n\t/**\n\t * Creates a new string select menu option from API data\n\t *\n\t * @param data - The API data to create this string select menu option with\n\t * @example\n\t * Creating a string select menu option from an API data object\n\t * ```ts\n\t * const selectMenuOption = new SelectMenuOptionBuilder({\n\t * \tlabel: 'catchy label',\n\t * \tvalue: '1',\n\t * });\n\t * ```\n\t * @example\n\t * Creating a string select menu option using setters and API data\n\t * ```ts\n\t * const selectMenuOption = new SelectMenuOptionBuilder({\n\t * \tdefault: true,\n\t * \tvalue: '1',\n\t * })\n\t * \t.setLabel('woah')\n\t * ```\n\t */\n\tpublic constructor(public data: Partial = {}) {}\n\n\t/**\n\t * Sets the label of this option\n\t *\n\t * @param label - The label to show on this option\n\t */\n\tpublic setLabel(label: string) {\n\t\tthis.data.label = labelValueDescriptionValidator.parse(label);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the value of this option\n\t *\n\t * @param value - The value of this option\n\t */\n\tpublic setValue(value: string) {\n\t\tthis.data.value = labelValueDescriptionValidator.parse(value);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the description of this option\n\t *\n\t * @param description - The description of this option\n\t */\n\tpublic setDescription(description: string) {\n\t\tthis.data.description = labelValueDescriptionValidator.parse(description);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this option is selected by default\n\t *\n\t * @param isDefault - Whether this option is selected by default\n\t */\n\tpublic setDefault(isDefault = true) {\n\t\tthis.data.default = defaultValidator.parse(isDefault);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the emoji to display on this option\n\t *\n\t * @param emoji - The emoji to display on this option\n\t */\n\tpublic setEmoji(emoji: APIMessageComponentEmoji) {\n\t\tthis.data.emoji = emojiValidator.parse(emoji);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APISelectMenuOption {\n\t\tvalidateRequiredSelectMenuOptionParameters(this.data.label, this.data.value);\n\n\t\treturn {\n\t\t\t...this.data,\n\t\t} as APISelectMenuOption;\n\t}\n}\n","/* eslint-disable jsdoc/check-param-names */\n\nimport {\n\ttype APIActionRowComponent,\n\tComponentType,\n\ttype APIMessageActionRowComponent,\n\ttype APIModalActionRowComponent,\n\ttype APIActionRowComponentTypes,\n} from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../util/normalizeArray.js';\nimport { ComponentBuilder } from './Component.js';\nimport { createComponentBuilder } from './Components.js';\nimport type { ButtonBuilder } from './button/Button.js';\nimport type { ChannelSelectMenuBuilder } from './selectMenu/ChannelSelectMenu.js';\nimport type { MentionableSelectMenuBuilder } from './selectMenu/MentionableSelectMenu.js';\nimport type { RoleSelectMenuBuilder } from './selectMenu/RoleSelectMenu.js';\nimport type { StringSelectMenuBuilder } from './selectMenu/StringSelectMenu.js';\nimport type { UserSelectMenuBuilder } from './selectMenu/UserSelectMenu.js';\nimport type { TextInputBuilder } from './textInput/TextInput.js';\n\nexport type MessageComponentBuilder =\n\t| ActionRowBuilder\n\t| MessageActionRowComponentBuilder;\nexport type ModalComponentBuilder = ActionRowBuilder | ModalActionRowComponentBuilder;\nexport type MessageActionRowComponentBuilder =\n\t| ButtonBuilder\n\t| ChannelSelectMenuBuilder\n\t| MentionableSelectMenuBuilder\n\t| RoleSelectMenuBuilder\n\t| StringSelectMenuBuilder\n\t| UserSelectMenuBuilder;\nexport type ModalActionRowComponentBuilder = TextInputBuilder;\nexport type AnyComponentBuilder = MessageActionRowComponentBuilder | ModalActionRowComponentBuilder;\n\n/**\n * Represents an action row component\n *\n * @typeParam T - The types of components this action row holds\n */\nexport class ActionRowBuilder extends ComponentBuilder<\n\tAPIActionRowComponent\n> {\n\t/**\n\t * The components within this action row\n\t */\n\tpublic readonly components: T[];\n\n\t/**\n\t * Creates a new action row from API data\n\t *\n\t * @param data - The API data to create this action row with\n\t * @example\n\t * Creating an action row from an API data object\n\t * ```ts\n\t * const actionRow = new ActionRowBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcustom_id: \"custom id\",\n\t * \t\t\tlabel: \"Type something\",\n\t * \t\t\tstyle: TextInputStyle.Short,\n\t * \t\t\ttype: ComponentType.TextInput,\n\t * \t\t},\n\t * \t],\n\t * });\n\t * ```\n\t * @example\n\t * Creating an action row using setters and API data\n\t * ```ts\n\t * const actionRow = new ActionRowBuilder({\n\t * \tcomponents: [\n\t * \t\t{\n\t * \t\t\tcustom_id: \"custom id\",\n\t * \t\t\tlabel: \"Click me\",\n\t * \t\t\tstyle: ButtonStyle.Primary,\n\t * \t\t\ttype: ComponentType.Button,\n\t * \t\t},\n\t * \t],\n\t * })\n\t * \t.addComponents(button2, button3);\n\t * ```\n\t */\n\tpublic constructor({ components, ...data }: Partial> = {}) {\n\t\tsuper({ type: ComponentType.ActionRow, ...data });\n\t\tthis.components = (components?.map((component) => createComponentBuilder(component)) ?? []) as T[];\n\t}\n\n\t/**\n\t * Adds components to this action row.\n\t *\n\t * @param components - The components to add to this action row.\n\t */\n\tpublic addComponents(...components: RestOrArray) {\n\t\tthis.components.push(...normalizeArray(components));\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the components in this action row\n\t *\n\t * @param components - The components to set this row to\n\t */\n\tpublic setComponents(...components: RestOrArray) {\n\t\tthis.components.splice(0, this.components.length, ...normalizeArray(components));\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APIActionRowComponent> {\n\t\treturn {\n\t\t\t...this.data,\n\t\t\tcomponents: this.components.map((component) => component.toJSON()),\n\t\t} as APIActionRowComponent>;\n\t}\n}\n","import type { JSONEncodable } from '@discordjs/util';\nimport type {\n\tAPIActionRowComponent,\n\tAPIActionRowComponentTypes,\n\tAPIBaseComponent,\n\tComponentType,\n} from 'discord-api-types/v10';\n\nexport type AnyAPIActionRowComponent = APIActionRowComponent | APIActionRowComponentTypes;\n\n/**\n * Represents a discord component\n *\n * @typeParam DataType - The type of internal API data that is stored within the component\n */\nexport abstract class ComponentBuilder<\n\tDataType extends Partial> = APIBaseComponent,\n> implements JSONEncodable\n{\n\t/**\n\t * The API data associated with this component\n\t */\n\tpublic readonly data: Partial;\n\n\t/**\n\t * Serializes this component to an API-compatible JSON object\n\t *\n\t * @remarks\n\t * This method runs validations on the data before serializing it.\n\t * As such, it may throw an error if the data is invalid.\n\t */\n\tpublic abstract toJSON(): AnyAPIActionRowComponent;\n\n\tpublic constructor(data: Partial) {\n\t\tthis.data = data;\n\t}\n}\n","import { ComponentType, type APIMessageComponent, type APIModalComponent } from 'discord-api-types/v10';\nimport {\n\tActionRowBuilder,\n\ttype AnyComponentBuilder,\n\ttype MessageComponentBuilder,\n\ttype ModalComponentBuilder,\n} from './ActionRow.js';\nimport { ComponentBuilder } from './Component.js';\nimport { ButtonBuilder } from './button/Button.js';\nimport { ChannelSelectMenuBuilder } from './selectMenu/ChannelSelectMenu.js';\nimport { MentionableSelectMenuBuilder } from './selectMenu/MentionableSelectMenu.js';\nimport { RoleSelectMenuBuilder } from './selectMenu/RoleSelectMenu.js';\nimport { StringSelectMenuBuilder } from './selectMenu/StringSelectMenu.js';\nimport { UserSelectMenuBuilder } from './selectMenu/UserSelectMenu.js';\nimport { TextInputBuilder } from './textInput/TextInput.js';\n\nexport interface MappedComponentTypes {\n\t[ComponentType.ActionRow]: ActionRowBuilder;\n\t[ComponentType.Button]: ButtonBuilder;\n\t[ComponentType.StringSelect]: StringSelectMenuBuilder;\n\t[ComponentType.TextInput]: TextInputBuilder;\n\t[ComponentType.UserSelect]: UserSelectMenuBuilder;\n\t[ComponentType.RoleSelect]: RoleSelectMenuBuilder;\n\t[ComponentType.MentionableSelect]: MentionableSelectMenuBuilder;\n\t[ComponentType.ChannelSelect]: ChannelSelectMenuBuilder;\n}\n\n/**\n * Factory for creating components from API data\n *\n * @param data - The api data to transform to a component class\n */\nexport function createComponentBuilder(\n\t// eslint-disable-next-line @typescript-eslint/sort-type-union-intersection-members\n\tdata: (APIModalComponent | APIMessageComponent) & { type: T },\n): MappedComponentTypes[T];\nexport function createComponentBuilder(data: C): C;\nexport function createComponentBuilder(\n\tdata: APIMessageComponent | APIModalComponent | MessageComponentBuilder,\n): ComponentBuilder {\n\tif (data instanceof ComponentBuilder) {\n\t\treturn data;\n\t}\n\n\tswitch (data.type) {\n\t\tcase ComponentType.ActionRow:\n\t\t\treturn new ActionRowBuilder(data);\n\t\tcase ComponentType.Button:\n\t\t\treturn new ButtonBuilder(data);\n\t\tcase ComponentType.StringSelect:\n\t\t\treturn new StringSelectMenuBuilder(data);\n\t\tcase ComponentType.TextInput:\n\t\t\treturn new TextInputBuilder(data);\n\t\tcase ComponentType.UserSelect:\n\t\t\treturn new UserSelectMenuBuilder(data);\n\t\tcase ComponentType.RoleSelect:\n\t\t\treturn new RoleSelectMenuBuilder(data);\n\t\tcase ComponentType.MentionableSelect:\n\t\t\treturn new MentionableSelectMenuBuilder(data);\n\t\tcase ComponentType.ChannelSelect:\n\t\t\treturn new ChannelSelectMenuBuilder(data);\n\t\tdefault:\n\t\t\t// @ts-expect-error: This case can still occur if we get a newer unsupported component type\n\t\t\tthrow new Error(`Cannot properly serialize component type: ${data.type}`);\n\t}\n}\n","import {\n\tComponentType,\n\ttype APIMessageComponentEmoji,\n\ttype APIButtonComponent,\n\ttype APIButtonComponentWithURL,\n\ttype APIButtonComponentWithCustomId,\n\ttype ButtonStyle,\n} from 'discord-api-types/v10';\nimport {\n\tbuttonLabelValidator,\n\tbuttonStyleValidator,\n\tcustomIdValidator,\n\tdisabledValidator,\n\temojiValidator,\n\turlValidator,\n\tvalidateRequiredButtonParameters,\n} from '../Assertions.js';\nimport { ComponentBuilder } from '../Component.js';\n\n/**\n * Represents a button component\n */\nexport class ButtonBuilder extends ComponentBuilder {\n\t/**\n\t * Creates a new button from API data\n\t *\n\t * @param data - The API data to create this button with\n\t * @example\n\t * Creating a button from an API data object\n\t * ```ts\n\t * const button = new ButtonBuilder({\n\t * \tcustom_id: 'a cool button',\n\t * \tstyle: ButtonStyle.Primary,\n\t * \tlabel: 'Click Me',\n\t * \temoji: {\n\t * \t\tname: 'smile',\n\t * \t\tid: '123456789012345678',\n\t * \t},\n\t * });\n\t * ```\n\t * @example\n\t * Creating a button using setters and API data\n\t * ```ts\n\t * const button = new ButtonBuilder({\n\t * \tstyle: ButtonStyle.Secondary,\n\t * \tlabel: 'Click Me',\n\t * })\n\t * \t.setEmoji({ name: '🙂' })\n\t * \t.setCustomId('another cool button');\n\t * ```\n\t */\n\tpublic constructor(data?: Partial) {\n\t\tsuper({ type: ComponentType.Button, ...data });\n\t}\n\n\t/**\n\t * Sets the style of this button\n\t *\n\t * @param style - The style of the button\n\t */\n\tpublic setStyle(style: ButtonStyle) {\n\t\tthis.data.style = buttonStyleValidator.parse(style);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the URL for this button\n\t *\n\t * @remarks\n\t * This method is only available to buttons using the `Link` button style.\n\t * Only three types of URL schemes are currently supported: `https://`, `http://` and `discord://`\n\t * @param url - The URL to open when this button is clicked\n\t */\n\tpublic setURL(url: string) {\n\t\t(this.data as APIButtonComponentWithURL).url = urlValidator.parse(url);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the custom id for this button\n\t *\n\t * @remarks\n\t * This method is only applicable to buttons that are not using the `Link` button style.\n\t * @param customId - The custom id to use for this button\n\t */\n\tpublic setCustomId(customId: string) {\n\t\t(this.data as APIButtonComponentWithCustomId).custom_id = customIdValidator.parse(customId);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the emoji to display on this button\n\t *\n\t * @param emoji - The emoji to display on this button\n\t */\n\tpublic setEmoji(emoji: APIMessageComponentEmoji) {\n\t\tthis.data.emoji = emojiValidator.parse(emoji);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets whether this button is disabled\n\t *\n\t * @param disabled - Whether to disable this button\n\t */\n\tpublic setDisabled(disabled = true) {\n\t\tthis.data.disabled = disabledValidator.parse(disabled);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the label for this button\n\t *\n\t * @param label - The label to display on this button\n\t */\n\tpublic setLabel(label: string) {\n\t\tthis.data.label = buttonLabelValidator.parse(label);\n\t\treturn this;\n\t}\n\n\t/**\n\t * {@inheritDoc ComponentBuilder.toJSON}\n\t */\n\tpublic toJSON(): APIButtonComponent {\n\t\tvalidateRequiredButtonParameters(\n\t\t\tthis.data.style,\n\t\t\tthis.data.label,\n\t\t\tthis.data.emoji,\n\t\t\t(this.data as APIButtonComponentWithCustomId).custom_id,\n\t\t\t(this.data as APIButtonComponentWithURL).url,\n\t\t);\n\n\t\treturn {\n\t\t\t...this.data,\n\t\t} as APIButtonComponent;\n\t}\n}\n","import type { APIChannelSelectComponent, ChannelType } from 'discord-api-types/v10';\nimport { ComponentType } from 'discord-api-types/v10';\nimport { normalizeArray, type RestOrArray } from '../../util/normalizeArray.js';\nimport { channelTypesValidator, customIdValidator } from '../Assertions.js';\nimport { BaseSelectMenuBuilder } from './BaseSelectMenu.js';\n\nexport class ChannelSelectMenuBuilder extends BaseSelectMenuBuilder {\n\t/**\n\t * Creates a new select menu from API data\n\t *\n\t * @param data - The API data to create this select menu with\n\t * @example\n\t * Creating a select menu from an API data object\n\t * ```ts\n\t * const selectMenu = new ChannelSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * \tplaceholder: 'select an option',\n\t * \tmax_values: 2,\n\t * });\n\t * ```\n\t * @example\n\t * Creating a select menu using setters and API data\n\t * ```ts\n\t * const selectMenu = new ChannelSelectMenuBuilder({\n\t * \tcustom_id: 'a cool select menu',\n\t * })\n\t * \t.addChannelTypes(ChannelType.GuildText, ChannelType.GuildAnnouncement)\n\t * \t.setMinValues(2)\n\t * ```\n\t */\n\tpublic constructor(data?: Partial) {\n\t\tsuper({ ...data, type: ComponentType.ChannelSelect });\n\t}\n\n\tpublic addChannelTypes(...types: RestOrArray) {\n\t\t// eslint-disable-next-line no-param-reassign\n\t\ttypes = normalizeArray(types);\n\n\t\tthis.data.channel_types ??= [];\n\t\tthis.data.channel_types.push(...channelTypesValidator.parse(types));\n\t\treturn this;\n\t}\n\n\tpublic setChannelTypes(...types: RestOrArray