diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json
index 68feb5a..6da913e 100644
--- a/node_modules/.package-lock.json
+++ b/node_modules/.package-lock.json
@@ -4,6 +4,105 @@
"lockfileVersion": 2,
"requires": true,
"packages": {
+ "node_modules/@discordjs/builders": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.4.0.tgz",
+ "integrity": "sha512-nEeTCheTTDw5kO93faM1j8ZJPonAX86qpq/QVoznnSa8WWcCgJpjlu6GylfINTDW6o7zZY0my2SYdxx2mfNwGA==",
+ "dependencies": {
+ "@discordjs/util": "^0.1.0",
+ "@sapphire/shapeshift": "^3.7.1",
+ "discord-api-types": "^0.37.20",
+ "fast-deep-equal": "^3.1.3",
+ "ts-mixer": "^6.0.2",
+ "tslib": "^2.4.1"
+ },
+ "engines": {
+ "node": ">=16.9.0"
+ }
+ },
+ "node_modules/@discordjs/collection": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.3.0.tgz",
+ "integrity": "sha512-ylt2NyZ77bJbRij4h9u/wVy7qYw/aDqQLWnadjvDqW/WoWCxrsX6M3CIw9GVP5xcGCDxsrKj5e0r5evuFYwrKg==",
+ "engines": {
+ "node": ">=16.9.0"
+ }
+ },
+ "node_modules/@discordjs/rest": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.5.0.tgz",
+ "integrity": "sha512-lXgNFqHnbmzp5u81W0+frdXN6Etf4EUi8FAPcWpSykKd8hmlWh1xy6BmE0bsJypU1pxohaA8lQCgp70NUI3uzA==",
+ "dependencies": {
+ "@discordjs/collection": "^1.3.0",
+ "@discordjs/util": "^0.1.0",
+ "@sapphire/async-queue": "^1.5.0",
+ "@sapphire/snowflake": "^3.2.2",
+ "discord-api-types": "^0.37.23",
+ "file-type": "^18.0.0",
+ "tslib": "^2.4.1",
+ "undici": "^5.13.0"
+ },
+ "engines": {
+ "node": ">=16.9.0"
+ }
+ },
+ "node_modules/@discordjs/util": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-0.1.0.tgz",
+ "integrity": "sha512-e7d+PaTLVQav6rOc2tojh2y6FE8S7REkqLldq1XF4soCx74XB/DIjbVbVLtBemf0nLW77ntz0v+o5DytKwFNLQ==",
+ "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.11.18",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz",
+ "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA=="
+ },
+ "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/abort-controller": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
@@ -114,6 +213,17 @@
"resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
"integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ=="
},
+ "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/caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
@@ -239,6 +349,33 @@
"node": ">=0.4.0"
}
},
+ "node_modules/discord-api-types": {
+ "version": "0.37.30",
+ "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.30.tgz",
+ "integrity": "sha512-TzNF28zWV63clYW1+rbKT2+2qSI+lw/aNG3lyP2fIj5NioGPz4C+bCSvwhP3Ly3uLwL7v8FxIiu8XKGDsvuwWA=="
+ },
+ "node_modules/discord.js": {
+ "version": "14.7.1",
+ "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.7.1.tgz",
+ "integrity": "sha512-1FECvqJJjjeYcjSm0IGMnPxLqja/pmG1B0W2l3lUY2Gi4KXiyTeQmU1IxWcbXHn2k+ytP587mMWqva2IA87EbA==",
+ "dependencies": {
+ "@discordjs/builders": "^1.4.0",
+ "@discordjs/collection": "^1.3.0",
+ "@discordjs/rest": "^1.4.0",
+ "@discordjs/util": "^0.1.0",
+ "@sapphire/snowflake": "^3.2.2",
+ "@types/ws": "^8.5.3",
+ "discord-api-types": "^0.37.20",
+ "fast-deep-equal": "^3.1.3",
+ "lodash.snakecase": "^4.1.1",
+ "tslib": "^2.4.1",
+ "undici": "^5.13.0",
+ "ws": "^8.11.0"
+ },
+ "engines": {
+ "node": ">=16.9.0"
+ }
+ },
"node_modules/dom-serializer": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
@@ -366,6 +503,22 @@
}
}
},
+ "node_modules/file-type": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.2.0.tgz",
+ "integrity": "sha512-M3RQMWY3F2ykyWZ+IHwNCjpnUmukYhtdkGGC1ZVEUb0ve5REGF7NNJ4Q9ehCUabtQKtSVFOMbFTXgJlFb0DQIg==",
+ "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/follow-redirects": {
"version": "1.15.2",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
@@ -508,6 +661,30 @@
"resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz",
"integrity": "sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg=="
},
+ "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/is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
@@ -614,6 +791,16 @@
"xhr-status": "1.0.x"
}
},
+ "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/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
@@ -732,6 +919,18 @@
"parse5": "^6.0.1"
}
},
+ "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/performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
@@ -767,6 +966,34 @@
"ky-universal": "^0.8.2"
}
},
+ "node_modules/readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "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/request": {
"version": "2.88.2",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
@@ -889,6 +1116,38 @@
"node": ">=0.10.0"
}
},
+ "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/telegraf": {
"version": "4.10.0",
"resolved": "https://registry.npmjs.org/telegraf/-/telegraf-4.10.0.tgz",
@@ -910,6 +1169,22 @@
"node": "^12.20.0 || >=14.13.1"
}
},
+ "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/tough-cookie": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
@@ -927,6 +1202,11 @@
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
},
+ "node_modules/ts-mixer": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.2.tgz",
+ "integrity": "sha512-zvHx3VM83m2WYCE8XL99uaM7mFwYSkjR2OZti98fabHrwkjsCvgwChda5xctein3xGOyaQhtTeDq/1H/GNvF3A=="
+ },
"node_modules/tslib": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
@@ -953,6 +1233,17 @@
"resolved": "https://registry.npmjs.org/typegram/-/typegram-3.12.0.tgz",
"integrity": "sha512-/VrU0sJv8BdOsBIpYT4w35C7dPg5YyKP6fLiYN9qYXRZ86TVIiw0ZypkzElTAfDVsJtJSluGAufUrcX7VRSIYQ=="
},
+ "node_modules/undici": {
+ "version": "5.16.0",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-5.16.0.tgz",
+ "integrity": "sha512-KWBOXNv6VX+oJQhchXieUznEmnJMqgXMbs0xxH2t8q/FUAWSJvOSr/rMaZKnX5RIVq7JDn0JbP4BOnKG2SGXLQ==",
+ "dependencies": {
+ "busboy": "^1.6.0"
+ },
+ "engines": {
+ "node": ">=12.18"
+ }
+ },
"node_modules/unraw": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/unraw/-/unraw-2.0.1.tgz",
@@ -966,6 +1257,11 @@
"punycode": "^2.1.0"
}
},
+ "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/uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
@@ -1002,6 +1298,26 @@
"webidl-conversions": "^3.0.0"
}
},
+ "node_modules/ws": {
+ "version": "8.12.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz",
+ "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==",
+ "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
+ }
+ }
+ },
"node_modules/xhr-response": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/xhr-response/-/xhr-response-1.0.1.tgz",
diff --git a/node_modules/@discordjs/builders/CHANGELOG.md b/node_modules/@discordjs/builders/CHANGELOG.md
new file mode 100644
index 0000000..0ab0974
--- /dev/null
+++ b/node_modules/@discordjs/builders/CHANGELOG.md
@@ -0,0 +1,215 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+# [@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
new file mode 100644
index 0000000..cbe9c65
--- /dev/null
+++ b/node_modules/@discordjs/builders/LICENSE
@@ -0,0 +1,191 @@
+ 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
new file mode 100644
index 0000000..59508dd
--- /dev/null
+++ b/node_modules/@discordjs/builders/README.md
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## 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
new file mode 100644
index 0000000..f5df124
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/index.d.ts
@@ -0,0 +1,1797 @@
+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';
+import { URL } from 'node:url';
+import { Snowflake } from 'discord-api-types/globals';
+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_fieldNamePredicate: typeof fieldNamePredicate;
+declare const Assertions$5_fieldValuePredicate: typeof fieldValuePredicate;
+declare const Assertions$5_fieldInlinePredicate: typeof fieldInlinePredicate;
+declare const Assertions$5_embedFieldPredicate: typeof embedFieldPredicate;
+declare const Assertions$5_embedFieldsArrayPredicate: typeof embedFieldsArrayPredicate;
+declare const Assertions$5_fieldLengthPredicate: typeof fieldLengthPredicate;
+declare const Assertions$5_validateFieldLength: typeof validateFieldLength;
+declare const Assertions$5_authorNamePredicate: typeof authorNamePredicate;
+declare const Assertions$5_imageURLPredicate: typeof imageURLPredicate;
+declare const Assertions$5_urlPredicate: typeof urlPredicate;
+declare const Assertions$5_embedAuthorPredicate: typeof embedAuthorPredicate;
+declare const Assertions$5_RGBPredicate: typeof RGBPredicate;
+declare const Assertions$5_colorPredicate: typeof colorPredicate;
+declare const Assertions$5_descriptionPredicate: typeof descriptionPredicate;
+declare const Assertions$5_footerTextPredicate: typeof footerTextPredicate;
+declare const Assertions$5_embedFooterPredicate: typeof embedFooterPredicate;
+declare const Assertions$5_timestampPredicate: typeof timestampPredicate;
+declare const Assertions$5_titlePredicate: typeof titlePredicate;
+declare namespace Assertions$5 {
+ export {
+ Assertions$5_fieldNamePredicate as fieldNamePredicate,
+ Assertions$5_fieldValuePredicate as fieldValuePredicate,
+ Assertions$5_fieldInlinePredicate as fieldInlinePredicate,
+ Assertions$5_embedFieldPredicate as embedFieldPredicate,
+ Assertions$5_embedFieldsArrayPredicate as embedFieldsArrayPredicate,
+ Assertions$5_fieldLengthPredicate as fieldLengthPredicate,
+ Assertions$5_validateFieldLength as validateFieldLength,
+ Assertions$5_authorNamePredicate as authorNamePredicate,
+ Assertions$5_imageURLPredicate as imageURLPredicate,
+ Assertions$5_urlPredicate as urlPredicate,
+ Assertions$5_embedAuthorPredicate as embedAuthorPredicate,
+ Assertions$5_RGBPredicate as RGBPredicate,
+ Assertions$5_colorPredicate as colorPredicate,
+ Assertions$5_descriptionPredicate as descriptionPredicate,
+ Assertions$5_footerTextPredicate as footerTextPredicate,
+ Assertions$5_embedFooterPredicate as embedFooterPredicate,
+ Assertions$5_timestampPredicate as timestampPredicate,
+ Assertions$5_titlePredicate as titlePredicate,
+ };
+}
+
+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/slice | 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;
+}
+
+/**
+ * Wraps the content inside a codeblock with no language
+ *
+ * @param content - The content to wrap
+ */
+declare function codeBlock(content: C): `\`\`\`\n${C}\n\`\`\``;
+/**
+ * Wraps the content inside a codeblock with the specified language
+ *
+ * @param language - The language for the codeblock
+ * @param content - The content to wrap
+ */
+declare function codeBlock(language: L, content: C): `\`\`\`${L}\n${C}\n\`\`\``;
+/**
+ * Wraps the content inside \`backticks\`, which formats it as inline code
+ *
+ * @param content - The content to wrap
+ */
+declare function inlineCode(content: C): `\`${C}\``;
+/**
+ * Formats the content into italic text
+ *
+ * @param content - The content to wrap
+ */
+declare function italic(content: C): `_${C}_`;
+/**
+ * Formats the content into bold text
+ *
+ * @param content - The content to wrap
+ */
+declare function bold(content: C): `**${C}**`;
+/**
+ * Formats the content into underscored text
+ *
+ * @param content - The content to wrap
+ */
+declare function underscore(content: C): `__${C}__`;
+/**
+ * Formats the content into strike-through text
+ *
+ * @param content - The content to wrap
+ */
+declare function strikethrough(content: C): `~~${C}~~`;
+/**
+ * Formats the content into a quote. This needs to be at the start of the line for Discord to format it
+ *
+ * @param content - The content to wrap
+ */
+declare function quote(content: C): `> ${C}`;
+/**
+ * Formats the content into a block quote. This needs to be at the start of the line for Discord to format it
+ *
+ * @param content - The content to wrap
+ */
+declare function blockQuote(content: C): `>>> ${C}`;
+/**
+ * Wraps the URL into `<>`, which stops it from embedding
+ *
+ * @param url - The URL to wrap
+ */
+declare function hideLinkEmbed(url: C): `<${C}>`;
+/**
+ * Wraps the URL into `<>`, which stops it from embedding
+ *
+ * @param url - The URL to wrap
+ */
+declare function hideLinkEmbed(url: URL): `<${string}>`;
+/**
+ * Formats the content and the URL into a masked URL
+ *
+ * @param content - The content to display
+ * @param url - The URL the content links to
+ */
+declare function hyperlink(content: C, url: URL): `[${C}](${string})`;
+/**
+ * Formats the content and the URL into a masked URL
+ *
+ * @param content - The content to display
+ * @param url - The URL the content links to
+ */
+declare function hyperlink(content: C, url: U): `[${C}](${U})`;
+/**
+ * Formats the content and the URL into a masked URL
+ *
+ * @param content - The content to display
+ * @param url - The URL the content links to
+ * @param title - The title shown when hovering on the masked link
+ */
+declare function hyperlink(content: C, url: URL, title: T): `[${C}](${string} "${T}")`;
+/**
+ * Formats the content and the URL into a masked URL
+ *
+ * @param content - The content to display
+ * @param url - The URL the content links to
+ * @param title - The title shown when hovering on the masked link
+ */
+declare function hyperlink(content: C, url: U, title: T): `[${C}](${U} "${T}")`;
+/**
+ * Wraps the content inside spoiler (hidden text)
+ *
+ * @param content - The content to wrap
+ */
+declare function spoiler(content: C): `||${C}||`;
+/**
+ * Formats a user ID into a user mention
+ *
+ * @param userId - The user ID to format
+ */
+declare function userMention(userId: C): `<@${C}>`;
+/**
+ * Formats a channel ID into a channel mention
+ *
+ * @param channelId - The channel ID to format
+ */
+declare function channelMention(channelId: C): `<#${C}>`;
+/**
+ * Formats a role ID into a role mention
+ *
+ * @param roleId - The role ID to format
+ */
+declare function roleMention(roleId: C): `<@&${C}>`;
+/**
+ * Formats an application command name, subcommand group name, subcommand name, and ID into an application command mention
+ *
+ * @param commandName - The application command name to format
+ * @param subcommandGroupName - The subcommand group name to format
+ * @param subcommandName - The subcommand name to format
+ * @param commandId - The application command ID to format
+ */
+declare function chatInputApplicationCommandMention(commandName: N, subcommandGroupName: G, subcommandName: S, commandId: I): `${N} ${G} ${S}:${I}>`;
+/**
+ * Formats an application command name, subcommand name, and ID into an application command mention
+ *
+ * @param commandName - The application command name to format
+ * @param subcommandName - The subcommand name to format
+ * @param commandId - The application command ID to format
+ */
+declare function chatInputApplicationCommandMention(commandName: N, subcommandName: S, commandId: I): `${N} ${S}:${I}>`;
+/**
+ * Formats an application command name and ID into an application command mention
+ *
+ * @param commandName - The application command name to format
+ * @param commandId - The application command ID to format
+ */
+declare function chatInputApplicationCommandMention(commandName: N, commandId: I): `${N}:${I}>`;
+/**
+ * Formats an emoji ID into a fully qualified emoji identifier
+ *
+ * @param emojiId - The emoji ID to format
+ */
+declare function formatEmoji(emojiId: C, animated?: false): `<:_:${C}>`;
+/**
+ * Formats an emoji ID into a fully qualified emoji identifier
+ *
+ * @param emojiId - The emoji ID to format
+ * @param animated - Whether the emoji is animated or not. Defaults to `false`
+ */
+declare function formatEmoji(emojiId: C, animated?: true): ``;
+/**
+ * Formats an emoji ID into a fully qualified emoji identifier
+ *
+ * @param emojiId - The emoji ID to format
+ * @param animated - Whether the emoji is animated or not. Defaults to `false`
+ */
+declare function formatEmoji(emojiId: C, animated?: boolean): `<:_:${C}>` | ``;
+/**
+ * Formats a channel link for a direct message channel.
+ *
+ * @param channelId - The channel's id
+ */
+declare function channelLink(channelId: C): `https://discord.com/channels/@me/${C}`;
+/**
+ * Formats a channel link for a guild channel.
+ *
+ * @param channelId - The channel's id
+ * @param guildId - The guild's id
+ */
+declare function channelLink(channelId: C, guildId: G): `https://discord.com/channels/${G}/${C}`;
+/**
+ * Formats a message link for a direct message channel.
+ *
+ * @param channelId - The channel's id
+ * @param messageId - The message's id
+ */
+declare function messageLink(channelId: C, messageId: M): `https://discord.com/channels/@me/${C}/${M}`;
+/**
+ * Formats a message link for a guild channel.
+ *
+ * @param channelId - The channel's id
+ * @param messageId - The message's id
+ * @param guildId - The guild's id
+ */
+declare function messageLink(channelId: C, messageId: M, guildId: G): `https://discord.com/channels/${G}/${C}/${M}`;
+/**
+ * Formats a date into a short date-time string
+ *
+ * @param date - The date to format, defaults to the current time
+ */
+declare function time(date?: Date): ``;
+/**
+ * Formats a date given a format style
+ *
+ * @param date - The date to format
+ * @param style - The style to use
+ */
+declare function time(date: Date, style: S): ``;
+/**
+ * Formats the given timestamp into a short date-time string
+ *
+ * @param seconds - The time to format, represents an UNIX timestamp in seconds
+ */
+declare function time(seconds: C): ``;
+/**
+ * Formats the given timestamp into a short date-time string
+ *
+ * @param seconds - The time to format, represents an UNIX timestamp in seconds
+ * @param style - The style to use
+ */
+declare function time(seconds: C, style: S): ``;
+/**
+ * The {@link https://discord.com/developers/docs/reference#message-formatting-timestamp-styles | message formatting timestamp styles} supported by Discord
+ */
+declare const TimestampStyles: {
+ /**
+ * Short time format, consisting of hours and minutes, e.g. 16:20
+ */
+ readonly ShortTime: "t";
+ /**
+ * Long time format, consisting of hours, minutes, and seconds, e.g. 16:20:30
+ */
+ readonly LongTime: "T";
+ /**
+ * Short date format, consisting of day, month, and year, e.g. 20/04/2021
+ */
+ readonly ShortDate: "d";
+ /**
+ * Long date format, consisting of day, month, and year, e.g. 20 April 2021
+ */
+ readonly LongDate: "D";
+ /**
+ * Short date-time format, consisting of short date and short time formats, e.g. 20 April 2021 16:20
+ */
+ readonly ShortDateTime: "f";
+ /**
+ * Long date-time format, consisting of long date and short time formats, e.g. Tuesday, 20 April 2021 16:20
+ */
+ readonly LongDateTime: "F";
+ /**
+ * Relative time format, consisting of a relative duration format, e.g. 2 months ago
+ */
+ readonly RelativeTime: "R";
+};
+/**
+ * The possible values, see {@link TimestampStyles} for more information
+ */
+type TimestampStylesString = typeof TimestampStyles[keyof typeof TimestampStyles];
+/**
+ * An enum with all the available faces from Discord's native slash commands
+ */
+declare enum Faces {
+ /**
+ * ¯\\_(ツ)\\_/¯
+ */
+ Shrug = "\u00AF\\_(\u30C4)\\_/\u00AF",
+ /**
+ * (╯°□°)╯︵ ┻━┻
+ */
+ Tableflip = "(\u256F\u00B0\u25A1\u00B0\uFF09\u256F\uFE35 \u253B\u2501\u253B",
+ /**
+ * ┬─┬ ノ( ゜-゜ノ)
+ */
+ Unflip = "\u252C\u2500\u252C \u30CE( \u309C-\u309C\u30CE)"
+}
+
+/**
+ * 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_customIdValidator: typeof customIdValidator;
+declare const Assertions$4_emojiValidator: typeof emojiValidator;
+declare const Assertions$4_disabledValidator: typeof disabledValidator;
+declare const Assertions$4_buttonLabelValidator: typeof buttonLabelValidator;
+declare const Assertions$4_buttonStyleValidator: typeof buttonStyleValidator;
+declare const Assertions$4_minMaxValidator: typeof minMaxValidator;
+declare const Assertions$4_labelValueDescriptionValidator: typeof labelValueDescriptionValidator;
+declare const Assertions$4_jsonOptionValidator: typeof jsonOptionValidator;
+declare const Assertions$4_optionValidator: typeof optionValidator;
+declare const Assertions$4_optionsValidator: typeof optionsValidator;
+declare const Assertions$4_optionsLengthValidator: typeof optionsLengthValidator;
+declare const Assertions$4_validateRequiredSelectMenuParameters: typeof validateRequiredSelectMenuParameters;
+declare const Assertions$4_defaultValidator: typeof defaultValidator;
+declare const Assertions$4_validateRequiredSelectMenuOptionParameters: typeof validateRequiredSelectMenuOptionParameters;
+declare const Assertions$4_channelTypesValidator: typeof channelTypesValidator;
+declare const Assertions$4_urlValidator: typeof urlValidator;
+declare const Assertions$4_validateRequiredButtonParameters: typeof validateRequiredButtonParameters;
+declare namespace Assertions$4 {
+ export {
+ Assertions$4_customIdValidator as customIdValidator,
+ Assertions$4_emojiValidator as emojiValidator,
+ Assertions$4_disabledValidator as disabledValidator,
+ Assertions$4_buttonLabelValidator as buttonLabelValidator,
+ Assertions$4_buttonStyleValidator as buttonStyleValidator,
+ placeholderValidator$1 as placeholderValidator,
+ Assertions$4_minMaxValidator as minMaxValidator,
+ Assertions$4_labelValueDescriptionValidator as labelValueDescriptionValidator,
+ Assertions$4_jsonOptionValidator as jsonOptionValidator,
+ Assertions$4_optionValidator as optionValidator,
+ Assertions$4_optionsValidator as optionsValidator,
+ Assertions$4_optionsLengthValidator as optionsLengthValidator,
+ Assertions$4_validateRequiredSelectMenuParameters as validateRequiredSelectMenuParameters,
+ Assertions$4_defaultValidator as defaultValidator,
+ Assertions$4_validateRequiredSelectMenuOptionParameters as validateRequiredSelectMenuOptionParameters,
+ Assertions$4_channelTypesValidator as channelTypesValidator,
+ Assertions$4_urlValidator as urlValidator,
+ Assertions$4_validateRequiredButtonParameters as validateRequiredButtonParameters,
+ };
+}
+
+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;
+ /**
+ * {@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_textInputStyleValidator: typeof textInputStyleValidator;
+declare const Assertions$3_minLengthValidator: typeof minLengthValidator;
+declare const Assertions$3_maxLengthValidator: typeof maxLengthValidator;
+declare const Assertions$3_requiredValidator: typeof requiredValidator;
+declare const Assertions$3_valueValidator: typeof valueValidator;
+declare const Assertions$3_placeholderValidator: typeof placeholderValidator;
+declare const Assertions$3_labelValidator: typeof labelValidator;
+declare namespace Assertions$3 {
+ export {
+ Assertions$3_textInputStyleValidator as textInputStyleValidator,
+ Assertions$3_minLengthValidator as minLengthValidator,
+ Assertions$3_maxLengthValidator as maxLengthValidator,
+ Assertions$3_requiredValidator as requiredValidator,
+ Assertions$3_valueValidator as valueValidator,
+ Assertions$3_placeholderValidator as placeholderValidator,
+ Assertions$3_labelValidator as labelValidator,
+ validateRequiredParameters$3 as validateRequiredParameters,
+ };
+}
+
+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_titleValidator: typeof titleValidator;
+declare const Assertions$2_componentsValidator: typeof componentsValidator;
+declare namespace Assertions$2 {
+ export {
+ Assertions$2_titleValidator as titleValidator,
+ Assertions$2_componentsValidator as componentsValidator,
+ 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;
+ /**
+ * 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;
+ /**
+ * 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 const Assertions$1_validateDescription: typeof validateDescription;
+declare const Assertions$1_validateLocale: typeof validateLocale;
+declare const Assertions$1_validateMaxOptionsLength: typeof validateMaxOptionsLength;
+declare const Assertions$1_validateRequired: typeof validateRequired;
+declare const Assertions$1_validateChoicesLength: typeof validateChoicesLength;
+declare const Assertions$1_assertReturnOfBuilder: typeof assertReturnOfBuilder;
+declare const Assertions$1_localizationMapPredicate: typeof localizationMapPredicate;
+declare const Assertions$1_validateLocalizationMap: typeof validateLocalizationMap;
+declare namespace Assertions$1 {
+ export {
+ validateName$1 as validateName,
+ Assertions$1_validateDescription as validateDescription,
+ Assertions$1_validateLocale as validateLocale,
+ Assertions$1_validateMaxOptionsLength as validateMaxOptionsLength,
+ validateRequiredParameters$1 as validateRequiredParameters,
+ validateDefaultPermission$1 as validateDefaultPermission,
+ Assertions$1_validateRequired as validateRequired,
+ Assertions$1_validateChoicesLength as validateChoicesLength,
+ Assertions$1_assertReturnOfBuilder as assertReturnOfBuilder,
+ Assertions$1_localizationMapPredicate as localizationMapPredicate,
+ Assertions$1_validateLocalizationMap as validateLocalizationMap,
+ validateDMPermission$1 as validateDMPermission,
+ validateDefaultMemberPermissions$1 as validateDefaultMemberPermissions,
+ };
+}
+
+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_validateDefaultPermission: typeof validateDefaultPermission;
+declare const Assertions_validateName: typeof validateName;
+declare const Assertions_validateType: typeof validateType;
+declare const Assertions_validateRequiredParameters: typeof validateRequiredParameters;
+declare const Assertions_validateDMPermission: typeof validateDMPermission;
+declare const Assertions_validateDefaultMemberPermissions: typeof validateDefaultMemberPermissions;
+declare namespace Assertions {
+ export {
+ Assertions_validateDefaultPermission as validateDefaultPermission,
+ Assertions_validateName as validateName,
+ Assertions_validateType as validateType,
+ Assertions_validateRequiredParameters as validateRequiredParameters,
+ Assertions_validateDMPermission as validateDMPermission,
+ Assertions_validateDefaultMemberPermissions as validateDefaultMemberPermissions,
+ };
+}
+
+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, Faces, 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, TimestampStyles, TimestampStylesString, ToAPIApplicationCommandOptions, UserSelectMenuBuilder, blockQuote, bold, channelLink, channelMention, chatInputApplicationCommandMention, codeBlock, createComponentBuilder, disableValidators, embedLength, enableValidators, formatEmoji, hideLinkEmbed, hyperlink, inlineCode, isValidationEnabled, italic, messageLink, normalizeArray, quote, roleMention, spoiler, strikethrough, time, underscore, userMention, version };
diff --git a/node_modules/@discordjs/builders/dist/index.js b/node_modules/@discordjs/builders/dist/index.js
new file mode 100644
index 0000000..8e6a442
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/index.js
@@ -0,0 +1,1651 @@
+"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(
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
+ mod
+));
+var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
+var __decorateClass = (decorators, target, key, kind) => {
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
+ if (decorator = decorators[i])
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
+ if (kind && result)
+ __defProp(target, key, result);
+ return result;
+};
+
+// 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,
+ Faces: () => Faces,
+ 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,
+ TimestampStyles: () => TimestampStyles,
+ UserSelectMenuBuilder: () => UserSelectMenuBuilder,
+ blockQuote: () => blockQuote,
+ bold: () => bold,
+ channelLink: () => channelLink,
+ channelMention: () => channelMention,
+ chatInputApplicationCommandMention: () => chatInputApplicationCommandMention,
+ codeBlock: () => codeBlock,
+ createComponentBuilder: () => createComponentBuilder,
+ disableValidators: () => disableValidators,
+ embedLength: () => embedLength,
+ enableValidators: () => enableValidators,
+ formatEmoji: () => formatEmoji,
+ hideLinkEmbed: () => hideLinkEmbed,
+ hyperlink: () => hyperlink,
+ inlineCode: () => inlineCode,
+ isValidationEnabled: () => isValidationEnabled,
+ italic: () => italic,
+ messageLink: () => messageLink,
+ normalizeArray: () => normalizeArray,
+ quote: () => quote,
+ roleMention: () => roleMention,
+ spoiler: () => spoiler,
+ strikethrough: () => strikethrough,
+ time: () => time,
+ underscore: () => underscore,
+ userMention: () => userMention,
+ 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 {
+ data;
+ constructor(data = {}) {
+ this.data = { ...data };
+ if (data.timestamp)
+ this.data.timestamp = new Date(data.timestamp).toISOString();
+ }
+ 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;
+ }
+ 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;
+ }
+ setFields(...fields) {
+ this.spliceFields(0, this.data.fields?.length ?? 0, ...normalizeArray(fields));
+ return this;
+ }
+ 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;
+ }
+ 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;
+ }
+ setDescription(description) {
+ descriptionPredicate.parse(description);
+ this.data.description = description ?? void 0;
+ return this;
+ }
+ 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;
+ }
+ setImage(url) {
+ imageURLPredicate.parse(url);
+ this.data.image = url ? { url } : void 0;
+ return this;
+ }
+ setThumbnail(url) {
+ imageURLPredicate.parse(url);
+ this.data.thumbnail = url ? { url } : void 0;
+ return this;
+ }
+ setTimestamp(timestamp = Date.now()) {
+ timestampPredicate.parse(timestamp);
+ this.data.timestamp = timestamp ? new Date(timestamp).toISOString() : void 0;
+ return this;
+ }
+ setTitle(title) {
+ titlePredicate.parse(title);
+ this.data.title = title ?? void 0;
+ return this;
+ }
+ setURL(url) {
+ urlPredicate.parse(url);
+ this.data.url = url ?? void 0;
+ return this;
+ }
+ toJSON() {
+ return { ...this.data };
+ }
+};
+__name(EmbedBuilder, "EmbedBuilder");
+
+// src/messages/formatters.ts
+function codeBlock(language, content) {
+ return typeof content === "undefined" ? `\`\`\`
+${language}
+\`\`\`` : `\`\`\`${language}
+${content}
+\`\`\``;
+}
+__name(codeBlock, "codeBlock");
+function inlineCode(content) {
+ return `\`${content}\``;
+}
+__name(inlineCode, "inlineCode");
+function italic(content) {
+ return `_${content}_`;
+}
+__name(italic, "italic");
+function bold(content) {
+ return `**${content}**`;
+}
+__name(bold, "bold");
+function underscore(content) {
+ return `__${content}__`;
+}
+__name(underscore, "underscore");
+function strikethrough(content) {
+ return `~~${content}~~`;
+}
+__name(strikethrough, "strikethrough");
+function quote(content) {
+ return `> ${content}`;
+}
+__name(quote, "quote");
+function blockQuote(content) {
+ return `>>> ${content}`;
+}
+__name(blockQuote, "blockQuote");
+function hideLinkEmbed(url) {
+ return `<${url}>`;
+}
+__name(hideLinkEmbed, "hideLinkEmbed");
+function hyperlink(content, url, title) {
+ return title ? `[${content}](${url} "${title}")` : `[${content}](${url})`;
+}
+__name(hyperlink, "hyperlink");
+function spoiler(content) {
+ return `||${content}||`;
+}
+__name(spoiler, "spoiler");
+function userMention(userId) {
+ return `<@${userId}>`;
+}
+__name(userMention, "userMention");
+function channelMention(channelId) {
+ return `<#${channelId}>`;
+}
+__name(channelMention, "channelMention");
+function roleMention(roleId) {
+ return `<@&${roleId}>`;
+}
+__name(roleMention, "roleMention");
+function chatInputApplicationCommandMention(commandName, subcommandGroupName, subcommandName, commandId) {
+ if (typeof commandId !== "undefined") {
+ return `${commandName} ${subcommandGroupName} ${subcommandName}:${commandId}>`;
+ }
+ if (typeof subcommandName !== "undefined") {
+ return `${commandName} ${subcommandGroupName}:${subcommandName}>`;
+ }
+ return `${commandName}:${subcommandGroupName}>`;
+}
+__name(chatInputApplicationCommandMention, "chatInputApplicationCommandMention");
+function formatEmoji(emojiId, animated = false) {
+ return `<${animated ? "a" : ""}:_:${emojiId}>`;
+}
+__name(formatEmoji, "formatEmoji");
+function channelLink(channelId, guildId) {
+ return `https://discord.com/channels/${guildId ?? "@me"}/${channelId}`;
+}
+__name(channelLink, "channelLink");
+function messageLink(channelId, messageId, guildId) {
+ return `${typeof guildId === "undefined" ? channelLink(channelId) : channelLink(channelId, guildId)}/${messageId}`;
+}
+__name(messageLink, "messageLink");
+function time(timeOrSeconds, style) {
+ if (typeof timeOrSeconds !== "number") {
+ timeOrSeconds = Math.floor((timeOrSeconds?.getTime() ?? Date.now()) / 1e3);
+ }
+ return typeof style === "string" ? `` : ``;
+}
+__name(time, "time");
+var TimestampStyles = {
+ ShortTime: "t",
+ LongTime: "T",
+ ShortDate: "d",
+ LongDate: "D",
+ ShortDateTime: "f",
+ LongDateTime: "F",
+ RelativeTime: "R"
+};
+var Faces = /* @__PURE__ */ ((Faces2) => {
+ Faces2["Shrug"] = "\xAF\\_(\u30C4)\\_/\xAF";
+ Faces2["Tableflip"] = "(\u256F\xB0\u25A1\xB0\uFF09\u256F\uFE35 \u253B\u2501\u253B";
+ Faces2["Unflip"] = "\u252C\u2500\u252C \u30CE( \u309C-\u309C\u30CE)";
+ return Faces2;
+})(Faces || {});
+
+// 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 {
+ constructor(data = {}) {
+ this.data = data;
+ }
+ setLabel(label) {
+ this.data.label = labelValueDescriptionValidator.parse(label);
+ return this;
+ }
+ setValue(value) {
+ this.data.value = labelValueDescriptionValidator.parse(value);
+ return this;
+ }
+ setDescription(description) {
+ this.data.description = labelValueDescriptionValidator.parse(description);
+ return this;
+ }
+ setDefault(isDefault = true) {
+ this.data.default = defaultValidator.parse(isDefault);
+ return this;
+ }
+ setEmoji(emoji) {
+ this.data.emoji = emojiValidator.parse(emoji);
+ return this;
+ }
+ 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 {
+ data;
+ 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 {
+ constructor(data) {
+ super({ type: import_v102.ComponentType.Button, ...data });
+ }
+ setStyle(style) {
+ this.data.style = buttonStyleValidator.parse(style);
+ return this;
+ }
+ setURL(url) {
+ this.data.url = urlValidator.parse(url);
+ return this;
+ }
+ setCustomId(customId) {
+ this.data.custom_id = customIdValidator.parse(customId);
+ return this;
+ }
+ setEmoji(emoji) {
+ this.data.emoji = emojiValidator.parse(emoji);
+ return this;
+ }
+ setDisabled(disabled = true) {
+ this.data.disabled = disabledValidator.parse(disabled);
+ return this;
+ }
+ setLabel(label) {
+ this.data.label = buttonLabelValidator.parse(label);
+ return this;
+ }
+ 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 {
+ setPlaceholder(placeholder) {
+ this.data.placeholder = placeholderValidator.parse(placeholder);
+ return this;
+ }
+ setMinValues(minValues) {
+ this.data.min_values = minMaxValidator.parse(minValues);
+ return this;
+ }
+ setMaxValues(maxValues) {
+ this.data.max_values = minMaxValidator.parse(maxValues);
+ return this;
+ }
+ setCustomId(customId) {
+ this.data.custom_id = customIdValidator.parse(customId);
+ return this;
+ }
+ 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 {
+ 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;
+ }
+ 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 {
+ 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 {
+ 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 {
+ options;
+ constructor(data) {
+ const { options, ...initData } = data ?? {};
+ super({ ...initData, type: import_v106.ComponentType.StringSelect });
+ this.options = options?.map((option) => new StringSelectMenuOptionBuilder(option)) ?? [];
+ }
+ 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;
+ }
+ setOptions(...options) {
+ options = normalizeArray(options);
+ optionsLengthValidator.parse(options.length);
+ this.options.splice(
+ 0,
+ this.options.length,
+ ...options.map(
+ (option) => option instanceof StringSelectMenuOptionBuilder ? option : new StringSelectMenuOptionBuilder(jsonOptionValidator.parse(option))
+ )
+ );
+ return this;
+ }
+ 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 {
+ 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 {
+ constructor(data) {
+ super({ type: import_v109.ComponentType.TextInput, ...data });
+ }
+ setCustomId(customId) {
+ this.data.custom_id = customIdValidator.parse(customId);
+ return this;
+ }
+ setLabel(label) {
+ this.data.label = labelValidator.parse(label);
+ return this;
+ }
+ setStyle(style) {
+ this.data.style = textInputStyleValidator.parse(style);
+ return this;
+ }
+ setMinLength(minLength) {
+ this.data.min_length = minLengthValidator.parse(minLength);
+ return this;
+ }
+ setMaxLength(maxLength) {
+ this.data.max_length = maxLengthValidator.parse(maxLength);
+ return this;
+ }
+ setPlaceholder(placeholder) {
+ this.data.placeholder = placeholderValidator2.parse(placeholder);
+ return this;
+ }
+ setValue(value) {
+ this.data.value = valueValidator.parse(value);
+ return this;
+ }
+ setRequired(required = true) {
+ this.data.required = requiredValidator.parse(required);
+ return this;
+ }
+ toJSON() {
+ validateRequiredParameters(this.data.custom_id, this.data.style, this.data.label);
+ return {
+ ...this.data
+ };
+ }
+ 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 {
+ components;
+ constructor({ components, ...data } = {}) {
+ super({ type: import_v1011.ComponentType.ActionRow, ...data });
+ this.components = components?.map((component) => createComponentBuilder(component)) ?? [];
+ }
+ addComponents(...components) {
+ this.components.push(...normalizeArray(components));
+ return this;
+ }
+ setComponents(...components) {
+ this.components.splice(0, this.components.length, ...normalizeArray(components));
+ return this;
+ }
+ 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 {
+ data;
+ components = [];
+ constructor({ components, ...data } = {}) {
+ this.data = { ...data };
+ this.components = components?.map((component) => createComponentBuilder(component)) ?? [];
+ }
+ setTitle(title) {
+ this.data.title = titleValidator.parse(title);
+ return this;
+ }
+ setCustomId(customId) {
+ this.data.custom_id = customIdValidator.parse(customId);
+ return this;
+ }
+ addComponents(...components) {
+ this.components.push(
+ ...normalizeArray(components).map(
+ (component) => component instanceof ActionRowBuilder ? component : new ActionRowBuilder(component)
+ )
+ );
+ return this;
+ }
+ setComponents(...components) {
+ this.components.splice(0, this.components.length, ...normalizeArray(components));
+ return this;
+ }
+ 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,
+ 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");
+
+// 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 {
+ name;
+ name_localizations;
+ description;
+ description_localizations;
+ setName(name) {
+ validateName(name);
+ Reflect.set(this, "name", name);
+ return this;
+ }
+ setDescription(description) {
+ validateDescription(description);
+ Reflect.set(this, "description", description);
+ return this;
+ }
+ 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;
+ }
+ 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;
+ }
+ 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;
+ }
+ 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;
+ 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 {
+ channel_types;
+ 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 SlashCommandChannelOption = class extends ApplicationCommandOptionBase {
+ type = import_v1016.ApplicationCommandOptionType.Channel;
+ toJSON() {
+ this.runRequiredValidations();
+ return { ...this };
+ }
+};
+__name(SlashCommandChannelOption, "SlashCommandChannelOption");
+SlashCommandChannelOption = __decorateClass([
+ (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 {
+ max_value;
+ min_value;
+};
+__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 {
+ choices;
+ autocomplete;
+ type;
+ 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;
+ }
+ 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 numberValidator = import_shapeshift8.s.number.int;
+var SlashCommandIntegerOption = class extends ApplicationCommandOptionBase {
+ type = import_v1018.ApplicationCommandOptionType.Integer;
+ setMaxValue(max) {
+ numberValidator.parse(max);
+ Reflect.set(this, "max_value", max);
+ return this;
+ }
+ 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 };
+ }
+};
+__name(SlashCommandIntegerOption, "SlashCommandIntegerOption");
+SlashCommandIntegerOption = __decorateClass([
+ (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 numberValidator2 = import_shapeshift9.s.number;
+var SlashCommandNumberOption = class extends ApplicationCommandOptionBase {
+ type = import_v1020.ApplicationCommandOptionType.Number;
+ setMaxValue(max) {
+ numberValidator2.parse(max);
+ Reflect.set(this, "max_value", max);
+ return this;
+ }
+ 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 };
+ }
+};
+__name(SlashCommandNumberOption, "SlashCommandNumberOption");
+SlashCommandNumberOption = __decorateClass([
+ (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 minLengthValidator2 = import_shapeshift10.s.number.greaterThanOrEqual(0).lessThanOrEqual(6e3);
+var maxLengthValidator2 = import_shapeshift10.s.number.greaterThanOrEqual(1).lessThanOrEqual(6e3);
+var SlashCommandStringOption = class extends ApplicationCommandOptionBase {
+ type = import_v1022.ApplicationCommandOptionType.String;
+ max_length;
+ min_length;
+ setMaxLength(max) {
+ maxLengthValidator2.parse(max);
+ Reflect.set(this, "max_length", max);
+ return this;
+ }
+ 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 };
+ }
+};
+__name(SlashCommandStringOption, "SlashCommandStringOption");
+SlashCommandStringOption = __decorateClass([
+ (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 {
+ options;
+ addBooleanOption(input) {
+ return this._sharedAddOptionMethod(input, SlashCommandBooleanOption);
+ }
+ addUserOption(input) {
+ return this._sharedAddOptionMethod(input, SlashCommandUserOption);
+ }
+ addChannelOption(input) {
+ return this._sharedAddOptionMethod(input, SlashCommandChannelOption);
+ }
+ addRoleOption(input) {
+ return this._sharedAddOptionMethod(input, SlashCommandRoleOption);
+ }
+ addAttachmentOption(input) {
+ return this._sharedAddOptionMethod(input, SlashCommandAttachmentOption);
+ }
+ addMentionableOption(input) {
+ return this._sharedAddOptionMethod(input, SlashCommandMentionableOption);
+ }
+ addStringOption(input) {
+ return this._sharedAddOptionMethod(input, SlashCommandStringOption);
+ }
+ addIntegerOption(input) {
+ return this._sharedAddOptionMethod(input, SlashCommandIntegerOption);
+ }
+ 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 SlashCommandSubcommandGroupBuilder = class {
+ name = void 0;
+ description = void 0;
+ options = [];
+ 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())
+ };
+ }
+};
+__name(SlashCommandSubcommandGroupBuilder, "SlashCommandSubcommandGroupBuilder");
+SlashCommandSubcommandGroupBuilder = __decorateClass([
+ (0, import_ts_mixer5.mix)(SharedNameAndDescription)
+], SlashCommandSubcommandGroupBuilder);
+var SlashCommandSubcommandBuilder = class {
+ name = void 0;
+ description = void 0;
+ 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())
+ };
+ }
+};
+__name(SlashCommandSubcommandBuilder, "SlashCommandSubcommandBuilder");
+SlashCommandSubcommandBuilder = __decorateClass([
+ (0, import_ts_mixer5.mix)(SharedNameAndDescription, SharedSlashCommandOptions)
+], SlashCommandSubcommandBuilder);
+
+// src/interactions/slashCommands/SlashCommandBuilder.ts
+var SlashCommandBuilder = class {
+ name = void 0;
+ name_localizations;
+ description = void 0;
+ description_localizations;
+ options = [];
+ default_permission = void 0;
+ default_member_permissions = void 0;
+ dm_permission = void 0;
+ 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())
+ };
+ }
+ setDefaultPermission(value) {
+ validateDefaultPermission(value);
+ Reflect.set(this, "default_permission", value);
+ return this;
+ }
+ setDefaultMemberPermissions(permissions) {
+ const permissionValue = validateDefaultMemberPermissions(permissions);
+ Reflect.set(this, "default_member_permissions", permissionValue);
+ return this;
+ }
+ setDMPermission(enabled) {
+ validateDMPermission(enabled);
+ Reflect.set(this, "dm_permission", enabled);
+ return this;
+ }
+ addSubcommandGroup(input) {
+ const { options } = this;
+ validateMaxOptionsLength(options);
+ const result = typeof input === "function" ? input(new SlashCommandSubcommandGroupBuilder()) : input;
+ assertReturnOfBuilder(result, SlashCommandSubcommandGroupBuilder);
+ options.push(result);
+ return this;
+ }
+ addSubcommand(input) {
+ const { options } = this;
+ validateMaxOptionsLength(options);
+ const result = typeof input === "function" ? input(new SlashCommandSubcommandBuilder()) : input;
+ assertReturnOfBuilder(result, SlashCommandSubcommandBuilder);
+ options.push(result);
+ return this;
+ }
+};
+__name(SlashCommandBuilder, "SlashCommandBuilder");
+SlashCommandBuilder = __decorateClass([
+ (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 {
+ name = void 0;
+ name_localizations;
+ type = void 0;
+ default_permission = void 0;
+ default_member_permissions = void 0;
+ dm_permission = void 0;
+ setName(name) {
+ validateName2(name);
+ Reflect.set(this, "name", name);
+ return this;
+ }
+ setType(type) {
+ validateType(type);
+ Reflect.set(this, "type", type);
+ return this;
+ }
+ setDefaultPermission(value) {
+ validateDefaultPermission2(value);
+ Reflect.set(this, "default_permission", value);
+ return this;
+ }
+ setDefaultMemberPermissions(permissions) {
+ const permissionValue = validateDefaultMemberPermissions2(permissions);
+ Reflect.set(this, "default_member_permissions", permissionValue);
+ return this;
+ }
+ setDMPermission(enabled) {
+ validateDMPermission2(enabled);
+ Reflect.set(this, "dm_permission", enabled);
+ return this;
+ }
+ 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;
+ }
+ 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;
+ }
+ 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 = "1.4.0";
+// 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,
+ Faces,
+ 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,
+ TimestampStyles,
+ UserSelectMenuBuilder,
+ blockQuote,
+ bold,
+ channelLink,
+ channelMention,
+ chatInputApplicationCommandMention,
+ codeBlock,
+ createComponentBuilder,
+ disableValidators,
+ embedLength,
+ enableValidators,
+ formatEmoji,
+ hideLinkEmbed,
+ hyperlink,
+ inlineCode,
+ isValidationEnabled,
+ italic,
+ messageLink,
+ normalizeArray,
+ quote,
+ roleMention,
+ spoiler,
+ strikethrough,
+ time,
+ underscore,
+ userMention,
+ 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
new file mode 100644
index 0000000..0e76328
--- /dev/null
+++ b/node_modules/@discordjs/builders/dist/index.js.map
@@ -0,0 +1 @@
+{"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/messages/formatters.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';\nexport * from './messages/formatters.js';\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\n// eslint-disable-next-line @typescript-eslint/no-inferrable-types\nexport const version: string = '1.4.0';\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/slice | 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 type { URL } from 'node:url';\nimport type { Snowflake } from 'discord-api-types/globals';\n\n/**\n * Wraps the content inside a codeblock with no language\n *\n * @param content - The content to wrap\n */\nexport function codeBlock(content: C): `\\`\\`\\`\\n${C}\\n\\`\\`\\``;\n\n/**\n * Wraps the content inside a codeblock with the specified language\n *\n * @param language - The language for the codeblock\n * @param content - The content to wrap\n */\nexport function codeBlock(language: L, content: C): `\\`\\`\\`${L}\\n${C}\\n\\`\\`\\``;\nexport function codeBlock(language: string, content?: string): string {\n\treturn typeof content === 'undefined' ? `\\`\\`\\`\\n${language}\\n\\`\\`\\`` : `\\`\\`\\`${language}\\n${content}\\n\\`\\`\\``;\n}\n\n/**\n * Wraps the content inside \\`backticks\\`, which formats it as inline code\n *\n * @param content - The content to wrap\n */\nexport function inlineCode(content: C): `\\`${C}\\`` {\n\treturn `\\`${content}\\``;\n}\n\n/**\n * Formats the content into italic text\n *\n * @param content - The content to wrap\n */\nexport function italic(content: C): `_${C}_` {\n\treturn `_${content}_`;\n}\n\n/**\n * Formats the content into bold text\n *\n * @param content - The content to wrap\n */\nexport function bold(content: C): `**${C}**` {\n\treturn `**${content}**`;\n}\n\n/**\n * Formats the content into underscored text\n *\n * @param content - The content to wrap\n */\nexport function underscore(content: C): `__${C}__` {\n\treturn `__${content}__`;\n}\n\n/**\n * Formats the content into strike-through text\n *\n * @param content - The content to wrap\n */\nexport function strikethrough(content: C): `~~${C}~~` {\n\treturn `~~${content}~~`;\n}\n\n/**\n * Formats the content into a quote. This needs to be at the start of the line for Discord to format it\n *\n * @param content - The content to wrap\n */\nexport function quote(content: C): `> ${C}` {\n\treturn `> ${content}`;\n}\n\n/**\n * Formats the content into a block quote. This needs to be at the start of the line for Discord to format it\n *\n * @param content - The content to wrap\n */\nexport function blockQuote(content: C): `>>> ${C}` {\n\treturn `>>> ${content}`;\n}\n\n/**\n * Wraps the URL into `<>`, which stops it from embedding\n *\n * @param url - The URL to wrap\n */\nexport function hideLinkEmbed(url: C): `<${C}>`;\n\n/**\n * Wraps the URL into `<>`, which stops it from embedding\n *\n * @param url - The URL to wrap\n */\nexport function hideLinkEmbed(url: URL): `<${string}>`;\nexport function hideLinkEmbed(url: URL | string) {\n\treturn `<${url}>`;\n}\n\n/**\n * Formats the content and the URL into a masked URL\n *\n * @param content - The content to display\n * @param url - The URL the content links to\n */\nexport function hyperlink(content: C, url: URL): `[${C}](${string})`;\n\n/**\n * Formats the content and the URL into a masked URL\n *\n * @param content - The content to display\n * @param url - The URL the content links to\n */\nexport function hyperlink(content: C, url: U): `[${C}](${U})`;\n\n/**\n * Formats the content and the URL into a masked URL\n *\n * @param content - The content to display\n * @param url - The URL the content links to\n * @param title - The title shown when hovering on the masked link\n */\nexport function hyperlink(\n\tcontent: C,\n\turl: URL,\n\ttitle: T,\n): `[${C}](${string} \"${T}\")`;\n\n/**\n * Formats the content and the URL into a masked URL\n *\n * @param content - The content to display\n * @param url - The URL the content links to\n * @param title - The title shown when hovering on the masked link\n */\nexport function hyperlink(\n\tcontent: C,\n\turl: U,\n\ttitle: T,\n): `[${C}](${U} \"${T}\")`;\nexport function hyperlink(content: string, url: URL | string, title?: string) {\n\treturn title ? `[${content}](${url} \"${title}\")` : `[${content}](${url})`;\n}\n\n/**\n * Wraps the content inside spoiler (hidden text)\n *\n * @param content - The content to wrap\n */\nexport function spoiler(content: C): `||${C}||` {\n\treturn `||${content}||`;\n}\n\n/**\n * Formats a user ID into a user mention\n *\n * @param userId - The user ID to format\n */\nexport function userMention(userId: C): `<@${C}>` {\n\treturn `<@${userId}>`;\n}\n\n/**\n * Formats a channel ID into a channel mention\n *\n * @param channelId - The channel ID to format\n */\nexport function channelMention(channelId: C): `<#${C}>` {\n\treturn `<#${channelId}>`;\n}\n\n/**\n * Formats a role ID into a role mention\n *\n * @param roleId - The role ID to format\n */\nexport function roleMention(roleId: C): `<@&${C}>` {\n\treturn `<@&${roleId}>`;\n}\n\n/**\n * Formats an application command name, subcommand group name, subcommand name, and ID into an application command mention\n *\n * @param commandName - The application command name to format\n * @param subcommandGroupName - The subcommand group name to format\n * @param subcommandName - The subcommand name to format\n * @param commandId - The application command ID to format\n */\nexport function chatInputApplicationCommandMention<\n\tN extends string,\n\tG extends string,\n\tS extends string,\n\tI extends Snowflake,\n>(commandName: N, subcommandGroupName: G, subcommandName: S, commandId: I): `${N} ${G} ${S}:${I}>`;\n\n/**\n * Formats an application command name, subcommand name, and ID into an application command mention\n *\n * @param commandName - The application command name to format\n * @param subcommandName - The subcommand name to format\n * @param commandId - The application command ID to format\n */\nexport function chatInputApplicationCommandMention(\n\tcommandName: N,\n\tsubcommandName: S,\n\tcommandId: I,\n): `${N} ${S}:${I}>`;\n\n/**\n * Formats an application command name and ID into an application command mention\n *\n * @param commandName - The application command name to format\n * @param commandId - The application command ID to format\n */\nexport function chatInputApplicationCommandMention(\n\tcommandName: N,\n\tcommandId: I,\n): `${N}:${I}>`;\n\n/**\n * Formats an application command name, subcommand group name, subcommand name, and ID into an application command mention\n *\n * @param commandName - The application command name to format\n * @param subcommandGroupName - The subcommand group name to format\n * @param subcommandName - The subcommand name to format\n * @param commandId - The application command ID to format\n */\nexport function chatInputApplicationCommandMention<\n\tN extends string,\n\tG extends Snowflake | string,\n\tS extends Snowflake | string,\n\tI extends Snowflake,\n>(\n\tcommandName: N,\n\tsubcommandGroupName: G,\n\tsubcommandName?: S,\n\tcommandId?: I,\n): `${N} ${G} ${S}:${I}>` | `${N} ${G}:${S}>` | `${N}:${G}>` {\n\tif (typeof commandId !== 'undefined') {\n\t\treturn `${commandName} ${subcommandGroupName} ${subcommandName!}:${commandId}>`;\n\t}\n\n\tif (typeof subcommandName !== 'undefined') {\n\t\treturn `${commandName} ${subcommandGroupName}:${subcommandName}>`;\n\t}\n\n\treturn `${commandName}:${subcommandGroupName}>`;\n}\n\n/**\n * Formats an emoji ID into a fully qualified emoji identifier\n *\n * @param emojiId - The emoji ID to format\n */\nexport function formatEmoji(emojiId: C, animated?: false): `<:_:${C}>`;\n\n/**\n * Formats an emoji ID into a fully qualified emoji identifier\n *\n * @param emojiId - The emoji ID to format\n * @param animated - Whether the emoji is animated or not. Defaults to `false`\n */\nexport function formatEmoji(emojiId: C, animated?: true): ``;\n\n/**\n * Formats an emoji ID into a fully qualified emoji identifier\n *\n * @param emojiId - The emoji ID to format\n * @param animated - Whether the emoji is animated or not. Defaults to `false`\n */\nexport function formatEmoji(emojiId: C, animated?: boolean): `<:_:${C}>` | ``;\n\n/**\n * Formats an emoji ID into a fully qualified emoji identifier\n *\n * @param emojiId - The emoji ID to format\n * @param animated - Whether the emoji is animated or not. Defaults to `false`\n */\nexport function formatEmoji(emojiId: C, animated = false): `<:_:${C}>` | `` {\n\treturn `<${animated ? 'a' : ''}:_:${emojiId}>`;\n}\n\n/**\n * Formats a channel link for a direct message channel.\n *\n * @param channelId - The channel's id\n */\nexport function channelLink(channelId: C): `https://discord.com/channels/@me/${C}`;\n\n/**\n * Formats a channel link for a guild channel.\n *\n * @param channelId - The channel's id\n * @param guildId - The guild's id\n */\nexport function channelLink(\n\tchannelId: C,\n\tguildId: G,\n): `https://discord.com/channels/${G}/${C}`;\n\nexport function channelLink(\n\tchannelId: C,\n\tguildId?: G,\n): `https://discord.com/channels/@me/${C}` | `https://discord.com/channels/${G}/${C}` {\n\treturn `https://discord.com/channels/${guildId ?? '@me'}/${channelId}`;\n}\n\n/**\n * Formats a message link for a direct message channel.\n *\n * @param channelId - The channel's id\n * @param messageId - The message's id\n */\nexport function messageLink(\n\tchannelId: C,\n\tmessageId: M,\n): `https://discord.com/channels/@me/${C}/${M}`;\n\n/**\n * Formats a message link for a guild channel.\n *\n * @param channelId - The channel's id\n * @param messageId - The message's id\n * @param guildId - The guild's id\n */\nexport function messageLink(\n\tchannelId: C,\n\tmessageId: M,\n\tguildId: G,\n): `https://discord.com/channels/${G}/${C}/${M}`;\n\nexport function messageLink(\n\tchannelId: C,\n\tmessageId: M,\n\tguildId?: G,\n): `https://discord.com/channels/@me/${C}/${M}` | `https://discord.com/channels/${G}/${C}/${M}` {\n\treturn `${typeof guildId === 'undefined' ? channelLink(channelId) : channelLink(channelId, guildId)}/${messageId}`;\n}\n\n/**\n * Formats a date into a short date-time string\n *\n * @param date - The date to format, defaults to the current time\n */\nexport function time(date?: Date): ``;\n\n/**\n * Formats a date given a format style\n *\n * @param date - The date to format\n * @param style - The style to use\n */\nexport function time(date: Date, style: S): ``;\n\n/**\n * Formats the given timestamp into a short date-time string\n *\n * @param seconds - The time to format, represents an UNIX timestamp in seconds\n */\nexport function time(seconds: C): ``;\n\n/**\n * Formats the given timestamp into a short date-time string\n *\n * @param seconds - The time to format, represents an UNIX timestamp in seconds\n * @param style - The style to use\n */\nexport function time(seconds: C, style: S): ``;\nexport function time(timeOrSeconds?: Date | number, style?: TimestampStylesString): string {\n\tif (typeof timeOrSeconds !== 'number') {\n\t\t// eslint-disable-next-line no-param-reassign\n\t\ttimeOrSeconds = Math.floor((timeOrSeconds?.getTime() ?? Date.now()) / 1_000);\n\t}\n\n\treturn typeof style === 'string' ? `` : ``;\n}\n\n/**\n * The {@link https://discord.com/developers/docs/reference#message-formatting-timestamp-styles | message formatting timestamp styles} supported by Discord\n */\nexport const TimestampStyles = {\n\t/**\n\t * Short time format, consisting of hours and minutes, e.g. 16:20\n\t */\n\tShortTime: 't',\n\n\t/**\n\t * Long time format, consisting of hours, minutes, and seconds, e.g. 16:20:30\n\t */\n\tLongTime: 'T',\n\n\t/**\n\t * Short date format, consisting of day, month, and year, e.g. 20/04/2021\n\t */\n\tShortDate: 'd',\n\n\t/**\n\t * Long date format, consisting of day, month, and year, e.g. 20 April 2021\n\t */\n\tLongDate: 'D',\n\n\t/**\n\t * Short date-time format, consisting of short date and short time formats, e.g. 20 April 2021 16:20\n\t */\n\tShortDateTime: 'f',\n\n\t/**\n\t * Long date-time format, consisting of long date and short time formats, e.g. Tuesday, 20 April 2021 16:20\n\t */\n\tLongDateTime: 'F',\n\n\t/**\n\t * Relative time format, consisting of a relative duration format, e.g. 2 months ago\n\t */\n\tRelativeTime: 'R',\n} as const;\n\n/**\n * The possible values, see {@link TimestampStyles} for more information\n */\nexport type TimestampStylesString = typeof TimestampStyles[keyof typeof TimestampStyles];\n\n/**\n * An enum with all the available faces from Discord's native slash commands\n */\nexport enum Faces {\n\t/**\n\t * ¯\\\\_(ツ)\\\\_/¯\n\t */\n\tShrug = '¯\\\\_(ツ)\\\\_/¯',\n\n\t/**\n\t * (╯°□°)╯︵ ┻━┻\n\t */\n\tTableflip = '(╯°□°)╯︵ ┻━┻',\n\n\t/**\n\t * ┬─┬ ノ( ゜-゜ノ)\n\t */\n\tUnflip = '┬─┬ ノ( ゜-゜ノ)',\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\t// eslint-disable-next-line no-param-reassign\n\t\toptions = normalizeArray(options);\n\t\toptionsLengthValidator.parse(options.length);\n\t\tthis.options.splice(\n\t\t\t0,\n\t\t\tthis.options.length,\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 * {@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